summaryrefslogtreecommitdiffstats
path: root/source/packets/cPacket.h
blob: 5f226cfcf330c0b7eb8957d2d3de8b8e7bfee6a6 (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
#pragma once

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

#ifdef _WIN32
#include <xstring>
#else
#include <cstring> // Silly Linux doesn't have xstring...
#include <string>
#include <cstdio>
#endif

class cSocket;
class cPacket
{
public:
	cPacket()
		: m_PacketID( 0 )
	{}
	virtual ~cPacket() {}

	virtual bool Parse( cSocket & a_Socket) { a_Socket=0; printf("ERROR: Undefined NEW Parse function %x\n", m_PacketID ); return false; }
	virtual bool Send( cSocket & a_Socket) { a_Socket=0; printf("ERROR: Undefined NEW Send function %x\n", m_PacketID ); return false; }
	virtual cPacket* Clone() const = 0;

	unsigned char m_PacketID;
	cSocket m_Socket; // Current socket being used
protected:
	bool ReadString	( std::string & a_OutString );
	bool ReadString16( std::string & a_OutString );
	bool ReadShort	( short & a_Short );
	bool ReadInteger(int & a_OutInteger );
	bool ReadInteger(unsigned int & a_OutInteger );
	bool ReadFloat	( float & a_OutFloat );
	bool ReadDouble	( double & a_OutDouble );
	bool ReadByte	( char & a_OutByte );
	bool ReadByte	( unsigned char & a_OutByte );
	bool ReadLong	( long long & a_OutLong );
	bool ReadBool	( bool & a_OutBool );

	void AppendString	( std::string & a_String,	char* a_Dst, unsigned int & a_Iterator );
	void AppendString16 ( std::string & a_String,	char* a_Dst, unsigned int & a_Iterator );
	void AppendShort	( short a_Short,			char* a_Dst, unsigned int & a_Iterator );
	void AppendShort	( unsigned short a_Short,	char* a_Dst, unsigned int & a_Iterator );
	void AppendInteger	( int a_Integer,			char* a_Dst, unsigned int & a_Iterator );
	void AppendInteger	( unsigned int a_Integer,	char* a_Dst, unsigned int & a_Iterator );
	void AppendFloat	( float a_Float,			char* a_Dst, unsigned int & a_Iterator );
	void AppendDouble	( double & a_Double,		char* a_Dst, unsigned int & a_Iterator );
	void AppendByte		( char a_Byte,				char* a_Dst, unsigned int & a_Iterator );
	void AppendLong		( long long & a_Long,		char* a_Dst, unsigned int & a_Iterator );
	void AppendBool		( bool a_Bool,				char* a_Dst, unsigned int & a_Iterator );
	void AppendData		( char* a_Data, unsigned int a_Size, char* a_Dst, unsigned int & a_Iterator );

public:
	static int SendData( cSocket & a_Socket, const char* a_Message, unsigned int a_Size, int a_Options );
	static int RecvAll( cSocket & a_Socket, char* a_Data, unsigned int a_Size, int a_Options );
};