233 lines
6.6 KiB
C++
233 lines
6.6 KiB
C++
//////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Crytek Network source code
|
|
//
|
|
// File: ClientStateMachine.cpp
|
|
// Description:
|
|
//
|
|
// History:
|
|
// -July 25,2001:Created by Alberto Demichelis
|
|
//
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
#include "stdafx.h"
|
|
#include "ClientStateMachine.h"
|
|
|
|
#ifdef _DEBUG
|
|
static char THIS_FILE[] = __FILE__;
|
|
#define DEBUG_CLIENTBLOCK new( _NORMAL_BLOCK, THIS_FILE, __LINE__)
|
|
#define new DEBUG_CLIENTBLOCK
|
|
#endif
|
|
|
|
#include "IConsole.h" // IConsole
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
// Construction/Destruction
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
CClientStateMachine::CClientStateMachine()
|
|
{
|
|
}
|
|
|
|
CClientStateMachine::~CClientStateMachine()
|
|
{
|
|
}
|
|
|
|
void CClientStateMachine::_Trace(char *s)
|
|
{
|
|
//::OutputDebugString(s);
|
|
}
|
|
|
|
void CClientStateMachine::_TraceStatus(unsigned int dwStatus)
|
|
{
|
|
switch(dwStatus){
|
|
case STATUS_IDLE:
|
|
_Trace("STATUS_IDLE");
|
|
break;
|
|
case STATUS_WAIT_FOR_CONNECT:
|
|
_Trace("STATUS_WAIT_FOR_CONNECT");
|
|
break;
|
|
case STATUS_CONNECTED:
|
|
_Trace("STATUS_CONNECTED");
|
|
break;
|
|
case STATUS_PROCESSING_CONTEXT:
|
|
_Trace("STATUS_PROCESSING_CONTEXT");
|
|
break;
|
|
case STATUS_WAIT_FOR_SERVER_READY:
|
|
_Trace("STATUS_WAIT_FOR_SERVER_READY");
|
|
break;
|
|
case STATUS_READY:
|
|
_Trace("STATUS_READY");
|
|
break;
|
|
case STATUS_DISCONNECTED:
|
|
_Trace("STATUS_DISCONNECTED");
|
|
break;
|
|
default:
|
|
_Trace("UNKNOWN");
|
|
break;
|
|
}
|
|
}
|
|
|
|
unsigned int CClientStateMachine::HandleANY(unsigned int dwIncomingSignal,DWORD_PTR dwParam)
|
|
{
|
|
ANY_SIGNAL_EXCEPT(STATUS_DISCONNECTED);
|
|
BEGIN_ANY_SIGNAL_HANDLER(dwIncomingSignal)
|
|
/////////////////////////////////////////////////////////////////////
|
|
IF_SIGNAL(SIG_DISCONNECT)
|
|
SetStatus(STATUS_DISCONNECTED);
|
|
OnSignal(SIG_DISCONNECTED, dwParam);
|
|
ENDIF_SIGNAL()
|
|
/////////////////////////////////////////////////////////////////////
|
|
IF_SIGNAL(SIG_ACTIVE_DISCONNECT)
|
|
SetStatus(STATUS_DISCONNECTED);
|
|
OnSignal(SIG_SEND_DISCONNECT,dwParam);
|
|
OnSignal(SIG_DISCONNECTED, dwParam);
|
|
ENDIF_SIGNAL()
|
|
/////////////////////////////////////////////////////////////////////
|
|
END_ANY_SIGNAL_HANDLER()
|
|
}
|
|
|
|
void CClientStateMachine::HandleIDLE(unsigned int dwIncomingSignal,DWORD_PTR dwParam)
|
|
{
|
|
BEGIN_SIGNAL_HANDLER(dwIncomingSignal)
|
|
/////////////////////////////////////////////////////////////////////
|
|
IF_SIGNAL(SIG_START)
|
|
SetStatus(STATUS_WAIT_FOR_CONNECT);
|
|
SetTimer(TM_CONNECT,TM_CONNECT_ET);
|
|
OnSignal(SIG_SEND_SETUP,0);
|
|
ENDIF_SIGNAL()
|
|
/////////////////////////////////////////////////////////////////////
|
|
END_SIGNAL_HANDLER()
|
|
}
|
|
|
|
void CClientStateMachine::HandleWAIT_FOR_CONNECT(unsigned int dwIncomingSignal,DWORD_PTR dwParam)
|
|
{
|
|
BEGIN_SIGNAL_HANDLER(dwIncomingSignal)
|
|
/////////////////////////////////////////////////////////////////////
|
|
IF_SIGNAL(SIG_CONNECT)
|
|
SetStatus(STATUS_CONNECTED);
|
|
ResetTimer();
|
|
OnSignal(SIG_SEND_CONNECT_RESP,0);
|
|
OnSignal(SIG_CONNECTED,0);
|
|
ENDIF_SIGNAL()
|
|
/////////////////////////////////////////////////////////////////////
|
|
IF_SIGNAL(TM_CONNECT)
|
|
SetStatus(STATUS_DISCONNECTED);
|
|
OnSignal(SIG_DISCONNECTED, (DWORD_PTR)"@ConnectionTimeout");
|
|
ENDIF_SIGNAL()
|
|
/////////////////////////////////////////////////////////////////////
|
|
END_SIGNAL_HANDLER()
|
|
}
|
|
|
|
void CClientStateMachine::HandleCONNECTED(unsigned int dwIncomingSignal,DWORD_PTR dwParam)
|
|
{
|
|
BEGIN_SIGNAL_HANDLER(dwIncomingSignal)
|
|
/////////////////////////////////////////////////////////////////////
|
|
IF_SIGNAL(SIG_CONTEXT_SETUP)
|
|
SetStatus(STATUS_PROCESSING_CONTEXT);
|
|
OnSignal(SIG_INCOMING_CONTEXT_SETUP,dwParam);
|
|
ENDIF_SIGNAL()
|
|
/////////////////////////////////////////////////////////////////////
|
|
END_SIGNAL_HANDLER()
|
|
}
|
|
|
|
void CClientStateMachine::HandlePROCESSING_CONTEXT(unsigned int dwIncomingSignal,DWORD_PTR dwParam)
|
|
{
|
|
BEGIN_SIGNAL_HANDLER(dwIncomingSignal)
|
|
/////////////////////////////////////////////////////////////////////
|
|
IF_SIGNAL(SIG_CONTEXT_READY)
|
|
SetTimer(TM_SERVER_READY,TM_SERVER_READY_ET);
|
|
SetStatus(STATUS_WAIT_FOR_SERVER_READY);
|
|
OnSignal(SIG_SEND_CONTEXT_READY,dwParam);
|
|
ENDIF_SIGNAL()
|
|
/////////////////////////////////////////////////////////////////////
|
|
IF_SIGNAL(SIG_CONTEXT_SETUP)
|
|
SetStatus(STATUS_PROCESSING_CONTEXT);
|
|
OnSignal(SIG_INCOMING_CONTEXT_SETUP,dwParam);
|
|
ENDIF_SIGNAL()
|
|
/////////////////////////////////////////////////////////////////////
|
|
END_SIGNAL_HANDLER()
|
|
}
|
|
|
|
void CClientStateMachine::HandleWAIT_FOR_SERVER_READY(unsigned int dwIncomingSignal,DWORD_PTR dwParam)
|
|
{
|
|
BEGIN_SIGNAL_HANDLER(dwIncomingSignal)
|
|
/////////////////////////////////////////////////////////////////////
|
|
IF_SIGNAL(SIG_SERVER_READY)
|
|
SetStatus(STATUS_READY);
|
|
ResetTimer();
|
|
OnSignal(SIG_INCOMING_SERVER_READY,dwParam);
|
|
ENDIF_SIGNAL()
|
|
/////////////////////////////////////////////////////////////////////
|
|
IF_SIGNAL(SIG_CONTEXT_SETUP)
|
|
SetStatus(STATUS_PROCESSING_CONTEXT);
|
|
OnSignal(SIG_INCOMING_CONTEXT_SETUP,dwParam);
|
|
ENDIF_SIGNAL()
|
|
/////////////////////////////////////////////////////////////////////
|
|
IF_SIGNAL(TM_SERVER_READY)
|
|
// SetStatus(STATUS_DISCONNECTED);
|
|
ResetTimer();
|
|
// OnSignal(SIG_DISCONNECTED, (ULONG_PTR)"timeout(TM_SERVER_READY)");
|
|
ENDIF_SIGNAL()
|
|
/////////////////////////////////////////////////////////////////////
|
|
END_SIGNAL_HANDLER()
|
|
|
|
}
|
|
|
|
void CClientStateMachine::HandleREADY(unsigned int dwIncomingSignal,DWORD_PTR dwParam)
|
|
{
|
|
BEGIN_SIGNAL_HANDLER(dwIncomingSignal)
|
|
/////////////////////////////////////////////////////////////////////
|
|
IF_SIGNAL(SIG_CONTEXT_SETUP)
|
|
SetStatus(STATUS_PROCESSING_CONTEXT);
|
|
OnSignal(SIG_INCOMING_CONTEXT_SETUP,dwParam);
|
|
ENDIF_SIGNAL()
|
|
/////////////////////////////////////////////////////////////////////
|
|
END_SIGNAL_HANDLER()
|
|
}
|
|
|
|
void CClientStateMachine::HandleDISCONNECTED(unsigned int dwIncomingSignal,DWORD_PTR dwParam)
|
|
{
|
|
//the machine can't leave this status
|
|
}
|
|
|
|
|
|
void CClientStateMachine::Init(_IClientServices *pParent)
|
|
{
|
|
m_pParent=pParent;
|
|
}
|
|
|
|
void CClientStateMachine::OnSignal(unsigned int dwOutgoingSignal,DWORD_PTR dwParam)
|
|
{
|
|
switch(dwOutgoingSignal){
|
|
case SIG_SEND_SETUP:
|
|
m_pParent->SendSetup();
|
|
break;
|
|
case SIG_SEND_CONNECT_RESP:
|
|
m_pParent->SendConnectResp();
|
|
break;
|
|
case SIG_SEND_CONTEXT_READY:
|
|
m_pParent->SendContextReady();
|
|
break;
|
|
case SIG_SEND_DISCONNECT:
|
|
m_pParent->SendDisconnect((const char*)dwParam);
|
|
break;
|
|
case SIG_CONNECTED:
|
|
m_pParent->OnConnect();
|
|
break;
|
|
case SIG_INCOMING_CONTEXT_SETUP:
|
|
m_pParent->OnContextSetup();
|
|
break;
|
|
case SIG_INCOMING_SERVER_READY:
|
|
m_pParent->OnServerReady();
|
|
break;
|
|
case SIG_DISCONNECTED:
|
|
m_pParent->OnDisconnect((const char *)dwParam); // this pointer is destroyed aftr this call
|
|
break;
|
|
default:
|
|
NET_ASSERT(0);
|
|
break;
|
|
}
|
|
}
|