summaryrefslogtreecommitdiff
path: root/src/network/core/tcp_coordinator.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/network/core/tcp_coordinator.cpp')
-rw-r--r--src/network/core/tcp_coordinator.cpp80
1 files changed, 80 insertions, 0 deletions
diff --git a/src/network/core/tcp_coordinator.cpp b/src/network/core/tcp_coordinator.cpp
new file mode 100644
index 000000000..1cf5cd676
--- /dev/null
+++ b/src/network/core/tcp_coordinator.cpp
@@ -0,0 +1,80 @@
+/*
+ * 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_coordinator.cpp Basic functions to receive and send Game Coordinator packets.
+ */
+
+#include "../../stdafx.h"
+#include "../../date_func.h"
+#include "../../debug.h"
+#include "tcp_coordinator.h"
+
+#include "../../safeguards.h"
+
+/**
+ * Handle the given packet, i.e. pass it to the right.
+ * parser receive command.
+ * @param p The packet to handle.
+ * @return True iff we should immediately handle further packets.
+ */
+bool NetworkCoordinatorSocketHandler::HandlePacket(Packet *p)
+{
+ PacketCoordinatorType type = (PacketCoordinatorType)p->Recv_uint8();
+
+ switch (type) {
+ case PACKET_COORDINATOR_GC_ERROR: return this->Receive_GC_ERROR(p);
+ case PACKET_COORDINATOR_SERVER_REGISTER: return this->Receive_SERVER_REGISTER(p);
+ case PACKET_COORDINATOR_GC_REGISTER_ACK: return this->Receive_GC_REGISTER_ACK(p);
+ case PACKET_COORDINATOR_SERVER_UPDATE: return this->Receive_SERVER_UPDATE(p);
+
+ default:
+ Debug(net, 0, "[tcp/coordinator] Received invalid packet type {}", type);
+ return false;
+ }
+}
+
+/**
+ * Receive a packet at TCP level.
+ * @return Whether at least one packet was received.
+ */
+bool NetworkCoordinatorSocketHandler::ReceivePackets()
+{
+ /*
+ * We read only a few of the packets. This allows the GUI to update when
+ * a large set of servers is being received. Otherwise the interface
+ * "hangs" while the game is updating the server-list.
+ *
+ * What arbitrary number to choose is the ultimate question though.
+ */
+ Packet *p;
+ static const int MAX_PACKETS_TO_RECEIVE = 42;
+ int i = MAX_PACKETS_TO_RECEIVE;
+ while (--i != 0 && (p = this->ReceivePacket()) != nullptr) {
+ bool cont = this->HandlePacket(p);
+ delete p;
+ if (!cont) return true;
+ }
+
+ return i != MAX_PACKETS_TO_RECEIVE - 1;
+}
+
+/**
+ * Helper for logging receiving invalid packets.
+ * @param type The received packet type.
+ * @return Always false, as it's an error.
+ */
+bool NetworkCoordinatorSocketHandler::ReceiveInvalidPacket(PacketCoordinatorType type)
+{
+ Debug(net, 0, "[tcp/coordinator] Received illegal packet type {}", type);
+ return false;
+}
+
+bool NetworkCoordinatorSocketHandler::Receive_GC_ERROR(Packet *p) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_ERROR); }
+bool NetworkCoordinatorSocketHandler::Receive_SERVER_REGISTER(Packet *p) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_SERVER_REGISTER); }
+bool NetworkCoordinatorSocketHandler::Receive_GC_REGISTER_ACK(Packet *p) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_REGISTER_ACK); }
+bool NetworkCoordinatorSocketHandler::Receive_SERVER_UPDATE(Packet *p) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_SERVER_UPDATE); }