#include "StdAfx.h" #include "TapiOpMakeCall.h" #include "DevControl.h" #include "LineOpExec.h" #include "TapiLine.h" CTapiOpMakeCall::CTapiOpMakeCall(LONG Instance) : CTapiOpBase(Instance), m_WaitingCall(NULL) { ZeroMemory(&m_TmpInfoS, sizeof(DevLinkInfoS)); } CTapiOpMakeCall::~CTapiOpMakeCall(void) { } /***************************************************************** **【函数名称】 start **【函数功能】 操作启动(命令方式) **【参数】 pParam 操作启动参数 **【返回值】 ****************************************************************/ bool CTapiOpMakeCall::start( LineOpParam* pParam ) { // 校验状态 if((m_pHostLine->status() & INNER_STATE_FREE) == 0x00 && (m_pHostLine->status() & INNER_STATE_INIT) == 0x00) { return false; } // end if // 保存被叫号码 m_CalleeNum.Format(_T("%s"), pParam->szParam2); // 通知启动日志 CDevControl::GetInstance().onEventLog(LOG_LEVEL_NORMAL, _T("{OP_Call}: Exten[%s]执行外呼, CalleeNum = %s"), m_pHostLine->extenID(), m_CalleeNum); // 调用线路外呼操作 return m_pHostLine->lineMakeCall(m_CalleeNum, m_WaitingCall); } /***************************************************************** **【函数名称】 start **【函数功能】 操作启动(手动方式) **【参数】 pInfo 操作启动参数 **【返回值】 ****************************************************************/ void CTapiOpMakeCall::start( DevLinkInfoS* pInfo ) { // 通知设备外呼启动事件 UINT ExtId = 0; sscanf_s(m_pHostLine->extenID(), _T("%lu"), &ExtId); CDevControl::GetInstance().onEventDevOperation(ExtId, DEV_OP_CALL_OUT, pInfo->szCallerNum, pInfo->szCalleeNum); } /***************************************************************** **【函数名称】 cancel **【函数功能】 操作取消(命令方式) **【参数】 **【返回值】 ****************************************************************/ bool CTapiOpMakeCall::cancel( LONG InstanceCancel ) { // 保存取消操作调用标识 m_InstanceCancel = InstanceCancel; // 通知启动日志 CDevControl::GetInstance().onEventLog(LOG_LEVEL_NORMAL, _T("{OP_Call}: Exten[%s]外呼取消,CalleeNum = %s"), m_pHostLine->extenID(), m_CalleeNum); // 调用线路挂机操作 HCALL hDropCall = m_pHostLine->activeCall(); return m_pHostLine->lineDropCall(hDropCall); } /***************************************************************** **【函数名称】 end **【函数功能】 操作完成 **【参数】 IsSucceed 操作是否成功 **【返回值】 ****************************************************************/ void CTapiOpMakeCall::end( bool IsSucceed ) { // 系统日志 if(IsSucceed) { CDevControl::GetInstance().onEventLog(LOG_LEVEL_NORMAL, _T("{OP_Call}: Exten[%s]外呼成功, CalleeNum = %s"), m_pHostLine->extenID(), m_CalleeNum); } else { CDevControl::GetInstance().onEventLog(LOG_LEVEL_WARNING, _T("{OP_Call}: Exten[%s]外呼失败, CalleeNum = %s"), m_pHostLine->extenID(), m_CalleeNum); } // end if // 返回执行结果 if(m_InstanceCancel != CONST_TAPI_OP_INSTANCE_INVALID) { CDevControl::GetInstance().onEventOpResult(m_InstanceCancel, !IsSucceed); } // end if CLineOpExec::GetInstance().onTapiOpResult(m_Instance, this, IsSucceed); } /***************************************************************** **【函数名称】 setAssoInfo **【函数功能】 设置关联信息 **【参数】 Info 信息内容 **【返回值】 ****************************************************************/ void CTapiOpMakeCall::setAssoInfo( LONG Info ) { // 保存调用标识 m_Instance = Info; if(m_TmpInfoS.nDevLinkCallId != 0) { // 通知设备进展 _notifyOpProcess(&m_TmpInfoS); } } /***************************************************************** **【函数名称】 OnReply **【函数功能】 线路操作异步响应事件 **【参数】 pEventLine 触发事件的线路 nRequestID hResult **【返回值】 ****************************************************************/ void CTapiOpMakeCall::onReply( CTapiLine* pEventLine, LONG RequestID, HRESULT Result ) { if(Result != S_OK) end(false); } /***************************************************************** **【函数名称】 onCallState **【函数功能】 呼叫状态事件 **【参数】 pEventLine 触发事件的线路 CallId 触发事件的呼叫句柄 CallState 呼叫基本状态 CallStateDetail 呼叫明细状态 **【返回值】 ****************************************************************/ void CTapiOpMakeCall::onCallState( CTapiLine* pEventLine, HCALL CallId, DWORD CallState, DWORD CallStateDetail ) { if(CallId != m_WaitingCall) return; if(CallState & LINECALLSTATE_DISCONNECTED) // 呼叫失败 { end(false); } else if(CallState & LINECALLSTATE_BUSY) // 被叫忙 { // 主叫线路释放 m_pHostLine->lineDropCall(m_WaitingCall); end(false); } } /***************************************************************** **【函数名称】 onDevLinkEventS **【函数功能】 DevLink中S事件响应 **【参数】 pEventLine 触发事件的线路 pInfoS DevLink S事件内容 **【返回值】 ****************************************************************/ void CTapiOpMakeCall::onDevLinkEventS( CTapiLine* pEventLine, DevLinkInfoS* pInfoS ) { // 呼出振铃 switch(pInfoS->nResStatus) { case INNER_STATE_RING_BACK: // 呼出振铃 { // 保存呼叫信息 m_CalleeNum = pInfoS->szCalleeNum; // 获取呼叫句柄 m_WaitingCall = m_pHostLine->activeCall(); // 通知启动日志 CDevControl::GetInstance().onEventLog(LOG_LEVEL_NORMAL, _T("{OP_Call}: Exten[%s]执行话机直呼, CalleeNum = %s"), m_pHostLine->extenID(), m_CalleeNum); if(m_Instance != CONST_TAPI_OP_INSTANCE_INVALID) { // 通知设备进展 _notifyOpProcess(pInfoS); } else { memcpy(&m_TmpInfoS, pInfoS, sizeof(DevLinkInfoS)); } } break; case INNER_STATE_TALKING: // 通话中 { end(true); return; } break; } // end switch } /***************************************************************** **【函数名称】 onDevLinkEventD **【函数功能】 DevLink中D事件响应 **【参数】 pEventLine 触发事件的线路 DevLinkCallId DevLink事件CallId **【返回值】 ****************************************************************/ void CTapiOpMakeCall::onDevLinkEventD( CTapiLine* pEventLine, int DevLinkCallId ) { if(pEventLine == m_pHostLine) end(false); } /***************************************************************** **【函数名称】 onDevLineEventA **【函数功能】 DevLink中A事件响应 **【参数】 pEventLine 触发事件的线路 DevLinkCallId DevLink事件CallId **【返回值】 ****************************************************************/ void CTapiOpMakeCall::onDevLinkEventA( CTapiLine* pEventLine, int DevLinkCallId ) { }