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

模拟服务器

开发平台:

C/C++

  1. // Page1.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "S3DBClient.h"
  5. #include "Page1.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. extern CS3DBClientApp theApp;
  12. /////////////////////////////////////////////////////////////////////////////
  13. // CPage1 property page
  14. IMPLEMENT_DYNCREATE(CPage1, CPropertyPage)
  15. CPage1::CPage1() : CPropertyPage(CPage1::IDD),
  16. m_bHasLockDatabase( FALSE )
  17. {
  18. //{{AFX_DATA_INIT(CPage1)
  19. m_cstrLogPath = _T("");
  20. m_dwDeleteFromID = 0;
  21. m_dwDeleteToID = 0;
  22. m_cstrDefaultPassword = _T("");
  23. m_cstrDefaultAccRealName = _T("");
  24. m_dwNumOfCreating = 1;
  25. m_cstrBaseAccount = _T("");
  26. //}}AFX_DATA_INIT
  27. }
  28. CPage1::~CPage1()
  29. {
  30. }
  31. void CPage1::DoDataExchange(CDataExchange* pDX)
  32. {
  33. CPropertyPage::DoDataExchange(pDX);
  34. //{{AFX_DATA_MAP(CPage1)
  35. DDX_Control(pDX, IDC_CREATEPRO, m_createProCtrl);
  36. DDX_Control(pDX, IDC_CHANGELOGPATH, m_changeBTCtrl);
  37. DDX_Control(pDX, IDC_CREATEACCOUNT, m_createBTCtrl);
  38. DDX_Control(pDX, IDC_DELETEACCOUNT, m_deleteBTCtrl);
  39. DDX_Control(pDX, IDC_LOCKDATABASE, m_lockBTCtrl);
  40. DDX_Text(pDX, IDC_ACCOUNTLOGPATH, m_cstrLogPath);
  41. DDX_Text(pDX, IDC_DELETEFROMID, m_dwDeleteFromID);
  42. DDX_Text(pDX, IDC_DELETETOID, m_dwDeleteToID);
  43. DDX_Text(pDX, IDC_DEFAULTPASSWORD, m_cstrDefaultPassword);
  44. DDV_MaxChars(pDX, m_cstrDefaultPassword, 30);
  45. DDX_Text(pDX, IDC_DEFAULTREALNAME, m_cstrDefaultAccRealName);
  46. DDV_MaxChars(pDX, m_cstrDefaultAccRealName, 30);
  47. DDX_Text(pDX, IDC_NUMOFCREATING, m_dwNumOfCreating);
  48. DDV_MinMaxDWord(pDX, m_dwNumOfCreating, 1, 1000);
  49. DDX_Text(pDX, IDC_BASEACCOUNT, m_cstrBaseAccount);
  50. DDV_MaxChars(pDX, m_cstrBaseAccount, 29);
  51. //}}AFX_DATA_MAP
  52. }
  53. BEGIN_MESSAGE_MAP(CPage1, CPropertyPage)
  54. //{{AFX_MSG_MAP(CPage1)
  55. ON_WM_SHOWWINDOW()
  56. ON_BN_CLICKED(IDC_CHANGELOGPATH, OnChangelogpath)
  57. ON_BN_CLICKED(IDC_LOCKDATABASE, OnLockdatabase)
  58. ON_WM_DESTROY()
  59. ON_BN_CLICKED(IDC_CREATEACCOUNT, OnCreateaccount)
  60. ON_BN_CLICKED(IDC_DELETEACCOUNT, OnDeleteaccount)
  61. ON_EN_CHANGE(IDC_NUMOFCREATING, OnChangeNumofcreating)
  62. ON_EN_CHANGE(IDC_DEFAULTPASSWORD, OnChangeDefaultpassword)
  63. ON_EN_CHANGE(IDC_DEFAULTREALNAME, OnChangeDefaultrealname)
  64. ON_EN_CHANGE(IDC_BASEACCOUNT, OnChangeBaseaccount)
  65. //}}AFX_MSG_MAP
  66. END_MESSAGE_MAP()
  67. /////////////////////////////////////////////////////////////////////////////
  68. // CPage1 message handlers
  69. BOOL CPage1::OnInitDialog() 
  70. {
  71. CPropertyPage::OnInitDialog();
  72. // TODO: Add extra initialization here
  73. m_cstrDefaultPassword = theApp.m_szDefaultAccPassword;
  74. m_cstrDefaultAccRealName = theApp.m_szDefaultAccRealName;
  75. m_cstrLogPath = theApp.m_szLogPath;
  76. UpdateData( FALSE );
  77. return TRUE;  // return TRUE unless you set the focus to a control
  78.               // EXCEPTION: OCX Property Pages should return FALSE
  79. }
  80. void CPage1::OnShowWindow(BOOL bShow, UINT nStatus) 
  81. {
  82. CPropertyPage::OnShowWindow(bShow, nStatus);
  83. // TODO: Add your message handler code here
  84. UpdateUI();
  85. }
  86. void CPage1::UpdateUI()
  87. {
  88. if ( NULL != GetSafeHwnd() )
  89. {
  90. if ( m_bHasLockDatabase )
  91. {
  92. CString cstrText;
  93. cstrText.LoadString( IDS_ACTIVATEBTTEXT );
  94. m_lockBTCtrl.SetWindowText( cstrText );
  95. }
  96. else
  97. {
  98. CString cstrText;
  99. cstrText.LoadString( IDS_LOCKBTTEXT );
  100. m_lockBTCtrl.SetWindowText( cstrText );
  101. }
  102. if ( theApp.m_bConnected )
  103. {
  104. m_lockBTCtrl.EnableWindow( TRUE );
  105. m_createBTCtrl.EnableWindow( TRUE );
  106. m_deleteBTCtrl.EnableWindow( TRUE );
  107. }
  108. else
  109. {
  110. m_lockBTCtrl.EnableWindow( FALSE );
  111. m_createBTCtrl.EnableWindow( FALSE );
  112. m_deleteBTCtrl.EnableWindow( FALSE );
  113. }
  114. }
  115. }
  116. void CPage1::OnChangelogpath() 
  117. {
  118. // TODO: Add your control notification handler code here
  119. CFileDialog dlg( TRUE );
  120. if ( IDOK == dlg.DoModal() )
  121. {
  122. m_cstrLogPath = dlg.GetPathName();
  123. UpdateData( FALSE );
  124. }
  125. }
  126. static DWORD WINAPI ActivateDBCallbackFun( DWORD dwPara1, DWORD dwPara2 )
  127. {
  128. DWORD dwRet = 0;
  129. IBYTE* pRecvMsg = ( IBYTE* )dwPara1;
  130. int* piRet = ( int* )dwPara2;
  131. if ( ( NULL != pRecvMsg )
  132. || ( NULL != piRet ) )
  133. {
  134. DWORD dwMsgParam;
  135. memcpy( &dwMsgParam, &( pRecvMsg[1+sizeof( DWORD )] ), sizeof( DWORD ) );
  136. if ( ( DBLOGIN_R_ACTIVATEDATABASE | DBLOGIN_R_SUCCESS ) == dwMsgParam )
  137. {
  138. *piRet = 1;
  139. }
  140. else
  141. {
  142. *piRet = -1;
  143. }
  144. }
  145. return dwRet;
  146. }
  147. static DWORD WINAPI LockDBCallbackFun( DWORD dwPara1, DWORD dwPara2 )
  148. {
  149. DWORD dwRet = 0;
  150. IBYTE* pRecvMsg = ( IBYTE* )dwPara1;
  151. int* piRet = ( int* )dwPara2;
  152. if ( ( NULL != pRecvMsg )
  153. || ( NULL != piRet ) )
  154. {
  155. DWORD dwMsgParam;
  156. memcpy( &dwMsgParam, &( pRecvMsg[1+sizeof( DWORD )] ), sizeof( DWORD ) );
  157. if ( ( DBLOGIN_R_LOCKDATABASE | DBLOGIN_R_SUCCESS ) == dwMsgParam )
  158. {
  159. *piRet = 1;
  160. }
  161. else
  162. {
  163. *piRet = -1;
  164. }
  165. }
  166. return dwRet;
  167. }
  168. void CPage1::OnLockdatabase() 
  169. {
  170. // TODO: Add your control notification handler code here
  171. if ( !theApp.m_bConnected )
  172. {
  173. return;
  174. }
  175. if ( NULL != theApp.m_pClientSocket )
  176. {
  177. _DBLOGINSTRUCT dbLoginStruct;
  178. memset( &dbLoginStruct, 0, sizeof( _DBLOGINSTRUCT ) );
  179. memcpy( dbLoginStruct.szUserName,
  180. theApp.m_cstrCurUsername,
  181. theApp.m_cstrCurUsername.GetLength() );
  182. memcpy( dbLoginStruct.szPassword,
  183. theApp.m_cstrCurPassword,
  184. theApp.m_cstrCurPassword.GetLength() );
  185. dbLoginStruct.Size = sizeof( _DBLOGINSTRUCT );
  186. if ( !m_bHasLockDatabase )
  187. {
  188. dbLoginStruct.Param = DBLOGIN_A_LOCKDATABASE;
  189. }
  190. else
  191. {
  192. dbLoginStruct.Param = DBLOGIN_A_ACTIVATEDATABASE;
  193. }
  194. int iResult = 0;
  195. BOOL bResult;
  196. if ( !m_bHasLockDatabase )
  197. {
  198. bResult =
  199. theApp.m_pClientSocket->RemoteQuery( &dbLoginStruct,
  200. LockDBCallbackFun, ( DWORD )( &iResult ), theApp.m_serverInfo.dwWaitTime );
  201. }
  202. else
  203. {
  204. bResult =
  205. theApp.m_pClientSocket->RemoteQuery( &dbLoginStruct,
  206. ActivateDBCallbackFun, ( DWORD )( &iResult ), theApp.m_serverInfo.dwWaitTime );
  207. }
  208. if ( bResult )
  209. {
  210. CString cstrMsg;
  211. if ( 1 == iResult ) // Log in successfully
  212. {
  213. if ( !m_bHasLockDatabase )
  214. {
  215. m_bHasLockDatabase = TRUE;
  216. }
  217. else
  218. {
  219. m_bHasLockDatabase = FALSE;
  220. }
  221. UpdateUI();
  222. }
  223. else
  224. {
  225. if ( !m_bHasLockDatabase )
  226. {
  227. cstrMsg =
  228. _T("Failed to lock database.rnMaybe the net is busy, nplease try again later.");
  229. }
  230. else
  231. {
  232. cstrMsg =
  233. _T("Failed to activate database.rnMaybe the net is busy, please try again later.");
  234. }
  235. MessageBox( cstrMsg );
  236. }
  237. }
  238. else
  239. {
  240. MessageBox( _T("Failed to access database.rnMaybe the net is busy, please try again later."), NULL, MB_OK | MB_ICONASTERISK );
  241. }
  242. }
  243. else
  244. {
  245. MessageBox( _T("No availd socket"), NULL, MB_OK | MB_ICONASTERISK );
  246. }
  247. }
  248. static DWORD CALLBACK CreateAccountCallBack( DWORD dwPara1, DWORD dwPara2 )
  249. {
  250. DWORD dwRet = 0;
  251. IBYTE* pRecvMsg = ( IBYTE* )dwPara1;
  252. int* piRet = ( int* )dwPara2;
  253. if ( ( NULL != pRecvMsg )
  254. || ( NULL != piRet ) )
  255. {
  256. DWORD dwMsgParam;
  257. memcpy( &dwMsgParam, &( pRecvMsg[1+sizeof( DWORD )] ), sizeof( DWORD ) );
  258. if ( ( DBLOGIN_R_CREATEACCOUNT | DBLOGIN_R_SUCCESS ) == dwMsgParam )
  259. {
  260. *piRet = 1;
  261. }
  262. else
  263. {
  264. *piRet = -1;
  265. }
  266. }
  267. return dwRet;
  268. }
  269. void CPage1::OnCreateaccount() 
  270. {
  271. // TODO: Add your control notification handler code here
  272. if ( !theApp.m_bConnected )
  273. {
  274. return;
  275. }
  276. if ( NULL != theApp.m_pClientSocket )
  277. {
  278. _DBLOGINSTRUCT dbLoginStruct;
  279. memset( &dbLoginStruct, 0, sizeof( _DBLOGINSTRUCT ) );
  280. memcpy( dbLoginStruct.szUserName,
  281. theApp.m_cstrCurUsername,
  282. theApp.m_cstrCurUsername.GetLength() );
  283. memcpy( dbLoginStruct.szPassword,
  284. theApp.m_cstrCurPassword,
  285. theApp.m_cstrCurPassword.GetLength() );
  286. dbLoginStruct.Size = sizeof( _DBLOGINSTRUCT )
  287. + LOGIN_ACCOUNT_MAX_LEN
  288. + LOGIN_REALNAME_MAX_LEN
  289. + LOGIN_PASSWORD_MAX_LEN;
  290. dbLoginStruct.Param = DBLOGIN_A_CREATEACCOUNT;
  291. IBYTE* pSendBuf = new IBYTE[dbLoginStruct.Size];
  292. FILE* pLogFile = fopen( theApp.m_szLogPath, "r" );
  293. if ( NULL == pLogFile )
  294. {
  295. pLogFile = fopen( theApp.m_szLogPath, "wb" );
  296. }
  297. else
  298. {
  299. fclose( pLogFile );
  300. pLogFile = fopen( theApp.m_szLogPath, "r+b" );
  301. }
  302. if ( NULL == pLogFile )
  303. {
  304. CString cstrMsg;
  305. cstrMsg.Format( _T("Failed to create account becauserncan not open log file "%s""), m_cstrLogPath );
  306. MessageBox( cstrMsg );
  307. }
  308. if ( NULL != pSendBuf )
  309. {
  310. fseek( pLogFile, 0, SEEK_END );
  311. memset( pSendBuf, 0, dbLoginStruct.Size );
  312. DWORD dwOffset = 0;
  313. memcpy( pSendBuf, &dbLoginStruct, sizeof( _DBLOGINSTRUCT ) );
  314. dwOffset += sizeof( _DBLOGINSTRUCT );
  315. memcpy( pSendBuf + dwOffset, m_cstrDefaultAccRealName, m_cstrDefaultAccRealName.GetLength() );
  316. dwOffset += LOGIN_REALNAME_MAX_LEN;
  317. memcpy( pSendBuf + dwOffset, m_cstrDefaultPassword, m_cstrDefaultPassword.GetLength() );
  318. dwOffset += LOGIN_PASSWORD_MAX_LEN;
  319. char szAccount[LOGIN_ACCOUNT_MAX_LEN+2];
  320. BOOL bHasPrintTitle = FALSE;
  321. m_createProCtrl.SetPos( 0 );
  322. for ( DWORD i = 0; i < m_dwNumOfCreating; i++ )
  323. {
  324. memset( szAccount, 0, LOGIN_ACCOUNT_MAX_LEN + 2 );
  325. sprintf( szAccount, "%s%d", m_cstrBaseAccount, i );
  326. szAccount[LOGIN_ACCOUNT_MAX_LEN] = 0;
  327. memcpy( pSendBuf + dwOffset, szAccount, LOGIN_ACCOUNT_MAX_LEN );
  328. int iResult = 0;
  329. BOOL bResult =
  330. theApp.m_pClientSocket->RemoteQuery( ( _PDBLOGINSTRUCT )pSendBuf,
  331. CreateAccountCallBack, ( DWORD )( &iResult ), theApp.m_serverInfo.dwWaitTime );
  332. if ( bResult )
  333. {
  334. CString cstrMsg;
  335. if ( 1 == iResult )
  336. {
  337. if ( FALSE == bHasPrintTitle )
  338. {
  339. CTime time = CTime::GetCurrentTime();
  340. KPIPrintToFile( pLogFile,
  341. _T("[Begin created account at %d:%d, %d-%d-%d]rn"),
  342. time.GetHour(), time.GetMinute(), time.GetYear(), time.GetMonth(), time.GetDay() );
  343. bHasPrintTitle = TRUE;
  344. }
  345. KPIPrintToFile( pLogFile, _T("%st%st%srn"),
  346. szAccount, m_cstrDefaultPassword, m_cstrDefaultAccRealName );
  347. double dwProPos = 100.0 * ( i + 1.0 ) / ( ( double )m_dwNumOfCreating );
  348. m_createProCtrl.SetPos( ( int )dwProPos );
  349. }
  350. else
  351. {
  352. break;
  353. }
  354. }
  355. }
  356. if ( 0 < i )
  357. {
  358. CTime time = CTime::GetCurrentTime();
  359. KPIPrintToFile( pLogFile,
  360. _T("[Completed to created %d account(s) at %d:%d, %d-%d-%d]rn"), i,
  361. time.GetHour(), time.GetMinute(), time.GetYear(), time.GetMonth(), time.GetDay() );
  362. }
  363. CString cstrMsg;
  364. cstrMsg.Format( _T("Created %d account(s)"), i );
  365. MessageBox( cstrMsg );
  366. m_createProCtrl.SetPos( 0 );
  367. delete []pSendBuf;
  368. pSendBuf = NULL;
  369. }
  370. else
  371. {
  372. MessageBox( _T("Failed to allocate memory.") );
  373. }
  374. if ( NULL != pLogFile )
  375. {
  376. fclose( pLogFile );
  377. }
  378. }
  379. else
  380. {
  381. MessageBox( _T("No availd socket"), NULL, MB_OK | MB_ICONASTERISK );
  382. }
  383. }
  384. void CPage1::OnDeleteaccount() 
  385. {
  386. // TODO: Add your control notification handler code here
  387. }
  388. void CPage1::OnDestroy() 
  389. {
  390. CPropertyPage::OnDestroy();
  391. // TODO: Add your message handler code here
  392. _tcscpy( theApp.m_szDefaultAccPassword, m_cstrDefaultPassword );
  393. _tcscpy( theApp.m_szDefaultAccRealName, m_cstrDefaultAccRealName );
  394. _tcscpy( theApp.m_szLogPath, m_cstrLogPath );
  395. char szSetupFilePath[MAX_PATH+1];
  396. KPIGetExePath( szSetupFilePath, MAX_PATH );
  397. strcat( szSetupFilePath, "setup.ini" );
  398. KPIWritePrivateProfileString( _T("Account"), _T("realname"),
  399. theApp.m_szDefaultAccRealName, szSetupFilePath );
  400. KPIWritePrivateProfileString( _T("Account"), _T("password"),
  401. theApp.m_szDefaultAccPassword, szSetupFilePath );
  402. KPIWritePrivateProfileString( _T("Account"), _T("logpath"),
  403. theApp.m_szLogPath, szSetupFilePath );
  404. }
  405. void CPage1::OnChangeNumofcreating() 
  406. {
  407. // TODO: If this is a RICHEDIT control, the control will not
  408. // send this notification unless you override the CPropertyPage::OnInitDialog()
  409. // function and call CRichEditCtrl().SetEventMask()
  410. // with the ENM_CHANGE flag ORed into the mask.
  411. // TODO: Add your control notification handler code here
  412. UpdateData( TRUE );
  413. }
  414. void CPage1::OnChangeDefaultpassword() 
  415. {
  416. // TODO: If this is a RICHEDIT control, the control will not
  417. // send this notification unless you override the CPropertyPage::OnInitDialog()
  418. // function and call CRichEditCtrl().SetEventMask()
  419. // with the ENM_CHANGE flag ORed into the mask.
  420. // TODO: Add your control notification handler code here
  421. UpdateData( TRUE );
  422. }
  423. void CPage1::OnChangeDefaultrealname() 
  424. {
  425. // TODO: If this is a RICHEDIT control, the control will not
  426. // send this notification unless you override the CPropertyPage::OnInitDialog()
  427. // function and call CRichEditCtrl().SetEventMask()
  428. // with the ENM_CHANGE flag ORed into the mask.
  429. // TODO: Add your control notification handler code here
  430. UpdateData( TRUE );
  431. }
  432. void CPage1::OnChangeBaseaccount() 
  433. {
  434. // TODO: If this is a RICHEDIT control, the control will not
  435. // send this notification unless you override the CPropertyPage::OnInitDialog()
  436. // function and call CRichEditCtrl().SetEventMask()
  437. // with the ENM_CHANGE flag ORed into the mask.
  438. // TODO: Add your control notification handler code here
  439. UpdateData( TRUE );
  440. }