X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4f260c9c68b42e6ccc82710efe6ca6e8418e721d..a7689c49fe02c0c065facf736ab28b19f5997b7c:/include/wx/unix/private/sockunix.h diff --git a/include/wx/unix/private/sockunix.h b/include/wx/unix/private/sockunix.h index a5832a9443..ea3006215f 100644 --- a/include/wx/unix/private/sockunix.h +++ b/include/wx/unix/private/sockunix.h @@ -14,7 +14,15 @@ #include #include -#include "wx/private/fdiodispatcher.h" + +// Under older (Open)Solaris versions FIONBIO is declared in this header only. +// In the newer versions it's included by sys/ioctl.h but it's simpler to just +// include it always instead of testing for whether it is or not. +#ifdef __SOLARIS__ + #include +#endif + +#include "wx/private/fdiomanager.h" class wxSocketImplUnix : public wxSocketImpl, public wxFDIOHandler @@ -25,8 +33,6 @@ public: { m_fds[0] = m_fds[1] = -1; - - m_enabledCallbacks = 0; } virtual wxSocketError GetLastError() const; @@ -52,14 +58,7 @@ public: virtual void OnReadWaiting(); virtual void OnWriteWaiting(); virtual void OnExceptionWaiting(); - - // 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; } + virtual bool IsOk() const { return m_fd != INVALID_SOCKET; } private: virtual void DoClose() @@ -91,10 +90,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 @@ -109,12 +104,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) @@ -122,95 +123,23 @@ public: return new wxSocketImplUnix(wxsocket); } -protected: - // identifies either input or output direction - // - // NB: the values of this enum shouldn't change - enum SocketDir - { - FD_INPUT, - FD_OUTPUT - }; + virtual void Install_Callback(wxSocketImpl *socket_, wxSocketNotify event); + virtual void Uninstall_Callback(wxSocketImpl *socket_, wxSocketNotify event); +protected: // 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(socket_); - - 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(socket_); - const SocketDir d = GetDirForEvent(socket, event); + wxFDIOManager *m_fdioManager; - 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_ */