Some parts rewritten to use wxSocket events instead of callbacks, as the

latter will be deprecated soon. Also, some slight bugs fixed.


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@6579 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Guillermo Rodriguez Garcia
2000-03-10 05:30:53 +00:00
parent ecc888a08f
commit cdc59bb69e
2 changed files with 117 additions and 63 deletions

View File

@@ -4,6 +4,7 @@
// Author: Julian Smart // Author: Julian Smart
// Modified by: Guilhem Lavaux (big rewrite) May 1997, 1998 // Modified by: Guilhem Lavaux (big rewrite) May 1997, 1998
// Guillermo Rodriguez (updated for wxSocket v2) Jan 2000 // Guillermo Rodriguez (updated for wxSocket v2) Jan 2000
// (callbacks deprecated) Mar 2000
// Created: 1993 // Created: 1993
// RCS-ID: $Id$ // RCS-ID: $Id$
// Copyright: (c) Julian Smart 1993 // Copyright: (c) Julian Smart 1993
@@ -21,7 +22,7 @@
#include "wx/defs.h" #include "wx/defs.h"
#if wxUSE_SOCKETS #if wxUSE_SOCKETS && wxUSE_IPC
#include "wx/ipcbase.h" #include "wx/ipcbase.h"
#include "wx/socket.h" #include "wx/socket.h"
@@ -91,17 +92,14 @@ protected:
friend class wxTCPServer; friend class wxTCPServer;
friend class wxTCPClient; friend class wxTCPClient;
friend void Client_OnRequest(wxSocketBase&, friend class wxTCPEventHandler;
wxSocketNotify, char *);
friend void Server_OnRequest(wxSocketServer&,
wxSocketNotify, char *);
private: private:
// //
// We're hiding an Execute method in ConnectionBase // We're hiding an Execute method in ConnectionBase
//s //
virtual bool Execute(const wxString& str) virtual bool Execute(const wxString& str)
{ return Execute(str, -1, wxIPC_TEXT); } { return Execute(str, -1, wxIPC_TEXT); }
}; };
class wxTCPServer: public wxServerBase class wxTCPServer: public wxServerBase
@@ -138,6 +136,6 @@ public:
virtual wxConnectionBase *OnMakeConnection(); virtual wxConnectionBase *OnMakeConnection();
}; };
#endif // wxUSE_SOCKETS #endif // wxUSE_SOCKETS && wxUSE_IPC
#endif // ipcsock.h #endif // _WX_SCKIPC_H

View File

@@ -4,6 +4,7 @@
// Author: Julian Smart // Author: Julian Smart
// Modified by: Guilhem Lavaux (big rewrite) May 1997, 1998 // Modified by: Guilhem Lavaux (big rewrite) May 1997, 1998
// Guillermo Rodriguez (updated for wxSocket v2) Jan 2000 // Guillermo Rodriguez (updated for wxSocket v2) Jan 2000
// (callbacks deprecated) Mar 2000
// Created: 1993 // Created: 1993
// RCS-ID: $Id$ // RCS-ID: $Id$
// Copyright: (c) Julian Smart 1993 // Copyright: (c) Julian Smart 1993
@@ -12,6 +13,14 @@
// Licence: wxWindows license // Licence: wxWindows license
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
// ==========================================================================
// declarations
// ==========================================================================
// --------------------------------------------------------------------------
// headers
// --------------------------------------------------------------------------
#ifdef __GNUG__ #ifdef __GNUG__
#pragma implementation "sckipc.h" #pragma implementation "sckipc.h"
#endif #endif
@@ -34,20 +43,23 @@
#include "wx/socket.h" #include "wx/socket.h"
#include "wx/sckipc.h" #include "wx/sckipc.h"
#include "wx/module.h"
#include "wx/event.h"
#include "wx/log.h" #include "wx/log.h"
#ifdef __BORLANDC__ #ifdef __BORLANDC__
#pragma hdrstop #pragma hdrstop
#endif #endif
IMPLEMENT_DYNAMIC_CLASS(wxTCPServer, wxServerBase) // --------------------------------------------------------------------------
IMPLEMENT_DYNAMIC_CLASS(wxTCPClient, wxClientBase) // macros and constants
IMPLEMENT_CLASS(wxTCPConnection, wxConnectionBase) // --------------------------------------------------------------------------
// It seems to be already defined somewhere in the Xt includes. // It seems to be already defined somewhere in the Xt includes.
#ifndef __XT__ #ifndef __XT__
// Message codes // Message codes
enum { enum
{
IPC_EXECUTE = 1, IPC_EXECUTE = 1,
IPC_REQUEST, IPC_REQUEST,
IPC_POKE, IPC_POKE,
@@ -62,24 +74,46 @@ enum {
}; };
#endif #endif
void Server_OnRequest(wxSocketServer& server,
wxSocketNotify evt,
char *cdata);
void Client_OnRequest(wxSocketBase& sock,
wxSocketNotify evt,
char *cdata);
// All sockets will be created with the following flags // All sockets will be created with the following flags
#define SCKIPC_FLAGS (wxSOCKET_WAITALL) #define SCKIPC_FLAGS (wxSOCKET_WAITALL)
// --------------------------------------------------------------------------- // --------------------------------------------------------------------------
// wxTCPClient // wxTCPEventHandler stuff (private class)
// --------------------------------------------------------------------------- // --------------------------------------------------------------------------
wxTCPClient::wxTCPClient () class wxTCPEventHandler : public wxEvtHandler
: wxClientBase() {
public:
wxTCPEventHandler() : wxEvtHandler() {};
void Client_OnRequest(wxSocketEvent& event);
void Server_OnRequest(wxSocketEvent& event);
DECLARE_EVENT_TABLE()
};
enum
{
_CLIENT_ONREQUEST_ID = 1000,
_SERVER_ONREQUEST_ID
};
static wxTCPEventHandler *gs_handler = NULL;
// ==========================================================================
// implementation
// ==========================================================================
IMPLEMENT_DYNAMIC_CLASS(wxTCPServer, wxServerBase)
IMPLEMENT_DYNAMIC_CLASS(wxTCPClient, wxClientBase)
IMPLEMENT_CLASS(wxTCPConnection, wxConnectionBase)
// --------------------------------------------------------------------------
// wxTCPClient
// --------------------------------------------------------------------------
wxTCPClient::wxTCPClient () : wxClientBase()
{ {
} }
@@ -131,8 +165,8 @@ wxConnectionBase *wxTCPClient::MakeConnection (const wxString& host,
connection->m_sockstrm = stream; connection->m_sockstrm = stream;
connection->m_codeci = data_is; connection->m_codeci = data_is;
connection->m_codeco = data_os; connection->m_codeco = data_os;
client->Callback(Client_OnRequest); client->SetEventHandler(*gs_handler, _CLIENT_ONREQUEST_ID);
client->CallbackData((char *)connection); client->SetClientData(connection);
client->SetNotify(wxSOCKET_INPUT_FLAG | wxSOCKET_LOST_FLAG); client->SetNotify(wxSOCKET_INPUT_FLAG | wxSOCKET_LOST_FLAG);
client->Notify(TRUE); client->Notify(TRUE);
return connection; return connection;
@@ -160,12 +194,11 @@ wxConnectionBase *wxTCPClient::OnMakeConnection()
return new wxTCPConnection; return new wxTCPConnection;
} }
// --------------------------------------------------------------------------- // --------------------------------------------------------------------------
// wxTCPServer // wxTCPServer
// --------------------------------------------------------------------------- // --------------------------------------------------------------------------
wxTCPServer::wxTCPServer () wxTCPServer::wxTCPServer () : wxServerBase()
: wxServerBase()
{ {
} }
@@ -179,8 +212,8 @@ bool wxTCPServer::Create(const wxString& server_name)
// Create a socket listening on specified port // Create a socket listening on specified port
server = new wxSocketServer(addr, SCKIPC_FLAGS); server = new wxSocketServer(addr, SCKIPC_FLAGS);
server->Callback((wxSocketBase::wxSockCbk)Server_OnRequest); server->SetEventHandler(*gs_handler, _SERVER_ONREQUEST_ID);
server->CallbackData((char *)this); server->SetClientData(this);
server->SetNotify(wxSOCKET_CONNECTION_FLAG); server->SetNotify(wxSOCKET_CONNECTION_FLAG);
server->Notify(TRUE); server->Notify(TRUE);
@@ -196,14 +229,16 @@ wxConnectionBase *wxTCPServer::OnAcceptConnection( const wxString& WXUNUSED(topi
return new wxTCPConnection(); return new wxTCPConnection();
} }
// --------------------------------------------------------------------------- // --------------------------------------------------------------------------
// wxTCPConnection // wxTCPConnection
// --------------------------------------------------------------------------- // --------------------------------------------------------------------------
wxTCPConnection::wxTCPConnection () wxTCPConnection::wxTCPConnection () : wxConnectionBase()
: wxConnectionBase(),
m_sock(NULL), m_sockstrm(NULL), m_codeci(NULL), m_codeco(NULL)
{ {
m_sock = NULL;
m_sockstrm = NULL;
m_codeci = NULL;
m_codeco = NULL;
} }
wxTCPConnection::wxTCPConnection(char * WXUNUSED(buffer), int WXUNUSED(size)) wxTCPConnection::wxTCPConnection(char * WXUNUSED(buffer), int WXUNUSED(size))
@@ -229,7 +264,7 @@ bool wxTCPConnection::Disconnect ()
{ {
// Send the the disconnect message to the peer. // Send the the disconnect message to the peer.
m_codeco->Write8(IPC_DISCONNECT); m_codeco->Write8(IPC_DISCONNECT);
m_sock->Callback(NULL); m_sock->Notify(FALSE);
m_sock->Close(); m_sock->Close();
return TRUE; return TRUE;
@@ -357,12 +392,22 @@ bool wxTCPConnection::Advise (const wxString& item,
return TRUE; return TRUE;
} }
void Client_OnRequest(wxSocketBase& sock, // --------------------------------------------------------------------------
wxSocketNotify evt, // wxTCPEventHandler (private class)
char *cdata) // --------------------------------------------------------------------------
BEGIN_EVENT_TABLE(wxTCPEventHandler, wxEvtHandler)
EVT_SOCKET(_CLIENT_ONREQUEST_ID, wxTCPEventHandler::Client_OnRequest)
EVT_SOCKET(_SERVER_ONREQUEST_ID, wxTCPEventHandler::Server_OnRequest)
END_EVENT_TABLE()
void wxTCPEventHandler::Client_OnRequest(wxSocketEvent &event)
{ {
wxSocketBase *sock = event.GetSocket();
wxSocketNotify evt = event.GetSocketEvent();
wxTCPConnection *connection = (wxTCPConnection *)(event.GetClientData());
int msg = 0; int msg = 0;
wxTCPConnection *connection = (wxTCPConnection *)cdata;
wxDataInputStream *codeci; wxDataInputStream *codeci;
wxDataOutputStream *codeco; wxDataOutputStream *codeco;
wxSocketStream *sockstrm; wxSocketStream *sockstrm;
@@ -372,8 +417,8 @@ void Client_OnRequest(wxSocketBase& sock,
// The socket handler signals us that we lost the connection: destroy all. // The socket handler signals us that we lost the connection: destroy all.
if (evt == wxSOCKET_LOST) if (evt == wxSOCKET_LOST)
{ {
sock.Callback(NULL); sock->Notify(FALSE);
sock.Close(); sock->Close();
connection->OnDisconnect(); connection->OnDisconnect();
return; return;
} }
@@ -488,9 +533,8 @@ void Client_OnRequest(wxSocketBase& sock,
} }
case IPC_DISCONNECT: case IPC_DISCONNECT:
{ {
wxLogDebug("IPC_DISCONNECT"); sock->Notify(FALSE);
sock.Callback(NULL); sock->Close();
sock.Close();
connection->OnDisconnect(); connection->OnDisconnect();
break; break;
} }
@@ -500,29 +544,25 @@ void Client_OnRequest(wxSocketBase& sock,
} }
} }
void Server_OnRequest(wxSocketServer& server, void wxTCPEventHandler::Server_OnRequest(wxSocketEvent &event)
wxSocketNotify evt,
char *cdata)
{ {
wxTCPServer *ipcserv = (wxTCPServer *)cdata; wxSocketServer *server = (wxSocketServer *) event.GetSocket();
wxSocketStream *stream; wxTCPServer *ipcserv = (wxTCPServer *) event.GetClientData();
wxDataInputStream *codeci;
wxDataOutputStream *codeco;
if (evt != wxSOCKET_CONNECTION) if (event.GetSocketEvent() != wxSOCKET_CONNECTION)
return; return;
// Accept the connection, getting a new socket // Accept the connection, getting a new socket
wxSocketBase *sock = server.Accept(); wxSocketBase *sock = server->Accept();
if (!sock->Ok()) if (!sock->Ok())
{ {
sock->Destroy(); sock->Destroy();
return; return;
} }
stream = new wxSocketStream(*sock); wxSocketStream *stream = new wxSocketStream(*sock);
codeci = new wxDataInputStream(*stream); wxDataInputStream *codeci = new wxDataInputStream(*stream);
codeco = new wxDataOutputStream(*stream); wxDataOutputStream *codeco = new wxDataOutputStream(*stream);
int msg; int msg;
msg = codeci->Read8(); msg = codeci->Read8();
@@ -546,8 +586,8 @@ void Server_OnRequest(wxSocketServer& server,
new_connection->m_sockstrm = stream; new_connection->m_sockstrm = stream;
new_connection->m_codeci = codeci; new_connection->m_codeci = codeci;
new_connection->m_codeco = codeco; new_connection->m_codeco = codeco;
sock->Callback(Client_OnRequest); sock->SetEventHandler(*gs_handler, _CLIENT_ONREQUEST_ID);
sock->CallbackData((char *)new_connection); sock->SetClientData(new_connection);
sock->SetNotify(wxSOCKET_INPUT_FLAG | wxSOCKET_LOST_FLAG); sock->SetNotify(wxSOCKET_INPUT_FLAG | wxSOCKET_LOST_FLAG);
sock->Notify(TRUE); sock->Notify(TRUE);
return; return;
@@ -569,5 +609,21 @@ void Server_OnRequest(wxSocketServer& server,
sock->Destroy(); sock->Destroy();
} }
// --------------------------------------------------------------------------
// wxTCPEventHandlerModule (private class)
// --------------------------------------------------------------------------
class WXDLLEXPORT wxTCPEventHandlerModule: public wxModule
{
DECLARE_DYNAMIC_CLASS(wxTCPEventHandlerModule)
public:
bool OnInit() { gs_handler = new wxTCPEventHandler(); return TRUE; }
void OnExit() { wxDELETE(gs_handler); }
};
IMPLEMENT_DYNAMIC_CLASS(wxTCPEventHandlerModule, wxModule)
#endif #endif
// wxUSE_SOCKETS && wxUSE_IPC // wxUSE_SOCKETS && wxUSE_IPC