-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMessageDecode.cpp
More file actions
77 lines (61 loc) · 2.46 KB
/
MessageDecode.cpp
File metadata and controls
77 lines (61 loc) · 2.46 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#ifdef WIN32
#include "stdint.h"
#endif
#include <apollo/Net/MessageDecode.h>
#include <string.h>
namespace Net
{
namespace MessageEncoding
{
ENetPacket* Encode ( const Message& msg )
{
size_t packetLength = 2 + msg.message.length() + 4 + msg.dataLength;
unsigned char* packetData = (unsigned char*)malloc(packetLength);
uint16_t messageIDLength = msg.message.length();
messageIDLength = htons(messageIDLength);
memcpy(packetData, &messageIDLength, 2);
memcpy(packetData + 2, msg.message.data(), msg.message.length());
uint32_t messagePayloadLength = msg.dataLength;
messagePayloadLength = htonl(messagePayloadLength);
memcpy(packetData + 2 + msg.message.length(), &messagePayloadLength, 4);
if (messagePayloadLength)
memcpy(packetData + 2 + msg.message.length() + 4, msg.data, msg.dataLength);
ENetPacket* packet = enet_packet_create(packetData, packetLength, ENET_PACKET_FLAG_RELIABLE);
free((void*)packetData);
return packet;
}
Message* Decode ( ENetPacket* packet )
{
const unsigned char* data = (const unsigned char*)packet->data;
uint16_t messageIDLength;
memcpy(&messageIDLength, data, 2);
messageIDLength = ntohs(messageIDLength); //find supposed length of messageID
uint32_t messageLength;
memcpy(&messageLength, data + 2 + messageIDLength, 4); //find supposed length of message data
messageLength = ntohl(messageLength);
if (messageIDLength + messageLength == packet->dataLength && messageIDLength < (packet->dataLength - 6)) //if its a valid message, interpret
{
char* messageID = (char*)alloca(messageIDLength + 1);
messageID[messageIDLength] = 0;
memcpy(messageID, data + 2, messageIDLength);
for (unsigned i = 0; i <= messageIDLength; i++) //check messageID contents
{//......................0........9....||...................A........Z....||...................a.........z....||................ _
if (!((messageID[i] >= 48 && messageID[i]<= 57) || (messageID[i] >= 65 && messageID[i] <= 90) || (messageID[i] >= 97 && messageID[i] <= 122) || (messageID[i] == 95)))
{
return NULL;
}
}
void* messageBuffer = NULL;
if (messageLength)
{
messageBuffer = alloca(messageLength);
memcpy(messageBuffer, data + 2 + messageIDLength + 4, messageLength);
}
std::string messageIDString = std::string(messageID, messageIDLength);
Message* result = new Message(messageIDString, messageBuffer, messageLength);
return result; //this is only reached if the message passes the tests
}
return NULL; // invalid format
}
}
}