OpenTTD Source  20241108-master-g80f628063a
network_command.cpp File Reference

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. More...
 
template<Commands Tcmd, size_t cb>
static void UnpackNetworkCommand (const CommandPacket &cp)
 Unpack a generic command packet into its actual typed components. More...
 
template<Commands Tcmd>
static void NetworkReplaceCommandClientId (CommandPacket &cp, ClientID client_id)
 Insert a client ID into the command data in a command packet. More...
 
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. More...
 
void NetworkSendCommand (Commands cmd, StringID err_message, CommandCallback *callback, CompanyID company, const CommandDataBuffer &cmd_data)
 Prepare a DoCommand to be send over the network. More...
 
void NetworkSyncCommandQueue (NetworkClientSocket *cs)
 Sync our local command queue to the command queue of the given socket. More...
 
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. More...
 
static void DistributeQueue (CommandQueue &queue, const NetworkClientSocket *owner)
 "Send" a particular CommandQueue to all clients. More...
 
void NetworkDistributeCommands ()
 Distribute the commands of ourself and the clients.
 
template<class T >
static void SetClientIdHelper (T &data, [[maybe_unused]] 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.
 
template<class T >
static void SanitizeSingleStringHelper ([[maybe_unused]] 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. More...
 
template<Commands Tcmd, size_t Tcb>
void UnpackNetworkCommand (const CommandPacket &cp)
 Unpack a generic command packet into its actual typed components. More...
 

Variables

static constexpr auto _callback_tuple
 Typed list of all possible callbacks. More...
 
constexpr size_t _callback_tuple_size = std::tuple_size_v<decltype(_callback_tuple)>
 
static 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.
 

Detailed Description

Command handling over network connections.

Definition in file network_command.cpp.

Function Documentation

◆ DistributeCommandPacket()

static void DistributeCommandPacket ( CommandPacket cp,
const NetworkClientSocket owner 
)
static

"Send" a particular CommandPacket to all clients.

Parameters
cpThe command that has to be distributed.
ownerThe client that owns the command,

Definition at line 290 of file network_command.cpp.

References _frame_counter_max, _local_execution_queue, CommandPacket::callback, CommandPacket::frame, and CommandPacket::my_cmd.

Referenced by DistributeQueue().

◆ DistributeQueue()

static void DistributeQueue ( CommandQueue queue,
const NetworkClientSocket owner 
)
static

"Send" a particular CommandQueue to all clients.

Parameters
queueThe queue of commands that has to be distributed.
ownerThe client that owns the commands,

Definition at line 315 of file network_command.cpp.

References _pause_mode, _settings_client, NetworkSettings::commands_per_frame, NetworkSettings::commands_per_frame_server, DistributeCommandPacket(), IsCommandAllowedWhilePaused(), ClientSettings::network, NetworkAdminCmdLogging(), and PM_UNPAUSED.

Referenced by NetworkDistributeCommands().

◆ FindCallbackIndex()

static size_t FindCallbackIndex ( CommandCallback callback)
static

Find the callback index of a callback pointer.

Parameters
callbackAddress of callback to search for.
Returns
Callback index or std::numeric_limits<size_t>::max() if the function wasn't found in the callback list.

Definition at line 179 of file network_command.cpp.

References _callback_table.

Referenced by NetworkGameSocketHandler::SendCommand().

◆ NetworkReplaceCommandClientId()

template<Commands Tcmd>
void NetworkReplaceCommandClientId ( CommandPacket cp,
ClientID  client_id 
)
static

Insert a client ID into the command data in a command packet.

Parameters
cpCommand packet to modify.
client_idClient id to insert.

Definition at line 416 of file network_command.cpp.

References CommandPacket::data, and SetClientIds().

◆ NetworkSendCommand()

void NetworkSendCommand ( Commands  cmd,
StringID  err_message,
CommandCallback callback,
CompanyID  company,
const CommandDataBuffer cmd_data 
)

Prepare a DoCommand to be send over the network.

Parameters
cmdThe command to execute (a CMD_* value)
err_messageMessage prefix to show on error
callbackA callback function to call after the command is finished
companyThe company that wants to send the command
cmd_dataThe command proc arguments.

Definition at line 196 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(*)(DoCommandFlag, Targs...), true >::SendNet().

◆ NetworkSyncCommandQueue()

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.

Parameters
csThe client to sync the queue to.

Definition at line 234 of file network_command.cpp.

References _local_execution_queue, and CommandPacket::callback.

◆ SanitizeCmdStrings() [1/2]

template<Commands Tcmd>
static CommandDataBuffer SanitizeCmdStrings ( const CommandDataBuffer data)
static

Validate and sanitize strings in command data.

Template Parameters
TcmdCommand this data belongs to.
Parameters
dataCommand data.
Returns
Sanitized command data.

Definition at line 462 of file network_command.cpp.

References SanitizeStringsHelper().

◆ SanitizeCmdStrings() [2/2]

template<Commands Tcmd>
CommandDataBuffer SanitizeCmdStrings ( const CommandDataBuffer data)

Validate and sanitize strings in command data.

Template Parameters
TcmdCommand this data belongs to.
Parameters
dataCommand data.
Returns
Sanitized command data.

Definition at line 462 of file network_command.cpp.

References SanitizeStringsHelper().

◆ UnpackNetworkCommand() [1/2]

template<Commands Tcmd, size_t cb>
static void UnpackNetworkCommand ( const CommandPacket cp)
static

Unpack a generic command packet into its actual typed components.

Template Parameters
TcmdCommand type to be unpacked.
TcbIndex into the callback list.
Parameters
cpCommand packet to unpack.

Definition at line 476 of file network_command.cpp.

References _callback_tuple, CommandPacket::data, CommandPacket::err_msg, and CommandPacket::my_cmd.

◆ UnpackNetworkCommand() [2/2]

template<Commands Tcmd, size_t Tcb>
void UnpackNetworkCommand ( const CommandPacket cp)

Unpack a generic command packet into its actual typed components.

Template Parameters
TcmdCommand type to be unpacked.
TcbIndex into the callback list.
Parameters
cpCommand packet to unpack.

Definition at line 476 of file network_command.cpp.

References _callback_tuple, CommandPacket::data, CommandPacket::err_msg, and CommandPacket::my_cmd.

Variable Documentation

◆ _callback_tuple

constexpr auto _callback_tuple
staticconstexpr
Initial value:
= std::make_tuple(
(CommandCallback *)nullptr,
&CcBuildAirport,
&CcPlaySound_CONSTRUCTION_WATER,
&CcBuildDocks,
&CcFoundTown,
&CcRoadDepot,
&CcRailDepot,
&CcPlaySound_EXPLOSION,
&CcPlaySound_CONSTRUCTION_OTHER,
&CcPlaySound_CONSTRUCTION_RAIL,
&CcStation,
&CcTerraform,
&CcAI,
&CcFoundRandomTown,
)
void CcAI(Commands cmd, const CommandCost &result, const CommandDataBuffer &data, CommandDataBuffer result_data)
DoCommand callback function for all commands executed by AIs.
void CcBuildBridge(Commands, const CommandCost &result, TileIndex end_tile, TileIndex tile_start, TransportType transport_type, BridgeType, uint8_t)
Callback executed after a build Bridge CMD has been called.
Definition: bridge_gui.cpp:57
void CommandCallback(Commands cmd, const CommandCost &result, TileIndex tile)
Define a callback function for the client, after the command is finished.
Definition: command_type.h:484
void CcCloneVehicle(Commands cmd, const CommandCost &result, VehicleID veh_id)
This is the Callback method after the cloning attempt of a vehicle.
Definition: depot_gui.cpp:123
void CcGame(Commands cmd, const CommandCost &result, const CommandDataBuffer &data, CommandDataBuffer result_data)
DoCommand callback function for all commands executed by Game Scripts.
void CcCreateGroup(Commands cmd, const CommandCost &result, GroupID new_group, VehicleType vt, GroupID parent_group)
Opens a 'Rename group' window for newly created group.
Definition: group_gui.cpp:1227
void CcAddVehicleNewGroup(Commands cmd, const CommandCost &result, GroupID new_group, GroupID, VehicleID veh_id, bool, const VehicleListIdentifier &)
Open rename window after adding a vehicle to a new group via drag and drop.
Definition: group_gui.cpp:1240
void CcBuildIndustry(Commands cmd, const CommandCost &result, TileIndex tile, IndustryType indtype, uint32_t, bool, uint32_t)
Command callback.
void CcBuildRailTunnel(Commands, const CommandCost &result, TileIndex tile)
Command callback for building a tunnel.
Definition: rail_gui.cpp:303
void CcRoadStop(Commands cmd, const CommandCost &result, TileIndex tile, uint8_t width, uint8_t length, RoadStopType, bool is_drive_through, DiagDirection dir, RoadType, RoadStopClassID spec_class, uint16_t spec_index, StationID, bool)
Command callback for building road stops.
Definition: road_gui.cpp:194
void CcBuildRoadTunnel(Commands, const CommandCost &result, TileIndex start_tile)
Callback executed after a build road tunnel command has been called.
Definition: road_gui.cpp:140
void CcPlaceSign(Commands, const CommandCost &result, SignID new_sign)
Callback function that is called after a sign is placed.
Definition: signs_cmd.cpp:108
void CcBuildWagon(Commands cmd, const CommandCost &result, VehicleID new_veh_id, uint, uint16_t, CargoArray, TileIndex tile, EngineID, bool, CargoID, ClientID)
Callback for building wagons.
Definition: train_gui.cpp:29
void CcStartStopVehicle(Commands cmd, const CommandCost &result, VehicleID veh_id, bool)
This is the Callback method after attempting to start/stop a vehicle.
void CcBuildPrimaryVehicle(Commands, const CommandCost &result, VehicleID new_veh_id, uint, uint16_t, CargoArray)
This is the Callback method after the construction attempt of a primary vehicle.

Typed list of all possible callbacks.

Definition at line 58 of file network_command.cpp.

Referenced by UnpackNetworkCommand().