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:
phosit
2025-06-26 12:35:01 +02:00
committed by phosit
parent 7f67bab7c8
commit dd26f3a802
7 changed files with 126 additions and 124 deletions
+11 -10
View File
@@ -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)
+22 -22
View File
@@ -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
View File
@@ -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.
+21 -21
View File
@@ -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
View File
@@ -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.
+2 -2
View File
@@ -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);
+26 -25
View File
@@ -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);