X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0dbfd66d0b35352a0f60e7190b72815052b3d2d4..86948c99a6f0fd177b09b3db0ef702739ec62a27:/src/common/sckipc.cpp diff --git a/src/common/sckipc.cpp b/src/common/sckipc.cpp index c3ad40ca7f..9787f76858 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,10 +22,6 @@ // headers // -------------------------------------------------------------------------- -#ifdef __GNUG__ -#pragma implementation "sckipc.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -86,10 +82,10 @@ enum // get the address object for the given server name, the caller must delete it static wxSockAddress * -GetAddressFromName(const wxString& serverName, const wxString& host = _T("")) +GetAddressFromName(const wxString& serverName, const wxString& host = wxEmptyString) { // we always use INET sockets under non-Unix systems -#ifdef __UNIX_LIKE__ +#if defined(__UNIX__) && !defined(__WINDOWS__) && !defined(__WINE__) && (!defined(__WXMAC__) || defined(__DARWIN__)) // 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 ) @@ -119,12 +115,13 @@ GetAddressFromName(const wxString& serverName, const wxString& host = _T("")) class wxTCPEventHandler : public wxEvtHandler { public: - wxTCPEventHandler() : wxEvtHandler() {}; + wxTCPEventHandler() : wxEvtHandler() {} void Client_OnRequest(wxSocketEvent& event); void Server_OnRequest(wxSocketEvent& event); DECLARE_EVENT_TABLE() + DECLARE_NO_COPY_CLASS(wxTCPEventHandler) }; enum @@ -166,26 +163,26 @@ wxConnectionBase *wxTCPClient::MakeConnection (const wxString& host, const wxString& serverName, const wxString& topic) { + wxSockAddress *addr = GetAddressFromName(serverName, host); + if ( !addr ) + return NULL; + wxSocketClient *client = new wxSocketClient(SCKIPC_FLAGS); wxSocketStream *stream = new wxSocketStream(*client); wxDataInputStream *data_is = new wxDataInputStream(*stream); wxDataOutputStream *data_os = new wxDataOutputStream(*stream); - wxSockAddress *addr = GetAddressFromName(serverName, host); - if ( !addr ) - return NULL; - bool ok = client->Connect(*addr); delete addr; if ( ok ) { unsigned char msg; - + // Send topic name, and enquire whether this has succeeded data_os->Write8(IPC_CONNECT); data_os->WriteString(topic); - + msg = data_is->Read8(); // OK! Confirmation. @@ -205,7 +202,7 @@ wxConnectionBase *wxTCPClient::MakeConnection (const wxString& host, client->SetEventHandler(*gs_handler, _CLIENT_ONREQUEST_ID); client->SetClientData(connection); client->SetNotify(wxSOCKET_INPUT_FLAG | wxSOCKET_LOST_FLAG); - client->Notify(TRUE); + client->Notify(true); return connection; } else @@ -252,7 +249,7 @@ bool wxTCPServer::Create(const wxString& serverName) wxSockAddress *addr = GetAddressFromName(serverName); if ( !addr ) - return FALSE; + return false; #ifdef __UNIX_LIKE__ mode_t umaskOld; @@ -260,12 +257,12 @@ 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; - return FALSE; + return false; } // also set the umask to prevent the others from reading our file @@ -299,15 +296,15 @@ bool wxTCPServer::Create(const wxString& serverName) m_server->Destroy(); m_server = NULL; - return FALSE; + return false; } m_server->SetEventHandler(*gs_handler, _SERVER_ONREQUEST_ID); m_server->SetClientData(this); m_server->SetNotify(wxSOCKET_CONNECTION_FLAG); - m_server->Notify(TRUE); + m_server->Notify(true); - return TRUE; + return true; } wxTCPServer::~wxTCPServer() @@ -321,7 +318,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 +343,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,33 +374,36 @@ 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->Notify(false); m_sock->Close(); + SetConnected(false); - return TRUE; + return true; } bool wxTCPConnection::Execute(const wxChar *data, int size, wxIPCFormat format) { if (!m_sock->IsConnected()) - return FALSE; + return false; // Prepare EXECUTE message m_codeco->Write8(IPC_EXECUTE); m_codeco->Write8(format); if (size < 0) - size = wxStrlen(data) + 1; // includes final NUL + size = (wxStrlen(data) + 1) * sizeof(wxChar); // includes final NUL m_codeco->Write32(size); m_sockstrm->Write(data, size); - return TRUE; + 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 +421,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) @@ -430,19 +437,19 @@ char *wxTCPConnection::Request (const wxString& item, int *size, wxIPCFormat for bool wxTCPConnection::Poke (const wxString& item, wxChar *data, int size, wxIPCFormat format) { if (!m_sock->IsConnected()) - return FALSE; + return false; m_codeco->Write8(IPC_POKE); m_codeco->WriteString(item); m_codeco->Write8(format); if (size < 0) - size = wxStrlen(data) + 1; // includes final NUL + size = (wxStrlen(data) + 1) * sizeof(wxChar); // includes final NUL m_codeco->Write32(size); m_sockstrm->Write(data, size); - return TRUE; + return true; } bool wxTCPConnection::StartAdvise (const wxString& item) @@ -450,7 +457,7 @@ bool wxTCPConnection::StartAdvise (const wxString& item) int ret; if (!m_sock->IsConnected()) - return FALSE; + return false; m_codeco->Write8(IPC_ADVISE_START); m_codeco->WriteString(item); @@ -458,9 +465,9 @@ bool wxTCPConnection::StartAdvise (const wxString& item) ret = m_codeci->Read8(); if (ret != IPC_FAIL) - return TRUE; + return true; else - return FALSE; + return false; } bool wxTCPConnection::StopAdvise (const wxString& item) @@ -468,7 +475,7 @@ bool wxTCPConnection::StopAdvise (const wxString& item) int msg; if (!m_sock->IsConnected()) - return FALSE; + return false; m_codeco->Write8(IPC_ADVISE_STOP); m_codeco->WriteString(item); @@ -476,9 +483,9 @@ bool wxTCPConnection::StopAdvise (const wxString& item) msg = m_codeci->Read8(); if (msg != IPC_FAIL) - return TRUE; + return true; else - return FALSE; + return false; } // Calls that SERVER can make @@ -486,19 +493,19 @@ bool wxTCPConnection::Advise (const wxString& item, wxChar *data, int size, wxIPCFormat format) { if (!m_sock->IsConnected()) - return FALSE; + return false; m_codeco->Write8(IPC_ADVISE); m_codeco->WriteString(item); m_codeco->Write8(format); if (size < 0) - size = wxStrlen(data) + 1; // includes final NUL + size = (wxStrlen(data) + 1) * sizeof(wxChar); // includes final NUL m_codeco->Write32(size); m_sockstrm->Write(data, size); - return TRUE; + return true; } // -------------------------------------------------------------------------- @@ -520,9 +527,8 @@ void wxTCPEventHandler::Client_OnRequest(wxSocketEvent &event) if (!connection) return; - int msg = 0; wxDataInputStream *codeci; - wxDataOutputStream *codeco; + wxDataOutputStream *codeco; wxSocketStream *sockstrm; wxString topic_name = connection->m_topic; wxString item; @@ -530,7 +536,7 @@ void wxTCPEventHandler::Client_OnRequest(wxSocketEvent &event) // We lost the connection: destroy everything if (evt == wxSOCKET_LOST) { - sock->Notify(FALSE); + sock->Notify(false); sock->Close(); connection->OnDisconnect(); return; @@ -540,41 +546,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; - size_t size; + 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,12 +618,12 @@ 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; + connection->OnPoke (topic_name, item, data, size, format); break; } @@ -627,14 +635,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) * sizeof(wxChar); // includes final NUL codeco->Write32(user_size); sockstrm->Write(user_data, user_size); @@ -646,8 +654,9 @@ void wxTCPEventHandler::Client_OnRequest(wxSocketEvent &event) } case IPC_DISCONNECT: { - sock->Notify(FALSE); + sock->Notify(false); sock->Close(); + connection->SetConnected(false); connection->OnDisconnect(); break; } @@ -699,14 +708,14 @@ void wxTCPEventHandler::Server_OnRequest(wxSocketEvent &event) // Acknowledge success codeco->Write8(IPC_CONNECT); new_connection->m_topic = topic_name; - new_connection->m_sock = sock; + new_connection->m_sock = sock; new_connection->m_sockstrm = stream; new_connection->m_codeci = codeci; new_connection->m_codeco = codeco; sock->SetEventHandler(*gs_handler, _CLIENT_ONREQUEST_ID); sock->SetClientData(new_connection); sock->SetNotify(wxSOCKET_INPUT_FLAG | wxSOCKET_LOST_FLAG); - sock->Notify(TRUE); + sock->Notify(true); return; } else @@ -730,12 +739,12 @@ void wxTCPEventHandler::Server_OnRequest(wxSocketEvent &event) // wxTCPEventHandlerModule (private class) // -------------------------------------------------------------------------- -class WXDLLEXPORT wxTCPEventHandlerModule: public wxModule +class wxTCPEventHandlerModule: public wxModule { DECLARE_DYNAMIC_CLASS(wxTCPEventHandlerModule) public: - bool OnInit() { gs_handler = new wxTCPEventHandler(); return TRUE; } + bool OnInit() { gs_handler = new wxTCPEventHandler(); return true; } void OnExit() { wxDELETE(gs_handler); } };