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

模拟服务器

开发平台:

C/C++

  1. //-----------------------------------------//
  2. //                                         //
  3. //  File : S3PDBSocketParser.cpp    //
  4. // Author : Yang Xiaodong            //
  5. // Modified : 8/24/2002                //
  6. //                                         //
  7. //-----------------------------------------//
  8. #include "S3PDBSocketParser.h"
  9. //////////////////////////////////////////////////////////////////////
  10. // Construction/Destruction
  11. //////////////////////////////////////////////////////////////////////
  12. S3PDBSocketParser::S3PDBSocketParser()
  13. {
  14. Init();
  15. }
  16. S3PDBSocketParser::~S3PDBSocketParser()
  17. {
  18. Release();
  19. }
  20. BOOL S3PDBSocketParser::Encode( const IBYTE* pRawData,
  21.    unsigned long ulRawSize,
  22.    IBYTE* pEncodedData,
  23.    unsigned long& ulEncodedSize )
  24. {
  25. BOOL bRet = FALSE;
  26. if ( NULL != pRawData )
  27. {
  28. ulEncodedSize = ulRawSize;
  29. if ( NULL != pEncodedData )
  30. {
  31. memcpy( pEncodedData, pRawData, ulEncodedSize );
  32. }
  33. bRet = TRUE;
  34. }
  35. return bRet;
  36. }
  37. BOOL S3PDBSocketParser::Decode(IBYTE *lpData, DWORD &dwSize, IBYTE *lpRetData )
  38. {
  39. // Not completed...
  40. if ( NULL != lpRetData )
  41. memcpy( lpRetData, lpData, dwSize );
  42. return TRUE;
  43. }
  44. BOOL S3PDBSocketParser::Parse( IBYTE* lpData, DWORD dwSize, BOOL bEncrypt )
  45. {
  46. assert( ( NULL != lpData ) );
  47. BOOL bRet = FALSE;
  48. IBYTE* lpDataTemp = NULL;
  49. DWORD dwSizeTemp = 0;
  50. if ( bEncrypt )
  51. {
  52. dwSizeTemp = dwSize;
  53. if ( !( Decode( lpData, dwSizeTemp, NULL ) ) )
  54. {
  55. bRet = FALSE;
  56. return bRet;
  57. }
  58. if ( 0 == dwSizeTemp )
  59. {
  60. bRet = FALSE;
  61. return bRet;
  62. }
  63. lpDataTemp = new IBYTE[dwSizeTemp];
  64. if ( NULL != lpDataTemp )
  65. {
  66. dwSizeTemp = dwSize;
  67. if ( !( Decode( lpData, dwSizeTemp, lpDataTemp ) ))
  68. {
  69. bRet = FALSE;
  70. return bRet;
  71. }
  72. }
  73. else
  74. {
  75. bRet = FALSE;
  76. return bRet;
  77. }
  78. }
  79. else
  80. {
  81. dwSizeTemp = dwSize;
  82. if ( 0 == dwSizeTemp )
  83. {
  84. bRet = FALSE;
  85. return bRet;
  86. }
  87. lpDataTemp = new IBYTE[dwSizeTemp];
  88. if ( NULL != lpDataTemp )
  89. {
  90. memcpy( lpDataTemp, lpData, dwSizeTemp );
  91. }
  92. else
  93. {
  94. bRet = FALSE;
  95. return bRet;
  96. }
  97. }
  98. if ( dwSizeTemp > 0 )
  99. {
  100. if ( LOGIN_A_TAG == lpDataTemp[0] )
  101. {
  102. DWORD dwDataSize = 0;
  103. DWORD dwParam = 0;
  104. memcpy( &dwDataSize, &lpDataTemp[1], sizeof( DWORD ) );
  105. memcpy( &dwParam, &lpDataTemp[1+sizeof( DWORD )], sizeof( DWORD ) );
  106. if ( dwDataSize >= KLOGINSTRUCTHEADSIZE )
  107. {
  108. m_dwParam = dwParam;
  109. m_dwSize = dwDataSize - KLOGINSTRUCTHEADSIZE;
  110. if ( m_dwSize > 0 )
  111. {
  112. m_lpData = new IBYTE[m_dwSize];
  113. if ( NULL != m_lpData )
  114. {
  115. memcpy( m_lpData, &lpDataTemp[1+2*sizeof( DWORD )], m_dwSize );
  116. bRet = TRUE;
  117. }
  118. }
  119. else
  120. {
  121. m_lpData = NULL;
  122. bRet = TRUE;
  123. }
  124. }
  125. }
  126. }
  127. if ( NULL != lpDataTemp )
  128. {
  129. delete lpDataTemp;
  130. }
  131. return bRet;
  132. }
  133. void S3PDBSocketParser::Init()
  134. {
  135. m_dwParam = 0;
  136. m_lpData = NULL;
  137. m_dwSize = 0;
  138. }
  139. void S3PDBSocketParser::Release()
  140. {
  141. if ( NULL != m_lpData )
  142. {
  143. delete []m_lpData;
  144. m_lpData = NULL;
  145. }
  146. m_dwSize = 0;
  147. m_dwParam = 0;
  148. }