#include "StdAfx.h" #include "ServiceUnits.h" #include "ControlPacket.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() { //效验状态 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); return true; } //停止服务 bool CServiceUnits::ConcludeService() { //设置变量 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(); 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;iSetTimerEngineEvent(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;iSetServiceParameter(wServicePort,wMaxConnect,NULL)==false) return false; 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; } //////////////////////////////////////////////////////////////////////////////////