Files
2026-11-07 13:30:45 +07:00

398 lines
9.4 KiB
C++

#include "../stdafx.h"
#include "SP2Packet.h"
SP2Packet::SP2Packet()
{
}
SP2Packet::SP2Packet( const SP2Packet &rhs )
{
Clear();
memcpy( m_pBuffer, rhs.GetBuffer(), rhs.GetBufferSize() );
m_currentPos = rhs.m_currentPos;
}
SP2Packet::SP2Packet(DWORD ID) : CPacket( ID )
{
}
SP2Packet::SP2Packet(const uint8* buffer,int size) : CPacket( buffer, size )
{
}
SP2Packet::SP2Packet( DWORD dwUserIndex, SP2Packet &rhs )
{
Clear();
*m_packet_header.m_ID = rhs.GetPacketID();
m_currentPos = sizeof(PACKETHEADER);
*this << dwUserIndex;
SetDataAdd( (char*)rhs.GetData(), rhs.GetDataSize() );
}
SP2Packet::~SP2Packet()
{
}
const uint8* SP2Packet::GetData() const
{
return &m_pBuffer[0] + sizeof(PACKETHEADER);
}
int SP2Packet::GetDataSize() const
{
return *m_packet_header.m_Size - sizeof(PACKETHEADER);
}
const uint8* SP2Packet::GetBuffer() const
{
return &m_pBuffer[0];
}
int SP2Packet::GetBufferSize() const
{
return *m_packet_header.m_Size;
}
void SP2Packet::SetDataAdd( char *buffer, int size, bool bCurPosReSet )
{
memcpy( &m_pBuffer[m_currentPos], buffer, size );
m_currentPos += size;
*m_packet_header.m_Size = m_currentPos;
if( bCurPosReSet )
m_currentPos = sizeof(PACKETHEADER);
}
void SP2Packet::SetDataAddCreateUDP( DWORD dwIP, DWORD dwPort, char *buffer, int size, bool bCurPosReSet /* = false */ )
{
*this << dwIP << dwPort;
memcpy( &m_pBuffer[m_currentPos], buffer, size );
m_currentPos += size;
*m_packet_header.m_Size = m_currentPos;
if( bCurPosReSet )
m_currentPos = sizeof(PACKETHEADER);
}
void SP2Packet::MovePointer( DWORD dwMoveBytes )
{
m_currentPos += dwMoveBytes;
m_currentPos = min( m_currentPos, GetBufferSize() );
}
void SP2Packet::SetPosBegin()
{
m_currentPos = sizeof(PACKETHEADER);
}
//operator
SP2Packet& SP2Packet::operator = (const SP2Packet &packet)
{
Clear();
memcpy(&m_pBuffer[0],packet.GetBuffer(),packet.GetBufferSize());
m_currentPos = packet.m_currentPos;
return *this;
}
SP2Packet& SP2Packet::operator << (BYTE arg)
{
if( !CheckLeftPacketSize( sizeof(BYTE) ) ) return *this;
memcpy(&m_pBuffer[m_currentPos],&arg,sizeof(BYTE));
m_currentPos += sizeof(BYTE);
*m_packet_header.m_Size = m_currentPos;
return *this;
}
SP2Packet& SP2Packet::operator << (bool arg)
{
if( !CheckLeftPacketSize( sizeof(bool) ) ) return *this;
memcpy(&m_pBuffer[m_currentPos],&arg,sizeof(bool));
m_currentPos += sizeof(bool);
*m_packet_header.m_Size = m_currentPos;
return *this;
}
SP2Packet& SP2Packet::operator << (int arg)
{
if( !CheckLeftPacketSize( sizeof(int) ) ) return *this;
memcpy(&m_pBuffer[m_currentPos],&arg,sizeof(int));
m_currentPos += sizeof(int);
*m_packet_header.m_Size = m_currentPos;
return *this;
}
SP2Packet& SP2Packet::operator << (LONG arg)
{
if( !CheckLeftPacketSize( sizeof(LONG) ) ) return *this;
memcpy(&m_pBuffer[m_currentPos],&arg,sizeof(LONG));
m_currentPos += sizeof(LONG);
*m_packet_header.m_Size = m_currentPos;
return *this;
}
SP2Packet& SP2Packet::operator << (WORD arg)
{
if( !CheckLeftPacketSize( sizeof(WORD) ) ) return *this;
memcpy(&m_pBuffer[m_currentPos],&arg,sizeof(WORD));
m_currentPos += sizeof(WORD);
*m_packet_header.m_Size = m_currentPos;
return *this;
}
SP2Packet& SP2Packet::operator << (DWORD arg)
{
if( !CheckLeftPacketSize( sizeof(DWORD) ) ) return *this;
memcpy(&m_pBuffer[m_currentPos],&arg,sizeof(DWORD));
m_currentPos += sizeof(DWORD);
*m_packet_header.m_Size = m_currentPos;
return *this;
}
SP2Packet& SP2Packet::operator << (__int64 arg)
{
if( !CheckLeftPacketSize( sizeof(__int64) ) ) return *this;
memcpy(&m_pBuffer[m_currentPos],&arg,sizeof(__int64));
m_currentPos += sizeof(__int64);
*m_packet_header.m_Size = m_currentPos;
return *this;
}
SP2Packet& SP2Packet::operator << (LPTSTR arg)
{
int nlen = lstrlen(arg) * sizeof( TCHAR ) + sizeof( TCHAR );
if( !CheckLeftPacketSize( nlen ) ) return *this;
memcpy(&m_pBuffer[m_currentPos],arg,nlen);
m_currentPos += nlen;
*m_packet_header.m_Size = m_currentPos;
return *this;
}
SP2Packet& SP2Packet::operator << (double arg)
{
if( !CheckLeftPacketSize( sizeof(double) ) ) return *this;
memcpy(&m_pBuffer[m_currentPos],&arg,sizeof(double));
m_currentPos += sizeof(double);
*m_packet_header.m_Size = m_currentPos;
return *this;
}
SP2Packet& SP2Packet::operator << (float arg)
{
if( !CheckLeftPacketSize( sizeof(float) ) ) return *this;
memcpy(&m_pBuffer[m_currentPos],&arg,sizeof(float));
m_currentPos += sizeof(float);
*m_packet_header.m_Size = m_currentPos;
return *this;
}
SP2Packet& SP2Packet::operator << (short arg)
{
if( !CheckLeftPacketSize( sizeof(short) ) ) return *this;
memcpy(&m_pBuffer[m_currentPos],&arg,sizeof(short));
m_currentPos += sizeof(short);
*m_packet_header.m_Size = m_currentPos;
return *this;
}
//SP2Packet& SP2Packet::operator << ( CHARACTER &arg )
//{
// arg.FillData( *this );
// return *this;
//}
SP2Packet& SP2Packet::operator << ( const ioHashString &arg )
{
int nlen = lstrlen( arg.c_str() ) + 1;
if( !CheckLeftPacketSize( nlen ) ) return *this;
memcpy( &m_pBuffer[m_currentPos], arg.c_str(), nlen );
m_currentPos += nlen;
*m_packet_header.m_Size = m_currentPos;
return *this;
}
SP2Packet& SP2Packet::operator << (CQueryData &arg)
{
memcpy(&m_pBuffer[m_currentPos],arg.GetHeader(),sizeof(QueryHeader));
m_currentPos += sizeof(QueryHeader);
memcpy(&m_pBuffer[m_currentPos],arg.GetBuffer(),arg.GetBufferSize());
m_currentPos += arg.GetBufferSize();
*m_packet_header.m_Size = m_currentPos;
return *this;
}
SP2Packet& SP2Packet::operator << (CQueryResultData &arg)
{
memcpy(&m_pBuffer[m_currentPos],arg.GetHeader(),sizeof(QueryResultHeader));
m_currentPos += sizeof(QueryResultHeader);
memcpy(&m_pBuffer[m_currentPos],arg.GetBuffer(),arg.GetResultBufferSize());
m_currentPos += arg.GetResultBufferSize();
*m_packet_header.m_Size = m_currentPos;
return *this;
}
SP2Packet& SP2Packet::operator >> (BYTE &arg)
{
if( !CheckRightPacketSize( sizeof(BYTE) ) ) return *this;
memcpy(&arg,&m_pBuffer[m_currentPos],sizeof(BYTE));
m_currentPos += sizeof(BYTE);
return *this;
}
SP2Packet& SP2Packet::operator >> (bool &arg)
{
if( !CheckRightPacketSize( sizeof(bool) ) ) return *this;
memcpy(&arg,&m_pBuffer[m_currentPos],sizeof(bool));
m_currentPos += sizeof(bool);
return *this;
}
SP2Packet& SP2Packet::operator >> (int &arg)
{
if( !CheckRightPacketSize( sizeof(int) ) ) return *this;
memcpy(&arg,&m_pBuffer[m_currentPos],sizeof(int));
m_currentPos += sizeof(int);
return *this;
}
SP2Packet& SP2Packet::operator >> (LONG &arg)
{
if( !CheckRightPacketSize( sizeof(LONG) ) ) return *this;
memcpy(&arg,&m_pBuffer[m_currentPos],sizeof(LONG));
m_currentPos += sizeof(LONG);
return *this;
}
SP2Packet& SP2Packet::operator >> (WORD &arg)
{
if( !CheckRightPacketSize( sizeof(WORD) ) ) return *this;
memcpy(&arg,&m_pBuffer[m_currentPos],sizeof(WORD));
m_currentPos += sizeof(WORD);
return *this;
}
SP2Packet& SP2Packet::operator >> (DWORD &arg)
{
if( !CheckRightPacketSize( sizeof(DWORD) ) ) return *this;
memcpy(&arg,&m_pBuffer[m_currentPos],sizeof(DWORD));
m_currentPos += sizeof(DWORD);
return *this;
}
SP2Packet& SP2Packet::operator >> (__int64 &arg)
{
if( !CheckRightPacketSize( sizeof(__int64) ) ) return *this;
memcpy(&arg,&m_pBuffer[m_currentPos],sizeof(__int64));
m_currentPos += sizeof(__int64);
return *this;
}
SP2Packet& SP2Packet::operator >> (LPTSTR arg)
{
int nlen = lstrlen((LPTSTR)&m_pBuffer[m_currentPos]) * sizeof( TCHAR ) + sizeof( TCHAR );
if( !CheckRightPacketSize( nlen ) ) return *this;
memcpy(arg,&m_pBuffer[m_currentPos],nlen);
m_currentPos += nlen;
return *this;
}
SP2Packet& SP2Packet::operator >> (double &arg)
{
if( !CheckRightPacketSize( sizeof(double) ) ) return *this;
memcpy(&arg,&m_pBuffer[m_currentPos],sizeof(double));
m_currentPos += sizeof(double);
return *this;
}
SP2Packet& SP2Packet::operator >> (float &arg)
{
if( !CheckRightPacketSize( sizeof(float) ) ) return *this;
memcpy(&arg,&m_pBuffer[m_currentPos],sizeof(float));
m_currentPos += sizeof(float);
return *this;
}
SP2Packet& SP2Packet::operator >> (short &arg)
{
if( !CheckRightPacketSize( sizeof(short) ) ) return *this;
memcpy(&arg,&m_pBuffer[m_currentPos],sizeof(short));
m_currentPos += sizeof(short);
return *this;
}
//SP2Packet& SP2Packet::operator >> (CHARACTER &arg)
//{
// arg.ApplyData( *this );
//
// return *this;
//}
SP2Packet& SP2Packet::operator >> ( ioHashString &arg )
{
int nlen = lstrlen((LPTSTR)&m_pBuffer[m_currentPos]) * sizeof( TCHAR ) + sizeof( TCHAR );
if( !CheckRightPacketSize( nlen ) ) return *this;
arg = reinterpret_cast<const char*>(&m_pBuffer[m_currentPos]);
m_currentPos += nlen;
return *this;
}
SP2Packet& SP2Packet::operator >> (CQueryData &arg)
{
arg.SetBuffer(&m_pBuffer[m_currentPos]);
m_currentPos += sizeof(QueryHeader);
m_currentPos += arg.GetBufferSize();
*m_packet_header.m_Size = m_currentPos;
return *this;
}
SP2Packet& SP2Packet::operator >> (CQueryResultData &arg)
{
arg.SetBuffer(&m_pBuffer[m_currentPos]);
m_currentPos += sizeof(QueryResultHeader);
m_currentPos += arg.GetResultBufferSize();
*m_packet_header.m_Size = m_currentPos;
return *this;
}