#include "StdAfx.h" #include "LogicLineVoip.h" #include "CallSession.h" #include "SessionHolder.h" #include "StatisticsMgr.h" CLogicLineVoip::CLogicLineVoip(UINT ResId) : CLogicLine(ResId), m_IsOnTrunkMode(false) { } CLogicLineVoip::~CLogicLineVoip(void) { } /***************************************************************** **【函数名称】 onLineStatusUpdated **【函数功能】 处理线路状态变化 **【参数】 EvtInfo: 线路资源状态 **【返回值】 ****************************************************************/ void CLogicLineVoip::onLineStatusUpdated( const EventResStatus &EvtInfo ) { /*********************************************************************** **由于VOIP通道的特殊性,其即可工作在分机模式下,又可工作在中继模式下。 **故对其状态的变更要特殊处理。在中继模式下其处理方式和普通数字中继相同, **而在分机模式下其通道状态不再通知给统计和会话模块,而由其对应的分机线路 **通知统计和会话模块,否则会造成重复统计和会话状态维护错误的问题 *************************************************************************/ if(m_LineStatus == EvtInfo.nState) return; switch(EvtInfo.nState) { case VOIP_EXT_STATE_DISABLED: case VOIP_EXT_STATE_FREE: case VOIP_EXT_STATE_INIT: case VOIP_EXT_STATE_DIALING: case VOIP_EXT_STATE_RING_BACK: case VOIP_EXT_STATE_ALERTING: case VOIP_EXT_STATE_TALKING: m_IsOnTrunkMode = false; break; case VOIP_TRUNK_STATE_DISABLED: case VOIP_TRUNK_STATE_FREE: case VOIP_TRUNK_STATE_DIALING: case VOIP_TRUNK_STATE_RING_BACK: case VOIP_TRUNK_STATE_ALERTING: case VOIP_TRUNK_STATE_TALKING: case VOIP_TRUNK_STATE_UNKNOWN: m_IsOnTrunkMode = true; break; default: ASSERT(FALSE); } // 保存线路信息 m_LineStatus = EvtInfo.nState; m_CallerNum = EvtInfo.szCallerNum; m_CalleeNum = EvtInfo.szCalleeNum; ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_NORMAL, _T("{LogicLineVoip}: 线路状态, LineId = %lu,State=%d,IsOnTrunkMode=%d,CallId=%lu,Caller=%s,Callee=%s"), m_LineId, m_LineStatus, m_IsOnTrunkMode, m_CallId, m_CallerNum, m_CalleeNum ); if(m_IsOnTrunkMode) // 此时表明VOIP通道工作在中继模式下 { _reportLineStatus(); // 统计线路状态变化 CSessionHolder::GetInstance().onLineStatusUpdated(this); } }