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 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
|
#ifndef LICQ_BUFFER_H
#define LICQ_BUFFER_H
/*------------------------------------------------------------------------------
* PacketIpToNetworkIp
*
* Takes an ip from the buffer class and converts it to network byte order:
* Little endian machine:
* Packet returns ip in big-endian -> reverse digits -> call htonl
* Big endian machine:
* Packet returns ip in little-endian -> reverse digits -> call htonl (does nothing)
*----------------------------------------------------------------------------*/
extern unsigned long PacketIpToNetworkIp(unsigned long l);
/*------------------------------------------------------------------------------
* NetworkIpToPacketIp
*
* Takes an ip in network order and converts it to the packet class format
* Little endian machine:
* Packet returns ip in big-endian -> reverse digits -> call htonl
* Big endian machine:
* Packet returns ip in little-endian -> reverse digits -> call htonl (does nothing)
*----------------------------------------------------------------------------*/
extern unsigned long NetworkIpToPacketIp(unsigned long l);
extern void rev_e_short(unsigned short &);
extern void rev_e_long(unsigned long &);
//=====TLV Structs =============================================================
struct SOscarTLV
{
unsigned short nType;
unsigned short nLen;
unsigned char *pData;
};
struct SOscarTLV_Chain
{
SOscarTLV *pTLV;
SOscarTLV_Chain *pNext;
};
//=====CBuffer==================================================================
class CBuffer
{
public:
CBuffer();
CBuffer(unsigned long _nSize);
CBuffer(const CBuffer &);
~CBuffer();
CBuffer& operator=(CBuffer &);
CBuffer& operator+=(CBuffer &);
friend CBuffer operator+(CBuffer &, CBuffer &);
//-- Big Endian --
char *PackBE(CBuffer *);
char *PackBE(const char *data, int size);
char *PackStringBE(const char *data, unsigned short max = 0);
char *PackUnsignedShortBE(unsigned short data);
char *PackUnsignedLongBE(unsigned long data);
char *Pack(CBuffer *);
char *Pack(const char *data, int size);
char *PackLNTS(const char *);
char *PackString(const char *data, unsigned short max = 0);
char *PackUnsignedShort(unsigned short data);
char *PackUnsignedLong(unsigned long data);
char *PackChar(char data);
void Copy(CBuffer *);
char *print(char *&);
void Clear();
void Reset();
bool Empty();
bool Full();
bool End() { return ( getDataPosRead() >= (getDataStart() + getDataSize()) ); }
void Create(unsigned long _nDataSize = 0);
//-- Big Endian --
unsigned long UnpackUnsignedLongBE();
unsigned short UnpackUnsignedShortBE();
CBuffer& operator >> (char &in);
CBuffer& operator >> (unsigned char &in);
CBuffer& operator >> (unsigned short &in);
CBuffer& operator >> (unsigned long &in);
char *UnpackRaw(char *, unsigned short);
char *UnpackString(char *, unsigned short);
char *UnpackString(); // Need to delete[] returned string
char *UnpackStringBE(char *, unsigned short);
char *UnpackStringBE(); // Need to delete[] returned string
char *UnpackUserString(); // Need to delete[] returned string
unsigned long UnpackUnsignedLong();
unsigned long UnpackUinString();
unsigned short UnpackUnsignedShort();
char UnpackChar();
char *getDataStart() const { return m_pDataStart; };
char *getDataPosRead() const { return m_pDataPosRead; };
char *getDataPosWrite() const { return m_pDataPosWrite; };
unsigned long getDataSize() const { return m_pDataPosWrite - m_pDataStart; };
unsigned long getDataMaxSize() const { return m_nDataSize; };
void setDataSize(unsigned long _nDataSize) { m_nDataSize = _nDataSize; };
void setDataPosWrite(char *_pDataPosWrite) { m_pDataPosWrite = _pDataPosWrite; };
void setDataPosRead(char *_pDataPosRead) { m_pDataPosRead = _pDataPosRead; };
void incDataPosWrite(unsigned long c) { m_pDataPosWrite += c; };
void incDataPosRead(unsigned long c) { m_pDataPosRead += c; };
//--- OSCAR Related Functions ------
bool readTLV(int count = -1, int bytes = -1); // This should be called automatically if m_pTLV == 0
void cleanupTLV();
void PackTLV(unsigned short, unsigned short, const char *);
void PackTLV(unsigned short, unsigned short, CBuffer *);
unsigned short getTLVLen(unsigned short);
bool hasTLV(unsigned short);
unsigned long UnpackUnsignedLongTLV(unsigned short);
unsigned short UnpackUnsignedShortTLV(unsigned short);
unsigned char UnpackCharTLV(unsigned short);
char *UnpackStringTLV(unsigned short); // Need to delete[] returned string
CBuffer UnpackTLV(unsigned short);
private:
CBuffer& operator=(const CBuffer&);
protected:
char *m_pDataStart,
*m_pDataPosWrite,
*m_pDataPosRead;
unsigned long m_nDataSize;
SOscarTLV_Chain *m_pTLV;
SOscarTLV *getTLV(unsigned short _nType);
void antiwarning() { NetworkIpToPacketIp(PacketIpToNetworkIp(127)); }
};
#endif
|