#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);
void Server_OnRequest(wxSocketEvent& event);
private:
+ void HandleDisconnect(wxTCPConnection *connection);
+
DECLARE_EVENT_TABLE()
- DECLARE_NO_COPY_CLASS(wxTCPEventHandler)
+ wxDECLARE_NO_COPY_CLASS(wxTCPEventHandler);
};
enum
static wxTCPEventHandler *ms_handler;
DECLARE_DYNAMIC_CLASS(wxTCPEventHandlerModule)
- DECLARE_NO_COPY_CLASS(wxTCPEventHandlerModule)
+ wxDECLARE_NO_COPY_CLASS(wxTCPEventHandlerModule);
};
IMPLEMENT_DYNAMIC_CLASS(wxTCPEventHandlerModule, wxModule)
// 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
wxDataInputStream m_dataIn;
wxDataOutputStream m_dataOut;
- DECLARE_NO_COPY_CLASS(wxIPCSocketStreams)
+ wxDECLARE_NO_COPY_CLASS(wxIPCSocketStreams);
};
namespace
private:
wxIPCSocketStreams& m_streams;
- DECLARE_NO_COPY_CLASS(IPCOutput)
+ wxDECLARE_NO_COPY_CLASS(IPCOutput);
};
} // anonymous namespace
if (connection)
{
- if (connection->IsKindOf(CLASSINFO(wxTCPConnection)))
+ if (wxDynamicCast(connection, wxTCPConnection))
{
connection->m_topic = topic;
connection->m_sock = client;
delete addr;
- if (!m_server->Ok())
+ if (!m_server->IsOk())
{
m_server->Destroy();
m_server = NULL;
{
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__
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<wxTCPConnection *>(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;
}
break;
case IPC_DISCONNECT:
- sock->Notify(false);
- sock->Close();
- connection->SetConnected(false);
- connection->OnDisconnect();
+ HandleDisconnect(connection);
break;
case IPC_FAIL:
{
wxSocketServer *server = (wxSocketServer *) event.GetSocket();
if (!server)
- return ;
+ return;
wxTCPServer *ipcserv = (wxTCPServer *) server->GetClientData();
// This socket is being deleted; skip this 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;
if (new_connection)
{
- if (new_connection->IsKindOf(CLASSINFO(wxTCPConnection)))
+ if (wxDynamicCast(new_connection, wxTCPConnection))
{
// Acknowledge success
out.Write8(IPC_CONNECT);