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

TapiLineExten.cpp 6.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. #include "StdAfx.h"
  2. #include "TapiLineExten.h"
  3. #include "DevControl.h"
  4. #include "VsControl.h"
  5. #include "LineOpExec.h"
  6. #include "TapiOpConsult.h"
  7. CTapiLineExten::CTapiLineExten(DWORD DevID, HLINE Handle, DWORD ApiVersion, CString ExtID, HLINEAPP LineApp) : CTapiLine(DevID, Handle, ApiVersion, ExtID, LineApp)
  8. {
  9. }
  10. CTapiLineExten::~CTapiLineExten(void)
  11. {
  12. }
  13. /*****************************************************************
  14. **【函数名称】 __onExtStatusChanged
  15. **【函数功能】 线路状态变化事件处理
  16. **【参数】 pInfoS DevLink事件内容,可以不填
  17. **【返回值】
  18. ****************************************************************/
  19. void CTapiLineExten::__onExtStatusChanged( DevLinkInfoS* pInfoS )
  20. {
  21. // 通知业务逻辑线路状态变化
  22. CDevControl::GetInstance().onEventResState(DEV_RES_TYPE_EXT, m_ExtenID, m_LineStatus, m_CallerNum, m_CalleeNum);
  23. // 如果线路空闲
  24. if(m_LineStatus == INNER_STATE_FREE)
  25. {
  26. // 通知VS线路释放(并线录音时有效)
  27. CVsControl::GetInstance().notifyLineFree(atoi(m_ExtenID), DEV_RES_TYPE_EXT);
  28. } // end if
  29. }
  30. /*****************************************************************
  31. **【函数名称】 _procDevLinkEventS
  32. **【函数功能】 DevLink S事件后续处理
  33. **【参数】 pInfoS DevLink S事件内容
  34. **【返回值】
  35. ****************************************************************/
  36. void CTapiLineExten::_procDevLinkEventS( DevLinkInfoS* pInfoS )
  37. {
  38. // 如果线路未附加任何操作且线路变为呼出振铃状态,则通知座席话机直呼操作
  39. int Status = pInfoS->nResStatus & HELD_STATE_FILTER_MASK;
  40. if(m_pCurrTapiOp == NULL && (Status == INNER_STATE_DIALING || Status == INNER_STATE_RING_BACK))
  41. {
  42. CLineOpExec::GetInstance().onDevDirectOpBegin(DEV_OP_CALL_OUT, this, pInfoS);
  43. }
  44. // 通知关联操作
  45. if(m_pCurrTapiOp != NULL)
  46. {
  47. m_pCurrTapiOp->onDevLinkEventS(this, pInfoS);
  48. if(m_DevLinkCallId == CONST_DEV_LINK_SUSPEND)
  49. return;
  50. }
  51. // 不处理保持状态
  52. if(pInfoS->nResStatus != INNER_STATE_HELD && pInfoS->nDevLinkCallId != m_DevLinkHeldId)
  53. {
  54. // 保存呼叫信息
  55. if(pInfoS->nResStatus != INNER_STATE_FREE)
  56. m_DevLinkCallId = pInfoS->nDevLinkCallId;
  57. // 保存线路信息
  58. m_CallerNum = pInfoS->szCallerNum;
  59. m_CalleeNum = pInfoS->szCalleeNum;
  60. m_LineStatus = ((m_DevLinkHeldId == CONST_DEV_LINK_CALL_NULL) ? pInfoS->nResStatus : (pInfoS->nResStatus | INNER_STATE_HELD));
  61. // 线路状态日志
  62. if(m_LineStatus == INNER_STATE_TALKING)
  63. {
  64. CDevControl::GetInstance().onEventLog(LOG_LEVEL_NORMAL, _T("{LineExt}: Line[%s]进入通话, CallerNum = %s, CalleeNum = %s, DevLinkCallId = %ld, Flag = %d, Op = %lu"),
  65. m_ExtenID,
  66. pInfoS->szCallerNum,
  67. pInfoS->szCalleeNum,
  68. pInfoS->nDevLinkCallId,
  69. pInfoS->nFlag,
  70. m_pCurrTapiOp);
  71. } // end if
  72. // 通知线路状态变化
  73. __onExtStatusChanged(pInfoS);
  74. } // end if
  75. }
  76. /*****************************************************************
  77. **【函数名称】 __ProcDevLinkEventD
  78. **【函数功能】 DevLink D事件后续处理
  79. **【参数】
  80. **【返回值】
  81. ****************************************************************/
  82. void CTapiLineExten::_procDevLinkEventD( int DevLinkCallId )
  83. {
  84. if(DevLinkCallId == m_DevLinkHeldId) // 被保持方挂机
  85. {
  86. m_DevLinkHeldId = -1;
  87. m_HeldCall = NULL;
  88. m_LineStatus = m_LineStatus & HELD_STATE_FILTER_MASK;
  89. // 通知线路状态变化
  90. __onExtStatusChanged(NULL);
  91. }
  92. else // 当前活动呼叫挂机
  93. {
  94. m_DevLinkCallId = -1; // 更新DevLink CallId
  95. // 通知关联操作
  96. if(m_pCurrTapiOp != NULL)
  97. {
  98. m_pCurrTapiOp->onDevLinkEventD(this, DevLinkCallId);
  99. if(m_DevLinkCallId == CONST_DEV_LINK_SUSPEND && dynamic_cast<CTapiOpConsult*>(m_pCurrTapiOp) == NULL) // 协商呼叫确认转移前,协商者物理挂机,发送线路信息
  100. {
  101. return;
  102. }
  103. } // end if
  104. // 更新线路信息
  105. if((m_LineStatus & HELD_STATE_FILTER_MASK) != INNER_STATE_FREE)
  106. {
  107. m_CallerNum.Empty();
  108. m_CalleeNum.Empty();
  109. m_LineStatus = (m_DevLinkHeldId != CONST_DEV_LINK_CALL_NULL) ? INNER_STATE_FREE|INNER_STATE_HELD : INNER_STATE_FREE;
  110. // 通知路状态变化
  111. __onExtStatusChanged(NULL);
  112. } // end if(Line Status)
  113. } // end if
  114. }
  115. /*****************************************************************
  116. **【函数名称】 _procLineInitStatus
  117. **【函数功能】 初始化线路状态处理
  118. **【参数】
  119. **【返回值】
  120. ****************************************************************/
  121. void CTapiLineExten::_procLineInitStatus( HCALL CallId, DWORD CallState, DWORD CallStateDetail, DWORD CallPrivilege )
  122. {
  123. // 得到活动呼叫状态
  124. if(m_ActiveCall == NULL) // 如果活动呼叫为空
  125. {
  126. m_LineStatus = INNER_STATE_FREE;
  127. }
  128. else // 如果活动呼叫不为空
  129. {
  130. if(CallId == m_ActiveCall) // 如果当前呼叫等于活动呼叫
  131. {
  132. m_LineStatus = _mapTapiCallState(CallState);
  133. }
  134. } // end if(m_hActiveCall)
  135. // 通知线路状态
  136. __onExtStatusChanged(NULL);
  137. }
  138. /*****************************************************************
  139. **【函数名称】 regist
  140. **【函数功能】 注册线路
  141. **【参数】
  142. **【返回值】
  143. ****************************************************************/
  144. void CTapiLineExten::regist( void )
  145. {
  146. // 通知业务逻辑线路创建事件
  147. CDevControl::GetInstance().onEventResDetail(DEV_RES_TYPE_EXT, m_ExtenID);
  148. CDevControl::GetInstance().onEventResState(DEV_RES_TYPE_EXT, m_ExtenID, m_LineStatus);
  149. // 设置线路可响应的状态事件
  150. HRESULT hRet = ::lineSetStatusMessages(m_Handle, LINE_DEV_STATE_ALL, LINE_ADDRESS_STATE_ALL);
  151. ASSERT(hRet == S_OK);
  152. }
  153. /*****************************************************************
  154. **【函数名称】 redoCallStatus
  155. **【函数功能】 强制重新处理线路状态
  156. **【参数】
  157. **【返回值】
  158. ****************************************************************/
  159. void CTapiLineExten::redoCallStatus( HCALL CallId, DWORD CallState, DWORD CallStateDetail )
  160. {
  161. // 线路挂机事件的强制状态处理
  162. if(CallId == m_ActiveCall && (CallState & LINECALLSTATE_DISCONNECTED))
  163. {
  164. m_LineStatus = ((m_DevLinkHeldId == CONST_DEV_LINK_CALL_NULL) ? INNER_STATE_FREE : (INNER_STATE_FREE | INNER_STATE_HELD));
  165. // 通知业务逻辑线路状态变化
  166. __onExtStatusChanged(NULL);
  167. } // end if
  168. }
  169. /*****************************************************************
  170. **【函数名称】 setDevLinkHeldId
  171. **【函数功能】 设置当前线路被保持的 DevLinkCallId
  172. **【参数】
  173. **【返回值】
  174. ****************************************************************/
  175. void CTapiLineExten::setDevLinkHeldId( const int DevLinkCallId )
  176. {
  177. m_DevLinkHeldId = DevLinkCallId;
  178. if(m_DevLinkHeldId != CONST_DEV_LINK_CALL_NULL) // 保持开始
  179. {
  180. m_DevLinkCallId = CONST_DEV_LINK_CALL_NULL;
  181. m_LineStatus = INNER_STATE_FREE | INNER_STATE_HELD;
  182. // 通知线路状态变化
  183. __onExtStatusChanged(NULL);
  184. } // end if
  185. }
  186. /*****************************************************************
  187. **【函数名称】 setDevLinkCallId
  188. **【函数功能】 设置当前线路被活动的 DevLinkCallId
  189. **【参数】
  190. **【返回值】
  191. ****************************************************************/
  192. void CTapiLineExten::setDevLinkCallId( const int DevLinkCallId )
  193. {
  194. m_DevLinkCallId = DevLinkCallId;
  195. }