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

TapiOpMeeting.cpp 6.5KB

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