|
OpenTTD Source 20251116-master-g21329071df
|
Command handling over network connections. More...
#include "../stdafx.h"#include "network_admin.h"#include "network_client.h"#include "network_server.h"#include "../command_func.h"#include "../company_func.h"#include "../settings_type.h"#include "../airport_cmd.h"#include "../aircraft_cmd.h"#include "../autoreplace_cmd.h"#include "../company_cmd.h"#include "../depot_cmd.h"#include "../dock_cmd.h"#include "../economy_cmd.h"#include "../engine_cmd.h"#include "../error_func.h"#include "../goal_cmd.h"#include "../group_cmd.h"#include "../industry_cmd.h"#include "../landscape_cmd.h"#include "../league_cmd.h"#include "../misc_cmd.h"#include "../news_cmd.h"#include "../object_cmd.h"#include "../order_cmd.h"#include "../rail_cmd.h"#include "../road_cmd.h"#include "../roadveh_cmd.h"#include "../settings_cmd.h"#include "../signs_cmd.h"#include "../station_cmd.h"#include "../story_cmd.h"#include "../subsidy_cmd.h"#include "../terraform_cmd.h"#include "../timetable_cmd.h"#include "../town_cmd.h"#include "../train_cmd.h"#include "../tree_cmd.h"#include "../tunnelbridge_cmd.h"#include "../vehicle_cmd.h"#include "../viewport_cmd.h"#include "../water_cmd.h"#include "../waypoint_cmd.h"#include "../script/script_cmd.h"#include "../safeguards.h"Go to the source code of this file.
Data Structures | |
| struct | CallbackArgsHelper< void(*const)(Commands, const CommandCost &, Targs...)> |
| struct | CommandDispatch |
Typedefs | |
| using | UnpackNetworkCommandProc = void(*)(const CommandPacket &) |
| using | UnpackDispatchT = std::array< UnpackNetworkCommandProc, _callback_tuple_size > |
Functions | |
| template<size_t... i> | |
| auto | MakeCallbackTable (std::index_sequence< i... >) noexcept |
| template<Commands Tcmd> | |
| static CommandDataBuffer | SanitizeCmdStrings (const CommandDataBuffer &data) |
| Validate and sanitize strings in command data. | |
| template<Commands Tcmd, size_t cb> | |
| static void | UnpackNetworkCommand (const CommandPacket &cp) |
| Unpack a generic command packet into its actual typed components. | |
| template<Commands Tcmd> | |
| static void | NetworkReplaceCommandClientId (CommandPacket &cp, ClientID client_id) |
| template<Commands Tcmd, size_t Tcb> | |
| constexpr UnpackNetworkCommandProc | MakeUnpackNetworkCommandCallback () noexcept |
| template<Commands Tcmd, size_t... i> | |
| constexpr UnpackDispatchT | MakeUnpackNetworkCommand (std::index_sequence< i... >) noexcept |
| template<typename T , T... i, size_t... j> | |
| constexpr auto | MakeDispatchTable (std::integer_sequence< T, i... >, std::index_sequence< j... >) noexcept |
| static size_t | FindCallbackIndex (CommandCallback *callback) |
| Find the callback index of a callback pointer. | |
| void | NetworkSendCommand (Commands cmd, StringID err_message, CommandCallback *callback, CompanyID company, const CommandDataBuffer &cmd_data) |
| Prepare a DoCommand to be send over the network. | |
| void | NetworkSyncCommandQueue (NetworkClientSocket *cs) |
| Sync our local command queue to the command queue of the given socket. | |
| void | NetworkExecuteLocalCommandQueue () |
| Execute all commands on the local command queue that ought to be executed this frame. | |
| void | NetworkFreeLocalCommandQueue () |
| Free the local command queues. | |
| static void | DistributeCommandPacket (CommandPacket &cp, const NetworkClientSocket *owner) |
| "Send" a particular CommandPacket to all clients. | |
| static void | DistributeQueue (CommandQueue &queue, const NetworkClientSocket *owner) |
| "Send" a particular CommandQueue to all clients. | |
| void | NetworkDistributeCommands () |
| Distribute the commands of ourself and the clients. | |
| template<class T > | |
| static void | SetClientIdHelper (T &data, ClientID client_id) |
| Helper to process a single ClientID argument. | |
| template<class Ttuple , size_t... Tindices> | |
| static void | SetClientIds (Ttuple &values, ClientID client_id, std::index_sequence< Tindices... >) |
| Set all invalid ClientID's to the proper value. | |
| void | NetworkReplaceCommandClientId (CommandPacket &cp, ClientID client_id) |
| Insert a client ID into the command data in a command packet. | |
| template<class T > | |
| static void | SanitizeSingleStringHelper (CommandFlags cmd_flags, T &data) |
| Validate a single string argument coming from network. | |
| template<class Ttuple , size_t... Tindices> | |
| static void | SanitizeStringsHelper (CommandFlags cmd_flags, Ttuple &values, std::index_sequence< Tindices... >) |
| Helper function to perform validation on command data strings. | |
| template<Commands Tcmd> | |
| CommandDataBuffer | SanitizeCmdStrings (const CommandDataBuffer &data) |
| Validate and sanitize strings in command data. | |
| template<Commands Tcmd, size_t Tcb> | |
| void | UnpackNetworkCommand (const CommandPacket &cp) |
| Unpack a generic command packet into its actual typed components. | |
Variables | |
| static constexpr auto | _callback_tuple |
| Typed list of all possible callbacks. | |
| constexpr size_t | _callback_tuple_size = std::tuple_size_v<decltype(_callback_tuple)> |
| static const auto | _callback_table = MakeCallbackTable(std::make_index_sequence<_callback_tuple_size>{}) |
| Type-erased table of callbacks. | |
| static constexpr auto | _cmd_dispatch = MakeDispatchTable(std::make_integer_sequence<std::underlying_type_t<Commands>, CMD_END>{}, std::make_index_sequence<_callback_tuple_size>{}) |
| Command dispatch table. | |
| static CommandQueue | _local_wait_queue |
| Local queue of packets waiting for handling. | |
| static CommandQueue | _local_execution_queue |
| Local queue of packets waiting for execution. | |
Command handling over network connections.
Definition in file network_command.cpp.
| using UnpackDispatchT = std::array<UnpackNetworkCommandProc, _callback_tuple_size> |
Definition at line 127 of file network_command.cpp.
| using UnpackNetworkCommandProc = void (*)(const CommandPacket &) |
Definition at line 126 of file network_command.cpp.
|
static |
"Send" a particular CommandPacket to all clients.
| cp | The command that has to be distributed. |
| owner | The client that owns the command, |
Definition at line 289 of file network_command.cpp.
References _frame_counter_max, _local_execution_queue, CommandPacket::callback, CommandPacket::frame, and CommandPacket::my_cmd.
Referenced by DistributeQueue().
|
static |
"Send" a particular CommandQueue to all clients.
| queue | The queue of commands that has to be distributed. |
| owner | The client that owns the commands, |
Definition at line 314 of file network_command.cpp.
References _pause_mode, _settings_client, BaseBitSet< Timpl, Tvalue_type, Tstorage, Tmask >::Any(), NetworkSettings::commands_per_frame, NetworkSettings::commands_per_frame_server, DistributeCommandPacket(), IsCommandAllowedWhilePaused(), ClientSettings::network, and NetworkAdminCmdLogging().
Referenced by NetworkDistributeCommands().
|
static |
Find the callback index of a callback pointer.
| callback | Address of callback to search for. |
Definition at line 178 of file network_command.cpp.
References _callback_table.
Referenced by NetworkGameSocketHandler::SendCommand().
|
inlinenoexcept |
Definition at line 106 of file network_command.cpp.
|
inlineconstexprnoexcept |
Definition at line 156 of file network_command.cpp.
|
constexprnoexcept |
Definition at line 150 of file network_command.cpp.
|
constexprnoexcept |
Definition at line 135 of file network_command.cpp.
| void NetworkDistributeCommands | ( | ) |
Distribute the commands of ourself and the clients.
Definition at line 345 of file network_command.cpp.
References _local_wait_queue, and DistributeQueue().
| void NetworkExecuteLocalCommandQueue | ( | ) |
Execute all commands on the local command queue that ought to be executed this frame.
Definition at line 244 of file network_command.cpp.
| void NetworkFreeLocalCommandQueue | ( | ) |
Free the local command queues.
Definition at line 278 of file network_command.cpp.
References _local_execution_queue, and _local_wait_queue.
|
static |
Definition at line 415 of file network_command.cpp.
| void NetworkReplaceCommandClientId | ( | CommandPacket & | cp, |
| ClientID | client_id | ||
| ) |
Insert a client ID into the command data in a command packet.
| cp | Command packet to modify. |
| client_id | Client id to insert. |
Definition at line 432 of file network_command.cpp.
References _cmd_dispatch, and CommandPacket::cmd.
Referenced by ServerNetworkGameSocketHandler::Receive_CLIENT_COMMAND().
| void NetworkSendCommand | ( | Commands | cmd, |
| StringID | err_message, | ||
| CommandCallback * | callback, | ||
| CompanyID | company, | ||
| const CommandDataBuffer & | cmd_data | ||
| ) |
Prepare a DoCommand to be send over the network.
| cmd | The command to execute (a CMD_* value) |
| err_message | Message prefix to show on error |
| callback | A callback function to call after the command is finished |
| company | The company that wants to send the command |
| cmd_data | The command proc arguments. |
Definition at line 195 of file network_command.cpp.
References _frame_counter_max, _local_wait_queue, _network_server, CommandPacket::callback, CommandPacket::cmd, CommandPacket::company, CommandPacket::data, CommandPacket::err_msg, CommandPacket::frame, CommandPacket::my_cmd, and ClientNetworkGameSocketHandler::SendCommand().
Referenced by CommandHelper< Tcmd, Tret(*)(DoCommandFlags, Targs...), true >::SendNet().
| void NetworkSyncCommandQueue | ( | NetworkClientSocket * | cs | ) |
Sync our local command queue to the command queue of the given socket.
This is needed for the case where we receive a command before saving the game for a joining client, but without the execution of those commands. Not syncing those commands means that the client will never get them and as such will be in a desynced state from the time it started with joining.
| cs | The client to sync the queue to. |
Definition at line 233 of file network_command.cpp.
References _local_execution_queue, and CommandPacket::callback.
Referenced by ServerNetworkGameSocketHandler::SendMap().
|
static |
Validate and sanitize strings in command data.
| Tcmd | Command this data belongs to. |
| data | Command data. |
Definition at line 465 of file network_command.cpp.
References SanitizeStringsHelper().
| CommandDataBuffer SanitizeCmdStrings | ( | const CommandDataBuffer & | data | ) |
Validate and sanitize strings in command data.
| Tcmd | Command this data belongs to. |
| data | Command data. |
Definition at line 465 of file network_command.cpp.
References SanitizeStringsHelper().
|
inlinestatic |
Validate a single string argument coming from network.
Definition at line 440 of file network_command.cpp.
References _network_server, AllowControlCode, ReplaceWithQuestionMark, StrCtrl, and StrMakeValidInPlace().
Referenced by SanitizeStringsHelper().
|
inlinestatic |
Helper function to perform validation on command data strings.
Definition at line 453 of file network_command.cpp.
References SanitizeSingleStringHelper().
Referenced by SanitizeCmdStrings().
|
inlinestatic |
Helper to process a single ClientID argument.
Definition at line 400 of file network_command.cpp.
Referenced by SetClientIds(), and CommandHelper< Tcmd, Tret(*)(DoCommandFlags, Targs...), true >::SetClientIds().
|
inlinestatic |
Set all invalid ClientID's to the proper value.
Definition at line 409 of file network_command.cpp.
References SetClientIdHelper().
|
static |
Unpack a generic command packet into its actual typed components.
| Tcmd | Command type to be unpacked. |
| Tcb | Index into the callback list. |
| cp | Command packet to unpack. |
Definition at line 479 of file network_command.cpp.
References _callback_tuple, CommandPacket::data, CommandPacket::err_msg, and CommandPacket::my_cmd.
| void UnpackNetworkCommand | ( | const CommandPacket & | cp | ) |
Unpack a generic command packet into its actual typed components.
| Tcmd | Command type to be unpacked. |
| Tcb | Index into the callback list. |
| cp | Command packet to unpack. |
Definition at line 479 of file network_command.cpp.
References _callback_tuple, CommandPacket::data, CommandPacket::err_msg, and CommandPacket::my_cmd.
|
static |
Type-erased table of callbacks.
Definition at line 112 of file network_command.cpp.
Referenced by FindCallbackIndex(), and NetworkGameSocketHandler::ReceiveCommand().
|
staticconstexpr |
Typed list of all possible callbacks.
Definition at line 58 of file network_command.cpp.
Referenced by UnpackNetworkCommand().
|
inlineconstexpr |
Definition at line 103 of file network_command.cpp.
|
staticconstexpr |
Command dispatch table.
Definition at line 161 of file network_command.cpp.
Referenced by NetworkReplaceCommandClientId(), NetworkGameSocketHandler::ReceiveCommand(), and NetworkGameSocketHandler::SendCommand().
|
static |
Local queue of packets waiting for execution.
Definition at line 170 of file network_command.cpp.
Referenced by DistributeCommandPacket(), NetworkFreeLocalCommandQueue(), and NetworkSyncCommandQueue().
|
static |
Local queue of packets waiting for handling.
Definition at line 168 of file network_command.cpp.
Referenced by NetworkDistributeCommands(), NetworkFreeLocalCommandQueue(), and NetworkSendCommand().