#include "stdafx.h" #include "Task.h" #include "SessionHolder.h" #include "CallSession.h" #include "LineHolder.h" #include "LogicLine.h" #include "TaskMgr.h" CTask::CTask(EventDevOperation &DevOpInfo) { m_CurrDevOp = DevOpInfo; m_TaskCallId = 0; _bindLogicLine(DevOpInfo.nLineId); } CTask::CTask(CPduEntity &PduEntity) { m_pCurrLine = NULL; m_CurrCmd = PduEntity; memset(&m_CurrDevOp, 0, sizeof(m_CurrDevOp)); } CTask::~CTask( void ) { _freeLogicLine(); } /***************************************************************** **【函数名称】 ProcLineOpProcess **【函数功能】 处理设备操作进展 **【参数】 EvtType 消息事件类型;lpContent 消息内容 **【返回值】 void ****************************************************************/ void CTask::OnDevOpProcess(EventOpProcess &EvtInfo) { // 会话处理 _PrcoCallNode(EvtInfo.nHostLine, EvtInfo.nAssoLine); } /***************************************************************** **【函数名称】 OnDevOpResult **【函数功能】 设备操作结果返回 **【参数】 **【返回值】 void ****************************************************************/ BOOL CTask::OnDevOpResult(EventOpResult &EvtInfo) { // 命令返回 _ProcCmdReturn(EvtInfo.bIsSucceed); return TRUE; } /***************************************************************** **【函数名称】 OnCmdOperation **【函数功能】 对Task的附加命令(取消操作、排队等待成功),排队等待要重写给函数 **【参数】 成功还是失败 **【返回值】 void ****************************************************************/ BOOL CTask::OnCmdOperation(CPduEntity &PduEntity) { PduEntity.SetToExecReturn(); PduEntity.SetDataBool(0, false); CInterfaceWindow::getIocpCommInstance()->Send(&PduEntity, PduEntity.GetLocalDevType(), PduEntity.GetLocalDevId()); return FALSE; } /***************************************************************** **【函数名称】 GetAssoLineId **【函数功能】 获取Task关联线路Id **【参数】 **【返回值】 void ****************************************************************/ int CTask::GetAssoLineId() { if(m_pCurrLine == NULL) return -1; return m_pCurrLine->lineId(); } /***************************************************************** **【函数名称】 _bindLogicLine **【函数功能】 绑定逻辑线路 **【参数】 **【返回值】 void ****************************************************************/ bool CTask::_bindLogicLine( UINT LineId ) { if(LineId == LINE_ID_INVALID) return false; m_pCurrLine = CLineHolder::GetInstance().getLogicLine(LineId); ASSERT(m_pCurrLine != NULL); if(m_pCurrLine == NULL) { ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{Task}: 绑定线路[%d]时获取线路失败"), LineId); return false; } LONG TaskId = m_pCurrLine->taskIdBinded(); if(TaskId == TASK_ID_INVALID) { m_pCurrLine->taskIdBinded() = reinterpret_cast(this); return true; } else { CTask* pTask = CTaskMgr::GetInstance().findTask(TaskId); ASSERT(pTask != NULL); if(pTask != NULL) { m_pCurrLine = NULL; ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{Task}: 绑定线路[%d]失败, 线路正在执行[%s]任务"), LineId, pTask->Name()); return false; } else { m_pCurrLine->taskIdBinded() = reinterpret_cast(this); return true; } } } /***************************************************************** **【函数名称】 _freeLogicLine **【函数功能】 释放逻辑线路 **【参数】 **【返回值】 void ****************************************************************/ void CTask::_freeLogicLine( void ) { if(m_pCurrLine != NULL) { m_pCurrLine->taskIdBinded() = TASK_ID_INVALID; m_pCurrLine = NULL; } } /***************************************************************** **【函数名称】 _PrcoCallNode **【函数功能】 处理添加会话 **【参数】 **【返回值】 void ****************************************************************/ void CTask::_PrcoCallNode(UINT HostLine, UINT AssoLine) { // 找到线路类 CLogicLine* pHostLine = CLineHolder::GetInstance().getLogicLine(HostLine); CLogicLine* pAssoLine = CLineHolder::GetInstance().getLogicLine(AssoLine); if(pHostLine == NULL) return; // 将关联线路加入会话中 CCallSession* pSession = CSessionHolder::GetInstance().findSession(pHostLine->callId()); if(pSession == NULL) pSession = CSessionHolder::GetInstance().createSession(pHostLine); if(pAssoLine != NULL) pSession->addLine(pAssoLine); // 设置当前Task的CallId(为了业务统计等) m_TaskCallId = pSession->callId(); } /***************************************************************** **【函数名称】 _ProcCmdReturn **【函数功能】 处理命令返回 **【参数】 **【返回值】 ****************************************************************/ void CTask::_ProcCmdReturn(BOOL Result, bool FreeRes/* = false*/ ) { if(m_CurrCmd.GetIsExecReturn()) return; // 显示日志 ILogger::getInstance().log(LOG_CLASS_SOCKET, Result ? LOG_LEVEL_NORMAL : LOG_LEVEL_WARNING, _T("CTI->%s, CMD = return[%d], Line = %d, IsSuccess = %d"), m_CurrCmd.GetLocalDevType() == PDU_DEV_TYPE_ACD ? _T("ACD") : _T("IVR"), m_CurrCmd.GetCmdType(), m_pCurrLine == NULL ? 0 : m_pCurrLine->lineId(), Result); if(m_pCurrLine != NULL) { m_pCurrLine->opResult() = Result; // 设置当前操作结果 if(FreeRes) _freeLogicLine(); } m_CurrCmd.SetToExecReturn(); m_CurrCmd.SetDataBool(0, Result ? true : false); CInterfaceWindow::getIocpCommInstance()->Send(&m_CurrCmd, m_CurrCmd.GetLocalDevType(), m_CurrCmd.GetLocalDevId()); }