#include "StdAfx.h" #include "ServiceUnits.h" #include "ControlPacket.h" #include "HttpThread.h" #include "google/protobuf/stubs/common.h" ////////////////////////////////////////////////////////////////////////////////// //静态变量 CServiceUnits * CServiceUnits::g_pServiceUnits = NULL; //对象指针 ////////////////////////////////////////////////////////////////////////////////// BEGIN_MESSAGE_MAP(CServiceUnits, CWnd) ON_MESSAGE(WM_UICONTROL_REQUEST, OnUIControlRequest) END_MESSAGE_MAP() ////////////////////////////////////////////////////////////////////////////////// //构造函数 CServiceUnits::CServiceUnits() { //设置变量 m_ServiceStatus = ServiceStatus_Stop; //设置接口 m_pIServiceUnitsSink = NULL; //设置对象 ASSERT(g_pServiceUnits == NULL); if (g_pServiceUnits == NULL) g_pServiceUnits = this; return; } //析构函数 CServiceUnits::~CServiceUnits() { ConcludeService(); } //启动服务 bool CServiceUnits::StartService() { Logger::GetInstance().InitDefaultLog("LoginServer", "daily_log.log"); //效验状态 ASSERT(m_ServiceStatus == ServiceStatus_Stop); if (m_ServiceStatus != ServiceStatus_Stop) return false; //设置状态 SetServiceStatus(ServiceStatus_Config); //创建窗口 if (m_hWnd == NULL) { CRect rcCreate(0, 0, 0, 0); Create(NULL, NULL, WS_CHILD, rcCreate, AfxGetMainWnd(), 100); } //配置服务 if (InitializeService() == false) { ConcludeService(); return false; } //启动内核 if (StartKernelService() == false) { ConcludeService(); return false; } //获取列表 SendControlPacket(CT_LOAD_DB_GAME_LIST, NULL, 0); //启动GET请求队列 CHttpClient::start(&m_AttemperEngineSink); return true; } //停止服务 bool CServiceUnits::ConcludeService() { //停止GET请求队列 CHttpClient::end(); //设置变量 SetServiceStatus(ServiceStatus_Stop); //停止服务 if (m_TimerEngine.GetInterface() != NULL) m_TimerEngine->ConcludeService(); if (m_AttemperEngine.GetInterface() != NULL) m_AttemperEngine->ConcludeService(); if (m_DataBaseEngine.GetInterface() != NULL) m_DataBaseEngine->ConcludeService(); if (m_TCPNetworkEngine.GetInterface() != NULL) m_TCPNetworkEngine->ConcludeService(); if (m_TCPSocketService.GetInterface() != NULL) m_TCPSocketService->ConcludeService(); //c++中使用google protobuf在关闭应用程序之前需要调用google::protobuf::ShutdownProtobufLibrary();要不然会有内存泄露 google::protobuf::ShutdownProtobufLibrary(); Logger::ShutDown(); m_RedisClient->DisConnect(); return true; } //设置接口 bool CServiceUnits::SetServiceUnitsSink(IServiceUnitsSink * pIServiceUnitsSink) { //设置变量 m_pIServiceUnitsSink = pIServiceUnitsSink; return true; } //投递请求 bool CServiceUnits::PostControlRequest(WORD wIdentifier, VOID * pData, WORD wDataSize) { //状态判断 ASSERT(IsWindow(m_hWnd)); if (IsWindow(m_hWnd) == FALSE) return false; //插入队列 CWHDataLocker DataLocker(m_CriticalSection); if (m_DataQueue.InsertData(wIdentifier, pData, wDataSize) == false) return false; //发送消息 PostMessage(WM_UICONTROL_REQUEST, wIdentifier, wDataSize); return true; } //配置组件 bool CServiceUnits::InitializeService() { //加载参数 m_InitParameter.LoadInitParameter(); //创建组件 if ((m_TimerEngine.GetInterface() == NULL) && (m_TimerEngine.CreateInstance() == false)) return false; if ((m_AttemperEngine.GetInterface() == NULL) && (m_AttemperEngine.CreateInstance() == false)) return false; if ((m_DataBaseEngine.GetInterface() == NULL) && (m_DataBaseEngine.CreateInstance() == false)) return false; if ((m_TCPNetworkEngine.GetInterface() == NULL) && (m_TCPNetworkEngine.CreateInstance() == false)) return false; if ((m_TCPSocketService.GetInterface() == NULL) && (m_TCPSocketService.CreateInstance() == false)) return false; //组件接口 IUnknownEx * pIAttemperEngine = m_AttemperEngine.GetInterface(); IUnknownEx * pITCPNetworkEngine = m_TCPNetworkEngine.GetInterface(); IUnknownEx * pIAttemperEngineSink = QUERY_OBJECT_INTERFACE(m_AttemperEngineSink, IUnknownEx); //数据引擎 IUnknownEx * pIDataBaseEngineSink[CountArray(m_DataBaseEngineSink)]; for (WORD i = 0; i < CountArray(pIDataBaseEngineSink); i++) pIDataBaseEngineSink[i] = QUERY_OBJECT_INTERFACE(m_DataBaseEngineSink[i], IUnknownEx); //内核组件 if (m_TimerEngine->SetTimerEngineEvent(pIAttemperEngine) == false) return false; if (m_AttemperEngine->SetNetworkEngine(pITCPNetworkEngine) == false) return false; if (m_AttemperEngine->SetAttemperEngineSink(pIAttemperEngineSink) == false) return false; if (m_TCPNetworkEngine->SetTCPNetworkEngineEvent(pIAttemperEngine) == false) return false; if (m_DataBaseEngine->SetDataBaseEngineSink(pIDataBaseEngineSink, CountArray(pIDataBaseEngineSink)) == false) return false; //协调服务 if (m_TCPSocketService->SetServiceID(NETWORK_CORRESPOND) == false) return false; if (m_TCPSocketService->SetTCPSocketEvent(pIAttemperEngine) == false) return false; //调度回调 m_AttemperEngineSink.m_pInitParameter = &m_InitParameter; m_AttemperEngineSink.m_pITimerEngine = m_TimerEngine.GetInterface(); m_AttemperEngineSink.m_pIDataBaseEngine = m_DataBaseEngine.GetInterface(); m_AttemperEngineSink.m_pITCPNetworkEngine = m_TCPNetworkEngine.GetInterface(); m_AttemperEngineSink.m_pITCPSocketService = m_TCPSocketService.GetInterface(); //数据库回调 for (INT i = 0; i < CountArray(m_DataBaseEngineSink); i++) { m_DataBaseEngineSink[i].m_pInitParameter = &m_InitParameter; m_DataBaseEngineSink[i].m_pIDataBaseEngineEvent = QUERY_OBJECT_PTR_INTERFACE(pIAttemperEngine, IDataBaseEngineEvent); } //配置网络 WORD wMaxConnect = m_InitParameter.m_wMaxConnect; WORD wServicePort = m_InitParameter.m_wServicePort; if (m_TCPNetworkEngine->SetServiceParameter(wServicePort, wMaxConnect, szCompilation) == false) return false; //连接redis m_RedisClient = std::make_shared(); 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); m_AttemperEngineSink.m_RedisClient = m_RedisClient; return true; } //启动内核 bool CServiceUnits::StartKernelService() { //时间引擎 if (m_TimerEngine->StartService() == false) { ASSERT(FALSE); return false; } //调度引擎 if (m_AttemperEngine->StartService() == false) { ASSERT(FALSE); return false; } //数据引擎 if (m_DataBaseEngine->StartService() == false) { ASSERT(FALSE); return false; } //协调引擎 if (m_TCPSocketService->StartService() == false) { ASSERT(FALSE); return false; } return true; } //启动网络 bool CServiceUnits::StartNetworkService() { //网络引擎 if (m_TCPNetworkEngine->StartService() == false) { ASSERT(FALSE); return false; } return true; } //设置状态 bool CServiceUnits::SetServiceStatus(enServiceStatus ServiceStatus) { //状态判断 if (m_ServiceStatus != ServiceStatus) { //错误通知 if ((m_ServiceStatus != ServiceStatus_Service) && (ServiceStatus == ServiceStatus_Stop)) { LPCTSTR pszString = TEXT("服务启动失败"); CTraceService::TraceString(pszString, TraceLevel_Exception); } //设置变量 m_ServiceStatus = ServiceStatus; //状态通知 ASSERT(m_pIServiceUnitsSink != NULL); if (m_pIServiceUnitsSink != NULL) m_pIServiceUnitsSink->OnServiceUnitsStatus(m_ServiceStatus); } return true; } //发送控制 bool CServiceUnits::SendControlPacket(WORD wControlID, VOID * pData, WORD wDataSize) { //状态效验 ASSERT(m_AttemperEngine.GetInterface() != NULL); if (m_AttemperEngine.GetInterface() == NULL) return false; //发送控制 m_AttemperEngine->OnEventControl(wControlID, pData, wDataSize); return true; } //控制消息 LRESULT CServiceUnits::OnUIControlRequest(WPARAM wParam, LPARAM lParam) { //变量定义 tagDataHead DataHead; BYTE cbBuffer[MAX_ASYNCHRONISM_DATA]; //提取数据 CWHDataLocker DataLocker(m_CriticalSection); if (m_DataQueue.DistillData(DataHead, cbBuffer, sizeof(cbBuffer)) == false) { ASSERT(FALSE); return NULL; } //数据处理 switch (DataHead.wIdentifier) { case UI_LOAD_DB_LIST_RESULT: //列表结果 { //效验消息 ASSERT(DataHead.wDataSize == sizeof(CP_ControlResult)); if (DataHead.wDataSize != sizeof(CP_ControlResult)) return 0; //变量定义 CP_ControlResult * pControlResult = (CP_ControlResult *)cbBuffer; //失败处理 if ((m_ServiceStatus != ServiceStatus_Service) && (pControlResult->cbSuccess == ER_FAILURE)) { ConcludeService(); return 0; } //成功处理 if ((m_ServiceStatus != ServiceStatus_Service) && (pControlResult->cbSuccess == ER_SUCCESS)) { //连接协调 SendControlPacket(CT_CONNECT_CORRESPOND, NULL, 0); } return 0; } case UI_CORRESPOND_RESULT: //协调结果 { //效验消息 ASSERT(DataHead.wDataSize == sizeof(CP_ControlResult)); if (DataHead.wDataSize != sizeof(CP_ControlResult)) return 0; //变量定义 CP_ControlResult * pControlResult = (CP_ControlResult *)cbBuffer; //失败处理 if ((m_ServiceStatus != ServiceStatus_Service) && (pControlResult->cbSuccess == ER_FAILURE)) { ConcludeService(); return 0; } //成功处理 if ((m_ServiceStatus != ServiceStatus_Service) && (pControlResult->cbSuccess == ER_SUCCESS)) { //启动网络 if (StartNetworkService() == false) { ConcludeService(); return 0; } //设置状态 SetServiceStatus(ServiceStatus_Service); } return 0; } } return 0; } //////////////////////////////////////////////////////////////////////////////////