From: Vadim Zeitlin Date: Fri, 28 Nov 2008 14:39:49 +0000 (+0000) Subject: make wxSocketImplUnix inherit from wxFDIOHandler as they're used for almost the same... X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/a9d859df6f433c962a9ed777d2c26da6ce714441?ds=inline make wxSocketImplUnix inherit from wxFDIOHandler as they're used for almost the same purpose; this removes the need for the bridge wxSocketOHandler class git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@56998 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/private/socket.h b/include/wx/private/socket.h index 03da655036..22d99911e0 100644 --- a/include/wx/private/socket.h +++ b/include/wx/private/socket.h @@ -3,7 +3,7 @@ // Purpose: wxSocketImpl nd related declarations // Authors: Guilhem Lavaux, Vadim Zeitlin // Created: April 1997 -// RCS-ID: $Id$ +// RCS-ID: $Id: socket.h 56994 2008-11-28 12:47:07Z VZ $ // Copyright: (c) 1997 Guilhem Lavaux // (c) 2008 Vadim Zeitlin // Licence: wxWindows licence @@ -275,12 +275,7 @@ public: // named) OnRequest() method void NotifyOnStateChange(wxSocketNotify event); - // FIXME: making these functions virtual is a hack necessary to make the - // wxBase library link without requiring wxNet under Unix where - // wxSocketSelectManager (part of wxBase) uses them, they don't - // really need to be virtual at all - virtual void Detected_Read() { } - virtual void Detected_Write() { } + // FIXME: this one probably isn't needed here at all virtual void Notify(bool WXUNUSED(notify)) { } // TODO: make these fields protected and provide accessors for those of diff --git a/include/wx/private/socketiohandler.h b/include/wx/private/socketiohandler.h deleted file mode 100644 index 5fdee62b8a..0000000000 --- a/include/wx/private/socketiohandler.h +++ /dev/null @@ -1,45 +0,0 @@ -///////////////////////////////////////////////////////////////////////////// -// Name: wx/private/gsocketiohandler.h -// Purpose: class for registering sockets with wxSelectDispatcher -// Authors: Lukasz Michalski -// Created: December 2006 -// Copyright: (c) Lukasz Michalski -// RCS-ID: $Id$ -// Licence: wxWindows licence -///////////////////////////////////////////////////////////////////////////// - -#ifndef _WX_PRIVATE_GSOCKETIOHANDLER_H_ -#define _WX_PRIVATE_GSOCKETIOHANDLER_H_ - -#include "wx/defs.h" - -#if wxUSE_SOCKETS && wxUSE_SELECT_DISPATCHER - -#include "wx/private/selectdispatcher.h" -#include "wx/private/socket.h" - -class WXDLLIMPEXP_BASE wxSocketIOHandler : public wxFDIOHandler -{ -public: - wxSocketIOHandler(wxSocketImpl *socket) - { - m_socket = socket; - m_flags = 0; - } - - int GetFlags() const { return m_flags; } - void RemoveFlag(wxFDIODispatcherEntryFlags flag) { m_flags &= ~flag; } - void AddFlag(wxFDIODispatcherEntryFlags flag) { m_flags |= flag; } - - virtual void OnReadWaiting() { m_socket->Detected_Read(); } - virtual void OnWriteWaiting() { m_socket->Detected_Write(); } - virtual void OnExceptionWaiting() { m_socket->Detected_Read(); } - -private: - wxSocketImpl *m_socket; - int m_flags; -}; - -#endif // wxUSE_SOCKETS && wxUSE_SELECT_DISPATCHER - -#endif // _WX_PRIVATE_SOCKETEVTDISPATCH_H_ diff --git a/include/wx/unix/private/sockunix.h b/include/wx/unix/private/sockunix.h index 472d524a56..26b7f90d82 100644 --- a/include/wx/unix/private/sockunix.h +++ b/include/wx/unix/private/sockunix.h @@ -14,8 +14,10 @@ #include #include +#include "wx/private/fdiodispatcher.h" -class wxSocketImplUnix : public wxSocketImpl +class wxSocketImplUnix : public wxSocketImpl, + public wxFDIOHandler { public: wxSocketImplUnix(wxSocketBase& wxsocket) @@ -34,8 +36,11 @@ public: int Write(const char *buffer, int size); //attach or detach from main loop void Notify(bool flag); - void Detected_Read(); - void Detected_Write(); + + // wxFDIOHandler methods + virtual void OnReadWaiting(); + virtual void OnWriteWaiting(); + virtual void OnExceptionWaiting(); private: virtual wxSocketError DoHandleConnect(int ret); @@ -160,9 +165,9 @@ protected: } // access the FDs we store - int& FD(wxSocketImpl *socket, SocketDir d) + int& FD(wxSocketImplUnix *socket, SocketDir d) { - return static_cast(socket)->m_fds[d]; + return socket->m_fds[d]; } }; @@ -171,8 +176,11 @@ protected: class wxSocketInputBasedManager : public wxSocketFDBasedManager { public: - virtual void Install_Callback(wxSocketImpl *socket, wxSocketNotify event) + 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" ); @@ -182,11 +190,14 @@ public: if ( fd != -1 ) RemoveInput(fd); - fd = AddInput(socket, d); + fd = AddInput(socket, socket->m_fd, d); } - virtual void Uninstall_Callback(wxSocketImpl *socket, wxSocketNotify event) + virtual void Uninstall_Callback(wxSocketImpl *socket_, wxSocketNotify event) { + wxSocketImplUnix * const + socket = static_cast(socket_); + const SocketDir d = GetDirForEvent(socket, event); int& fd = FD(socket, d); @@ -200,7 +211,7 @@ public: private: // these functions map directly to XtAdd/RemoveInput() or // gdk_input_add/remove() - virtual int AddInput(wxSocketImpl *socket, SocketDir d) = 0; + virtual int AddInput(wxFDIOHandler *handler, int fd, SocketDir d) = 0; virtual void RemoveInput(int fd) = 0; }; diff --git a/src/common/socketiohandler.cpp b/src/common/socketiohandler.cpp index baa797a74e..97af802a37 100644 --- a/src/common/socketiohandler.cpp +++ b/src/common/socketiohandler.cpp @@ -23,8 +23,7 @@ #if wxUSE_SOCKETS && wxUSE_SELECT_DISPATCHER #include "wx/apptrait.h" -#include "wx/unix/private.h" -#include "wx/private/socketiohandler.h" +#include "wx/private/socket.h" // ============================================================================ // implementation @@ -40,15 +39,14 @@ public: wxSocketImplFDIO(wxSocketBase& wxsocket) : wxSocketImplUnix(wxsocket) { - m_handler = NULL; } - virtual ~wxSocketImplFDIO() - { - delete m_handler; - } + int GetFlags() const { return m_flags; } + void RemoveFlag(wxFDIODispatcherEntryFlags flag) { m_flags &= ~flag; } + void AddFlag(wxFDIODispatcherEntryFlags flag) { m_flags |= flag; } - wxSocketIOHandler *m_handler; +private: + int m_flags; }; // ---------------------------------------------------------------------------- @@ -83,34 +81,18 @@ void wxSocketSelectManager::Install_Callback(wxSocketImpl *socket_, if ( !dispatcher ) return; - wxSocketIOHandler *& handler = socket->m_handler; + FD(socket, d) = fd; - // we should register the new handlers but modify the existing ones in place - bool registerHandler; - if ( handler ) - { - registerHandler = false; - } - else // no existing handler - { - registerHandler = true; - handler = new wxSocketIOHandler(socket); - } + // register it when it's used for the first time, update it if it had been + // previously registered + const bool registerHandler = socket->GetFlags() == 0; - FD(socket, d) = fd; - if (d == FD_INPUT) - { - handler->AddFlag(wxFDIO_INPUT); - } - else - { - handler->AddFlag(wxFDIO_OUTPUT); - } + socket->AddFlag(d == FD_INPUT ? wxFDIO_INPUT : wxFDIO_OUTPUT); if ( registerHandler ) - dispatcher->RegisterFD(fd, handler, handler->GetFlags()); + dispatcher->RegisterFD(fd, socket, socket->GetFlags()); else - dispatcher->ModifyFD(fd, handler, handler->GetFlags()); + dispatcher->ModifyFD(fd, socket, socket->GetFlags()); } void wxSocketSelectManager::Uninstall_Callback(wxSocketImpl *socket_, @@ -133,25 +115,15 @@ void wxSocketSelectManager::Uninstall_Callback(wxSocketImpl *socket_, if ( !dispatcher ) return; - wxSocketIOHandler *& handler = socket->m_handler; - if ( handler ) + socket->RemoveFlag(flag); + + if ( !socket->GetFlags() ) { - handler->RemoveFlag(flag); - - if ( !handler->GetFlags() ) - { - dispatcher->UnregisterFD(fd); - delete handler; - socket->m_handler = NULL; - } - else - { - dispatcher->ModifyFD(fd, handler, handler->GetFlags()); - } + dispatcher->UnregisterFD(fd); } else { - dispatcher->UnregisterFD(fd); + dispatcher->ModifyFD(fd, socket, socket->GetFlags()); } } diff --git a/src/gtk/sockgtk.cpp b/src/gtk/sockgtk.cpp index bd80f85942..ae2225a6a1 100644 --- a/src/gtk/sockgtk.cpp +++ b/src/gtk/sockgtk.cpp @@ -28,26 +28,26 @@ void wxSocket_GDK_Input(gpointer data, gint WXUNUSED(source), GdkInputCondition condition) { - wxSocketImpl * const socket = static_cast(data); + wxFDIOHandler * const handler = static_cast(data); if ( condition & GDK_INPUT_READ ) - socket->Detected_Read(); + handler->OnReadWaiting(); if ( condition & GDK_INPUT_WRITE ) - socket->Detected_Write(); + handler->OnWriteWaiting(); } } class GTKSocketManager : public wxSocketInputBasedManager { public: - virtual int AddInput(wxSocketImpl *socket, SocketDir d) + virtual int AddInput(wxFDIOHandler *handler, int fd, SocketDir d) { return gdk_input_add ( - socket->m_fd, + fd, d == FD_OUTPUT ? GDK_INPUT_WRITE : GDK_INPUT_READ, wxSocket_GDK_Input, - socket + handler ); } diff --git a/src/gtk1/sockgtk.cpp b/src/gtk1/sockgtk.cpp index b8b1ecb612..ae2225a6a1 100644 --- a/src/gtk1/sockgtk.cpp +++ b/src/gtk1/sockgtk.cpp @@ -28,26 +28,26 @@ void wxSocket_GDK_Input(gpointer data, gint WXUNUSED(source), GdkInputCondition condition) { - wxSocketImpl const *socket = static_cast(data); + wxFDIOHandler * const handler = static_cast(data); - if ( condition & GDK_INPUT_READ ) - socket->Detected_Read(); - if ( condition & GDK_INPUT_WRITE ) - socket->Detected_Write(); + if ( condition & GDK_INPUT_READ ) + handler->OnReadWaiting(); + if ( condition & GDK_INPUT_WRITE ) + handler->OnWriteWaiting(); } } class GTKSocketManager : public wxSocketInputBasedManager { public: - virtual int AddInput(wxSocketImpl *socket, SocketDir d) + virtual int AddInput(wxFDIOHandler *handler, int fd, SocketDir d) { return gdk_input_add ( - socket->m_fd, + fd, d == FD_OUTPUT ? GDK_INPUT_WRITE : GDK_INPUT_READ, wxSocket_GDK_Input, - socket + handler ); } diff --git a/src/motif/sockmot.cpp b/src/motif/sockmot.cpp index 98257ddddc..7aaf341d51 100644 --- a/src/motif/sockmot.cpp +++ b/src/motif/sockmot.cpp @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////////// -// Name: motif/gsockmot.cpp +// Name: motif/sockmot.cpp // Purpose: implementation of wxMotif-specific socket event handling // Author: Guilhem Lavaux, Vadim Zeitlin // Created: 1999 @@ -23,17 +23,17 @@ extern "C" { static void wxSocket_Motif_Input(XtPointer data, int *WXUNUSED(fid), XtInputId *WXUNUSED(id)) { - wxSocketImpl * const socket = static_cast(data); + wxFDIOHandler * const handler = static_cast(data); - socket->Detected_Read(); + handler->OnReadWaiting(); } static void wxSocket_Motif_Output(XtPointer data, int *WXUNUSED(fid), XtInputId *WXUNUSED(id)) { - wxSocketImpl * const socket = static_cast(data); + wxFDIOHandler * const handler = static_cast(data); - socket->Detected_Write(); + handler->OnWriteWaiting(); } } @@ -41,17 +41,17 @@ static void wxSocket_Motif_Output(XtPointer data, int *WXUNUSED(fid), class MotifSocketManager : public wxSocketInputBasedManager { public: - virtual int AddInput(wxSocketImpl *socket, SocketDir d) + virtual int AddInput(wxFDIOHandler *handler, int fd, SocketDir d) { return XtAppAddInput ( wxGetAppContext(), - socket->m_fd, + fd, (XtPointer)(d == FD_OUTPUT ? XtInputWriteMask : XtInputReadMask), d == FD_OUTPUT ? wxSocket_Motif_Output : wxSocket_Motif_Input, - socket + handler ); } diff --git a/src/os2/sockpm.cpp b/src/os2/sockpm.cpp index 8168d7fb61..341aedb239 100644 --- a/src/os2/sockpm.cpp +++ b/src/os2/sockpm.cpp @@ -1,10 +1,12 @@ -/* ------------------------------------------------------------------------- - * Project: wxSocketImpl (Generic Socket) for WX - * Name: gsockpm.c - * Purpose: wxSocketImpl: PM part - * Licence: The wxWindows licence - * CVSID: $Id$ - * ------------------------------------------------------------------------- */ +/////////////////////////////////////////////////////////////////////////////// +// Name: os2/sockpm.cpp +// Purpose: implementation of OS-2-specific handler event handling +// Author: Guilhem Lavaux, Vadim Zeitlin +// Created: 1999 +// RCS-ID: $Id$ +// Copyright: (c) 1999-2008 wxWidgets dev team +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -21,30 +23,29 @@ static void wxSocket_PM_Input(void *data) { - wxSocketImpl *socket = static_cast(data); + wxFDIOHandler *handler = static_cast(data); - socket->Detected_Read(); + handler->OnReadWaiting(); } static void wxSocket_PM_Output(void *data) { - wxSocketImpl *socket = static_cast(data); + wxFDIOHandler *handler = static_cast(data); - socket->Detected_Write(); + handler->OnWriteWaiting(); } class PMSocketManager : public wxSocketInputBasedManager { public: - virtual int AddInput(wxSocketImpl *socket, SocketDir d) + virtual int AddInput(wxFDIOHandler *handler, int fd, SocketDir d) { - if (d == FD_OUTPUT) - return wxTheApp->AddSocketHandler(socket->m_fd, wxSockWriteMask, - wxSocket_PM_Output, (void *)socket); + return wxTheApp->AddSocketHandler(fd, wxSockWriteMask, + wxSocket_PM_Output, handler); else - return wxTheApp->AddSocketHandler(socket->m_fd, wxSockReadMask, - wxSocket_PM_Input, (void *)socket); + return wxTheApp->AddSocketHandler(fd, wxSockReadMask, + wxSocket_PM_Input, handler); } virtual void RemoveInput(int fd) diff --git a/src/unix/sockunix.cpp b/src/unix/sockunix.cpp index 1893e118e8..3fd9875c8b 100644 --- a/src/unix/sockunix.cpp +++ b/src/unix/sockunix.cpp @@ -672,7 +672,7 @@ int wxSocketImplUnix::Read(char *buffer, int size) if (m_use_events) { m_detected = wxSOCKET_LOST_FLAG; - Detected_Read(); + OnReadWaiting(); return 0; } } @@ -974,11 +974,10 @@ void wxSocketImplUnix::OnStateChange(wxSocketNotify event) Shutdown(); } -void wxSocketImplUnix::Detected_Read() +void wxSocketImplUnix::OnReadWaiting() { char c; - /* Safeguard against straggling call to Detected_Read */ if (m_fd == INVALID_SOCKET) { return; @@ -1035,7 +1034,7 @@ void wxSocketImplUnix::Detected_Read() } } -void wxSocketImplUnix::Detected_Write() +void wxSocketImplUnix::OnWriteWaiting() { /* If we have already detected a LOST event, then don't try * to do any further processing. @@ -1077,6 +1076,11 @@ void wxSocketImplUnix::Detected_Write() } } +void wxSocketImplUnix::OnExceptionWaiting() +{ + wxFAIL_MSG( "not supposed to be called" ); +} + /* * ------------------------------------------------------------------------- * GAddress