mirror of
https://gitea.wildfiregames.com/0ad/0ad.git
synced 2026-06-21 01:04:06 +00:00
Restrict param type of FSM events
Previously the param type was `void*` now the type has to be specified as template parameter of the `CFsm`. With this commit some casts can be removed.
This commit is contained in:
+11
-10
@@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 2024 Wildfire Games.
|
||||
/* Copyright (C) 2025 Wildfire Games.
|
||||
* This file is part of 0 A.D.
|
||||
*
|
||||
* 0 A.D. is free software: you can redistribute it and/or modify
|
||||
@@ -29,12 +29,13 @@ constexpr unsigned int FSM_INVALID_STATE{std::numeric_limits<unsigned int>::max(
|
||||
* The CFsmEvent objects are under the control of CFsm so
|
||||
* they are created and deleted via CFsm.
|
||||
*/
|
||||
template <typename MessageType>
|
||||
class CFsmEvent
|
||||
{
|
||||
public:
|
||||
CFsmEvent(unsigned int type, void* pParam) :
|
||||
CFsmEvent(unsigned int type, MessageType param) :
|
||||
m_Type{type},
|
||||
m_Param{pParam}
|
||||
m_Param{param}
|
||||
{}
|
||||
|
||||
unsigned int GetType() const
|
||||
@@ -42,14 +43,14 @@ public:
|
||||
return m_Type;
|
||||
}
|
||||
|
||||
void* GetParamRef()
|
||||
MessageType GetParamRef()
|
||||
{
|
||||
return m_Param;
|
||||
}
|
||||
|
||||
private:
|
||||
unsigned int m_Type; // Event type
|
||||
void* m_Param; // Event paramater
|
||||
MessageType m_Param; // Event paramater
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -63,17 +64,17 @@ private:
|
||||
* transitions; Mealy machines are event driven where an
|
||||
* event triggers a state transition.
|
||||
*/
|
||||
template <typename Context>
|
||||
template <typename Context, typename MessageType>
|
||||
class CFsm
|
||||
{
|
||||
using Action = bool(Context* pContext, CFsmEvent* pEvent);
|
||||
using Action = bool(Context* pContext, CFsmEvent<MessageType>* pEvent);
|
||||
|
||||
struct CallbackFunction
|
||||
{
|
||||
Action* pFunction{nullptr};
|
||||
Context* pContext{nullptr};
|
||||
|
||||
bool operator()(CFsmEvent& event) const
|
||||
bool operator()(CFsmEvent<MessageType>& event) const
|
||||
{
|
||||
return !pFunction || pFunction(pContext, &event);
|
||||
}
|
||||
@@ -123,7 +124,7 @@ public:
|
||||
* Updates the FSM and retrieves next state.
|
||||
* @return whether the state was changed.
|
||||
*/
|
||||
bool Update(unsigned int eventType, void* pEventData)
|
||||
bool Update(unsigned int eventType, MessageType eventData)
|
||||
{
|
||||
if (IsFirstTime())
|
||||
m_CurrState = m_FirstState;
|
||||
@@ -133,7 +134,7 @@ public:
|
||||
if (transitionIterator == m_Transitions.end())
|
||||
return false;
|
||||
|
||||
CFsmEvent event{eventType, pEventData};
|
||||
CFsmEvent<MessageType> event{eventType, eventData};
|
||||
|
||||
// Save the default state transition (actions might call SetNextState
|
||||
// to override this)
|
||||
|
||||
@@ -663,7 +663,7 @@ void CNetClient::StartGame(const JS::MutableHandleValue initAttributes, const st
|
||||
m_Game->StartGame(initAttributes, savedState);
|
||||
}
|
||||
|
||||
bool CNetClient::OnConnect(CNetClient* client, CFsmEvent* event)
|
||||
bool CNetClient::OnConnect(CNetClient* client, CFsmEvent<CNetMessage*>* event)
|
||||
{
|
||||
ENSURE(event->GetType() == (uint)NMT_CONNECT_COMPLETE);
|
||||
|
||||
@@ -674,7 +674,7 @@ bool CNetClient::OnConnect(CNetClient* client, CFsmEvent* event)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CNetClient::OnHandshake(CNetClient* client, CFsmEvent* event)
|
||||
bool CNetClient::OnHandshake(CNetClient* client, CFsmEvent<CNetMessage*>* event)
|
||||
{
|
||||
ENSURE(event->GetType() == (uint)NMT_SERVER_HANDSHAKE);
|
||||
client->m_ServerHandshake = *static_cast<CSrvHandshakeMessage*>(event->GetParamRef());
|
||||
@@ -685,7 +685,7 @@ bool CNetClient::OnHandshake(CNetClient* client, CFsmEvent* event)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CNetClient::OnHandshakeResponse(CNetClient* client, CFsmEvent* event)
|
||||
bool CNetClient::OnHandshakeResponse(CNetClient* client, CFsmEvent<CNetMessage*>* event)
|
||||
{
|
||||
ENSURE(event->GetType() == (uint)NMT_SERVER_HANDSHAKE_RESPONSE);
|
||||
|
||||
@@ -713,7 +713,7 @@ bool CNetClient::OnHandshakeResponse(CNetClient* client, CFsmEvent* event)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CNetClient::OnAuthenticateRequest(CNetClient* client, CFsmEvent* event)
|
||||
bool CNetClient::OnAuthenticateRequest(CNetClient* client, CFsmEvent<CNetMessage*>* event)
|
||||
{
|
||||
ENSURE(event->GetType() == (uint)NMT_AUTHENTICATE);
|
||||
|
||||
@@ -721,7 +721,7 @@ bool CNetClient::OnAuthenticateRequest(CNetClient* client, CFsmEvent* event)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CNetClient::OnAuthenticate(CNetClient* client, CFsmEvent* event)
|
||||
bool CNetClient::OnAuthenticate(CNetClient* client, CFsmEvent<CNetMessage*>* event)
|
||||
{
|
||||
ENSURE(event->GetType() == (uint)NMT_AUTHENTICATE_RESULT);
|
||||
|
||||
@@ -742,7 +742,7 @@ bool CNetClient::OnAuthenticate(CNetClient* client, CFsmEvent* event)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CNetClient::OnChat(CNetClient* client, CFsmEvent* event)
|
||||
bool CNetClient::OnChat(CNetClient* client, CFsmEvent<CNetMessage*>* event)
|
||||
{
|
||||
ENSURE(event->GetType() == (uint)NMT_CHAT);
|
||||
|
||||
@@ -756,7 +756,7 @@ bool CNetClient::OnChat(CNetClient* client, CFsmEvent* event)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CNetClient::OnReady(CNetClient* client, CFsmEvent* event)
|
||||
bool CNetClient::OnReady(CNetClient* client, CFsmEvent<CNetMessage*>* event)
|
||||
{
|
||||
ENSURE(event->GetType() == (uint)NMT_READY);
|
||||
|
||||
@@ -770,7 +770,7 @@ bool CNetClient::OnReady(CNetClient* client, CFsmEvent* event)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CNetClient::OnGameSetup(CNetClient* client, CFsmEvent* event)
|
||||
bool CNetClient::OnGameSetup(CNetClient* client, CFsmEvent<CNetMessage*>* event)
|
||||
{
|
||||
ENSURE(event->GetType() == (uint)NMT_GAME_SETUP);
|
||||
|
||||
@@ -783,7 +783,7 @@ bool CNetClient::OnGameSetup(CNetClient* client, CFsmEvent* event)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CNetClient::OnPlayerAssignment(CNetClient* client, CFsmEvent* event)
|
||||
bool CNetClient::OnPlayerAssignment(CNetClient* client, CFsmEvent<CNetMessage*>* event)
|
||||
{
|
||||
ENSURE(event->GetType() == (uint)NMT_PLAYER_ASSIGNMENT);
|
||||
|
||||
@@ -810,7 +810,7 @@ bool CNetClient::OnPlayerAssignment(CNetClient* client, CFsmEvent* event)
|
||||
|
||||
// This is called either when the host clicks the StartGame button or
|
||||
// if this client rejoins and finishes the download of the simstate.
|
||||
bool CNetClient::OnGameStart(CNetClient* client, CFsmEvent* event)
|
||||
bool CNetClient::OnGameStart(CNetClient* client, CFsmEvent<CNetMessage*>* event)
|
||||
{
|
||||
ENSURE(event->GetType() == (uint)NMT_GAME_START);
|
||||
|
||||
@@ -826,7 +826,7 @@ bool CNetClient::OnGameStart(CNetClient* client, CFsmEvent* event)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CNetClient::OnSavedGameStart(CNetClient* client, CFsmEvent* event)
|
||||
bool CNetClient::OnSavedGameStart(CNetClient* client, CFsmEvent<CNetMessage*>* event)
|
||||
{
|
||||
ENSURE(event->GetType() == static_cast<uint>(NMT_SAVED_GAME_START));
|
||||
CGameSavedStartMessage* message{static_cast<CGameSavedStartMessage*>(event->GetParamRef())};
|
||||
@@ -850,7 +850,7 @@ bool CNetClient::OnSavedGameStart(CNetClient* client, CFsmEvent* event)
|
||||
}
|
||||
|
||||
|
||||
bool CNetClient::OnJoinSyncStart(CNetClient* client, CFsmEvent* event)
|
||||
bool CNetClient::OnJoinSyncStart(CNetClient* client, CFsmEvent<CNetMessage*>* event)
|
||||
{
|
||||
ENSURE(event->GetType() == (uint)NMT_JOIN_SYNC_START);
|
||||
|
||||
@@ -875,7 +875,7 @@ bool CNetClient::OnJoinSyncStart(CNetClient* client, CFsmEvent* event)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CNetClient::OnJoinSyncEndCommandBatch(CNetClient* client, CFsmEvent* event)
|
||||
bool CNetClient::OnJoinSyncEndCommandBatch(CNetClient* client, CFsmEvent<CNetMessage*>* event)
|
||||
{
|
||||
ENSURE(event->GetType() == (uint)NMT_END_COMMAND_BATCH);
|
||||
|
||||
@@ -889,7 +889,7 @@ bool CNetClient::OnJoinSyncEndCommandBatch(CNetClient* client, CFsmEvent* event)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CNetClient::OnRejoined(CNetClient* client, CFsmEvent* event)
|
||||
bool CNetClient::OnRejoined(CNetClient* client, CFsmEvent<CNetMessage*>* event)
|
||||
{
|
||||
ENSURE(event->GetType() == (uint)NMT_REJOINED);
|
||||
|
||||
@@ -902,7 +902,7 @@ bool CNetClient::OnRejoined(CNetClient* client, CFsmEvent* event)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CNetClient::OnKicked(CNetClient* client, CFsmEvent* event)
|
||||
bool CNetClient::OnKicked(CNetClient* client, CFsmEvent<CNetMessage*>* event)
|
||||
{
|
||||
ENSURE(event->GetType() == (uint)NMT_KICKED);
|
||||
|
||||
@@ -916,7 +916,7 @@ bool CNetClient::OnKicked(CNetClient* client, CFsmEvent* event)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CNetClient::OnClientTimeout(CNetClient* client, CFsmEvent* event)
|
||||
bool CNetClient::OnClientTimeout(CNetClient* client, CFsmEvent<CNetMessage*>* event)
|
||||
{
|
||||
// Report the timeout of some other client
|
||||
|
||||
@@ -933,7 +933,7 @@ bool CNetClient::OnClientTimeout(CNetClient* client, CFsmEvent* event)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CNetClient::OnClientPerformance(CNetClient* client, CFsmEvent* event)
|
||||
bool CNetClient::OnClientPerformance(CNetClient* client, CFsmEvent<CNetMessage*>* event)
|
||||
{
|
||||
// Performance statistics for one or multiple clients
|
||||
|
||||
@@ -957,7 +957,7 @@ bool CNetClient::OnClientPerformance(CNetClient* client, CFsmEvent* event)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CNetClient::OnClientsLoading(CNetClient* client, CFsmEvent *event)
|
||||
bool CNetClient::OnClientsLoading(CNetClient* client, CFsmEvent<CNetMessage*> *event)
|
||||
{
|
||||
ENSURE(event->GetType() == (uint)NMT_CLIENTS_LOADING);
|
||||
|
||||
@@ -974,7 +974,7 @@ bool CNetClient::OnClientsLoading(CNetClient* client, CFsmEvent *event)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CNetClient::OnClientPaused(CNetClient* client, CFsmEvent *event)
|
||||
bool CNetClient::OnClientPaused(CNetClient* client, CFsmEvent<CNetMessage*> *event)
|
||||
{
|
||||
ENSURE(event->GetType() == (uint)NMT_CLIENT_PAUSED);
|
||||
|
||||
@@ -988,7 +988,7 @@ bool CNetClient::OnClientPaused(CNetClient* client, CFsmEvent *event)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CNetClient::OnLoadedGame(CNetClient* client, CFsmEvent* event)
|
||||
bool CNetClient::OnLoadedGame(CNetClient* client, CFsmEvent<CNetMessage*>* event)
|
||||
{
|
||||
ENSURE(event->GetType() == (uint)NMT_LOADED_GAME);
|
||||
|
||||
@@ -1007,7 +1007,7 @@ bool CNetClient::OnLoadedGame(CNetClient* client, CFsmEvent* event)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CNetClient::OnInGame(CNetClient* client, CFsmEvent* event)
|
||||
bool CNetClient::OnInGame(CNetClient* client, CFsmEvent<CNetMessage*>* event)
|
||||
{
|
||||
// TODO: should split each of these cases into a separate method
|
||||
|
||||
@@ -1035,7 +1035,7 @@ bool CNetClient::OnInGame(CNetClient* client, CFsmEvent* event)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CNetClient::OnFlare(CNetClient* client, CFsmEvent* event)
|
||||
bool CNetClient::OnFlare(CNetClient* client, CFsmEvent<CNetMessage*>* event)
|
||||
{
|
||||
ENSURE(event->GetType() == static_cast<uint>(NMT_FLARE));
|
||||
|
||||
|
||||
+23
-23
@@ -59,7 +59,7 @@ enum
|
||||
* It provides an interface between the GUI, the network (via CNetClientSession),
|
||||
* and the game (via CGame and CNetClientTurnManager).
|
||||
*/
|
||||
class CNetClient : public CFsm<CNetClient>
|
||||
class CNetClient : public CFsm<CNetClient, CNetMessage*>
|
||||
{
|
||||
NONCOPYABLE(CNetClient);
|
||||
|
||||
@@ -281,28 +281,28 @@ private:
|
||||
void SendAuthenticateMessage();
|
||||
|
||||
// Net message / FSM transition handlers
|
||||
static bool OnConnect(CNetClient* client, CFsmEvent* event);
|
||||
static bool OnHandshake(CNetClient* client, CFsmEvent* event);
|
||||
static bool OnHandshakeResponse(CNetClient* client, CFsmEvent* event);
|
||||
static bool OnAuthenticateRequest(CNetClient* client, CFsmEvent* event);
|
||||
static bool OnAuthenticate(CNetClient* client, CFsmEvent* event);
|
||||
static bool OnChat(CNetClient* client, CFsmEvent* event);
|
||||
static bool OnReady(CNetClient* client, CFsmEvent* event);
|
||||
static bool OnGameSetup(CNetClient* client, CFsmEvent* event);
|
||||
static bool OnPlayerAssignment(CNetClient* client, CFsmEvent* event);
|
||||
static bool OnInGame(CNetClient* client, CFsmEvent* event);
|
||||
static bool OnGameStart(CNetClient* client, CFsmEvent* event);
|
||||
static bool OnSavedGameStart(CNetClient* client, CFsmEvent* event);
|
||||
static bool OnJoinSyncStart(CNetClient* client, CFsmEvent* event);
|
||||
static bool OnJoinSyncEndCommandBatch(CNetClient* client, CFsmEvent* event);
|
||||
static bool OnFlare(CNetClient* client, CFsmEvent* event);
|
||||
static bool OnRejoined(CNetClient* client, CFsmEvent* event);
|
||||
static bool OnKicked(CNetClient* client, CFsmEvent* event);
|
||||
static bool OnClientTimeout(CNetClient* client, CFsmEvent* event);
|
||||
static bool OnClientPerformance(CNetClient* client, CFsmEvent* event);
|
||||
static bool OnClientsLoading(CNetClient* client, CFsmEvent* event);
|
||||
static bool OnClientPaused(CNetClient* client, CFsmEvent* event);
|
||||
static bool OnLoadedGame(CNetClient* client, CFsmEvent* event);
|
||||
static bool OnConnect(CNetClient* client, CFsmEvent<CNetMessage*>* event);
|
||||
static bool OnHandshake(CNetClient* client, CFsmEvent<CNetMessage*>* event);
|
||||
static bool OnHandshakeResponse(CNetClient* client, CFsmEvent<CNetMessage*>* event);
|
||||
static bool OnAuthenticateRequest(CNetClient* client, CFsmEvent<CNetMessage*>* event);
|
||||
static bool OnAuthenticate(CNetClient* client, CFsmEvent<CNetMessage*>* event);
|
||||
static bool OnChat(CNetClient* client, CFsmEvent<CNetMessage*>* event);
|
||||
static bool OnReady(CNetClient* client, CFsmEvent<CNetMessage*>* event);
|
||||
static bool OnGameSetup(CNetClient* client, CFsmEvent<CNetMessage*>* event);
|
||||
static bool OnPlayerAssignment(CNetClient* client, CFsmEvent<CNetMessage*>* event);
|
||||
static bool OnInGame(CNetClient* client, CFsmEvent<CNetMessage*>* event);
|
||||
static bool OnGameStart(CNetClient* client, CFsmEvent<CNetMessage*>* event);
|
||||
static bool OnSavedGameStart(CNetClient* client, CFsmEvent<CNetMessage*>* event);
|
||||
static bool OnJoinSyncStart(CNetClient* client, CFsmEvent<CNetMessage*>* event);
|
||||
static bool OnJoinSyncEndCommandBatch(CNetClient* client, CFsmEvent<CNetMessage*>* event);
|
||||
static bool OnFlare(CNetClient* client, CFsmEvent<CNetMessage*>* event);
|
||||
static bool OnRejoined(CNetClient* client, CFsmEvent<CNetMessage*>* event);
|
||||
static bool OnKicked(CNetClient* client, CFsmEvent<CNetMessage*>* event);
|
||||
static bool OnClientTimeout(CNetClient* client, CFsmEvent<CNetMessage*>* event);
|
||||
static bool OnClientPerformance(CNetClient* client, CFsmEvent<CNetMessage*>* event);
|
||||
static bool OnClientsLoading(CNetClient* client, CFsmEvent<CNetMessage*>* event);
|
||||
static bool OnClientPaused(CNetClient* client, CFsmEvent<CNetMessage*>* event);
|
||||
static bool OnLoadedGame(CNetClient* client, CFsmEvent<CNetMessage*>* event);
|
||||
|
||||
/**
|
||||
* Take ownership of a session object, and use it for all network communication.
|
||||
|
||||
@@ -628,7 +628,7 @@ void CNetServerWorker::CheckClientConnections()
|
||||
}
|
||||
}
|
||||
|
||||
void CNetServerWorker::HandleMessageReceive(const CNetMessage* message, CNetServerSession* session)
|
||||
void CNetServerWorker::HandleMessageReceive(CNetMessage* message, CNetServerSession* session)
|
||||
{
|
||||
// Handle non-FSM messages first
|
||||
Status status = session->GetFileTransferer().HandleMessageReceive(*message);
|
||||
@@ -652,7 +652,7 @@ void CNetServerWorker::HandleMessageReceive(const CNetMessage* message, CNetServ
|
||||
}
|
||||
|
||||
// Update FSM
|
||||
if (!session->Update(message->GetType(), (void*)message))
|
||||
if (!session->Update(message->GetType(), message))
|
||||
LOGERROR("Net server: Error running FSM update (type=%d state=%d)", (int)message->GetType(), (int)session->GetCurrState());
|
||||
}
|
||||
|
||||
@@ -904,7 +904,7 @@ void CNetServerWorker::ProcessLobbyAuth(const CStr& name, const CStr& token)
|
||||
(*it)->SendMessage(&emptyMessage);
|
||||
}
|
||||
|
||||
bool CNetServerWorker::OnClientHandshake(CNetServerSession* session, CFsmEvent* event)
|
||||
bool CNetServerWorker::OnClientHandshake(CNetServerSession* session, CFsmEvent<CNetMessage*>* event)
|
||||
{
|
||||
ENSURE(event->GetType() == (uint)NMT_CLIENT_HANDSHAKE);
|
||||
|
||||
@@ -957,7 +957,7 @@ bool CNetServerWorker::OnClientHandshake(CNetServerSession* session, CFsmEvent*
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CNetServerWorker::OnAuthenticate(CNetServerSession* session, CFsmEvent* event)
|
||||
bool CNetServerWorker::OnAuthenticate(CNetServerSession* session, CFsmEvent<CNetMessage*>* event)
|
||||
{
|
||||
ENSURE(event->GetType() == (uint)NMT_AUTHENTICATE);
|
||||
|
||||
@@ -1177,7 +1177,7 @@ bool CNetServerWorker::OnAuthenticate(CNetServerSession* session, CFsmEvent* eve
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CNetServerWorker::OnSimulationCommand(CNetServerSession* session, CFsmEvent* event)
|
||||
bool CNetServerWorker::OnSimulationCommand(CNetServerSession* session, CFsmEvent<CNetMessage*>* event)
|
||||
{
|
||||
ENSURE(event->GetType() == (uint)NMT_SIMULATION_COMMAND);
|
||||
|
||||
@@ -1214,7 +1214,7 @@ bool CNetServerWorker::OnSimulationCommand(CNetServerSession* session, CFsmEvent
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CNetServerWorker::OnFlare(CNetServerSession* session, CFsmEvent* event)
|
||||
bool CNetServerWorker::OnFlare(CNetServerSession* session, CFsmEvent<CNetMessage*>* event)
|
||||
{
|
||||
ENSURE(event->GetType() == (uint)NMT_FLARE);
|
||||
|
||||
@@ -1226,7 +1226,7 @@ bool CNetServerWorker::OnFlare(CNetServerSession* session, CFsmEvent* event)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CNetServerWorker::OnSyncCheck(CNetServerSession* session, CFsmEvent* event)
|
||||
bool CNetServerWorker::OnSyncCheck(CNetServerSession* session, CFsmEvent<CNetMessage*>* event)
|
||||
{
|
||||
ENSURE(event->GetType() == (uint)NMT_SYNC_CHECK);
|
||||
|
||||
@@ -1238,7 +1238,7 @@ bool CNetServerWorker::OnSyncCheck(CNetServerSession* session, CFsmEvent* event)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CNetServerWorker::OnEndCommandBatch(CNetServerSession* session, CFsmEvent* event)
|
||||
bool CNetServerWorker::OnEndCommandBatch(CNetServerSession* session, CFsmEvent<CNetMessage*>* event)
|
||||
{
|
||||
ENSURE(event->GetType() == (uint)NMT_END_COMMAND_BATCH);
|
||||
|
||||
@@ -1251,7 +1251,7 @@ bool CNetServerWorker::OnEndCommandBatch(CNetServerSession* session, CFsmEvent*
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CNetServerWorker::OnChat(CNetServerSession* session, CFsmEvent* event)
|
||||
bool CNetServerWorker::OnChat(CNetServerSession* session, CFsmEvent<CNetMessage*>* event)
|
||||
{
|
||||
ENSURE(event->GetType() == (uint)NMT_CHAT);
|
||||
|
||||
@@ -1277,7 +1277,7 @@ bool CNetServerWorker::OnChat(CNetServerSession* session, CFsmEvent* event)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CNetServerWorker::OnReady(CNetServerSession* session, CFsmEvent* event)
|
||||
bool CNetServerWorker::OnReady(CNetServerSession* session, CFsmEvent<CNetMessage*>* event)
|
||||
{
|
||||
ENSURE(event->GetType() == (uint)NMT_READY);
|
||||
|
||||
@@ -1297,7 +1297,7 @@ bool CNetServerWorker::OnReady(CNetServerSession* session, CFsmEvent* event)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CNetServerWorker::OnClearAllReady(CNetServerSession* session, CFsmEvent* event)
|
||||
bool CNetServerWorker::OnClearAllReady(CNetServerSession* session, CFsmEvent<CNetMessage*>* event)
|
||||
{
|
||||
ENSURE(event->GetType() == (uint)NMT_CLEAR_ALL_READY);
|
||||
|
||||
@@ -1309,7 +1309,7 @@ bool CNetServerWorker::OnClearAllReady(CNetServerSession* session, CFsmEvent* ev
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CNetServerWorker::OnGameSetup(CNetServerSession* session, CFsmEvent* event)
|
||||
bool CNetServerWorker::OnGameSetup(CNetServerSession* session, CFsmEvent<CNetMessage*>* event)
|
||||
{
|
||||
ENSURE(event->GetType() == (uint)NMT_GAME_SETUP);
|
||||
|
||||
@@ -1332,7 +1332,7 @@ bool CNetServerWorker::OnGameSetup(CNetServerSession* session, CFsmEvent* event)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CNetServerWorker::OnAssignPlayer(CNetServerSession* session, CFsmEvent* event)
|
||||
bool CNetServerWorker::OnAssignPlayer(CNetServerSession* session, CFsmEvent<CNetMessage*>* event)
|
||||
{
|
||||
ENSURE(event->GetType() == (uint)NMT_ASSIGN_PLAYER);
|
||||
CNetServerWorker& server = session->GetServer();
|
||||
@@ -1345,7 +1345,7 @@ bool CNetServerWorker::OnAssignPlayer(CNetServerSession* session, CFsmEvent* eve
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CNetServerWorker::OnGameStart(CNetServerSession* session, CFsmEvent* event)
|
||||
bool CNetServerWorker::OnGameStart(CNetServerSession* session, CFsmEvent<CNetMessage*>* event)
|
||||
{
|
||||
ENSURE(event->GetType() == (uint)NMT_GAME_START);
|
||||
CNetServerWorker& server = session->GetServer();
|
||||
@@ -1358,7 +1358,7 @@ bool CNetServerWorker::OnGameStart(CNetServerSession* session, CFsmEvent* event)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CNetServerWorker::OnSavedGameStart(CNetServerSession* session, CFsmEvent* event)
|
||||
bool CNetServerWorker::OnSavedGameStart(CNetServerSession* session, CFsmEvent<CNetMessage*>* event)
|
||||
{
|
||||
ENSURE(event->GetType() == static_cast<uint>(NMT_SAVED_GAME_START));
|
||||
CNetServerWorker& server{session->GetServer()};
|
||||
@@ -1377,7 +1377,7 @@ bool CNetServerWorker::OnSavedGameStart(CNetServerSession* session, CFsmEvent* e
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CNetServerWorker::OnLoadedGame(CNetServerSession* loadedSession, CFsmEvent* event)
|
||||
bool CNetServerWorker::OnLoadedGame(CNetServerSession* loadedSession, CFsmEvent<CNetMessage*>* event)
|
||||
{
|
||||
ENSURE(event->GetType() == (uint)NMT_LOADED_GAME);
|
||||
|
||||
@@ -1411,7 +1411,7 @@ bool CNetServerWorker::OnLoadedGame(CNetServerSession* loadedSession, CFsmEvent*
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CNetServerWorker::OnJoinSyncingLoadedGame(CNetServerSession* session, CFsmEvent* event)
|
||||
bool CNetServerWorker::OnJoinSyncingLoadedGame(CNetServerSession* session, CFsmEvent<CNetMessage*>* event)
|
||||
{
|
||||
// A client rejoining an in-progress game has now finished loading the
|
||||
// map and deserialized the initial state.
|
||||
@@ -1463,7 +1463,7 @@ bool CNetServerWorker::OnJoinSyncingLoadedGame(CNetServerSession* session, CFsmE
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CNetServerWorker::OnRejoined(CNetServerSession* session, CFsmEvent* event)
|
||||
bool CNetServerWorker::OnRejoined(CNetServerSession* session, CFsmEvent<CNetMessage*>* event)
|
||||
{
|
||||
// A client has finished rejoining and the loading screen disappeared.
|
||||
ENSURE(event->GetType() == (uint)NMT_REJOINED);
|
||||
@@ -1487,7 +1487,7 @@ bool CNetServerWorker::OnRejoined(CNetServerSession* session, CFsmEvent* event)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CNetServerWorker::OnKickPlayer(CNetServerSession* session, CFsmEvent* event)
|
||||
bool CNetServerWorker::OnKickPlayer(CNetServerSession* session, CFsmEvent<CNetMessage*>* event)
|
||||
{
|
||||
ENSURE(event->GetType() == (uint)NMT_KICKED);
|
||||
|
||||
@@ -1501,7 +1501,7 @@ bool CNetServerWorker::OnKickPlayer(CNetServerSession* session, CFsmEvent* event
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CNetServerWorker::OnDisconnect(CNetServerSession* session, CFsmEvent* event)
|
||||
bool CNetServerWorker::OnDisconnect(CNetServerSession* session, CFsmEvent<CNetMessage*>* event)
|
||||
{
|
||||
ENSURE(event->GetType() == (uint)NMT_CONNECTION_LOST);
|
||||
|
||||
@@ -1512,7 +1512,7 @@ bool CNetServerWorker::OnDisconnect(CNetServerSession* session, CFsmEvent* event
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CNetServerWorker::OnClientPaused(CNetServerSession* session, CFsmEvent* event)
|
||||
bool CNetServerWorker::OnClientPaused(CNetServerSession* session, CFsmEvent<CNetMessage*>* event)
|
||||
{
|
||||
ENSURE(event->GetType() == (uint)NMT_CLIENT_PAUSED);
|
||||
|
||||
|
||||
+21
-21
@@ -35,7 +35,7 @@
|
||||
|
||||
class CNetServerSession;
|
||||
class CNetServerTurnManager;
|
||||
class CFsmEvent;
|
||||
template <typename MessageType> class CFsmEvent;
|
||||
class CPlayerAssignmentMessage;
|
||||
class CNetStatsTable;
|
||||
class CSimulationMessage;
|
||||
@@ -298,25 +298,25 @@ private:
|
||||
void OnUserJoin(CNetServerSession* session);
|
||||
void OnUserLeave(CNetServerSession* session);
|
||||
|
||||
static bool OnClientHandshake(CNetServerSession* session, CFsmEvent* event);
|
||||
static bool OnAuthenticate(CNetServerSession* session, CFsmEvent* event);
|
||||
static bool OnSimulationCommand(CNetServerSession* session, CFsmEvent* event);
|
||||
static bool OnFlare(CNetServerSession* session, CFsmEvent* event);
|
||||
static bool OnSyncCheck(CNetServerSession* session, CFsmEvent* event);
|
||||
static bool OnEndCommandBatch(CNetServerSession* session, CFsmEvent* event);
|
||||
static bool OnChat(CNetServerSession* session, CFsmEvent* event);
|
||||
static bool OnReady(CNetServerSession* session, CFsmEvent* event);
|
||||
static bool OnClearAllReady(CNetServerSession* session, CFsmEvent* event);
|
||||
static bool OnGameSetup(CNetServerSession* session, CFsmEvent* event);
|
||||
static bool OnAssignPlayer(CNetServerSession* session, CFsmEvent* event);
|
||||
static bool OnGameStart(CNetServerSession* session, CFsmEvent* event);
|
||||
static bool OnSavedGameStart(CNetServerSession* session, CFsmEvent* event);
|
||||
static bool OnLoadedGame(CNetServerSession* session, CFsmEvent* event);
|
||||
static bool OnJoinSyncingLoadedGame(CNetServerSession* session, CFsmEvent* event);
|
||||
static bool OnRejoined(CNetServerSession* session, CFsmEvent* event);
|
||||
static bool OnKickPlayer(CNetServerSession* session, CFsmEvent* event);
|
||||
static bool OnDisconnect(CNetServerSession* session, CFsmEvent* event);
|
||||
static bool OnClientPaused(CNetServerSession* session, CFsmEvent* event);
|
||||
static bool OnClientHandshake(CNetServerSession* session, CFsmEvent<CNetMessage*>* event);
|
||||
static bool OnAuthenticate(CNetServerSession* session, CFsmEvent<CNetMessage*>* event);
|
||||
static bool OnSimulationCommand(CNetServerSession* session, CFsmEvent<CNetMessage*>* event);
|
||||
static bool OnFlare(CNetServerSession* session, CFsmEvent<CNetMessage*>* event);
|
||||
static bool OnSyncCheck(CNetServerSession* session, CFsmEvent<CNetMessage*>* event);
|
||||
static bool OnEndCommandBatch(CNetServerSession* session, CFsmEvent<CNetMessage*>* event);
|
||||
static bool OnChat(CNetServerSession* session, CFsmEvent<CNetMessage*>* event);
|
||||
static bool OnReady(CNetServerSession* session, CFsmEvent<CNetMessage*>* event);
|
||||
static bool OnClearAllReady(CNetServerSession* session, CFsmEvent<CNetMessage*>* event);
|
||||
static bool OnGameSetup(CNetServerSession* session, CFsmEvent<CNetMessage*>* event);
|
||||
static bool OnAssignPlayer(CNetServerSession* session, CFsmEvent<CNetMessage*>* event);
|
||||
static bool OnGameStart(CNetServerSession* session, CFsmEvent<CNetMessage*>* event);
|
||||
static bool OnSavedGameStart(CNetServerSession* session, CFsmEvent<CNetMessage*>* event);
|
||||
static bool OnLoadedGame(CNetServerSession* session, CFsmEvent<CNetMessage*>* event);
|
||||
static bool OnJoinSyncingLoadedGame(CNetServerSession* session, CFsmEvent<CNetMessage*>* event);
|
||||
static bool OnRejoined(CNetServerSession* session, CFsmEvent<CNetMessage*>* event);
|
||||
static bool OnKickPlayer(CNetServerSession* session, CFsmEvent<CNetMessage*>* event);
|
||||
static bool OnDisconnect(CNetServerSession* session, CFsmEvent<CNetMessage*>* event);
|
||||
static bool OnClientPaused(CNetServerSession* session, CFsmEvent<CNetMessage*>* event);
|
||||
|
||||
/**
|
||||
* Checks if all clients have finished loading.
|
||||
@@ -328,7 +328,7 @@ private:
|
||||
|
||||
void ConstructPlayerAssignmentMessage(CPlayerAssignmentMessage& message);
|
||||
|
||||
void HandleMessageReceive(const CNetMessage* message, CNetServerSession* session);
|
||||
void HandleMessageReceive(CNetMessage* message, CNetServerSession* session);
|
||||
|
||||
/**
|
||||
* Send a network warning if the connection to a client is being lost or has bad latency.
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 2024 Wildfire Games.
|
||||
/* Copyright (C) 2025 Wildfire Games.
|
||||
* This file is part of 0 A.D.
|
||||
*
|
||||
* 0 A.D. is free software: you can redistribute it and/or modify
|
||||
@@ -154,7 +154,7 @@ private:
|
||||
* Thread-safety:
|
||||
* - This is constructed and used by CNetServerWorker in the network server thread.
|
||||
*/
|
||||
class CNetServerSession : public CFsm<CNetServerSession>, public INetSession
|
||||
class CNetServerSession : public CFsm<CNetServerSession, CNetMessage*>, public INetSession
|
||||
{
|
||||
NONCOPYABLE(CNetServerSession);
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 2024 Wildfire Games.
|
||||
/* Copyright (C) 2025 Wildfire Games.
|
||||
* This file is part of 0 A.D.
|
||||
*
|
||||
* 0 A.D. is free software: you can redistribute it and/or modify
|
||||
@@ -20,6 +20,7 @@
|
||||
#include "network/FSM.h"
|
||||
|
||||
#include <array>
|
||||
#include <variant>
|
||||
|
||||
class TestFSM : public CxxTest::TestSuite
|
||||
{
|
||||
@@ -29,15 +30,15 @@ class TestFSM : public CxxTest::TestSuite
|
||||
};
|
||||
|
||||
template<size_t N>
|
||||
static bool IncrementGlobal(FSMGlobalState* state, CFsmEvent*)
|
||||
static bool IncrementGlobal(FSMGlobalState* state, CFsmEvent<std::monostate>*)
|
||||
{
|
||||
++std::get<N>(state->occurCount);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool IncrementParam(FSMGlobalState*, CFsmEvent* event)
|
||||
static bool IncrementParam(FSMGlobalState*, CFsmEvent<std::size_t&>* event)
|
||||
{
|
||||
++*reinterpret_cast<size_t*>(event->GetParamRef());
|
||||
++event->GetParamRef();
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -60,7 +61,7 @@ public:
|
||||
void test_global()
|
||||
{
|
||||
FSMGlobalState globalState;
|
||||
CFsm<FSMGlobalState> FSMObject;
|
||||
CFsm<FSMGlobalState, std::monostate> FSMObject;
|
||||
|
||||
/*
|
||||
Corresponding pseudocode
|
||||
@@ -96,27 +97,27 @@ public:
|
||||
|
||||
FSMObject.SetFirstState(static_cast<unsigned int>(State::ZERO));
|
||||
|
||||
TS_ASSERT(FSMObject.Update(static_cast<unsigned int>(Instruction::TO_ONE), nullptr));
|
||||
TS_ASSERT(FSMObject.Update(static_cast<unsigned int>(Instruction::TO_ONE), {}));
|
||||
TS_ASSERT_EQUALS(std::get<1>(globalState.occurCount), 1);
|
||||
TS_ASSERT_EQUALS(FSMObject.GetCurrState(), static_cast<unsigned int>(State::ONE));
|
||||
|
||||
TS_ASSERT(FSMObject.Update(static_cast<unsigned int>(Instruction::TO_TWO), nullptr));
|
||||
TS_ASSERT(FSMObject.Update(static_cast<unsigned int>(Instruction::TO_ZERO), nullptr));
|
||||
TS_ASSERT(FSMObject.Update(static_cast<unsigned int>(Instruction::TO_ONE), nullptr));
|
||||
TS_ASSERT(FSMObject.Update(static_cast<unsigned int>(Instruction::TO_ZERO), nullptr));
|
||||
TS_ASSERT(FSMObject.Update(static_cast<unsigned int>(Instruction::TO_ONE), nullptr));
|
||||
TS_ASSERT(FSMObject.Update(static_cast<unsigned int>(Instruction::TO_ZERO), nullptr));
|
||||
TS_ASSERT(FSMObject.Update(static_cast<unsigned int>(Instruction::TO_TWO), {}));
|
||||
TS_ASSERT(FSMObject.Update(static_cast<unsigned int>(Instruction::TO_ZERO), {}));
|
||||
TS_ASSERT(FSMObject.Update(static_cast<unsigned int>(Instruction::TO_ONE), {}));
|
||||
TS_ASSERT(FSMObject.Update(static_cast<unsigned int>(Instruction::TO_ZERO), {}));
|
||||
TS_ASSERT(FSMObject.Update(static_cast<unsigned int>(Instruction::TO_ONE), {}));
|
||||
TS_ASSERT(FSMObject.Update(static_cast<unsigned int>(Instruction::TO_ZERO), {}));
|
||||
TS_ASSERT_EQUALS(std::get<0>(globalState.occurCount), 3);
|
||||
TS_ASSERT_EQUALS(std::get<1>(globalState.occurCount), 3);
|
||||
TS_ASSERT_EQUALS(std::get<2>(globalState.occurCount), 1);
|
||||
|
||||
// Some transitions do not exist.
|
||||
TS_ASSERT(!FSMObject.Update(static_cast<unsigned int>(Instruction::TO_ZERO), nullptr));
|
||||
TS_ASSERT(!FSMObject.Update(static_cast<unsigned int>(Instruction::TO_TWO), nullptr));
|
||||
TS_ASSERT(FSMObject.Update(static_cast<unsigned int>(Instruction::TO_ONE), nullptr));
|
||||
TS_ASSERT(!FSMObject.Update(static_cast<unsigned int>(Instruction::TO_ONE), nullptr));
|
||||
TS_ASSERT(FSMObject.Update(static_cast<unsigned int>(Instruction::TO_TWO), nullptr));
|
||||
TS_ASSERT(!FSMObject.Update(static_cast<unsigned int>(Instruction::TO_TWO), nullptr));
|
||||
TS_ASSERT(!FSMObject.Update(static_cast<unsigned int>(Instruction::TO_ZERO), {}));
|
||||
TS_ASSERT(!FSMObject.Update(static_cast<unsigned int>(Instruction::TO_TWO), {}));
|
||||
TS_ASSERT(FSMObject.Update(static_cast<unsigned int>(Instruction::TO_ONE), {}));
|
||||
TS_ASSERT(!FSMObject.Update(static_cast<unsigned int>(Instruction::TO_ONE), {}));
|
||||
TS_ASSERT(FSMObject.Update(static_cast<unsigned int>(Instruction::TO_TWO), {}));
|
||||
TS_ASSERT(!FSMObject.Update(static_cast<unsigned int>(Instruction::TO_TWO), {}));
|
||||
TS_ASSERT_EQUALS(std::get<0>(globalState.occurCount), 3);
|
||||
TS_ASSERT_EQUALS(std::get<1>(globalState.occurCount), 4);
|
||||
TS_ASSERT_EQUALS(std::get<2>(globalState.occurCount), 2);
|
||||
@@ -125,7 +126,7 @@ public:
|
||||
void test_param()
|
||||
{
|
||||
FSMGlobalState globalState;
|
||||
CFsm<FSMGlobalState> FSMObject;
|
||||
CFsm<FSMGlobalState, std::size_t&> FSMObject;
|
||||
|
||||
// Equal to the FSM in test_global.
|
||||
FSMObject.AddTransition(static_cast<unsigned int>(State::ZERO),
|
||||
@@ -145,17 +146,17 @@ public:
|
||||
|
||||
// Some transitions do not exist.
|
||||
TS_ASSERT(!FSMObject.Update(static_cast<unsigned int>(Instruction::TO_ZERO),
|
||||
static_cast<void*>(&std::get<0>(globalState.occurCount))));
|
||||
std::get<0>(globalState.occurCount)));
|
||||
TS_ASSERT(!FSMObject.Update(static_cast<unsigned int>(Instruction::TO_TWO),
|
||||
static_cast<void*>(&std::get<2>(globalState.occurCount))));
|
||||
std::get<2>(globalState.occurCount)));
|
||||
TS_ASSERT(FSMObject.Update(static_cast<unsigned int>(Instruction::TO_ONE),
|
||||
static_cast<void*>(&std::get<1>(globalState.occurCount))));
|
||||
std::get<1>(globalState.occurCount)));
|
||||
TS_ASSERT(!FSMObject.Update(static_cast<unsigned int>(Instruction::TO_ONE),
|
||||
static_cast<void*>(&std::get<1>(globalState.occurCount))));
|
||||
std::get<1>(globalState.occurCount)));
|
||||
TS_ASSERT(FSMObject.Update(static_cast<unsigned int>(Instruction::TO_TWO),
|
||||
static_cast<void*>(&std::get<2>(globalState.occurCount))));
|
||||
std::get<2>(globalState.occurCount)));
|
||||
TS_ASSERT(!FSMObject.Update(static_cast<unsigned int>(Instruction::TO_TWO),
|
||||
static_cast<void*>(&std::get<2>(globalState.occurCount))));
|
||||
std::get<2>(globalState.occurCount)));
|
||||
TS_ASSERT_EQUALS(std::get<0>(globalState.occurCount), 0);
|
||||
TS_ASSERT_EQUALS(std::get<1>(globalState.occurCount), 1);
|
||||
TS_ASSERT_EQUALS(std::get<2>(globalState.occurCount), 1);
|
||||
|
||||
Reference in New Issue
Block a user