| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240 |
- #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 )
- {
- }
|