X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/acd523a9648c2fbae593ae5c3529d21fc219fd3a..51181d291194b7ae616cfb17c984fd8927e4a977:/include/wx/unix/private/sockunix.h diff --git a/include/wx/unix/private/sockunix.h b/include/wx/unix/private/sockunix.h index dd82c31045..2531060364 100644 --- a/include/wx/unix/private/sockunix.h +++ b/include/wx/unix/private/sockunix.h @@ -26,24 +26,34 @@ public: m_fds[0] = m_fds[1] = -1; - m_use_events = false; m_enabledCallbacks = 0; } - virtual void Shutdown(); - virtual wxSocketImpl *WaitConnection(wxSocketBase& wxsocket); + virtual wxSocketError GetLastError() const; - int Read(char *buffer, int size); - int Write(const char *buffer, int size); - //attach or detach from main loop - void Notify(bool flag); + virtual void ReenableEvents(wxSocketEventFlags flags) + { + // enable the notifications about input/output being available again in + // case they were disabled by OnRead/WriteWaiting() + // + // notice that we'd like to enable the events here only if there is + // nothing more left on the socket right now as otherwise we're going + // to get a "ready for whatever" notification immediately (well, during + // the next event loop iteration) and disable the event back again + // which is rather inefficient but unfortunately doing it like this + // doesn't work because the existing code (e.g. src/common/sckipc.cpp) + // expects to keep getting notifications about the data available from + // the socket even if it didn't read all the data the last time, so we + // absolutely have to continue generating them + EnableEvents(flags); + } // wxFDIOHandler methods virtual void OnReadWaiting(); virtual void OnWriteWaiting(); virtual void OnExceptionWaiting(); - // Unix-specific functions + // Unix-specific functions used by wxSocketFDIOManager only bool HasAnyEnabledCallbacks() const { return m_enabledCallbacks != 0; } void EnableCallback(wxFDIODispatcherEntryFlags flag) { m_enabledCallbacks |= flag; } @@ -52,15 +62,9 @@ public: int GetEnabledCallbacks() const { return m_enabledCallbacks; } private: - virtual wxSocketError DoHandleConnect(int ret); virtual void DoClose() { - wxSocketManager * const manager = wxSocketManager::Get(); - if ( manager ) - { - manager->Uninstall_Callback(this, wxSOCKET_INPUT); - manager->Uninstall_Callback(this, wxSOCKET_OUTPUT); - } + DisableEvents(); close(m_fd); } @@ -73,55 +77,22 @@ private: EnableEvents(); } - // enable or disable notifications for socket input/output events but only - // if m_use_events is true; do nothing otherwise - virtual void EnableEvents() - { - if ( m_use_events ) - DoEnableEvents(true); - } - - void DisableEvents() - { - if ( m_use_events ) - DoEnableEvents(false); - } - - // really enable or disable socket input/output events, regardless of - // m_use_events value - void DoEnableEvents(bool enable); - - - // enable or disable events for the given event if m_use_events; do nothing - // otherwise - // - // notice that these functions also update m_detected: EnableEvent() clears - // the corresponding bit in it and DisableEvent() sets it - void EnableEvent(wxSocketNotify event); - void DisableEvent(wxSocketNotify event); - - - wxSocketError Input_Timeout(); - wxSocketError Output_Timeout(); - int Recv_Stream(char *buffer, int size); - int Recv_Dgram(char *buffer, int size); - int Send_Stream(const char *buffer, int size); - int Send_Dgram(const char *buffer, int size); + // enable or disable notifications for socket input/output events + void EnableEvents(int flags = wxSOCKET_INPUT_FLAG | wxSOCKET_OUTPUT_FLAG) + { DoEnableEvents(flags, true); } + void DisableEvents(int flags = wxSOCKET_INPUT_FLAG | wxSOCKET_OUTPUT_FLAG) + { DoEnableEvents(flags, false); } + // really enable or disable socket input/output events + void DoEnableEvents(int flags, bool enable); protected: - // true if socket should fire events - bool m_use_events; - // descriptors for input and output event notification channels associated // with the socket int m_fds[2]; // the events which are currently enabled for this socket, combination of // wxFDIO_INPUT and wxFDIO_OUTPUT values - // - // TODO: this overlaps with m_detected but the semantics of the latter are - // very unclear so I don't dare to remove it right now int m_enabledCallbacks; private: @@ -129,6 +100,11 @@ private: // down the socket if the event is wxSOCKET_LOST void OnStateChange(wxSocketNotify event); + // check if there is any input available, return 1 if yes, 0 if no or -1 on + // error + int CheckForInput(); + + // give it access to our m_fds friend class wxSocketFDBasedManager; }; @@ -141,12 +117,6 @@ public: virtual bool OnInit() { return true; } virtual void OnExit() { } - // allocate/free the storage we need - virtual wxSocketImpl *CreateSocket(wxSocketBase& wxsocket) - { - return new wxSocketImplUnix(wxsocket); - } - protected: // identifies either input or output direction // @@ -163,11 +133,12 @@ protected: switch ( event ) { default: - wxFAIL_MSG( "unexpected socket event" ); - // fall through + wxFAIL_MSG( "unknown socket event" ); + return FD_INPUT; // we must return something case wxSOCKET_LOST: - // fall through + wxFAIL_MSG( "unexpected socket event" ); + return FD_INPUT; // as above case wxSOCKET_INPUT: return FD_INPUT; @@ -176,8 +147,13 @@ protected: return FD_OUTPUT; case wxSOCKET_CONNECTION: - // FIXME: explain this? - return socket->m_server ? FD_INPUT : FD_OUTPUT; + // 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; } }