X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/86c5b12b21333e9817bd2d0c21458308390e1524..e408bf5257ead0754de5ef37a39867c7536dbe03:/src/common/socketiohandler.cpp?ds=sidebyside diff --git a/src/common/socketiohandler.cpp b/src/common/socketiohandler.cpp index baa797a74e..87a9c457bb 100644 --- a/src/common/socketiohandler.cpp +++ b/src/common/socketiohandler.cpp @@ -23,34 +23,12 @@ #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 // ============================================================================ -// ---------------------------------------------------------------------------- -// wxSocketImplFDIO -// ---------------------------------------------------------------------------- - -class wxSocketImplFDIO : public wxSocketImplUnix -{ -public: - wxSocketImplFDIO(wxSocketBase& wxsocket) - : wxSocketImplUnix(wxsocket) - { - m_handler = NULL; - } - - virtual ~wxSocketImplFDIO() - { - delete m_handler; - } - - wxSocketIOHandler *m_handler; -}; - // ---------------------------------------------------------------------------- // wxSocketSelectManager // ---------------------------------------------------------------------------- @@ -58,11 +36,6 @@ public: class wxSocketSelectManager : public wxSocketFDBasedManager { public: - virtual wxSocketImpl *CreateSocket(wxSocketBase& wxsocket) - { - return new wxSocketImplFDIO(wxsocket); - } - virtual void Install_Callback(wxSocketImpl *socket, wxSocketNotify event); virtual void Uninstall_Callback(wxSocketImpl *socket, wxSocketNotify event); }; @@ -70,7 +43,7 @@ public: void wxSocketSelectManager::Install_Callback(wxSocketImpl *socket_, wxSocketNotify event) { - wxSocketImplFDIO * const socket = static_cast(socket_); + wxSocketImplUnix * const socket = static_cast(socket_); const int fd = socket->m_fd; @@ -83,40 +56,24 @@ 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 alreadyRegistered = socket->HasAnyEnabledCallbacks(); - FD(socket, d) = fd; - if (d == FD_INPUT) - { - handler->AddFlag(wxFDIO_INPUT); - } - else - { - handler->AddFlag(wxFDIO_OUTPUT); - } + socket->EnableCallback(d == FD_INPUT ? wxFDIO_INPUT : wxFDIO_OUTPUT); - if ( registerHandler ) - dispatcher->RegisterFD(fd, handler, handler->GetFlags()); + if ( alreadyRegistered ) + dispatcher->ModifyFD(fd, socket, socket->GetEnabledCallbacks()); else - dispatcher->ModifyFD(fd, handler, handler->GetFlags()); + dispatcher->RegisterFD(fd, socket, socket->GetEnabledCallbacks()); } void wxSocketSelectManager::Uninstall_Callback(wxSocketImpl *socket_, wxSocketNotify event) { - wxSocketImplFDIO * const socket = static_cast(socket_); + wxSocketImplUnix * const socket = static_cast(socket_); const SocketDir d = GetDirForEvent(socket, event); @@ -133,26 +90,12 @@ void wxSocketSelectManager::Uninstall_Callback(wxSocketImpl *socket_, if ( !dispatcher ) return; - wxSocketIOHandler *& handler = socket->m_handler; - if ( handler ) - { - handler->RemoveFlag(flag); - - if ( !handler->GetFlags() ) - { - dispatcher->UnregisterFD(fd); - delete handler; - socket->m_handler = NULL; - } - else - { - dispatcher->ModifyFD(fd, handler, handler->GetFlags()); - } - } - else - { + socket->DisableCallback(flag); + + if ( !socket->HasAnyEnabledCallbacks() ) dispatcher->UnregisterFD(fd); - } + else + dispatcher->ModifyFD(fd, socket, socket->GetEnabledCallbacks()); } // set the wxBase variable to point to our wxSocketManager implementation