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

模拟服务器

开发平台:

C/C++

  1. #include "stdafx.h"
  2. #include "application.h"
  3. #include "resource.h"
  4. #include <process.h>
  5. #include <time.h>
  6. #include "GameServer.h"
  7. #include "GamePlayer.h"
  8. #include "KProtocolDef.h"
  9. #include "AccountLoginDef.h"
  10. #include "Buffer.h"
  11. #include "msg_define.h"
  12. #include "Macro.h"
  13. #include "../Engine/Src/KWin32.h"
  14. #include "../Engine/Src/KSG_MD5_String.h"
  15. #include "inoutmac.h"
  16. #include "SmartClient.h"
  17. using OnlineGameLib::Win32::CPackager;
  18. static const char szBishopClassName[] = "BishopClass";
  19. //static const DWORD g_dwServerIdentify = 0xAEFC07B5;
  20. HINSTANCE CBishopApp::m_hInst = NULL;
  21. CNetwork CBishopApp::m_theNetwork;
  22. CIntercessor *CBishopApp::m_pIntercessor = NULL;
  23. ///////////////////////////////////////////////////////////////////////////////////////////
  24. /*
  25. #include <nb30.h>
  26. typedef struct _ASTAT_
  27. {
  28. ADAPTER_STATUS adapt;
  29. NAME_BUFFER    NameBuff [30];
  30. }ASTAT, * PASTAT;
  31. // 输入参数:lana_num为网卡编号,一般地,从0开始,但在Windows 2000中并不一定是连续分配的 
  32. void getmac_one(int lana_num, ASTAT& Adapter)
  33. {
  34.     NCB ncb;
  35.     UCHAR uRetCode;
  36.     memset( &ncb, 0, sizeof(ncb) );
  37.     ncb.ncb_command = NCBRESET;
  38.     ncb.ncb_lana_num = lana_num;   
  39.     // 指定网卡号
  40. // 首先对选定的网卡发送一个NCBRESET命令,以便进行初始化 
  41.     uRetCode = Netbios( &ncb );
  42.     memset( &ncb, 0, sizeof(ncb) );
  43.     ncb.ncb_command = NCBASTAT;
  44.     ncb.ncb_lana_num = lana_num;     // 指定网卡号
  45.     strcpy( (char *)ncb.ncb_callname, "*               ");
  46.     ncb.ncb_buffer = (unsigned char *) &Adapter;
  47. // 指定返回的信息存放的变量 
  48.     ncb.ncb_length = sizeof(Adapter);
  49. // 接着,可以发送NCBASTAT命令以获取网卡的信息 
  50.     uRetCode = Netbios( &ncb );
  51.     if ( uRetCode == 0 )
  52.     {
  53. // 把网卡MAC地址格式化成常用的16进制形式,如0010-A4E4-5802 
  54. // lana_num
  55. //   Adapter.adapt.adapter_address[0],
  56. //   Adapter.adapt.adapter_address[1],
  57. //   Adapter.adapt.adapter_address[2],
  58. //   Adapter.adapt.adapter_address[3],
  59. //   Adapter.adapt.adapter_address[4],
  60. //   Adapter.adapt.adapter_address[5];
  61. }
  62. }
  63. int getmac_all(ASTAT** ppBuffer)
  64. {
  65. NCB ncb;
  66.     UCHAR uRetCode;
  67.     LANA_ENUM lana_enum;
  68. lana_enum.length = 0;
  69.     memset( &ncb, 0, sizeof(ncb) );
  70.     ncb.ncb_command = NCBENUM;
  71.     ncb.ncb_buffer = (unsigned char *) &lana_enum;
  72.     ncb.ncb_length = sizeof(lana_enum);
  73. // 向网卡发送NCBENUM命令,以获取当前机器的网卡信息,如有多少个网卡、每张网卡的编号等 
  74. uRetCode = Netbios( &ncb );
  75. if ( uRetCode == 0 && lana_enum.length > 0)
  76. {
  77. *ppBuffer = new ASTAT[lana_enum.length];
  78. // 对每一张网卡,以其网卡编号为输入编号,获取其MAC地址 
  79. for ( int i = 0; i < lana_enum.length; ++i)
  80. {
  81. getmac_one(lana_enum.lana[i], (*ppBuffer)[i]);
  82. }
  83. }
  84. return lana_enum.length;
  85. }
  86. */
  87. ///////////////////////////////////////////////////////////////////////////////////////////
  88. CBishopApp::CBishopApp()
  89. : m_theOnlyOneInstance( NULL, FALSE, TRUE, szBishopClassName )
  90. {
  91. }
  92. CBishopApp::CBishopApp( HINSTANCE hInstance )
  93. : m_theOnlyOneInstance( NULL, FALSE, TRUE, szBishopClassName )
  94. {
  95. m_hInst = hInstance;
  96. }
  97. CBishopApp::~CBishopApp()
  98. {
  99. }
  100. int CBishopApp::Run()
  101. {
  102. /* Seed the random-number generator with current time so that
  103.  * the numbers will be different every time we run.
  104.  */
  105. srand( ( unsigned )time( NULL ) );
  106. m_theNetwork.Create();
  107. /*
  108.  * To affirm account that it is used to check the application
  109.  */
  110. if ( LoginSystem() )
  111. {
  112. m_pIntercessor = new CIntercessor( 500, m_theNetwork );
  113. ASSERT( m_pIntercessor );
  114. MainDialog();
  115. }
  116. m_theNetwork.Destroy();
  117. return 0;
  118. }
  119. /*
  120.  * Log on to system
  121.  */
  122. bool CBishopApp::LoginSystem()
  123. {
  124. if ( WM_SERVER_LOGIN_SUCCESSFUL == ::DialogBox( m_hInst,
  125. MAKEINTRESOURCE( IDD_DLG_LOGIN ),
  126. NULL,
  127. ( DLGPROC )LoginDlgProc ) )
  128. {
  129. return true;
  130. }
  131. return false;
  132. }
  133. BOOL CALLBACK CBishopApp::LoginDlgProc( HWND hwndDlg,
  134. UINT message, 
  135. WPARAM wParam, 
  136. LPARAM lParam )
  137. {
  138. char szBuffer[MAX_PATH];
  139.     switch (message)
  140.     {
  141. case WM_SERVER_LOGIN_SUCCESSFUL:
  142. ::EndDialog( hwndDlg, WM_SERVER_LOGIN_SUCCESSFUL );
  143. break;
  144. case WM_SERVER_LOGIN_FAILED:
  145. switch( wParam )
  146. {
  147. case enumUsrNamePswdErr:
  148. ::LoadString( m_hInst, IDS_NAMEPSWD_ERROR, szBuffer, MAX_PATH );
  149. ::MessageBox( hwndDlg, szBuffer, NULL, MB_ICONEXCLAMATION );
  150. ::PostMessage( hwndDlg, WM_LEAVE_AFFIRM, 0L, 0L );
  151. break;
  152. case enumConnectFailed:
  153. case enumIPPortErr:
  154. ::LoadString( m_hInst, IDS_NETWORK_ERROR, szBuffer, MAX_PATH );
  155. ::MessageBox( hwndDlg, szBuffer, NULL, MB_ICONEXCLAMATION );
  156. ::PostMessage( hwndDlg, WM_LEAVE_AFFIRM, 0L, 0L );
  157. break;
  158. case enumException:
  159. default:
  160. ::MessageBox( hwndDlg, "Exception!", NULL, MB_ICONEXCLAMATION );
  161. ::EndDialog( hwndDlg, WM_SERVER_LOGIN_FAILED );
  162. break;
  163. }
  164. break;
  165. case WM_ENTER_AFFIRM:
  166. EnterToAffirm( hwndDlg );
  167. break;
  168. case WM_LEAVE_AFFIRM:
  169. LeaveToAffirm( hwndDlg );
  170. break;
  171. case WM_INITDIALOG:
  172. ::SetFocus( ::GetDlgItem( hwndDlg, IDC_EDIT_USERNAME ) );
  173. ::SetDlgItemText( hwndDlg, IDC_EDIT_LOGONTO_IP, m_theNetwork.GetAccSvrIP() );
  174. ::SetDlgItemInt( hwndDlg, IDC_EDIT_LOGONTO_PORT, m_theNetwork.GetAccSvrPort(), FALSE );
  175. break;
  176. case WM_COMMAND:
  177. switch ( LOWORD( wParam ) )
  178. {
  179. case IDOK:
  180. if ( CheckUserInfo( hwndDlg ) )
  181. {
  182. ::PostMessage( hwndDlg, WM_ENTER_AFFIRM, 0L, 0L );
  183. }
  184. break;
  185. case IDCANCEL:
  186. ::EndDialog( hwndDlg, WM_SERVER_LOGIN_FAILED );
  187. return TRUE; 
  188.     }
  189.     return FALSE;
  190. }
  191. void CBishopApp::EnterToAffirm( HWND hwndDlg )
  192. {
  193. ::EnableWindow( ::GetDlgItem( hwndDlg, IDC_EDIT_USERNAME ), FALSE );
  194. ::EnableWindow( ::GetDlgItem( hwndDlg, IDC_EDIT_PASSWORD ), FALSE );
  195. ::EnableWindow( ::GetDlgItem( hwndDlg, IDC_EDIT_LOGONTO_IP ), FALSE );
  196. ::EnableWindow( ::GetDlgItem( hwndDlg, IDC_EDIT_LOGONTO_PORT ), FALSE );
  197. ::EnableWindow( ::GetDlgItem( hwndDlg, IDOK ), FALSE );
  198. ::EnableWindow( ::GetDlgItem( hwndDlg, IDCANCEL ), FALSE );
  199. /*
  200.  * Start up a listening thread to wait a required confirm from the account server
  201.  */
  202. //DWORD dwThreadID = 0;
  203. //HANDLE hThread = ::CreateThread( NULL, 0, ServerLoginRoutine, ( void * )hwndDlg, 0, &dwThreadID );
  204. //SAFE_CLOSEHANDLE( hThread );
  205. ServerLoginRoutine( hwndDlg );
  206. }
  207. void CBishopApp::LeaveToAffirm( HWND hwndDlg )
  208. {
  209. ::EnableWindow( ::GetDlgItem( hwndDlg, IDC_EDIT_USERNAME ), TRUE );
  210. ::EnableWindow( ::GetDlgItem( hwndDlg, IDC_EDIT_PASSWORD ), TRUE );
  211. ::EnableWindow( ::GetDlgItem( hwndDlg, IDC_EDIT_LOGONTO_IP ), TRUE );
  212. ::EnableWindow( ::GetDlgItem( hwndDlg, IDC_EDIT_LOGONTO_PORT ), TRUE );
  213. ::EnableWindow( ::GetDlgItem( hwndDlg, IDOK ), TRUE );
  214. ::EnableWindow( ::GetDlgItem( hwndDlg, IDCANCEL ), TRUE );
  215. }
  216. bool CBishopApp::CheckUserInfo( HWND hwndDlg )
  217. {
  218. UINT nLen = 0;
  219. char szBuffer[MAX_PATH];
  220. if ( 0 == ( nLen = ::GetDlgItemText( hwndDlg, IDC_EDIT_USERNAME, szBuffer, MAX_PATH ) ) )
  221. {
  222. ::SetFocus( ::GetDlgItem( hwndDlg, IDC_EDIT_USERNAME ) );
  223. ::MessageBox( hwndDlg, "Please input a valid username!", "Warning", MB_ICONASTERISK );
  224. return false;
  225. }
  226. if ( 0 == ( nLen = ::GetDlgItemText( hwndDlg, IDC_EDIT_LOGONTO_IP, szBuffer, MAX_PATH ) ) )
  227. {
  228. ::SetFocus( ::GetDlgItem( hwndDlg, IDC_EDIT_LOGONTO_IP ) );
  229. ::MessageBox( hwndDlg, "Please input a valid IP!", "Warning", MB_ICONASTERISK );
  230. return false;
  231. }
  232. BOOL bTranslated = FALSE;
  233. if ( 0 == ( nLen = ::GetDlgItemInt( hwndDlg, IDC_EDIT_LOGONTO_PORT, &bTranslated, TRUE ) ) )
  234. {
  235. ::SetFocus( ::GetDlgItem( hwndDlg, IDC_EDIT_LOGONTO_PORT ) );
  236. ::MessageBox( hwndDlg, "Please input a valid port!", "Warning", MB_ICONASTERISK );
  237. return false;
  238. }
  239. return true;
  240. }
  241. DWORD WINAPI CBishopApp::ServerLoginRoutine( HWND hwndDlg )
  242. {
  243. ASSERT( hwndDlg );
  244. /*
  245.  * Ask for log on to the account server
  246.  */
  247. UINT nPort = 0;
  248. char szBuffer[MAX_PATH];
  249. char szUsername[NAME_PWD_EX_LEN];
  250. char szPassword[NAME_PWD_EX_LEN];
  251. ::GetDlgItemText( hwndDlg, IDC_EDIT_LOGONTO_IP, szBuffer, MAX_PATH );
  252. BOOL bTranslated = TRUE;
  253. nPort = ::GetDlgItemInt( hwndDlg, IDC_EDIT_LOGONTO_PORT, &bTranslated, TRUE );
  254. ::GetDlgItemText( hwndDlg, IDC_EDIT_USERNAME, szUsername, NAME_PWD_EX_LEN );
  255. ::GetDlgItemText( hwndDlg, IDC_EDIT_PASSWORD, szPassword, NAME_PWD_EX_LEN );
  256. g_theSmartClient.Open( szBuffer, nPort, hwndDlg, szUsername, szPassword );
  257. /* IClient *pAccSvrClient = m_theNetwork.CreateAccSvrClient( szBuffer, nPort );
  258. if ( !pAccSvrClient )
  259. {
  260. ::PostMessage( hwndDlg, WM_SERVER_LOGIN_FAILED, enumConnectFailed, 0L );
  261. SAFE_RELEASE( pAccSvrClient );
  262. return 1L;
  263. }
  264. */
  265. if ( !g_theSmartClient.Valid() )
  266. {
  267. // ::PostMessage( hwndDlg, WM_SERVER_LOGIN_FAILED, enumConnectFailed, 0L );
  268. return 1L;
  269. }
  270. // SAFE_RELEASE( pAccSvrClient );
  271. return 0L;
  272. }
  273. BOOL CBishopApp::RegisterMainWndClass()
  274. {
  275.     WNDCLASSEX wcx; 
  276.  
  277.     /*
  278.  * Fill in the window class structure with parameters 
  279.      * that describe the main window. 
  280.  */
  281.  
  282.     wcx.cbSize = sizeof( wcx ); // size of structure 
  283.     wcx.style = CS_HREDRAW | CS_VREDRAW; // redraw if size changes 
  284.     wcx.lpfnWndProc = ( WNDPROC )MainWndProc; // points to window procedure 
  285.     wcx.cbClsExtra = 0; // no extra class memory 
  286.     wcx.cbWndExtra = 0; // no extra window memory 
  287.     wcx.hInstance = m_hInst; // handle to instance 
  288.     wcx.hIcon = LoadIcon(NULL, 
  289.         IDI_APPLICATION); // predefined app. icon 
  290.     wcx.hCursor = LoadCursor(NULL, 
  291.         IDC_ARROW); // predefined arrow 
  292.     wcx.hbrBackground = ( HBRUSH )GetStockObject( 
  293.         WHITE_BRUSH); // white background brush 
  294.     wcx.lpszMenuName =  NULL; // name of menu resource 
  295.     wcx.lpszClassName = _T( "IntercessorClass" ); // name of window class 
  296.     wcx.hIconSm = ( HICON )LoadImage(m_hInst, // small class icon 
  297.         MAKEINTRESOURCE(IDI_LOCK),
  298.         IMAGE_ICON, 
  299.         GetSystemMetrics(SM_CXSMICON), 
  300.         GetSystemMetrics(SM_CYSMICON), 
  301.         LR_DEFAULTCOLOR); 
  302.  
  303.     /*
  304.  * Register the window class. 
  305.  */ 
  306.     return ::RegisterClassEx( &wcx );
  307. }
  308. UINT CBishopApp::MainDialog()
  309. {
  310. /*
  311.  * Create the main window as dialog. 
  312.  */
  313. /* if ( !RegisterMainWndClass() )
  314. {
  315. return 0L;
  316. }
  317. */
  318. HWND hwndMain = ::CreateDialog( m_hInst, 
  319. MAKEINTRESOURCE( IDD_DLG_INTERCESSOR ),
  320. NULL, 
  321. (DLGPROC)MainWndProc );
  322. ASSERT( hwndMain );
  323. ::ShowWindow( hwndMain, SW_SHOWNORMAL );
  324. ::UpdateWindow( hwndMain );
  325. BOOL bRet;
  326. MSG msg;
  327. while ( ( bRet = ::GetMessage( &msg, NULL, 0, 0 ) ) != 0 )
  328. {
  329. if ( !IsWindow( hwndMain ) || !IsDialogMessage( hwndMain, &msg ) )
  330. {
  331. ::TranslateMessage( &msg );
  332. ::DispatchMessage( &msg );
  333. }
  334. }
  335. return msg.wParam;
  336. }
  337. /*
  338.  *
  339.  * MainWndProc() - Main window callback procedure.
  340.  *  
  341.  */
  342. static UINT g_nViewTimer = 0x100;
  343. static UINT g_nTimer = 0;
  344. BOOL CALLBACK CBishopApp::MainWndProc( HWND hwnd, 
  345.                            UINT msg,
  346.                            WPARAM wParam,
  347.                            LPARAM lParam )
  348. {
  349. static size_t nGameServerNumber = 0;
  350. static char szInfo[64];
  351. UINT uLength = 0;
  352. TCHAR szAnnounceText[260];
  353. switch ( msg )
  354. {
  355. case WM_INITDIALOG:
  356. /*
  357.  * Initialize
  358.  */
  359. InitMainDlg( hwnd );
  360. return TRUE;
  361. break;
  362. case WM_CLOSE:
  363. if ( IDYES == ::MessageBox( hwnd, "Are you sure quit?", "Info", MB_YESNO | MB_ICONQUESTION ) )
  364. {
  365. if ( g_nTimer )
  366. {
  367. ::KillTimer( hwnd, g_nViewTimer );
  368. g_nTimer = 0;
  369. }
  370. CloseMainDlg( hwnd );
  371. if ( m_pIntercessor )
  372. {
  373. m_pIntercessor->Destroy();
  374. }
  375. ::DestroyWindow( hwnd );
  376. ::PostQuitMessage( 0 );
  377. }
  378. return TRUE;
  379. break;
  380. case WM_TIMER:
  381. if ( g_nViewTimer == wParam )
  382. {
  383. LONG nc = CGamePlayer::GetCapability();
  384. LONG nw = CGamePlayer::GetWorking();
  385. sprintf( szInfo, "%d / %d", nw, nc );
  386. ::SetDlgItemText( hwnd, IDC_STATIC_TASK, ( LPCTSTR )szInfo );
  387. }
  388. break;
  389. case WM_COMMAND:
  390. switch ( wParam )
  391. {
  392. case IDOK:
  393. ::EnableWindow( GetDlgItem( hwnd, IDOK ), FALSE );
  394. ::EnableWindow( GetDlgItem( hwnd, IDC_EDIT_CLIENT_PORT ), FALSE );
  395. ::EnableWindow( GetDlgItem( hwnd, IDC_EDIT_GAMESVR_PORT ), FALSE );
  396. ::EnableWindow( GetDlgItem( hwnd, IDC_EDIT_ROLESVRIP ), FALSE );
  397. ::EnableWindow( GetDlgItem( hwnd, IDC_EDIT_ROLESVRPORT ), FALSE );
  398. ::CheckDlgButton( hwnd, IDC_CHECK_PLAYER, BST_CHECKED );
  399. ::CheckDlgButton( hwnd, IDC_CHECK_GAMESVR, BST_CHECKED );
  400. ::CheckDlgButton( hwnd, IDC_CHECK_ACCSVR, BST_CHECKED );
  401. UpdateVariable( hwnd );
  402. if ( !m_pIntercessor->Create( hwnd ) )
  403. {
  404. ::EnableWindow( GetDlgItem( hwnd, IDOK ), TRUE );
  405. m_pIntercessor->Destroy();
  406. }
  407. else
  408. {
  409. g_nTimer = ::SetTimer( hwnd, g_nViewTimer, 5000, NULL );
  410. ::SetWindowText( hwnd, "Bishop - [Enable]" );
  411. }
  412. break;
  413. case IDCANCEL:
  414. ::PostMessage( hwnd, WM_CLOSE, 0L, 0L );
  415. break;
  416. case IDC_BTN_SEND_MSG:
  417. {
  418. BOOL bToAllGS = FALSE;
  419. if ( BST_CHECKED == ::IsDlgButtonChecked( hwnd, IDC_INDEX_SEND2GAMESERVER ) )
  420. {
  421. bToAllGS = TRUE;
  422. }
  423. UINT uOption = AP_NOTIFY_ALL_PLAYER;
  424. if ( BST_CHECKED == ::IsDlgButtonChecked( hwnd, IDC_INDEX_GS2CLOSE ) )
  425. {
  426. uOption = AP_NOTIFY_GAMESERVER_SAFECLOSE;
  427. }
  428. if ( BST_CHECKED == ::IsDlgButtonChecked( hwnd, IDC_INDEX_WANINGGS2CLOSE ) )
  429. {
  430. uOption = AP_WARNING_ALL_PLAYER_QUIT;
  431. }
  432. uLength = ::GetDlgItemText( hwnd, IDC_EDIT_ANNOUNCE_MSG, szAnnounceText, 256 );
  433. szAnnounceText[uLength] = '';
  434. SendAnnounceText( hwnd, ( const char * )szAnnounceText, uLength, uOption, bToAllGS );
  435. }
  436. break;
  437. case IDC_BTN_GAMESVRINFO:
  438. {
  439. HWND hCtrl = ::GetDlgItem( hwnd, IDC_LIST_GAMESERVER );
  440. BOOL bRet = FALSE;
  441. if ( hCtrl && ::IsWindow( hCtrl ) )
  442. {
  443. int nSelIndex = LB_ERR;
  444. if ( LB_ERR != ( nSelIndex = ::SendMessage( hCtrl, LB_GETCURSEL, 0, 0 ) ) )
  445. {
  446. UINT nSearchID = 0;
  447. if ( LB_ERR != ( nSearchID = ::SendMessage( hCtrl, LB_GETITEMDATA, nSelIndex, 0 ) ) )
  448. {
  449. IGServer * pGServer = CGameServer::GetServer( nSearchID );
  450. if ( pGServer )
  451. {
  452. size_t nNum = pGServer->GetContent();
  453. bRet = ::SetDlgItemInt( hwnd, IDC_STATIC_GAMESERVER_CONTEXT, nNum, TRUE );
  454. }
  455. }
  456. }
  457. }
  458. if ( !bRet )
  459. {
  460. ::SetDlgItemText( hwnd, IDC_STATIC_GAMESERVER_CONTEXT, "Invalid" );
  461. }
  462. }
  463. break;
  464. }
  465. break;
  466. case WM_SERVER_STATUS:
  467. switch ( wParam )
  468. {
  469. case ACCOUNTSERVER_NOTIFY:
  470. if ( CONNECTED == lParam )
  471. {
  472. ::CheckDlgButton( hwnd, IDC_CHECK_ACCSVR, BST_CHECKED );
  473. }
  474. else // DICONNECTED
  475. {
  476. ::CheckDlgButton( hwnd, IDC_CHECK_ACCSVR, BST_UNCHECKED );
  477. }
  478. break;
  479. case DBROLESERVER_NOTIFY:
  480. if ( CONNECTED == lParam )
  481. {
  482. ::CheckDlgButton( hwnd, IDC_CHECK_ROLESVR, BST_CHECKED );
  483. }
  484. else // DICONNECTED
  485. {
  486. ::CheckDlgButton( hwnd, IDC_CHECK_ROLESVR, BST_UNCHECKED );
  487. }
  488. break;
  489. }
  490. break;
  491. case WM_GAMESERVER_EXCHANGE:
  492. {
  493. switch ( wParam )
  494. {
  495. case ADD_GAMESERVER_ACTION:
  496. {
  497. if ( m_pIntercessor )
  498. {
  499. const char *pInfo = m_pIntercessor->GetGameServerInfo( lParam );
  500. AddGameServerInfo( hwnd, lParam, pInfo );
  501. if ( 0 == nGameServerNumber ++ )
  502. {
  503. EnableGameSvrCtrl( hwnd, TRUE );
  504. HWND hCtrl = ::GetDlgItem( hwnd, IDC_LIST_GAMESERVER );
  505. if ( hCtrl && ::IsWindow( hCtrl ) )
  506. {
  507. ::SendMessage( hCtrl, LB_SETCURSEL, 0, 0 );
  508. }
  509. }
  510. }
  511. }
  512. break;
  513. case DEL_GAMESERVER_ACTION:
  514. {
  515. if ( m_pIntercessor )
  516. {
  517. if ( -- nGameServerNumber <= 0 )
  518. {
  519. nGameServerNumber = 0;
  520. EnableGameSvrCtrl( hwnd, FALSE );
  521. ::SetDlgItemText( hwnd, IDC_STATIC_GAMESERVER_CONTEXT, "Invalid" );
  522. }
  523. DelGameServerInfo( hwnd, lParam );
  524. }
  525. }
  526. break;
  527. }
  528. }
  529. break;
  530. default:
  531. break;
  532. }
  533. /*
  534.  * Clean up any unused messages by calling DefWindowProc
  535.  */
  536. return FALSE;
  537. //return ::DefWindowProc( hwnd, msg, wParam, lParam );
  538. }
  539. void CBishopApp::AddGameServerInfo( HWND hDlg, UINT nID, const char *pInfo )
  540. {
  541. if ( pInfo && pInfo[0] )
  542. {
  543. HWND hCtrl = ::GetDlgItem( hDlg, IDC_LIST_GAMESERVER );
  544. if ( hCtrl && ::IsWindow( hCtrl ) )
  545. {
  546. int nIndex = ::SendMessage( hCtrl, LB_ADDSTRING, 0, ( LPARAM )pInfo );
  547. if ( LB_ERR != nIndex )
  548. {
  549. ::SendMessage( hCtrl, LB_SETITEMDATA, nIndex, nID );
  550. }
  551. }
  552. }
  553. }
  554. void CBishopApp::DelGameServerInfo( HWND hDlg, UINT nID )
  555. {
  556. HWND hCtrl = ::GetDlgItem( hDlg, IDC_LIST_GAMESERVER );
  557. if ( hCtrl && ::IsWindow( hCtrl ) )
  558. {
  559. int nCount = ::SendMessage( hCtrl, LB_GETCOUNT, 0, 0 );
  560. if ( LB_ERR != nCount )
  561. {
  562. for ( int i=0; i<nCount; i++ )
  563. {
  564. UINT nSearchID = 0;
  565. if ( nID == ( nSearchID = ::SendMessage( hCtrl, LB_GETITEMDATA, i, 0 ) ) )
  566. {
  567. ::SendMessage( hCtrl, LB_DELETESTRING, i, 0 );
  568. return;
  569. }
  570. }
  571. }
  572. }
  573. }
  574. void CBishopApp::InitMainDlg( HWND hDlg )
  575. {
  576. ::SetDlgItemText( hDlg, IDC_EDIT_ACCSVRIP, m_theNetwork.GetAccSvrIP() );
  577. ::SetDlgItemInt( hDlg, IDC_EDIT_ACCSVRPORT, m_theNetwork.GetAccSvrPort(), FALSE );
  578. ::SetDlgItemText( hDlg, IDC_EDIT_ROLESVRIP, m_theNetwork.GetRoleSvrIP() );
  579. ::SetDlgItemInt( hDlg, IDC_EDIT_ROLESVRPORT, m_theNetwork.GetRoleSvrPort(), FALSE );
  580. ::SetDlgItemInt( hDlg, IDC_EDIT_CLIENT_PORT, m_theNetwork.GetClientOpenPort(), FALSE );
  581. ::SetDlgItemInt( hDlg, IDC_EDIT_GAMESVR_PORT, m_theNetwork.GetGameSvrOpenPort(), FALSE );
  582. ::CheckDlgButton( hDlg, IDC_INDEX_SEND2GAMESERVER, BST_CHECKED );
  583. ::CheckDlgButton( hDlg, IDC_RADIO_ANNOUNCE_OPTION, BST_CHECKED );
  584. g_theSmartClient.m_hwndContain = hDlg;
  585. }
  586. void CBishopApp::CloseMainDlg( HWND hDlg )
  587. {
  588. UpdateVariable( hDlg );
  589. g_theSmartClient.Close();
  590. }
  591. void CBishopApp::UpdateVariable( HWND hDlg )
  592. {
  593. char szBuffer[MAX_PATH];
  594. ::GetDlgItemText( hDlg, IDC_EDIT_ROLESVRIP, szBuffer, MAX_PATH );
  595. m_theNetwork.SetRoleSvrIP( szBuffer );
  596. UINT nValue = 0;
  597. BOOL bTranslated = TRUE;
  598. nValue = ::GetDlgItemInt( hDlg, IDC_EDIT_ROLESVRPORT, &bTranslated, FALSE );
  599. m_theNetwork.SetRoleSvrPort( nValue );
  600. nValue = ::GetDlgItemInt( hDlg, IDC_EDIT_CLIENT_PORT, &bTranslated, FALSE );
  601. m_theNetwork.SetClientOpenPort( nValue );
  602. nValue = ::GetDlgItemInt( hDlg, IDC_EDIT_GAMESVR_PORT, &bTranslated, FALSE );
  603. m_theNetwork.SetGameSvrOpenPort( nValue );
  604. }
  605. void CBishopApp::EnableGameSvrCtrl( HWND hwndDlg, BOOL nEnable )
  606. {
  607. EnableCtrl( hwndDlg, IDC_BTN_GAMESVRINFO, nEnable );
  608. EnableCtrl( hwndDlg, IDC_LIST_GAMESERVER, nEnable );
  609. EnableCtrl( hwndDlg, IDC_RADIO_ANNOUNCE_OPTION, nEnable );
  610. EnableCtrl( hwndDlg, IDC_INDEX_GS2CLOSE, nEnable );
  611. EnableCtrl( hwndDlg, IDC_INDEX_WANINGGS2CLOSE, nEnable );
  612. EnableCtrl( hwndDlg, IDC_INDEX_SEND2GAMESERVER, nEnable );
  613. EnableCtrl( hwndDlg, IDC_INDEX_SEND2GS_ISSEL, nEnable );
  614. EnableCtrl( hwndDlg, IDC_EDIT_ANNOUNCE_MSG, nEnable );
  615. EnableCtrl( hwndDlg, IDC_BTN_SEND_MSG, nEnable );
  616. }
  617. void CBishopApp::EnableCtrl( HWND hwndDlg, UINT nCtrlID, BOOL nEnable )
  618. {
  619. HWND hCtrl = ::GetDlgItem( hwndDlg, nCtrlID );
  620. if ( hCtrl && ::IsWindow( hCtrl ) )
  621. {
  622. ::EnableWindow( hCtrl, nEnable );
  623. }
  624. }
  625. void CBishopApp::SendAnnounceText( HWND hwndDlg, const char *pText, UINT uLength, UINT uOption, BOOL bAllGS )
  626. {
  627. if ( !pText || 0 == uLength )
  628. {
  629. ::MessageBox( hwndDlg, "Please input a valid message!", "Warning", MB_OK | MB_ICONINFORMATION );
  630. ::SetFocus( ::GetDlgItem( hwndDlg, IDC_EDIT_ANNOUNCE_MSG ) );
  631. return;
  632. }
  633. if ( bAllGS )
  634. {
  635. CGameServer::SendToAll( pText, uLength, uOption );
  636. }
  637. else
  638. {
  639. HWND hCtrl = ::GetDlgItem( hwndDlg, IDC_LIST_GAMESERVER );
  640. if ( hCtrl && ::IsWindow( hCtrl ) )
  641. {
  642. int nSelIndex = LB_ERR;
  643. if ( LB_ERR != ( nSelIndex = ::SendMessage( hCtrl, LB_GETCURSEL, 0, 0 ) ) )
  644. {
  645. UINT nSearchID = 0;
  646. if ( LB_ERR != ( nSearchID = ::SendMessage( hCtrl, LB_GETITEMDATA, nSelIndex, 0 ) ) )
  647. {
  648. IGServer * pGServer = CGameServer::GetServer( nSearchID );
  649. if ( pGServer )
  650. {
  651. pGServer->SendText( pText, uLength, uOption );
  652. }
  653. }
  654. }
  655. }
  656. }
  657. }