#include "StdAfx.h" #include "OpMakeCall.h" #include "ChanExten.h" #include "OperationReactor.h" #include "FsProxy.h" COpMakeCall::COpMakeCall(COperationReactor* pParent, LONG Instance) : COperation(pParent, Instance) { } COpMakeCall::~COpMakeCall(void) { } /***************************************************************** **【函数名称】 _end **【函数功能】 操作完成 **【参数】 IsSucceed 操作是否成功 lpData 随路数据 **【返回值】 ****************************************************************/ void COpMakeCall::_end( bool IsSucceed ) { if(IsSucceed) { LOGGER(LOG_LEVEL_NORMAL, _T("{OpMakeCall}: 分机[%lu]呼叫成功, DestNum = %s"), m_pHostChan->no(), m_DestNumber); } else { LOGGER(LOG_LEVEL_WARNING, _T("{OpMakeCall}: 分机[%lu]呼叫失败, DestNum = %s"), m_pHostChan->no(), m_DestNumber); } // 返回执行结果 if(m_InstanceCancel != FS_LINK_INSTANCE_INVALID) m_pParent->onOpResult(m_InstanceCancel, !IsSucceed); m_pParent->onOpResult(m_Instance, this, IsSucceed); } /***************************************************************** **【函数名称】 start **【函数功能】 执行操作 **【参数】 **【返回值】 *****************************************************************/ bool COpMakeCall::start( LineOpParam* pParam ) { // 校验状态 if(m_pHostChan->state() != CHAN_LOGIC_STATE_FREE) return false; // 保存主被叫信息 CString CallerNum = pParam->szParam1; m_DestNumber = pParam->szParam2; CString ExtenNum; ExtenNum.Format(_T("%lu"), m_pHostChan->no()); // 不能呼叫自己 if(ExtenNum == m_DestNumber) { LOGGER(LOG_LEVEL_WARNING, _T("{OpMakeCall}: 分机[%lu]执行呼叫失败, 禁止分机自呼"), m_pHostChan->no()); return false; } // 通知启动日志 LOGGER(LOG_LEVEL_NORMAL, _T("{OpMakeCall}: 分机[%lu]执行呼叫, DestNum = %s"), m_pHostChan->no(), m_DestNumber); m_pHostChan->opNumber() = pParam->szParam2; return CFsProxy::GetInstance().ExtenCall(uniqueId(), m_pHostChan, CallerNum, m_DestNumber); } /***************************************************************** **【函数名称】 start **【函数功能】 执行操作 **【参数】 **【返回值】 *****************************************************************/ bool COpMakeCall::start( PCHAN_EVENT_NOTIFY pNotify ) { CString CallerNum; CallerNum.Format(_T("%lu"), m_pHostChan->no()); m_DestNumber = pNotify->Callee; // 不能呼叫自己 if(CallerNum == m_DestNumber) { LOGGER(LOG_LEVEL_WARNING, _T("{OpMakeCall}: 分机[%lu]电话呼叫失败, 禁止分机自呼"), m_pHostChan->no()); return false; } // 检测目标分机状态 UINT DestExtenNoInt; sscanf_s(pNotify->Callee, "%lu", &DestExtenNoInt); CChanExten* pDestExten = CFsProxy::GetInstance().getExten(DestExtenNoInt); if(pDestExten != NULL && !pDestExten->isFree()) { LOGGER(LOG_LEVEL_WARNING, _T("{OpMakeCall}: 分机[%lu]电话呼叫失败, 目标分机[%lu]非空闲"), m_pHostChan->no(), DestExtenNoInt); return false; } // 通知启动日志 LOGGER(LOG_LEVEL_NORMAL, _T("{OpMakeCall}: 分机[%lu]执行电话呼叫, DestNum = %s"), m_pHostChan->no(), m_DestNumber); // 通知手动外呼启动事件 m_pParent->onOpFromDev(m_pHostChan, DEV_OP_CALL_OUT, CallerNum, m_DestNumber); return true; } /***************************************************************** **【函数名称】 hangup **【函数功能】 操作中挂机 **【参数】 **【返回值】 *****************************************************************/ bool COpMakeCall::hangup( LONG InstanceHangup ) { LOGGER(LOG_LEVEL_NORMAL, _T("{OpHoldon}: 分机[%lu]呼叫中挂机"), m_pHostChan->no()); if(m_pHostChan->isFree()) return false; m_InstanceCancel = InstanceHangup; return CFsProxy::GetInstance().kill(uniqueId(), m_pHostChan); } /***************************************************************** **【函数名称】 onBackgroudJobDone **【函数功能】 后台命令执行结束事件处理 **【参数】 **【返回值】 *****************************************************************/ void COpMakeCall::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); } else { if(strstr(pNotify->JobBody, ESL_JOB_DONE_RES_OK) == NULL) m_pParent->onOpResult(m_InstanceCancel, false, NULL); else _end(false); } } /***************************************************************** **【函数名称】 onHostChanStateUpdated **【函数功能】 关联通道状态更新处理 **【参数】 **【返回值】 *****************************************************************/ void COpMakeCall::onHostChanStateUpdated( CVirtualChan* pHostChan ) { ASSERT(pHostChan == m_pHostChan); if(pHostChan->state() == CHAN_LOGIC_STATE_FREE) _end(false); } /***************************************************************** **【函数名称】 onSessionChanStateUpdated **【函数功能】 同会话中通道状态更新处理 **【参数】 **【返回值】 *****************************************************************/ void COpMakeCall::onSessionChanStateUpdated( CVirtualChan* pChan ) { ASSERT(pChan != NULL); switch(pChan->state()) { case CHAN_LOGIC_STATE_RING_BACK: // 座席呼叫外线 //给西亚斯改动 case CHAN_LOGIC_STATE_ALERTING: // 座席呼叫座席 m_pParent->onOpProcess(m_Instance, m_pHostChan->no(), pChan->no(), pChan->type(), pChan->callerNum(), pChan->calleeNum()); break; case CHAN_LOGIC_STATE_TALKING: _end(true); break; case CHAN_LOGIC_STATE_FREE: _end(false); } }