#include "StdAfx.h" #include "PredictionCallReq.h" #include "ControlShell.h" #include "VirtualProxy.h" #include "ProxyShell.h" #include "MC.h" CPredictionCallReq::CPredictionCallReq(CProxyShell* pParent, CPduEntity& ReqPdu) : CReqBase(pParent, ReqPdu), m_CallFailedCause(CALL_FAILED_CAUSE_SUCCESS) { } CPredictionCallReq::~CPredictionCallReq(void) { } /***************************************************************** **【函数名称】 request **【函数功能】 发出请求(命令方式) **【参数】 **【返回值】 ****************************************************************/ bool CPredictionCallReq::request( void ) { // 保存主被叫号码 m_CallerNum = m_ReqPdu.GetDataString(3); m_CalleeNum = m_ReqPdu.GetDataString(2); int SipAccountId; CVirtualProxy* pHostLine = m_pParent->setEnv4PredictionCall(m_CallerNum, m_CalleeNum, SipAccountId); if(pHostLine == NULL) { LOGGER(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{LineReq}: 执行预测呼叫请求失败, 无空闲中继线路, DestNum = %s"), m_CalleeNum); return false; } // end if attachHostLine(pHostLine); // 通知启动日志 LOGGER(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{LineReq}: 中继[%lu]预测呼叫, DestNum = %s"), m_pHostLine->lineId(), m_CalleeNum); // 启动呼叫 return CMC::GetInstance().dial(pHostLine->devId(), m_CalleeNum, m_CallerNum, SipAccountId); } /***************************************************************** **【函数名称】 hangUp **【函数功能】 操作中挂机(命令方式) **【参数】 **【返回值】 ****************************************************************/ bool CPredictionCallReq::hangUp( long InstanceHangUp ) { // 外呼取消日志 LOGGER(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{LineReq}: 中继[%lu]预测呼叫因挂机取消, DestNum = %s"), m_pHostLine->lineId(), m_CalleeNum); m_InstanceCancel = InstanceHangUp; return CMC::GetInstance().dropCall(m_pHostLine->devId(), false); } /***************************************************************** **【函数名称】 end **【函数功能】 操作完成 **【参数】 bIsSucceed 操作是否成功 lpData 随路数据 **【返回值】 ****************************************************************/ void CPredictionCallReq::end( bool IsSucceed, LPCTSTR lpData ) { if(IsSucceed) { LOGGER(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{LineReq}: 中继[%lu]预测呼叫成功, DestNum = %s"), m_pHostLine->lineId(), m_CalleeNum); } else { LOGGER(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{LineReq}: 中继[%lu]预测呼叫失败, DestNum = %s"), m_pHostLine->lineId(), m_CalleeNum); } // end if TCHAR CallFailedCause[2] = { 0 }; CallFailedCause[0] = (TCHAR)m_CallFailedCause; // 返回执行结果 if(m_InstanceCancel != 0) m_pParent->notifyReqResult(m_ReqPdu, m_InstanceCancel, !IsSucceed, CallFailedCause); m_pParent->onLineReqEnd(this, IsSucceed, CallFailedCause); } /***************************************************************** **【函数名称】 onDevChEvent **【函数功能】 线路向上层发送的设备主动事件 **【参数】 pEventLine 触发事件的线路 EvtType 事件类型 lpContent 事件内容 **【返回值】 *****************************************************************/ void CPredictionCallReq::onDevChEvent( CVirtualProxy* pEventLine, DEV_CH_EVT_TYPE EvtType, LPCTSTR lpContent ) { if(EvtType == DEV_CH_EVT_CALL_FAILD_CAUSE) { m_CallFailedCause = (int)lpContent; } } /***************************************************************** **【函数名称】 onLineStateChanged **【函数功能】 线路状态变化事件响应接口 **【参数】 pEventLine 状态变化的线路实体指针 LineState 线路当前状态 Call 主呼叫ID SubCall 子呼叫ID lpCallerNum 主叫号码 lpCalleeNum 被叫号码 **【返回值】 ****************************************************************/ void CPredictionCallReq::onLineStateChanged( CVirtualProxy* pEventLine, VIRTUAL_LINE_STATE LineState, long Call, long SubCall, LPCTSTR lpCallerNum, LPCTSTR lpCalleeNum ) { // 根据线路状态进行处理 switch(LineState) { case VIRTUAL_LINE_STATE_FREE: // 呼叫失败 { end(false, NULL); } break; case VIRTUAL_LINE_STATE_RING_BACK: // 呼出振铃 { _notifyOpProcess(m_pHostLine->lineId(), m_pHostLine->lineId(), DEV_RES_TYPE_TRUNK, lpCallerNum, lpCalleeNum); } break; case VIRTUAL_LINE_STATE_TALKING: // 呼叫成功 { end(true, NULL); } break; } // end switch }