中间件标准版5.1git,去除基础模块

TapiLineIvr.cpp 5.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. #include "StdAfx.h"
  2. #include "TapiLineIvr.h"
  3. #include "DevControl.h"
  4. #include "VsControl.h"
  5. #include "TapiOpBase.h"
  6. CTapiLineIvr::CTapiLineIvr(DWORD DevID, HLINE Handle, DWORD ApiVersion, CString ExtID, HLINEAPP LineApp) : CTapiLine(DevID, Handle, ApiVersion, ExtID, LineApp),
  7. m_AssoTrunkId(CONST_DEV_ID_INVALID)
  8. {
  9. }
  10. CTapiLineIvr::~CTapiLineIvr(void)
  11. {
  12. }
  13. /*****************************************************************
  14. **【函数名称】 _procDevLinkEventS
  15. **【函数功能】 DevLink S事件后续处理
  16. **【参数】 pInfoS DevLink S事件内容
  17. **【返回值】
  18. ****************************************************************/
  19. void CTapiLineIvr::_procDevLinkEventS( DevLinkInfoS* pInfoS )
  20. {
  21. // 保存线路ID
  22. sscanf_s(pInfoS->szPeerResId, "%lu", &m_AssoTrunkId);
  23. // 状态事件过滤(保持状态不处理;重复的通话事件不处理)
  24. if((pInfoS->nResStatus == INNER_STATE_HELD) ||
  25. (pInfoS->nResStatus == INNER_STATE_TALKING && m_LineStatus == INNER_STATE_TALKING && pInfoS->nDevLinkCallId == m_DevLinkCallId))
  26. {
  27. return;
  28. } // end if
  29. // 通知关联操作
  30. if(m_pCurrTapiOp != NULL && m_AssoTrunkId != CONST_DEV_ID_INVALID)
  31. {
  32. m_pCurrTapiOp->onDevLinkEventS(this, pInfoS);
  33. } // end if
  34. // 保存呼叫信息
  35. m_DevLinkCallId = pInfoS->nDevLinkCallId;
  36. m_LineStatus = pInfoS->nResStatus;
  37. // 通知业务逻辑线路状态变化
  38. CDevControl::GetInstance().onEventResState(DEV_RES_TYPE_IVR, m_ExtenID, m_LineStatus, pInfoS->szCallerNum, pInfoS->szCalleeNum);
  39. // 线路状态进行分类处理
  40. switch(m_LineStatus)
  41. {
  42. case INNER_STATE_TALKING: // 通话中
  43. {
  44. CDevControl::GetInstance().onEventLog(LOG_LEVEL_NORMAL,
  45. _T("{LineIvr}: Line[%s]进入通话, CallerNum = %s, CalleeNum = %s, DevLinkCallId = %ld, TrunkId = %lu, Flag = %d, Op = %lu"),
  46. m_ExtenID,
  47. pInfoS->szCallerNum,
  48. pInfoS->szCalleeNum,
  49. pInfoS->nDevLinkCallId,
  50. m_AssoTrunkId,
  51. pInfoS->nFlag,
  52. m_pCurrTapiOp);
  53. // 通知业务逻辑层外线来电事件
  54. if(pInfoS->nFlag == CONST_DEVLINK_INBOUND_ANSWER && m_pCurrTapiOp == NULL)
  55. {
  56. CDevControl::GetInstance().onEventDevOperation(m_AssoTrunkId, DEV_OP_CALL_IN, pInfoS->szCallerNum, pInfoS->szCalleeNum);
  57. } // end if
  58. }
  59. break;
  60. case INNER_STATE_FREE: // 线路释放
  61. {
  62. __onHangUp();
  63. }
  64. break;
  65. } // end switch
  66. }
  67. /*****************************************************************
  68. **【函数名称】 _procDevLinkEventD
  69. **【函数功能】 DevLink D事件后续处理
  70. **【参数】
  71. **【返回值】
  72. ****************************************************************/
  73. void CTapiLineIvr::_procDevLinkEventD( int DevLinkCallId )
  74. {
  75. // 更新DevLink CallId
  76. m_DevLinkCallId = CONST_DEV_LINK_CALL_NULL;
  77. // 通知关联操作
  78. if(m_pCurrTapiOp != NULL)
  79. m_pCurrTapiOp->onDevLinkEventD(this, DevLinkCallId);
  80. // 更新线路状态
  81. if(m_LineStatus != INNER_STATE_FREE)
  82. {
  83. m_LineStatus = INNER_STATE_FREE;
  84. // 通知线路空闲状态
  85. CDevControl::GetInstance().onEventResState(DEV_RES_TYPE_IVR, m_ExtenID, INNER_STATE_FREE);
  86. __onHangUp();
  87. } // end if
  88. }
  89. /*****************************************************************
  90. **【函数名称】 _procLineInitStatus
  91. **【函数功能】 初始化线路状态处理
  92. **【参数】
  93. **【返回值】
  94. ****************************************************************/
  95. void CTapiLineIvr::_procLineInitStatus( HCALL CallId, DWORD CallState, DWORD CallStateDetail, DWORD CallPrivilege )
  96. {
  97. // 得到活动呼叫状态
  98. if(m_ActiveCall == NULL) // 如果活动呼叫为空
  99. {
  100. m_LineStatus = INNER_STATE_FREE;
  101. }
  102. else // 如果活动呼叫不为空
  103. {
  104. if(CallId == m_ActiveCall) // 如果当前呼叫等于活动呼叫
  105. {
  106. m_LineStatus = _mapTapiCallState(CallState);
  107. }
  108. } // end if(m_hActiveCall)
  109. // 通知线路状态
  110. CDevControl::GetInstance().onEventResState(DEV_RES_TYPE_IVR, m_ExtenID, m_LineStatus);
  111. }
  112. /*****************************************************************
  113. **【函数名称】 __onHangUp
  114. **【函数功能】 线路挂机处理函数
  115. **【参数】
  116. **【返回值】
  117. ****************************************************************/
  118. void CTapiLineIvr::__onHangUp( void )
  119. {
  120. m_AssoTrunkId = CONST_DEV_ID_INVALID;
  121. // 通知VP台IVR线路释放
  122. CVsControl::GetInstance().notifyLineFree(atoi(m_ExtenID), DEV_RES_TYPE_IVR);
  123. }
  124. /*****************************************************************
  125. **【函数名称】 regist
  126. **【函数功能】 注册线路
  127. **【参数】
  128. **【返回值】
  129. ****************************************************************/
  130. void CTapiLineIvr::regist( void )
  131. {
  132. // 通知业务逻辑线路创建事件
  133. CDevControl::GetInstance().onEventResDetail(DEV_RES_TYPE_IVR, m_ExtenID);
  134. CDevControl::GetInstance().onEventResState(DEV_RES_TYPE_IVR, m_ExtenID, m_LineStatus);
  135. // 设置线路可响应的状态事件
  136. HRESULT hRet = ::lineSetStatusMessages(m_Handle, LINE_DEV_STATE_ALL, LINE_ADDRESS_STATE_ALL);
  137. ASSERT(hRet == S_OK);
  138. }
  139. /*****************************************************************
  140. **【函数名称】 redoCallStatus
  141. **【函数功能】 强制重新处理线路状态
  142. **【参数】
  143. **【返回值】
  144. ****************************************************************/
  145. void CTapiLineIvr::redoCallStatus( HCALL CallId, DWORD CallState, DWORD CallStateDetail )
  146. {
  147. }
  148. /*****************************************************************
  149. **【函数名称】 setDevLinkHeldId
  150. **【函数功能】 设置当前线路被保持的 DevLinkCallId
  151. **【参数】
  152. **【返回值】
  153. ****************************************************************/
  154. void CTapiLineIvr::setDevLinkHeldId( const int DevLinkCallId )
  155. {
  156. }
  157. /*****************************************************************
  158. **【函数名称】 setDevLinkCallId
  159. **【函数功能】 设置当前线路被活动的 DevLinkCallId
  160. **【参数】
  161. **【返回值】
  162. ****************************************************************/
  163. void CTapiLineIvr::setDevLinkCallId( const int DevLinkCallId )
  164. {
  165. }