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

LeaveWordReq.cpp 3.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. #include "StdAfx.h"
  2. #include "LeaveWordReq.h"
  3. #include "ProxyExten.h"
  4. #include "MC.h"
  5. #include "SessionShell.h"
  6. #include "ProxyShell.h"
  7. CLeaveWordReq::CLeaveWordReq(CProxyShell* pParent, CPduEntity& ReqPdu) : CReqBase(pParent, ReqPdu)
  8. {
  9. }
  10. CLeaveWordReq::~CLeaveWordReq(void)
  11. {
  12. }
  13. /*****************************************************************
  14. **【函数名称】 request
  15. **【函数功能】 发出请求(命令方式)
  16. **【参数】
  17. **【返回值】
  18. ****************************************************************/
  19. bool CLeaveWordReq::request( void )
  20. {
  21. // 线路是否在通话中
  22. if(m_pHostLine->state() != VIRTUAL_LINE_STATE_TALKING)
  23. return false;
  24. UINT LimitTime = m_ReqPdu.GetDataUInt(3);
  25. CString FinishKey = m_ReqPdu.GetDataString(4);
  26. m_FileName = m_ReqPdu.GetDataString(5);
  27. // 录音启动日志
  28. LOGGER(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{LineReq}: 中继线路[%lu]留言, FileName = %s, LimitTime = %lu(s), FinishKey = '%s'"),
  29. m_pHostLine->lineId(), m_FileName, LimitTime, FinishKey);
  30. // 初始化留言内容
  31. RecordContent content;
  32. memset(&content, 0, sizeof(RecordContent));
  33. lstrcpy(content.szFileName, m_FileName);
  34. content.nPeriod = LimitTime;
  35. content.cEnd = FinishKey[0];
  36. // 启动留言
  37. return CSessionShell::GetInstance().procReqLeaveWord(m_pHostLine->activeCallId(), m_pHostLine->devId(), &content);
  38. }
  39. /*****************************************************************
  40. **【函数名称】 cancel
  41. **【函数功能】 请求取消
  42. **【参数】
  43. **【返回值】
  44. ****************************************************************/
  45. bool CLeaveWordReq::cancel( long InstanceCancel )
  46. {
  47. // 留言停止日志
  48. LOGGER(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{LineReq}: 中继线路[%lu]留言取消, FileName = %s"),
  49. m_pHostLine->lineId(), m_FileName);
  50. m_InstanceCancel = InstanceCancel;
  51. CMC::GetInstance().stopRecord(m_pHostLine->devId());
  52. end(false, NULL);
  53. return true;
  54. }
  55. /*****************************************************************
  56. **【函数名称】 end
  57. **【函数功能】 操作完成
  58. **【参数】 IsSucceed 操作是否成功
  59. lpData 随路数据
  60. **【返回值】
  61. ****************************************************************/
  62. void CLeaveWordReq::end( bool IsSucceed, LPCTSTR lpData )
  63. {
  64. if(IsSucceed)
  65. {
  66. LOGGER(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{LineReq}: 中继线路[%lu]留言成功, FileName = %s"),
  67. m_pHostLine->lineId(), m_FileName);
  68. }
  69. else
  70. {
  71. LOGGER(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{LineReq}: 中继线路[%lu]留言结束, FileName = %s"),
  72. m_pHostLine->lineId(), m_FileName);
  73. } // end if
  74. // 返回执行结果
  75. if(m_InstanceCancel != 0)
  76. {
  77. m_pParent->notifyReqResult(m_ReqPdu, m_InstanceCancel, !IsSucceed, lpData);
  78. } // end if
  79. m_pParent->onLineReqEnd(this, IsSucceed, lpData);
  80. }
  81. /*****************************************************************
  82. **【函数名称】 onDevChEvent
  83. **【函数功能】 线路向上层发送的设备主动事件
  84. **【参数】 pEventLine 触发事件的线路
  85. EvtType 事件类型
  86. lpContent 事件内容
  87. **【返回值】
  88. *****************************************************************/
  89. void CLeaveWordReq::onDevChEvent( CVirtualProxy* pEventLine, DEV_CH_EVT_TYPE EvtType, LPCTSTR lpContent )
  90. {
  91. if(EvtType == DEV_CH_EVT_REC_END)
  92. end(true, lpContent);
  93. }
  94. /*****************************************************************
  95. **【函数名称】 onLineStateChanged
  96. **【函数功能】 线路状态变化事件响应接口
  97. **【参数】 pEventLine 状态变化的线路实体指针
  98. LineState 线路当前状态
  99. Call 主呼叫ID
  100. SubCall 子呼叫ID
  101. lpCallerNum 主叫号码
  102. lpCalleeNum 被叫号码
  103. **【返回值】
  104. ****************************************************************/
  105. void CLeaveWordReq::onLineStateChanged( CVirtualProxy* pEventLine, VIRTUAL_LINE_STATE LineState, long Call, long SubCall, LPCTSTR lpCallerNum, LPCTSTR lpCalleeNum )
  106. {
  107. // 正在留言时外线挂机
  108. if(LineState == VIRTUAL_LINE_STATE_FREE)
  109. end(true, NULL);
  110. }