#include "StdAfx.h" #include "TapiOpConsult.h" #include "DevControl.h" #include "LineOpExec.h" #include "TapiLine.h" CTapiOpConsult::CTapiOpConsult(LONG Instance) : CTapiOpBase(Instance), m_TransferCall(NULL), m_HeldCall(NULL), m_Step(0), m_HasSendOpProcess(false) { } CTapiOpConsult::~CTapiOpConsult(void) { } /***************************************************************** **【函数名称】 __pause **【函数功能】 当前操作阶段性完成,操作暂停并返回 **【参数】 IsSucceed 阶段操作是否成功 **【返回值】 ****************************************************************/ void CTapiOpConsult::__pause( bool IsSucceed ) { // 阶段完成日志 CDevControl::GetInstance().onEventLog(LOG_LEVEL_NORMAL, _T("{OP_Consult}: Exten[%s]协商呼叫对端已接通, DestNum = %s"), m_pHostLine->extenID(), m_DestNum); // 返回第一阶段执行结果 CDevControl::GetInstance().onEventOpResult(m_Instance, IsSucceed); } /***************************************************************** **【函数名称】 start **【函数功能】 操作启动(命令方式) **【参数】 pParam 操作启动参数 **【返回值】 ****************************************************************/ bool CTapiOpConsult::start( LineOpParam* pParam ) { // 校验状态 if(m_pHostLine->status() != INNER_STATE_TALKING) return false; // 保存被叫号码 m_DestNum.Format(_T("%s"), pParam->szParam2); // 通知启动日志 CDevControl::GetInstance().onEventLog(LOG_LEVEL_NORMAL, _T("{OP_Consult}: Exten[%s]执行协商呼叫,DestNum = %s"), m_pHostLine->extenID(), m_DestNum); // 开始建立转移 m_HeldCall = m_pHostLine->activeCall(); if(m_pHostLine->getCallStatus(m_HeldCall) & LINECALLSTATE_CONNECTED) { m_Step = 1; return m_pHostLine->lineSetupTransfer(&m_TransferCall); } // end if return true; } /***************************************************************** **【函数名称】 cancel **【函数功能】 操作取消(命令方式) **【参数】 **【返回值】 ****************************************************************/ bool CTapiOpConsult::cancel( LONG InstanceCancel ) { // 保存取消操作调用标识 m_InstanceCancel = InstanceCancel; // 通知启动日志 CDevControl::GetInstance().onEventLog(LOG_LEVEL_NORMAL, _T("{OP_Consult}: Exten[%s]协商呼叫取消, DestNum = %s"), m_pHostLine->extenID(), m_DestNum); // 挂断正在转移的呼叫 if(m_Step == 2 || m_Step == 3) { m_pHostLine->lineDropCall(m_TransferCall); return true; } // end if return false; } /***************************************************************** **【函数名称】 end **【函数功能】 操作完成 **【参数】 IsSucceed 操作是否成功 **【返回值】 ****************************************************************/ void CTapiOpConsult::end( bool IsSucceed ) { if(IsSucceed) { CDevControl::GetInstance().onEventLog(LOG_LEVEL_NORMAL, _T("{OP_Consult}: Exten[%s]协商呼叫成功, DestNum = %s"), m_pHostLine->extenID(), m_DestNum); } else { CDevControl::GetInstance().onEventLog(LOG_LEVEL_WARNING, _T("{OP_Consult}: Exten[%s]协商呼叫失败, DestNum = %s"), m_pHostLine->extenID(), m_DestNum); } // 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); } /***************************************************************** **【函数名称】 resume **【函数功能】 当前操作继续执行 **【参数】 Instance 调用标识 **【返回值】 ****************************************************************/ bool CTapiOpConsult::resume( long Instance ) { // 逻辑校验 if(Instance != m_Instance) return false; if(m_Step != 3) return false; // 开始完成转移 m_Step = 4; return m_pHostLine->lineCompleteTransfer(m_HeldCall, m_TransferCall); } /***************************************************************** **【函数名称】 onReply **【函数功能】 线路操作异步响应事件 **【参数】 pEventLine 触发事件的线路 RequestID Result **【返回值】 ****************************************************************/ void CTapiOpConsult::onReply( CTapiLine* pEventLine, LONG RequestID, HRESULT Result ) { switch(m_Step) { case 1: // 正在启动转移 { if(Result == S_OK) { m_Step = 2; } else { end(false); } // end if } break; case 2: // 正在呼叫 { if(Result != S_OK) end(false); } break; case 4: // 正在完成转移 { if(Result != S_OK) { m_pHostLine->lineDropCall(m_TransferCall); end(false); } else { end(true); } // end if } break; } // end switch } /***************************************************************** **【函数名称】 onCallState **【函数功能】 呼叫状态事件 **【参数】 pEventLine 触发事件的线路 CallId 触发事件的呼叫句柄 CallState 呼叫基本状态 CallStateDetail 呼叫明细状态 **【返回值】 ****************************************************************/ void CTapiOpConsult::onCallState( CTapiLine* pEventLine, HCALL CallId, DWORD CallState, DWORD CallStateDetail ) { // 等待呼叫进入通话中 if((m_Step == 0) && (CallId == m_HeldCall) && (CallState & LINECALLSTATE_CONNECTED)) { m_Step = 1; if(!m_pHostLine->lineSetupTransfer(&m_TransferCall)) return end(false); } // end if // 转移过程处理 if(CallId == m_TransferCall && m_Step == 2) { if(CallState & LINECALLSTATE_DIALTONE) // 可以开始呼叫目的端 { if(!m_pHostLine->lineDial(m_TransferCall, m_DestNum)) return end(false); } else if(CallState & LINECALLSTATE_BUSY) // 被叫忙 { m_pHostLine->lineDropCall(m_TransferCall); } else if(CallState & LINECALLSTATE_CONNECTED) // 被叫接通 { m_Step = 3; __pause(true); // 阶段操作完成 } // end if(nCallState) } // end if // 转移过程中申请转移方挂机 if(CallId == m_HeldCall && (CallState & LINECALLSTATE_DISCONNECTED)) { if(CallStateDetail != LINEDISCONNECTMODE_FORWARDED) // 非正常释放,是转移方对端挂机 { m_pHostLine->lineDropCall(m_TransferCall); // 挂断当前呼叫 } } // end if(m_hHeldCall) } /***************************************************************** **【函数名称】 onDevLinkEventS **【函数功能】 DevLink中S事件响应 **【参数】 pEventLine 触发事件的线路 pInfoS DevLink S事件内容 **【返回值】 ****************************************************************/ void CTapiOpConsult::onDevLinkEventS( CTapiLine* pEventLine, DevLinkInfoS* pInfoS ) { // 通知呼叫进展事件 if(pInfoS->nResStatus == INNER_STATE_RING_BACK && !m_HasSendOpProcess) { _notifyOpProcess(pInfoS); m_HasSendOpProcess = true; } // end if // 转移过程中的挂机事件处理 if((pInfoS->nResStatus == INNER_STATE_FREE && pInfoS->nFlag == 0) || (pInfoS->nResStatus == INNER_STATE_FREE && pInfoS->nFlag == 1 && m_Step == 3)) { m_pHostLine->setDevLinkCallId(CONST_DEV_LINK_SUSPEND); m_pHostLine->lineTakeBack(m_HeldCall); end(false); } // end if } /***************************************************************** **【函数名称】 onDevLinkEventD **【函数功能】 DevLink中D事件响应 **【参数】 pEventLine 触发事件的线路 DevLinkCallId DevLink事件CallId **【返回值】 ****************************************************************/ void CTapiOpConsult::onDevLinkEventD( CTapiLine* pEventLine, int DevLinkCallId ) { if(m_Step == 2 || m_Step == 3) { m_pHostLine->setDevLinkCallId(CONST_DEV_LINK_SUSPEND); m_pHostLine->lineTakeBack(m_HeldCall); m_pHostLine->lineDropCall(m_TransferCall); end(false); } // end if } /***************************************************************** **【函数名称】 onDevLinkEventA **【函数功能】 DevLink中A事件响应 **【参数】 pEventLine 触发事件的线路 DevLinkCallId DevLink事件CallId **【返回值】 ****************************************************************/ void CTapiOpConsult::onDevLinkEventA( CTapiLine* pEventLine, int DevLinkCallId ) { }