From: Guillermo Rodriguez Garcia <guille@iies.es> Date: Thu, 6 Jan 2000 01:07:06 +0000 (+0000) Subject: Rewrote large parts of the non-DDE IPC stuff (wxTCPServer, wxTCPClient, X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/0834112f89c4c5da7864e17e6f483ce296798ce6 Rewrote large parts of the non-DDE IPC stuff (wxTCPServer, wxTCPClient, wxTCPConnection) to upgrade to the 'new' wxSocket code. Plenty of bugs removed. IPC samples at samples/dde working again. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@5267 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/sckipc.h b/include/wx/sckipc.h index 08879516f0..87d414217c 100644 --- a/include/wx/sckipc.h +++ b/include/wx/sckipc.h @@ -1,12 +1,14 @@ ///////////////////////////////////////////////////////////////////////////// // Name: sckipc.h -// Purpose: Interprocess communication -// Author: Julian Smart/Guilhem Lavaux (big rewrite) -// Modified by: Guilhem Lavaux 1997 +// Purpose: Interprocess communication implementation (wxSocket version) +// Author: Julian Smart +// Modified by: Guilhem Lavaux (big rewrite) May 1997, 1998 +// Guillermo Rodriguez (updated for wxSocket v2) Jan 2000 // Created: 1993 // RCS-ID: $Id$ -// Copyright: (c) 1993 Julian Smart -// (c) 1997, 1998 Guilhem Lavaux +// Copyright: (c) Julian Smart 1993 +// (c) Guilhem Lavaux 1997, 1998 +// (c) 2000 Guillermo Rodriguez <guille@iies.es> // Licence: wxWindows license ///////////////////////////////////////////////////////////////////////////// #ifndef _WX_SCKIPC_H @@ -73,30 +75,38 @@ public: virtual ~wxTCPConnection(); // Calls that CLIENT can make - bool Execute(const wxChar *data, int size = -1, - wxIPCFormat format = wxIPC_TEXT); - char *Request(const wxString& item, int *size = NULL, - wxIPCFormat format = wxIPC_TEXT); - bool Poke(const wxString& item, wxChar *data, int size = -1, - wxIPCFormat format = wxIPC_TEXT); - bool StartAdvise(const wxString& item); - bool StopAdvise(const wxString& item); + virtual bool Execute(const wxChar *data, int size = -1, wxIPCFormat format = wxIPC_TEXT); + virtual bool Execute(const wxString& str) { return Execute(str, -1, wxIPC_TEXT); } + virtual char *Request(const wxString& item, int *size = NULL, wxIPCFormat format = wxIPC_TEXT); + virtual bool Poke(const wxString& item, wxChar *data, int size = -1, wxIPCFormat format = wxIPC_TEXT); + virtual bool StartAdvise(const wxString& item); + virtual bool StopAdvise(const wxString& item); // Calls that SERVER can make - bool Advise(const wxString& item, wxChar *data, int size = -1, - wxIPCFormat format = wxIPC_TEXT); + virtual bool Advise(const wxString& item, wxChar *data, int size = -1, wxIPCFormat format = wxIPC_TEXT); // Calls that both can make - bool Disconnect(); + virtual bool Disconnect(void); - // Called when we lost the peer. - bool OnDisconnect() { return TRUE; } + // Callbacks to SERVER - override at will + virtual bool OnExecute(const wxString& topic, char *data, int size, wxIPCFormat format) { return FALSE; }; + virtual char *OnRequest(const wxString& topic, const wxString& item, int *size, wxIPCFormat format) { return NULL; }; + virtual bool OnPoke(const wxString& topic, const wxString& item, char *data, int size, wxIPCFormat format) { return FALSE; }; + virtual bool OnStartAdvise(const wxString& topic, const wxString& item) { return FALSE; }; + virtual bool OnStopAdvise(const wxString& topic, const wxString& item) { return FALSE; }; + + // Callbacks to CLIENT - override at will + virtual bool OnAdvise(const wxString& topic, const wxString& item, char *data, int size, wxIPCFormat format) { return FALSE; }; + + // Callbacks to BOTH + + // Default behaviour is to delete connection and return TRUE + virtual bool OnDisconnect(void) { delete this; return TRUE; } // To enable the compressor void Compress(bool on); + private: - // to prevent virtual function hiding warnings - virtual bool Execute(const wxString& str) { return(wxConnectionBase::Execute(str)); }; }; class wxTCPServer: public wxServerBase @@ -123,8 +133,8 @@ public: virtual ~wxTCPClient(); virtual bool ValidHost(const wxString& host); - // Call this to make a connection. - // Returns NULL if cannot. + // Call this to make a connection. + // Returns NULL if cannot. virtual wxConnectionBase *MakeConnection(const wxString& host, const wxString& server, const wxString& topic); diff --git a/src/common/sckipc.cpp b/src/common/sckipc.cpp index b9e286ffbf..488ea062ba 100644 --- a/src/common/sckipc.cpp +++ b/src/common/sckipc.cpp @@ -1,11 +1,14 @@ ///////////////////////////////////////////////////////////////////////////// // Name: sckipc.cpp // Purpose: Interprocess communication implementation (wxSocket version) -// Author: Julian Smart, Guilhem Lavaux +// Author: Julian Smart // Modified by: Guilhem Lavaux (big rewrite) May 1997, 1998 +// Guillermo Rodriguez (updated for wxSocket v2) Jan 2000 // Created: 1993 // RCS-ID: $Id$ -// Copyright: (c) Julian Smart 1993, Guilhem Lavaux 1997, 1998 +// Copyright: (c) Julian Smart 1993 +// (c) Guilhem Lavaux 1997, 1998 +// (c) 2000 Guillermo Rodriguez <guille@iies.es> // Licence: wxWindows license ///////////////////////////////////////////////////////////////////////////// @@ -30,6 +33,7 @@ #include "wx/socket.h" #include "wx/sckipc.h" +#include "wx/log.h" #ifdef __BORLANDC__ #pragma hdrstop @@ -88,51 +92,60 @@ wxConnectionBase *wxTCPClient::MakeConnection (const wxString& host, const wxString& server_name, const wxString& topic) { - wxIPV4address addr; wxSocketClient *client = new wxSocketClient(); wxSocketStream *stream = new wxSocketStream(*client); - wxDataInputStream data_is(*stream); - wxDataOutputStream data_os(*stream); - - client->SetNotify(wxSOCKET_INPUT_FLAG | wxSOCKET_LOST_FLAG); + wxDataInputStream *data_is = new wxDataInputStream(*stream); + wxDataOutputStream *data_os = new wxDataOutputStream(*stream); + + wxIPV4address addr; addr.Service(server_name); addr.Hostname(host); - if (!client->Connect(addr)) { - delete client; - return NULL; - } - client->Notify(FALSE); - - // Send topic name, and enquire whether this has succeeded - unsigned char msg; + if (client->Connect(addr)) + { + unsigned char msg; - data_os.Write8(IPC_CONNECT); - data_os.WriteString(topic); + // Send topic name, and enquire whether this has succeeded + data_os->Write8(IPC_CONNECT); + data_os->WriteString(topic); - msg = data_is.Read8(); - - // OK! Confirmation. - if (msg == IPC_CONNECT) { - wxTCPConnection *connection = (wxTCPConnection *)OnMakeConnection (); - if (connection) { - if (!connection->IsKindOf(CLASSINFO(wxTCPConnection))) { - delete connection; - return NULL; + msg = data_is->Read8(); + + // OK! Confirmation. + if (msg == IPC_CONNECT) + { + wxTCPConnection *connection = (wxTCPConnection *)OnMakeConnection (); + + if (connection) + { + if (!connection->IsKindOf(CLASSINFO(wxTCPConnection))) + { + delete connection; + // and fall through to delete everything else + } + else + { + connection->m_topic = topic; + connection->m_sock = client; + connection->m_sockstrm = stream; + connection->m_codeci = data_is; + connection->m_codeco = data_os; + client->Callback(Client_OnRequest); + client->CallbackData((char *)connection); + client->SetNotify(wxSOCKET_INPUT_FLAG | wxSOCKET_LOST_FLAG); + client->Notify(TRUE); + return connection; + } } - connection->m_topic = topic; - client->Callback(Client_OnRequest); - client->CallbackData((char *)connection); - client->Notify(TRUE); - return connection; - } else { - delete client; - return NULL; } - } else { - delete client; - return NULL; } + + // something went wrong + delete data_is; + delete data_os; + delete stream; + delete client; + return NULL; } wxConnectionBase *wxTCPClient::OnMakeConnection() @@ -154,14 +167,15 @@ bool wxTCPServer::Create(const wxString& server_name) wxIPV4address addr; wxSocketServer *server; + addr.LocalHost(); // GRG addr.Service(server_name); // Create a socket listening on specified port server = new wxSocketServer(addr); server->Callback((wxSocketBase::wxSockCbk)Server_OnRequest); - server->SetNotify(wxSOCKET_CONNECTION_FLAG); - server->CallbackData((char *)this); + server->SetNotify(wxSOCKET_CONNECTION_FLAG); + server->Notify(TRUE); // GRG return TRUE; } @@ -212,7 +226,7 @@ bool wxTCPConnection::Disconnect () return TRUE; } -bool wxTCPConnection::Execute (const wxChar *data, int size, wxIPCFormat format) +bool wxTCPConnection::Execute(const wxChar *data, int size, wxIPCFormat format) { if (!m_sock->IsConnected()) return FALSE; @@ -220,12 +234,12 @@ bool wxTCPConnection::Execute (const wxChar *data, int size, wxIPCFormat format) // Prepare EXECUTE message m_codeco->Write8(IPC_EXECUTE); m_codeco->Write8(format); + if (size < 0) - m_codeco->WriteString(data); - else { - m_codeco->Write32(size); - m_sockstrm->Write(data, size); - } + size = strlen(data) + 1; // includes final NUL + + m_codeco->Write32(size); + m_sockstrm->Write(data, size); return TRUE; } @@ -245,7 +259,8 @@ char *wxTCPConnection::Request (const wxString& item, int *size, wxIPCFormat for ret = m_codeci->Read8(); if (ret == IPC_FAIL) return NULL; - else { + else + { size_t s; char *data = NULL; @@ -267,12 +282,12 @@ bool wxTCPConnection::Poke (const wxString& item, wxChar *data, int size, wxIPCF m_codeco->Write8(IPC_POKE); m_codeco->WriteString(item); m_codeco->Write8(format); + if (size < 0) - m_codeco->WriteString(data); - else { - m_codeco->Write32(size); - m_sockstrm->Write(data, size); - } + size = strlen(data) + 1; // includes final NUL + + m_codeco->Write32(size); + m_sockstrm->Write(data, size); return TRUE; } @@ -323,12 +338,12 @@ bool wxTCPConnection::Advise (const wxString& item, m_codeco->Write8(IPC_ADVISE); m_codeco->WriteString(item); m_codeco->Write8(format); + if (size < 0) - m_codeco->WriteString(data); - else { - m_codeco->Write32(size); - m_sockstrm->Write(data, size); - } + size = strlen(data) + 1; // includes final NUL + + m_codeco->Write32(size); + m_sockstrm->Write(data, size); return TRUE; } @@ -345,7 +360,8 @@ void Client_OnRequest(wxSocketBase& sock, wxSocketNotify evt, wxString item; // The socket handler signals us that we lost the connection: destroy all. - if (evt == wxSOCKET_LOST) { + if (evt == wxSOCKET_LOST) + { sock.Close(); connection->OnDisconnect(); return; @@ -357,8 +373,10 @@ void Client_OnRequest(wxSocketBase& sock, wxSocketNotify evt, sockstrm = connection->m_sockstrm; msg = codeci->Read8(); - switch (msg) { - case IPC_EXECUTE: { + switch (msg) + { + case IPC_EXECUTE: + { char *data; size_t size; wxIPCFormat format; @@ -373,7 +391,8 @@ void Client_OnRequest(wxSocketBase& sock, wxSocketNotify evt, delete [] data; break; } - case IPC_ADVISE: { + case IPC_ADVISE: + { char *data; size_t size; wxIPCFormat format; @@ -389,7 +408,8 @@ void Client_OnRequest(wxSocketBase& sock, wxSocketNotify evt, delete [] data; break; } - case IPC_ADVISE_START: { + case IPC_ADVISE_START: + { item = codeci->ReadString(); bool ok = connection->OnStartAdvise (topic_name, item); @@ -400,7 +420,8 @@ void Client_OnRequest(wxSocketBase& sock, wxSocketNotify evt, break; } - case IPC_ADVISE_STOP: { + case IPC_ADVISE_STOP: + { item = codeci->ReadString(); bool ok = connection->OnStopAdvise (topic_name, item); @@ -411,7 +432,8 @@ void Client_OnRequest(wxSocketBase& sock, wxSocketNotify evt, break; } - case IPC_POKE: { + case IPC_POKE: + { wxIPCFormat format; size_t size; wxChar *data; @@ -428,7 +450,8 @@ void Client_OnRequest(wxSocketBase& sock, wxSocketNotify evt, break; } - case IPC_REQUEST: { + case IPC_REQUEST: + { wxIPCFormat format; item = codeci->ReadString(); @@ -437,19 +460,23 @@ void Client_OnRequest(wxSocketBase& sock, wxSocketNotify evt, int user_size = -1; char *user_data = connection->OnRequest (topic_name, item, &user_size, format); - if (user_data) { + if (user_data) + { codeco->Write8(IPC_REQUEST_REPLY); - if (user_size != -1) { - codeco->Write32(user_size); - sockstrm->Write(user_data, user_size); - } else - codeco->WriteString(user_data); - } else + + if (user_size == -1) + user_size = strlen(user_data) + 1; // includes final NUL + + codeco->Write32(user_size); + sockstrm->Write(user_data, user_size); + } + else codeco->Write8(IPC_FAIL); break; } - case IPC_DISCONNECT: { + case IPC_DISCONNECT: + { sock.Close(); connection->OnDisconnect(); break; @@ -473,43 +500,46 @@ void Server_OnRequest(wxSocketServer& server, /* Accept the connection, getting a new socket */ wxSocketBase *sock = server.Accept(); - sock->Notify(FALSE); - sock->SetNotify(wxSOCKET_INPUT_FLAG | wxSOCKET_LOST_FLAG); + if (!sock->Ok()) + return; stream = new wxSocketStream(*sock); codeci = new wxDataInputStream(*stream); codeco = new wxDataOutputStream(*stream); - if (!sock->Ok()) - return; - int msg; msg = codeci->Read8(); - if (msg == IPC_CONNECT) { + if (msg == IPC_CONNECT) + { wxString topic_name; topic_name = codeci->ReadString(); /* Register new socket with the notifier */ wxTCPConnection *new_connection = (wxTCPConnection *)ipcserv->OnAcceptConnection (topic_name); - if (new_connection) { - if (!new_connection->IsKindOf(CLASSINFO(wxTCPConnection))) { + if (new_connection) + { + if (!new_connection->IsKindOf(CLASSINFO(wxTCPConnection))) + { delete new_connection; codeco->Write8(IPC_FAIL); return; } // Acknowledge success codeco->Write8(IPC_CONNECT); - new_connection->m_topic = topic_name; + new_connection->m_sock = sock; new_connection->m_sockstrm = stream; new_connection->m_codeci = codeci; new_connection->m_codeco = codeco; sock->Callback(Client_OnRequest); sock->CallbackData((char *)new_connection); + sock->SetNotify(wxSOCKET_INPUT_FLAG | wxSOCKET_LOST_FLAG); sock->Notify(TRUE); - } else { + } + else + { // Send failure message codeco->Write8(IPC_FAIL); }