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
78
79
80
81
82
83
84
85
86
87
88
89
|
#pragma once
#include "../cSocket.h"
#include "../PacketID.h"
#include "../ByteBuffer.h"
enum
{
PACKET_INCOMPLETE = -2,
PACKET_ERROR = -1,
PACKET_OK = 1,
} ;
// Use this macro to simplify handling several ReadXXX in a row. It assumes that you want [a_Data, a_Size] parsed (which is true for all Parse() functions)
#define HANDLE_PACKET_READ(Proc, Var, TotalBytes) \
{ \
if (!a_Buffer.Proc(Var)) \
{ \
return PACKET_INCOMPLETE; \
} \
TotalBytes = PACKET_OK; \
}
class cPacket
{
public:
cPacket()
: m_PacketID( 0 )
{}
virtual ~cPacket() {}
/// Called to parse the packet. Packet type has already been read and the correct packet type created. Return PACKET_INCOMPLETE for incomplete data, PACKET_ERROR for error, any positive number for success
virtual int Parse(cByteBuffer & a_Buffer)
{
// There are packets that are sent S->C only, those don't have a parsing function
UNUSED(a_Buffer);
LOGERROR("Packet type 0x%02x has no parser defined!", m_PacketID);
ASSERT(!"Unparsed packet type!");
return PACKET_ERROR;
}
/// Called to serialize the packet into a string. Append all packet data to a_Data, including the packet type!
virtual void Serialize(AString & a_Data) const
{
// There are packets that are sent C->S only, those don't have a serializing function
UNUSED(a_Data);
LOGERROR("Packet type 0x%02x has no serializer defined!", m_PacketID);
ASSERT(!"Unserialized packet");
}
virtual cPacket * Clone() const = 0;
unsigned char m_PacketID;
protected:
// These append the data into the a_Dst string:
static void AppendString ( AString & a_Dst, const AString & a_String);
static void AppendString16( AString & a_Dst, const AString & a_String);
static void AppendShort ( AString & a_Dst, short a_Short);
static void AppendShort ( AString & a_Dst, unsigned short a_Short);
static void AppendInteger ( AString & a_Dst, int a_Integer);
static void AppendInteger ( AString & a_Dst, unsigned int a_Integer);
static void AppendFloat ( AString & a_Dst, float a_Float);
static void AppendDouble ( AString & a_Dst, const double & a_Double);
static void AppendByte ( AString & a_Dst, char a_Byte);
static void AppendLong ( AString & a_Dst, const long long & a_Long);
static void AppendBool ( AString & a_Dst, bool a_Bool);
static void AppendData ( AString & a_Dst, const char * a_Data, unsigned int a_Size);
};
typedef std::list <cPacket*> PacketList;
typedef std::deque<cPacket *> PacketQueue;
|