#include "StdAfx.h" #include "TapiOpTransfer.h" #include "LineOpExec.h" #include "DevControl.h" #include "TapiLine.h" CTapiOpTransfer::CTapiOpTransfer(LONG Instance) : CTapiOpBase(Instance), m_TransferCall(NULL), m_HeldCall(NULL), m_Step(0), m_HasSendOpProcess(false) { } CTapiOpTransfer::~CTapiOpTransfer(void) { } /***************************************************************** **【函数名称】 start **【函数功能】 操作启动(命令方式) **【参数】 pParam 操作启动参数 **【返回值】 ****************************************************************/ bool CTapiOpTransfer::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_Transfer}: 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 CTapiOpTransfer::cancel( LONG InstanceCancel ) { // 保存取消操作调用标识 m_InstanceCancel = InstanceCancel; // 通知启动日志 CDevControl::GetInstance().onEventLog(LOG_LEVEL_NORMAL, _T("{OP_Transfer}: Exten[%s]取消转移, DestNum = %s"), m_pHostLine->extenID(), m_DestNum); // 挂断正在转移的呼叫 m_pHostLine->setDevLinkCallId(CONST_DEV_LINK_CALL_NULL); // 用于保证线路状态没有中间空闲 m_pHostLine->lineDropCall(m_TransferCall); // 如果已经开始转移,接回被保持的呼叫 if(m_Step == 2) return m_pHostLine->lineTakeBack(m_HeldCall); else return true; } /***************************************************************** **【函数名称】 end **【函数功能】 操作完成 **【参数】 IsSucceed 操作是否成功 **【返回值】 ****************************************************************/ void CTapiOpTransfer::end( bool IsSucceed ) { if(IsSucceed) { CDevControl::GetInstance().onEventLog(LOG_LEVEL_NORMAL, _T("{OP_Transfer}: Exten[%s]转移成功,DestNum = %s"), m_pHostLine->extenID(), m_DestNum); } else { CDevControl::GetInstance().onEventLog(LOG_LEVEL_WARNING, _T("{OP_Transfer}: Exten[%s]转移失败,DestNum = %s"), m_pHostLine->extenID(), m_DestNum); // 如果已经开始转移,接回被保持的呼叫 if(m_Step == 2) { m_pHostLine->lineTakeBack(m_HeldCall); } // end if } // 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, m_DestNum); } /***************************************************************** **【函数名称】 onReply **【函数功能】 线路操作异步响应事件 **【参数】 pEventLine 触发事件的线路 RequestID Result **【返回值】 ****************************************************************/ void CTapiOpTransfer::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 3: // 正在完成转移 { 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 CTapiOpTransfer::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)) { end(false); return; } // end if } // end if // 转移过程处理 if(CallId == m_TransferCall && m_Step == 2) { if(CallState & LINECALLSTATE_DIALTONE) // 可以开始呼叫目的端 { if(!m_pHostLine->lineDial(m_TransferCall, m_DestNum)) { end(FALSE); return; } // end if } else if(CallState & LINECALLSTATE_BUSY) // 被叫忙 { m_pHostLine->lineDropCall(m_TransferCall); end(false); return; } else if(CallState & LINECALLSTATE_DISCONNECTED) // 转移呼叫释放 { end(false); return; } else if(CallState & LINECALLSTATE_CONNECTED) // 被叫接通 { m_Step = 3; if(!m_pHostLine->lineCompleteTransfer(m_HeldCall, m_TransferCall)) { end(false); return; } } // end if(nCallState) } // end if // 转移过程中申请转移方挂机 if(CallId == m_HeldCall && (CallState & LINECALLSTATE_DISCONNECTED)) { if(CallStateDetail != LINEDISCONNECTMODE_FORWARDED) // 不是正常转移释放,是转移方对端挂机 { m_pHostLine->lineDropCall(m_TransferCall); // 挂断当前呼叫 end(false); return; } } // end if(m_hHeldCall) } /***************************************************************** **【函数名称】 onDevLinkEventS **【函数功能】 DevLink中S事件响应 **【参数】 pEventLine 触发事件的线路 pInfoS DevLink S事件内容 **【返回值】 ****************************************************************/ void CTapiOpTransfer::onDevLinkEventS( CTapiLine* pEventLine, DevLinkInfoS* pInfoS ) { if(pInfoS->nResStatus == INNER_STATE_RING_BACK && !m_HasSendOpProcess) { _notifyOpProcess(pInfoS); m_HasSendOpProcess = true; } // end if } /***************************************************************** **【函数名称】 onDevLineEventD **【函数功能】 DevLink中D事件响应 **【参数】 pEventLine 触发事件的线路 DevLinkCallId DevLink事件CallId **【返回值】 ****************************************************************/ void CTapiOpTransfer::onDevLinkEventD( CTapiLine* pEventLine, int DevLinkCallId ) { } /***************************************************************** **【函数名称】 onDevLineEventA **【函数功能】 DevLink中A事件响应 **【参数】 pEventLine 触发事件的线路 DevLinkCallId DevLink事件CallId **【返回值】 ****************************************************************/ void CTapiOpTransfer::onDevLinkEventA( CTapiLine* pEventLine, int DevLinkCallId ) { }