523 lines
15 KiB
C++
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;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|