#include "StdAfx.h" #include "TapiLineIvr.h" #include "DevControl.h" #include "VsControl.h" #include "TapiOpBase.h" CTapiLineIvr::CTapiLineIvr(DWORD DevID, HLINE Handle, DWORD ApiVersion, CString ExtID, HLINEAPP LineApp) : CTapiLine(DevID, Handle, ApiVersion, ExtID, LineApp), m_AssoTrunkId(CONST_DEV_ID_INVALID) { } CTapiLineIvr::~CTapiLineIvr(void) { } /***************************************************************** **【函数名称】 _procDevLinkEventS **【函数功能】 DevLink S事件后续处理 **【参数】 pInfoS DevLink S事件内容 **【返回值】 ****************************************************************/ void CTapiLineIvr::_procDevLinkEventS( DevLinkInfoS* pInfoS ) { // 保存线路ID sscanf_s(pInfoS->szPeerResId, "%lu", &m_AssoTrunkId); // 状态事件过滤(保持状态不处理;重复的通话事件不处理) if((pInfoS->nResStatus == INNER_STATE_HELD) || (pInfoS->nResStatus == INNER_STATE_TALKING && m_LineStatus == INNER_STATE_TALKING && pInfoS->nDevLinkCallId == m_DevLinkCallId)) { return; } // end if // 通知关联操作 if(m_pCurrTapiOp != NULL && m_AssoTrunkId != CONST_DEV_ID_INVALID) { m_pCurrTapiOp->onDevLinkEventS(this, pInfoS); } // end if // 保存呼叫信息 m_DevLinkCallId = pInfoS->nDevLinkCallId; m_LineStatus = pInfoS->nResStatus; // 通知业务逻辑线路状态变化 CDevControl::GetInstance().onEventResState(DEV_RES_TYPE_IVR, m_ExtenID, m_LineStatus, pInfoS->szCallerNum, pInfoS->szCalleeNum); // 线路状态进行分类处理 switch(m_LineStatus) { case INNER_STATE_TALKING: // 通话中 { CDevControl::GetInstance().onEventLog(LOG_LEVEL_NORMAL, _T("{LineIvr}: Line[%s]进入通话, CallerNum = %s, CalleeNum = %s, DevLinkCallId = %ld, TrunkId = %lu, Flag = %d, Op = %lu"), m_ExtenID, pInfoS->szCallerNum, pInfoS->szCalleeNum, pInfoS->nDevLinkCallId, m_AssoTrunkId, pInfoS->nFlag, m_pCurrTapiOp); // 通知业务逻辑层外线来电事件 if(pInfoS->nFlag == CONST_DEVLINK_INBOUND_ANSWER && m_pCurrTapiOp == NULL) { CDevControl::GetInstance().onEventDevOperation(m_AssoTrunkId, DEV_OP_CALL_IN, pInfoS->szCallerNum, pInfoS->szCalleeNum); } // end if } break; case INNER_STATE_FREE: // 线路释放 { __onHangUp(); } break; } // end switch } /***************************************************************** **【函数名称】 _procDevLinkEventD **【函数功能】 DevLink D事件后续处理 **【参数】 **【返回值】 ****************************************************************/ void CTapiLineIvr::_procDevLinkEventD( int DevLinkCallId ) { // 更新DevLink CallId m_DevLinkCallId = CONST_DEV_LINK_CALL_NULL; // 通知关联操作 if(m_pCurrTapiOp != NULL) m_pCurrTapiOp->onDevLinkEventD(this, DevLinkCallId); // 更新线路状态 if(m_LineStatus != INNER_STATE_FREE) { m_LineStatus = INNER_STATE_FREE; // 通知线路空闲状态 CDevControl::GetInstance().onEventResState(DEV_RES_TYPE_IVR, m_ExtenID, INNER_STATE_FREE); __onHangUp(); } // end if } /***************************************************************** **【函数名称】 _procLineInitStatus **【函数功能】 初始化线路状态处理 **【参数】 **【返回值】 ****************************************************************/ void CTapiLineIvr::_procLineInitStatus( HCALL CallId, DWORD CallState, DWORD CallStateDetail, DWORD CallPrivilege ) { // 得到活动呼叫状态 if(m_ActiveCall == NULL) // 如果活动呼叫为空 { m_LineStatus = INNER_STATE_FREE; } else // 如果活动呼叫不为空 { if(CallId == m_ActiveCall) // 如果当前呼叫等于活动呼叫 { m_LineStatus = _mapTapiCallState(CallState); } } // end if(m_hActiveCall) // 通知线路状态 CDevControl::GetInstance().onEventResState(DEV_RES_TYPE_IVR, m_ExtenID, m_LineStatus); } /***************************************************************** **【函数名称】 __onHangUp **【函数功能】 线路挂机处理函数 **【参数】 **【返回值】 ****************************************************************/ void CTapiLineIvr::__onHangUp( void ) { m_AssoTrunkId = CONST_DEV_ID_INVALID; // 通知VP台IVR线路释放 CVsControl::GetInstance().notifyLineFree(atoi(m_ExtenID), DEV_RES_TYPE_IVR); } /***************************************************************** **【函数名称】 regist **【函数功能】 注册线路 **【参数】 **【返回值】 ****************************************************************/ void CTapiLineIvr::regist( void ) { // 通知业务逻辑线路创建事件 CDevControl::GetInstance().onEventResDetail(DEV_RES_TYPE_IVR, m_ExtenID); CDevControl::GetInstance().onEventResState(DEV_RES_TYPE_IVR, m_ExtenID, m_LineStatus); // 设置线路可响应的状态事件 HRESULT hRet = ::lineSetStatusMessages(m_Handle, LINE_DEV_STATE_ALL, LINE_ADDRESS_STATE_ALL); ASSERT(hRet == S_OK); } /***************************************************************** **【函数名称】 redoCallStatus **【函数功能】 强制重新处理线路状态 **【参数】 **【返回值】 ****************************************************************/ void CTapiLineIvr::redoCallStatus( HCALL CallId, DWORD CallState, DWORD CallStateDetail ) { } /***************************************************************** **【函数名称】 setDevLinkHeldId **【函数功能】 设置当前线路被保持的 DevLinkCallId **【参数】 **【返回值】 ****************************************************************/ void CTapiLineIvr::setDevLinkHeldId( const int DevLinkCallId ) { } /***************************************************************** **【函数名称】 setDevLinkCallId **【函数功能】 设置当前线路被活动的 DevLinkCallId **【参数】 **【返回值】 ****************************************************************/ void CTapiLineIvr::setDevLinkCallId( const int DevLinkCallId ) { }