诸暨麻将添加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.
 
 
 
 
 
 

737 rivejä
26 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. //连接redis
  286. m_RedisClient = std::make_shared<RedisBase>();
  287. m_RedisClient->Connect(m_InitParameter.m_RedisHost, m_InitParameter.m_RedisPort, m_InitParameter.m_RedisDb, m_InitParameter.m_RedisTimeOut, m_InitParameter.m_RedisMaxReconnect, m_InitParameter.m_RedisReconnectInterval);
  288. m_AttemperEngineSink.m_RedisClient = m_RedisClient;
  289. return true;
  290. }
  291. //启动内核
  292. bool CServiceUnits::StartKernelService()
  293. {
  294. //时间引擎
  295. if (m_TimerEngine->StartService() == false)
  296. {
  297. ASSERT(FALSE);
  298. return false;
  299. }
  300. //调度引擎
  301. if (m_AttemperEngine->StartService() == false)
  302. {
  303. ASSERT(FALSE);
  304. return false;
  305. }
  306. //协调引擎
  307. if (m_TCPSocketService->StartService() == false)
  308. {
  309. ASSERT(FALSE);
  310. return false;
  311. }
  312. //数据引擎
  313. if (m_RecordDataBaseEngine->StartService() == false)
  314. {
  315. ASSERT(FALSE);
  316. return false;
  317. }
  318. //数据引擎
  319. if (m_KernelDataBaseEngine->StartService() == false)
  320. {
  321. ASSERT(FALSE);
  322. return false;
  323. }
  324. //数据协调
  325. if (m_DBCorrespondManager.StartService() == false)
  326. {
  327. ASSERT(FALSE);
  328. return false;
  329. }
  330. //启动比赛
  331. if (m_MatchServiceManager.GetInterface() != NULL)
  332. {
  333. if (m_MatchServiceManager->StartService() == false)
  334. {
  335. ASSERT(FALSE);
  336. return false;
  337. }
  338. }
  339. return true;
  340. }
  341. //启动网络
  342. bool CServiceUnits::StartNetworkService()
  343. {
  344. //网络引擎
  345. if (m_TCPNetworkEngine->StartService() == false)
  346. {
  347. ASSERT(FALSE);
  348. return false;
  349. }
  350. return true;
  351. }
  352. //调整参数
  353. bool CServiceUnits::RectifyServiceParameter()
  354. {
  355. //读取属性
  356. m_GameServiceManager->GetServiceAttrib(m_GameServiceAttrib);
  357. if (lstrcmp(m_GameServiceAttrib.szServerDLLName, m_GameServiceManager.m_szModuleDllName) != 0)
  358. {
  359. CTraceService::TraceString(TEXT("游戏模块的绑定 DLL 名字与配置模块 DLL 名字不一致"), TraceLevel_Exception);
  360. return false;
  361. }
  362. //调整参数
  363. if (m_GameServiceManager->RectifyParameter(m_GameServiceOption) == false)
  364. {
  365. CTraceService::TraceString(TEXT("游戏模块调整配置参数失败"), TraceLevel_Exception);
  366. return false;
  367. }
  368. //服务类型
  369. if ((m_GameServiceOption.wServerType&m_GameServiceAttrib.wSupporType) == 0)
  370. {
  371. CTraceService::TraceString(TEXT("游戏模块不支持配置中指定的房间模式类型"), TraceLevel_Exception);
  372. return false;
  373. }
  374. //占位调整
  375. if (m_GameServiceAttrib.wChairCount == MAX_CHAIR)
  376. {
  377. CServerRule::SetAllowAndroidSimulate(m_GameServiceOption.dwServerRule, false);
  378. }
  379. //作弊模式
  380. if ((m_GameServiceOption.cbDistributeRule&DISTRIBUTE_ALLOW) != 0)
  381. {
  382. //禁止规则
  383. CServerRule::SetForfendGameRule(m_GameServiceOption.dwServerRule, true);
  384. //设置作弊
  385. CServerRule::SetAllowAvertCheatMode(m_GameServiceOption.dwServerRule, true);
  386. //最少人数
  387. m_GameServiceOption.wMinDistributeUser = __max(2, m_GameServiceOption.wMinDistributeUser);
  388. //分组间隔
  389. if (m_GameServiceOption.wDistributeTimeSpace == 0)
  390. {
  391. m_GameServiceOption.wDistributeTimeSpace = 15;
  392. }
  393. //最少游戏人数
  394. if (m_GameServiceOption.wMinPartakeGameUser != 0)
  395. {
  396. m_GameServiceOption.wMinPartakeGameUser = __max(m_GameServiceOption.wMinPartakeGameUser, 2);
  397. m_GameServiceOption.wMinPartakeGameUser = __min(m_GameServiceOption.wMinPartakeGameUser, m_GameServiceAttrib.wChairCount);
  398. }
  399. else
  400. {
  401. m_GameServiceOption.wMinPartakeGameUser = m_GameServiceAttrib.wChairCount;
  402. }
  403. //最大游戏人数
  404. if (m_GameServiceOption.wMaxPartakeGameUser != 0)
  405. {
  406. m_GameServiceOption.wMaxPartakeGameUser = __min(m_GameServiceOption.wMaxPartakeGameUser, m_GameServiceAttrib.wChairCount);
  407. m_GameServiceOption.wMaxPartakeGameUser = __max(m_GameServiceOption.wMaxPartakeGameUser, m_GameServiceOption.wMinPartakeGameUser);
  408. }
  409. else
  410. {
  411. m_GameServiceOption.wMaxPartakeGameUser = m_GameServiceAttrib.wChairCount;
  412. }
  413. }
  414. //游戏记录
  415. if (m_GameServiceOption.wServerType&(GAME_GENRE_GOLD | GAME_GENRE_MATCH))
  416. {
  417. CServerRule::SetRecordGameScore(m_GameServiceOption.dwServerRule, true);
  418. }
  419. //即时写分
  420. if (m_GameServiceOption.wServerType&(GAME_GENRE_GOLD | GAME_GENRE_MATCH))
  421. {
  422. CServerRule::SetImmediateWriteScore(m_GameServiceOption.dwServerRule, true);
  423. }
  424. //挂接设置
  425. if (m_GameServiceOption.wSortID == 0) m_GameServiceOption.wSortID = 500;
  426. if (m_GameServiceOption.wKindID == 0) m_GameServiceOption.wKindID = m_GameServiceAttrib.wKindID;
  427. //最大人数
  428. WORD wMaxPlayer = m_GameServiceOption.wTableCount*m_GameServiceAttrib.wChairCount;
  429. m_GameServiceOption.wMaxPlayer = __max(m_GameServiceOption.wMaxPlayer, wMaxPlayer + RESERVE_USER_COUNT);
  430. //最小积分
  431. if (m_GameServiceOption.wServerType&GAME_GENRE_GOLD)
  432. {
  433. m_GameServiceOption.lMinTableScore += m_GameServiceOption.lServiceScore;
  434. m_GameServiceOption.lMinTableScore = __max(m_GameServiceOption.lMinTableScore, m_GameServiceOption.lServiceScore);
  435. }
  436. //限制调整
  437. if (m_GameServiceOption.lMaxEnterScore != 0L)
  438. {
  439. m_GameServiceOption.lMaxEnterScore = __max(m_GameServiceOption.lMaxEnterScore, m_GameServiceOption.lMinTableScore);
  440. }
  441. //比赛配置
  442. if ((m_GameServiceOption.wServerType&GAME_GENRE_MATCH) != 0)
  443. {
  444. if (m_GameMatchOption.dwMatchID == 0)
  445. {
  446. CTraceService::TraceString(TEXT("未加载比赛配置"), TraceLevel_Exception);
  447. return false;
  448. }
  449. }
  450. return true;
  451. }
  452. //设置状态
  453. bool CServiceUnits::SetServiceStatus(enServiceStatus ServiceStatus)
  454. {
  455. //状态判断
  456. if (m_ServiceStatus != ServiceStatus)
  457. {
  458. //错误通知
  459. if ((m_ServiceStatus != ServiceStatus_Service) && (ServiceStatus == ServiceStatus_Stop))
  460. {
  461. LPCTSTR pszString = TEXT("服务启动失败");
  462. CTraceService::TraceString(pszString, TraceLevel_Exception);
  463. }
  464. //设置变量
  465. m_ServiceStatus = ServiceStatus;
  466. //状态通知
  467. ASSERT(m_pIServiceUnitsSink != NULL);
  468. if (m_pIServiceUnitsSink != NULL) m_pIServiceUnitsSink->OnServiceUnitsStatus(m_ServiceStatus);
  469. }
  470. return true;
  471. }
  472. //发送控制
  473. bool CServiceUnits::SendControlPacket(WORD wControlID, VOID * pData, WORD wDataSize)
  474. {
  475. //状态效验
  476. ASSERT(m_AttemperEngine.GetInterface() != NULL);
  477. if (m_AttemperEngine.GetInterface() == NULL) return false;
  478. //发送控制
  479. m_AttemperEngine->OnEventControl(wControlID, pData, wDataSize);
  480. return true;
  481. }
  482. //连接信息
  483. bool CServiceUnits::LoadDataBaseParameter(LPCTSTR pszDataBaseAddr, LPCTSTR pszDataBaseName, tagDataBaseParameter & DataBaseParameter)
  484. {
  485. //变量定义
  486. CDataBaseAide PlatformDBAide;
  487. CDataBaseHelper PlatformDBModule;
  488. //创建对象
  489. if ((PlatformDBModule.GetInterface() == NULL) && (PlatformDBModule.CreateInstance() == false))
  490. {
  491. ASSERT(FALSE);
  492. return false;
  493. }
  494. //变量定义
  495. tagDataBaseParameter * pPlatformDBParameter = &m_InitParameter.m_PlatformDBParameter;
  496. //设置连接
  497. PlatformDBModule->SetConnectionInfo(pPlatformDBParameter->szDataBaseAddr, pPlatformDBParameter->wDataBasePort,
  498. pPlatformDBParameter->szDataBaseName, pPlatformDBParameter->szDataBaseUser, pPlatformDBParameter->szDataBasePass);
  499. //获取信息
  500. try
  501. {
  502. //发起连接
  503. PlatformDBModule->OpenConnection();
  504. PlatformDBAide.SetDataBase(PlatformDBModule.GetInterface());
  505. //连接信息
  506. PlatformDBAide.ResetParameter();
  507. PlatformDBAide.AddParameter(TEXT("@strDataBaseAddr"), pszDataBaseAddr);
  508. //执行查询
  509. if (PlatformDBAide.ExecuteProcess(TEXT("GSP_GS_LoadDataBaseInfo"), true) != DB_SUCCESS)
  510. {
  511. //构造信息
  512. TCHAR szErrorDescribe[128] = TEXT("");
  513. PlatformDBAide.GetValue_String(TEXT("ErrorDescribe"), szErrorDescribe, CountArray(szErrorDescribe));
  514. //提示消息
  515. CTraceService::TraceString(szErrorDescribe, TraceLevel_Exception);
  516. return false;
  517. }
  518. //读取密文
  519. TCHAR szDBUserRead[512] = TEXT(""), szDBPassRead[512] = TEXT("");
  520. PlatformDBAide.GetValue_String(TEXT("DBUser"), szDBUserRead, CountArray(szDBUserRead));
  521. PlatformDBAide.GetValue_String(TEXT("DBPassword"), szDBPassRead, CountArray(szDBPassRead));
  522. //获取信息
  523. DataBaseParameter.wDataBasePort = PlatformDBAide.GetValue_WORD(TEXT("DBPort"));
  524. lstrcpyn(DataBaseParameter.szDataBaseAddr, pszDataBaseAddr, CountArray(DataBaseParameter.szDataBaseAddr));
  525. lstrcpyn(DataBaseParameter.szDataBaseName, pszDataBaseName, CountArray(DataBaseParameter.szDataBaseName));
  526. //解密密文
  527. TCHAR szDataBaseUser[32] = TEXT(""), szDataBasePass[32] = TEXT("");
  528. CWHEncrypt::XorCrevasse(szDBUserRead, DataBaseParameter.szDataBaseUser, CountArray(DataBaseParameter.szDataBaseUser));
  529. CWHEncrypt::XorCrevasse(szDBPassRead, DataBaseParameter.szDataBasePass, CountArray(DataBaseParameter.szDataBasePass));
  530. }
  531. catch (IDataBaseException * pIException)
  532. {
  533. //错误信息
  534. LPCTSTR pszDescribe = pIException->GetExceptionDescribe();
  535. CTraceService::TraceString(pszDescribe, TraceLevel_Exception);
  536. return false;
  537. }
  538. return true;
  539. }
  540. //控制消息
  541. LRESULT CServiceUnits::OnUIControlRequest(WPARAM wParam, LPARAM lParam)
  542. {
  543. //变量定义
  544. tagDataHead DataHead;
  545. BYTE cbBuffer[MAX_ASYNCHRONISM_DATA];
  546. //提取数据
  547. CWHDataLocker DataLocker(m_CriticalSection);
  548. if (m_DataQueue.DistillData(DataHead, cbBuffer, sizeof(cbBuffer)) == false)
  549. {
  550. ASSERT(FALSE);
  551. return NULL;
  552. }
  553. //数据处理
  554. switch (DataHead.wIdentifier)
  555. {
  556. case UI_CORRESPOND_RESULT: //协调成功
  557. {
  558. //效验消息
  559. ASSERT(DataHead.wDataSize == sizeof(CP_ControlResult));
  560. if (DataHead.wDataSize != sizeof(CP_ControlResult)) return 0;
  561. //变量定义
  562. CP_ControlResult * pControlResult = (CP_ControlResult *)cbBuffer;
  563. //失败处理
  564. if ((m_ServiceStatus != ServiceStatus_Service) && (pControlResult->cbSuccess == ER_FAILURE))
  565. {
  566. ConcludeService();
  567. return 0;
  568. }
  569. //成功处理
  570. if ((m_ServiceStatus != ServiceStatus_Service) && (pControlResult->cbSuccess == ER_SUCCESS))
  571. {
  572. //设置状态
  573. SetServiceStatus(ServiceStatus_Service);
  574. }
  575. return 0;
  576. }
  577. case UI_SERVICE_CONFIG_RESULT: //配置结果
  578. {
  579. //效验消息
  580. ASSERT(DataHead.wDataSize == sizeof(CP_ControlResult));
  581. if (DataHead.wDataSize != sizeof(CP_ControlResult)) return 0;
  582. //变量定义
  583. CP_ControlResult * pControlResult = (CP_ControlResult *)cbBuffer;
  584. //失败处理
  585. if ((m_ServiceStatus != ServiceStatus_Service) && (pControlResult->cbSuccess == ER_FAILURE))
  586. {
  587. ConcludeService();
  588. return 0;
  589. }
  590. //成功处理
  591. if ((m_ServiceStatus != ServiceStatus_Service) && (pControlResult->cbSuccess == ER_SUCCESS))
  592. {
  593. //启动网络
  594. if (StartNetworkService() == false)
  595. {
  596. ConcludeService();
  597. return 0;
  598. }
  599. //连接协调
  600. SendControlPacket(CT_CONNECT_CORRESPOND, NULL, 0);
  601. }
  602. return 0;
  603. }
  604. }
  605. return 0;
  606. }
  607. //////////////////////////////////////////////////////////////////////////////////