#include "StdAfx.h" #include "TrunkSession.h" #include "CallSession.h" #include "ProxyShell.h" #include "MC.h" #include "OneLeg.h" CTrunkSession::CTrunkSession(CCallSession* pParent, long SubId, PendingCallInfo* pInfo) : CSubSession(pParent, SubId, pInfo), m_IsLinked(false) { } CTrunkSession::~CTrunkSession(void) { } /***************************************************************** **【函数名称】 onHostLineStateFree **【函数功能】 主叫线路空闲处理 **【参数】 **【返回值】 *****************************************************************/ void CTrunkSession::onHostLineStateFree( void ) { // 断开通道连接 if(m_IsLinked) { CMC::GetInstance().bridgeDevice(m_pInfo->nHostLine, m_pInfo->nAssoLine, false); m_IsLinked = false; } } /***************************************************************** **【函数名称】 onPeerLineStateFree **【函数功能】 被叫线路空闲处理 **【参数】 **【返回值】 *****************************************************************/ void CTrunkSession::onPeerLineStateFree( void ) { // 断开通道连接 if(m_IsLinked) { CMC::GetInstance().bridgeDevice(m_pInfo->nHostLine, m_pInfo->nAssoLine, false); m_IsLinked = false; } } /***************************************************************** **【函数名称】 _onDialCancel **【函数功能】 呼叫取消处理 **【参数】 **【返回值】 *****************************************************************/ void CTrunkSession::_onDialCancel( void ) { // 断开通道连接 if(m_IsLinked) { CMC::GetInstance().bridgeDevice(m_pInfo->nHostLine, m_pInfo->nAssoLine, false); m_IsLinked = false; } // 如果主控线路还在会话中 //if(m_pParent->isExist(m_pInfo->nHostLine, m_HostLineParty)) //{ // // 如果主控线路初始状态为非空闲 // if(m_pInfo->nHostLineStatus != VIRTUAL_LINE_STATE_FREE) // { // CProxyShell::GetInstance().onLineStateUpdated(m_pInfo->nHostLine, m_pParent->id(), SESSION_INVALID_SUB_CALL, // (VIRTUAL_LINE_STATE)m_pInfo->nHostLineStatus, m_pInfo->szPreCallerNum, m_pInfo->szPreCalleeNum); // } // else // 初始为空闲时直接调用挂机操作 // { // CMC::GetInstance().dropCall(m_pInfo->nHostLine, false); // } //} } /***************************************************************** **【函数名称】 _onDialOK **【函数功能】 呼叫成功后续处理 **【参数】 **【返回值】 *****************************************************************/ void CTrunkSession::_onDialOK( void ) { COneLeg* pHostLeg = CMC::GetInstance().getCallLeg(m_pInfo->nHostLine); ASSERT(pHostLeg != NULL); if (pHostLeg != NULL) { bool t_b_a = pHostLeg->accept(); if (t_b_a == false) { LOGGER(LOG_CLASS_DEV, LOG_LEVEL_NORMAL, _T("{CTrunkSession}: a-leg执行accept失败,caller=%s,callee=%s"), pHostLeg->getCaller(), pHostLeg->getCallee()); return; } } // 主会话中线路替换 switch(m_HostLineParty) { case CALL_PARTY_HOST: // 主控线路 { m_pParent->removeLine(m_pInfo->nAssoLine, CALL_PARTY_PENDING); m_IsLinked = m_pParent->insertLine(m_pInfo->nAssoLine, CALL_PARTY_PEER, !m_IsLinked); } break; case CALL_PARTY_PEER: // 对端线路 { m_pParent->removeLine(m_pInfo->nAssoLine, CALL_PARTY_PENDING); m_IsLinked = m_pParent->insertLine(m_pInfo->nAssoLine, CALL_PARTY_HOST, !m_IsLinked); } break; case CALL_PARTY_MEETING: // 会议线路 { ASSERT(FALSE); } break; } // end switch CMC::GetInstance().bridgeDevice(m_pInfo->nHostLine, m_pInfo->nAssoLine, true); } /***************************************************************** **【函数名称】 _onDialing **【函数功能】 呼叫振铃处理 **【参数】 **【返回值】 *****************************************************************/ void CTrunkSession::_onDialRing( void ) { COneLeg* pHostLeg = CMC::GetInstance().getCallLeg(m_pInfo->nHostLine); ASSERT(pHostLeg != NULL); if(pHostLeg != NULL) { if(!m_IsLinked) { // 运行到此说明中继线路不送early media,故两通道未建立连接,此时由中间件向分机送回铃音 pHostLeg->reply(); } } } /***************************************************************** **【函数名称】 _onDialProgressing **【函数功能】 呼叫进展处理 **【参数】 **【返回值】 *****************************************************************/ void CTrunkSession::_onDialProgressing( void ) { COneLeg* pHostLeg = CMC::GetInstance().getCallLeg(m_pInfo->nHostLine); ASSERT(pHostLeg != NULL); if(pHostLeg != NULL) pHostLeg->progress(); if(!m_IsLinked) m_IsLinked = CMC::GetInstance().bridgeDevice(m_pInfo->nHostLine, m_pInfo->nAssoLine, true); }