| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396 |
- #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());
- }
|