Clone of Akilla's ac2d @ https://github.com/deregtd/AC2D

cPacket.cpp 4.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. #include "stdafx.h"
  2. #include "cPacket.h"
  3. cPacket::cPacket()
  4. {
  5. m_iLength = 0;
  6. m_iMaxLength = 1024;
  7. m_pbDataPtr = m_pbData = new BYTE[m_iMaxLength];
  8. }
  9. cPacket::~cPacket()
  10. {
  11. delete []m_pbData;
  12. }
  13. void cPacket::Add(std::string & szInput)
  14. {
  15. int iStringLen = (int) szInput.length();
  16. if( m_iLength + iStringLen > m_iMaxLength )
  17. MessageBox(NULL, "Fix this", "Now", MB_ICONERROR);
  18. // strings are preceded by 2-byte length...
  19. Add( (WORD) iStringLen );
  20. // ...followed by the string characters with no null terminator
  21. memcpy( m_pbDataPtr, szInput.c_str(), iStringLen );
  22. m_pbDataPtr += iStringLen;
  23. m_iLength += iStringLen;
  24. AlignDWORD();
  25. }
  26. void cPacket::AddString32L(std::string & szInput)
  27. {
  28. // From the ACE source:
  29. // " 32L strings are crazy. the only place this is known as of time of writing this is in the
  30. // Login header packet. it's a DWORD of the data length, followed by a packed word of the
  31. // string length. for most cases, this means the string comes out with a 1 or 2 character
  32. // prefix that just needs to get tossed. "
  33. int iStringLen = (int)szInput.length();
  34. int packedStringLengthBytes = 1 + int(iStringLen > 255);
  35. if (m_iLength + iStringLen > m_iMaxLength)
  36. MessageBox(NULL, "Fix this", "Now", MB_ICONERROR);
  37. // 32L strings are preceded by a DWORD of data length...
  38. Add((DWORD)iStringLen + packedStringLengthBytes);
  39. // and a packed word of the string length
  40. if (iStringLen > 255) {
  41. Add((WORD)iStringLen);
  42. }
  43. else {
  44. Add((BYTE)iStringLen);
  45. }
  46. // ...followed by the string characters with no null terminator
  47. memcpy(m_pbDataPtr, szInput.c_str(), iStringLen);
  48. m_pbDataPtr += iStringLen;
  49. m_iLength += iStringLen;
  50. AlignDWORD();
  51. }
  52. void cPacket::Set(DWORD position, WORD dwInput)
  53. {
  54. if (position + 2 <= (DWORD) m_iLength)
  55. {
  56. *((WORD *) (m_pbData + position)) = dwInput;
  57. }
  58. else
  59. MessageBox(NULL, "Fix this", "Now", MB_ICONERROR);
  60. }
  61. void cPacket::AlignDWORD()
  62. {
  63. //DWORD align
  64. DWORD dwZero = 0;
  65. DWORD dwDWORDAlign = ((m_iLength & 3) == 0) ? 0 : (4 - (m_iLength & 3));
  66. memcpy( m_pbDataPtr, (void *) &dwZero, dwDWORDAlign );
  67. m_pbDataPtr += dwDWORDAlign;
  68. m_iLength += dwDWORDAlign;
  69. }
  70. void cPacket::Add(QWORD qwInput)
  71. {
  72. if (m_iLength + (int) sizeof(qwInput) > m_iMaxLength)
  73. MessageBox(NULL, "Fix this", "Now", MB_ICONERROR);
  74. *((QWORD *)m_pbDataPtr) = qwInput;
  75. m_pbDataPtr += sizeof(qwInput);
  76. m_iLength += sizeof(qwInput);
  77. }
  78. void cPacket::Add(DWORD dwInput)
  79. {
  80. if (m_iLength + (int) sizeof(dwInput) > m_iMaxLength)
  81. MessageBox(NULL, "Fix this", "Now", MB_ICONERROR);
  82. *((DWORD *)m_pbDataPtr) = dwInput;
  83. m_pbDataPtr += sizeof(dwInput);
  84. m_iLength += sizeof(dwInput);
  85. }
  86. void cPacket::Add(WORD dwInput)
  87. {
  88. if (m_iLength + (int) sizeof(dwInput) > m_iMaxLength)
  89. MessageBox(NULL, "Fix this", "Now", MB_ICONERROR);
  90. *((WORD *) m_pbDataPtr) = dwInput;
  91. m_pbDataPtr += sizeof(dwInput);
  92. m_iLength += sizeof(dwInput);
  93. }
  94. void cPacket::Add(BYTE dwInput)
  95. {
  96. if (m_iLength + (int) sizeof(dwInput) > m_iMaxLength)
  97. MessageBox(NULL, "Fix this", "Now", MB_ICONERROR);
  98. *((BYTE *) m_pbDataPtr) = dwInput;
  99. m_pbDataPtr += sizeof(dwInput);
  100. m_iLength += sizeof(dwInput);
  101. }
  102. void cPacket::Add(cPacket *pPacket)
  103. {
  104. int iLen = pPacket->GetLength();
  105. if (m_iLength + iLen > m_iMaxLength)
  106. MessageBox(NULL, "Fix this", "Now", MB_ICONERROR);
  107. memcpy(m_pbDataPtr, pPacket->GetData(), iLen);
  108. m_pbDataPtr += iLen;
  109. m_iLength += iLen;
  110. }
  111. void cPacket::Add(void *dwInput, int iLen)
  112. {
  113. if (m_iLength + iLen > m_iMaxLength)
  114. MessageBox(NULL, "Fix this", "Now", MB_ICONERROR);
  115. memcpy(m_pbDataPtr, dwInput, iLen);
  116. m_pbDataPtr += iLen;
  117. m_iLength += iLen;
  118. }
  119. void cPacket::Add(stTransitHeader *Transit)
  120. {
  121. if (m_iLength + (int) sizeof(stTransitHeader) > m_iMaxLength)
  122. MessageBox(NULL, "Fix this", "Now", MB_ICONERROR);
  123. memcpy(m_pbDataPtr, Transit, sizeof(stTransitHeader));
  124. m_pbDataPtr += sizeof(stTransitHeader);
  125. m_iLength += sizeof(stTransitHeader);
  126. }
  127. void cPacket::Add(stFragmentHeader *Fragment)
  128. {
  129. if (m_iLength + (int) sizeof(stFragmentHeader) > m_iMaxLength)
  130. MessageBox(NULL, "Fix this", "Now", MB_ICONERROR);
  131. memcpy(m_pbDataPtr, Fragment, sizeof(stFragmentHeader));
  132. m_pbDataPtr += sizeof(stFragmentHeader);
  133. m_iLength += sizeof(stFragmentHeader);
  134. }
  135. BYTE * cPacket::GetData()
  136. {
  137. return m_pbData;
  138. }
  139. int cPacket::GetLength()
  140. {
  141. return m_iLength;
  142. }
  143. stTransitHeader * cPacket::GetTransit()
  144. {
  145. //return &m_Transit;
  146. return (stTransitHeader *)GetData();
  147. }
  148. BYTE * cPacket::GetPayload()
  149. {
  150. return m_pbData + sizeof(stTransitHeader);
  151. }