KRoleBlockProcess.cpp
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:4k
源码类别:

模拟服务器

开发平台:

C/C++

  1. // KRoleBlockProcess.cpp: implementation of the KRoleBlockProcess class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. //#include "RoleDBServer.h"
  6. #include "KRoleBlockProcess.h"
  7. #include "memory.h"
  8. #include "windows.h"
  9. /*#ifdef _DEBUG
  10. #undef THIS_FILE
  11. static char THIS_FILE[]=__FILE__;
  12. #define new DEBUG_NEW
  13. #endif
  14. */
  15. #define NULL 0
  16. //////////////////////////////////////////////////////////////////////
  17. // Construction/Destruction
  18. //////////////////////////////////////////////////////////////////////
  19. KRoleBlockProcess::KRoleBlockProcess()
  20. {
  21. m_pProcessData = 0;
  22. m_nStreamSize = 0;
  23. m_nCurDataLen = 0;
  24. }
  25. KRoleBlockProcess::~KRoleBlockProcess()
  26. {
  27. if (m_pProcessData)
  28. delete m_pProcessData;
  29. }
  30. //获得每块长度为nBlockSize大小的,第nNo块的KBlock
  31. size_t KRoleBlockProcess::GetBlockPtr(KBlock * pBlock, unsigned long nNo, size_t nBlockSize)
  32. {
  33. if (!pBlock || nNo < 0 || nBlockSize <= sizeof(KBlock) - 1 ) return 0;
  34. if (!m_pProcessData || m_pProcessData->nDataLen < 0) return 0;
  35. size_t nMemSize = 0;
  36. if (nNo == 0)
  37. {
  38. pBlock->bDataState = 1;
  39. pBlock->nOffset =  m_pProcessData->nDataLen;
  40. pBlock->nProtoId = m_pProcessData->nProtoId;
  41. if (m_pProcessData->nDataLen + sizeof(KBlock) - 1 <=  nBlockSize)
  42. {
  43. nMemSize = m_pProcessData->nDataLen;
  44. }
  45. else 
  46. nMemSize = nBlockSize - sizeof(KBlock) + 1;
  47. }
  48. else 
  49. {
  50. pBlock->bDataState = 0;
  51. pBlock->nOffset =  nNo * (nBlockSize - sizeof(KBlock) + 1) ;
  52. pBlock->nProtoId = m_pProcessData->nProtoId;
  53. if (m_pProcessData->nDataLen < pBlock->nOffset + nBlockSize - sizeof(KBlock) + 1)
  54. {
  55. nMemSize =  m_pProcessData->nDataLen - pBlock->nOffset;
  56. }
  57. else
  58. {
  59. nMemSize = nBlockSize - sizeof(KBlock) + 1;
  60. }
  61. }
  62. pBlock->nDataLen = nMemSize;
  63. if (!nNo)
  64. memcpy(&pBlock->pDataBuffer[0], m_pProcessData->pDataBuffer, nMemSize);
  65. else 
  66. memcpy(&pBlock->pDataBuffer[0], m_pProcessData->pDataBuffer + pBlock->nOffset, nMemSize );
  67. return nMemSize + sizeof(KBlock) - 1;
  68. }
  69. //生成Steam
  70. unsigned long KRoleBlockProcess::SetStream(TStreamData * pData, size_t nStreamSize)
  71. {
  72. if (!m_pProcessData || m_nStreamSize < nStreamSize )
  73. {
  74. GenStream(nStreamSize);
  75. }
  76. memcpy(m_pProcessData , pData, nStreamSize);
  77. return nStreamSize;
  78. }
  79. unsigned long KRoleBlockProcess::GenStream(size_t nStreamSize)
  80. {
  81. if (m_pProcessData)
  82. {
  83. delete []m_pProcessData;
  84. m_pProcessData = NULL;
  85. }
  86. m_pProcessData = (TStreamData*) new char [nStreamSize];
  87. m_nStreamSize = nStreamSize;
  88. return nStreamSize;
  89. }
  90. //设置某一块
  91. unsigned long KRoleBlockProcess::SetBlock(KBlock * pBlock, unsigned long nNo, size_t nBlockSize)
  92. {
  93. if (!pBlock || nNo < 0 || nBlockSize <= sizeof(KBlock) - 1 ) return 0;
  94. int nOffset = 0;
  95. if (pBlock->nDataLen > nBlockSize - sizeof(KBlock) + 1 )  return 0;
  96. if (pBlock->bDataState == 1)
  97. {
  98. m_pProcessData->nDataLen = pBlock->nOffset ;
  99. m_pProcessData->nProtoId = pBlock->nProtoId;
  100. nOffset = 0;
  101. }
  102. //if (nNo * nBlockSize > m_pProcessData->nDataLen + sizeof)
  103. memcpy(&m_pProcessData->pDataBuffer[0] + (nBlockSize - sizeof(KBlock) + 1) * nNo, &pBlock->pDataBuffer[0] , pBlock->nDataLen);
  104. m_nCurDataLen  += pBlock->nDataLen;
  105. return pBlock->nDataLen;
  106. }
  107. unsigned long KRoleBlockProcess::SetBlock(KBlock * pBlock)
  108. {
  109. if (!pBlock ) return 0;
  110. int nOffset = 0;
  111. if (pBlock->bDataState == 1)
  112. {
  113. m_pProcessData->nDataLen = pBlock->nOffset ;
  114. m_pProcessData->nProtoId = pBlock->nProtoId;
  115. nOffset = 0;
  116. }
  117. else 
  118. nOffset = pBlock->nOffset;
  119. memcpy(&m_pProcessData->pDataBuffer[0] + nOffset , &pBlock->pDataBuffer[0] , pBlock->nDataLen);
  120. m_nCurDataLen  += pBlock->nDataLen;
  121. return pBlock->nDataLen;
  122. }