Implemented the serialization switch statement

This commit is contained in:
Kayne Ruse
2014-08-31 15:11:59 +10:00
parent 094efad728
commit 5536bf366d
7 changed files with 71 additions and 27 deletions
@@ -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
+1 -1
View File
@@ -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;
+60 -17
View File
@@ -32,34 +32,77 @@
//raw memory copy
void serialCopy(void** buffer, void* data, int size) {
memcpy(*buffer, data, size);
*buffer = static_cast<char*>(*buffer) + size;
*buffer = reinterpret_cast<char*>(*buffer) + size;
}
void deserialCopy(void** buffer, void* data, int size) {
memcpy(data, *buffer, size);
*buffer = static_cast<char*>(*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<char*>(*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<ServerPacket*>(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<ClientPacket*>(packet));
break;
case SerialPacketType::REGION_REQUEST:
case SerialPacketType::REGION_CONTENT:
serializeRegion(buffer, static_cast<RegionPacket*>(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<CharacterPacket*>(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<ServerPacket*>(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<ClientPacket*>(packet));
break;
case SerialPacketType::REGION_REQUEST:
case SerialPacketType::REGION_CONTENT:
deserializeRegion(buffer, static_cast<RegionPacket*>(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<CharacterPacket*>(packet));
break;
}
}
+2 -2
View File
@@ -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
+4 -4
View File
@@ -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) {