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

VirtualProxy.cpp 2.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. #include "StdAfx.h"
  2. #include "VirtualProxy.h"
  3. #include "ReqBase.h"
  4. CVirtualProxy::CVirtualProxy(CProxyShell* pParent, CRDRID DevId) :
  5. m_pParent(pParent), m_DevId(DevId), m_pLineReq(NULL), m_State(VIRTUAL_LINE_STATE_FREE), m_ActiveCallId(0), m_IsInvalid(false)
  6. {
  7. }
  8. /*****************************************************************
  9. **【函数名称】 isIdle
  10. **【函数功能】 代理是否线路空闲
  11. **【参数】
  12. **【返回值】
  13. ****************************************************************/
  14. bool CVirtualProxy::isIdle( void ) const
  15. {
  16. if(m_State == VIRTUAL_LINE_STATE_FREE && m_ActiveCallId == 0)
  17. return true;
  18. else
  19. return false;
  20. }
  21. /*****************************************************************
  22. **【函数名称】 onDevChEvent
  23. **【函数功能】 物理线路向上层发送的设备主动事件
  24. **【参数】 nEvtType 事件类型
  25. lpContent 事件内容
  26. **【返回值】
  27. *****************************************************************/
  28. void CVirtualProxy::onDevChEvent( DEV_CH_EVT_TYPE EvtType, LPCTSTR lpContent )
  29. {
  30. if(m_pLineReq != NULL)
  31. m_pLineReq->onDevChEvent(this, EvtType, lpContent);
  32. }
  33. /*****************************************************************
  34. **【函数名称】 onLineStateChanged
  35. **【函数功能】 线路状态变化事件处理
  36. **【参数】 nCall 主会话ID
  37. nSubCall 子会话ID
  38. nStatus 线路基本状态
  39. lpCallerNum 主叫号码
  40. lpCalleeNum 被叫号码
  41. **【返回值】
  42. ****************************************************************/
  43. void CVirtualProxy::onLineStateChanged( long Call, long SubCall, VIRTUAL_LINE_STATE State, LPCTSTR lpCallerNum, LPCTSTR lpCalleeNum )
  44. {
  45. // 子呼叫空闲状态过滤(只处理操作)
  46. if(m_pLineReq != NULL && SubCall != SESSION_INVALID_SUB_CALL && State == VIRTUAL_LINE_STATE_FREE)
  47. {
  48. m_pLineReq->onLineStateChanged(this, State, Call, SubCall, lpCallerNum, lpCalleeNum);
  49. return;
  50. } // end if
  51. // 处理线路状事件
  52. _procLineState(Call, SubCall, State, lpCallerNum, lpCalleeNum);
  53. // 保存呼叫信息
  54. m_State = State;
  55. m_CallerNum = lpCallerNum;
  56. m_CalleeNum = lpCalleeNum;
  57. m_ActiveCallId = (State == VIRTUAL_LINE_STATE_FREE) ? SESSION_INVALID_CALL : Call;
  58. // 委托操作执行
  59. if(m_pLineReq != NULL)
  60. m_pLineReq->onLineStateChanged(this, State, Call, SubCall, lpCallerNum, lpCalleeNum);
  61. if (State == VIRTUAL_LINE_STATE_TALKING)
  62. {
  63. LOGGER(LOG_CLASS_DEV, LOG_LEVEL_NORMAL, _T("{CVirtualProxy}: 通知线路通话, Caller = %s, Callee = %s,SessionCode=%lu"), m_CallerNum, m_CalleeNum, m_ActiveCallId);
  64. }
  65. // 通知业务逻辑线路状态变化事件
  66. _notifyLineState();
  67. }
  68. /*****************************************************************
  69. **【函数名称】 onNewCall
  70. **【函数功能】 线路进入会话事件
  71. **【参数】 nCall 线路当前所属的主会话ID
  72. nSubCall 线路当前所属的子会话ID
  73. **【返回值】
  74. ****************************************************************/
  75. void CVirtualProxy::onNewCall( long Call, long SubCall )
  76. {
  77. m_ActiveCallId = Call;
  78. }