Files correlati : Ricompilazione Demo : [ ] Commento : Riportata la versione P@rtners 2.0 patch 349 git-svn-id: svn://10.65.10.50/trunk@10573 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			247 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			247 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
/////////////////////////////////////////////////////////////////////////////
 | 
						|
// Name:        server.cpp
 | 
						|
// Purpose:     Simple Soap Server
 | 
						|
// Author:      Guy
 | 
						|
// Modified by:
 | 
						|
// Created:     21/08/2002
 | 
						|
// Copyright:   (c) 2002 Guy
 | 
						|
// Licence:     wxWindows licence
 | 
						|
/////////////////////////////////////////////////////////////////////////////
 | 
						|
 | 
						|
// ==========================================================================
 | 
						|
// declarations
 | 
						|
// ==========================================================================
 | 
						|
 | 
						|
// --------------------------------------------------------------------------
 | 
						|
// headers
 | 
						|
// --------------------------------------------------------------------------
 | 
						|
 | 
						|
#include <wx/wx.h>
 | 
						|
#include <wx/socket.h>
 | 
						|
#include "wx/wfstream.h"
 | 
						|
 | 
						|
#include <wx/config.h>
 | 
						|
#include <wx/msw/iniconf.h> 
 | 
						|
 | 
						|
#include "http.h"
 | 
						|
#include "soap.h"
 | 
						|
 | 
						|
// --------------------------------------------------------------------------
 | 
						|
// classes
 | 
						|
// --------------------------------------------------------------------------
 | 
						|
 | 
						|
// Define a new application type
 | 
						|
class SoapServerApp : public wxApp
 | 
						|
{
 | 
						|
	wxEvtHandler* m_server;
 | 
						|
 | 
						|
public:
 | 
						|
  virtual bool OnInit();
 | 
						|
  virtual int OnExit();
 | 
						|
};
 | 
						|
 | 
						|
enum 
 | 
						|
{
 | 
						|
  SERVER_ID = 1001,
 | 
						|
  SOCKET_ID = 1002
 | 
						|
};
 | 
						|
 | 
						|
class SoapServer : public wxEvtHandler
 | 
						|
{
 | 
						|
  wxSocketServer* m_server;
 | 
						|
	wxFileOutputStream* m_log;
 | 
						|
 | 
						|
protected:
 | 
						|
	int GetDefaultPort() const;
 | 
						|
	void AppendText(const char* str);
 | 
						|
  void ProcessSoapCommand(wxSocketBase *sock);
 | 
						|
 | 
						|
public:
 | 
						|
	bool Ok() const { return m_server->Ok(); }
 | 
						|
	SoapServer();
 | 
						|
	~SoapServer();
 | 
						|
 | 
						|
  void OnServerEvent(wxSocketEvent& event);
 | 
						|
  void OnSocketEvent(wxSocketEvent& event);
 | 
						|
	DECLARE_EVENT_TABLE();
 | 
						|
};
 | 
						|
 | 
						|
BEGIN_EVENT_TABLE(SoapServer, wxEvtHandler)
 | 
						|
  EVT_SOCKET(SERVER_ID, SoapServer::OnServerEvent)
 | 
						|
  EVT_SOCKET(SOCKET_ID, SoapServer::OnSocketEvent)
 | 
						|
END_EVENT_TABLE()
 | 
						|
 | 
						|
void SoapServer::AppendText(const char* str)
 | 
						|
{
 | 
						|
	*m_log << str << "\r\n";
 | 
						|
}
 | 
						|
 | 
						|
void SoapServer::ProcessSoapCommand(wxSocketBase *sock)
 | 
						|
{
 | 
						|
	sock->SetFlags(wxSOCKET_NOWAIT);
 | 
						|
 | 
						|
  // Read the data
 | 
						|
  wxChar buf[4096]; memset(buf, 0, sizeof(buf));
 | 
						|
 	unsigned int len = sock->Read(buf, sizeof(buf)).LastCount();
 | 
						|
	AppendText(buf);
 | 
						|
 | 
						|
	wxString str;
 | 
						|
	if (strncmp(buf, "POST", 4) == 0)
 | 
						|
	{	
 | 
						|
		wxString strAnswer = SoapProcessMessage(buf, len);
 | 
						|
    sock->Write(strAnswer, strAnswer.Length());
 | 
						|
    AppendText(strAnswer);
 | 
						|
	} else
 | 
						|
	if (strncmp(buf, "GET ", 4) == 0)
 | 
						|
	{
 | 
						|
		str = buf;
 | 
						|
		HttpProcessMessage(str, sock, *m_log);
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
void SoapServer::OnServerEvent(wxSocketEvent& event)
 | 
						|
{
 | 
						|
  wxString s = "OnServerEvent: ";
 | 
						|
 | 
						|
  switch(event.GetSocketEvent())
 | 
						|
  {
 | 
						|
    case wxSOCKET_CONNECTION : s.Append("wxSOCKET_CONNECTION"); break;
 | 
						|
    default                  : s.Append("Unexpected event!"); break;
 | 
						|
  }
 | 
						|
 | 
						|
  AppendText(s);
 | 
						|
 | 
						|
  // Accept new connection if there is one in the pending
 | 
						|
  // connections queue, else exit. We use Accept(FALSE) for
 | 
						|
  // non-blocking accept (although if we got here, there
 | 
						|
  // should ALWAYS be a pending connection).
 | 
						|
 | 
						|
  wxSocketBase* sock = m_server->Accept(FALSE);
 | 
						|
  if (sock)
 | 
						|
  {
 | 
						|
    AppendText("New client connection accepted");
 | 
						|
  }
 | 
						|
  else
 | 
						|
  {
 | 
						|
    AppendText("Error: couldn't accept a new connection");
 | 
						|
    sock->Destroy();
 | 
						|
    return;
 | 
						|
  }
 | 
						|
 | 
						|
  sock->SetEventHandler(*this, SOCKET_ID);
 | 
						|
  sock->SetNotify(wxSOCKET_INPUT_FLAG | wxSOCKET_LOST_FLAG);
 | 
						|
  sock->Notify(TRUE);
 | 
						|
}
 | 
						|
 | 
						|
void SoapServer::OnSocketEvent(wxSocketEvent& event)
 | 
						|
{
 | 
						|
  wxString s = "OnSocketEvent: ";
 | 
						|
  wxSocketBase *sock = event.GetSocket();
 | 
						|
 | 
						|
  // First, print a message
 | 
						|
  switch(event.GetSocketEvent())
 | 
						|
  {
 | 
						|
    case wxSOCKET_INPUT : s.Append("wxSOCKET_INPUT\n"); break;
 | 
						|
    case wxSOCKET_LOST  : s.Append("wxSOCKET_LOST\n"); break;
 | 
						|
    default             : s.Append("Unexpected event !\n"); break;
 | 
						|
  }
 | 
						|
 | 
						|
  AppendText(s);
 | 
						|
 | 
						|
  // Now we process the event
 | 
						|
  switch(event.GetSocketEvent())
 | 
						|
  {
 | 
						|
    case wxSOCKET_INPUT:
 | 
						|
    {
 | 
						|
      // We disable input events, so that the test doesn't trigger
 | 
						|
      // wxSocketEvent again.
 | 
						|
      sock->SetNotify(wxSOCKET_LOST_FLAG);
 | 
						|
 | 
						|
			ProcessSoapCommand(sock);
 | 
						|
 | 
						|
      // Enable input events again.
 | 
						|
      sock->SetNotify(wxSOCKET_LOST_FLAG | wxSOCKET_INPUT_FLAG);
 | 
						|
      break;
 | 
						|
    }
 | 
						|
    case wxSOCKET_LOST:
 | 
						|
    {
 | 
						|
      // Destroy() should be used instead of delete wherever possible,
 | 
						|
      // due to the fact that wxSocket uses 'delayed events' (see the
 | 
						|
      // documentation for wxPostEvent) and we don't want an event to
 | 
						|
      // arrive to the event handler (the frame, here) after the socket
 | 
						|
      // has been deleted. Also, we might be doing some other thing with
 | 
						|
      // the socket at the same time; for example, we might be in the
 | 
						|
      // middle of a test or something. Destroy() takes care of all
 | 
						|
      // this for us.
 | 
						|
 | 
						|
      AppendText("Deleting socket.");
 | 
						|
      sock->Destroy();
 | 
						|
      break;
 | 
						|
    }
 | 
						|
    default: ;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
int SoapServer::GetDefaultPort() const
 | 
						|
{
 | 
						|
	int nPort = 3883;
 | 
						|
  wxIniConfig ini("", "", "./campo.ini");
 | 
						|
	ini.SetPath("/Server");
 | 
						|
	const wxString str = ini.Read("Dictionary", "");
 | 
						|
	const int colon = str.Find(':');
 | 
						|
  if (colon > 0)
 | 
						|
		nPort = atoi(str.Mid(colon+1));
 | 
						|
	return nPort;
 | 
						|
}
 | 
						|
 | 
						|
SoapServer::SoapServer()
 | 
						|
{
 | 
						|
  // Create the address - defaults to localhost:0 initially
 | 
						|
  wxIPV4address addr;
 | 
						|
  addr.Service(GetDefaultPort());
 | 
						|
 | 
						|
  // Create the socket
 | 
						|
  m_server = new wxSocketServer(addr);
 | 
						|
 | 
						|
	m_log = new wxFileOutputStream("soaplog.txt");
 | 
						|
 | 
						|
	wxString str;
 | 
						|
 | 
						|
	// We use Ok() here to see if the server is really listening
 | 
						|
  if (m_server->Ok())
 | 
						|
  {
 | 
						|
		// Setup the event handler and subscribe to connection events
 | 
						|
		m_server->SetEventHandler(*this, SERVER_ID);
 | 
						|
		m_server->SetNotify(wxSOCKET_CONNECTION_FLAG);
 | 
						|
		m_server->Notify(TRUE);
 | 
						|
 | 
						|
		str << "Server listening on port " << addr.Service();
 | 
						|
	}
 | 
						|
  else
 | 
						|
  {
 | 
						|
		str << "Could not listen to port " << addr.Service();
 | 
						|
  }
 | 
						|
	AppendText(str);
 | 
						|
}
 | 
						|
 | 
						|
SoapServer::~SoapServer()
 | 
						|
{
 | 
						|
	delete m_server;
 | 
						|
	delete m_log;
 | 
						|
}
 | 
						|
 | 
						|
IMPLEMENT_APP(SoapServerApp)
 | 
						|
 | 
						|
bool SoapServerApp::OnInit()
 | 
						|
{
 | 
						|
  m_server = new SoapServer;
 | 
						|
	return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
int SoapServerApp::OnExit()
 | 
						|
{
 | 
						|
	delete m_server;
 | 
						|
	return wxApp::OnExit();
 | 
						|
}
 |