#pragma once #include "../cSocket.h" #include "../PacketID.h" #include "../ByteBuffer.h" #define PACKET_INCOMPLETE -2 #define PACKET_ERROR -1 #define 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 PacketList; typedef std::deque PacketQueue;