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:
@@ -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
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user