多数据源中间件标准版1.0

OpTransfer.cpp 2.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. #include "StdAfx.h"
  2. #include "OpTransfer.h"
  3. #include "VirtualChan.h"
  4. #include "OperationReactor.h"
  5. #include "FsProxy.h"
  6. COpTransfer::COpTransfer(COperationReactor* pParent, LONG Instance) : COperation(pParent, Instance), m_pHostExtChan(NULL)
  7. {
  8. }
  9. COpTransfer::~COpTransfer(void)
  10. {
  11. }
  12. /*****************************************************************
  13. **【函数名称】 _end
  14. **【函数功能】 操作完成
  15. **【参数】 IsSucceed 操作是否成功
  16. lpData 随路数据
  17. **【返回值】
  18. ****************************************************************/
  19. void COpTransfer::_end( bool IsSucceed )
  20. {
  21. if(IsSucceed)
  22. {
  23. LOGGER(LOG_LEVEL_NORMAL, _T("{OpTransfer}: 分机[%lu]转移成功, DestNum = %s"), m_pHostExtChan->no(), m_DestNumber);
  24. }
  25. else
  26. {
  27. LOGGER(LOG_LEVEL_WARNING, _T("{OpTransfer}: 分机[%lu]转移失败, DestNum = %s"), m_pHostExtChan->no(), m_DestNumber);
  28. }
  29. // 返回执行结果
  30. if(m_InstanceCancel != FS_LINK_INSTANCE_INVALID)
  31. m_pParent->onOpResult(m_InstanceCancel, !IsSucceed);
  32. m_pParent->onOpResult(m_Instance, this, IsSucceed);
  33. }
  34. /*****************************************************************
  35. **【函数名称】 start
  36. **【函数功能】 执行操作
  37. **【参数】
  38. **【返回值】
  39. *****************************************************************/
  40. bool COpTransfer::start( LineOpParam* pParam )
  41. {
  42. // 校验状态
  43. if(m_pHostChan->state() != CHAN_LOGIC_STATE_TALKING)
  44. return false;
  45. // 获取待转移的通道
  46. CVirtualChan* pDestChan = CFsProxy::GetInstance().getAssoChanInSession(m_pHostChan);
  47. if(pDestChan == NULL || pDestChan->currOp() != NULL)
  48. return false;
  49. // 保存被叫信息
  50. CString CallerNum = pParam->szParam1;
  51. m_DestNumber = pParam->szParam2;
  52. m_pHostExtChan = m_pHostChan;
  53. detachHostChan();
  54. attachHostChan(pDestChan);
  55. // 通知启动日志
  56. LOGGER(LOG_LEVEL_NORMAL, _T("{OpConsult}: 分机[%lu]执行转移, DestNum = %s"), m_pHostExtChan->no(), m_DestNumber);
  57. return CFsProxy::GetInstance().transfer(uniqueId(), pDestChan, m_DestNumber);
  58. }
  59. /*****************************************************************
  60. **【函数名称】 onBackgroudJobDone
  61. **【函数功能】 后台命令执行结束事件处理
  62. **【参数】
  63. **【返回值】
  64. *****************************************************************/
  65. void COpTransfer::onBackgroudJobDone( PBG_JOB_NOTIFY pNotify )
  66. {
  67. if(strstr(pNotify->JobBody, ESL_JOB_DONE_RES_FAILED) != NULL)
  68. _end(false);
  69. }
  70. /*****************************************************************
  71. **【函数名称】 onSessionChanStateUpdated
  72. **【函数功能】 同会话中通道状态更新处理
  73. **【参数】
  74. **【返回值】
  75. *****************************************************************/
  76. void COpTransfer::onSessionChanStateUpdated( CVirtualChan* pChan )
  77. {
  78. if(pChan == m_pHostExtChan)
  79. return;
  80. switch(pChan->state())
  81. {
  82. case CHAN_LOGIC_STATE_RING_BACK:
  83. case CHAN_LOGIC_STATE_ALERTING:
  84. m_pParent->onOpProcess(m_Instance, m_pHostChan->no(), pChan->no(), pChan->type(), pChan->callerNum(), pChan->calleeNum());
  85. break;
  86. case CHAN_LOGIC_STATE_TALKING:
  87. _end(true);
  88. break;
  89. case CHAN_LOGIC_STATE_FREE:
  90. _end(false);
  91. }
  92. }