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

InsertReq.cpp 4.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. #include "StdAfx.h"
  2. #include "InsertReq.h"
  3. #include "ProxyExten.h"
  4. #include "MC.h"
  5. #include "SessionShell.h"
  6. #include "ProxyShell.h"
  7. CInsertReq::CInsertReq(CProxyShell* pParent, CPduEntity& ReqPdu) : CReqBase(pParent, ReqPdu), m_pAssoLine(NULL), m_PendingCallId(0)
  8. {
  9. }
  10. CInsertReq::~CInsertReq(void)
  11. {
  12. }
  13. /*****************************************************************
  14. **【函数名称】 request
  15. **【函数功能】 发出请求(命令方式)
  16. **【参数】
  17. **【返回值】
  18. ****************************************************************/
  19. bool CInsertReq::request( void )
  20. {
  21. // 校验状态
  22. if(m_pHostLine->state() != VIRTUAL_LINE_STATE_FREE)
  23. return false;
  24. // 查找被插的线路
  25. UINT DestId = m_ReqPdu.GetDataUInt(3);
  26. m_pAssoLine = m_pParent->getProxyExtenWrapped(DestId);
  27. if(m_pAssoLine == NULL)
  28. {
  29. LOGGER(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{LineReq}: 分机[%lu]强插失败, 查找关联线路失败, DestExten = %lu"),
  30. m_pHostLine->lineId(), DestId);
  31. return false;
  32. }
  33. // 呼叫是否存在、被强插线路状态校验
  34. m_PendingCallId = m_pAssoLine->activeCallId();
  35. if(m_PendingCallId == 0 || m_pAssoLine->state() != VIRTUAL_LINE_STATE_TALKING)
  36. {
  37. LOGGER(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{LineReq}: 分机[%lu]强插失败, 目标分机[%lu]未在通话中"),
  38. m_pHostLine->lineId(), DestId);
  39. return false;
  40. }
  41. LOGGER(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{LineReq}: 分机[%lu]强插, DestExten = %lu"), m_pHostLine->lineId(), DestId);
  42. CString CallerNum;
  43. CallerNum.Format(_T("%lu"), m_pHostLine->lineId());
  44. // 启动操作
  45. return CMC::GetInstance().offHook(m_pHostLine->devId(), true, CallerNum);
  46. }
  47. /*****************************************************************
  48. **【函数名称】 hangUp
  49. **【函数功能】 操作中挂机(命令方式)
  50. **【参数】
  51. **【返回值】
  52. ****************************************************************/
  53. bool CInsertReq::hangUp( long InstanceHangUp )
  54. {
  55. LOGGER(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{LineReq}: 分机[%lu]强插因挂机取消, DestExten = %lu"),
  56. m_pHostLine->lineId(), m_pAssoLine->lineId());
  57. m_InstanceCancel = InstanceHangUp;
  58. return CMC::GetInstance().dropCall(m_pHostLine->devId(), false);
  59. }
  60. /*****************************************************************
  61. **【函数名称】 end
  62. **【函数功能】 操作完成
  63. **【参数】 IsSucceed 操作是否成功
  64. lpData 随路数据
  65. **【返回值】
  66. ****************************************************************/
  67. void CInsertReq::end( bool IsSucceed, LPCTSTR lpData )
  68. {
  69. if(IsSucceed)
  70. {
  71. LOGGER(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{LineReq}: 分机[%lu]强插成功, DestExten = %lu"),
  72. m_pHostLine->lineId(), m_pAssoLine->lineId());
  73. }
  74. else
  75. {
  76. LOGGER(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{LineReq}: 分机[%lu]强插失败, DestExten = %lu"),
  77. m_pHostLine->lineId(), m_pAssoLine->lineId());
  78. } // end if
  79. // 返回执行结果
  80. if(m_InstanceCancel != 0)
  81. {
  82. m_pParent->notifyReqResult(m_ReqPdu, m_InstanceCancel, !IsSucceed, lpData);
  83. } // end if
  84. m_pParent->onLineReqEnd(this, IsSucceed, lpData);
  85. }
  86. /*****************************************************************
  87. **【函数名称】 onDevChEvent
  88. **【函数功能】 线路向上层发送的设备主动事件
  89. **【参数】 pEventLine 触发事件的线路
  90. EvtType 事件类型
  91. lpContent 事件内容
  92. **【返回值】
  93. *****************************************************************/
  94. void CInsertReq::onDevChEvent( CVirtualProxy* pEventLine, DEV_CH_EVT_TYPE EvtType, LPCTSTR lpContent )
  95. {
  96. if(EvtType == DEV_CH_EVT_OFF_HOOK && pEventLine == m_pHostLine)
  97. {
  98. // 开始执强插操作
  99. if(CSessionShell::GetInstance().procReqInsert(m_PendingCallId, m_pHostLine->devId(), m_pAssoLine->devId()))
  100. {
  101. end(true, lpContent);
  102. }
  103. else
  104. {
  105. CMC::GetInstance().dropCall(m_pHostLine->devId(), false);
  106. end(false, lpContent);
  107. } // end if
  108. } // end if
  109. }
  110. /*****************************************************************
  111. **【函数名称】 onLineStateChanged
  112. **【函数功能】 线路状态变化事件响应接口
  113. **【参数】 pEventLine 状态变化的线路实体指针
  114. LineState 线路当前状态
  115. Call 主呼叫ID
  116. SubCall 子呼叫ID
  117. lpCallerNum 主叫号码
  118. lpCalleeNum 被叫号码
  119. **【返回值】
  120. ****************************************************************/
  121. void CInsertReq::onLineStateChanged( CVirtualProxy* pEventLine, VIRTUAL_LINE_STATE LineState, long Call, long SubCall, LPCTSTR lpCallerNum, LPCTSTR lpCalleeNum )
  122. {
  123. if(LineState == VIRTUAL_LINE_STATE_FREE)
  124. end(false, NULL);
  125. }