X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/01f3d2752a98159d7c119ce6fdb5645a75197d11..f363cee882672e147340240cf0bb194a68e37833:/src/common/sckipc.cpp diff --git a/src/common/sckipc.cpp b/src/common/sckipc.cpp index 5658e064b2..ea1de8eb8e 100644 --- a/src/common/sckipc.cpp +++ b/src/common/sckipc.cpp @@ -8,7 +8,6 @@ // Vadim Zeitlin (added support for Unix sockets) Apr 2002 // (use buffering, many fixes/cleanup) Oct 2008 // Created: 1993 -// RCS-ID: $Id$ // Copyright: (c) Julian Smart 1993 // (c) Guilhem Lavaux 1997, 1998 // (c) 2000 Guillermo Rodriguez @@ -92,7 +91,7 @@ GetAddressFromName(const wxString& serverName, #if defined(__UNIX__) && !defined(__WINDOWS__) && !defined(__WINE__) // under Unix, if the server name looks like a path, create a AF_UNIX // socket instead of AF_INET one - if ( serverName.Find(_T('/')) != wxNOT_FOUND ) + if ( serverName.Find(wxT('/')) != wxNOT_FOUND ) { wxUNIXaddress *addr = new wxUNIXaddress; addr->Filename(serverName); @@ -125,8 +124,10 @@ public: void Server_OnRequest(wxSocketEvent& event); private: + void HandleDisconnect(wxTCPConnection *connection); + DECLARE_EVENT_TABLE() - DECLARE_NO_COPY_CLASS(wxTCPEventHandler) + wxDECLARE_NO_COPY_CLASS(wxTCPEventHandler); }; enum @@ -161,7 +162,7 @@ private: static wxTCPEventHandler *ms_handler; DECLARE_DYNAMIC_CLASS(wxTCPEventHandlerModule) - DECLARE_NO_COPY_CLASS(wxTCPEventHandlerModule) + wxDECLARE_NO_COPY_CLASS(wxTCPEventHandlerModule); }; IMPLEMENT_DYNAMIC_CLASS(wxTCPEventHandlerModule, wxModule) @@ -184,11 +185,11 @@ public: // ctor initializes all the streams on top of the given socket // // note that we use a bigger than default buffer size which matches the - // typical Ethernet MTU + // typical Ethernet MTU (minus TCP header overhead) wxIPCSocketStreams(wxSocketBase& sock) : m_socketStream(sock), #ifdef USE_BUFFER - m_bufferedOut(m_socketStream, 1500), + m_bufferedOut(m_socketStream, 1448), #else m_bufferedOut(m_socketStream), #endif @@ -282,7 +283,7 @@ private: wxDataInputStream m_dataIn; wxDataOutputStream m_dataOut; - DECLARE_NO_COPY_CLASS(wxIPCSocketStreams) + wxDECLARE_NO_COPY_CLASS(wxIPCSocketStreams); }; namespace @@ -339,7 +340,7 @@ public: private: wxIPCSocketStreams& m_streams; - DECLARE_NO_COPY_CLASS(IPCOutput) + wxDECLARE_NO_COPY_CLASS(IPCOutput); }; } // anonymous namespace @@ -397,7 +398,7 @@ wxConnectionBase *wxTCPClient::MakeConnection(const wxString& host, if (connection) { - if (connection->IsKindOf(CLASSINFO(wxTCPConnection))) + if (wxDynamicCast(connection, wxTCPConnection)) { connection->m_topic = topic; connection->m_sock = client; @@ -496,7 +497,7 @@ bool wxTCPServer::Create(const wxString& serverName) delete addr; - if (!m_server->Ok()) + if (!m_server->IsOk()) { m_server->Destroy(); m_server = NULL; @@ -526,7 +527,7 @@ wxTCPServer::~wxTCPServer() { if ( remove(m_filename.fn_str()) != 0 ) { - wxLogDebug(_T("Stale AF_UNIX file '%s' left."), m_filename.c_str()); + wxLogDebug(wxT("Stale AF_UNIX file '%s' left."), m_filename.c_str()); } } #endif // __UNIX_LIKE__ @@ -687,25 +688,38 @@ BEGIN_EVENT_TABLE(wxTCPEventHandler, wxEvtHandler) EVT_SOCKET(_SERVER_ONREQUEST_ID, wxTCPEventHandler::Server_OnRequest) END_EVENT_TABLE() +void wxTCPEventHandler::HandleDisconnect(wxTCPConnection *connection) +{ + // connection was closed (either gracefully or not): destroy everything + connection->m_sock->Notify(false); + connection->m_sock->Close(); + + // don't leave references to this soon-to-be-dangling connection in the + // socket as it won't be destroyed immediately as its destruction will be + // delayed in case there are more events pending for it + connection->m_sock->SetClientData(NULL); + + connection->SetConnected(false); + connection->OnDisconnect(); +} + void wxTCPEventHandler::Client_OnRequest(wxSocketEvent &event) { wxSocketBase *sock = event.GetSocket(); if (!sock) - return ; + return; wxSocketNotify evt = event.GetSocketEvent(); - wxTCPConnection *connection = (wxTCPConnection *)(sock->GetClientData()); + wxTCPConnection * const + connection = static_cast(sock->GetClientData()); // This socket is being deleted; skip this event if (!connection) return; - // We lost the connection: destroy everything - if (evt == wxSOCKET_LOST) + if ( evt == wxSOCKET_LOST ) { - sock->Notify(false); - sock->Close(); - connection->OnDisconnect(); + HandleDisconnect(connection); return; } @@ -826,10 +840,7 @@ void wxTCPEventHandler::Client_OnRequest(wxSocketEvent &event) break; case IPC_DISCONNECT: - sock->Notify(false); - sock->Close(); - connection->SetConnected(false); - connection->OnDisconnect(); + HandleDisconnect(connection); break; case IPC_FAIL: @@ -851,7 +862,7 @@ void wxTCPEventHandler::Server_OnRequest(wxSocketEvent &event) { wxSocketServer *server = (wxSocketServer *) event.GetSocket(); if (!server) - return ; + return; wxTCPServer *ipcserv = (wxTCPServer *) server->GetClientData(); // This socket is being deleted; skip this event @@ -864,8 +875,8 @@ void wxTCPEventHandler::Server_OnRequest(wxSocketEvent &event) // Accept the connection, getting a new socket wxSocketBase *sock = server->Accept(); if (!sock) - return ; - if (!sock->Ok()) + return; + if (!sock->IsOk()) { sock->Destroy(); return; @@ -886,7 +897,7 @@ void wxTCPEventHandler::Server_OnRequest(wxSocketEvent &event) if (new_connection) { - if (new_connection->IsKindOf(CLASSINFO(wxTCPConnection))) + if (wxDynamicCast(new_connection, wxTCPConnection)) { // Acknowledge success out.Write8(IPC_CONNECT);