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

TapiOpConsult.cpp 7.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  1. #include "StdAfx.h"
  2. #include "TapiOpConsult.h"
  3. #include "DevControl.h"
  4. #include "LineOpExec.h"
  5. #include "TapiLine.h"
  6. CTapiOpConsult::CTapiOpConsult(LONG Instance) : CTapiOpBase(Instance), m_TransferCall(NULL), m_HeldCall(NULL), m_Step(0), m_HasSendOpProcess(false)
  7. {
  8. }
  9. CTapiOpConsult::~CTapiOpConsult(void)
  10. {
  11. }
  12. /*****************************************************************
  13. **【函数名称】 __pause
  14. **【函数功能】 当前操作阶段性完成,操作暂停并返回
  15. **【参数】 IsSucceed 阶段操作是否成功
  16. **【返回值】
  17. ****************************************************************/
  18. void CTapiOpConsult::__pause( bool IsSucceed )
  19. {
  20. // 阶段完成日志
  21. CDevControl::GetInstance().onEventLog(LOG_LEVEL_NORMAL, _T("{OP_Consult}: Exten[%s]协商呼叫对端已接通, DestNum = %s"), m_pHostLine->extenID(), m_DestNum);
  22. // 返回第一阶段执行结果
  23. CDevControl::GetInstance().onEventOpResult(m_Instance, IsSucceed);
  24. }
  25. /*****************************************************************
  26. **【函数名称】 start
  27. **【函数功能】 操作启动(命令方式)
  28. **【参数】 pParam 操作启动参数
  29. **【返回值】
  30. ****************************************************************/
  31. bool CTapiOpConsult::start( LineOpParam* pParam )
  32. {
  33. // 校验状态
  34. if(m_pHostLine->status() != INNER_STATE_TALKING)
  35. return false;
  36. // 保存被叫号码
  37. m_DestNum.Format(_T("%s"), pParam->szParam2);
  38. // 通知启动日志
  39. CDevControl::GetInstance().onEventLog(LOG_LEVEL_NORMAL, _T("{OP_Consult}: Exten[%s]执行协商呼叫,DestNum = %s"), m_pHostLine->extenID(), m_DestNum);
  40. // 开始建立转移
  41. m_HeldCall = m_pHostLine->activeCall();
  42. if(m_pHostLine->getCallStatus(m_HeldCall) & LINECALLSTATE_CONNECTED)
  43. {
  44. m_Step = 1;
  45. return m_pHostLine->lineSetupTransfer(&m_TransferCall);
  46. } // end if
  47. return true;
  48. }
  49. /*****************************************************************
  50. **【函数名称】 cancel
  51. **【函数功能】 操作取消(命令方式)
  52. **【参数】
  53. **【返回值】
  54. ****************************************************************/
  55. bool CTapiOpConsult::cancel( LONG InstanceCancel )
  56. {
  57. // 保存取消操作调用标识
  58. m_InstanceCancel = InstanceCancel;
  59. // 通知启动日志
  60. CDevControl::GetInstance().onEventLog(LOG_LEVEL_NORMAL, _T("{OP_Consult}: Exten[%s]协商呼叫取消, DestNum = %s"), m_pHostLine->extenID(), m_DestNum);
  61. // 挂断正在转移的呼叫
  62. if(m_Step == 2 || m_Step == 3)
  63. {
  64. m_pHostLine->lineDropCall(m_TransferCall);
  65. return true;
  66. } // end if
  67. return false;
  68. }
  69. /*****************************************************************
  70. **【函数名称】 end
  71. **【函数功能】 操作完成
  72. **【参数】 IsSucceed 操作是否成功
  73. **【返回值】
  74. ****************************************************************/
  75. void CTapiOpConsult::end( bool IsSucceed )
  76. {
  77. if(IsSucceed)
  78. {
  79. CDevControl::GetInstance().onEventLog(LOG_LEVEL_NORMAL, _T("{OP_Consult}: Exten[%s]协商呼叫成功, DestNum = %s"), m_pHostLine->extenID(), m_DestNum);
  80. }
  81. else
  82. {
  83. CDevControl::GetInstance().onEventLog(LOG_LEVEL_WARNING, _T("{OP_Consult}: Exten[%s]协商呼叫失败, DestNum = %s"), m_pHostLine->extenID(), m_DestNum);
  84. } // end if
  85. // 返回执行结果
  86. if(m_InstanceCancel != CONST_TAPI_OP_INSTANCE_INVALID)
  87. {
  88. CDevControl::GetInstance().onEventOpResult(m_InstanceCancel, IsSucceed);
  89. } // end if
  90. CLineOpExec::GetInstance().onTapiOpResult(m_Instance, this, IsSucceed);
  91. }
  92. /*****************************************************************
  93. **【函数名称】 resume
  94. **【函数功能】 当前操作继续执行
  95. **【参数】 Instance 调用标识
  96. **【返回值】
  97. ****************************************************************/
  98. bool CTapiOpConsult::resume( long Instance )
  99. {
  100. // 逻辑校验
  101. if(Instance != m_Instance)
  102. return false;
  103. if(m_Step != 3)
  104. return false;
  105. // 开始完成转移
  106. m_Step = 4;
  107. return m_pHostLine->lineCompleteTransfer(m_HeldCall, m_TransferCall);
  108. }
  109. /*****************************************************************
  110. **【函数名称】 onReply
  111. **【函数功能】 线路操作异步响应事件
  112. **【参数】 pEventLine 触发事件的线路
  113. RequestID
  114. Result
  115. **【返回值】
  116. ****************************************************************/
  117. void CTapiOpConsult::onReply( CTapiLine* pEventLine, LONG RequestID, HRESULT Result )
  118. {
  119. switch(m_Step)
  120. {
  121. case 1: // 正在启动转移
  122. {
  123. if(Result == S_OK)
  124. {
  125. m_Step = 2;
  126. }
  127. else
  128. {
  129. end(false);
  130. } // end if
  131. }
  132. break;
  133. case 2: // 正在呼叫
  134. {
  135. if(Result != S_OK)
  136. end(false);
  137. }
  138. break;
  139. case 4: // 正在完成转移
  140. {
  141. if(Result != S_OK)
  142. {
  143. m_pHostLine->lineDropCall(m_TransferCall);
  144. end(false);
  145. }
  146. else
  147. {
  148. end(true);
  149. } // end if
  150. }
  151. break;
  152. } // end switch
  153. }
  154. /*****************************************************************
  155. **【函数名称】 onCallState
  156. **【函数功能】 呼叫状态事件
  157. **【参数】 pEventLine 触发事件的线路
  158. CallId 触发事件的呼叫句柄
  159. CallState 呼叫基本状态
  160. CallStateDetail 呼叫明细状态
  161. **【返回值】
  162. ****************************************************************/
  163. void CTapiOpConsult::onCallState( CTapiLine* pEventLine, HCALL CallId, DWORD CallState, DWORD CallStateDetail )
  164. {
  165. // 等待呼叫进入通话中
  166. if((m_Step == 0) && (CallId == m_HeldCall) && (CallState & LINECALLSTATE_CONNECTED))
  167. {
  168. m_Step = 1;
  169. if(!m_pHostLine->lineSetupTransfer(&m_TransferCall))
  170. return end(false);
  171. } // end if
  172. // 转移过程处理
  173. if(CallId == m_TransferCall && m_Step == 2)
  174. {
  175. if(CallState & LINECALLSTATE_DIALTONE) // 可以开始呼叫目的端
  176. {
  177. if(!m_pHostLine->lineDial(m_TransferCall, m_DestNum))
  178. return end(false);
  179. }
  180. else if(CallState & LINECALLSTATE_BUSY) // 被叫忙
  181. {
  182. m_pHostLine->lineDropCall(m_TransferCall);
  183. }
  184. else if(CallState & LINECALLSTATE_CONNECTED) // 被叫接通
  185. {
  186. m_Step = 3;
  187. __pause(true); // 阶段操作完成
  188. } // end if(nCallState)
  189. } // end if
  190. // 转移过程中申请转移方挂机
  191. if(CallId == m_HeldCall && (CallState & LINECALLSTATE_DISCONNECTED))
  192. {
  193. if(CallStateDetail != LINEDISCONNECTMODE_FORWARDED) // 非正常释放,是转移方对端挂机
  194. {
  195. m_pHostLine->lineDropCall(m_TransferCall); // 挂断当前呼叫
  196. }
  197. } // end if(m_hHeldCall)
  198. }
  199. /*****************************************************************
  200. **【函数名称】 onDevLinkEventS
  201. **【函数功能】 DevLink中S事件响应
  202. **【参数】 pEventLine 触发事件的线路
  203. pInfoS DevLink S事件内容
  204. **【返回值】
  205. ****************************************************************/
  206. void CTapiOpConsult::onDevLinkEventS( CTapiLine* pEventLine, DevLinkInfoS* pInfoS )
  207. {
  208. // 通知呼叫进展事件
  209. if(pInfoS->nResStatus == INNER_STATE_RING_BACK && !m_HasSendOpProcess)
  210. {
  211. _notifyOpProcess(pInfoS);
  212. m_HasSendOpProcess = true;
  213. } // end if
  214. // 转移过程中的挂机事件处理
  215. if((pInfoS->nResStatus == INNER_STATE_FREE && pInfoS->nFlag == 0) ||
  216. (pInfoS->nResStatus == INNER_STATE_FREE && pInfoS->nFlag == 1 && m_Step == 3))
  217. {
  218. m_pHostLine->setDevLinkCallId(CONST_DEV_LINK_SUSPEND);
  219. m_pHostLine->lineTakeBack(m_HeldCall);
  220. end(false);
  221. } // end if
  222. }
  223. /*****************************************************************
  224. **【函数名称】 onDevLinkEventD
  225. **【函数功能】 DevLink中D事件响应
  226. **【参数】 pEventLine 触发事件的线路
  227. DevLinkCallId DevLink事件CallId
  228. **【返回值】
  229. ****************************************************************/
  230. void CTapiOpConsult::onDevLinkEventD( CTapiLine* pEventLine, int DevLinkCallId )
  231. {
  232. if(m_Step == 2 || m_Step == 3)
  233. {
  234. m_pHostLine->setDevLinkCallId(CONST_DEV_LINK_SUSPEND);
  235. m_pHostLine->lineTakeBack(m_HeldCall);
  236. m_pHostLine->lineDropCall(m_TransferCall);
  237. end(false);
  238. } // end if
  239. }
  240. /*****************************************************************
  241. **【函数名称】 onDevLinkEventA
  242. **【函数功能】 DevLink中A事件响应
  243. **【参数】 pEventLine 触发事件的线路
  244. DevLinkCallId DevLink事件CallId
  245. **【返回值】
  246. ****************************************************************/
  247. void CTapiOpConsult::onDevLinkEventA( CTapiLine* pEventLine, int DevLinkCallId )
  248. {
  249. }