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

TurnAgentReq.cpp 5.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. #include "StdAfx.h"
  2. #include "TurnAgentReq.h"
  3. #include "ProxyExten.h"
  4. #include "SessionShell.h"
  5. #include "ControlShell.h"
  6. #include "ProxyShell.h"
  7. #include "MC.h"
  8. CTurnAgentReq::CTurnAgentReq(CProxyShell* pParent, CPduEntity& ReqPdu) : CReqBase(pParent, ReqPdu),
  9. m_pAssoLine(NULL), m_PendingCallId(SESSION_INVALID_SUB_CALL)
  10. {
  11. }
  12. CTurnAgentReq::~CTurnAgentReq(void)
  13. {
  14. }
  15. /*****************************************************************
  16. **【函数名称】 request
  17. **【函数功能】 发出请求(命令方式)
  18. **【参数】
  19. **【返回值】
  20. ****************************************************************/
  21. bool CTurnAgentReq::request( void )
  22. {
  23. // 校验状态
  24. if(m_pHostLine->state() != VIRTUAL_LINE_STATE_TALKING)
  25. return false;
  26. // 获取分机号
  27. m_ExtenNum = m_ReqPdu.GetDataString(3);
  28. UINT ExtenNo = 0;
  29. sscanf_s(m_ExtenNum, _T("%u"), &ExtenNo);
  30. // 根据被叫号码查找对端线路且修正被叫号码
  31. m_pAssoLine = m_pParent->getProxyExtenWrapped(ExtenNo);
  32. if(m_pAssoLine == NULL)
  33. {
  34. LOGGER(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{LineReq}: 中继[%lu]转坐席失败, 查找分机线路[%lu]失败"),
  35. m_pHostLine->lineId(), ExtenNo);
  36. return false;
  37. } // end if
  38. if(m_pAssoLine->state() != VIRTUAL_LINE_STATE_FREE)
  39. {
  40. LOGGER(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{LineReq}: 中继[%lu]转坐席失败, 分机线路[%lu]非空闲"), m_pHostLine->lineId(), ExtenNo);
  41. return false;
  42. }
  43. // 通知启动日志
  44. LOGGER(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{LineReq}: 中继[%lu]转坐席, ExtenNum = %u, HostCall = %ld"),
  45. m_pHostLine->lineId(), ExtenNo, m_pHostLine->activeCallId());
  46. // 开始建立转移
  47. PendingCallInfo info;
  48. memset(&info, 0, sizeof(PendingCallInfo));
  49. info.nCall = m_pHostLine->activeCallId();
  50. info.nHostLine = m_pHostLine->devId();
  51. info.nAssoLine = m_pAssoLine->devId();
  52. lstrcpy(info.szCallerNum, m_pHostLine->callerNum());
  53. lstrcpy(info.szCalleeNum, m_ExtenNum);
  54. lstrcpy(info.szPreCallerNum, m_pHostLine->callerNum());
  55. lstrcpy(info.szPreCalleeNum, m_pHostLine->calleeNum());
  56. info.nCallType = PENDING_CALL_DIRECT;
  57. info.nHostLineStatus = VIRTUAL_LINE_STATE_TALKING;
  58. info.nSipAccountId = INVALID_ID_SIP_ACCOUNT;
  59. return CSessionShell::GetInstance().procReqDialSetup(m_PendingCallId, &info);
  60. }
  61. /*****************************************************************
  62. **【函数名称】 hangUp
  63. **【函数功能】 操作中挂机(命令方式)
  64. **【参数】
  65. **【返回值】
  66. ****************************************************************/
  67. bool CTurnAgentReq::hangUp( long InstanceHangUp )
  68. {
  69. // 转座席取消日志
  70. LOGGER(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, __T("{LineReq}: 中继[%lu]因挂机取消转坐席, ExtenNum = %s"),
  71. m_pHostLine->lineId(), m_ExtenNum);
  72. m_InstanceCancel = InstanceHangUp;
  73. return CMC::GetInstance().dropCall(m_pAssoLine->devId(), false);
  74. }
  75. /*****************************************************************
  76. **【函数名称】 end
  77. **【函数功能】 操作完成
  78. **【参数】 IsSucceed 操作是否成功
  79. lpData 随路数据
  80. **【返回值】
  81. ****************************************************************/
  82. void CTurnAgentReq::end( bool IsSucceed, LPCTSTR lpData )
  83. {
  84. if(IsSucceed)
  85. {
  86. LOGGER(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{LineReq}: 中继[%lu]转坐席成功, ExtenNum = %s"), m_pHostLine->lineId(), m_ExtenNum);
  87. }
  88. else
  89. {
  90. LOGGER(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{LineReq}: 中继[%lu]转坐席失败, ExtenNum = %s"), m_pHostLine->lineId(), m_ExtenNum);
  91. } // end if
  92. // 返回执行结果
  93. if(m_InstanceCancel != 0)
  94. {
  95. m_pParent->notifyReqResult(m_ReqPdu, m_InstanceCancel, !IsSucceed, lpData);
  96. } // end if
  97. m_pParent->onLineReqEnd(this, IsSucceed, lpData);
  98. }
  99. /*****************************************************************
  100. **【函数名称】 onDevChEvent
  101. **【函数功能】 线路向上层发送的设备主动事件
  102. **【参数】 pEventLine 触发事件的线路
  103. EvtType 事件类型
  104. lpContent 事件内容
  105. **【返回值】
  106. *****************************************************************/
  107. void CTurnAgentReq::onDevChEvent( CVirtualProxy* pEventLine, DEV_CH_EVT_TYPE EvtType, LPCTSTR lpContent )
  108. {
  109. // TODO: do nothing
  110. }
  111. /*****************************************************************
  112. **【函数名称】 onLineStateChanged
  113. **【函数功能】 线路状态变化事件响应接口
  114. **【参数】 pEventLine 状态变化的线路实体指针
  115. LineState 线路当前状态
  116. Call 主呼叫ID
  117. SubCall 子呼叫ID
  118. lpCallerNum 主叫号码
  119. lpCalleeNum 被叫号码
  120. **【返回值】
  121. ****************************************************************/
  122. void CTurnAgentReq::onLineStateChanged( CVirtualProxy* pEventLine, VIRTUAL_LINE_STATE LineState, long Call, long SubCall, LPCTSTR lpCallerNum, LPCTSTR lpCalleeNum )
  123. {
  124. // 外线挂机
  125. if(LineState == VIRTUAL_LINE_STATE_FREE && SubCall == SESSION_INVALID_SUB_CALL)
  126. {
  127. CMC::GetInstance().dropCall(m_pAssoLine->devId(), false);
  128. end(false, NULL);
  129. return;
  130. } // end if
  131. if(SubCall != m_PendingCallId) // 其它呼叫信息
  132. return;
  133. // 根据线路状态进行处理
  134. switch(LineState)
  135. {
  136. case VIRTUAL_LINE_STATE_FREE: // 呼叫失败
  137. {
  138. end(false, NULL);
  139. }
  140. break;
  141. case VIRTUAL_LINE_STATE_RING_BACK: // 呼出振铃
  142. {
  143. _notifyOpProcess(m_pHostLine->lineId(), m_pAssoLine->lineId(), DEV_RES_TYPE_EXT, lpCallerNum, lpCalleeNum);
  144. }
  145. break;
  146. case VIRTUAL_LINE_STATE_TALKING: // 呼叫成功
  147. {
  148. end(true, NULL);
  149. }
  150. break;
  151. } // end switch
  152. }