don't call Disconnect() if the connection had been already lost (closes #10747)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@60568 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2009-05-09 13:19:59 +00:00
parent 7172db1857
commit 64be91ed99

View File

@@ -125,6 +125,8 @@ public:
void Server_OnRequest(wxSocketEvent& event); void Server_OnRequest(wxSocketEvent& event);
private: private:
void HandleDisconnect(wxTCPConnection *connection);
DECLARE_EVENT_TABLE() DECLARE_EVENT_TABLE()
wxDECLARE_NO_COPY_CLASS(wxTCPEventHandler); wxDECLARE_NO_COPY_CLASS(wxTCPEventHandler);
}; };
@@ -687,25 +689,33 @@ BEGIN_EVENT_TABLE(wxTCPEventHandler, wxEvtHandler)
EVT_SOCKET(_SERVER_ONREQUEST_ID, wxTCPEventHandler::Server_OnRequest) EVT_SOCKET(_SERVER_ONREQUEST_ID, wxTCPEventHandler::Server_OnRequest)
END_EVENT_TABLE() 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();
connection->SetConnected(false);
connection->OnDisconnect();
}
void wxTCPEventHandler::Client_OnRequest(wxSocketEvent &event) void wxTCPEventHandler::Client_OnRequest(wxSocketEvent &event)
{ {
wxSocketBase *sock = event.GetSocket(); wxSocketBase *sock = event.GetSocket();
if (!sock) if (!sock)
return ; return;
wxSocketNotify evt = event.GetSocketEvent(); wxSocketNotify evt = event.GetSocketEvent();
wxTCPConnection *connection = (wxTCPConnection *)(sock->GetClientData()); wxTCPConnection * const
connection = static_cast<wxTCPConnection *>(sock->GetClientData());
// This socket is being deleted; skip this event // This socket is being deleted; skip this event
if (!connection) if (!connection)
return; return;
// We lost the connection: destroy everything if ( evt == wxSOCKET_LOST )
if (evt == wxSOCKET_LOST)
{ {
sock->Notify(false); HandleDisconnect(connection);
sock->Close();
connection->OnDisconnect();
return; return;
} }
@@ -826,10 +836,7 @@ void wxTCPEventHandler::Client_OnRequest(wxSocketEvent &event)
break; break;
case IPC_DISCONNECT: case IPC_DISCONNECT:
sock->Notify(false); HandleDisconnect(connection);
sock->Close();
connection->SetConnected(false);
connection->OnDisconnect();
break; break;
case IPC_FAIL: case IPC_FAIL:
@@ -851,7 +858,7 @@ void wxTCPEventHandler::Server_OnRequest(wxSocketEvent &event)
{ {
wxSocketServer *server = (wxSocketServer *) event.GetSocket(); wxSocketServer *server = (wxSocketServer *) event.GetSocket();
if (!server) if (!server)
return ; return;
wxTCPServer *ipcserv = (wxTCPServer *) server->GetClientData(); wxTCPServer *ipcserv = (wxTCPServer *) server->GetClientData();
// This socket is being deleted; skip this event // This socket is being deleted; skip this event
@@ -864,7 +871,7 @@ void wxTCPEventHandler::Server_OnRequest(wxSocketEvent &event)
// Accept the connection, getting a new socket // Accept the connection, getting a new socket
wxSocketBase *sock = server->Accept(); wxSocketBase *sock = server->Accept();
if (!sock) if (!sock)
return ; return;
if (!sock->Ok()) if (!sock->Ok())
{ {
sock->Destroy(); sock->Destroy();