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

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