#include "StdAfx.h" #include "ProxyVoip.h" #include "ReqBase.h" #include "ProxyShell.h" /***************************************************************** **【函数名称】 onNewCall **【函数功能】 线路进入会话事件 **【参数】 Call 线路当前所属的主会话ID SubCall 线路当前所属的子会话ID **【返回值】 ****************************************************************/ void CProxyVoip::CImplement4Trunk::onNewCall( CProxyVoip& Proxy, long Call, long SubCall ) { Proxy.m_ActiveCallId = Call; } /***************************************************************** **【函数名称】 onDevChEvent **【函数功能】 物理线路向上层发送的设备主动事件 **【参数】 EvtType 事件类型 lpContent 事件内容 **【返回值】 *****************************************************************/ void CProxyVoip::CImplement4Trunk::onDevChEvent( CProxyVoip& Proxy, DEV_CH_EVT_TYPE EvtType, LPCTSTR lpContent ) { if(Proxy.m_pLineReq != NULL) Proxy.m_pLineReq->onDevChEvent(&Proxy, EvtType, lpContent); } /***************************************************************** **【函数名称】 onLineStateChanged **【函数功能】 线路状态变化事件处理 **【参数】 nCall 主会话ID nSubCall 子会话ID nStatus 线路基本状态 lpCallerNum 主叫号码 lpCalleeNum 被叫号码 **【返回值】 ****************************************************************/ void CProxyVoip::CImplement4Trunk::onLineStateChanged( CProxyVoip& Proxy, long Call, long SubCall, VIRTUAL_LINE_STATE State, LPCTSTR lpCallerNum, LPCTSTR lpCalleeNum ) { // 子呼叫空闲状态过滤 if(Proxy.m_pLineReq != NULL && SubCall != SESSION_INVALID_SUB_CALL && State == VIRTUAL_LINE_STATE_FREE) { Proxy.m_pLineReq->onLineStateChanged(&Proxy, State, Call, SubCall, lpCallerNum, lpCalleeNum); return; } // end if // 处理线路状事件 procLineState(Proxy, Call, SubCall, State, lpCallerNum, lpCalleeNum); // 保存呼叫信息 Proxy.m_State = State; Proxy.m_CallerNum = lpCallerNum; Proxy.m_CalleeNum = lpCalleeNum; if(State == VIRTUAL_LINE_STATE_FREE) Proxy.m_ActiveCallId = SESSION_INVALID_CALL; else Proxy.m_ActiveCallId = Call; // 委托操作执行 if(Proxy.m_pLineReq != NULL) Proxy.m_pLineReq->onLineStateChanged(&Proxy, State, Call, SubCall, lpCallerNum, lpCalleeNum); // 通知业务逻辑线路状态变化事件 notifyLineState(Proxy); } /***************************************************************** **【函数名称】 procLineState **【函数功能】 线路状态变化事件处理 **【参数】 Call 主会话ID SubCall 子会话ID State 线路基本状态 lpCallerNum 主叫号码 lpCalleeNum 被叫号码 **【返回值】 ****************************************************************/ void CProxyVoip::CImplement4Trunk::procLineState( CProxyVoip& Proxy, long Call, long SubCall, VIRTUAL_LINE_STATE State, LPCTSTR lpCallerNum, LPCTSTR lpCalleeNum ) { // 根据外线状态进行对应的逻辑处理 if(Proxy.m_State == VIRTUAL_LINE_STATE_ALERTING && State == VIRTUAL_LINE_STATE_TALKING) { // 外线来电 Proxy.m_CallerNum = lpCallerNum; Proxy.m_CalleeNum = lpCalleeNum; ASSERT(Proxy.m_pParent != NULL); Proxy.m_pParent->notifyLineOpEvent(Proxy.m_DevId.toIntId(), DEV_OP_CALL_IN, lpCallerNum, lpCalleeNum); } } /***************************************************************** **【函数名称】 notifyLineState **【函数功能】 通知上层逻辑线路状态变化事件 **【参数】 **【返回值】 ****************************************************************/ void CProxyVoip::CImplement4Trunk::notifyLineState( CProxyVoip& Proxy ) { UINT State = transVirtualState2OuterState(Proxy.m_State); // 通知业务逻辑线路状态变化事件 ASSERT(Proxy.m_pParent != NULL); Proxy.m_pParent->notifyDevResourceState(DEV_RES_TYPE_VOIP, Proxy.m_DevId.toIntId(), State, Proxy.m_CallerNum, Proxy.m_CalleeNum); } /***************************************************************** **【函数名称】 transVirtualState2OuterState **【函数功能】 翻译虚拟状态到真实外部状态 **【参数】 **【返回值】 ****************************************************************/ UINT CProxyVoip::CImplement4Trunk::transVirtualState2OuterState( VIRTUAL_LINE_STATE State ) const { switch(State) { case VIRTUAL_LINE_STATE_FREE: return VOIP_TRUNK_STATE_FREE; case VIRTUAL_LINE_STATE_DIALING: return VOIP_TRUNK_STATE_DIALING; case VIRTUAL_LINE_STATE_RING_BACK: return VOIP_TRUNK_STATE_RING_BACK; case VIRTUAL_LINE_STATE_ALERTING: return VOIP_TRUNK_STATE_ALERTING; case VIRTUAL_LINE_STATE_TALKING: return VOIP_TRUNK_STATE_TALKING; case VIRTUAL_LINE_STATE_DISABLED: return VOIP_TRUNK_STATE_DISABLED; default: ASSERT(FALSE); } // end switch return VOIP_TRUNK_STATE_UNKNOWN; } /***************************************************************** **【函数名称】 onNewCall **【函数功能】 线路进入会话事件 **【参数】 Call 线路当前所属的主会话ID SubCall 线路当前所属的子会话ID **【返回值】 ****************************************************************/ void CProxyVoip::CImplement4Exten::onNewCall( CProxyVoip& Proxy, long Call, long SubCall ) { ASSERT(Proxy.m_IAmExten != NULL); Proxy.m_IAmExten->onNewCall(Call, SubCall); Proxy.m_ActiveCallId = Call; } /***************************************************************** **【函数名称】 onDevChEvent **【函数功能】 物理线路向上层发送的设备主动事件 **【参数】 EvtType 事件类型 lpContent 事件内容 **【返回值】 *****************************************************************/ void CProxyVoip::CImplement4Exten::onDevChEvent( CProxyVoip& Proxy, DEV_CH_EVT_TYPE EvtType, LPCTSTR lpContent ) { ASSERT(Proxy.m_IAmExten != NULL); Proxy.m_IAmExten->onDevChEvent(EvtType, lpContent); } /***************************************************************** **【函数名称】 onLineStateChanged **【函数功能】 线路状态变化事件处理 **【参数】 nCall 主会话ID nSubCall 子会话ID nStatus 线路基本状态 lpCallerNum 主叫号码 lpCalleeNum 被叫号码 **【返回值】 ****************************************************************/ void CProxyVoip::CImplement4Exten::onLineStateChanged( CProxyVoip& Proxy, long Call, long SubCall, VIRTUAL_LINE_STATE State, LPCTSTR lpCallerNum, LPCTSTR lpCalleeNum ) { CVirtualProxy* pExten = Proxy.m_IAmExten; if(pExten != NULL) { pExten->onLineStateChanged(Call, SubCall, State, lpCallerNum, lpCalleeNum); if(pExten->state() == VIRTUAL_LINE_STATE_FREE) { if(pExten->invalidFlag()) Proxy.m_pParent->onLineDelete(pExten->devId()); Proxy.m_IAmExten = NULL; Proxy.m_pImplement = &(Proxy.ms_Implement4Trunk); } } if(Proxy.m_State != State) { // 保存呼叫信息 Proxy.m_State = State; Proxy.m_CallerNum = lpCallerNum; Proxy.m_CalleeNum = lpCalleeNum; if(State == VIRTUAL_LINE_STATE_FREE) Proxy.m_ActiveCallId = SESSION_INVALID_CALL; else Proxy.m_ActiveCallId = Call; // 通知业务逻辑线路状态变化事件 notifyLineState(Proxy); } } /***************************************************************** **【函数名称】 procLineState **【函数功能】 线路状态变化事件处理 **【参数】 Call 主会话ID SubCall 子会话ID State 线路基本状态 lpCallerNum 主叫号码 lpCalleeNum 被叫号码 **【返回值】 ****************************************************************/ void CProxyVoip::CImplement4Exten::procLineState( CProxyVoip& Proxy, long Call, long SubCall, VIRTUAL_LINE_STATE State, LPCTSTR lpCallerNum, LPCTSTR lpCalleeNum ) { } /***************************************************************** **【函数名称】 notifyLineState **【函数功能】 通知上层逻辑线路状态变化事件 **【参数】 **【返回值】 ****************************************************************/ void CProxyVoip::CImplement4Exten::notifyLineState( CProxyVoip& Proxy ) { UINT State = transVirtualState2OuterState(Proxy.m_State); // 通知业务逻辑线路状态变化事件 ASSERT(Proxy.m_pParent != NULL); Proxy.m_pParent->notifyDevResourceState(DEV_RES_TYPE_VOIP, Proxy.m_DevId.toIntId(), State, Proxy.m_CallerNum, Proxy.m_CalleeNum); } /***************************************************************** **【函数名称】 transVirtualState2OuterState **【函数功能】 翻译虚拟状态到真实外部状态 **【参数】 **【返回值】 ****************************************************************/ UINT CProxyVoip::CImplement4Exten::transVirtualState2OuterState( VIRTUAL_LINE_STATE State ) const { switch(State) { case VIRTUAL_LINE_STATE_FREE: return VOIP_EXT_STATE_FREE; case VIRTUAL_LINE_STATE_INIT: return VOIP_EXT_STATE_INIT; case VIRTUAL_LINE_STATE_DIALING: return VOIP_EXT_STATE_DIALING; case VIRTUAL_LINE_STATE_RING_BACK: return VOIP_EXT_STATE_RING_BACK; case VIRTUAL_LINE_STATE_ALERTING: return VOIP_EXT_STATE_ALERTING; case VIRTUAL_LINE_STATE_TALKING: return VOIP_EXT_STATE_TALKING; case VIRTUAL_LINE_STATE_DISABLED: return VOIP_EXT_STATE_DISABLED; default: ASSERT(FALSE); } // end switch return VOIP_EXT_STATE_DISABLED; } CProxyVoip::CImplement4Trunk CProxyVoip::ms_Implement4Trunk; CProxyVoip::CImplement4Exten CProxyVoip::ms_Implement4Exten; CProxyVoip::CProxyVoip(CProxyShell* pParent, CRDRID DevId) : CVirtualProxy(pParent, DevId), m_pImplement(&ms_Implement4Trunk), m_IAmExten(NULL) { ASSERT(m_pParent != NULL); } CProxyVoip::~CProxyVoip(void) { // 通知业务逻辑线路被删除 ASSERT(m_pParent != NULL); m_pParent->notifyDevResourceState(DEV_RES_TYPE_VOIP, m_DevId.toIntId(), VOIP_TRUNK_STATE_DISABLED); } /***************************************************************** **【函数名称】 _procLineState **【函数功能】 线路状态变化事件处理 **【参数】 Call 主会话ID SubCall 子会话ID State 线路基本状态 lpCallerNum 主叫号码 lpCalleeNum 被叫号码 **【返回值】 ****************************************************************/ void CProxyVoip::_procLineState( long Call, long SubCall, VIRTUAL_LINE_STATE State, LPCTSTR lpCallerNum, LPCTSTR lpCalleeNum ) { ASSERT(m_pImplement != NULL); m_pImplement->procLineState(*this, Call, SubCall, State, lpCallerNum, lpCalleeNum); } /***************************************************************** **【函数名称】 _notifyLineState **【函数功能】 通知上层逻辑线路状态变化事件 **【参数】 **【返回值】 ****************************************************************/ void CProxyVoip::_notifyLineState( void ) { ASSERT(m_pImplement != NULL); m_pImplement->notifyLineState(*this); } /***************************************************************** **【函数名称】 onNewCall **【函数功能】 线路进入会话事件 **【参数】 nCall 线路当前所属的主会话ID nSubCall 线路当前所属的子会话ID **【返回值】 ****************************************************************/ void CProxyVoip::onNewCall( long Call, long SubCall ) { ASSERT(m_pImplement != NULL); m_pImplement->onNewCall(*this, Call, SubCall); } /***************************************************************** **【函数名称】 onDevChEvent **【函数功能】 物理线路向上层发送的设备主动事件 **【参数】 nEvtType 事件类型 lpContent 事件内容 **【返回值】 *****************************************************************/ void CProxyVoip::onDevChEvent( DEV_CH_EVT_TYPE EvtType, LPCTSTR lpContent ) { ASSERT(m_pImplement != NULL); m_pImplement->onDevChEvent(*this, EvtType, lpContent); } /***************************************************************** **【函数名称】 notifyLineInfo **【函数功能】 通知上层逻辑线路信息 **【参数】 **【返回值】 ****************************************************************/ void CProxyVoip::notifyLineInfo( PDU_DEV_TYPE DestType, int DestId ) const { // 通知业务逻辑线路状态变化事件 ASSERT(m_pParent != NULL); m_pParent->notifyResourceDetail(DestType, DestId, DEV_RES_TYPE_VOIP, m_DevId.toIntId()); ASSERT(m_pImplement != NULL); m_pParent->notifyDevResourceState(DestType, DestId, DEV_RES_TYPE_VOIP, m_DevId.toIntId(), m_pImplement->transVirtualState2OuterState(m_State), m_CallerNum, m_CalleeNum); } /***************************************************************** **【函数名称】 notifyLineInfo **【函数功能】 通知上层逻辑线路信息 **【参数】 **【返回值】 ****************************************************************/ void CProxyVoip::notifyLineInfo( void ) const { // 通知业务逻辑线路状态变化事件 ASSERT(m_pParent != NULL); m_pParent->notifyResourceDetail(DEV_RES_TYPE_VOIP, m_DevId.toIntId()); ASSERT(m_pImplement != NULL); m_pParent->notifyDevResourceState(DEV_RES_TYPE_VOIP, m_DevId.toIntId(), m_pImplement->transVirtualState2OuterState(m_State), m_CallerNum, m_CalleeNum); } /***************************************************************** **【函数名称】 onLineStateChanged **【函数功能】 线路状态变化事件处理 **【参数】 nCall 主会话ID nSubCall 子会话ID nStatus 线路基本状态 lpCallerNum 主叫号码 lpCalleeNum 被叫号码 **【返回值】 ****************************************************************/ void CProxyVoip::onLineStateChanged( long Call, long SubCall, VIRTUAL_LINE_STATE State, LPCTSTR lpCallerNum, LPCTSTR lpCalleeNum ) { ASSERT(m_pImplement != NULL); m_pImplement->onLineStateChanged(*this, Call, SubCall, State, lpCallerNum, lpCalleeNum); } /***************************************************************** **【函数名称】 wrap **【函数功能】 包装为分机方式工作 **【参数】 **【返回值】 ****************************************************************/ void CProxyVoip::wrap( CVirtualProxy* pWrapper ) { m_IAmExten = pWrapper; m_pImplement = &ms_Implement4Exten; } /***************************************************************** **【函数名称】 getAssoExtenNo **【函数功能】 获取VOIP线路关联的分机号码 **【参数】 **【返回值】 ****************************************************************/ void CProxyVoip::getAssoExtenNo( CString& ExtenNo ) { if(m_IAmExten != NULL) ExtenNo.Format(_T("%lu"), m_IAmExten->lineId()); }