#include "StdAfx.h" #include "OpPredictionCall.h" #include "VirtualChan.h" #include "OperationReactor.h" #include "FsProxy.h" COpPredictionCall::COpPredictionCall(COperationReactor* pParent, LONG Instance) : COperation(pParent, Instance) { } COpPredictionCall::~COpPredictionCall(void) { } /***************************************************************** **【函数名称】 _end **【函数功能】 操作完成 **【参数】 IsSucceed 操作是否成功 lpData 随路数据 **【返回值】 ****************************************************************/ void COpPredictionCall::_end( bool IsSucceed ) { CString TrunkNo = _T(""); if(m_pHostChan != NULL) TrunkNo.Format(_T("%lu"), m_pHostChan->no()); if(IsSucceed) { LOGGER(LOG_LEVEL_NORMAL, _T("{OpPredictionCall}: 中继预测外呼成功, TrunkNo = %s, DestNum = %s"), TrunkNo, m_CalleeNum); } else { LOGGER(LOG_LEVEL_WARNING, _T("{OpPredictionCall}: 中继预测外呼失败, TrunkNo = %s, DestNum = %s"), TrunkNo, m_CalleeNum); } // 返回执行结果 if(m_InstanceCancel != FS_LINK_INSTANCE_INVALID) m_pParent->onOpResult(m_InstanceCancel, !IsSucceed); m_pParent->onOpResult(m_Instance, this, IsSucceed); } /***************************************************************** **【函数名称】 start **【函数功能】 执行操作 **【参数】 **【返回值】 *****************************************************************/ bool COpPredictionCall::start( LineOpParam* pParam ) { // 保存主被叫号码 m_CallerNum = pParam->szParam1; m_CalleeNum = pParam->szParam2; // 放音启动日志 LOGGER(LOG_LEVEL_NORMAL, _T("{OpPredictionCall}: 执行预测外呼, CallerNum = %s, CalleeNum = %s"), m_CallerNum, m_CalleeNum); // 启动放音 return CFsProxy::GetInstance().PredictionCall(uniqueId(), m_CallerNum, m_CalleeNum); } /***************************************************************** **【函数名称】 hangup **【函数功能】 操作中挂机 **【参数】 **【返回值】 *****************************************************************/ bool COpPredictionCall::hangup( LONG InstanceHangup ) { CString TrunkNo = _T(""); if(m_pHostChan != NULL) TrunkNo.Format(_T("%lu"), m_pHostChan->no()); // 外呼取消日志 LOGGER(LOG_LEVEL_NORMAL, _T("{OpPredictionCall}: 中继预测呼叫中挂机, TrunkNo = %s, DestNum = %s"), TrunkNo, m_CalleeNum); if(m_pHostChan == NULL) return false; m_InstanceCancel = InstanceHangup; return CFsProxy::GetInstance().kill(uniqueId(), m_pHostChan); } /***************************************************************** **【函数名称】 onBackgroudJobDone **【函数功能】 后台命令执行结束事件处理 **【参数】 **【返回值】 *****************************************************************/ void COpPredictionCall::onBackgroudJobDone( PBG_JOB_NOTIFY pNotify ) { if(lstrcmp(pNotify->JobCmd, ESL_CMD_MAKE_CALL) == 0) { if(strstr(pNotify->JobBody, ESL_JOB_DONE_RES_OK) == NULL) _end(false); } } /***************************************************************** **【函数名称】 onAssoChanStateUpdated **【函数功能】 相关通道状态更新处理 **【参数】 **【返回值】 *****************************************************************/ void COpPredictionCall::onAssoChanStateUpdated( CVirtualChan* pAssoChan ) { if(m_pHostChan == NULL) { attachHostChan(pAssoChan); onHostChanStateUpdated(pAssoChan); } } /***************************************************************** **【函数名称】 onHostChanStateUpdated **【函数功能】 关联通道状态更新处理 **【参数】 **【返回值】 *****************************************************************/ void COpPredictionCall::onHostChanStateUpdated( CVirtualChan* pHostChan ) { switch(pHostChan->state()) { case CHAN_LOGIC_STATE_RING_BACK: m_pParent->onOpProcess(m_Instance, pHostChan->no(), pHostChan->no(), pHostChan->type(), pHostChan->callerNum(), pHostChan->calleeNum()); break; case CHAN_LOGIC_STATE_STANDBY: _end(true); break; case CHAN_LOGIC_STATE_FREE: _end(false); break; } }