msglist.cpp
上传用户:sycq158
上传日期:2008-10-22
资源大小:15361k
文件大小:6k
源码类别:

游戏

开发平台:

Visual C++

  1. #include "global.h"
  2. #include "msglist.h"
  3. CRITICAL_SECTION  g_SyncFlag;
  4. //-----------------------------------------------------------------------------
  5. // Name: 
  6. // Desc: 
  7. //-----------------------------------------------------------------------------
  8. CMsgList::CMsgList() {
  9. m_ppElems = NULL;
  10. m_nSize = 0;
  11. m_nHead = 0;
  12. m_nTail = 0;
  13. m_nTotal = 0;
  14. m_nMax = MAXLIST;
  15. m_bSync = false;
  16. }
  17. //-----------------------------------------------------------------------------
  18. // Name: 
  19. // Desc: 
  20. //-----------------------------------------------------------------------------
  21. CMsgList::~CMsgList() {
  22. DestroyList();
  23. if ( m_bSync )
  24. DeleteCriticalSection( &g_SyncFlag );
  25. }
  26. //-----------------------------------------------------------------------------
  27. // Name: 
  28. // Desc: 
  29. //-----------------------------------------------------------------------------
  30. void CMsgList::DestroyList() {
  31. // if( m_ppElems ) // cause unkown memory error
  32. // delete[] m_ppElems;
  33. // m_ppElems = NULL;
  34. }
  35. //-----------------------------------------------------------------------------
  36. // Name: 
  37. // Desc: 
  38. //-----------------------------------------------------------------------------
  39. bool CMsgList::CreatMsgList( unsigned int size, bool sync ) {
  40. if ( size < 0 || size > MAXLIST )
  41. return false;
  42. m_ppElems = (CMsgElem **)(new LPVOID[size]); // alloc memory
  43. if ( !m_ppElems )
  44. return false;
  45. m_nSize = size;
  46. if ( sync ) { // init sync flag
  47. m_bSync = true;
  48. InitializeCriticalSection( &g_SyncFlag );
  49. }
  50. return true;
  51. }
  52. //-----------------------------------------------------------------------------
  53. // Name: 
  54. // Desc: 
  55. //-----------------------------------------------------------------------------
  56. void CMsgList::Lock() { 
  57. if ( m_bSync )
  58. EnterCriticalSection( &g_SyncFlag ); 
  59. }
  60.  
  61. //-----------------------------------------------------------------------------
  62. // Name: 
  63. // Desc: 
  64. //-----------------------------------------------------------------------------
  65. void CMsgList::UnLock() {
  66. if ( m_bSync )
  67. LeaveCriticalSection( &g_SyncFlag ); 
  68. }
  69. //-----------------------------------------------------------------------------
  70. // Name: 
  71. // Desc: 
  72. //-----------------------------------------------------------------------------
  73. CMsgElem *CMsgList::Pop() {
  74. if ( IsEmpty() || NotInit() ) 
  75. return NULL;
  76. CMsgElem *pelem = m_ppElems[m_nTail];
  77. m_ppElems[m_nTail] = NULL;
  78. INCSCOPE( m_nTail, 0, m_nSize+1 ); // move pointer forward
  79. m_nTotal--; // reduce total number
  80. return pelem;
  81. }
  82. //-----------------------------------------------------------------------------
  83. // Name: 
  84. // Desc: 
  85. //-----------------------------------------------------------------------------
  86. CMsgElem *CMsgList::Peek() {
  87. if ( IsEmpty() || NotInit() ) 
  88. return NULL;
  89. return m_ppElems[m_nTail];
  90. }
  91. //-----------------------------------------------------------------------------
  92. // Name: 
  93. // Desc: 
  94. //-----------------------------------------------------------------------------
  95. bool CMsgList::Push( const CMsgElem *pelem ) {
  96. if ( NotInit() ) 
  97. return false;
  98. if ( IsFull() && !EnlargeSize() )
  99. return false;
  100. m_ppElems[m_nHead] = new CMsgElem();
  101. if ( !m_ppElems[m_nHead] )
  102. return false;
  103. m_ppElems[m_nHead]->m_nMsg = pelem->m_nMsg;
  104. m_ppElems[m_nHead]->m_dwMsgType = pelem->m_dwMsgType;
  105. m_ppElems[m_nHead]->m_nParamSize = pelem->m_nParamSize;
  106. m_ppElems[m_nHead]->m_psBuffer = new char[pelem->m_nParamSize];
  107. if ( !(m_ppElems[m_nHead]->m_psBuffer) ) {
  108. delete m_ppElems[m_nHead];
  109. return false;
  110. }
  111. memcpy( m_ppElems[m_nHead]->m_psBuffer, pelem->m_psBuffer, 
  112. pelem->m_nParamSize );
  113. INCSCOPE( m_nHead, 0, m_nSize+1 ); // move pointer forward
  114. m_nTotal++; // increase total number
  115. return true;
  116. }
  117. //-----------------------------------------------------------------------------
  118. // Name: 
  119. // Desc: 
  120. //-----------------------------------------------------------------------------
  121. bool CMsgList::EnlargeSize() {
  122. if ( m_nSize >= m_nMax || NotInit() )
  123. return false;
  124. int newsize = INCSTEP + m_nSize;
  125. if ( newsize > m_nMax)
  126. newsize = m_nMax;
  127. CMsgElem **temp = (CMsgElem **)(new LPVOID[m_nSize]);
  128. if ( !temp )
  129. return false;
  130. memcpy ( temp, m_ppElems, m_nSize*sizeof(LPVOID) );
  131. // delete[] m_ppElems;
  132. m_ppElems = (CMsgElem **)(new LPVOID[newsize]);
  133. if ( !m_ppElems )
  134. return false;
  135. int size = m_nSize - m_nTail;
  136. memcpy( m_ppElems, temp+m_nTail, size*sizeof(LPVOID) );
  137. memcpy( m_ppElems+size, temp, m_nTail*sizeof(LPVOID) );
  138. // delete[] temp;
  139. m_nTail = 0;
  140. m_nHead = m_nSize;
  141. m_nSize = newsize;
  142. return true;
  143. }
  144. //-----------------------------------------------------------------------------
  145. // Name: 
  146. // Desc: 
  147. //-----------------------------------------------------------------------------
  148. CMsgElem::CMsgElem() {
  149. m_nMsg = 0;
  150. m_dwMsgType = 0;
  151. m_nParamSize = 0;
  152. m_psBuffer = NULL;
  153. }
  154. //-----------------------------------------------------------------------------
  155. // Name: 
  156. // Desc: 
  157. //-----------------------------------------------------------------------------
  158. CMsgElem::~CMsgElem() {
  159. if ( !m_psBuffer )
  160. delete[] m_psBuffer;
  161. }
  162. //-----------------------------------------------------------------------------
  163. // Name: 
  164. // Desc: 
  165. //-----------------------------------------------------------------------------
  166. bool CMsgElem::CreateMsgElem( int msg, LPCSTR param, int size, DWORD type ) {
  167. if ( param && size > 0 ) {
  168. m_psBuffer = new char[size];
  169. if ( !m_psBuffer )
  170. return false;
  171. memcpy( m_psBuffer, param, size );
  172. m_nParamSize = size;
  173. }
  174. else {
  175. if ( !m_psBuffer ) {
  176. delete[] m_psBuffer;
  177. m_psBuffer = NULL;
  178. }
  179. m_nParamSize = 0;
  180. }
  181. m_nMsg = msg;
  182. m_dwMsgType = type;
  183. return true;
  184. }
  185. //-----------------------------------------------------------------------------
  186. // Name: 
  187. // Desc: 
  188. //-----------------------------------------------------------------------------
  189. bool CMsgElem::CreateMsgElemFromBuf( LPCSTR buf, int &size, DWORD type ) {
  190. int *piParam = (int *)buf;
  191. size = piParam[1] + sizeof(int)*2;
  192. return CreateMsgElem( piParam[0], (LPCSTR)(piParam+2), piParam[1], type );
  193. }
  194. //-----------------------------------------------------------------------------
  195. // Name: 
  196. // Desc: 
  197. //-----------------------------------------------------------------------------