summaryrefslogblamecommitdiffstats
path: root/source/packets/cPacket.h
blob: 580cd6771aac9d425e0820d2b764924756f3cbd1 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11




                        
                          




 





                               







                                                                                                                                                           
                                          
                   
                                                   
                   
                                         













                                 

                                                                                                                                                                                                                    
         




                                                                                                 

         




                                            




















                                                                                               

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