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

InterceptReq.cpp 4.3KB

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