#include "StdAfx.h" #include "TurnAgentReq.h" #include "ProxyExten.h" #include "SessionShell.h" #include "ControlShell.h" #include "ProxyShell.h" #include "MC.h" CTurnAgentReq::CTurnAgentReq(CProxyShell* pParent, CPduEntity& ReqPdu) : CReqBase(pParent, ReqPdu), m_pAssoLine(NULL), m_PendingCallId(SESSION_INVALID_SUB_CALL) { } CTurnAgentReq::~CTurnAgentReq(void) { } /***************************************************************** **【函数名称】 request **【函数功能】 发出请求(命令方式) **【参数】 **【返回值】 ****************************************************************/ bool CTurnAgentReq::request( void ) { // 校验状态 if(m_pHostLine->state() != VIRTUAL_LINE_STATE_TALKING) return false; // 获取分机号 m_ExtenNum = m_ReqPdu.GetDataString(3); UINT ExtenNo = 0; sscanf_s(m_ExtenNum, _T("%u"), &ExtenNo); // 根据被叫号码查找对端线路且修正被叫号码 m_pAssoLine = m_pParent->getProxyExtenWrapped(ExtenNo); if(m_pAssoLine == NULL) { LOGGER(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{LineReq}: 中继[%lu]转坐席失败, 查找分机线路[%lu]失败"), m_pHostLine->lineId(), ExtenNo); return false; } // end if if(m_pAssoLine->state() != VIRTUAL_LINE_STATE_FREE) { LOGGER(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{LineReq}: 中继[%lu]转坐席失败, 分机线路[%lu]非空闲"), m_pHostLine->lineId(), ExtenNo); return false; } // 通知启动日志 LOGGER(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{LineReq}: 中继[%lu]转坐席, PendingCallId=%ld,ExtenNum = %u, HostCallId = %ld,callerNum=%s"), m_PendingCallId,m_pHostLine->lineId(), ExtenNo, m_pHostLine->activeCallId(),m_pHostLine->callerNum()); // 开始建立转移 PendingCallInfo info; memset(&info, 0, sizeof(PendingCallInfo)); info.nCall = m_pHostLine->activeCallId(); info.nHostLine = m_pHostLine->devId(); info.nAssoLine = m_pAssoLine->devId(); lstrcpy(info.szCallerNum, m_pHostLine->callerNum()); lstrcpy(info.szCalleeNum, m_ExtenNum); lstrcpy(info.szPreCallerNum, m_pHostLine->callerNum()); lstrcpy(info.szPreCalleeNum, m_pHostLine->calleeNum()); info.nCallType = PENDING_CALL_DIRECT; info.nHostLineStatus = VIRTUAL_LINE_STATE_TALKING; info.nSipAccountId = INVALID_ID_SIP_ACCOUNT; return CSessionShell::GetInstance().procReqDialSetup(m_PendingCallId, &info); } /***************************************************************** **【函数名称】 hangUp **【函数功能】 操作中挂机(命令方式) **【参数】 **【返回值】 ****************************************************************/ bool CTurnAgentReq::hangUp( long InstanceHangUp ) { // 转座席取消日志 LOGGER(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, __T("{LineReq}: 中继[%lu]因挂机取消转坐席, ExtenNum = %s"), m_pHostLine->lineId(), m_ExtenNum); m_InstanceCancel = InstanceHangUp; return CMC::GetInstance().dropCall(m_pAssoLine->devId(), false); } /***************************************************************** **【函数名称】 end **【函数功能】 操作完成 **【参数】 IsSucceed 操作是否成功 lpData 随路数据 **【返回值】 ****************************************************************/ void CTurnAgentReq::end( bool IsSucceed, LPCTSTR lpData ) { if(IsSucceed) { LOGGER(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{LineReq}: 中继[%lu]转坐席成功, ExtenNum = %s"), m_pHostLine->lineId(), m_ExtenNum); } else { LOGGER(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{LineReq}: 中继[%lu]转坐席失败, ExtenNum = %s"), m_pHostLine->lineId(), m_ExtenNum); } // end if // 返回执行结果 if(m_InstanceCancel != 0) { m_pParent->notifyReqResult(m_ReqPdu, m_InstanceCancel, !IsSucceed, lpData); } // end if m_pParent->onLineReqEnd(this, IsSucceed, lpData); } /***************************************************************** **【函数名称】 onDevChEvent **【函数功能】 线路向上层发送的设备主动事件 **【参数】 pEventLine 触发事件的线路 EvtType 事件类型 lpContent 事件内容 **【返回值】 *****************************************************************/ void CTurnAgentReq::onDevChEvent( CVirtualProxy* pEventLine, DEV_CH_EVT_TYPE EvtType, LPCTSTR lpContent ) { // TODO: do nothing } /***************************************************************** **【函数名称】 onLineStateChanged **【函数功能】 线路状态变化事件响应接口 **【参数】 pEventLine 状态变化的线路实体指针 LineState 线路当前状态 Call 主呼叫ID SubCall 子呼叫ID lpCallerNum 主叫号码 lpCalleeNum 被叫号码 **【返回值】 ****************************************************************/ void CTurnAgentReq::onLineStateChanged( CVirtualProxy* pEventLine, VIRTUAL_LINE_STATE LineState, long Call, long SubCall, LPCTSTR lpCallerNum, LPCTSTR lpCalleeNum ) { // 外线挂机 if(LineState == VIRTUAL_LINE_STATE_FREE && SubCall == SESSION_INVALID_SUB_CALL) { CMC::GetInstance().dropCall(m_pAssoLine->devId(), false); end(false, NULL); return; } // end if if(SubCall != m_PendingCallId) // 其它呼叫信息 return; // 根据线路状态进行处理 switch(LineState) { case VIRTUAL_LINE_STATE_FREE: // 呼叫失败 { end(false, NULL); } break; case VIRTUAL_LINE_STATE_RING_BACK: // 呼出振铃 { _notifyOpProcess(m_pHostLine->lineId(), m_pAssoLine->lineId(), DEV_RES_TYPE_EXT, lpCallerNum, lpCalleeNum); } break; case VIRTUAL_LINE_STATE_TALKING: // 呼叫成功 { end(true, NULL); } break; } // end switch }