#include "StdAfx.h" #include "ChanTrunk.h" #include "FsProxy.h" #include "Operation.h" CChanTrunk::CChanTrunk(CFsProxy* pParent, UINT ChanNo) : CVirtualChan(pParent, ChanNo), m_pEslHandle(NULL), m_StopConnect(true) { } CChanTrunk::~CChanTrunk(void) { } /***************************************************************** **【函数名称】 isFree **【函数功能】 是否空闲 **【参数】 **【返回值】 *****************************************************************/ bool CChanTrunk::isFree( void ) const { if (m_State == CHAN_LOGIC_STATE_FREE && m_pOperation != NULL) { LOGGER(LOG_LEVEL_WARNING, _T("{ChanTrunk}: 通道[%lu]空闲,操作非空"), m_No); } return m_State == CHAN_LOGIC_STATE_FREE && m_pOperation == NULL; } /***************************************************************** **【函数名称】 regist **【函数功能】 注册线路 **【参数】 **【返回值】 *****************************************************************/ void CChanTrunk::regist( void ) const { m_pParent->onChanRegist(DEV_RES_TYPE_TRUNK, m_No, m_State); } /***************************************************************** **【函数名称】 onChanEvent **【函数功能】 通道事件处理 **【参数】 **【返回值】 *****************************************************************/ void CChanTrunk::onChanEvent( PCHAN_EVENT_NOTIFY pNotify ) { if (pNotify == NULL) return; switch(pNotify->EventId) { case CHANNEL_EVENT_CREATE: { _setSession(pNotify->CallId, pNotify->ChanId); m_CallerNum = pNotify->Caller; m_CalleeNum = pNotify->Callee; CVirtualChan::setTurnkId(this->no()); trunkRecordSession[CVirtualChan::trunkId()] = CVirtualChan::sessionId(); LOGGER(LOG_LEVEL_WARNING, _T("{Line Map存值}: Trunk-SessionId:%s"), trunkRecordSession[CVirtualChan::trunkId()]); if(pNotify->Direction == CALL_DIRECTION_INBOUND) // 呼入FS m_State = CHAN_LOGIC_STATE_ALERTING; else m_State = CHAN_LOGIC_STATE_DIALING; } break; case CHANNEL_EVENT_PROGRESS: case CHANNEL_EVENT_PROGRESS_MEDIA: { if(pNotify->Direction == CALL_DIRECTION_OUTBOUND) // FS呼出 m_State = CHAN_LOGIC_STATE_RING_BACK; else return; LOGGER(LOG_LEVEL_WARNING, _T("{Line Map存值}: Trunk-SessionId:%s"), trunkRecordSession[CVirtualChan::trunkId()]); } break; case CHANNEL_EVENT_ANSWER: { m_State = CHAN_LOGIC_STATE_TALKING; LOGGER(LOG_LEVEL_WARNING, _T("{Line Map存值}: Trunk-SessionId:%s"), trunkRecordSession[CVirtualChan::trunkId()]); } break; case CHANNEL_EVENT_HANGUP_COMPLETE: { m_State = CHAN_LOGIC_STATE_FREE; _setSession(NULL, NULL); _reset(); m_StopConnect = true; m_pEslHandle = NULL; } break; default: return; } #ifdef _DEBUG LOGGER(LOG_LEVEL_NORMAL, _T("{CChanTrunk}: 中继[%lu]状态更新, state = %d"), m_No, m_State); #endif if(m_pOperation != NULL) m_pOperation->onHostChanStateUpdated(this); m_pParent->onChanStateUpdate(pNotify->ChanOpInstance, this); } /***************************************************************** **【函数名称】 onSessionChanEvent **【函数功能】 会话关联通道事件处理 **【参数】 **【返回值】 *****************************************************************/ void CChanTrunk::onSessionChanEvent( CVirtualChan* pChanSession, PCHAN_EVENT_NOTIFY pNotify ) { ASSERT(pChanSession != NULL); if(m_pOperation != NULL) m_pOperation->onSessionChanStateUpdated(pChanSession); } /***************************************************************** **【函数名称】 processCallConnect **【函数功能】 处理呼叫连接 **【参数】 **【返回值】 *****************************************************************/ bool CChanTrunk::processCallConnect( esl_handle_t* pHandle ) { if(m_pEslHandle != NULL) { LOGGER(LOG_LEVEL_WARNING, _T("{ChanTrunk}: 通道[%lu]处理呼叫连接时已被占用, 新呼叫将被忽略"), m_No); return false; } m_pEslHandle = pHandle; m_State = CHAN_LOGIC_STATE_STANDBY; if(m_pOperation != NULL) m_pOperation->onHostChanStateUpdated(this); // 通知任务通道状态 else m_pParent->onTrunkCallIn(this); // 通知外线呼入 m_StopConnect = false; return true; } /***************************************************************** **【函数名称】 processCallDisconnect **【函数功能】 处理呼叫连接中断 **【参数】 **【返回值】 *****************************************************************/ void CChanTrunk::processCallDisconnect( void ) { m_StopConnect = true; m_pEslHandle = NULL; } /***************************************************************** **【函数名称】 onAppExecuted **【函数功能】 处理通道应用执行 **【参数】 **【返回值】 *****************************************************************/ void CChanTrunk::onAppExecuted( PAPP_EXEC_NOTIFY pNotify ) { if(m_pOperation != NULL) m_pOperation->onChanAppExecuted(this, pNotify); }