#include "StdAfx.h" #include "ConsultSession.h" #include "CallSession.h" #include "ProxyShell.h" #include "MC.h" CConsultSession::CConsultSession(CCallSession* pParent, long SubId, PendingCallInfo* pInfo) : CSubSession(pParent, SubId, pInfo) { m_PeerLineId = pInfo->nAssoLine; m_IsConnected = false; m_IsPlayTone = false; } CConsultSession::~CConsultSession(void) { } /***************************************************************** **【函数名称】 _onDialCancel **【函数功能】 呼叫取消处理 **【参数】 **【返回值】 *****************************************************************/ void CConsultSession::_onDialCancel( void ) { // 停止回铃音播放 if(m_IsPlayTone) CMC::GetInstance().playTone(m_pInfo->nHostLine, CHANNEL_TONE_NULL); // 呼叫成功后被叫端挂机 if(m_IsConnected) { // 主控线路和被叫线路的断开通话连接 CMC::GetInstance().bridgeDevice(m_pInfo->nHostLine, m_pInfo->nAssoLine, false); } // end if // 原通话线路取消静音 m_pParent->lineMute(m_pInfo->nHostLine, false); // 主控线路状态修正 if(m_pParent->isExist(m_pInfo->nHostLine, m_HostLineParty)) { 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); } // end if } /***************************************************************** **【函数名称】 OnDialOK **【函数功能】 呼叫成功后续处理 **【参数】 **【返回值】 *****************************************************************/ void CConsultSession::_onDialOK( void ) { // 停止回铃音播放 if(m_IsPlayTone) CMC::GetInstance().playTone(m_pInfo->nHostLine, CHANNEL_TONE_NULL); // 已应答呼叫标志 m_IsConnected = true; // 建立主控线路和被叫线路的通话连接 CMC::GetInstance().bridgeDevice(m_pInfo->nHostLine, m_pInfo->nAssoLine, true); } /***************************************************************** **【函数名称】 _onDialing **【函数功能】 呼叫进展处理 **【参数】 **【返回值】 *****************************************************************/ void CConsultSession::_onDialRing( void ) { m_IsPlayTone = true; //对原通话主控线路执行回铃音 CMC::GetInstance().playTone(m_pInfo->nHostLine, CHANNEL_TONE_RINGBACK); // 对原通话执行静音操作 m_pParent->lineMute(m_pInfo->nHostLine, true); } /***************************************************************** **【函数名称】 resume **【函数功能】 操作暂停后继续处理 **【参数】 Type 操作类型 **【返回值】 *****************************************************************/ bool CConsultSession::resume( UINT Type ) { // 原通话的对端线路停止放音 CMC::GetInstance().playStop(m_PeerLineId); // 原通话线路取消静音 m_pParent->lineMute(m_pInfo->nHostLine, false); // 转换会话模式 if(Type == 0) // 转移呼叫 { // 主控线路和被叫线路的断开通话连接 CMC::GetInstance().bridgeDevice(m_pInfo->nHostLine, m_pInfo->nAssoLine, false); // 主会话中线路替换 m_pParent->removeLine(m_pInfo->nAssoLine, CALL_PARTY_PENDING); m_pParent->removeLine(m_pInfo->nHostLine, m_HostLineParty); m_pParent->insertLine(m_pInfo->nAssoLine, m_HostLineParty, true); // 主控线路挂机 CMC::GetInstance().dropCall(m_pInfo->nHostLine, true); } else // 会议呼叫 { // 主会话转换成会议 m_pParent->trans2Meeting(m_pInfo->nHostLine); // 被叫线路职责转换 m_pParent->removeLine(m_pInfo->nAssoLine, CALL_PARTY_PENDING); m_pParent->insertLine(m_pInfo->nAssoLine, CALL_PARTY_MEETING, true); } // end if return true; }