#include "StdAfx.h" #include "TapiOpMeeting.h" #include "LineOpExec.h" #include "TapiLine.h" #include "DevControl.h" CTapiOpMeeting::CTapiOpMeeting(LONG Instance) : CTapiOpBase(Instance), m_MeetingCall(NULL), m_HeldCall(NULL), m_Step(0), m_HasSendOpProcess(false) { } CTapiOpMeeting::~CTapiOpMeeting(void) { } /***************************************************************** **【函数名称】 start **【函数功能】 操作启动(命令方式) **【参数】 pParam 操作启动参数 **【返回值】 ****************************************************************/ bool CTapiOpMeeting::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_Meeting}: Exten[%s]执行会议, DestNum = %s"), m_pHostLine->extenID(), m_DestNum); // 开始建立会议 m_Step = 1; return m_pHostLine->lineSetupTransfer(&m_MeetingCall); } /***************************************************************** **【函数名称】 cancel **【函数功能】 操作取消(命令方式) **【参数】 **【返回值】 ****************************************************************/ bool CTapiOpMeeting::cancel( LONG InstanceCancel ) { // 保存取消操作调用标识 m_InstanceCancel = InstanceCancel; // 通知启动日志 CDevControl::GetInstance().onEventLog(LOG_LEVEL_NORMAL, _T("{OP_Meeting}: Exten[%s]会议取消, DestNum = %s"), m_pHostLine->extenID(), m_DestNum); // 挂断正在三方的呼叫 m_pHostLine->setDevLinkCallId(CONST_DEV_LINK_CALL_NULL); // 用于保证线路状态没有中间空闲 m_pHostLine->lineDropCall(m_MeetingCall); // 如果已经开始会议,接回被保持的呼叫 if(m_Step == 2) return m_pHostLine->lineTakeBack(m_HeldCall); else return true; } /***************************************************************** **【函数名称】 end **【函数功能】 操作完成 **【参数】 IsSucceed 操作是否成功 **【返回值】 ****************************************************************/ void CTapiOpMeeting::end( bool IsSucceed ) { if(IsSucceed) { CDevControl::GetInstance().onEventLog(LOG_LEVEL_NORMAL, _T("{OP_Meeting}: Exten[%s]会议成功, DestNum = %s"), m_pHostLine->extenID(), m_DestNum); } else { CDevControl::GetInstance().onEventLog(LOG_LEVEL_WARNING, _T("{OP_Meeting}: Exten[%s]会议失败, DestNum = %s"), m_pHostLine->extenID(), m_DestNum); // 如果已经开始转移,接回被保持的呼叫 if(m_Step == 2) m_pHostLine->lineTakeBack(m_HeldCall); } // 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); } /***************************************************************** **【函数名称】 onReply **【函数功能】 线路操作异步响应事件 **【参数】 pEventLine 触发事件的线路 nRequestID hResult **【返回值】 ****************************************************************/ void CTapiOpMeeting::onReply( CTapiLine* pEventLine, LONG RequestID, HRESULT Result ) { switch(m_Step) { case 1: // 正在启动会议 { if(Result == S_OK) { m_Step = 2; // 得到当前活动呼叫, 如果会议成功启动,此呼叫将被保持 m_HeldCall = m_pHostLine->activeCall(); } else { end(false); } // end if } break; case 2: // 正在呼叫 { if(Result != S_OK) end(false); } break; case 3: // 正在完成会议 { (Result == S_OK) ? end(true) : end(false); } break; } // end switch } /***************************************************************** **【函数名称】 onCallState **【函数功能】 呼叫状态事件 **【参数】 pEventLine 触发事件的线路 CallId 触发事件的呼叫句柄 CallState 呼叫基本状态 CallStateDetail 呼叫明细状态 **【返回值】 ****************************************************************/ void CTapiOpMeeting::onCallState( CTapiLine* pEventLine, HCALL CallId, DWORD CallState, DWORD CallStateDetail ) { // 会议流程的进展处理 if(CallId == m_MeetingCall && m_Step == 2) { if(CallState & LINECALLSTATE_DIALTONE) // 可以开始呼叫目的端 { // 开始呼叫目的端 if(!m_pHostLine->lineDial(m_MeetingCall, m_DestNum)) { end(false); } // end if(LineDial) } else if(CallState & LINECALLSTATE_BUSY) // 被叫忙 { end(false); } else if(CallState & LINECALLSTATE_DISCONNECTED) // 呼叫失败 { end(false); } else if(CallState & LINECALLSTATE_CONNECTED) // 被叫接通 { m_Step = 3; // 根据保持呼叫的状态进行具体操作 DWORD dwStateHeldCall = m_pHostLine->getCallStatus(m_HeldCall); if(dwStateHeldCall & LINECALLSTATE_ONHOLDPENDTRANSFER) // 完成会议 { if(!m_pHostLine->lineCompleteConference(m_HeldCall, m_MeetingCall)) end(false); } else if(dwStateHeldCall & LINECALLSTATE_ONHOLDPENDCONF) // 添加会议以外坐席 { CString strTemp; strTemp = CONST_TAPI_DIGIT_MEETING; m_pHostLine->lineGenerateDigit(m_MeetingCall, strTemp); strTemp = CONST_TAPI_CODE_MEETING; m_pHostLine->lineMakeCall(strTemp, m_MeetingCall); } // end if(CallStateDetail) } // end if(CallState) return; } // end if // 会议过程中申请会议方挂机 if(CallId == m_HeldCall && (CallState & LINECALLSTATE_DISCONNECTED)) { if(CallStateDetail == LINEDISCONNECTMODE_FORWARDED) end(false); } // end if(m_hHeldCall) } /***************************************************************** **【函数名称】 onDevLinkEventS **【函数功能】 DevLink中S事件响应 **【参数】 pEventLine 触发事件的线路 pInfoS DevLink S事件内容 **【返回值】 ****************************************************************/ void CTapiOpMeeting::onDevLinkEventS( CTapiLine* pEventLine, DevLinkInfoS* pInfoS ) { if(pInfoS->nResStatus == INNER_STATE_RING_BACK && !m_HasSendOpProcess) { _notifyOpProcess(pInfoS); m_HasSendOpProcess = true; } // end if } /***************************************************************** **【函数名称】 onDevLinkEventD **【函数功能】 DevLink中D事件响应 **【参数】 pEventLine 触发事件的线路 nDevLinkCallId DevLink事件CallId **【返回值】 ****************************************************************/ void CTapiOpMeeting::onDevLinkEventD( CTapiLine* pEventLine, int DevLinkCallId ) { } /***************************************************************** **【函数名称】 onDevLinkEventA **【函数功能】 DevLink中A事件响应 **【参数】 pEventLine 触发事件的线路 nDevLinkCallId DevLink事件CallId **【返回值】 ****************************************************************/ void CTapiOpMeeting::onDevLinkEventA( CTapiLine* pEventLine, int DevLinkCallId ) { }