X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/26a25f9523218117ab718b684ff514ad420b5aee..db4c39a9e87953142471077d6d26e509b2b05b6c:/src/common/sckipc.cpp diff --git a/src/common/sckipc.cpp b/src/common/sckipc.cpp index 372c1d627e..03e8f0958e 100644 --- a/src/common/sckipc.cpp +++ b/src/common/sckipc.cpp @@ -11,7 +11,7 @@ // Copyright: (c) Julian Smart 1993 // (c) Guilhem Lavaux 1997, 1998 // (c) 2000 Guillermo Rodriguez -// Licence: wxWindows license +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// // ========================================================================== @@ -22,7 +22,7 @@ // headers // -------------------------------------------------------------------------- -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "sckipc.h" #endif @@ -89,7 +89,7 @@ static wxSockAddress * GetAddressFromName(const wxString& serverName, const wxString& host = _T("")) { // we always use INET sockets under non-Unix systems -#if defined(__UNIX__) && !defined(__WXMAC__) +#if defined(__UNIX__) && !defined(__WXMAC__) && !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 ) @@ -125,6 +125,7 @@ public: void Server_OnRequest(wxSocketEvent& event); DECLARE_EVENT_TABLE() + DECLARE_NO_COPY_CLASS(wxTCPEventHandler) }; enum @@ -260,7 +261,7 @@ bool wxTCPServer::Create(const wxString& serverName) { // ensure that the file doesn't exist as otherwise calling socket() would // fail - int rc = remove(serverName); + int rc = remove(serverName.fn_str()); if ( rc < 0 && errno != ENOENT ) { delete addr; @@ -321,7 +322,7 @@ wxTCPServer::~wxTCPServer() #ifdef __UNIX_LIKE__ if ( !m_filename.empty() ) { - if ( !remove(m_filename) ) + if ( remove(m_filename.fn_str()) != 0 ) { wxLogDebug(_T("Stale AF_UNIX file '%s' left."), m_filename.c_str()); } @@ -346,12 +347,18 @@ wxTCPConnection::wxTCPConnection () : wxConnectionBase() m_codeco = NULL; } -wxTCPConnection::wxTCPConnection(char * WXUNUSED(buffer), int WXUNUSED(size)) +wxTCPConnection::wxTCPConnection(wxChar *buffer, int size) + : wxConnectionBase(buffer, size) { + m_sock = NULL; + m_sockstrm = NULL; + m_codeci = NULL; + m_codeco = NULL; } wxTCPConnection::~wxTCPConnection () { + Disconnect(); wxDELETE(m_codeci); wxDELETE(m_codeco); wxDELETE(m_sockstrm); @@ -371,10 +378,13 @@ void wxTCPConnection::Compress(bool WXUNUSED(on)) // Calls that CLIENT can make. bool wxTCPConnection::Disconnect () { + if ( !GetConnected() ) + return TRUE; // Send the the disconnect message to the peer. m_codeco->Write8(IPC_DISCONNECT); m_sock->Notify(FALSE); m_sock->Close(); + SetConnected(FALSE); return TRUE; } @@ -397,7 +407,7 @@ bool wxTCPConnection::Execute(const wxChar *data, int size, wxIPCFormat format) return TRUE; } -char *wxTCPConnection::Request (const wxString& item, int *size, wxIPCFormat format) +wxChar *wxTCPConnection::Request (const wxString& item, int *size, wxIPCFormat format) { if (!m_sock->IsConnected()) return NULL; @@ -415,10 +425,11 @@ char *wxTCPConnection::Request (const wxString& item, int *size, wxIPCFormat for else { size_t s; - char *data = NULL; s = m_codeci->Read32(); - data = new char[s]; + wxChar *data = GetBufferAtLeast( s ); + wxASSERT_MSG(data != NULL, + _T("Buffer too small in wxTCPConnection::Request") ); m_sockstrm->Read(data, s); if (size) @@ -520,7 +531,6 @@ void wxTCPEventHandler::Client_OnRequest(wxSocketEvent &event) if (!connection) return; - int msg = 0; wxDataInputStream *codeci; wxDataOutputStream *codeco; wxSocketStream *sockstrm; @@ -540,41 +550,43 @@ void wxTCPEventHandler::Client_OnRequest(wxSocketEvent &event) codeci = connection->m_codeci; codeco = connection->m_codeco; sockstrm = connection->m_sockstrm; - msg = codeci->Read8(); + int msg = codeci->Read8(); switch (msg) { case IPC_EXECUTE: { - char *data; + wxChar *data; size_t size; wxIPCFormat format; format = (wxIPCFormat)codeci->Read8(); size = codeci->Read32(); - data = new char[size]; + data = connection->GetBufferAtLeast( size ); + wxASSERT_MSG(data != NULL, + _T("Buffer too small in wxTCPEventHandler::Client_OnRequest") ); sockstrm->Read(data, size); connection->OnExecute (topic_name, data, size, format); - delete [] data; break; } case IPC_ADVISE: { - char *data; + wxChar *data; size_t size; wxIPCFormat format; item = codeci->ReadString(); format = (wxIPCFormat)codeci->Read8(); size = codeci->Read32(); - data = new char[size]; + data = connection->GetBufferAtLeast( size ); + wxASSERT_MSG(data != NULL, + _T("Buffer too small in wxTCPEventHandler::Client_OnRequest") ); sockstrm->Read(data, size); connection->OnAdvise (topic_name, item, data, size, format); - delete [] data; break; } case IPC_ADVISE_START: @@ -610,13 +622,13 @@ void wxTCPEventHandler::Client_OnRequest(wxSocketEvent &event) item = codeci->ReadString(); format = (wxIPCFormat)codeci->Read8(); size = codeci->Read32(); - data = new wxChar[size]; + data = connection->GetBufferAtLeast( size ); + wxASSERT_MSG(data != NULL, + _T("Buffer too small in wxTCPEventHandler::Client_OnRequest") ); sockstrm->Read(data, size); connection->OnPoke (topic_name, item, data, size, format); - delete [] data; - break; } case IPC_REQUEST: @@ -627,14 +639,14 @@ void wxTCPEventHandler::Client_OnRequest(wxSocketEvent &event) format = (wxIPCFormat)codeci->Read8(); int user_size = -1; - char *user_data = connection->OnRequest (topic_name, item, &user_size, format); + wxChar *user_data = connection->OnRequest (topic_name, item, &user_size, format); if (user_data) { codeco->Write8(IPC_REQUEST_REPLY); if (user_size == -1) - user_size = strlen(user_data) + 1; // includes final NUL + user_size = wxStrlen(user_data) + 1; // includes final NUL codeco->Write32(user_size); sockstrm->Write(user_data, user_size); @@ -648,6 +660,7 @@ void wxTCPEventHandler::Client_OnRequest(wxSocketEvent &event) { sock->Notify(FALSE); sock->Close(); + connection->SetConnected(FALSE); connection->OnDisconnect(); break; } @@ -730,7 +743,7 @@ void wxTCPEventHandler::Server_OnRequest(wxSocketEvent &event) // wxTCPEventHandlerModule (private class) // -------------------------------------------------------------------------- -class WXDLLEXPORT wxTCPEventHandlerModule: public wxModule +class wxTCPEventHandlerModule: public wxModule { DECLARE_DYNAMIC_CLASS(wxTCPEventHandlerModule)