中间件底层,websocket

ChanTrunk.cpp 4.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  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. if(pNotify->Direction == CALL_DIRECTION_INBOUND) // 呼入FS
  52. m_State = CHAN_LOGIC_STATE_ALERTING;
  53. else
  54. m_State = CHAN_LOGIC_STATE_DIALING;
  55. }
  56. break;
  57. case CHANNEL_EVENT_PROGRESS:
  58. case CHANNEL_EVENT_PROGRESS_MEDIA:
  59. {
  60. if(pNotify->Direction == CALL_DIRECTION_OUTBOUND) // FS呼出
  61. m_State = CHAN_LOGIC_STATE_RING_BACK;
  62. else
  63. return;
  64. }
  65. break;
  66. case CHANNEL_EVENT_ANSWER:
  67. {
  68. m_State = CHAN_LOGIC_STATE_TALKING;
  69. }
  70. break;
  71. case CHANNEL_EVENT_HANGUP_COMPLETE:
  72. {
  73. m_State = CHAN_LOGIC_STATE_FREE;
  74. _setSession(NULL, NULL);
  75. _reset();
  76. m_StopConnect = true;
  77. m_pEslHandle = NULL;
  78. // 2022-04-11
  79. if (lstrcmp(pNotify->HangupDisposition, "send_bye") == 0)
  80. {
  81. // LOGGER(LOG_LEVEL_NORMAL, _T("{CChanTrunk}: 中继[%lu][]被动挂断"), m_No);
  82. m_isActiveHanguper = FALSE;
  83. }
  84. else if (lstrcmp(pNotify->HangupDisposition, "recv_bye") == 0)
  85. {
  86. // LOGGER(LOG_LEVEL_NORMAL, _T("{CChanTrunk}: 中继[%lu][]主动挂断"), m_No);
  87. m_isActiveHanguper = TRUE;
  88. }
  89. else
  90. {
  91. m_isActiveHanguper = TRUE;
  92. // LOGGER(LOG_LEVEL_NORMAL, _T("{CChanTrunk}: 中继[%lu][]挂断原因未知"), m_No);
  93. }
  94. }
  95. break;
  96. default:
  97. return;
  98. }
  99. #ifdef _DEBUG
  100. LOGGER(LOG_LEVEL_NORMAL, _T("{CChanTrunk}: 中继[%lu]状态更新, state = %d"), m_No, m_State);
  101. #endif
  102. if(m_pOperation != NULL)
  103. m_pOperation->onHostChanStateUpdated(this);
  104. m_pParent->onChanStateUpdate(pNotify->ChanOpInstance, this);
  105. }
  106. /*****************************************************************
  107. **【函数名称】 onSessionChanEvent
  108. **【函数功能】 会话关联通道事件处理
  109. **【参数】
  110. **【返回值】
  111. *****************************************************************/
  112. void CChanTrunk::onSessionChanEvent( CVirtualChan* pChanSession, PCHAN_EVENT_NOTIFY pNotify )
  113. {
  114. ASSERT(pChanSession != NULL);
  115. if(m_pOperation != NULL)
  116. m_pOperation->onSessionChanStateUpdated(pChanSession);
  117. }
  118. /*****************************************************************
  119. **【函数名称】 processCallConnect
  120. **【函数功能】 处理呼叫连接
  121. **【参数】
  122. **【返回值】
  123. *****************************************************************/
  124. bool CChanTrunk::processCallConnect( esl_handle_t* pHandle )
  125. {
  126. if(m_pEslHandle != NULL)
  127. {
  128. LOGGER(LOG_LEVEL_WARNING, _T("{ChanTrunk}: 通道[%lu]处理呼叫连接时已被占用, 新呼叫将被忽略"), m_No);
  129. return false;
  130. }
  131. m_pEslHandle = pHandle;
  132. m_State = CHAN_LOGIC_STATE_STANDBY;
  133. if(m_pOperation != NULL)
  134. m_pOperation->onHostChanStateUpdated(this); // 通知任务通道状态
  135. else
  136. m_pParent->onTrunkCallIn(this); // 通知外线呼入
  137. m_StopConnect = false;
  138. return true;
  139. }
  140. /*****************************************************************
  141. **【函数名称】 processCallDisconnect
  142. **【函数功能】 处理呼叫连接中断
  143. **【参数】
  144. **【返回值】
  145. *****************************************************************/
  146. void CChanTrunk::processCallDisconnect( void )
  147. {
  148. m_StopConnect = true;
  149. m_pEslHandle = NULL;
  150. }
  151. /*****************************************************************
  152. **【函数名称】 onAppExecuted
  153. **【函数功能】 处理通道应用执行
  154. **【参数】
  155. **【返回值】
  156. *****************************************************************/
  157. void CChanTrunk::onAppExecuted( PAPP_EXEC_NOTIFY pNotify )
  158. {
  159. if(m_pOperation != NULL)
  160. m_pOperation->onChanAppExecuted(this, pNotify);
  161. }