123
This commit is contained in:
232
CryNetwork/ClientStateMachine.cpp
Normal file
232
CryNetwork/ClientStateMachine.cpp
Normal file
@@ -0,0 +1,232 @@
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user