Files
wnmj/Servers/服务器组件/内核引擎/AttemperEngine.cpp
2026-02-13 14:34:15 +08:00

523 lines
15 KiB
C++

#include "StdAfx.h"
#include "TraceService.h" // #include "EventService.h"
#include "AttemperEngine.h"
//////////////////////////////////////////////////////////////////////////
//构造函数
CAttemperEngine::CAttemperEngine(void)
{
m_bService = false;
m_pITCPSocketService = NULL;
m_pTCPNetworkEngine = NULL;
m_pIAttemperEngineSink = NULL;
return;
}
//析构函数
CAttemperEngine::~CAttemperEngine(void)
{
}
//接口查询
void * CAttemperEngine::QueryInterface(const IID & Guid, DWORD dwQueryVer)
{
QUERYINTERFACE(IAttemperEngine, Guid, dwQueryVer);
QUERYINTERFACE(IQueueServiceSink, Guid, dwQueryVer);
QUERYINTERFACE(IDataBaseEngineEvent, Guid, dwQueryVer);
QUERYINTERFACE(ITCPNetworkEngineEvent, Guid, dwQueryVer);
QUERYINTERFACE_IUNKNOWNEX(IAttemperEngine, Guid, dwQueryVer);
return NULL;
}
//启动服务
bool CAttemperEngine::StartService()
{
//判断状态
if (m_bService)
{
CTraceService::TraceString(TEXT("调度引擎重复启动,启动操作忽略"), TraceLevel_Warning);
return true;
}
//外挂接口
if (m_pIAttemperEngineSink == NULL)
{
CTraceService::TraceString(TEXT("调度引擎外挂服务不存在"), TraceLevel_Exception);
return false;
}
//设置队列
if ( !m_QueueService.SetQueueServiceSink(QUERY_ME_INTERFACE(IUnknownEx)) )
{
CTraceService::TraceString(TEXT("调度引擎与队列服务绑定失败"), TraceLevel_Exception);
return false;
}
//启动外挂
if ( !m_pIAttemperEngineSink->OnAttemperEngineStart(QUERY_ME_INTERFACE(IUnknownEx)) )
{
CTraceService::TraceString(TEXT("调度引擎外挂服务启动失败"), TraceLevel_Exception);
return false;
}
//启动队列
if ( !m_QueueService.StartService() )
{
CTraceService::TraceString(TEXT("调度引擎队列服务启动失败"), TraceLevel_Exception);
return false;
}
////清空机器人
//m_AndroidUserSocketIDArray.RemoveAll();
//设置变量
m_bService = true;
return true;
}
//停止服务
bool CAttemperEngine::ConcludeService()
{
//设置变量
m_bService = false;
//停止请求队列
m_QueueService.ConcludeService();
//停止外挂
if (m_pIAttemperEngineSink != NULL)
{
m_pIAttemperEngineSink->OnAttemperEngineConclude(QUERY_ME_INTERFACE(IUnknownEx));
m_pIAttemperEngineSink = NULL;
}
////清空机器人
//m_AndroidUserSocketIDArray.RemoveAll();
return true;
}
//设置网络
bool CAttemperEngine::SetSocketEngine(IUnknownEx * pIUnknownEx)
{
ASSERT(pIUnknownEx != NULL);
m_pITCPSocketService = QUERY_OBJECT_PTR_INTERFACE(pIUnknownEx, ITCPSocketService);
ASSERT(m_pITCPSocketService != NULL);
return (m_pITCPSocketService != NULL);
}
//设置网络
bool CAttemperEngine::SetNetworkEngine(IUnknownEx * pIUnknownEx)
{
ASSERT(pIUnknownEx != NULL);
m_pTCPNetworkEngine = QUERY_OBJECT_PTR_INTERFACE(pIUnknownEx, ITCPNetworkEngine);
ASSERT(m_pTCPNetworkEngine != NULL);
return (m_pTCPNetworkEngine != NULL);
}
//注册钩子
bool CAttemperEngine::SetAttemperEngineSink(IUnknownEx * pIUnknownEx)
{
//效验参数
ASSERT(pIUnknownEx != NULL);
ASSERT(m_pIAttemperEngineSink == NULL);
if (pIUnknownEx == NULL) return false;
if (m_pIAttemperEngineSink != NULL) return false;
//查询接口
m_pIAttemperEngineSink = QUERY_OBJECT_PTR_INTERFACE(pIUnknownEx, IAttemperEngineSink);
if (m_pIAttemperEngineSink == NULL)
{
CTraceService::TraceString(TEXT("调度引擎外挂服务接口获取失败,挂接操作失败"), TraceLevel_Exception);
return false;
}
return true;
}
//获取接口
void * CAttemperEngine::GetQueueService(const IID & Guid, DWORD dwQueryVer)
{
return m_QueueService.QueryInterface(Guid, dwQueryVer);
}
//控制事件
//////////////////////////////////////////////////////////////////////////
//自定事件
bool CAttemperEngine::OnEventCustom(WORD wRequestID, VOID * pData, WORD wDataSize)
{
ASSERT(m_pIAttemperEngineSink);
if (m_pIAttemperEngineSink == NULL) return false;
return m_pIAttemperEngineSink->OnEventAttemperData(wRequestID, pData, wDataSize);
}
//控制事件
bool CAttemperEngine::OnEventControl(WORD wControlID, VOID * pData, WORD wDataSize)
{
ASSERT(m_pIAttemperEngineSink);
if (m_pIAttemperEngineSink == NULL) return false;
return m_pIAttemperEngineSink->OnEventControl(wControlID, pData, wDataSize);
}
//队列接口
void CAttemperEngine::OnQueueServiceSink(WORD wIdentifier, void * pBuffer, WORD wDataSize)
{
//内核事件
VERIFY_RETURN_VOID(m_pIAttemperEngineSink != NULL);
switch (wIdentifier)
{
case EVENT_TIMER: //定时器事件
{
//效验参数
ASSERT(wDataSize == sizeof(NTY_TimerEvent));
if (wDataSize != sizeof(NTY_TimerEvent)) return;
//处理消息
NTY_TimerEvent * pTimerEvent = (NTY_TimerEvent *)pBuffer;
try
{
m_pIAttemperEngineSink->OnEventTimer(pTimerEvent->dwTimerID, pTimerEvent->dwBindParameter);
}
catch (...)
{
CTraceService::TraceFormat(TraceLevel_Exception,TEXT("定时器处理异常, TimerID:%u, Param:%ld"), pTimerEvent->dwTimerID, pTimerEvent->dwBindParameter);
}
return;
}
case EVENT_DATABASE: //数据库事件
{
//效验参数
ASSERT(wDataSize >= sizeof(NTY_DataBaseEvent));
if (wDataSize < sizeof(NTY_DataBaseEvent)) return;
//处理消息
NTY_DataBaseEvent * pDataBaseEvent = (NTY_DataBaseEvent *)pBuffer;
try
{
m_pIAttemperEngineSink->OnEventDataBase(pDataBaseEvent->wRequestID, pDataBaseEvent->dwContextID, pDataBaseEvent + 1, wDataSize - sizeof(NTY_DataBaseEvent));
}
catch (...)
{
CTraceService::TraceFormat(TraceLevel_Exception,TEXT("数据库处理异常, RequestID:%u"), pDataBaseEvent->wRequestID);
}
return;
}
case EVENT_TCP_NETWORK_ACCEPT: //网络应答事件
{
//效验大小
ASSERT(wDataSize == sizeof(NTY_TCPNetworkAcceptEvent));
if (wDataSize != sizeof(NTY_TCPNetworkAcceptEvent)) return;
//处理消息
NTY_TCPNetworkAcceptEvent * pSocketAcceptEvent = (NTY_TCPNetworkAcceptEvent *)pBuffer;
bool bSuccess = false;
try
{
bSuccess = m_pIAttemperEngineSink->OnEventTCPNetworkBind(pSocketAcceptEvent->dwClientAddr, pSocketAcceptEvent->dwSocketID);
}
catch (...)
{
CTraceService::TraceFormat(TraceLevel_Exception,TEXT("OnEventTCPNetworkBind异常:dwClientIP=%u, dwSocketID=%u"), pSocketAcceptEvent->dwClientAddr, pSocketAcceptEvent->dwSocketID);
}
if ( !bSuccess )
{
m_pTCPNetworkEngine->CloseSocket(pSocketAcceptEvent->dwSocketID);
}
return;
}
case EVENT_TCP_NETWORK_READ: //网络读取事件
{
//效验大小
NTY_TCPNetworkReadEvent * pSocketReadEvent = (NTY_TCPNetworkReadEvent *)pBuffer;
ASSERT(wDataSize >= sizeof(NTY_TCPNetworkReadEvent));
ASSERT(wDataSize == (sizeof(NTY_TCPNetworkReadEvent) + pSocketReadEvent->wDataSize));
if (wDataSize < sizeof(NTY_TCPNetworkReadEvent)) return;
if (wDataSize != (sizeof(NTY_TCPNetworkReadEvent) + pSocketReadEvent->wDataSize)) return;
//处理消息
bool bSuccess = false;
try
{
bSuccess = m_pIAttemperEngineSink->OnEventTCPNetworkRead(pSocketReadEvent->Command, pSocketReadEvent + 1, pSocketReadEvent->wDataSize, pSocketReadEvent->dwSocketID);
if ( !bSuccess )
{
ASSERT(FALSE);
CTraceService::TraceFormat(TraceLevel_Exception,TEXT("消息处理失败, MainID:%u, SubID:%u"), pSocketReadEvent->Command.wMainCmdID, pSocketReadEvent->Command.wSubCmdID);
m_pTCPNetworkEngine->CloseSocket(pSocketReadEvent->dwSocketID);
}
}
catch (...)
{
CTraceService::TraceFormat(TraceLevel_Exception,TEXT("消息处理异常, MainID:%u, SubID:%u"), pSocketReadEvent->Command.wMainCmdID, pSocketReadEvent->Command.wSubCmdID);
m_pTCPNetworkEngine->CloseSocket(pSocketReadEvent->dwSocketID);
}
return;
}
case EVENT_TCP_NETWORK_SHUT: //关闭读取事件
{
//效验大小
ASSERT(wDataSize == sizeof(NTY_TCPNetworkShutEvent));
if (wDataSize != sizeof(NTY_TCPNetworkShutEvent)) return;
//处理消息
NTY_TCPNetworkShutEvent * pNetworkShutEvent = (NTY_TCPNetworkShutEvent *)pBuffer;
bool bSuccess = false;
try
{
bSuccess = m_pIAttemperEngineSink->OnEventTCPNetworkShut(pNetworkShutEvent->dwClientAddr, pNetworkShutEvent->dwActiveTime, pNetworkShutEvent->dwSocketID);
}
catch (...)
{
CTraceService::TraceFormat(TraceLevel_Exception, TEXT("OnEventTCPNetworkShut异常:dwClientIP=%u, dwActiveTime=%u,dwSocketID=%u"), pNetworkShutEvent->dwClientAddr, pNetworkShutEvent->dwActiveTime, pNetworkShutEvent->dwSocketID);
}
if ( !bSuccess )
{
m_pTCPNetworkEngine->CloseSocket(pNetworkShutEvent->dwSocketID);
}
return;
}
case EVENT_TCP_SOCKET_READ: //网络读取事件
{
//效验大小
NTY_TCPSocketReadEvent * pSocketReadEvent = (NTY_TCPSocketReadEvent *)pBuffer;
ASSERT(wDataSize >= sizeof(NTY_TCPSocketReadEvent));
ASSERT(wDataSize == (sizeof(NTY_TCPSocketReadEvent) + pSocketReadEvent->wDataSize));
if (wDataSize < sizeof(NTY_TCPSocketReadEvent)) return;
if (wDataSize != (sizeof(NTY_TCPSocketReadEvent) + pSocketReadEvent->wDataSize)) return;
//处理消息
try
{
if (!m_pIAttemperEngineSink->OnEventTCPSocketRead(pSocketReadEvent->wServiceID, pSocketReadEvent->Command, pSocketReadEvent + 1, pSocketReadEvent->wDataSize))
{
CTraceService::TraceFormat(TraceLevel_Exception,TEXT("消息处理失败, MainID:%d, SubID:%d"), pSocketReadEvent->Command.wMainCmdID, pSocketReadEvent->Command.wSubCmdID);
m_pITCPSocketService->CloseSocket();
}
}
catch (...)
{
CTraceService::TraceFormat(TraceLevel_Exception,TEXT("消息处理异常, MainID:%d, SubID:%d"), pSocketReadEvent->Command.wMainCmdID, pSocketReadEvent->Command.wSubCmdID);
m_pITCPSocketService->CloseSocket();
}
return;
}
case EVENT_TCP_SOCKET_SHUT: //网络关闭事件
{
//效验大小
ASSERT(wDataSize == sizeof(NTY_TCPSocketShutEvent));
if (wDataSize != sizeof(NTY_TCPSocketShutEvent)) return;
//处理消息
NTY_TCPSocketShutEvent * pSocketShutEvent = (NTY_TCPSocketShutEvent *)pBuffer;
bool bSuccess = false;
try
{
bSuccess = m_pIAttemperEngineSink->OnEventTCPSocketShut(pSocketShutEvent->wServiceID, pSocketShutEvent->cbShutReason);
}
catch (...)
{
CTraceService::TraceFormat(TraceLevel_Exception, TEXT("OnEventTCPSocketShut异常:wServiceID=%u, cbShutReason=%u"), pSocketShutEvent->wServiceID, pSocketShutEvent->cbShutReason);
}
if (!bSuccess)
{
m_pITCPSocketService->CloseSocket();
}
return;
}
case EVENT_TCP_SOCKET_LINK:
{
//效验大小
ASSERT(wDataSize == sizeof(NTY_TCPSocketLinkEvent));
if (wDataSize != sizeof(NTY_TCPSocketLinkEvent)) return;
//处理消息
NTY_TCPSocketLinkEvent * pSocketLinkEvent = (NTY_TCPSocketLinkEvent *)pBuffer;
bool bSuccess = false;
try
{
bSuccess = m_pIAttemperEngineSink->OnEventTCPSocketLink(pSocketLinkEvent->wServiceID, pSocketLinkEvent->nErrorCode);
}
catch (...)
{
CTraceService::TraceFormat(TraceLevel_Exception, _T("OnEventTCPSocketLink异常!wServiceID=%u,nErrorCode=%u"), pSocketLinkEvent->wServiceID, pSocketLinkEvent->nErrorCode);
}
if (!bSuccess)
{
m_pITCPSocketService->CloseSocket();
}
return;
}
case EVENT_CONTROL:
{
//效验大小
ASSERT(wDataSize == sizeof(NTY_ControlEvent));
if (wDataSize != sizeof(NTY_ControlEvent)) return;
//处理消息
//NTY_ControlEvent * pControlEvent = (NTY_ControlEvent *)pBuffer;
try
{
m_pIAttemperEngineSink->OnEventControl(wIdentifier, pBuffer, wDataSize);
}
catch (...)
{
ASSERT(0);
CTraceService::TraceFormat(TraceLevel_Exception,_T("OnEventControl异常!wIdentifier=%u,wDataSize=%u"),wIdentifier,wDataSize);
}
return;
}
}
//其他事件
try
{
m_pIAttemperEngineSink->OnEventAttemperData(wIdentifier, pBuffer, wDataSize);
}
catch (...)
{
ASSERT(0);
CTraceService::TraceFormat(TraceLevel_Exception,_T("OnEventAttemperData异常!wIdentifier=%u,wDataSize=%u"),wIdentifier,wDataSize);
}
return;
}
bool CAttemperEngine::OnEventDataBaseResult(WORD wRequestID, DWORD dwContextID, VOID * pData, WORD wDataSize)
{
try
{
if (m_pIAttemperEngineSink->OnEventDataBase(wRequestID, dwContextID, pData, wDataSize))
{
return true;
}
ASSERT(0);
CTraceService::TraceFormat(TraceLevel_Exception,_T("OnEventDataBaseResult失败!wRequestID=%u,dwContextID=%u,wDataSize=%u"),wRequestID,dwContextID,wDataSize);
}
catch (...)
{
ASSERT(0);
CTraceService::TraceFormat(TraceLevel_Exception,_T("OnEventDataBaseResult异常!wRequestID=%u,dwContextID=%u,wDataSize=%u"),wRequestID,dwContextID,wDataSize);
}
return false;
}
//机器模拟接口
//////////////////////////////////////////////////////////////////////////
//应答事件
bool CAttemperEngine::OnEventTCPNetworkBind(DWORD dwSocketID, DWORD dwClientAddr)
{
//缓冲锁定
CWHDataLocker lock(m_CriticalSection);
try
{
if (m_pIAttemperEngineSink->OnEventTCPNetworkBind(dwClientAddr, dwSocketID))
{
return true;
}
CTraceService::TraceFormat(TraceLevel_Exception,_T("机器模拟绑定处理失败!dwSocketID=%u,dwClientIP=%u"),dwSocketID,dwClientAddr);
}
catch (...)
{
CTraceService::TraceFormat(TraceLevel_Exception,_T("机器模拟绑定处理异常!dwSocketID=%u,dwClientIP=%u"),dwSocketID,dwClientAddr);
}
ASSERT(0);
return false;
}
//关闭事件
bool CAttemperEngine::OnEventTCPNetworkShut(DWORD dwSocketID, DWORD dwClientAddr, DWORD dwActiveTime)
{
//缓冲锁定
CWHDataLocker lock(m_CriticalSection);
try
{
if (m_pIAttemperEngineSink->OnEventTCPNetworkShut(dwClientAddr, dwActiveTime, dwSocketID))
{
return true;
}
CTraceService::TraceFormat(TraceLevel_Exception,_T("机器模拟关闭处理失败!dwClientIP=%u,dwActiveTime=%u,dwSocketID=%u"),dwClientAddr,dwActiveTime,dwSocketID);
}
catch (...)
{
CTraceService::TraceFormat(TraceLevel_Exception,_T("机器模拟关闭处理异常!dwClientIP=%u,dwActiveTime=%u,dwSocketID=%u"),dwClientAddr,dwActiveTime,dwSocketID);
}
ASSERT(0);
return false;
}
//读取事件
bool CAttemperEngine::OnEventTCPNetworkRead(DWORD dwSocketID, TCP_Command Command, VOID * pData, WORD wDataSize)
{
//缓冲锁定
CWHDataLocker lock(m_CriticalSection);
try
{
if (m_pIAttemperEngineSink->OnEventTCPNetworkRead(Command, pData, wDataSize, dwSocketID))
{
return true;
}
CTraceService::TraceFormat(TraceLevel_Exception,_T("机器模拟读取处理失败!MainID=%u,SubID=%u,DataSize=%u"),Command.wMainCmdID,Command.wSubCmdID,wDataSize);
}
catch (...)
{
CTraceService::TraceFormat(TraceLevel_Exception,_T("机器模拟读取处理异常!MainID=%u,SubID=%u,DataSize=%u"),Command.wMainCmdID,Command.wSubCmdID,wDataSize);
}
ASSERT(0);
return false;
}
bool CAttemperEngine::GetBurthenInfo( tagBurthenInfo & BurthenInfo )
{
return m_QueueService.GetBurthenInfo(BurthenInfo);
}
//////////////////////////////////////////////////////////////////////////
//建立对象函数
//
extern "C" __declspec(dllexport) void * CreateAttemperEngine(const GUID & Guid, DWORD dwInterfaceVer)
{
//建立对象
CAttemperEngine * pAttemperEngine = NULL;
try
{
pAttemperEngine = new CAttemperEngine();
if (pAttemperEngine == NULL) throw TEXT("创建失败");
void * pObject = pAttemperEngine->QueryInterface(Guid, dwInterfaceVer);
if (pObject == NULL) throw TEXT("接口查询失败");
return pObject;
}
catch (...) {}
//清理对象
SafeDelete(pAttemperEngine);
return NULL;
}
//////////////////////////////////////////////////////////////////////////