// Purpose: wxSocketImpl implementation for Unix systems
// Authors: Guilhem Lavaux, Vadim Zeitlin
// Created: April 1997
-// RCS-ID: $Id$
// Copyright: (c) 1997 Guilhem Lavaux
// (c) 2008 Vadim Zeitlin
// Licence: wxWindows licence
#include <unistd.h>
#include <sys/ioctl.h>
-#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 <sys/filio.h>
+#endif
+
+#include "wx/private/fdiomanager.h"
class wxSocketImplUnix : public wxSocketImpl,
public wxFDIOHandler
{
m_fds[0] =
m_fds[1] = -1;
-
- m_enabledCallbacks = 0;
}
virtual wxSocketError GetLastError() const;
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()
// 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
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() { }
-protected:
- // identifies either input or output direction
- //
- // NB: the values of this enum shouldn't change
- enum SocketDir
+ virtual wxSocketImpl *CreateSocket(wxSocketBase& wxsocket)
{
- FD_INPUT,
- FD_OUTPUT
- };
+ return new wxSocketImplUnix(wxsocket);
+ }
+ 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<wxSocketImplUnix *>(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<wxSocketImplUnix *>(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_ */