升龙物业 老版本 ocx IPO, 加密狗 转值班电话

MeetingReq.cpp 5.3KB

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