X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d730bd8a68c9e19fc3e2be13777ae267408a3833..02fd8b9b6186623ed61019ac7e69ed9a4ef16773:/src/common/sckipc.cpp?ds=sidebyside diff --git a/src/common/sckipc.cpp b/src/common/sckipc.cpp index b1223d249b..2e860b6d79 100644 --- a/src/common/sckipc.cpp +++ b/src/common/sckipc.cpp @@ -119,11 +119,12 @@ GetAddressFromName(const wxString& serverName, class wxTCPEventHandler : public wxEvtHandler { public: - wxTCPEventHandler() : wxEvtHandler() {} + wxTCPEventHandler() : wxEvtHandler() { } void Client_OnRequest(wxSocketEvent& event); void Server_OnRequest(wxSocketEvent& event); +private: DECLARE_EVENT_TABLE() DECLARE_NO_COPY_CLASS(wxTCPEventHandler) }; @@ -134,7 +135,38 @@ enum _SERVER_ONREQUEST_ID }; -static wxTCPEventHandler *gs_handler = NULL; +// -------------------------------------------------------------------------- +// wxTCPEventHandlerModule (private class) +// -------------------------------------------------------------------------- + +class wxTCPEventHandlerModule : public wxModule +{ +public: + wxTCPEventHandlerModule() : wxModule() { } + + // get the global wxTCPEventHandler creating it if necessary + static wxTCPEventHandler& GetHandler() + { + if ( !ms_handler ) + ms_handler = new wxTCPEventHandler; + + return *ms_handler; + } + + // as ms_handler is initialized on demand, don't do anything in OnInit() + virtual bool OnInit() { return true; } + virtual void OnExit() { wxDELETE(ms_handler); } + +private: + static wxTCPEventHandler *ms_handler; + + DECLARE_DYNAMIC_CLASS(wxTCPEventHandlerModule) + DECLARE_NO_COPY_CLASS(wxTCPEventHandlerModule) +}; + +IMPLEMENT_DYNAMIC_CLASS(wxTCPEventHandlerModule, wxModule) + +wxTCPEventHandler *wxTCPEventHandlerModule::ms_handler = NULL; // -------------------------------------------------------------------------- // wxIPCSocketStreams @@ -156,7 +188,7 @@ public: wxIPCSocketStreams(wxSocketBase& sock) : m_socketStream(sock), #ifdef USE_BUFFER - m_bufferedOut(m_socketStream, 1500), + m_bufferedOut(m_socketStream, 1488), #else m_bufferedOut(m_socketStream), #endif @@ -370,7 +402,8 @@ wxConnectionBase *wxTCPClient::MakeConnection(const wxString& host, connection->m_topic = topic; connection->m_sock = client; connection->m_streams = streams; - client->SetEventHandler(*gs_handler, _CLIENT_ONREQUEST_ID); + client->SetEventHandler(wxTCPEventHandlerModule::GetHandler(), + _CLIENT_ONREQUEST_ID); client->SetClientData(connection); client->SetNotify(wxSOCKET_INPUT_FLAG | wxSOCKET_LOST_FLAG); client->Notify(true); @@ -471,7 +504,8 @@ bool wxTCPServer::Create(const wxString& serverName) return false; } - m_server->SetEventHandler(*gs_handler, _SERVER_ONREQUEST_ID); + m_server->SetEventHandler(wxTCPEventHandlerModule::GetHandler(), + _SERVER_ONREQUEST_ID); m_server->SetClientData(this); m_server->SetNotify(wxSOCKET_CONNECTION_FLAG); m_server->Notify(true); @@ -582,7 +616,11 @@ const void *wxTCPConnection::Request(const wxString& item, if ( ret != IPC_REQUEST_REPLY ) return NULL; - return m_streams->ReadData(this, size); + // ReadData() needs a non-NULL size pointer but the client code can call us + // with NULL pointer (this makes sense if it knows that it always works + // with NUL-terminated strings) + size_t sizeFallback; + return m_streams->ReadData(this, size ? size : &sizeFallback); } bool wxTCPConnection::DoPoke(const wxString& item, @@ -856,7 +894,8 @@ void wxTCPEventHandler::Server_OnRequest(wxSocketEvent &event) new_connection->m_sock = sock; new_connection->m_streams = streams; new_connection->m_topic = topic; - sock->SetEventHandler(*gs_handler, _CLIENT_ONREQUEST_ID); + sock->SetEventHandler(wxTCPEventHandlerModule::GetHandler(), + _CLIENT_ONREQUEST_ID); sock->SetClientData(new_connection); sock->SetNotify(wxSOCKET_INPUT_FLAG | wxSOCKET_LOST_FLAG); sock->Notify(true); @@ -878,19 +917,4 @@ void wxTCPEventHandler::Server_OnRequest(wxSocketEvent &event) sock->Destroy(); } -// -------------------------------------------------------------------------- -// wxTCPEventHandlerModule (private class) -// -------------------------------------------------------------------------- - -class wxTCPEventHandlerModule: public wxModule -{ -public: - virtual bool OnInit() { gs_handler = new wxTCPEventHandler; return true; } - virtual void OnExit() { wxDELETE(gs_handler); } - - DECLARE_DYNAMIC_CLASS(wxTCPEventHandlerModule) -}; - -IMPLEMENT_DYNAMIC_CLASS(wxTCPEventHandlerModule, wxModule) - #endif // wxUSE_SOCKETS && wxUSE_IPC && wxUSE_STREAMS