diff options
Diffstat (limited to 'src/network/core/tcp_admin.h')
-rw-r--r-- | src/network/core/tcp_admin.h | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/src/network/core/tcp_admin.h b/src/network/core/tcp_admin.h new file mode 100644 index 000000000..dae41c5f5 --- /dev/null +++ b/src/network/core/tcp_admin.h @@ -0,0 +1,137 @@ +/* $Id$ */ + +/* + * This file is part of OpenTTD. + * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. + * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>. + */ + +/** + * @file tcp_admin.h Basic functions to receive and send TCP packets to and from the admin network. + */ + +#ifndef NETWORK_CORE_TCP_ADMIN_H +#define NETWORK_CORE_TCP_ADMIN_H + +#include "os_abstraction.h" +#include "tcp.h" +#include "../network_type.h" +#include "../../core/pool_type.hpp" + +#ifdef ENABLE_NETWORK + +/** + * Enum with types of TCP packets specific to the admin network. + * This protocol may only be extended to ensure stability. + */ +enum PacketAdminType { + ADMIN_PACKET_ADMIN_JOIN, ///< The admin announces and authenticates itself to the server. + ADMIN_PACKET_ADMIN_QUIT, ///< The admin tells the server that it is quitting. + + ADMIN_PACKET_SERVER_FULL = 100, ///< The server tells the admin it cannot accept the admin. + ADMIN_PACKET_SERVER_BANNED, ///< The server tells the admin it is banned. + ADMIN_PACKET_SERVER_ERROR, ///< The server tells the admin an error has occurred. + ADMIN_PACKET_SERVER_PROTOCOL, ///< The server tells the admin its protocol version. + ADMIN_PACKET_SERVER_WELCOME, ///< The server welcomes the admin to a game. + ADMIN_PACKET_SERVER_NEWGAME, ///< The server tells the admin its going to start a new game. + ADMIN_PACKET_SERVER_SHUTDOWN, ///< The server tells the admin its shutting down. + + INVALID_ADMIN_PACKET = 0xFF, ///< An invalid marker for admin packets. +}; + +/** Status of an admin. */ +enum AdminStatus { + ADMIN_STATUS_INACTIVE, ///< The admin is not connected nor active. + ADMIN_STATUS_ACTIVE, ///< The admin is active. + ADMIN_STATUS_END ///< Must ALWAYS be on the end of this list!! (period) +}; + +#define DECLARE_ADMIN_RECEIVE_COMMAND(type) virtual NetworkRecvStatus NetworkPacketReceive_## type ##_command(Packet *p) +#define DEF_ADMIN_RECEIVE_COMMAND(cls, type) NetworkRecvStatus cls ##NetworkAdminSocketHandler::NetworkPacketReceive_ ## type ## _command(Packet *p) + +/** Main socket handler for admin related connections. */ +class NetworkAdminSocketHandler : public NetworkTCPSocketHandler { +protected: + char admin_name[NETWORK_CLIENT_NAME_LENGTH]; ///< Name of the admin. + char admin_version[NETWORK_REVISION_LENGTH]; ///< Version string of the admin. + AdminStatus status; ///< Status of this admin. + + /** + * Join the admin network: + * string Password the server is expecting for this network. + * string Name of the application being used to connect. + * string Version string of the application being used to connect. + */ + DECLARE_ADMIN_RECEIVE_COMMAND(ADMIN_PACKET_ADMIN_JOIN); + + /** + * Notification to the server that this admin is quitting. + */ + DECLARE_ADMIN_RECEIVE_COMMAND(ADMIN_PACKET_ADMIN_QUIT); + + /** + * The server is full (connection gets closed). + */ + DECLARE_ADMIN_RECEIVE_COMMAND(ADMIN_PACKET_SERVER_FULL); + + /** + * The source IP address is banned (connection gets closed). + */ + DECLARE_ADMIN_RECEIVE_COMMAND(ADMIN_PACKET_SERVER_BANNED); + + /** + * An error was caused by this admin connection (connection gets closed). + * uint8 NetworkErrorCode the error caused. + */ + DECLARE_ADMIN_RECEIVE_COMMAND(ADMIN_PACKET_SERVER_ERROR); + + /** + * Inform a just joined admin about the protocol specifics: + * uint8 Protocol version. + * bool Further protocol data follows (repeats through all update packet types). + * uint16 Update packet type. + * uint16 Frequencies allowed for this update packet (bitwise). + */ + DECLARE_ADMIN_RECEIVE_COMMAND(ADMIN_PACKET_SERVER_PROTOCOL); + + /** + * Welcome a connected admin to the game: + * string Name of the Server (e.g. as advertised to master server). + * string OpenTTD version string. + * bool Server is dedicated. + * string Name of the Map. + * uint32 Random seed of the Map. + * uint8 Landscape of the Map. + * uint32 Start date of the Map. + * uint16 Map width. + * uint16 Map height. + */ + DECLARE_ADMIN_RECEIVE_COMMAND(ADMIN_PACKET_SERVER_WELCOME); + + /** + * Notification about a newgame. + */ + DECLARE_ADMIN_RECEIVE_COMMAND(ADMIN_PACKET_SERVER_NEWGAME); + + /** + * Notification about the server shutting down. + */ + DECLARE_ADMIN_RECEIVE_COMMAND(ADMIN_PACKET_SERVER_SHUTDOWN); + + NetworkRecvStatus HandlePacket(Packet *p); +public: + NetworkRecvStatus CloseConnection(bool error = true); + + NetworkAdminSocketHandler(SOCKET s); + ~NetworkAdminSocketHandler(); + + NetworkRecvStatus Recv_Packets(); + + const char *Recv_Command(Packet *p, CommandPacket *cp); + void Send_Command(Packet *p, const CommandPacket *cp); +}; + +#endif /* ENABLE_NETWORK */ + +#endif /* NETWORK_CORE_TCP_ADMIN_H */ |