mirgroup.cpp
上传用户:marco7834
上传日期:2010-02-24
资源大小:82k
文件大小:6k
源码类别:

游戏引擎

开发平台:

Visual C++

  1. #include "mirgroup.h"
  2. #include <windowsx.h>
  3. #include <stdio.h>
  4. typedef char SHORTSTRING[64];
  5. typedef struct
  6. {
  7. char AreaName[64];
  8. char IpAddress[16];
  9. SHORTSTRING ServerCaption[10];
  10. SHORTSTRING ServerName[10];
  11. DWORD dwServerCount;
  12. }AREAINFO;
  13. AREAINFO m_AreaInfo[100];
  14. int m_AreaCount = 0;
  15. char m_grpBuffer[128 * 1024];
  16. DWORD *dwOfsList  = (DWORD*)&m_grpBuffer[12];
  17. char * GetStreamPtr( int id )
  18. {
  19. if( id < 0 || id >= m_AreaCount * 2 + 2 )
  20. return NULL;
  21. return (&m_grpBuffer[dwOfsList[id * 2]]);
  22. }
  23. int GetStream( int id, char * stream )
  24. {
  25. if( id < 0 || id >= m_AreaCount * 2 + 2 )
  26. return NULL;
  27. memcpy( (void*)stream, (void*)&m_grpBuffer[dwOfsList[id * 2]], dwOfsList[id * 2 + 1] );
  28. stream[dwOfsList[id * 2 + 1]] = 0x0a;
  29. stream[dwOfsList[id * 2 + 1]+1] = 0;
  30. return 1;
  31. }
  32. int GetSetting( char * stream, char * segment, char * name, char * setting )
  33. {
  34. char mtmp[3024];
  35. int ilen = 0;
  36. if( stream == 0 )
  37. return 0;
  38. if( segment == 0 )
  39. return 0;
  40. if( name == 0 )
  41. return 0;
  42. if( setting == 0 )
  43. return 0;
  44. setting[0] = '';
  45. ilen = strlen( stream );
  46. int iptr = -1;
  47. int lstart = 0;
  48. int sstart = 0;
  49. #define FLAG_SEARCHSEG 0
  50. #define FLAG_SEARCHNAME 0xff
  51. #define FLAG_GETSETTING 0xff00
  52. int iflag = FLAG_SEARCHSEG;
  53. int i = 0;
  54. for( i = 0;i < ilen;i ++ )
  55. {
  56. if( stream[i] == 0x0a || stream[i] == 0x0d )
  57. {
  58. if( iflag == FLAG_GETSETTING )
  59. {
  60. memcpy( (void*)mtmp, (void*)&stream[sstart], i - sstart );
  61. mtmp[i - sstart] = '';
  62. strcpy( setting, mtmp );
  63. //printf( "Found %sn", mtmp );
  64. return 1;
  65. }
  66. lstart = i + 1;
  67. }
  68. if( iflag == FLAG_SEARCHNAME )
  69. {
  70. if( stream[i] == '=' )
  71. {
  72. memcpy( (void*)mtmp, (void*)&stream[lstart],i - lstart );
  73. mtmp[i - lstart] = '';
  74. if( stricmp( mtmp, name ) == 0 )
  75. {
  76. iflag = FLAG_GETSETTING;
  77. sstart = i + 1;
  78. }
  79. printf( "%sn", mtmp );
  80. }
  81. }
  82. if( stream[i] == '[' )
  83. {
  84. if( iflag == FLAG_SEARCHNAME )
  85. {
  86. return 0;
  87. }
  88. iptr = i + 1;
  89. }
  90. if( stream[i] == ']' )
  91. {
  92. memcpy( (void*)mtmp, (void*)&stream[iptr], i - iptr);
  93. mtmp[i-iptr] = '';
  94. printf( "%sn", mtmp );
  95. if( stricmp( mtmp, segment ) == 0 )
  96. iflag = FLAG_SEARCHNAME;
  97. }
  98. }
  99. return 0;
  100. }
  101. int UnGroupStream( char * stream, int size )
  102. {
  103. int i = 0;
  104. if( stream == NULL )
  105. return 0;
  106. if( size == 0 )
  107. return 0;
  108. for( i = 0;i < size;i ++ )
  109. {
  110. if( stream[i] & 1 )
  111. {
  112. stream[i] --;
  113. }
  114. else
  115. {
  116. stream[i] ++;
  117. }
  118. }
  119. stream[size] = '';
  120. return 1;
  121. }
  122. int ProcAreaInfo()
  123. {
  124. char tmps[200];
  125. char name[3048];
  126. char * ptrStream;
  127. int pptr = 0;
  128. int i = 0;
  129. int iptr = 0;
  130. ptrStream = GetStreamPtr( 0 );
  131. if( ptrStream == NULL )
  132. return 0;
  133. GetSetting( ptrStream, "main", "name", name );
  134. // MessageBox(0,name, 0, 0 );
  135. int ilen = strlen( name );
  136. for( i = 0;i <= ilen;i ++ )
  137. {
  138. if( name[i] == ';' || name[i] == '' )
  139. {
  140. memcpy( (void*)tmps, (void*)&name[iptr], i - iptr );
  141. tmps[i-iptr] = '';
  142. strcpy( m_AreaInfo[pptr].AreaName, tmps );
  143. pptr ++;
  144. iptr = i + 1;
  145. }
  146. }
  147. for( i = 0;i < m_AreaCount;i ++ )
  148. {
  149. ptrStream = GetStreamPtr( i * 2 + 1 );
  150. GetStream( i * 2 + 1, name );
  151. if( ptrStream == NULL )
  152. return 0;
  153. if( !GetSetting( name, "server","servercount", tmps ))
  154. {
  155. if( !GetSetting( name, "group", "groupnum", tmps ))
  156. {
  157. return 0;
  158. }
  159. }
  160. pptr = atoi( tmps );
  161. m_AreaInfo[i].dwServerCount = pptr;
  162. if( pptr <= 0 || pptr >= 9 )
  163. return 0;
  164. //if( i > 50 && i < 60 )MessageBox( 0, name, 0, 0 );
  165. for( iptr = 0;iptr < pptr;iptr ++ )
  166. {
  167. sprintf( tmps, "Server%dCaption", iptr + 1);
  168. if( !GetSetting( name, "server", tmps, m_AreaInfo[i].ServerCaption[iptr] ))
  169. {
  170. sprintf( tmps, "Group%d", iptr );
  171. if( !GetSetting( name, "group", tmps, m_AreaInfo[i].ServerCaption[iptr] ))
  172. {
  173. return 0;
  174. }
  175. }
  176. sprintf( tmps, "Server%dName", iptr + 1 );
  177. if( !GetSetting( name, "server", tmps, m_AreaInfo[i].ServerName[iptr] ) )
  178. {
  179. sprintf( tmps, "GroupNick%d", iptr );
  180. if( !GetSetting( name, "group", tmps, m_AreaInfo[i].ServerName[iptr] ))
  181. {
  182. return 0;
  183. }
  184. }
  185. // MessageBox( 0, m_AreaInfo[i].ServerName[iptr], 0, 0 );
  186. }
  187. ptrStream = GetStreamPtr( i * 2 + 2 );
  188. if( ptrStream == NULL )
  189. return 0;
  190. GetSetting( ptrStream, "setup", "ServerAddr", m_AreaInfo[i].IpAddress );
  191. }
  192. return 1;
  193. }
  194. int SetGroupFile( char * file )
  195. {
  196. // DWORD *pdw = (DWORD*)m_grpBuffer;
  197. int filelen = 0;
  198. int i = 0;
  199. FILE * fp;
  200. fp = fopen(  file, "rb" );
  201. if( fp == NULL )
  202. return 0;
  203. fseek( fp, 0, SEEK_END );
  204. filelen = ftell( fp );
  205. fseek( fp, 0, SEEK_SET );
  206. fread( (void*)m_grpBuffer, filelen, 1,fp );
  207. fclose( fp );
  208. m_AreaCount = (int)m_grpBuffer[8] & 0xff;
  209. UnGroupStream( (char*)&m_grpBuffer[dwOfsList[0]], filelen - dwOfsList[0] );
  210. if( !ProcAreaInfo())
  211. return 0;
  212. return 1;
  213. }
  214. char tmpBufname[3048];
  215. int SetAreaList( HWND hWnd )
  216. {
  217. int i = 0;
  218. for( i = 0;i < m_AreaCount;i++)
  219. {
  220. ComboBox_AddString( hWnd, m_AreaInfo[i].AreaName );
  221. }
  222. ComboBox_SetCurSel( hWnd, 0 );
  223. return 1;
  224. }
  225. int SetServerCaptionList( HWND hWnd, int AreaID )
  226. {
  227. int i = 0;
  228. int icnt = 0;
  229. icnt = ComboBox_GetCount( hWnd );
  230. ComboBox_ResetContent( hWnd );
  231. for( i = 0;i < icnt;i ++ )
  232. {
  233. ComboBox_DeleteString( hWnd, i );
  234. }
  235. if( AreaID >= 0 && AreaID < m_AreaCount )
  236. {
  237. for( i = 0;i < (int)m_AreaInfo[AreaID].dwServerCount;i ++ )
  238. {
  239. ComboBox_AddString( hWnd, m_AreaInfo[AreaID].ServerCaption[i] );
  240. }
  241. ComboBox_SetCurSel( hWnd, 0 );
  242. return 1;
  243. }
  244. return 0;
  245. }
  246. int GetServerName( int AreaID, int ServerIndex, char * ServerName )
  247. {
  248. if( AreaID >= 0 && AreaID < m_AreaCount )
  249. {
  250. if( ServerIndex >= 0 && ServerIndex < (int)m_AreaInfo[AreaID].dwServerCount )
  251. {
  252. strcpy( ServerName, m_AreaInfo[AreaID].ServerName[ServerIndex] );
  253. return 1;
  254. }
  255. return 0;
  256. }
  257. return 0;
  258. }
  259. int GetIpAddress( int AreaID, char * IpAddr )
  260. {
  261. if( AreaID >= 0 && AreaID < m_AreaCount )
  262. {
  263. strcpy( IpAddr, m_AreaInfo[AreaID].IpAddress );
  264. return 1;
  265. }
  266. return 0;
  267. }