#include "StdAfx.h" #include "InsertReq.h" #include "ProxyExten.h" #include "MC.h" #include "SessionShell.h" #include "ProxyShell.h" CInsertReq::CInsertReq(CProxyShell* pParent, CPduEntity& ReqPdu) : CReqBase(pParent, ReqPdu), m_pAssoLine(NULL), m_PendingCallId(0) { } CInsertReq::~CInsertReq(void) { } /***************************************************************** **【函数名称】 request **【函数功能】 发出请求(命令方式) **【参数】 **【返回值】 ****************************************************************/ bool CInsertReq::request( void ) { // 校验状态 if(m_pHostLine->state() != VIRTUAL_LINE_STATE_FREE) return false; // 查找被插的线路 UINT DestId = m_ReqPdu.GetDataUInt(3); m_pAssoLine = m_pParent->getProxyExtenWrapped(DestId); if(m_pAssoLine == NULL) { LOGGER(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{LineReq}: 分机[%lu]强插失败, 查找关联线路失败, DestExten = %lu"), m_pHostLine->lineId(), DestId); return false; } // 呼叫是否存在、被强插线路状态校验 m_PendingCallId = m_pAssoLine->activeCallId(); if(m_PendingCallId == 0 || m_pAssoLine->state() != VIRTUAL_LINE_STATE_TALKING) { LOGGER(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{LineReq}: 分机[%lu]强插失败, 目标分机[%lu]未在通话中"), m_pHostLine->lineId(), DestId); return false; } LOGGER(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{LineReq}: 分机[%lu]强插, DestExten = %lu"), m_pHostLine->lineId(), DestId); CString CallerNum; CallerNum.Format(_T("%lu"), m_pHostLine->lineId()); // 启动操作 return CMC::GetInstance().offHook(m_pHostLine->devId(), true, CallerNum); } /***************************************************************** **【函数名称】 hangUp **【函数功能】 操作中挂机(命令方式) **【参数】 **【返回值】 ****************************************************************/ bool CInsertReq::hangUp( long InstanceHangUp ) { LOGGER(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{LineReq}: 分机[%lu]强插因挂机取消, DestExten = %lu"), m_pHostLine->lineId(), m_pAssoLine->lineId()); m_InstanceCancel = InstanceHangUp; return CMC::GetInstance().dropCall(m_pHostLine->devId(), false); } /***************************************************************** **【函数名称】 end **【函数功能】 操作完成 **【参数】 IsSucceed 操作是否成功 lpData 随路数据 **【返回值】 ****************************************************************/ void CInsertReq::end( bool IsSucceed, LPCTSTR lpData ) { if(IsSucceed) { LOGGER(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{LineReq}: 分机[%lu]强插成功, DestExten = %lu"), m_pHostLine->lineId(), m_pAssoLine->lineId()); } else { LOGGER(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{LineReq}: 分机[%lu]强插失败, DestExten = %lu"), m_pHostLine->lineId(), m_pAssoLine->lineId()); } // end if // 返回执行结果 if(m_InstanceCancel != 0) { m_pParent->notifyReqResult(m_ReqPdu, m_InstanceCancel, !IsSucceed, lpData); } // end if m_pParent->onLineReqEnd(this, IsSucceed, lpData); } /***************************************************************** **【函数名称】 onDevChEvent **【函数功能】 线路向上层发送的设备主动事件 **【参数】 pEventLine 触发事件的线路 EvtType 事件类型 lpContent 事件内容 **【返回值】 *****************************************************************/ void CInsertReq::onDevChEvent( CVirtualProxy* pEventLine, DEV_CH_EVT_TYPE EvtType, LPCTSTR lpContent ) { if(EvtType == DEV_CH_EVT_OFF_HOOK && pEventLine == m_pHostLine) { // 开始执强插操作 if(CSessionShell::GetInstance().procReqInsert(m_PendingCallId, m_pHostLine->devId(), m_pAssoLine->devId())) { end(true, lpContent); } else { CMC::GetInstance().dropCall(m_pHostLine->devId(), false); end(false, lpContent); } // end if } // end if } /***************************************************************** **【函数名称】 onLineStateChanged **【函数功能】 线路状态变化事件响应接口 **【参数】 pEventLine 状态变化的线路实体指针 LineState 线路当前状态 Call 主呼叫ID SubCall 子呼叫ID lpCallerNum 主叫号码 lpCalleeNum 被叫号码 **【返回值】 ****************************************************************/ void CInsertReq::onLineStateChanged( CVirtualProxy* pEventLine, VIRTUAL_LINE_STATE LineState, long Call, long SubCall, LPCTSTR lpCallerNum, LPCTSTR lpCalleeNum ) { if(LineState == VIRTUAL_LINE_STATE_FREE) end(false, NULL); }