linux版本中间件

OpMakeCall.cpp 4.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. #include "OpMakeCall.h"
  2. #include "ChanExten.h"
  3. #include "OperationReactor.h"
  4. #include "FsProxy.h"
  5. COpMakeCall::COpMakeCall(COperationReactor* pParent, long Instance) : COperation(pParent, Instance)
  6. {
  7. }
  8. COpMakeCall::~COpMakeCall(void)
  9. {
  10. }
  11. bool COpMakeCall::start(LineOpParam * pParam)
  12. {
  13. // 校验状态
  14. if (m_pHostChan->state() != CHAN_LOGIC_STATE_FREE)
  15. return false;
  16. // 保存主被叫信息
  17. std::string CallerNum = pParam->szParam1;
  18. m_DestNumber = pParam->szParam2;
  19. std::string ExtenNum = std::to_string(m_pHostChan->no());
  20. // 不能呼叫自己
  21. if (ExtenNum == m_DestNumber)
  22. {
  23. LOG_WARN(("{OpMakeCall}: 分机[%lu]执行呼叫失败, 禁止分机自呼"), m_pHostChan->no());
  24. return false;
  25. }
  26. // 通知启动日志
  27. LOG_INFO(("{OpMakeCall}: 分机[%lu]执行呼叫, DestNum = %s"), m_pHostChan->no(), m_DestNumber.c_str());
  28. //m_pHostChan->opNumber() = pParam->szParam2;
  29. m_Caller = CallerNum;
  30. m_CallerAgent = CFsProxy::GetInstance().getAgentByExten(m_Caller);
  31. m_Callee = m_DestNumber;
  32. m_CalleeAgent = CFsProxy::GetInstance().getAgentByExten(m_Callee);
  33. m_OpTime = Util::CurTime();
  34. return CFsProxy::GetInstance().ExtenCall(uniqueId(), m_pHostChan, CallerNum, m_DestNumber);
  35. }
  36. bool COpMakeCall::start(PCHAN_EVENT_NOTIFY pNotify)
  37. {
  38. std::string CallerNum;
  39. CallerNum = std::to_string(m_pHostChan->no());
  40. m_DestNumber = pNotify->Callee;
  41. // 不能呼叫自己
  42. if (CallerNum == m_DestNumber)
  43. {
  44. LOG_WARN(("{OpMakeCall}: 分机[%lu]电话呼叫失败, 禁止分机自呼"), m_pHostChan->no());
  45. return false;
  46. }
  47. // 检测目标分机状态
  48. uint32_t DestExtenNoInt;
  49. sscanf(pNotify->Callee.c_str(), "%lu", &DestExtenNoInt);
  50. ChanExten* pDestExten = CFsProxy::GetInstance().getExten(DestExtenNoInt);
  51. if (pDestExten != nullptr && !pDestExten->isFree())
  52. {
  53. LOG_WARN(("{OpMakeCall}: 分机[%lu]电话呼叫失败, 目标分机[%lu]非空闲"), m_pHostChan->no(), DestExtenNoInt);
  54. return false;
  55. }
  56. // 通知启动日志
  57. LOG_INFO(("{OpMakeCall}: 分机[%lu]执行电话呼叫, DestNum = %s"), m_pHostChan->no(), m_DestNumber.c_str());
  58. m_Caller = CallerNum;
  59. m_CallerAgent = CFsProxy::GetInstance().getAgentByExten(m_Caller);
  60. m_Callee = m_DestNumber;
  61. m_CalleeAgent = CFsProxy::GetInstance().getAgentByExten(m_Callee);
  62. m_OpTime = Util::CurTime();
  63. // 通知手动外呼启动事件
  64. m_pParent->onOpFromDev(m_pHostChan, DEV_OP_CALL_OUT, CallerNum, m_DestNumber);
  65. return true;
  66. }
  67. bool COpMakeCall::hangup(long InstanceHangup)
  68. {
  69. LOG_INFO(("{OpHoldon}: 分机[%lu]呼叫中挂机"), m_pHostChan->no());
  70. if (m_pHostChan->isFree())
  71. return false;
  72. m_InstanceCancel = InstanceHangup;
  73. return CFsProxy::GetInstance().kill(uniqueId(), m_pHostChan);
  74. }
  75. void COpMakeCall::onBackgroudJobDone(PBG_JOB_NOTIFY pNotify)
  76. {
  77. if (pNotify->JobCmd == ESL_CMD_MAKE_CALL)
  78. {
  79. if(pNotify->JobBody.find(ESL_JOB_DONE_RES_OK) == string::npos)
  80. _end(false);
  81. }
  82. else
  83. {
  84. if (pNotify->JobBody.find(ESL_JOB_DONE_RES_OK) == string::npos)
  85. m_pParent->onOpResult(m_InstanceCancel, false);
  86. else
  87. _end(false);
  88. }
  89. }
  90. void COpMakeCall::onHostChanStateUpdated(VirtualChan * pHostChan)
  91. {
  92. if(pHostChan == m_pHostChan)
  93. if (pHostChan->state() == CHAN_LOGIC_STATE_FREE)
  94. _end(false);
  95. }
  96. void COpMakeCall::onSessionChanStateUpdated(VirtualChan * pChan)
  97. {
  98. if (pChan == nullptr)
  99. return;
  100. switch ((int)pChan->state())
  101. {
  102. case CHAN_LOGIC_STATE_RING_BACK: // 座席呼叫外线 //给西亚斯改动
  103. case CHAN_LOGIC_STATE_ALERTING: // 座席呼叫座席
  104. m_pParent->onOpProcess(m_Instance, m_pHostChan->no(), pChan->no(), pChan->type(), pChan->callerNum(), pChan->calleeNum());
  105. break;
  106. case CHAN_LOGIC_STATE_TALKING:
  107. _end(true);
  108. break;
  109. case CHAN_LOGIC_STATE_FREE:
  110. _end(false);
  111. }
  112. }
  113. void COpMakeCall::_end(bool IsSucceed)
  114. {
  115. if (IsSucceed)
  116. {
  117. LOG_INFO(("{OpMakeCall}: 分机[%lu]呼叫成功, DestNum = %s"), m_pHostChan->no(), m_DestNumber.c_str());
  118. }
  119. else
  120. {
  121. LOG_WARN(("{OpMakeCall}: 分机[%lu]呼叫失败, DestNum = %s"), m_pHostChan->no(), m_DestNumber.c_str());
  122. }
  123. m_SessionId = m_pHostChan->sessionId();
  124. SqlWrite::GetInstance()->addSql(toSql(IsSucceed, "外呼"));
  125. // 返回执行结果
  126. if (m_InstanceCancel != FS_LINK_INSTANCE_INVALID)
  127. m_pParent->onOpResult(m_InstanceCancel, !IsSucceed);
  128. m_pParent->onOpResult(m_Instance, this, IsSucceed, std::to_string(m_pHostChan->no()));
  129. }