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

CallSession.h 4.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. /*************************************************************************
  2. 【文件名】 CallSession.h
  3. 【功能模块和目的】 呼叫会话类头文件
  4. 【开发者及日期】 郑石诺 2015/03/31
  5. 【版本】 V1.0.0
  6. 【版权信息】 Copyright (C)2015 河南华谊网络科技有限公司
  7. 【更改记录】
  8. *************************************************************************/
  9. #pragma once
  10. #include"../Public/GlobalDef/TemplateTimer.h"
  11. class CSubSession;
  12. class CMC;
  13. class CProxyShell;
  14. /*************************************************************************
  15. 【类名】 CCallSession
  16. 【功能】
  17. 【接口说明】 呼叫会话类
  18. 【开发者及日期】 郑石诺 2015/03/31
  19. 【版本】 V1.0.0
  20. 【版权信息】 Copyright (C)2015 河南华谊网络科技有限公司
  21. 【更改记录】
  22. *************************************************************************/
  23. class CCallSession
  24. {
  25. public:
  26. CCallSession(long SessionId);
  27. ~CCallSession(void);
  28. // 属性相关
  29. long id(void) const { return m_Id; } // 会话ID
  30. UINT lineCount(void) const { return m_LineMap.GetCount(); } // 当前会话中活动线路的个数
  31. DEV_RES_ID getPeerLine(CRDRID LineId); // 获取当前线路关联的对端线路
  32. bool isExist(CRDRID LineId, CALL_PARTY_TYPE PartyType); // 指定职责的线路是否在会话中
  33. // 线路操作相关
  34. bool insertLine(CRDRID LineId, CALL_PARTY_TYPE PartyType, bool IsLink); // 添加线路到会话
  35. bool insertLine(CRDRID LineId, UINT SessionId, bool IsLink); // 添加待定线路到会话
  36. bool insertLine(CRDRID HostLineId, CRDRID SrcLineId, bool IsLink); // 添加监听线路到会话
  37. void removeLine(CRDRID LineId, CALL_PARTY_TYPE PartyType, PENDING_CALL_TYPE CallType = PENDING_CALL_DIRECT); // 从会话中删除指定线路
  38. // 逻辑处理
  39. bool trans2Meeting(CRDRID HostLineId); // 将当前会话转换为会议
  40. // 事件响应
  41. void onLineStateChanged(CRDRID LineId, VIRTUAL_LINE_STATE LineState, LPCTSTR lpCallerNum, LPCTSTR lpCalleeNum); // 线路状态事件
  42. void onRecordStop(CRDRID LineId, UINT TaskId); // 录音停止事件
  43. // 业务逻辑操作调用
  44. bool setupPendingCall(long& SubCall, PendingCallInfo* pInfo); // 启动待处理呼叫
  45. bool lineLeave(CRDRID LineId); // 指定线路退出会话且挂机
  46. bool lineInstead(CRDRID HostLine, CRDRID PeerLine, UINT ExtNum); // 代接指定线路
  47. bool lineIntercept(CRDRID HostLine, CRDRID PeerLine); // 替换通话中的线路
  48. bool lineInsert(CRDRID HostLine, CRDRID PeerLine); // 插入线路到会话
  49. bool lineListen(CRDRID HostLine, CRDRID PeerLine); // 监听线路
  50. bool lineRecord(CRDRID HostLine, LPCTSTR lpFileName); // 线路录音启动
  51. bool lineLeaveWord(CRDRID HostLine, RecordContent* pContent); // 留言启动
  52. bool lineMute(CRDRID HostLine, bool IsOn); // 静音控制
  53. bool lineConsultConfirm(CRDRID PeerLine, UINT Type); // 协商呼叫确认
  54. bool line2Meeting(DEV_RES_ID LineId, CALL_PARTY_TYPE Party); // 通话线路转入会议
  55. private:
  56. // 呼叫相关
  57. CALL_PARTY_TYPE __isLineMine(CRDRID LineId); // 指定线路是否属于当前会话
  58. void __detachListen(CRDRID HostLine); // 解除指定线路的监听
  59. CSubSession* __getSubSession(CRDRID PendingLine); // 通过待处理线路ID查找子呼叫
  60. void __clearSubSession(void); // 释放所有子会话
  61. void __notifySubSessionLineFree(CRDRID LineId); // 通知子会话相关线路空闲
  62. // 通话相关
  63. bool __line2Link(CRDRID LineId, CRDRID LinePeer); // 线路进入双向通话
  64. bool __lineRecord(CRDRID HostLine, LPCTSTR lpFileName); // 执行录音操作
  65. bool __lineMute(CRDRID HostLine, bool IsOn); // 线路静音操作
  66. bool __meetingMute(CRDRID HostLine, bool IsOn); // 会议静音操作
  67. // 对线路状态进行分类处理
  68. void __onLineStateFree(CRDRID LineId, LPCTSTR lpCallerNum, LPCTSTR lpCalleeNum);
  69. void __onLineStateRingBack(CRDRID LineId, LPCTSTR lpCallerNum, LPCTSTR lpCalleeNum);
  70. void __onLineStateAlerting(CRDRID LineId, LPCTSTR lpCallerNum, LPCTSTR lpCalleeNum);
  71. void __onLineStateProgressing(CRDRID LineId, LPCTSTR lpCallerNum, LPCTSTR lpCalleeNum);
  72. void __onLineStateTalking(CRDRID LineId, LPCTSTR lpCallerNum, LPCTSTR lpCalleeNum);
  73. private:
  74. // 业务属性
  75. long m_Id; // 会话ID
  76. UINT m_SubCallIndex; // 要生成的子呼叫的基础索引值
  77. MeetingInfo m_MeetingId; // 会话关联的会议ID(0 -> 未关联会议)
  78. // 线路属性
  79. DEV_RES_ID m_LineHost; // 会话的主控线路
  80. DEV_RES_ID m_LinePeer; // 通话的对端线路
  81. CMap<DEV_RES_ID, CRDRID, UINT, UINT> m_PendingLineMap; // 正在进行操作处理的线路(Key = 被操作线路, Value = 子会话ID)
  82. CMap<DEV_RES_ID, CRDRID, DEV_RES_ID, CRDRID> m_ListenLineMap; // 正在监听通话的线路(Key = 监听线路, Value = 被监听线路)
  83. CMap<DEV_RES_ID, CRDRID, CString, LPCTSTR> m_RecordMap; // 当前会话中的录音索引表
  84. CMap<DEV_RES_ID, CRDRID, int, int> m_LineMap; // 保存所有在会话中的线路
  85. // 当前呼叫中子会话索引表
  86. CMap<UINT, UINT, CSubSession*, CSubSession*> m_SubCallMap; // 保存所有子会话(Key = 子会话ID, Value = 子会话)
  87. TTimer<CCallSession> m_SessionTimer; // 会话定时器
  88. void __onTimerPostProcessing(void); // 到时处理
  89. void __setTimer(UINT TimmerId, UINT Elapse);
  90. void __killTimer(UINT TimmerId);
  91. };