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