诸暨麻将添加redis
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

733 lines
25 KiB

  1. #include "StdAfx.h"
  2. #include "ServiceUnits.h"
  3. #include "ControlPacket.h"
  4. #include "Shop.h"
  5. #include "google/protobuf/stubs/common.h"
  6. //////////////////////////////////////////////////////////////////////////////////
  7. //静态变量
  8. CServiceUnits * CServiceUnits::g_pServiceUnits = NULL; //对象指针
  9. //////////////////////////////////////////////////////////////////////////////////
  10. BEGIN_MESSAGE_MAP(CServiceUnits, CWnd)
  11. ON_MESSAGE(WM_UICONTROL_REQUEST, OnUIControlRequest)
  12. END_MESSAGE_MAP()
  13. //////////////////////////////////////////////////////////////////////////////////
  14. //构造函数
  15. CServiceUnits::CServiceUnits()
  16. {
  17. //服务参数
  18. m_ServiceStatus = ServiceStatus_Stop;
  19. //设置接口
  20. m_pIServiceUnitsSink = NULL;
  21. //设置对象
  22. ASSERT(g_pServiceUnits == NULL);
  23. if (g_pServiceUnits == NULL) g_pServiceUnits = this;
  24. //组件配置
  25. ZeroMemory(&m_GameParameter, sizeof(m_GameParameter));
  26. ZeroMemory(&m_DataBaseParameter, sizeof(m_DataBaseParameter));
  27. ZeroMemory(&m_GameServiceAttrib, sizeof(m_GameServiceAttrib));
  28. ZeroMemory(&m_GameServiceOption, sizeof(m_GameServiceOption));
  29. ZeroMemory(&m_GameMatchOption, sizeof(m_GameMatchOption));
  30. return;
  31. }
  32. //析构函数
  33. CServiceUnits::~CServiceUnits()
  34. {
  35. }
  36. //设置接口
  37. bool CServiceUnits::SetServiceUnitsSink(IServiceUnitsSink * pIServiceUnitsSink)
  38. {
  39. //设置变量
  40. m_pIServiceUnitsSink = pIServiceUnitsSink;
  41. return true;
  42. }
  43. //投递请求
  44. bool CServiceUnits::PostControlRequest(WORD wIdentifier, VOID * pData, WORD wDataSize)
  45. {
  46. //状态判断
  47. ASSERT(IsWindow(m_hWnd));
  48. if (IsWindow(m_hWnd) == FALSE) return false;
  49. //插入队列
  50. CWHDataLocker DataLocker(m_CriticalSection);
  51. if (m_DataQueue.InsertData(wIdentifier, pData, wDataSize) == false) return false;
  52. //发送消息
  53. PostMessage(WM_UICONTROL_REQUEST, wIdentifier, wDataSize);
  54. return true;
  55. }
  56. //启动服务
  57. bool CServiceUnits::StartService()
  58. {
  59. //效验状态
  60. ASSERT(m_ServiceStatus == ServiceStatus_Stop);
  61. if (m_ServiceStatus != ServiceStatus_Stop) return false;
  62. //设置状态
  63. SetServiceStatus(ServiceStatus_Config);
  64. //创建窗口
  65. if (m_hWnd == NULL)
  66. {
  67. CRect rcCreate(0, 0, 0, 0);
  68. Create(NULL, NULL, WS_CHILD, rcCreate, AfxGetMainWnd(), 100);
  69. }
  70. //创建模块
  71. if (CreateServiceDLL() == false)
  72. {
  73. ConcludeService();
  74. return false;
  75. }
  76. //调整参数
  77. if (RectifyServiceParameter() == false)
  78. {
  79. ConcludeService();
  80. return false;
  81. }
  82. //配置服务
  83. if (InitializeService() == false)
  84. {
  85. ConcludeService();
  86. return false;
  87. }
  88. //启动内核
  89. if (StartKernelService() == false)
  90. {
  91. ConcludeService();
  92. return false;
  93. }
  94. //加载配置
  95. SendControlPacket(CT_LOAD_SERVICE_CONFIG, NULL, 0);
  96. //启动GET请求队列
  97. CHttpClient::start(&m_AttemperEngineSink);
  98. return true;
  99. }
  100. //停止服务
  101. bool CServiceUnits::ConcludeService()
  102. {
  103. //停止GET请求队列
  104. CHttpClient::end();
  105. //设置变量
  106. SetServiceStatus(ServiceStatus_Stop);
  107. //内核组件
  108. if (m_TimerEngine.GetInterface() != NULL) m_TimerEngine->ConcludeService();
  109. if (m_AttemperEngine.GetInterface() != NULL) m_AttemperEngine->ConcludeService();
  110. if (m_TCPSocketService.GetInterface() != NULL) m_TCPSocketService->ConcludeService();
  111. if (m_TCPNetworkEngine.GetInterface() != NULL) m_TCPNetworkEngine->ConcludeService();
  112. //数据引擎
  113. if (m_RecordDataBaseEngine.GetInterface() != NULL) m_RecordDataBaseEngine->ConcludeService();
  114. if (m_KernelDataBaseEngine.GetInterface() != NULL) m_KernelDataBaseEngine->ConcludeService();
  115. m_DBCorrespondManager.ConcludeService();
  116. //注销组件
  117. if (m_GameServiceManager.GetInterface() != NULL) m_GameServiceManager.CloseInstance();
  118. if (m_MatchServiceManager.GetInterface() != NULL)m_MatchServiceManager.CloseInstance();
  119. //c++中使用google protobuf在关闭应用程序之前需要调用google::protobuf::ShutdownProtobufLibrary();要不然会有内存泄露
  120. google::protobuf::ShutdownProtobufLibrary();
  121. // _CrtDumpMemoryLeaks();//@yuanjing
  122. return true;
  123. }
  124. //游戏配置
  125. bool CServiceUnits::CollocateService(LPCTSTR pszGameModule, tagGameServiceOption & GameServiceOption, std::vector<tagVenueInfo>& vecVenueInfo)
  126. {
  127. //效验状态
  128. ASSERT(m_ServiceStatus == ServiceStatus_Stop);
  129. if (m_ServiceStatus != ServiceStatus_Stop) return false;
  130. //配置模块
  131. m_GameServiceOption = GameServiceOption;
  132. m_GameServiceManager.SetModuleCreateInfo(pszGameModule, GAME_SERVICE_CREATE_NAME);
  133. m_vecVenueInfo = vecVenueInfo;
  134. return true;
  135. }
  136. //游戏配置
  137. bool CServiceUnits::CollocateService(tagGameMatchOption & GameMatchOption, std::vector<tagVenueInfo>& vecVenueInfo)
  138. {
  139. //效验状态
  140. ASSERT(m_ServiceStatus == ServiceStatus_Stop);
  141. if (m_ServiceStatus != ServiceStatus_Stop) return false;
  142. //设置变量
  143. m_GameMatchOption = GameMatchOption;
  144. m_vecVenueInfo = vecVenueInfo;
  145. return true;
  146. }
  147. //创建模块
  148. bool CServiceUnits::CreateServiceDLL()
  149. {
  150. //时间引擎
  151. if ((m_TimerEngine.GetInterface() == NULL) && (m_TimerEngine.CreateInstance() == false))
  152. {
  153. CTraceService::TraceString(m_TimerEngine.GetErrorDescribe(), TraceLevel_Exception);
  154. return false;
  155. }
  156. //调度引擎
  157. if ((m_AttemperEngine.GetInterface() == NULL) && (m_AttemperEngine.CreateInstance() == false))
  158. {
  159. CTraceService::TraceString(m_AttemperEngine.GetErrorDescribe(), TraceLevel_Exception);
  160. return false;
  161. }
  162. //网络组件
  163. if ((m_TCPSocketService.GetInterface() == NULL) && (m_TCPSocketService.CreateInstance() == false))
  164. {
  165. CTraceService::TraceString(m_TCPSocketService.GetErrorDescribe(), TraceLevel_Exception);
  166. return false;
  167. }
  168. //网络引擎
  169. if ((m_TCPNetworkEngine.GetInterface() == NULL) && (m_TCPNetworkEngine.CreateInstance() == false))
  170. {
  171. CTraceService::TraceString(m_TCPNetworkEngine.GetErrorDescribe(), TraceLevel_Exception);
  172. return false;
  173. }
  174. //数据组件
  175. if ((m_KernelDataBaseEngine.GetInterface() == NULL) && (m_KernelDataBaseEngine.CreateInstance() == false))
  176. {
  177. CTraceService::TraceString(m_KernelDataBaseEngine.GetErrorDescribe(), TraceLevel_Exception);
  178. return false;
  179. }
  180. //数据组件
  181. if ((m_RecordDataBaseEngine.GetInterface() == NULL) && (m_RecordDataBaseEngine.CreateInstance() == false))
  182. {
  183. CTraceService::TraceString(m_RecordDataBaseEngine.GetErrorDescribe(), TraceLevel_Exception);
  184. return false;
  185. }
  186. //游戏模块
  187. if ((m_GameServiceManager.GetInterface() == NULL) && (m_GameServiceManager.CreateInstance() == false))
  188. {
  189. CTraceService::TraceString(m_GameServiceManager.GetErrorDescribe(), TraceLevel_Exception);
  190. return false;
  191. }
  192. //比赛模块
  193. if ((m_GameServiceOption.wServerType&GAME_GENRE_MATCH) != 0)
  194. {
  195. if ((m_MatchServiceManager.GetInterface() == NULL) && (m_MatchServiceManager.CreateInstance() == false))
  196. {
  197. CTraceService::TraceString(m_MatchServiceManager.GetErrorDescribe(), TraceLevel_Exception);
  198. return false;
  199. }
  200. }
  201. return true;
  202. }
  203. //配置组件
  204. bool CServiceUnits::InitializeService()
  205. {
  206. //加载参数
  207. m_InitParameter.LoadInitParameter();
  208. //配置参数
  209. m_GameParameter.wMedalRate = 1L;
  210. m_GameParameter.wRevenueRate = 1L;
  211. m_GameParameter.wExchangeRate = 100L;
  212. //连接信息
  213. LPCTSTR pszDataBaseAddr = m_GameServiceOption.szDataBaseAddr;
  214. LPCTSTR pszDataBaseName = m_GameServiceOption.szDataBaseName;
  215. if (LoadDataBaseParameter(pszDataBaseAddr, pszDataBaseName, m_DataBaseParameter) == false) return false;
  216. //组件接口
  217. IUnknownEx * pIAttemperEngine = m_AttemperEngine.GetInterface();
  218. IUnknownEx * pITCPNetworkEngine = m_TCPNetworkEngine.GetInterface();
  219. IUnknownEx * pIAttemperEngineSink = QUERY_OBJECT_INTERFACE(m_AttemperEngineSink, IUnknownEx);
  220. //数据引擎
  221. IUnknownEx * pIDataBaseEngineRecordSink[CountArray(m_RecordDataBaseSink)];
  222. IUnknownEx * pIDataBaseEngineKernelSink[CountArray(m_KernelDataBaseSink)];
  223. for (WORD i = 0; i < CountArray(pIDataBaseEngineRecordSink); i++) pIDataBaseEngineRecordSink[i] = QUERY_OBJECT_INTERFACE(m_RecordDataBaseSink[i], IUnknownEx);
  224. for (WORD i = 0; i < CountArray(pIDataBaseEngineKernelSink); i++) pIDataBaseEngineKernelSink[i] = QUERY_OBJECT_INTERFACE(m_KernelDataBaseSink[i], IUnknownEx);
  225. //绑定接口
  226. if (m_AttemperEngine->SetAttemperEngineSink(pIAttemperEngineSink) == false) return false;
  227. if (m_RecordDataBaseEngine->SetDataBaseEngineSink(pIDataBaseEngineRecordSink, CountArray(pIDataBaseEngineRecordSink)) == false) return false;
  228. if (m_KernelDataBaseEngine->SetDataBaseEngineSink(pIDataBaseEngineKernelSink, CountArray(pIDataBaseEngineKernelSink)) == false) return false;
  229. //内核组件
  230. if (m_TimerEngine->SetTimerEngineEvent(pIAttemperEngine) == false) return false;
  231. if (m_AttemperEngine->SetNetworkEngine(pITCPNetworkEngine) == false) return false;
  232. if (m_TCPNetworkEngine->SetTCPNetworkEngineEvent(pIAttemperEngine) == false) return false;
  233. //协调服务
  234. if (m_TCPSocketService->SetServiceID(NETWORK_CORRESPOND) == false) return false;
  235. if (m_TCPSocketService->SetTCPSocketEvent(pIAttemperEngine) == false) return false;
  236. //数据协调
  237. m_DBCorrespondManager.InitDBCorrespondManager(m_KernelDataBaseEngine.GetInterface());
  238. //创建比赛
  239. if (m_MatchServiceManager.GetInterface() != NULL)
  240. {
  241. if (m_MatchServiceManager->CreateGameMatch(m_GameMatchOption.cbMatchType) == false) return false;
  242. }
  243. //调度回调
  244. m_AttemperEngineSink.m_pInitParameter = &m_InitParameter;
  245. m_AttemperEngineSink.m_pGameParameter = &m_GameParameter;
  246. m_AttemperEngineSink.m_pGameMatchOption = &m_GameMatchOption;
  247. m_AttemperEngineSink.m_pGameServiceAttrib = &m_GameServiceAttrib;
  248. m_AttemperEngineSink.m_pGameServiceOption = &m_GameServiceOption;
  249. m_AttemperEngineSink.m_vecVenueInfo = m_vecVenueInfo; //++场馆列表
  250. //调度回调
  251. m_AttemperEngineSink.m_pITimerEngine = m_TimerEngine.GetInterface();
  252. m_AttemperEngineSink.m_pIAttemperEngine = m_AttemperEngine.GetInterface();
  253. m_AttemperEngineSink.m_pITCPSocketService = m_TCPSocketService.GetInterface();
  254. m_AttemperEngineSink.m_pITCPNetworkEngine = m_TCPNetworkEngine.GetInterface();
  255. m_AttemperEngineSink.m_pIGameServiceManager = m_GameServiceManager.GetInterface();
  256. m_AttemperEngineSink.m_pIRecordDataBaseEngine = m_RecordDataBaseEngine.GetInterface();
  257. m_AttemperEngineSink.m_pIKernelDataBaseEngine = m_KernelDataBaseEngine.GetInterface();
  258. //m_AttemperEngineSink.m_pIMatchServiceManager = m_MatchServiceManager.GetInterface();
  259. m_AttemperEngineSink.m_pIDBCorrespondManager = (IDBCorrespondManager*)m_DBCorrespondManager.QueryInterface(IID_IDBCorrespondManager, VER_IDBCorrespondManager);
  260. //数据回调
  261. for (INT i = 0; i < CountArray(m_RecordDataBaseSink); i++)
  262. {
  263. m_RecordDataBaseSink[i].m_pInitParameter = &m_InitParameter;
  264. m_RecordDataBaseSink[i].m_pGameParameter = &m_GameParameter;
  265. m_RecordDataBaseSink[i].m_pDataBaseParameter = &m_DataBaseParameter;
  266. m_RecordDataBaseSink[i].m_pGameServiceAttrib = &m_GameServiceAttrib;
  267. m_RecordDataBaseSink[i].m_pGameServiceOption = &m_GameServiceOption;
  268. m_RecordDataBaseSink[i].m_pIGameServiceManager = m_GameServiceManager.GetInterface();
  269. m_RecordDataBaseSink[i].m_pIDataBaseEngineEvent = QUERY_OBJECT_PTR_INTERFACE(pIAttemperEngine, IDataBaseEngineEvent);
  270. }
  271. //数据回调
  272. for (INT i = 0; i < CountArray(m_KernelDataBaseSink); i++)
  273. {
  274. m_KernelDataBaseSink[i].m_pInitParameter = &m_InitParameter;
  275. m_KernelDataBaseSink[i].m_pGameParameter = &m_GameParameter;
  276. m_KernelDataBaseSink[i].m_pDataBaseParameter = &m_DataBaseParameter;
  277. m_KernelDataBaseSink[i].m_pGameServiceAttrib = &m_GameServiceAttrib;
  278. m_KernelDataBaseSink[i].m_pGameServiceOption = &m_GameServiceOption;
  279. m_KernelDataBaseSink[i].m_pIGameServiceManager = m_GameServiceManager.GetInterface();
  280. m_KernelDataBaseSink[i].m_pIDataBaseEngineEvent = QUERY_OBJECT_PTR_INTERFACE(pIAttemperEngine, IDataBaseEngineEvent);
  281. m_KernelDataBaseSink[i].m_pIDBCorrespondManager = (IDBCorrespondManager*)m_DBCorrespondManager.QueryInterface(IID_IDBCorrespondManager, VER_IDBCorrespondManager);
  282. }
  283. //配置网络
  284. m_TCPNetworkEngine->SetServiceParameter(m_GameServiceOption.wServerPort, m_GameServiceOption.wMaxPlayer, szCompilation);
  285. return true;
  286. }
  287. //启动内核
  288. bool CServiceUnits::StartKernelService()
  289. {
  290. //时间引擎
  291. if (m_TimerEngine->StartService() == false)
  292. {
  293. ASSERT(FALSE);
  294. return false;
  295. }
  296. //调度引擎
  297. if (m_AttemperEngine->StartService() == false)
  298. {
  299. ASSERT(FALSE);
  300. return false;
  301. }
  302. //协调引擎
  303. if (m_TCPSocketService->StartService() == false)
  304. {
  305. ASSERT(FALSE);
  306. return false;
  307. }
  308. //数据引擎
  309. if (m_RecordDataBaseEngine->StartService() == false)
  310. {
  311. ASSERT(FALSE);
  312. return false;
  313. }
  314. //数据引擎
  315. if (m_KernelDataBaseEngine->StartService() == false)
  316. {
  317. ASSERT(FALSE);
  318. return false;
  319. }
  320. //数据协调
  321. if (m_DBCorrespondManager.StartService() == false)
  322. {
  323. ASSERT(FALSE);
  324. return false;
  325. }
  326. //启动比赛
  327. if (m_MatchServiceManager.GetInterface() != NULL)
  328. {
  329. if (m_MatchServiceManager->StartService() == false)
  330. {
  331. ASSERT(FALSE);
  332. return false;
  333. }
  334. }
  335. return true;
  336. }
  337. //启动网络
  338. bool CServiceUnits::StartNetworkService()
  339. {
  340. //网络引擎
  341. if (m_TCPNetworkEngine->StartService() == false)
  342. {
  343. ASSERT(FALSE);
  344. return false;
  345. }
  346. return true;
  347. }
  348. //调整参数
  349. bool CServiceUnits::RectifyServiceParameter()
  350. {
  351. //读取属性
  352. m_GameServiceManager->GetServiceAttrib(m_GameServiceAttrib);
  353. if (lstrcmp(m_GameServiceAttrib.szServerDLLName, m_GameServiceManager.m_szModuleDllName) != 0)
  354. {
  355. CTraceService::TraceString(TEXT("游戏模块的绑定 DLL 名字与配置模块 DLL 名字不一致"), TraceLevel_Exception);
  356. return false;
  357. }
  358. //调整参数
  359. if (m_GameServiceManager->RectifyParameter(m_GameServiceOption) == false)
  360. {
  361. CTraceService::TraceString(TEXT("游戏模块调整配置参数失败"), TraceLevel_Exception);
  362. return false;
  363. }
  364. //服务类型
  365. if ((m_GameServiceOption.wServerType&m_GameServiceAttrib.wSupporType) == 0)
  366. {
  367. CTraceService::TraceString(TEXT("游戏模块不支持配置中指定的房间模式类型"), TraceLevel_Exception);
  368. return false;
  369. }
  370. //占位调整
  371. if (m_GameServiceAttrib.wChairCount == MAX_CHAIR)
  372. {
  373. CServerRule::SetAllowAndroidSimulate(m_GameServiceOption.dwServerRule, false);
  374. }
  375. //作弊模式
  376. if ((m_GameServiceOption.cbDistributeRule&DISTRIBUTE_ALLOW) != 0)
  377. {
  378. //禁止规则
  379. CServerRule::SetForfendGameRule(m_GameServiceOption.dwServerRule, true);
  380. //设置作弊
  381. CServerRule::SetAllowAvertCheatMode(m_GameServiceOption.dwServerRule, true);
  382. //最少人数
  383. m_GameServiceOption.wMinDistributeUser = __max(2, m_GameServiceOption.wMinDistributeUser);
  384. //分组间隔
  385. if (m_GameServiceOption.wDistributeTimeSpace == 0)
  386. {
  387. m_GameServiceOption.wDistributeTimeSpace = 15;
  388. }
  389. //最少游戏人数
  390. if (m_GameServiceOption.wMinPartakeGameUser != 0)
  391. {
  392. m_GameServiceOption.wMinPartakeGameUser = __max(m_GameServiceOption.wMinPartakeGameUser, 2);
  393. m_GameServiceOption.wMinPartakeGameUser = __min(m_GameServiceOption.wMinPartakeGameUser, m_GameServiceAttrib.wChairCount);
  394. }
  395. else
  396. {
  397. m_GameServiceOption.wMinPartakeGameUser = m_GameServiceAttrib.wChairCount;
  398. }
  399. //最大游戏人数
  400. if (m_GameServiceOption.wMaxPartakeGameUser != 0)
  401. {
  402. m_GameServiceOption.wMaxPartakeGameUser = __min(m_GameServiceOption.wMaxPartakeGameUser, m_GameServiceAttrib.wChairCount);
  403. m_GameServiceOption.wMaxPartakeGameUser = __max(m_GameServiceOption.wMaxPartakeGameUser, m_GameServiceOption.wMinPartakeGameUser);
  404. }
  405. else
  406. {
  407. m_GameServiceOption.wMaxPartakeGameUser = m_GameServiceAttrib.wChairCount;
  408. }
  409. }
  410. //游戏记录
  411. if (m_GameServiceOption.wServerType&(GAME_GENRE_GOLD | GAME_GENRE_MATCH))
  412. {
  413. CServerRule::SetRecordGameScore(m_GameServiceOption.dwServerRule, true);
  414. }
  415. //即时写分
  416. if (m_GameServiceOption.wServerType&(GAME_GENRE_GOLD | GAME_GENRE_MATCH))
  417. {
  418. CServerRule::SetImmediateWriteScore(m_GameServiceOption.dwServerRule, true);
  419. }
  420. //挂接设置
  421. if (m_GameServiceOption.wSortID == 0) m_GameServiceOption.wSortID = 500;
  422. if (m_GameServiceOption.wKindID == 0) m_GameServiceOption.wKindID = m_GameServiceAttrib.wKindID;
  423. //最大人数
  424. WORD wMaxPlayer = m_GameServiceOption.wTableCount*m_GameServiceAttrib.wChairCount;
  425. m_GameServiceOption.wMaxPlayer = __max(m_GameServiceOption.wMaxPlayer, wMaxPlayer + RESERVE_USER_COUNT);
  426. //最小积分
  427. if (m_GameServiceOption.wServerType&GAME_GENRE_GOLD)
  428. {
  429. m_GameServiceOption.lMinTableScore += m_GameServiceOption.lServiceScore;
  430. m_GameServiceOption.lMinTableScore = __max(m_GameServiceOption.lMinTableScore, m_GameServiceOption.lServiceScore);
  431. }
  432. //限制调整
  433. if (m_GameServiceOption.lMaxEnterScore != 0L)
  434. {
  435. m_GameServiceOption.lMaxEnterScore = __max(m_GameServiceOption.lMaxEnterScore, m_GameServiceOption.lMinTableScore);
  436. }
  437. //比赛配置
  438. if ((m_GameServiceOption.wServerType&GAME_GENRE_MATCH) != 0)
  439. {
  440. if (m_GameMatchOption.dwMatchID == 0)
  441. {
  442. CTraceService::TraceString(TEXT("未加载比赛配置"), TraceLevel_Exception);
  443. return false;
  444. }
  445. }
  446. return true;
  447. }
  448. //设置状态
  449. bool CServiceUnits::SetServiceStatus(enServiceStatus ServiceStatus)
  450. {
  451. //状态判断
  452. if (m_ServiceStatus != ServiceStatus)
  453. {
  454. //错误通知
  455. if ((m_ServiceStatus != ServiceStatus_Service) && (ServiceStatus == ServiceStatus_Stop))
  456. {
  457. LPCTSTR pszString = TEXT("服务启动失败");
  458. CTraceService::TraceString(pszString, TraceLevel_Exception);
  459. }
  460. //设置变量
  461. m_ServiceStatus = ServiceStatus;
  462. //状态通知
  463. ASSERT(m_pIServiceUnitsSink != NULL);
  464. if (m_pIServiceUnitsSink != NULL) m_pIServiceUnitsSink->OnServiceUnitsStatus(m_ServiceStatus);
  465. }
  466. return true;
  467. }
  468. //发送控制
  469. bool CServiceUnits::SendControlPacket(WORD wControlID, VOID * pData, WORD wDataSize)
  470. {
  471. //状态效验
  472. ASSERT(m_AttemperEngine.GetInterface() != NULL);
  473. if (m_AttemperEngine.GetInterface() == NULL) return false;
  474. //发送控制
  475. m_AttemperEngine->OnEventControl(wControlID, pData, wDataSize);
  476. return true;
  477. }
  478. //连接信息
  479. bool CServiceUnits::LoadDataBaseParameter(LPCTSTR pszDataBaseAddr, LPCTSTR pszDataBaseName, tagDataBaseParameter & DataBaseParameter)
  480. {
  481. //变量定义
  482. CDataBaseAide PlatformDBAide;
  483. CDataBaseHelper PlatformDBModule;
  484. //创建对象
  485. if ((PlatformDBModule.GetInterface() == NULL) && (PlatformDBModule.CreateInstance() == false))
  486. {
  487. ASSERT(FALSE);
  488. return false;
  489. }
  490. //变量定义
  491. tagDataBaseParameter * pPlatformDBParameter = &m_InitParameter.m_PlatformDBParameter;
  492. //设置连接
  493. PlatformDBModule->SetConnectionInfo(pPlatformDBParameter->szDataBaseAddr, pPlatformDBParameter->wDataBasePort,
  494. pPlatformDBParameter->szDataBaseName, pPlatformDBParameter->szDataBaseUser, pPlatformDBParameter->szDataBasePass);
  495. //获取信息
  496. try
  497. {
  498. //发起连接
  499. PlatformDBModule->OpenConnection();
  500. PlatformDBAide.SetDataBase(PlatformDBModule.GetInterface());
  501. //连接信息
  502. PlatformDBAide.ResetParameter();
  503. PlatformDBAide.AddParameter(TEXT("@strDataBaseAddr"), pszDataBaseAddr);
  504. //执行查询
  505. if (PlatformDBAide.ExecuteProcess(TEXT("GSP_GS_LoadDataBaseInfo"), true) != DB_SUCCESS)
  506. {
  507. //构造信息
  508. TCHAR szErrorDescribe[128] = TEXT("");
  509. PlatformDBAide.GetValue_String(TEXT("ErrorDescribe"), szErrorDescribe, CountArray(szErrorDescribe));
  510. //提示消息
  511. CTraceService::TraceString(szErrorDescribe, TraceLevel_Exception);
  512. return false;
  513. }
  514. //读取密文
  515. TCHAR szDBUserRead[512] = TEXT(""), szDBPassRead[512] = TEXT("");
  516. PlatformDBAide.GetValue_String(TEXT("DBUser"), szDBUserRead, CountArray(szDBUserRead));
  517. PlatformDBAide.GetValue_String(TEXT("DBPassword"), szDBPassRead, CountArray(szDBPassRead));
  518. //获取信息
  519. DataBaseParameter.wDataBasePort = PlatformDBAide.GetValue_WORD(TEXT("DBPort"));
  520. lstrcpyn(DataBaseParameter.szDataBaseAddr, pszDataBaseAddr, CountArray(DataBaseParameter.szDataBaseAddr));
  521. lstrcpyn(DataBaseParameter.szDataBaseName, pszDataBaseName, CountArray(DataBaseParameter.szDataBaseName));
  522. //解密密文
  523. TCHAR szDataBaseUser[32] = TEXT(""), szDataBasePass[32] = TEXT("");
  524. CWHEncrypt::XorCrevasse(szDBUserRead, DataBaseParameter.szDataBaseUser, CountArray(DataBaseParameter.szDataBaseUser));
  525. CWHEncrypt::XorCrevasse(szDBPassRead, DataBaseParameter.szDataBasePass, CountArray(DataBaseParameter.szDataBasePass));
  526. }
  527. catch (IDataBaseException * pIException)
  528. {
  529. //错误信息
  530. LPCTSTR pszDescribe = pIException->GetExceptionDescribe();
  531. CTraceService::TraceString(pszDescribe, TraceLevel_Exception);
  532. return false;
  533. }
  534. return true;
  535. }
  536. //控制消息
  537. LRESULT CServiceUnits::OnUIControlRequest(WPARAM wParam, LPARAM lParam)
  538. {
  539. //变量定义
  540. tagDataHead DataHead;
  541. BYTE cbBuffer[MAX_ASYNCHRONISM_DATA];
  542. //提取数据
  543. CWHDataLocker DataLocker(m_CriticalSection);
  544. if (m_DataQueue.DistillData(DataHead, cbBuffer, sizeof(cbBuffer)) == false)
  545. {
  546. ASSERT(FALSE);
  547. return NULL;
  548. }
  549. //数据处理
  550. switch (DataHead.wIdentifier)
  551. {
  552. case UI_CORRESPOND_RESULT: //协调成功
  553. {
  554. //效验消息
  555. ASSERT(DataHead.wDataSize == sizeof(CP_ControlResult));
  556. if (DataHead.wDataSize != sizeof(CP_ControlResult)) return 0;
  557. //变量定义
  558. CP_ControlResult * pControlResult = (CP_ControlResult *)cbBuffer;
  559. //失败处理
  560. if ((m_ServiceStatus != ServiceStatus_Service) && (pControlResult->cbSuccess == ER_FAILURE))
  561. {
  562. ConcludeService();
  563. return 0;
  564. }
  565. //成功处理
  566. if ((m_ServiceStatus != ServiceStatus_Service) && (pControlResult->cbSuccess == ER_SUCCESS))
  567. {
  568. //设置状态
  569. SetServiceStatus(ServiceStatus_Service);
  570. }
  571. return 0;
  572. }
  573. case UI_SERVICE_CONFIG_RESULT: //配置结果
  574. {
  575. //效验消息
  576. ASSERT(DataHead.wDataSize == sizeof(CP_ControlResult));
  577. if (DataHead.wDataSize != sizeof(CP_ControlResult)) return 0;
  578. //变量定义
  579. CP_ControlResult * pControlResult = (CP_ControlResult *)cbBuffer;
  580. //失败处理
  581. if ((m_ServiceStatus != ServiceStatus_Service) && (pControlResult->cbSuccess == ER_FAILURE))
  582. {
  583. ConcludeService();
  584. return 0;
  585. }
  586. //成功处理
  587. if ((m_ServiceStatus != ServiceStatus_Service) && (pControlResult->cbSuccess == ER_SUCCESS))
  588. {
  589. //启动网络
  590. if (StartNetworkService() == false)
  591. {
  592. ConcludeService();
  593. return 0;
  594. }
  595. //连接协调
  596. SendControlPacket(CT_CONNECT_CORRESPOND, NULL, 0);
  597. }
  598. return 0;
  599. }
  600. }
  601. return 0;
  602. }
  603. //////////////////////////////////////////////////////////////////////////////////