Files
VoidNet/src/NetworkMessage.cpp
xX-TheDoctor-Xx 6fa7872a6d Added Connection Codes
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
2016-07-22 00:32:53 +01:00

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;
}