Files
FC1/CryNetwork/ClientStateMachine.cpp
romkazvo 34d6c5d489 123
2023-08-07 19:29:24 +08:00

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;
}
}