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

cMessage.cpp 1.4KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. #include "stdafx.h"
  2. #include "cMessage.h"
  3. cMessage::cMessage(BYTE *pbData, const stFragmentHeader *Header)
  4. {
  5. m_dwSequence = Header->m_dwSequence;
  6. m_dwID = Header->m_dwID;
  7. m_wGroup = Header->m_wGroup;
  8. m_wCount = Header->m_wCount;
  9. m_pbData = new BYTE[m_wCount * 0x1C0];
  10. m_pbReceived = new bool[m_wCount];
  11. memset(m_pbReceived, 0, sizeof(bool) * m_wCount);
  12. m_wSize = 0;
  13. AddChunk(pbData, Header->m_wSize - sizeof(stFragmentHeader), Header->m_wIndex);
  14. }
  15. cMessage::~cMessage()
  16. {
  17. if (m_pbData) {
  18. delete []m_pbData;
  19. m_pbData = NULL;
  20. }
  21. if (m_pbReceived) {
  22. delete []m_pbReceived;
  23. m_pbReceived = NULL;
  24. }
  25. }
  26. void cMessage::AddChunk(BYTE *pbData, int iSize, int iIndex)
  27. {
  28. memcpy(&m_pbData[iIndex * 0x1C0], pbData, iSize);
  29. m_pbReceived[iIndex] = true;
  30. if ( iIndex == (m_wCount - 1) )
  31. {
  32. m_wSize = ((m_wCount - 1) * 0x1C0) + iSize;
  33. }
  34. else if (iSize < 0x1C0)
  35. {
  36. //Size should never be less than 0x1C0 if it isn't the last chunk
  37. MessageBox(NULL, "This should never happen", "Fragment bug!!", MB_OK);
  38. }
  39. SetStream(m_pbData, m_wSize);
  40. }
  41. bool cMessage::IsComplete(void)
  42. {
  43. for (int i = 0; i < m_wCount; i++)
  44. {
  45. if (m_pbReceived[i] != true) { return false; }
  46. }
  47. return true;
  48. }
  49. int cMessage::GetChunkCount() { return m_wCount; }
  50. int cMessage::GetLength() { return m_wSize; }
  51. BYTE *cMessage::GetData() { return m_pbData; }
  52. BYTE *cMessage::GetChunk(int iIndex){ return m_pbData + (0x1C0 * iIndex); }