#include "StdAfx.h" #include "ServiceUnits.h" #include "ControlPacket.h" #include "Shop.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; //组件配置 ZeroMemory(&m_GameParameter, sizeof(m_GameParameter)); ZeroMemory(&m_DataBaseParameter, sizeof(m_DataBaseParameter)); ZeroMemory(&m_GameServiceAttrib, sizeof(m_GameServiceAttrib)); ZeroMemory(&m_GameServiceOption, sizeof(m_GameServiceOption)); ZeroMemory(&m_GameMatchOption, sizeof(m_GameMatchOption)); return; } //析构函数 CServiceUnits::~CServiceUnits() { } //设置接口 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::StartService() { //效验状态 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 (CreateServiceDLL() == false) { ConcludeService(); return false; } //调整参数 if (RectifyServiceParameter() == false) { ConcludeService(); return false; } //配置服务 if (InitializeService() == false) { ConcludeService(); return false; } //启动内核 if (StartKernelService() == false) { ConcludeService(); return false; } //加载配置 SendControlPacket(CT_LOAD_SERVICE_CONFIG, 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_TCPSocketService.GetInterface() != NULL) m_TCPSocketService->ConcludeService(); if (m_TCPNetworkEngine.GetInterface() != NULL) m_TCPNetworkEngine->ConcludeService(); //数据引擎 if (m_RecordDataBaseEngine.GetInterface() != NULL) m_RecordDataBaseEngine->ConcludeService(); if (m_KernelDataBaseEngine.GetInterface() != NULL) m_KernelDataBaseEngine->ConcludeService(); m_DBCorrespondManager.ConcludeService(); //注销组件 if (m_GameServiceManager.GetInterface() != NULL) m_GameServiceManager.CloseInstance(); if (m_MatchServiceManager.GetInterface() != NULL)m_MatchServiceManager.CloseInstance(); //c++中使用google protobuf在关闭应用程序之前需要调用google::protobuf::ShutdownProtobufLibrary();要不然会有内存泄露 google::protobuf::ShutdownProtobufLibrary(); // _CrtDumpMemoryLeaks();//@yuanjing return true; } //游戏配置 bool CServiceUnits::CollocateService(LPCTSTR pszGameModule, tagGameServiceOption & GameServiceOption, std::vector& vecVenueInfo) { //效验状态 ASSERT(m_ServiceStatus == ServiceStatus_Stop); if (m_ServiceStatus != ServiceStatus_Stop) return false; //配置模块 m_GameServiceOption = GameServiceOption; m_GameServiceManager.SetModuleCreateInfo(pszGameModule, GAME_SERVICE_CREATE_NAME); m_vecVenueInfo = vecVenueInfo; return true; } //游戏配置 bool CServiceUnits::CollocateService(tagGameMatchOption & GameMatchOption, std::vector& vecVenueInfo) { //效验状态 ASSERT(m_ServiceStatus == ServiceStatus_Stop); if (m_ServiceStatus != ServiceStatus_Stop) return false; //设置变量 m_GameMatchOption = GameMatchOption; m_vecVenueInfo = vecVenueInfo; return true; } //创建模块 bool CServiceUnits::CreateServiceDLL() { //时间引擎 if ((m_TimerEngine.GetInterface() == NULL) && (m_TimerEngine.CreateInstance() == false)) { CTraceService::TraceString(m_TimerEngine.GetErrorDescribe(), TraceLevel_Exception); return false; } //调度引擎 if ((m_AttemperEngine.GetInterface() == NULL) && (m_AttemperEngine.CreateInstance() == false)) { CTraceService::TraceString(m_AttemperEngine.GetErrorDescribe(), TraceLevel_Exception); return false; } //网络组件 if ((m_TCPSocketService.GetInterface() == NULL) && (m_TCPSocketService.CreateInstance() == false)) { CTraceService::TraceString(m_TCPSocketService.GetErrorDescribe(), TraceLevel_Exception); return false; } //网络引擎 if ((m_TCPNetworkEngine.GetInterface() == NULL) && (m_TCPNetworkEngine.CreateInstance() == false)) { CTraceService::TraceString(m_TCPNetworkEngine.GetErrorDescribe(), TraceLevel_Exception); return false; } //数据组件 if ((m_KernelDataBaseEngine.GetInterface() == NULL) && (m_KernelDataBaseEngine.CreateInstance() == false)) { CTraceService::TraceString(m_KernelDataBaseEngine.GetErrorDescribe(), TraceLevel_Exception); return false; } //数据组件 if ((m_RecordDataBaseEngine.GetInterface() == NULL) && (m_RecordDataBaseEngine.CreateInstance() == false)) { CTraceService::TraceString(m_RecordDataBaseEngine.GetErrorDescribe(), TraceLevel_Exception); return false; } //游戏模块 if ((m_GameServiceManager.GetInterface() == NULL) && (m_GameServiceManager.CreateInstance() == false)) { CTraceService::TraceString(m_GameServiceManager.GetErrorDescribe(), TraceLevel_Exception); return false; } //比赛模块 if ((m_GameServiceOption.wServerType&GAME_GENRE_MATCH) != 0) { if ((m_MatchServiceManager.GetInterface() == NULL) && (m_MatchServiceManager.CreateInstance() == false)) { CTraceService::TraceString(m_MatchServiceManager.GetErrorDescribe(), TraceLevel_Exception); return false; } } return true; } //配置组件 bool CServiceUnits::InitializeService() { //加载参数 m_InitParameter.LoadInitParameter(); //配置参数 m_GameParameter.wMedalRate = 1L; m_GameParameter.wRevenueRate = 1L; m_GameParameter.wExchangeRate = 100L; //连接信息 LPCTSTR pszDataBaseAddr = m_GameServiceOption.szDataBaseAddr; LPCTSTR pszDataBaseName = m_GameServiceOption.szDataBaseName; if (LoadDataBaseParameter(pszDataBaseAddr, pszDataBaseName, m_DataBaseParameter) == false) return false; //组件接口 IUnknownEx * pIAttemperEngine = m_AttemperEngine.GetInterface(); IUnknownEx * pITCPNetworkEngine = m_TCPNetworkEngine.GetInterface(); IUnknownEx * pIAttemperEngineSink = QUERY_OBJECT_INTERFACE(m_AttemperEngineSink, IUnknownEx); //数据引擎 IUnknownEx * pIDataBaseEngineRecordSink[CountArray(m_RecordDataBaseSink)]; IUnknownEx * pIDataBaseEngineKernelSink[CountArray(m_KernelDataBaseSink)]; for (WORD i = 0; i < CountArray(pIDataBaseEngineRecordSink); i++) pIDataBaseEngineRecordSink[i] = QUERY_OBJECT_INTERFACE(m_RecordDataBaseSink[i], IUnknownEx); for (WORD i = 0; i < CountArray(pIDataBaseEngineKernelSink); i++) pIDataBaseEngineKernelSink[i] = QUERY_OBJECT_INTERFACE(m_KernelDataBaseSink[i], IUnknownEx); //绑定接口 if (m_AttemperEngine->SetAttemperEngineSink(pIAttemperEngineSink) == false) return false; if (m_RecordDataBaseEngine->SetDataBaseEngineSink(pIDataBaseEngineRecordSink, CountArray(pIDataBaseEngineRecordSink)) == false) return false; if (m_KernelDataBaseEngine->SetDataBaseEngineSink(pIDataBaseEngineKernelSink, CountArray(pIDataBaseEngineKernelSink)) == false) return false; //内核组件 if (m_TimerEngine->SetTimerEngineEvent(pIAttemperEngine) == false) return false; if (m_AttemperEngine->SetNetworkEngine(pITCPNetworkEngine) == false) return false; if (m_TCPNetworkEngine->SetTCPNetworkEngineEvent(pIAttemperEngine) == false) return false; //协调服务 if (m_TCPSocketService->SetServiceID(NETWORK_CORRESPOND) == false) return false; if (m_TCPSocketService->SetTCPSocketEvent(pIAttemperEngine) == false) return false; //数据协调 m_DBCorrespondManager.InitDBCorrespondManager(m_KernelDataBaseEngine.GetInterface()); //创建比赛 if (m_MatchServiceManager.GetInterface() != NULL) { if (m_MatchServiceManager->CreateGameMatch(m_GameMatchOption.cbMatchType) == false) return false; } //调度回调 m_AttemperEngineSink.m_pInitParameter = &m_InitParameter; m_AttemperEngineSink.m_pGameParameter = &m_GameParameter; m_AttemperEngineSink.m_pGameMatchOption = &m_GameMatchOption; m_AttemperEngineSink.m_pGameServiceAttrib = &m_GameServiceAttrib; m_AttemperEngineSink.m_pGameServiceOption = &m_GameServiceOption; m_AttemperEngineSink.m_vecVenueInfo = m_vecVenueInfo; //++场馆列表 //调度回调 m_AttemperEngineSink.m_pITimerEngine = m_TimerEngine.GetInterface(); m_AttemperEngineSink.m_pIAttemperEngine = m_AttemperEngine.GetInterface(); m_AttemperEngineSink.m_pITCPSocketService = m_TCPSocketService.GetInterface(); m_AttemperEngineSink.m_pITCPNetworkEngine = m_TCPNetworkEngine.GetInterface(); m_AttemperEngineSink.m_pIGameServiceManager = m_GameServiceManager.GetInterface(); m_AttemperEngineSink.m_pIRecordDataBaseEngine = m_RecordDataBaseEngine.GetInterface(); m_AttemperEngineSink.m_pIKernelDataBaseEngine = m_KernelDataBaseEngine.GetInterface(); //m_AttemperEngineSink.m_pIMatchServiceManager = m_MatchServiceManager.GetInterface(); m_AttemperEngineSink.m_pIDBCorrespondManager = (IDBCorrespondManager*)m_DBCorrespondManager.QueryInterface(IID_IDBCorrespondManager, VER_IDBCorrespondManager); //数据回调 for (INT i = 0; i < CountArray(m_RecordDataBaseSink); i++) { m_RecordDataBaseSink[i].m_pInitParameter = &m_InitParameter; m_RecordDataBaseSink[i].m_pGameParameter = &m_GameParameter; m_RecordDataBaseSink[i].m_pDataBaseParameter = &m_DataBaseParameter; m_RecordDataBaseSink[i].m_pGameServiceAttrib = &m_GameServiceAttrib; m_RecordDataBaseSink[i].m_pGameServiceOption = &m_GameServiceOption; m_RecordDataBaseSink[i].m_pIGameServiceManager = m_GameServiceManager.GetInterface(); m_RecordDataBaseSink[i].m_pIDataBaseEngineEvent = QUERY_OBJECT_PTR_INTERFACE(pIAttemperEngine, IDataBaseEngineEvent); } //数据回调 for (INT i = 0; i < CountArray(m_KernelDataBaseSink); i++) { m_KernelDataBaseSink[i].m_pInitParameter = &m_InitParameter; m_KernelDataBaseSink[i].m_pGameParameter = &m_GameParameter; m_KernelDataBaseSink[i].m_pDataBaseParameter = &m_DataBaseParameter; m_KernelDataBaseSink[i].m_pGameServiceAttrib = &m_GameServiceAttrib; m_KernelDataBaseSink[i].m_pGameServiceOption = &m_GameServiceOption; m_KernelDataBaseSink[i].m_pIGameServiceManager = m_GameServiceManager.GetInterface(); m_KernelDataBaseSink[i].m_pIDataBaseEngineEvent = QUERY_OBJECT_PTR_INTERFACE(pIAttemperEngine, IDataBaseEngineEvent); m_KernelDataBaseSink[i].m_pIDBCorrespondManager = (IDBCorrespondManager*)m_DBCorrespondManager.QueryInterface(IID_IDBCorrespondManager, VER_IDBCorrespondManager); } //配置网络 m_TCPNetworkEngine->SetServiceParameter(m_GameServiceOption.wServerPort, m_GameServiceOption.wMaxPlayer, szCompilation); //连接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_TCPSocketService->StartService() == false) { ASSERT(FALSE); return false; } //数据引擎 if (m_RecordDataBaseEngine->StartService() == false) { ASSERT(FALSE); return false; } //数据引擎 if (m_KernelDataBaseEngine->StartService() == false) { ASSERT(FALSE); return false; } //数据协调 if (m_DBCorrespondManager.StartService() == false) { ASSERT(FALSE); return false; } //启动比赛 if (m_MatchServiceManager.GetInterface() != NULL) { if (m_MatchServiceManager->StartService() == false) { ASSERT(FALSE); return false; } } return true; } //启动网络 bool CServiceUnits::StartNetworkService() { //网络引擎 if (m_TCPNetworkEngine->StartService() == false) { ASSERT(FALSE); return false; } return true; } //调整参数 bool CServiceUnits::RectifyServiceParameter() { //读取属性 m_GameServiceManager->GetServiceAttrib(m_GameServiceAttrib); if (lstrcmp(m_GameServiceAttrib.szServerDLLName, m_GameServiceManager.m_szModuleDllName) != 0) { CTraceService::TraceString(TEXT("游戏模块的绑定 DLL 名字与配置模块 DLL 名字不一致"), TraceLevel_Exception); return false; } //调整参数 if (m_GameServiceManager->RectifyParameter(m_GameServiceOption) == false) { CTraceService::TraceString(TEXT("游戏模块调整配置参数失败"), TraceLevel_Exception); return false; } //服务类型 if ((m_GameServiceOption.wServerType&m_GameServiceAttrib.wSupporType) == 0) { CTraceService::TraceString(TEXT("游戏模块不支持配置中指定的房间模式类型"), TraceLevel_Exception); return false; } //占位调整 if (m_GameServiceAttrib.wChairCount == MAX_CHAIR) { CServerRule::SetAllowAndroidSimulate(m_GameServiceOption.dwServerRule, false); } //作弊模式 if ((m_GameServiceOption.cbDistributeRule&DISTRIBUTE_ALLOW) != 0) { //禁止规则 CServerRule::SetForfendGameRule(m_GameServiceOption.dwServerRule, true); //设置作弊 CServerRule::SetAllowAvertCheatMode(m_GameServiceOption.dwServerRule, true); //最少人数 m_GameServiceOption.wMinDistributeUser = __max(2, m_GameServiceOption.wMinDistributeUser); //分组间隔 if (m_GameServiceOption.wDistributeTimeSpace == 0) { m_GameServiceOption.wDistributeTimeSpace = 15; } //最少游戏人数 if (m_GameServiceOption.wMinPartakeGameUser != 0) { m_GameServiceOption.wMinPartakeGameUser = __max(m_GameServiceOption.wMinPartakeGameUser, 2); m_GameServiceOption.wMinPartakeGameUser = __min(m_GameServiceOption.wMinPartakeGameUser, m_GameServiceAttrib.wChairCount); } else { m_GameServiceOption.wMinPartakeGameUser = m_GameServiceAttrib.wChairCount; } //最大游戏人数 if (m_GameServiceOption.wMaxPartakeGameUser != 0) { m_GameServiceOption.wMaxPartakeGameUser = __min(m_GameServiceOption.wMaxPartakeGameUser, m_GameServiceAttrib.wChairCount); m_GameServiceOption.wMaxPartakeGameUser = __max(m_GameServiceOption.wMaxPartakeGameUser, m_GameServiceOption.wMinPartakeGameUser); } else { m_GameServiceOption.wMaxPartakeGameUser = m_GameServiceAttrib.wChairCount; } } //游戏记录 if (m_GameServiceOption.wServerType&(GAME_GENRE_GOLD | GAME_GENRE_MATCH)) { CServerRule::SetRecordGameScore(m_GameServiceOption.dwServerRule, true); } //即时写分 if (m_GameServiceOption.wServerType&(GAME_GENRE_GOLD | GAME_GENRE_MATCH)) { CServerRule::SetImmediateWriteScore(m_GameServiceOption.dwServerRule, true); } //挂接设置 if (m_GameServiceOption.wSortID == 0) m_GameServiceOption.wSortID = 500; if (m_GameServiceOption.wKindID == 0) m_GameServiceOption.wKindID = m_GameServiceAttrib.wKindID; //最大人数 WORD wMaxPlayer = m_GameServiceOption.wTableCount*m_GameServiceAttrib.wChairCount; m_GameServiceOption.wMaxPlayer = __max(m_GameServiceOption.wMaxPlayer, wMaxPlayer + RESERVE_USER_COUNT); //最小积分 if (m_GameServiceOption.wServerType&GAME_GENRE_GOLD) { m_GameServiceOption.lMinTableScore += m_GameServiceOption.lServiceScore; m_GameServiceOption.lMinTableScore = __max(m_GameServiceOption.lMinTableScore, m_GameServiceOption.lServiceScore); } //限制调整 if (m_GameServiceOption.lMaxEnterScore != 0L) { m_GameServiceOption.lMaxEnterScore = __max(m_GameServiceOption.lMaxEnterScore, m_GameServiceOption.lMinTableScore); } //比赛配置 if ((m_GameServiceOption.wServerType&GAME_GENRE_MATCH) != 0) { if (m_GameMatchOption.dwMatchID == 0) { CTraceService::TraceString(TEXT("未加载比赛配置"), TraceLevel_Exception); 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; } //连接信息 bool CServiceUnits::LoadDataBaseParameter(LPCTSTR pszDataBaseAddr, LPCTSTR pszDataBaseName, tagDataBaseParameter & DataBaseParameter) { //变量定义 CDataBaseAide PlatformDBAide; CDataBaseHelper PlatformDBModule; //创建对象 if ((PlatformDBModule.GetInterface() == NULL) && (PlatformDBModule.CreateInstance() == false)) { ASSERT(FALSE); return false; } //变量定义 tagDataBaseParameter * pPlatformDBParameter = &m_InitParameter.m_PlatformDBParameter; //设置连接 PlatformDBModule->SetConnectionInfo(pPlatformDBParameter->szDataBaseAddr, pPlatformDBParameter->wDataBasePort, pPlatformDBParameter->szDataBaseName, pPlatformDBParameter->szDataBaseUser, pPlatformDBParameter->szDataBasePass); //获取信息 try { //发起连接 PlatformDBModule->OpenConnection(); PlatformDBAide.SetDataBase(PlatformDBModule.GetInterface()); //连接信息 PlatformDBAide.ResetParameter(); PlatformDBAide.AddParameter(TEXT("@strDataBaseAddr"), pszDataBaseAddr); //执行查询 if (PlatformDBAide.ExecuteProcess(TEXT("GSP_GS_LoadDataBaseInfo"), true) != DB_SUCCESS) { //构造信息 TCHAR szErrorDescribe[128] = TEXT(""); PlatformDBAide.GetValue_String(TEXT("ErrorDescribe"), szErrorDescribe, CountArray(szErrorDescribe)); //提示消息 CTraceService::TraceString(szErrorDescribe, TraceLevel_Exception); return false; } //读取密文 TCHAR szDBUserRead[512] = TEXT(""), szDBPassRead[512] = TEXT(""); PlatformDBAide.GetValue_String(TEXT("DBUser"), szDBUserRead, CountArray(szDBUserRead)); PlatformDBAide.GetValue_String(TEXT("DBPassword"), szDBPassRead, CountArray(szDBPassRead)); //获取信息 DataBaseParameter.wDataBasePort = PlatformDBAide.GetValue_WORD(TEXT("DBPort")); lstrcpyn(DataBaseParameter.szDataBaseAddr, pszDataBaseAddr, CountArray(DataBaseParameter.szDataBaseAddr)); lstrcpyn(DataBaseParameter.szDataBaseName, pszDataBaseName, CountArray(DataBaseParameter.szDataBaseName)); //解密密文 TCHAR szDataBaseUser[32] = TEXT(""), szDataBasePass[32] = TEXT(""); CWHEncrypt::XorCrevasse(szDBUserRead, DataBaseParameter.szDataBaseUser, CountArray(DataBaseParameter.szDataBaseUser)); CWHEncrypt::XorCrevasse(szDBPassRead, DataBaseParameter.szDataBasePass, CountArray(DataBaseParameter.szDataBasePass)); } catch (IDataBaseException * pIException) { //错误信息 LPCTSTR pszDescribe = pIException->GetExceptionDescribe(); CTraceService::TraceString(pszDescribe, TraceLevel_Exception); return false; } 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_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)) { //设置状态 SetServiceStatus(ServiceStatus_Service); } return 0; } case UI_SERVICE_CONFIG_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; } //连接协调 SendControlPacket(CT_CONNECT_CORRESPOND, NULL, 0); } return 0; } } return 0; } //////////////////////////////////////////////////////////////////////////////////