Files
wnmj/Servers/服务器组件/登录服务器/ServiceUnits.cpp
2026-02-13 14:34:15 +08:00

339 lines
8.2 KiB
C++

#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;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,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;
}
//////////////////////////////////////////////////////////////////////////////////