From 5536bf366df16bbeddf406778f3bd745f5e9170c Mon Sep 17 00:00:00 2001 From: Kayne Ruse Date: Sun, 31 Aug 2014 15:11:59 +1000 Subject: [PATCH] Implemented the serialization switch statement --- client/scenes/lobby_menu.cpp | 2 +- common/network/packet_types/region_packet.cpp | 4 +- common/network/serial_packet.hpp | 2 +- common/network/serial_utility.cpp | 77 +++++++++++++++---- common/network/serial_utility.hpp | 4 +- common/network/udp_network_utility.cpp | 8 +- todo.txt | 1 + 7 files changed, 71 insertions(+), 27 deletions(-) diff --git a/client/scenes/lobby_menu.cpp b/client/scenes/lobby_menu.cpp index 80504c3..e04259e 100644 --- a/client/scenes/lobby_menu.cpp +++ b/client/scenes/lobby_menu.cpp @@ -235,7 +235,7 @@ void LobbyMenu::HandleJoinResponse(ClientPacket* const argPacket) { void LobbyMenu::SendBroadcastRequest() { //broadcast to the network, or a specific server - SerialPacket packet; + ClientPacket packet; packet.type = SerialPacketType::BROADCAST_REQUEST; network.SendTo(config["server.host"].c_str(), config.Int("server.port"), &packet); diff --git a/common/network/packet_types/region_packet.cpp b/common/network/packet_types/region_packet.cpp index e5f2c44..b6b983a 100644 --- a/common/network/packet_types/region_packet.cpp +++ b/common/network/packet_types/region_packet.cpp @@ -23,7 +23,7 @@ #include "serial_utility.hpp" -void serializeRegionContent(void* buffer, RegionPacket* packet) { +void serializeRegion(void* buffer, RegionPacket* packet) { serialCopy(&buffer, &packet->type, sizeof(SerialPacketType)); //format @@ -49,7 +49,7 @@ void serializeRegionContent(void* buffer, RegionPacket* packet) { serialCopy(&buffer, packet->region->GetSolidBitset(), REGION_SOLID_FOOTPRINT); } -void deserializeRegionContent(void* buffer, RegionPacket* packet) { +void deserializeRegion(void* buffer, RegionPacket* packet) { deserialCopy(&buffer, &packet->type, sizeof(SerialPacketType)); //format diff --git a/common/network/serial_packet.hpp b/common/network/serial_packet.hpp index 8d8982e..c767f6a 100644 --- a/common/network/serial_packet.hpp +++ b/common/network/serial_packet.hpp @@ -32,7 +32,7 @@ typedef SerialPacketBase SerialPacket; //DOCS: NETWORK_VERSION is used to discern compatible servers and clients -constexpr int NETWORK_VERSION = -1; +constexpr int NETWORK_VERSION = 20140831; union MaxPacket { CharacterPacket a; diff --git a/common/network/serial_utility.cpp b/common/network/serial_utility.cpp index a3aa205..f43d312 100644 --- a/common/network/serial_utility.cpp +++ b/common/network/serial_utility.cpp @@ -32,34 +32,77 @@ //raw memory copy void serialCopy(void** buffer, void* data, int size) { memcpy(*buffer, data, size); - *buffer = static_cast(*buffer) + size; + *buffer = reinterpret_cast(*buffer) + size; } void deserialCopy(void** buffer, void* data, int size) { memcpy(data, *buffer, size); - *buffer = static_cast(*buffer) + size; -} - -//simple type functions -void serializeType(SerialPacketBase* packet, void* buffer) { - serialCopy(&buffer, &packet->type, sizeof(SerialPacketType)); -} - -void deserializeType(SerialPacketBase* packet, void* buffer) { - deserialCopy(&buffer, &packet->type, sizeof(SerialPacketType)); + *buffer = reinterpret_cast(*buffer) + size; } //main switch functions -void serializePacket(SerialPacketBase* packet, void* buffer) { +void serializePacket(void* buffer, SerialPacketBase* packet) { switch(packet->type) { - //TODO: implement the switch statement + case SerialPacketType::PING: + case SerialPacketType::PONG: + case SerialPacketType::BROADCAST_REQUEST: + case SerialPacketType::BROADCAST_RESPONSE: + serializeServer(buffer, static_cast(packet)); + break; + case SerialPacketType::JOIN_REQUEST: + case SerialPacketType::JOIN_RESPONSE: + case SerialPacketType::JOIN_REJECTION: + case SerialPacketType::SYNCHRONIZE: + case SerialPacketType::DISCONNECT: + case SerialPacketType::SHUTDOWN: + serializeClient(buffer, static_cast(packet)); + break; + case SerialPacketType::REGION_REQUEST: + case SerialPacketType::REGION_CONTENT: + serializeRegion(buffer, static_cast(packet)); + break; + case SerialPacketType::CHARACTER_NEW: + case SerialPacketType::CHARACTER_DELETE: + case SerialPacketType::CHARACTER_UPDATE: + case SerialPacketType::CHARACTER_STATS_REQUEST: + case SerialPacketType::CHARACTER_STATS_RESPONSE: + case SerialPacketType::CHARACTER_REJECTION: + serializeCharacter(buffer, static_cast(packet)); + break; } } -void deserializePacket(SerialPacketBase* packet, void* buffer) { +void deserializePacket(void* buffer, SerialPacketBase* packet) { //find the type, so that you can actually deserialize the packet! - deserializeType(packet, buffer); - switch(packet->type) { - //TODO: implement the switch statement + SerialPacketType type; + memcpy(&type, buffer, sizeof(SerialPacketType)); + + switch(type) { + case SerialPacketType::PING: + case SerialPacketType::PONG: + case SerialPacketType::BROADCAST_REQUEST: + case SerialPacketType::BROADCAST_RESPONSE: + deserializeServer(buffer, static_cast(packet)); + break; + case SerialPacketType::JOIN_REQUEST: + case SerialPacketType::JOIN_RESPONSE: + case SerialPacketType::JOIN_REJECTION: + case SerialPacketType::SYNCHRONIZE: + case SerialPacketType::DISCONNECT: + case SerialPacketType::SHUTDOWN: + deserializeClient(buffer, static_cast(packet)); + break; + case SerialPacketType::REGION_REQUEST: + case SerialPacketType::REGION_CONTENT: + deserializeRegion(buffer, static_cast(packet)); + break; + case SerialPacketType::CHARACTER_NEW: + case SerialPacketType::CHARACTER_DELETE: + case SerialPacketType::CHARACTER_UPDATE: + case SerialPacketType::CHARACTER_STATS_REQUEST: + case SerialPacketType::CHARACTER_STATS_RESPONSE: + case SerialPacketType::CHARACTER_REJECTION: + deserializeCharacter(buffer, static_cast(packet)); + break; } } \ No newline at end of file diff --git a/common/network/serial_utility.hpp b/common/network/serial_utility.hpp index 7d3766e..829c904 100644 --- a/common/network/serial_utility.hpp +++ b/common/network/serial_utility.hpp @@ -31,7 +31,7 @@ void serialCopy(void** buffer, void* data, int size); void deserialCopy(void** buffer, void* data, int size); //primary functions -void serializePacket(SerialPacketBase* packet, void* buffer); -void deserializePacket(SerialPacketBase* packet, void* buffer); +void serializePacket(void* buffer, SerialPacketBase* packet); +void deserializePacket(void* buffer, SerialPacketBase* packet); #endif diff --git a/common/network/udp_network_utility.cpp b/common/network/udp_network_utility.cpp index 8145a05..bfcec52 100644 --- a/common/network/udp_network_utility.cpp +++ b/common/network/udp_network_utility.cpp @@ -167,7 +167,7 @@ int UDPNetworkUtility::SendTo(const char* ip, int port, SerialPacketBase* serial int UDPNetworkUtility::SendTo(IPaddress* add, SerialPacketBase* serialPacket) { memset(packet->data, 0, packet->maxlen); - serializePacket(serialPacket, packet->data); + serializePacket(packet->data, serialPacket); packet->len = PACKET_BUFFER_SIZE; packet->address = *add; @@ -182,7 +182,7 @@ int UDPNetworkUtility::SendTo(IPaddress* add, SerialPacketBase* serialPacket) { int UDPNetworkUtility::SendTo(int channel, SerialPacketBase* serialPacket) { memset(packet->data, 0, packet->maxlen); - serializePacket(serialPacket, packet->data); + serializePacket(packet->data, serialPacket); packet->len = PACKET_BUFFER_SIZE; int ret = SDLNet_UDP_Send(socket, channel, packet); @@ -196,7 +196,7 @@ int UDPNetworkUtility::SendTo(int channel, SerialPacketBase* serialPacket) { int UDPNetworkUtility::SendToAllChannels(SerialPacketBase* serialPacket) { memset(packet->data, 0, packet->maxlen); - serializePacket(serialPacket, packet->data); + serializePacket(packet->data, serialPacket); packet->len = PACKET_BUFFER_SIZE; int sent = 0; @@ -214,7 +214,7 @@ int UDPNetworkUtility::SendToAllChannels(SerialPacketBase* serialPacket) { int UDPNetworkUtility::Receive(SerialPacketBase* serialPacket) { memset(packet->data, 0, packet->maxlen); int ret = SDLNet_UDP_Recv(socket, packet); - deserializePacket(serialPacket, packet->data); + deserializePacket(packet->data, serialPacket); serialPacket->srcAddress = packet->address; if (ret < 0) { diff --git a/todo.txt b/todo.txt index 0e86d2c..74cae7e 100644 --- a/todo.txt +++ b/todo.txt @@ -1,3 +1,4 @@ +TODO: Sort out the *_cast<> stuff TODO: encapsulate the data structures TODO: Ping-pong and keep alive system TODO: Move the statistics into their own SQL table, instead of duplicating the structure a dozen times