diff --git a/source/network/FSM.h b/source/network/FSM.h index a5041af09e..4947f7b1b8 100644 --- a/source/network/FSM.h +++ b/source/network/FSM.h @@ -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::max( * The CFsmEvent objects are under the control of CFsm so * they are created and deleted via CFsm. */ +template 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 +template class CFsm { - using Action = bool(Context* pContext, CFsmEvent* pEvent); + using Action = bool(Context* pContext, CFsmEvent* pEvent); struct CallbackFunction { Action* pFunction{nullptr}; Context* pContext{nullptr}; - bool operator()(CFsmEvent& event) const + bool operator()(CFsmEvent& 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 event{eventType, eventData}; // Save the default state transition (actions might call SetNextState // to override this) diff --git a/source/network/NetClient.cpp b/source/network/NetClient.cpp index 76acb7ada5..17456d27a9 100644 --- a/source/network/NetClient.cpp +++ b/source/network/NetClient.cpp @@ -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* 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* event) { ENSURE(event->GetType() == (uint)NMT_SERVER_HANDSHAKE); client->m_ServerHandshake = *static_cast(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* 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* 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* 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* 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* 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* 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* 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* 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* event) { ENSURE(event->GetType() == static_cast(NMT_SAVED_GAME_START)); CGameSavedStartMessage* message{static_cast(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* 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* 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* 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* 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* 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* 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 *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 *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* 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* 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* event) { ENSURE(event->GetType() == static_cast(NMT_FLARE)); diff --git a/source/network/NetClient.h b/source/network/NetClient.h index 892af41d04..d6cff24d57 100644 --- a/source/network/NetClient.h +++ b/source/network/NetClient.h @@ -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 +class CNetClient : public CFsm { 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* 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); /** * Take ownership of a session object, and use it for all network communication. diff --git a/source/network/NetServer.cpp b/source/network/NetServer.cpp index fc86d5c3c0..3cd0b6d9d9 100644 --- a/source/network/NetServer.cpp +++ b/source/network/NetServer.cpp @@ -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* 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* 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* 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* 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* 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* 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* 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* 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* 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* 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* 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* 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* event) { ENSURE(event->GetType() == static_cast(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* 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* 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* 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* 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* 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* event) { ENSURE(event->GetType() == (uint)NMT_CLIENT_PAUSED); diff --git a/source/network/NetServer.h b/source/network/NetServer.h index 3aea6df80f..aec562fff6 100644 --- a/source/network/NetServer.h +++ b/source/network/NetServer.h @@ -35,7 +35,7 @@ class CNetServerSession; class CNetServerTurnManager; -class CFsmEvent; +template 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* 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); /** * 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. diff --git a/source/network/NetSession.h b/source/network/NetSession.h index a5ee4c2b33..f4a7687b9f 100644 --- a/source/network/NetSession.h +++ b/source/network/NetSession.h @@ -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, public INetSession +class CNetServerSession : public CFsm, public INetSession { NONCOPYABLE(CNetServerSession); diff --git a/source/network/tests/test_FSM.h b/source/network/tests/test_FSM.h index 043c6e7179..078c7a9bee 100644 --- a/source/network/tests/test_FSM.h +++ b/source/network/tests/test_FSM.h @@ -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 +#include class TestFSM : public CxxTest::TestSuite { @@ -29,15 +30,15 @@ class TestFSM : public CxxTest::TestSuite }; template - static bool IncrementGlobal(FSMGlobalState* state, CFsmEvent*) + static bool IncrementGlobal(FSMGlobalState* state, CFsmEvent*) { ++std::get(state->occurCount); return true; } - static bool IncrementParam(FSMGlobalState*, CFsmEvent* event) + static bool IncrementParam(FSMGlobalState*, CFsmEvent* event) { - ++*reinterpret_cast(event->GetParamRef()); + ++event->GetParamRef(); return true; } @@ -60,7 +61,7 @@ public: void test_global() { FSMGlobalState globalState; - CFsm FSMObject; + CFsm FSMObject; /* Corresponding pseudocode @@ -96,27 +97,27 @@ public: FSMObject.SetFirstState(static_cast(State::ZERO)); - TS_ASSERT(FSMObject.Update(static_cast(Instruction::TO_ONE), nullptr)); + TS_ASSERT(FSMObject.Update(static_cast(Instruction::TO_ONE), {})); TS_ASSERT_EQUALS(std::get<1>(globalState.occurCount), 1); TS_ASSERT_EQUALS(FSMObject.GetCurrState(), static_cast(State::ONE)); - TS_ASSERT(FSMObject.Update(static_cast(Instruction::TO_TWO), nullptr)); - TS_ASSERT(FSMObject.Update(static_cast(Instruction::TO_ZERO), nullptr)); - TS_ASSERT(FSMObject.Update(static_cast(Instruction::TO_ONE), nullptr)); - TS_ASSERT(FSMObject.Update(static_cast(Instruction::TO_ZERO), nullptr)); - TS_ASSERT(FSMObject.Update(static_cast(Instruction::TO_ONE), nullptr)); - TS_ASSERT(FSMObject.Update(static_cast(Instruction::TO_ZERO), nullptr)); + TS_ASSERT(FSMObject.Update(static_cast(Instruction::TO_TWO), {})); + TS_ASSERT(FSMObject.Update(static_cast(Instruction::TO_ZERO), {})); + TS_ASSERT(FSMObject.Update(static_cast(Instruction::TO_ONE), {})); + TS_ASSERT(FSMObject.Update(static_cast(Instruction::TO_ZERO), {})); + TS_ASSERT(FSMObject.Update(static_cast(Instruction::TO_ONE), {})); + TS_ASSERT(FSMObject.Update(static_cast(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(Instruction::TO_ZERO), nullptr)); - TS_ASSERT(!FSMObject.Update(static_cast(Instruction::TO_TWO), nullptr)); - TS_ASSERT(FSMObject.Update(static_cast(Instruction::TO_ONE), nullptr)); - TS_ASSERT(!FSMObject.Update(static_cast(Instruction::TO_ONE), nullptr)); - TS_ASSERT(FSMObject.Update(static_cast(Instruction::TO_TWO), nullptr)); - TS_ASSERT(!FSMObject.Update(static_cast(Instruction::TO_TWO), nullptr)); + TS_ASSERT(!FSMObject.Update(static_cast(Instruction::TO_ZERO), {})); + TS_ASSERT(!FSMObject.Update(static_cast(Instruction::TO_TWO), {})); + TS_ASSERT(FSMObject.Update(static_cast(Instruction::TO_ONE), {})); + TS_ASSERT(!FSMObject.Update(static_cast(Instruction::TO_ONE), {})); + TS_ASSERT(FSMObject.Update(static_cast(Instruction::TO_TWO), {})); + TS_ASSERT(!FSMObject.Update(static_cast(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 FSMObject; + CFsm FSMObject; // Equal to the FSM in test_global. FSMObject.AddTransition(static_cast(State::ZERO), @@ -145,17 +146,17 @@ public: // Some transitions do not exist. TS_ASSERT(!FSMObject.Update(static_cast(Instruction::TO_ZERO), - static_cast(&std::get<0>(globalState.occurCount)))); + std::get<0>(globalState.occurCount))); TS_ASSERT(!FSMObject.Update(static_cast(Instruction::TO_TWO), - static_cast(&std::get<2>(globalState.occurCount)))); + std::get<2>(globalState.occurCount))); TS_ASSERT(FSMObject.Update(static_cast(Instruction::TO_ONE), - static_cast(&std::get<1>(globalState.occurCount)))); + std::get<1>(globalState.occurCount))); TS_ASSERT(!FSMObject.Update(static_cast(Instruction::TO_ONE), - static_cast(&std::get<1>(globalState.occurCount)))); + std::get<1>(globalState.occurCount))); TS_ASSERT(FSMObject.Update(static_cast(Instruction::TO_TWO), - static_cast(&std::get<2>(globalState.occurCount)))); + std::get<2>(globalState.occurCount))); TS_ASSERT(!FSMObject.Update(static_cast(Instruction::TO_TWO), - static_cast(&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);