#include "OpHoldon.h" #include "VirtualChan.h" #include "OperationReactor.h" #include "FsProxy.h" COpHoldon::COpHoldon(COperationReactor* pParent, long Instance) : COperation(pParent, Instance), m_IsTakeBack(false) { } COpHoldon::~COpHoldon(void) { } /***************************************************************** **【函数名称】 _end **【函数功能】 操作完成 **【参数】 IsSucceed 操作是否成功 lpData 随路数据 **【返回值】 ****************************************************************/ void COpHoldon::_end(bool IsSucceed) { if (m_IsTakeBack) { if (IsSucceed) { LOG_INFO(("{OpHoldon}: 分机[%lu]接回成功"), m_pHostChan->no()); } else { LOG_WARN(("{OpHoldon}: 分机[%lu]接回失败"), m_pHostChan->no()); } SqlWrite::GetInstance()->addSql(toSql(IsSucceed, "接回")); // 返回执行结果 //m_pParent->onOpResult(m_InstanceCancel, IsSucceed); m_pParent->onOpResult(m_InstanceCancel, this, IsSucceed, std::to_string(m_pHostChan->no()), "Retrieve"); } else { if (IsSucceed) { LOG_INFO(("{OpHoldon}: 分机[%lu]保持成功"), m_pHostChan->no()); } else { LOG_WARN(("{OpHoldon}: 分机[%lu]保持失败"), m_pHostChan->no()); } SqlWrite::GetInstance()->addSql(toSql(IsSucceed, "保持")); // 返回执行结果 if (m_InstanceCancel != FS_LINK_INSTANCE_INVALID) m_pParent->onOpResult(m_InstanceCancel, !IsSucceed); m_pParent->onOpResult(m_Instance, this, IsSucceed,std::to_string(m_pHostChan->no()),"Hold"); } } /***************************************************************** **【函数名称】 start **【函数功能】 执行操作 **【参数】 **【返回值】 *****************************************************************/ bool COpHoldon::start(LineOpParam* pParam) { // 校验状态 if (m_pHostChan->state() != CHAN_LOGIC_STATE_TALKING) return false; LOG_INFO(("{OpHoldon}: 分机[%lu]呼叫保持"), m_pHostChan->no()); m_SessionId = m_pHostChan->sessionId(); m_Caller = std::to_string(m_pHostChan->no()); m_CallerAgent = CFsProxy::GetInstance().getAgentByExten(m_Caller); m_OpTime = Util::CurTime(); return CFsProxy::GetInstance().holdon(uniqueId(), m_pHostChan); } /***************************************************************** **【函数名称】 cancel **【函数功能】 取消操作 **【参数】 **【返回值】 *****************************************************************/ bool COpHoldon::cancel(long InstanceCancel) { LOG_INFO(("{OpHoldon}: 分机[%lu]呼叫接回"), m_pHostChan->no()); m_InstanceCancel = InstanceCancel; m_IsTakeBack = true; bool b = CFsProxy::GetInstance().takeBack(uniqueId(), m_pHostChan); //m_pHostChan->releaseOp(m_pHostChan->currOp()); //TJ 保持接回后,释放当前操作。否则无法挂机 2017.6.17 return b; } /***************************************************************** **【函数名称】 hangup **【函数功能】 操作中挂机 **【参数】 **【返回值】 *****************************************************************/ bool COpHoldon::hangup(long InstanceHangup) { if (m_InstanceCancel != FS_LINK_INSTANCE_INVALID) return false; LOG_INFO(("{OpHoldon}: 分机[%lu]保持中挂机"), m_pHostChan->no()); m_InstanceCancel = InstanceHangup; if (CFsProxy::GetInstance().kill(uniqueId(), m_pHostChan)) { _end(false); return true; } else { _end(true); return false; } } /***************************************************************** **【函数名称】 onBackgroudJobDone **【函数功能】 后台命令执行结束事件处理 **【参数】 **【返回值】 *****************************************************************/ void COpHoldon::onBackgroudJobDone(PBG_JOB_NOTIFY pNotify) { if (m_IsTakeBack) { if (pNotify->JobBody.find(ESL_JOB_DONE_RES_OK) == string::npos) m_pParent->onOpResult(m_InstanceCancel, false); // 接回不成功不删该操作,以备再次接回之用 else _end(true); } else { if (pNotify->JobBody.find(ESL_JOB_DONE_RES_OK) == string::npos) _end(false); else _end(true); // m_pParent->onOpResult(m_Instance, true); // 保持成功不删该操作,以备接回之用 } } /***************************************************************** **【函数名称】 onHostChanStateUpdated **【函数功能】 关联通道状态更新处理 **【参数】 **【返回值】 *****************************************************************/ void COpHoldon::onHostChanStateUpdated(VirtualChan* pHostChan) { if (m_pHostChan->state() == CHAN_LOGIC_STATE_FREE) { LOG_INFO(("{OpHoldon}: 分机[%lu] 对方挂机"), m_pHostChan->no()); _end(false); } }