X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/999836aacade840a5d9a0cbb5fad7b1d4de62c93..c8058a09e5147657342e02e50cf471d7b751abc1:/src/common/sckipc.cpp diff --git a/src/common/sckipc.cpp b/src/common/sckipc.cpp index 03e8f0958e..350b824257 100644 --- a/src/common/sckipc.cpp +++ b/src/common/sckipc.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: sckipc.cpp +// Name: src/common/sckipc.cpp // Purpose: Interprocess communication implementation (wxSocket version) // Author: Julian Smart // Modified by: Guilhem Lavaux (big rewrite) May 1997, 1998 @@ -22,31 +22,28 @@ // headers // -------------------------------------------------------------------------- -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) -#pragma implementation "sckipc.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ -#pragma hdrstop + #pragma hdrstop #endif +#if wxUSE_SOCKETS && wxUSE_IPC && wxUSE_STREAMS + +#include "wx/sckipc.h" + #ifndef WX_PRECOMP -#include "wx/log.h" + #include "wx/log.h" + #include "wx/event.h" + #include "wx/module.h" #endif -#if wxUSE_SOCKETS && wxUSE_IPC && wxUSE_STREAMS - #include #include #include #include "wx/socket.h" -#include "wx/sckipc.h" -#include "wx/module.h" -#include "wx/event.h" // -------------------------------------------------------------------------- // macros and constants @@ -86,10 +83,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 -#if defined(__UNIX__) && !defined(__WXMAC__) && !defined(__WINE__) +#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,7 +116,7 @@ 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); @@ -167,15 +164,15 @@ 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; @@ -206,7 +203,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 @@ -253,7 +250,7 @@ bool wxTCPServer::Create(const wxString& serverName) wxSockAddress *addr = GetAddressFromName(serverName); if ( !addr ) - return FALSE; + return false; #ifdef __UNIX_LIKE__ mode_t umaskOld; @@ -266,7 +263,7 @@ bool wxTCPServer::Create(const wxString& serverName) { delete addr; - return FALSE; + return false; } // also set the umask to prevent the others from reading our file @@ -300,15 +297,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() @@ -359,15 +356,17 @@ wxTCPConnection::wxTCPConnection(wxChar *buffer, int size) wxTCPConnection::~wxTCPConnection () { Disconnect(); - wxDELETE(m_codeci); - wxDELETE(m_codeco); - wxDELETE(m_sockstrm); if (m_sock) { m_sock->SetClientData(NULL); m_sock->Destroy(); } + + /* Delete after destroy */ + wxDELETE(m_codeci); + wxDELETE(m_codeco); + wxDELETE(m_sockstrm); } void wxTCPConnection::Compress(bool WXUNUSED(on)) @@ -379,32 +378,37 @@ void wxTCPConnection::Compress(bool WXUNUSED(on)) bool wxTCPConnection::Disconnect () { if ( !GetConnected() ) - return TRUE; + 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; + if ( m_sock ) + { + m_sock->Notify(false); + m_sock->Close(); + } + + SetConnected(false); + + 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; } wxChar *wxTCPConnection::Request (const wxString& item, int *size, wxIPCFormat format) @@ -427,6 +431,7 @@ wxChar *wxTCPConnection::Request (const wxString& item, int *size, wxIPCFormat f size_t s; s = m_codeci->Read32(); + wxChar *data = GetBufferAtLeast( s ); wxASSERT_MSG(data != NULL, _T("Buffer too small in wxTCPConnection::Request") ); @@ -438,22 +443,22 @@ wxChar *wxTCPConnection::Request (const wxString& item, int *size, wxIPCFormat f } } -bool wxTCPConnection::Poke (const wxString& item, wxChar *data, int size, wxIPCFormat format) +bool wxTCPConnection::Poke (const wxString& item, const 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) @@ -461,7 +466,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); @@ -469,9 +474,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) @@ -479,7 +484,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); @@ -487,29 +492,29 @@ 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 bool wxTCPConnection::Advise (const wxString& item, - wxChar *data, int size, wxIPCFormat format) + const 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; } // -------------------------------------------------------------------------- @@ -524,6 +529,9 @@ END_EVENT_TABLE() void wxTCPEventHandler::Client_OnRequest(wxSocketEvent &event) { wxSocketBase *sock = event.GetSocket(); + if (!sock) { /* No socket, no glory */ + return ; + } wxSocketNotify evt = event.GetSocketEvent(); wxTCPConnection *connection = (wxTCPConnection *)(sock->GetClientData()); @@ -540,7 +548,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; @@ -562,6 +570,7 @@ void wxTCPEventHandler::Client_OnRequest(wxSocketEvent &event) format = (wxIPCFormat)codeci->Read8(); size = codeci->Read32(); + data = connection->GetBufferAtLeast( size ); wxASSERT_MSG(data != NULL, _T("Buffer too small in wxTCPEventHandler::Client_OnRequest") ); @@ -639,14 +648,14 @@ void wxTCPEventHandler::Client_OnRequest(wxSocketEvent &event) format = (wxIPCFormat)codeci->Read8(); int user_size = -1; - wxChar *user_data = connection->OnRequest (topic_name, item, &user_size, format); + const 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 = wxStrlen(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); @@ -658,9 +667,9 @@ void wxTCPEventHandler::Client_OnRequest(wxSocketEvent &event) } case IPC_DISCONNECT: { - sock->Notify(FALSE); + sock->Notify(false); sock->Close(); - connection->SetConnected(FALSE); + connection->SetConnected(false); connection->OnDisconnect(); break; } @@ -673,6 +682,9 @@ void wxTCPEventHandler::Client_OnRequest(wxSocketEvent &event) void wxTCPEventHandler::Server_OnRequest(wxSocketEvent &event) { wxSocketServer *server = (wxSocketServer *) event.GetSocket(); + if (!server) { /* No server, Then exit */ + return ; + } wxTCPServer *ipcserv = (wxTCPServer *) server->GetClientData(); // This socket is being deleted; skip this event @@ -684,6 +696,9 @@ void wxTCPEventHandler::Server_OnRequest(wxSocketEvent &event) // Accept the connection, getting a new socket wxSocketBase *sock = server->Accept(); + if (!sock) { /* No socket, no glory */ + return ; + } if (!sock->Ok()) { sock->Destroy(); @@ -719,7 +734,7 @@ void wxTCPEventHandler::Server_OnRequest(wxSocketEvent &event) 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 @@ -748,7 +763,7 @@ 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); } }; @@ -756,4 +771,4 @@ IMPLEMENT_DYNAMIC_CLASS(wxTCPEventHandlerModule, wxModule) #endif - // wxUSE_SOCKETS && wxUSE_IPC + // wxUSE_SOCKETS && wxUSE_IPC && wxUSE_STREAMS