summaryrefslogtreecommitdiffstats
path: root/source/packets/cPacket.h
blob: 7eb224c9e414c844b4ed7a9dc2486f8a02b75506 (plain) (blame)
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
90
91
92
93
94

#pragma once

#include "../cSocket.h"
#include "../PacketID.h"





#define PACKET_INCOMPLETE -2
#define PACKET_ERROR      -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) \
	{ \
		int res = Proc(a_Data + TotalBytes, a_Size - TotalBytes, Var); \
		if (res < 0) \
		{ \
			return res; \
		} \
		TotalBytes += res; \
	}





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 the number of characters processed, PACKET_INCOMPLETE for incomplete data, PACKET_ERROR for error
	virtual int Parse(const char * a_Data, int a_Size)
	{
		LOGERROR("Undefined Parse function for packet type 0x%x\n", m_PacketID );
		ASSERT(!"Undefined Parse function");
		return -1;
	}
	
	/// 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
	{
		LOGERROR("Undefined Serialize function for packet type 0x%x\n",  m_PacketID );
		ASSERT(!"Undefined Serialize function");
	}
	
	virtual cPacket * Clone() const = 0;

	unsigned char m_PacketID;

protected:

	// These return the number of characters processed, PACKET_INCOMPLETE for incomplete data, PACKET_ERROR for error:
	static int ReadString16(const char * a_Data, int a_Size, AString & a_OutString );
	static int ReadShort   (const char * a_Data, int a_Size, short & a_Short );
	static int ReadInteger (const char * a_Data, int a_Size, int & a_OutInteger );
	static int ReadInteger (const char * a_Data, int a_Size, unsigned int & a_OutInteger );
	static int ReadFloat   (const char * a_Data, int a_Size, float & a_OutFloat );
	static int ReadDouble  (const char * a_Data, int a_Size, double & a_OutDouble );
	static int ReadByte    (const char * a_Data, int a_Size, char & a_OutByte );
	static int ReadByte    (const char * a_Data, int a_Size, unsigned char & a_OutByte );
	static int ReadLong    (const char * a_Data, int a_Size, long long & a_OutLong );
	static int ReadBool    (const char * a_Data, int a_Size, bool & a_OutBool );

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