#include "StdAfx.h" #include "SubSession.h" #include "ControlShell.h" #include "CallSession.h" #include "VirtualProxy.h" #include "ProxyShell.h" #include "MC.h" CSubSession::CSubSession(CCallSession* pParent, long SubId, PendingCallInfo* pInfo) : m_pParent(pParent), m_Id(SubId) { m_HostLineParty = CALL_PARTY_UNKNOWN; m_pInfo = new PendingCallInfo; ASSERT(m_pInfo != NULL); memcpy(m_pInfo, pInfo, sizeof(PendingCallInfo)); } CSubSession::~CSubSession(void) { delete m_pInfo; } /***************************************************************** **【函数名称】 DoBegin **【函数功能】 操作启动 **【参数】 nHostLineParty 操作主控线路在主会话中的职责 **【返回值】 *****************************************************************/ bool CSubSession::begin( CALL_PARTY_TYPE HostLineParty ) { // 保存呼叫信息 m_HostLineParty = HostLineParty; // 启动呼叫 return CMC::GetInstance().dial(m_pInfo->nAssoLine, m_pInfo->szCalleeNum, m_pInfo->szCallerNum, m_pInfo->nSipAccountId); } /***************************************************************** **【函数名称】 DoReplace **【函数功能】 被叫线路替换 **【参数】 HostLine 申请替换的线路 PeerLine 被替换的线路 ExtNum 申请替换线路的分机号 **【返回值】 *****************************************************************/ bool CSubSession::replace( CRDRID HostLine, CRDRID PeerLine, UINT ExtNum ) { // 线路替换 m_pParent->removeLine(PeerLine, CALL_PARTY_PENDING); if(!m_pParent->insertLine(HostLine, m_Id, TRUE)) return false; // 信息替换 m_pInfo->nAssoLine = HostLine; sprintf_s(m_pInfo->szCalleeNum, _T("%lu"), ExtNum); sprintf_s(m_pInfo->szCallerNum, _T("%s"), CProxyShell::GetInstance().getProxy(PeerLine.toIntId())->callerNum()); // 原线路挂机 return CMC::GetInstance().dropCall(PeerLine, false); } /***************************************************************** **【函数名称】 OnPendingLineStatus **【函数功能】 待处理线路状态变化事件 **【参数】 LineState 待处理线路当前状态 **【返回值】 *****************************************************************/ void CSubSession::onPendingLineState( VIRTUAL_LINE_STATE LineState ) { CProxyShell& Proxy = CProxyShell::GetInstance(); switch(LineState) { case VIRTUAL_LINE_STATE_FREE: { _onDialCancel(); // 呼叫结束处理(模板方法) Proxy.onLineStateUpdated(m_pInfo->nHostLine, m_pParent->id(), m_Id, VIRTUAL_LINE_STATE_FREE); Proxy.onLineStateUpdated(m_pInfo->nAssoLine, m_pParent->id(), m_Id, VIRTUAL_LINE_STATE_FREE); } break; case VIRTUAL_LINE_STATE_RING_BACK: { _onDialRing(); // 呼叫回铃处理(模板方法) Proxy.onLineStateUpdated(m_pInfo->nHostLine, m_pParent->id(), m_Id, VIRTUAL_LINE_STATE_RING_BACK, m_pInfo->szCallerNum, m_pInfo->szCalleeNum); Proxy.onLineStateUpdated(m_pInfo->nAssoLine, m_pParent->id(), m_Id, VIRTUAL_LINE_STATE_RING_BACK, m_pInfo->szCallerNum, m_pInfo->szCalleeNum); } break; case VIRTUAL_LINE_STATE_ALERTING: { _onDialRing(); // 呼叫振铃处理(模板方法) Proxy.onLineStateUpdated(m_pInfo->nHostLine, m_pParent->id(), m_Id, VIRTUAL_LINE_STATE_RING_BACK, m_pInfo->szCallerNum, m_pInfo->szCalleeNum); Proxy.onLineStateUpdated(m_pInfo->nAssoLine, m_pParent->id(), m_Id, VIRTUAL_LINE_STATE_ALERTING, m_pInfo->szCallerNum, m_pInfo->szCalleeNum); } break; case VIRTUAL_LINE_STATE_TALKING: { _onDialOK(); // 呼叫通话处理(模板方法) Proxy.onLineStateUpdated(m_pInfo->nHostLine, m_pParent->id(), m_Id, VIRTUAL_LINE_STATE_TALKING, m_pInfo->szCallerNum, m_pInfo->szCalleeNum); Proxy.onLineStateUpdated(m_pInfo->nAssoLine, m_pParent->id(), m_Id, VIRTUAL_LINE_STATE_TALKING, m_pInfo->szCallerNum, m_pInfo->szCalleeNum); } break; case VIRTUAL_LINE_STATE_PROGRESSING: { _onDialProgressing(); // 呼叫进展处理(模板方法) Proxy.onLineStateUpdated(m_pInfo->nHostLine, m_pParent->id(), m_Id, VIRTUAL_LINE_STATE_RING_BACK, m_pInfo->szCallerNum, m_pInfo->szCalleeNum); Proxy.onLineStateUpdated(m_pInfo->nAssoLine, m_pParent->id(), m_Id, VIRTUAL_LINE_STATE_RING_BACK, m_pInfo->szCallerNum, m_pInfo->szCalleeNum); } break; } // end switch }