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

TapiOpTransfer.cpp 6.6KB

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