#include "StdAfx.h" #include "ProxyExten.h" #include "ProxyShell.h" #include "ReqBase.h" #include "SessionShell.h" CProxyExten::CProxyExten(CProxyShell* pParent, CRDRID DevId) : CVirtualProxy(pParent, DevId), m_ExtNum(DevId.ChanNo), m_IsHoldOn(false), m_RealDevId(DevId) { } CProxyExten::~CProxyExten(void) { // 通知业务逻辑线路被删除 ASSERT(m_pParent != NULL); m_pParent->notifyDevResourceState(DEV_RES_TYPE_EXT, m_ExtNum, INNER_STATE_REMOVE); } /***************************************************************** **【函数名称】 __transVirtualState2OuterState **【函数功能】 映设虚拟线路状态到外部识别的状态 **【参数】 State: 线路状态 **【返回值】 ****************************************************************/ UINT CProxyExten::__transVirtualState2OuterState( VIRTUAL_LINE_STATE State ) const { switch(State) { case VIRTUAL_LINE_STATE_DISABLED: return INNER_STATE_DISABLED; case VIRTUAL_LINE_STATE_REMOVE: return INNER_STATE_REMOVE; case VIRTUAL_LINE_STATE_FREE: return INNER_STATE_FREE; case VIRTUAL_LINE_STATE_INIT: return INNER_STATE_INIT; case VIRTUAL_LINE_STATE_DIALING: return INNER_STATE_DIALING; case VIRTUAL_LINE_STATE_RING_BACK: return INNER_STATE_RING_BACK; case VIRTUAL_LINE_STATE_ALERTING: return INNER_STATE_ALERTING; case VIRTUAL_LINE_STATE_TALKING: return INNER_STATE_TALKING; default: ASSERT(FALSE); } // end switch return INNER_STATE_DISABLED; } /***************************************************************** **【函数名称】 _procLineState **【函数功能】 线路状态变化事件处理 **【参数】 Call 主会话ID SubCall 子会话ID State 线路基本状态 lpCallerNum 主叫号码 lpCalleeNum 被叫号码 **【返回值】 ****************************************************************/ void CProxyExten::_procLineState( long Call, long SubCall, VIRTUAL_LINE_STATE State, LPCTSTR lpCallerNum, LPCTSTR lpCalleeNum ) { //TODO: do nothing } /***************************************************************** **【函数名称】 _notifyLineState **【函数功能】 通知上层逻辑线路状态变化事件 **【参数】 **【返回值】 ****************************************************************/ void CProxyExten::_notifyLineState( void ) { // 通知业务逻辑线路状态变化事件 ASSERT(m_pParent != NULL); m_pParent->notifyDevResourceState(DEV_RES_TYPE_EXT, m_ExtNum, __transVirtualState2OuterState(m_State), m_CallerNum, m_CalleeNum); } /***************************************************************** **【函数名称】 notifyLineInfo **【函数功能】 通知上层逻辑线路信息 **【参数】 **【返回值】 ****************************************************************/ void CProxyExten::notifyLineInfo( PDU_DEV_TYPE a_DestType, int a_DestId ) const { // 通知业务逻辑线路状态变化事件 ASSERT(m_pParent != NULL); m_pParent->notifyResourceDetail(a_DestType, a_DestId, DEV_RES_TYPE_EXT, m_ExtNum); m_pParent->notifyDevResourceState(a_DestType, a_DestId, DEV_RES_TYPE_EXT, m_ExtNum, __transVirtualState2OuterState(m_State), m_CallerNum, m_CalleeNum); } /***************************************************************** **【函数名称】 notifyLineInfo **【函数功能】 通知上层逻辑线路信息 **【参数】 **【返回值】 ****************************************************************/ void CProxyExten::notifyLineInfo( void ) const { ASSERT(m_pParent != NULL); m_pParent->notifyResourceDetail(DEV_RES_TYPE_EXT, m_ExtNum); m_pParent->notifyDevResourceState(DEV_RES_TYPE_EXT, m_ExtNum, __transVirtualState2OuterState(m_State), m_CallerNum, m_CalleeNum); } /***************************************************************** **【函数名称】 onLineStateChanged **【函数功能】 线路状态变化事件处理 **【参数】 nCall 主会话ID nSubCall 子会话ID nStatus 线路基本状态 lpCallerNum 主叫号码 lpCalleeNum 被叫号码 **【返回值】 ****************************************************************/ void CProxyExten::onLineStateChanged( long Call, long SubCall, VIRTUAL_LINE_STATE State, LPCTSTR lpCallerNum, LPCTSTR lpCalleeNum ) { // 子呼叫空闲状态过滤(只处理操作) if(m_pLineReq != NULL && SubCall != SESSION_INVALID_SUB_CALL && State == VIRTUAL_LINE_STATE_FREE) { m_pLineReq->onLineStateChanged(this, State, Call, SubCall, lpCallerNum, lpCalleeNum); return; } // end if // 处理线路状事件 _procLineState(Call, SubCall, State, lpCallerNum, lpCalleeNum); // 保存呼叫信息 m_State = State; m_CallerNum = lpCallerNum; m_CalleeNum = lpCalleeNum; if(State == VIRTUAL_LINE_STATE_FREE) { m_ActiveCallId = SESSION_INVALID_CALL; m_DevId = m_RealDevId; } else m_ActiveCallId = Call; // 委托操作执行 if(m_pLineReq != NULL) m_pLineReq->onLineStateChanged(this, State, Call, SubCall, lpCallerNum, lpCalleeNum); // 通知业务逻辑线路状态变化事件 _notifyLineState(); } /***************************************************************** **【函数名称】 holdOn **【函数功能】 线路保持 **【参数】 **【返回值】 ****************************************************************/ bool CProxyExten::holdOn( void ) { if(m_IsHoldOn) return false; if(CSessionShell::GetInstance().procReqMute(m_ActiveCallId, m_DevId, true)) { m_IsHoldOn = true; // 通知业务逻辑线路状态变化事件 UINT HoldOnState = __transVirtualState2OuterState(m_State); HoldOnState |= INNER_STATE_HELD; ASSERT(m_pParent != NULL); m_pParent->notifyDevResourceState(DEV_RES_TYPE_EXT, m_ExtNum, HoldOnState, m_CallerNum, m_CalleeNum); } return m_IsHoldOn; } /***************************************************************** **【函数名称】 takeBack **【函数功能】 保持接回 **【参数】 **【返回值】 ****************************************************************/ bool CProxyExten::takeBack( void ) { if(!m_IsHoldOn) return false; if(CSessionShell::GetInstance().procReqMute(m_ActiveCallId, m_DevId, false)) { m_IsHoldOn = false; // 通知业务逻辑线路状态变化事件 ASSERT(m_pParent != NULL); m_pParent->notifyDevResourceState(DEV_RES_TYPE_EXT, m_ExtNum, __transVirtualState2OuterState(m_State), m_CallerNum, m_CalleeNum); } return !m_IsHoldOn; } /***************************************************************** **【函数名称】 isFree **【函数功能】 是否空闲 **【参数】 **【返回值】 ****************************************************************/ bool CProxyExten::isFree( void ) const { return isNull() && __super::isFree(); }