#include "OpHangup.h" #include "VirtualChan.h" #include "OperationReactor.h" #include "FsProxy.h" COpHangup::COpHangup(COperationReactor * pParent, long Instance) : COperation(pParent, Instance) { } COpHangup::~COpHangup(void) { } bool COpHangup::start(LineOpParam * pParam) { // 通知启动日志 LOG_INFO(("{OpHangup}: 通道[%lu]执行挂机"), m_pHostChan->no()); if (pParam != nullptr) m_Hanguper = pParam->szParam1; // 保存主控者/强拆坐席分机 m_SessionId = m_pHostChan->sessionId(); m_OpTime = Util::CurTime(); if (m_Hanguper.empty()) // 挂机操作 { m_Caller = std::to_string(m_pHostChan->no()); m_CallerAgent = CFsProxy::GetInstance().getAgentByExten(m_Caller); } else // 强拆(Break)操作 { m_Caller = m_Hanguper; m_CallerAgent = CFsProxy::GetInstance().getAgentByExten(m_Caller); m_Callee = std::to_string(m_pHostChan->no()); m_CalleeAgent = CFsProxy::GetInstance().getAgentByExten(m_Callee); } // 开始 if (m_pHostChan->type() == DEV_RES_TYPE_EXT) return CFsProxy::GetInstance().kill(uniqueId(), m_pHostChan); else LOG_INFO(("{OpHangup}: 通道[%lu]不可执行挂机[%s]"), m_pHostChan->no(),m_pHostChan->callerNum().c_str()); //return CFsProxy::GetInstance().hangup(dynamic_cast(m_pHostChan)); return false; } void COpHangup::clean() { LOG_WARN(("{OpHangup}: 通道[%lu],操作清除"), m_pHostChan->no()); _end(false); } void COpHangup::onBackgroudJobDone(PBG_JOB_NOTIFY pNotify) { if (pNotify->JobBody.find(ESL_JOB_DONE_RES_OK) != string::npos) _end(true); else _end(false); } void COpHangup::onHostChanStateUpdated(VirtualChan * pHostChan) { LOG_INFO(("{onHostChanStateUpdated}: 线路状态更新, 通道[%lu]挂机"), pHostChan->no()); if (pHostChan == m_pHostChan) if (pHostChan->state() == CHAN_LOGIC_STATE_FREE) _end(true); } void COpHangup::_end(bool IsSucceed) { if (IsSucceed) { LOG_INFO(("{OpHangup}: 通道[%lu]挂机成功"), m_pHostChan->no()); } else { LOG_WARN(("{OpHangup}: 通道[%lu]挂机失败"), m_pHostChan->no()); } if (m_Hanguper.empty()) { SqlWrite::GetInstance()->addSql(toSql(IsSucceed, "挂机")); m_pParent->onOpResult(m_Instance, this, IsSucceed, std::to_string(m_pHostChan->no())); } else { SqlWrite::GetInstance()->addSql(toSql(IsSucceed, "强拆")); m_pParent->onOpResult(m_Instance, this, IsSucceed, m_Hanguper, "Break"); } }