From 33ed4ddbfbdcd269c7234ea6093acc21e7a63e7c Mon Sep 17 00:00:00 2001 From: rubidium Date: Sun, 17 Oct 2010 17:31:03 +0000 Subject: (svn r20963) -Add: stubs for a remote administration connection --- src/network/core/tcp_admin.cpp | 119 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 src/network/core/tcp_admin.cpp (limited to 'src/network/core/tcp_admin.cpp') diff --git a/src/network/core/tcp_admin.cpp b/src/network/core/tcp_admin.cpp new file mode 100644 index 000000000..2d68fc68b --- /dev/null +++ b/src/network/core/tcp_admin.cpp @@ -0,0 +1,119 @@ +/* $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 . + */ + +/** + * @file tcp_admin.cpp Basic functions to receive and send TCP packets to and from the admin network. + */ + +#ifdef ENABLE_NETWORK + +#include "../../stdafx.h" + +#include "../network_internal.h" +#include "tcp_admin.h" +#include "../../debug.h" + +NetworkAdminSocketHandler::NetworkAdminSocketHandler(SOCKET s) +{ + this->sock = s; +} + +NetworkAdminSocketHandler::~NetworkAdminSocketHandler() +{ +} + +NetworkRecvStatus NetworkAdminSocketHandler::CloseConnection(bool error) +{ + delete this; + return NETWORK_RECV_STATUS_CONN_LOST; +} + +/** + * Defines a simple (switch) case for each network packet. + * @param type the packet type to create the case for. + */ +#define ADMIN_COMMAND(type) case type: return this->NetworkPacketReceive_ ## type ## _command(p); break; + +/** + * Handle the given packet, i.e. pass it to the right parser receive command. + * @param p the packet to handle. + * @return #NetworkRecvStatus of handling. + */ +NetworkRecvStatus NetworkAdminSocketHandler::HandlePacket(Packet *p) +{ + PacketAdminType type = (PacketAdminType)p->Recv_uint8(); + + switch (this->HasClientQuit() ? INVALID_ADMIN_PACKET : type) { + ADMIN_COMMAND(ADMIN_PACKET_ADMIN_JOIN) + ADMIN_COMMAND(ADMIN_PACKET_ADMIN_QUIT) + + ADMIN_COMMAND(ADMIN_PACKET_SERVER_FULL) + ADMIN_COMMAND(ADMIN_PACKET_SERVER_BANNED) + ADMIN_COMMAND(ADMIN_PACKET_SERVER_ERROR) + ADMIN_COMMAND(ADMIN_PACKET_SERVER_PROTOCOL) + ADMIN_COMMAND(ADMIN_PACKET_SERVER_WELCOME) + ADMIN_COMMAND(ADMIN_PACKET_SERVER_NEWGAME) + ADMIN_COMMAND(ADMIN_PACKET_SERVER_SHUTDOWN) + + default: + if (this->HasClientQuit()) { + DEBUG(net, 0, "[tcp/admin] received invalid packet type %d from '%s' (%s)", type, this->admin_name, this->admin_version); + } else { + DEBUG(net, 0, "[tcp/admin] received illegal packet from '%s' (%s)", this->admin_name, this->admin_version); + } + + this->CloseConnection(); + return NETWORK_RECV_STATUS_MALFORMED_PACKET; + } +} + +/** + * Do the actual receiving of packets. + * As long as HandlePacket returns OKAY packets are handled. Upon + * failure, or no more packets to process the last result of + * HandlePacket is returned. + * @return #NetworkRecvStatus of the last handled packet. + */ +NetworkRecvStatus NetworkAdminSocketHandler::Recv_Packets() +{ + Packet *p; + while ((p = this->Recv_Packet()) != NULL) { + NetworkRecvStatus res = HandlePacket(p); + if (res != NETWORK_RECV_STATUS_OKAY) return res; + } + + return NETWORK_RECV_STATUS_OKAY; +} + +/** + * Create stub implementations for all receive commands that only + * show a warning that the given command is not available for the + * socket where the packet came from. + * @param type the packet type to create the stub for. + */ +#define DEFINE_UNAVAILABLE_ADMIN_RECEIVE_COMMAND(type) \ +NetworkRecvStatus NetworkAdminSocketHandler::NetworkPacketReceive_## type ##_command(Packet *p) \ +{ \ + DEBUG(net, 0, "[tcp/admin] received illegal packet type %d from admin %s (%s)", \ + type, this->admin_name, this->admin_version); \ + return NETWORK_RECV_STATUS_MALFORMED_PACKET; \ +} + +DEFINE_UNAVAILABLE_ADMIN_RECEIVE_COMMAND(ADMIN_PACKET_ADMIN_JOIN) +DEFINE_UNAVAILABLE_ADMIN_RECEIVE_COMMAND(ADMIN_PACKET_ADMIN_QUIT) + +DEFINE_UNAVAILABLE_ADMIN_RECEIVE_COMMAND(ADMIN_PACKET_SERVER_FULL) +DEFINE_UNAVAILABLE_ADMIN_RECEIVE_COMMAND(ADMIN_PACKET_SERVER_BANNED) +DEFINE_UNAVAILABLE_ADMIN_RECEIVE_COMMAND(ADMIN_PACKET_SERVER_ERROR) +DEFINE_UNAVAILABLE_ADMIN_RECEIVE_COMMAND(ADMIN_PACKET_SERVER_PROTOCOL) +DEFINE_UNAVAILABLE_ADMIN_RECEIVE_COMMAND(ADMIN_PACKET_SERVER_WELCOME) +DEFINE_UNAVAILABLE_ADMIN_RECEIVE_COMMAND(ADMIN_PACKET_SERVER_NEWGAME) +DEFINE_UNAVAILABLE_ADMIN_RECEIVE_COMMAND(ADMIN_PACKET_SERVER_SHUTDOWN) + +#endif /* ENABLE_NETWORK */ -- cgit v1.2.3-54-g00ecf