Cleanly separate GUI socket-related code from net library.
This fixes linking problems under Unix introduced by recent changes which fixed previous problems which were due to files not being linked in at all. In order to provide a clean separation between base, net and core libraries we now use the same wxSocketManager (wxSocketFDBasedManager), defined in net library for both console and GUI Unix applications and just use different FD IO manager for them: the latter can be defined in base and core libraries as it doesn't involve wxSocketImpl at all, only its base wxFDIOHandler class. At more detailed level, these changes required: 1. Adding the new wxFDIOManager class. 2. Refactoring the old (and now removed) wxSocketFDIOManager to use the same code as wxSocketFDIOManager. This involved: a) Adding handler and direction parameter to RemoveInput(). b) Storing the mask of registered events in wxFDIOHandler itself. c) Defining wxFDIOManagerUnix which works with wxFDIODispatcher. 3. Changing the traits classes in Unix ports to define GetFDIOManager() instead of GetSocketManager(). git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@61688 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -14,7 +14,7 @@
|
||||
|
||||
#include <unistd.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include "wx/private/fdiodispatcher.h"
|
||||
#include "wx/private/fdiomanager.h"
|
||||
|
||||
class wxSocketImplUnix : public wxSocketImpl,
|
||||
public wxFDIOHandler
|
||||
@@ -25,8 +25,6 @@ public:
|
||||
{
|
||||
m_fds[0] =
|
||||
m_fds[1] = -1;
|
||||
|
||||
m_enabledCallbacks = 0;
|
||||
}
|
||||
|
||||
virtual wxSocketError GetLastError() const;
|
||||
@@ -54,14 +52,6 @@ public:
|
||||
virtual void OnExceptionWaiting();
|
||||
virtual bool IsOk() const { return m_fd != INVALID_SOCKET; }
|
||||
|
||||
// Unix-specific functions used by wxSocketFDIOManager only
|
||||
bool HasAnyEnabledCallbacks() const { return m_enabledCallbacks != 0; }
|
||||
void EnableCallback(wxFDIODispatcherEntryFlags flag)
|
||||
{ m_enabledCallbacks |= flag; }
|
||||
void DisableCallback(wxFDIODispatcherEntryFlags flag)
|
||||
{ m_enabledCallbacks &= ~flag; }
|
||||
int GetEnabledCallbacks() const { return m_enabledCallbacks; }
|
||||
|
||||
private:
|
||||
virtual void DoClose()
|
||||
{
|
||||
@@ -92,10 +82,6 @@ protected:
|
||||
// with the socket
|
||||
int m_fds[2];
|
||||
|
||||
// the events which are currently enabled for this socket, combination of
|
||||
// wxFDIO_INPUT and wxFDIO_OUTPUT values
|
||||
int m_enabledCallbacks;
|
||||
|
||||
private:
|
||||
// notify the associated wxSocket about a change in socket state and shut
|
||||
// down the socket if the event is wxSOCKET_LOST
|
||||
@@ -110,12 +96,18 @@ private:
|
||||
friend class wxSocketFDBasedManager;
|
||||
};
|
||||
|
||||
// A version of wxSocketManager which uses FDs for socket IO
|
||||
// A version of wxSocketManager which uses FDs for socket IO: it is used by
|
||||
// Unix console applications and some X11-like ports (wxGTK and wxMotif but not
|
||||
// wxX11 currently) which implement their own port-specific wxFDIOManagers
|
||||
class wxSocketFDBasedManager : public wxSocketManager
|
||||
{
|
||||
public:
|
||||
// no special initialization/cleanup needed when using FDs
|
||||
virtual bool OnInit() { return true; }
|
||||
wxSocketFDBasedManager()
|
||||
{
|
||||
m_fdioManager = NULL;
|
||||
}
|
||||
|
||||
virtual bool OnInit();
|
||||
virtual void OnExit() { }
|
||||
|
||||
virtual wxSocketImpl *CreateSocket(wxSocketBase& wxsocket)
|
||||
@@ -123,95 +115,23 @@ public:
|
||||
return new wxSocketImplUnix(wxsocket);
|
||||
}
|
||||
|
||||
virtual void Install_Callback(wxSocketImpl *socket_, wxSocketNotify event);
|
||||
virtual void Uninstall_Callback(wxSocketImpl *socket_, wxSocketNotify event);
|
||||
|
||||
protected:
|
||||
// identifies either input or output direction
|
||||
//
|
||||
// NB: the values of this enum shouldn't change
|
||||
enum SocketDir
|
||||
{
|
||||
FD_INPUT,
|
||||
FD_OUTPUT
|
||||
};
|
||||
|
||||
// get the FD index corresponding to the given wxSocketNotify
|
||||
SocketDir GetDirForEvent(wxSocketImpl *socket, wxSocketNotify event)
|
||||
{
|
||||
switch ( event )
|
||||
{
|
||||
default:
|
||||
wxFAIL_MSG( "unknown socket event" );
|
||||
return FD_INPUT; // we must return something
|
||||
|
||||
case wxSOCKET_LOST:
|
||||
wxFAIL_MSG( "unexpected socket event" );
|
||||
return FD_INPUT; // as above
|
||||
|
||||
case wxSOCKET_INPUT:
|
||||
return FD_INPUT;
|
||||
|
||||
case wxSOCKET_OUTPUT:
|
||||
return FD_OUTPUT;
|
||||
|
||||
case wxSOCKET_CONNECTION:
|
||||
// for server sockets we're interested in events indicating
|
||||
// that a new connection is pending, i.e. that accept() will
|
||||
// succeed and this is indicated by socket becoming ready for
|
||||
// reading, while for the other ones we're interested in the
|
||||
// completion of non-blocking connect() which is indicated by
|
||||
// the socket becoming ready for writing
|
||||
return socket->IsServer() ? FD_INPUT : FD_OUTPUT;
|
||||
}
|
||||
}
|
||||
wxFDIOManager::Direction
|
||||
GetDirForEvent(wxSocketImpl *socket, wxSocketNotify event);
|
||||
|
||||
// access the FDs we store
|
||||
int& FD(wxSocketImplUnix *socket, SocketDir d)
|
||||
int& FD(wxSocketImplUnix *socket, wxFDIOManager::Direction d)
|
||||
{
|
||||
return socket->m_fds[d];
|
||||
}
|
||||
};
|
||||
|
||||
// Common base class for all ports using X11-like (and hence implemented in
|
||||
// X11, Motif and GTK) AddInput() and RemoveInput() functions
|
||||
class wxSocketInputBasedManager : public wxSocketFDBasedManager
|
||||
{
|
||||
public:
|
||||
virtual void Install_Callback(wxSocketImpl *socket_, wxSocketNotify event)
|
||||
{
|
||||
wxSocketImplUnix * const
|
||||
socket = static_cast<wxSocketImplUnix *>(socket_);
|
||||
wxFDIOManager *m_fdioManager;
|
||||
|
||||
wxCHECK_RET( socket->m_fd != -1,
|
||||
"shouldn't be called on invalid socket" );
|
||||
|
||||
const SocketDir d = GetDirForEvent(socket, event);
|
||||
|
||||
int& fd = FD(socket, d);
|
||||
if ( fd != -1 )
|
||||
RemoveInput(fd);
|
||||
|
||||
fd = AddInput(socket, socket->m_fd, d);
|
||||
}
|
||||
|
||||
virtual void Uninstall_Callback(wxSocketImpl *socket_, wxSocketNotify event)
|
||||
{
|
||||
wxSocketImplUnix * const
|
||||
socket = static_cast<wxSocketImplUnix *>(socket_);
|
||||
|
||||
const SocketDir d = GetDirForEvent(socket, event);
|
||||
|
||||
int& fd = FD(socket, d);
|
||||
if ( fd != -1 )
|
||||
{
|
||||
RemoveInput(fd);
|
||||
fd = -1;
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
// these functions map directly to XtAdd/RemoveInput() or
|
||||
// gdk_input_add/remove()
|
||||
virtual int AddInput(wxSocketImplUnix *handler, int fd, SocketDir d) = 0;
|
||||
virtual void RemoveInput(int fd) = 0;
|
||||
wxDECLARE_NO_COPY_CLASS(wxSocketFDBasedManager);
|
||||
};
|
||||
|
||||
#endif /* _WX_UNIX_GSOCKUNX_H_ */
|
||||
|
Reference in New Issue
Block a user