123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190 |
- #include "stdafx.h"
- #include "cPacket.h"
- cPacket::cPacket()
- {
- m_iLength = 0;
- m_iMaxLength = 1024;
- m_pbDataPtr = m_pbData = new BYTE[m_iMaxLength];
- }
- cPacket::~cPacket()
- {
- delete []m_pbData;
- }
- void cPacket::Add(std::string & szInput)
- {
- int iStringLen = (int) szInput.length();
- if( m_iLength + iStringLen > m_iMaxLength )
- MessageBox(NULL, "Fix this", "Now", MB_ICONERROR);
- // strings are preceded by 2-byte length...
- Add( (WORD) iStringLen );
- // ...followed by the string characters with no null terminator
- memcpy( m_pbDataPtr, szInput.c_str(), iStringLen );
- m_pbDataPtr += iStringLen;
- m_iLength += iStringLen;
- AlignDWORD();
- }
- void cPacket::AddString32L(std::string & szInput)
- {
- // From the ACE source:
- // " 32L strings are crazy. the only place this is known as of time of writing this is in the
- // Login header packet. it's a DWORD of the data length, followed by a packed word of the
- // string length. for most cases, this means the string comes out with a 1 or 2 character
- // prefix that just needs to get tossed. "
- int iStringLen = (int)szInput.length();
- int packedStringLengthBytes = 1 + int(iStringLen > 255);
- if (m_iLength + iStringLen > m_iMaxLength)
- MessageBox(NULL, "Fix this", "Now", MB_ICONERROR);
- // 32L strings are preceded by a DWORD of data length...
- Add((DWORD)iStringLen + packedStringLengthBytes);
- // and a packed word of the string length
- if (iStringLen > 255) {
- Add((WORD)iStringLen);
- }
- else {
- Add((BYTE)iStringLen);
- }
-
- // ...followed by the string characters with no null terminator
- memcpy(m_pbDataPtr, szInput.c_str(), iStringLen);
- m_pbDataPtr += iStringLen;
- m_iLength += iStringLen;
- AlignDWORD();
- }
- void cPacket::Set(DWORD position, WORD dwInput)
- {
- if (position + 2 <= (DWORD) m_iLength)
- {
- *((WORD *) (m_pbData + position)) = dwInput;
- }
- else
- MessageBox(NULL, "Fix this", "Now", MB_ICONERROR);
- }
- void cPacket::AlignDWORD()
- {
- //DWORD align
- DWORD dwZero = 0;
- DWORD dwDWORDAlign = ((m_iLength & 3) == 0) ? 0 : (4 - (m_iLength & 3));
- memcpy( m_pbDataPtr, (void *) &dwZero, dwDWORDAlign );
- m_pbDataPtr += dwDWORDAlign;
- m_iLength += dwDWORDAlign;
- }
- void cPacket::Add(QWORD qwInput)
- {
- if (m_iLength + (int) sizeof(qwInput) > m_iMaxLength)
- MessageBox(NULL, "Fix this", "Now", MB_ICONERROR);
- *((QWORD *)m_pbDataPtr) = qwInput;
- m_pbDataPtr += sizeof(qwInput);
- m_iLength += sizeof(qwInput);
- }
- void cPacket::Add(DWORD dwInput)
- {
- if (m_iLength + (int) sizeof(dwInput) > m_iMaxLength)
- MessageBox(NULL, "Fix this", "Now", MB_ICONERROR);
- *((DWORD *)m_pbDataPtr) = dwInput;
- m_pbDataPtr += sizeof(dwInput);
- m_iLength += sizeof(dwInput);
- }
- void cPacket::Add(WORD dwInput)
- {
- if (m_iLength + (int) sizeof(dwInput) > m_iMaxLength)
- MessageBox(NULL, "Fix this", "Now", MB_ICONERROR);
- *((WORD *) m_pbDataPtr) = dwInput;
- m_pbDataPtr += sizeof(dwInput);
- m_iLength += sizeof(dwInput);
- }
- void cPacket::Add(BYTE dwInput)
- {
- if (m_iLength + (int) sizeof(dwInput) > m_iMaxLength)
- MessageBox(NULL, "Fix this", "Now", MB_ICONERROR);
- *((BYTE *) m_pbDataPtr) = dwInput;
- m_pbDataPtr += sizeof(dwInput);
- m_iLength += sizeof(dwInput);
- }
- void cPacket::Add(cPacket *pPacket)
- {
- int iLen = pPacket->GetLength();
- if (m_iLength + iLen > m_iMaxLength)
- MessageBox(NULL, "Fix this", "Now", MB_ICONERROR);
- memcpy(m_pbDataPtr, pPacket->GetData(), iLen);
- m_pbDataPtr += iLen;
- m_iLength += iLen;
- }
- void cPacket::Add(void *dwInput, int iLen)
- {
- if (m_iLength + iLen > m_iMaxLength)
- MessageBox(NULL, "Fix this", "Now", MB_ICONERROR);
- memcpy(m_pbDataPtr, dwInput, iLen);
- m_pbDataPtr += iLen;
- m_iLength += iLen;
- }
- void cPacket::Add(stTransitHeader *Transit)
- {
- if (m_iLength + (int) sizeof(stTransitHeader) > m_iMaxLength)
- MessageBox(NULL, "Fix this", "Now", MB_ICONERROR);
- memcpy(m_pbDataPtr, Transit, sizeof(stTransitHeader));
- m_pbDataPtr += sizeof(stTransitHeader);
- m_iLength += sizeof(stTransitHeader);
- }
- void cPacket::Add(stFragmentHeader *Fragment)
- {
- if (m_iLength + (int) sizeof(stFragmentHeader) > m_iMaxLength)
- MessageBox(NULL, "Fix this", "Now", MB_ICONERROR);
- memcpy(m_pbDataPtr, Fragment, sizeof(stFragmentHeader));
- m_pbDataPtr += sizeof(stFragmentHeader);
- m_iLength += sizeof(stFragmentHeader);
- }
- BYTE * cPacket::GetData()
- {
- return m_pbData;
- }
- int cPacket::GetLength()
- {
- return m_iLength;
- }
- stTransitHeader * cPacket::GetTransit()
- {
- //return &m_Transit;
- return (stTransitHeader *)GetData();
- }
- BYTE * cPacket::GetPayload()
- {
- return m_pbData + sizeof(stTransitHeader);
- }
|