Private methods dont have capital letters and are words are separated by underscores Added id's to TcpClient's class Removed ptr from TcpClient and Server Worked on TcpServer Theres now a default server port Added ReceiveMessage function to TcpClient to receive only 1 message Fixed VoidNetClientAPI Receive function
92 lines
2.4 KiB
C++
92 lines
2.4 KiB
C++
#include "NetworkMessage.hpp"
|
|
#include "Utility.hpp"
|
|
#include "Serializer.hpp"
|
|
#include "Tags.hpp"
|
|
|
|
#include <vector>
|
|
|
|
NetworkMessage::NetworkMessage()
|
|
{
|
|
}
|
|
|
|
NetworkMessage::NetworkMessage(uint16 sender, byte distribution_mode, uint16 destination_id, byte tag, uint16 subject, NetworkBuffer buffer) :
|
|
sender(sender), distribution_mode(distribution_mode), destination_id(destination_id), tag(tag), subject(subject), buffer(buffer)
|
|
{
|
|
}
|
|
|
|
NetworkMessage::NetworkMessage(const NetworkBuffer &buffer)
|
|
{
|
|
*this = DecodeMessage(buffer);
|
|
}
|
|
|
|
NetworkMessage::~NetworkMessage()
|
|
{
|
|
}
|
|
|
|
const NetworkBuffer &NetworkMessage::EncodeMessage(const NetworkMessage &message)
|
|
{
|
|
NetworkBuffer buffer;
|
|
uint16 size = buffer.body_size + 1;
|
|
byte *encoded_message = new byte[size]();
|
|
buffer.body_size = size;
|
|
|
|
byte *encoded_sender = &encoded_message[1];
|
|
encoded_sender = Utility::BitConverter::FromUint16(message.sender);
|
|
|
|
encoded_message[3] = message.distribution_mode;
|
|
|
|
byte *encoded_destination_id = &encoded_message[4];
|
|
encoded_destination_id = Utility::BitConverter::FromUint16(message.destination_id);
|
|
|
|
encoded_message[6] = message.tag;
|
|
|
|
byte *encoded_subject = &encoded_message[7];
|
|
encoded_subject = Utility::BitConverter::FromUint16(message.subject);
|
|
|
|
byte *encoded_data = &encoded_message[9];
|
|
std::vector<byte> serialized_data = Serializer::to_bytes(message.data);
|
|
encoded_data = &serialized_data[0];
|
|
|
|
buffer.body = encoded_message;
|
|
return buffer;
|
|
}
|
|
|
|
const NetworkMessage &NetworkMessage::DecodeMessage(const NetworkBuffer &buffer)
|
|
{
|
|
NetworkMessage message = decode_message_header(buffer);
|
|
message.data = decode_message_data(buffer);
|
|
return message;
|
|
}
|
|
|
|
void *NetworkMessage::decode_message_data(const NetworkBuffer &buffer)
|
|
{
|
|
if (buffer.body_size < 9)
|
|
return nullptr;
|
|
byte version = buffer.body[0];
|
|
switch (version)
|
|
{
|
|
case 0:
|
|
{
|
|
void *object;
|
|
return Serializer::from_bytes(buffer.body + 9, object);
|
|
}
|
|
default:
|
|
{
|
|
//version nor supported
|
|
throw std::runtime_error("NetworkMessage - Decoding version not supported");
|
|
}
|
|
}
|
|
}
|
|
|
|
const NetworkMessage &NetworkMessage::decode_message_header(const NetworkBuffer &buffer)
|
|
{
|
|
sender = Utility::BitConverter::ToUint16(buffer.body, 1);
|
|
distribution_mode = buffer.body[3];
|
|
destination_id = Utility::BitConverter::ToUint16(buffer.body, 4);
|
|
tag = buffer.body[6];
|
|
subject = Utility::BitConverter::ToUint16(buffer.body, 7);
|
|
this->buffer = buffer;
|
|
valid = sender != -2 && tag != CONNECT && tag != DISCONNECT && distribution_mode > 0;
|
|
return *this;
|
|
}
|