+ virtual void Destroy_Socket(GSocket *socket)
+ {
+ free(socket->m_gui_dependent);
+ }
+
+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 GSocketEvent
+ SocketDir GetDirForEvent(GSocket *socket, GSocketEvent event)
+ {
+ switch ( event )
+ {
+ default:
+ wxFAIL_MSG( "unexpected socket event" );
+ // fall through
+
+ case GSOCK_LOST:
+ // fall through
+
+ case GSOCK_INPUT:
+ return FD_INPUT;
+
+ case GSOCK_OUTPUT:
+ return FD_OUTPUT;
+
+ case GSOCK_CONNECTION:
+ // FIXME: explain this?
+ return socket->m_server ? FD_INPUT : FD_OUTPUT;
+ }
+ }
+
+ // access the FDs we store
+ int& FD(GSocket *socket, SocketDir d)
+ {
+ return static_cast<int *>(socket->m_gui_dependent)[d];
+ }
+};
+
+// Common base class for all ports using X11-like (and hence implemented in
+// X11, Motif and GTK) AddInput() and RemoveInput() functions
+class GSocketInputBasedManager : public GSocketFDBasedManager
+{
+public:
+ virtual void Install_Callback(GSocket *socket, GSocketEvent event)
+ {
+ wxCHECK_RET( socket->m_fd != -1,
+ "shouldn't be called on invalid socket" );
+
+ const SocketDir d = GetDirForEvent(socket, event);