Main Page | Namespace List | Class Hierarchy | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

ippClientServerSpy.cpp

Go to the documentation of this file.
00001 #include "stdafx.h"
00002 
00003 #include "ippdme/Spy/ippClientServerSpy.h"
00004 #include "ippdme/assert.h"
00005 #include "ippdme/Server/ippLogger.h"
00006 
00007 // state machine
00008 //
00009 //
00010 //               
00011 //   disconnected 
00012 //        |
00013 //        | start
00014 //        |
00015 //        |
00016 //   Action:  server.listen
00017 ippClientServerSpy::ippClientServerSpy()
00018   : _logger(0)
00019   , _oldClientState(ippSpyClient::trying_to_connect)
00020   , _oldServerState(ippSpyServer::connected)
00021   , _listening_port(1294)
00022   , _state(disconnected)
00023 {
00024   _client.setParent(this);
00025   _server.setParent(this);
00026 
00027 }
00028 
00029 ippClientServerSpy::~ippClientServerSpy()
00030 {
00031   Stop();
00032 }
00033 
00034 
00035 bool ippClientServerSpy::Start(
00036   int listening_port,
00037   const char* server_ip,
00038   int server_port
00039 )
00040 {
00041   _listening_port = listening_port;
00042   if (getStatus() != disconnected) {
00043     Stop();
00044   }
00045   IPP_ASSERT(getStatus() == disconnected);
00046   HeartBeat();
00047 
00048   _client.Connect(server_ip,server_port);
00049   _state = trying_to_connect_to_remote_server;
00050 
00051   HeartBeat();
00052   return true;
00053 }
00054 
00055 
00056 
00057 void ippClientServerSpy::HeartBeat()
00058 {
00059   _server.HeartBeat();
00060   _client.HeartBeat();
00061 
00062   STATE oldState = _state;
00063 
00064   ippSpyClient::STATE newClientState = getClientStatus();
00065   if (_oldClientState == ippSpyClient::trying_to_connect && newClientState == ippSpyClient::connected )
00066   { 
00067     _server.PowerOn(_listening_port);
00068     if (_server.getStatus() == ippSpyServer::listening) { 
00069       _state = listening;
00070     }
00071   }
00072   ippSpyServer::STATE _newServerState = getServerStatus();
00073 
00074   if (_newServerState == ippSpyServer::connected) { 
00075     _state = connected;
00076   }
00077 
00078   if (_oldServerState != _newServerState ) {
00079     _oldServerState = _newServerState;
00080     //xx __raise ServerStatusChanged(_oldServerState);
00081   }
00082 
00083   if (oldState !=  _state) {
00084     OnStatusChanged(_state);
00085   }
00086 
00087 }
00088 
00089 void ippClientServerSpy::Stop()
00090 {
00091   _server.PowerOff();
00092   _client.Disconnect();
00093   HeartBeat();
00094   IPP_ASSERT(getServerStatus() == ippSpyServer::uninitialized);
00095   IPP_ASSERT(getClientStatus() == ippSpyClient::disconnected);
00096   _state = disconnected;
00097 }
00098 
00099 ippClientServerSpy::STATE ippClientServerSpy::getStatus() const {
00100   return _state;
00101 }
00102 void ippClientServerSpy::SendCommandLine(const char* inputline,bool bwellFormed)
00103 {
00104   _client.SendCommand(inputline);
00105   if(_logger) {
00106     _logger->WriteLineFormat("<<< %s",inputline);
00107   }
00108 }
00109 
00110 void ippClientServerSpy::SendResponseLine(const char* inputline,bool bwellFormed)
00111 {
00112   _server.WriteToSocket(inputline);
00113   if(_logger) {
00114     _logger->WriteLineFormat(">>> %s",inputline);
00115   }
00116 }
00117 
00118 void ippClientServerSpy::setLogger(ippLogger* logger)
00119 {
00120   _logger = logger;
00121 }
00122 
00123 ippLogger* ippClientServerSpy::GetLogger() const
00124 {
00125   return _logger;
00126 }
00127 
00128 ippSpyClient::STATE ippClientServerSpy::getClientStatus() const
00129 {
00130   return _client.getStatus();
00131 }
00132 ippSpyServer::STATE ippClientServerSpy::getServerStatus() const
00133 {
00134   return _server.getStatus();
00135 }
00136 
00137  

Generated on Wed Nov 8 00:20:07 2006 for IPPDME by  doxygen 1.4.1