修改三方通话功能,在发起三方通话时,先保持住主叫,然后再拉回主叫到会议

TrunkTurnReq.cpp 5.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. #include "StdAfx.h"
  2. #include "TrunkTurnReq.h"
  3. #include "ProxyExten.h"
  4. #include "SessionShell.h"
  5. #include "ControlShell.h"
  6. #include "ProxyShell.h"
  7. #include "MC.h"
  8. CTrunkTurnReq::CTrunkTurnReq(CProxyShell* pParent, CPduEntity& ReqPdu) : CReqBase(pParent, ReqPdu),
  9. m_pAssoLine(NULL), m_PendingCallId(SESSION_INVALID_SUB_CALL), m_PeerLineType(DEV_RES_TYPE_EXT), m_SipAccountId(INVALID_ID_SIP_ACCOUNT)
  10. {
  11. }
  12. CTrunkTurnReq::~CTrunkTurnReq(void)
  13. {
  14. }
  15. /*****************************************************************
  16. **【函数名称】 request
  17. **【函数功能】 发出请求(命令方式)
  18. **【参数】
  19. **【返回值】
  20. ****************************************************************/
  21. bool CTrunkTurnReq::request( void )
  22. {
  23. // 校验状态
  24. if(m_pHostLine->state() != VIRTUAL_LINE_STATE_TALKING)
  25. return false;
  26. // 保存被叫信息
  27. CString CallerNum = m_ReqPdu.GetDataString(4);
  28. m_DestNum = m_ReqPdu.GetDataString(3);
  29. // 根据被叫号码查找对端线路且修正被叫号码
  30. m_pAssoLine = m_pParent->setEnv4Calling(CallerNum, m_DestNum, m_PeerLineType, m_SipAccountId);
  31. if(m_pAssoLine == NULL)
  32. {
  33. LOGGER(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{LineReq}: 中继[%lu]跳转失败, 查找关联线路失败, DestNum = %s"),
  34. m_pHostLine->lineId(), m_DestNum);
  35. return false;
  36. } // end if
  37. if(m_pAssoLine->type() == DEV_RES_TYPE_EXT)
  38. {
  39. if(m_pAssoLine->state() != VIRTUAL_LINE_STATE_FREE)
  40. {
  41. LOGGER(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{LineReq}: 中继[%lu]跳转失败, 对端分机[%s]非空闲"), m_pHostLine->lineId(), m_DestNum);
  42. return false;
  43. }
  44. CallerNum = m_pHostLine->callerNum();
  45. }
  46. // 通知启动日志
  47. LOGGER(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{LineReq}: 中继[%lu]跳转, DestNum = %s, HostCall = %ld"),
  48. m_pHostLine->lineId(), m_DestNum, m_pHostLine->activeCallId());
  49. // 开始建立转移
  50. PendingCallInfo info;
  51. memset(&info, 0, sizeof(PendingCallInfo));
  52. info.nCall = m_pHostLine->activeCallId();
  53. info.nHostLine = m_pHostLine->devId();
  54. info.nAssoLine = m_pAssoLine->devId();
  55. lstrcpy(info.szCallerNum, m_pHostLine->calleeNum()); //转外线号码时 主叫应该是呼叫系统的号码
  56. //lstrcpy(info.szCallerNum, CallerNum);
  57. //lstrcpy(info.szCallerNum, "7670588");
  58. lstrcpy(info.szCalleeNum, m_DestNum);
  59. lstrcpy(info.szPreCallerNum, m_pHostLine->callerNum());
  60. lstrcpy(info.szPreCalleeNum, m_pHostLine->calleeNum());
  61. info.nCallType = (m_PeerLineType == DEV_RES_TYPE_EXT) ? PENDING_CALL_DIRECT : PENDING_CALL_TRUNK;
  62. info.nHostLineStatus = VIRTUAL_LINE_STATE_TALKING;
  63. info.nSipAccountId = m_SipAccountId;
  64. return CSessionShell::GetInstance().procReqDialSetup(m_PendingCallId, &info);
  65. }
  66. /*****************************************************************
  67. **【函数名称】 hangUp
  68. **【函数功能】 操作中挂机(命令方式)
  69. **【参数】
  70. **【返回值】
  71. ****************************************************************/
  72. bool CTrunkTurnReq::hangUp( long InstanceHangUp )
  73. {
  74. // 转座席取消日志
  75. LOGGER(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, __T("{LineReq}: 中继[%lu]因挂机取消跳转, DestNum = %s"),
  76. m_pHostLine->lineId(), m_DestNum);
  77. m_InstanceCancel = InstanceHangUp;
  78. return CMC::GetInstance().dropCall(m_pAssoLine->devId(), false);
  79. }
  80. /*****************************************************************
  81. **【函数名称】 end
  82. **【函数功能】 操作完成
  83. **【参数】 IsSucceed 操作是否成功
  84. lpData 随路数据
  85. **【返回值】
  86. ****************************************************************/
  87. void CTrunkTurnReq::end( bool IsSucceed, LPCTSTR lpData )
  88. {
  89. if(IsSucceed)
  90. {
  91. LOGGER(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{LineReq}: 中继[%lu]跳转成功, DestNum = %s"), m_pHostLine->lineId(), m_DestNum);
  92. }
  93. else
  94. {
  95. LOGGER(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{LineReq}: 中继[%lu]跳转失败, DestNum = %s"), m_pHostLine->lineId(), m_DestNum);
  96. } // end if
  97. // 返回执行结果
  98. if(m_InstanceCancel != 0)
  99. {
  100. m_pParent->notifyReqResult(m_ReqPdu, m_InstanceCancel, !IsSucceed, lpData);
  101. } // end if
  102. m_pParent->onLineReqEnd(this, IsSucceed, lpData);
  103. }
  104. /*****************************************************************
  105. **【函数名称】 onDevChEvent
  106. **【函数功能】 线路向上层发送的设备主动事件
  107. **【参数】 pEventLine 触发事件的线路
  108. EvtType 事件类型
  109. lpContent 事件内容
  110. **【返回值】
  111. *****************************************************************/
  112. void CTrunkTurnReq::onDevChEvent( CVirtualProxy* pEventLine, DEV_CH_EVT_TYPE EvtType, LPCTSTR lpContent )
  113. {
  114. // TODO: do nothing
  115. }
  116. /*****************************************************************
  117. **【函数名称】 onLineStateChanged
  118. **【函数功能】 线路状态变化事件响应接口
  119. **【参数】 pEventLine 状态变化的线路实体指针
  120. LineState 线路当前状态
  121. Call 主呼叫ID
  122. SubCall 子呼叫ID
  123. lpCallerNum 主叫号码
  124. lpCalleeNum 被叫号码
  125. **【返回值】
  126. ****************************************************************/
  127. void CTrunkTurnReq::onLineStateChanged( CVirtualProxy* pEventLine, VIRTUAL_LINE_STATE LineState, long Call, long SubCall, LPCTSTR lpCallerNum, LPCTSTR lpCalleeNum )
  128. {
  129. // 外线挂机
  130. if(LineState == VIRTUAL_LINE_STATE_FREE && SubCall == SESSION_INVALID_SUB_CALL)
  131. {
  132. CMC::GetInstance().dropCall(m_pAssoLine->devId(), false);
  133. end(false, NULL);
  134. return;
  135. } // end if
  136. if(SubCall != m_PendingCallId) // 其它呼叫信息
  137. return;
  138. // 根据线路状态进行处理
  139. switch(LineState)
  140. {
  141. case VIRTUAL_LINE_STATE_FREE: // 呼叫失败
  142. {
  143. end(false, NULL);
  144. }
  145. break;
  146. case VIRTUAL_LINE_STATE_RING_BACK: // 呼出振铃
  147. {
  148. _notifyOpProcess(m_pHostLine->lineId(), m_pAssoLine->lineId(), m_PeerLineType, lpCallerNum, lpCalleeNum);
  149. }
  150. break;
  151. case VIRTUAL_LINE_STATE_TALKING: // 呼叫成功
  152. {
  153. end(true, NULL);
  154. }
  155. break;
  156. } // end switch
  157. }