MiddleWares_YiHe 郑州颐和医院随访系统中间件

ChanTrunk.cpp 4.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. #include "StdAfx.h"
  2. #include "ChanTrunk.h"
  3. #include "FsProxy.h"
  4. #include "Operation.h"
  5. CChanTrunk::CChanTrunk(CFsProxy* pParent, UINT ChanNo) : CVirtualChan(pParent, ChanNo), m_pEslHandle(NULL), m_StopConnect(true)
  6. {
  7. }
  8. CChanTrunk::~CChanTrunk(void)
  9. {
  10. }
  11. /*****************************************************************
  12. **【函数名称】 isFree
  13. **【函数功能】 是否空闲
  14. **【参数】
  15. **【返回值】
  16. *****************************************************************/
  17. bool CChanTrunk::isFree( void ) const
  18. {
  19. if (m_State == CHAN_LOGIC_STATE_FREE && m_pOperation != NULL) {
  20. LOGGER(LOG_LEVEL_WARNING, _T("{ChanTrunk}: 通道[%lu]空闲,操作非空"), m_No);
  21. }
  22. return m_State == CHAN_LOGIC_STATE_FREE && m_pOperation == NULL;
  23. }
  24. /*****************************************************************
  25. **【函数名称】 regist
  26. **【函数功能】 注册线路
  27. **【参数】
  28. **【返回值】
  29. *****************************************************************/
  30. void CChanTrunk::regist( void ) const
  31. {
  32. m_pParent->onChanRegist(DEV_RES_TYPE_TRUNK, m_No, m_State);
  33. }
  34. /*****************************************************************
  35. **【函数名称】 onChanEvent
  36. **【函数功能】 通道事件处理
  37. **【参数】
  38. **【返回值】
  39. *****************************************************************/
  40. void CChanTrunk::onChanEvent( PCHAN_EVENT_NOTIFY pNotify )
  41. {
  42. if (pNotify == NULL)
  43. return;
  44. switch(pNotify->EventId)
  45. {
  46. case CHANNEL_EVENT_CREATE:
  47. {
  48. _setSession(pNotify->CallId, pNotify->ChanId);
  49. m_CallerNum = pNotify->Caller;
  50. m_CalleeNum = pNotify->Callee;
  51. CVirtualChan::setTurnkId(this->no());
  52. trunkRecordSession[CVirtualChan::trunkId()] = CVirtualChan::sessionId();
  53. LOGGER(LOG_LEVEL_WARNING, _T("{Line Map存值}: Trunk-SessionId:%s"), trunkRecordSession[CVirtualChan::trunkId()]);
  54. if(pNotify->Direction == CALL_DIRECTION_INBOUND) // 呼入FS
  55. m_State = CHAN_LOGIC_STATE_ALERTING;
  56. else
  57. m_State = CHAN_LOGIC_STATE_DIALING;
  58. }
  59. break;
  60. case CHANNEL_EVENT_PROGRESS:
  61. case CHANNEL_EVENT_PROGRESS_MEDIA:
  62. {
  63. if(pNotify->Direction == CALL_DIRECTION_OUTBOUND) // FS呼出
  64. m_State = CHAN_LOGIC_STATE_RING_BACK;
  65. else
  66. return;
  67. LOGGER(LOG_LEVEL_WARNING, _T("{Line Map存值}: Trunk-SessionId:%s"), trunkRecordSession[CVirtualChan::trunkId()]);
  68. }
  69. break;
  70. case CHANNEL_EVENT_ANSWER:
  71. {
  72. m_State = CHAN_LOGIC_STATE_TALKING;
  73. LOGGER(LOG_LEVEL_WARNING, _T("{Line Map存值}: Trunk-SessionId:%s"), trunkRecordSession[CVirtualChan::trunkId()]);
  74. }
  75. break;
  76. case CHANNEL_EVENT_HANGUP_COMPLETE:
  77. {
  78. m_State = CHAN_LOGIC_STATE_FREE;
  79. _setSession(NULL, NULL);
  80. _reset();
  81. m_StopConnect = true;
  82. m_pEslHandle = NULL;
  83. }
  84. break;
  85. default:
  86. return;
  87. }
  88. #ifdef _DEBUG
  89. LOGGER(LOG_LEVEL_NORMAL, _T("{CChanTrunk}: 中继[%lu]状态更新, state = %d"), m_No, m_State);
  90. #endif
  91. if(m_pOperation != NULL)
  92. m_pOperation->onHostChanStateUpdated(this);
  93. m_pParent->onChanStateUpdate(pNotify->ChanOpInstance, this);
  94. }
  95. /*****************************************************************
  96. **【函数名称】 onSessionChanEvent
  97. **【函数功能】 会话关联通道事件处理
  98. **【参数】
  99. **【返回值】
  100. *****************************************************************/
  101. void CChanTrunk::onSessionChanEvent( CVirtualChan* pChanSession, PCHAN_EVENT_NOTIFY pNotify )
  102. {
  103. ASSERT(pChanSession != NULL);
  104. if(m_pOperation != NULL)
  105. m_pOperation->onSessionChanStateUpdated(pChanSession);
  106. }
  107. /*****************************************************************
  108. **【函数名称】 processCallConnect
  109. **【函数功能】 处理呼叫连接
  110. **【参数】
  111. **【返回值】
  112. *****************************************************************/
  113. bool CChanTrunk::processCallConnect( esl_handle_t* pHandle )
  114. {
  115. if(m_pEslHandle != NULL)
  116. {
  117. LOGGER(LOG_LEVEL_WARNING, _T("{ChanTrunk}: 通道[%lu]处理呼叫连接时已被占用, 新呼叫将被忽略"), m_No);
  118. return false;
  119. }
  120. m_pEslHandle = pHandle;
  121. m_State = CHAN_LOGIC_STATE_STANDBY;
  122. if(m_pOperation != NULL)
  123. m_pOperation->onHostChanStateUpdated(this); // 通知任务通道状态
  124. else
  125. m_pParent->onTrunkCallIn(this); // 通知外线呼入
  126. m_StopConnect = false;
  127. return true;
  128. }
  129. /*****************************************************************
  130. **【函数名称】 processCallDisconnect
  131. **【函数功能】 处理呼叫连接中断
  132. **【参数】
  133. **【返回值】
  134. *****************************************************************/
  135. void CChanTrunk::processCallDisconnect( void )
  136. {
  137. m_StopConnect = true;
  138. m_pEslHandle = NULL;
  139. }
  140. /*****************************************************************
  141. **【函数名称】 onAppExecuted
  142. **【函数功能】 处理通道应用执行
  143. **【参数】
  144. **【返回值】
  145. *****************************************************************/
  146. void CChanTrunk::onAppExecuted( PAPP_EXEC_NOTIFY pNotify )
  147. {
  148. if(m_pOperation != NULL)
  149. m_pOperation->onChanAppExecuted(this, pNotify);
  150. }