#include "StdAfx.h" #include "TapiLineFax.h" #include "DevControl.h" #include "VsControl.h" #include "TapiOpBase.h" CTapiLineFax::CTapiLineFax(DWORD DevID, HLINE Handle, DWORD ApiVersion, CString ExtID, HLINEAPP LineApp) : CTapiLine(DevID, Handle, ApiVersion, ExtID, LineApp), m_AssoTrunkId(CONST_DEV_ID_INVALID) { } CTapiLineFax::~CTapiLineFax(void) { } /***************************************************************** **【函数名称】 _procDevLinkEventS **【函数功能】 DevLink S事件后续处理 **【参数】 pInfoS DevLink S事件内容 **【返回值】 ****************************************************************/ void CTapiLineFax::_procDevLinkEventS( DevLinkInfoS* pInfoS ) { // 保存外线ID if(pInfoS->nPeerResType == DEV_RES_TYPE_TRUNK) 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; // 线路状态进行分类处理 if(m_LineStatus == INNER_STATE_FREE) __onHangUp(); // 通知业务逻辑线路状态变化 CDevControl::GetInstance().onEventResState(DEV_RES_TYPE_FAX, m_ExtenID, __ivrStatusToFax(m_LineStatus), pInfoS->szCallerNum, pInfoS->szCalleeNum); } /***************************************************************** **【函数名称】 _procDevLinkEventD **【函数功能】 DevLink D事件后续处理 **【参数】 **【返回值】 ****************************************************************/ void CTapiLineFax::_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_FAX, m_ExtenID, INNER_STATE_FREE); // 通知VP台挂机 __onHangUp(); } // end if } /***************************************************************** **【函数名称】 _procLineInitStatus **【函数功能】 初始化线路状态处理 **【参数】 **【返回值】 ****************************************************************/ void CTapiLineFax::_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_FAX, m_ExtenID, __ivrStatusToFax(m_LineStatus)); } /***************************************************************** **【函数名称】 __onHangUp **【函数功能】 线路挂机处理函数 **【参数】 **【返回值】 ****************************************************************/ void CTapiLineFax::__onHangUp(void) { m_AssoTrunkId = CONST_DEV_ID_INVALID; // 通知VS, IVR线路释放 CVsControl::GetInstance().notifyLineFree(atoi(m_ExtenID), DEV_RES_TYPE_FAX); } /***************************************************************** **【函数名称】 __ivrStatusToFax **【函数功能】 **【参数】 **【返回值】 ****************************************************************/ UINT CTapiLineFax::__ivrStatusToFax( UINT IvrState ) { if(IvrState >= FAX_STATE_BUSY) return FAX_STATE_BUSY; return IvrState; } /***************************************************************** **【函数名称】 regist **【函数功能】 注册线路 **【参数】 **【返回值】 ****************************************************************/ void CTapiLineFax::regist( void ) { // 通知业务逻辑线路创建事件 CDevControl::GetInstance().onEventResDetail(DEV_RES_TYPE_FAX, m_ExtenID); CDevControl::GetInstance().onEventResState(DEV_RES_TYPE_FAX, m_ExtenID, m_LineStatus); // 设置线路可响应的状态事件 HRESULT hRet = ::lineSetStatusMessages(m_Handle, LINE_DEV_STATE_ALL, LINE_ADDRESS_STATE_ALL); ASSERT(hRet == S_OK); } /***************************************************************** **【函数名称】 redoCallStatus **【函数功能】 强制重新处理线路状态 **【参数】 **【返回值】 ****************************************************************/ void CTapiLineFax::redoCallStatus( HCALL CallId, DWORD CallState, DWORD CallStateDetail ) { } /***************************************************************** **【函数名称】 setDevLinkHeldId **【函数功能】 设置当前线路被保持的 DevLinkCallId **【参数】 **【返回值】 ****************************************************************/ void CTapiLineFax::setDevLinkHeldId( const int DevLinkCallId ) { } /***************************************************************** **【函数名称】 setDevLinkCallId **【函数功能】 设置当前线路被活动的 DevLinkCallId **【参数】 **【返回值】 ****************************************************************/ void CTapiLineFax::setDevLinkCallId( const int DevLinkCallId ) { }