summaryrefslogtreecommitdiff
path: root/src/network/core/tcp_admin.cpp
diff options
context:
space:
mode:
authorrubidium <rubidium@openttd.org>2010-10-17 17:31:03 +0000
committerrubidium <rubidium@openttd.org>2010-10-17 17:31:03 +0000
commit33ed4ddbfbdcd269c7234ea6093acc21e7a63e7c (patch)
tree528f610d0ebafba248bd2c9ebf962990afa30676 /src/network/core/tcp_admin.cpp
parent12a7e2fde0b53f8d3042f3ee248522e921b80d72 (diff)
downloadopenttd-33ed4ddbfbdcd269c7234ea6093acc21e7a63e7c.tar.xz
(svn r20963) -Add: stubs for a remote administration connection
Diffstat (limited to 'src/network/core/tcp_admin.cpp')
-rw-r--r--src/network/core/tcp_admin.cpp119
1 files changed, 119 insertions, 0 deletions
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 <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * @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 */