中间件标准版5.1git,去除基础模块

Session.cpp 6.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. #include "StdAfx.h"
  2. #include "Session.h"
  3. #include "FsProxy.h"
  4. #include "ChanExten.h"
  5. #include "ChanTrunk.h"
  6. CSession::CSession(CFsProxy* pParent, LPCTSTR Id) : m_pParent(pParent), m_Id(Id)
  7. {
  8. }
  9. CSession::~CSession(void)
  10. {
  11. }
  12. /*****************************************************************
  13. **【函数名称】 __getChan
  14. **【函数功能】 获取指定通道
  15. **【参数】
  16. **【返回值】
  17. *****************************************************************/
  18. CVirtualChan* CSession::__getChan( LPCTSTR ChanId )
  19. {
  20. POSITION Pos = m_ListChan.GetHeadPosition();
  21. while(Pos != NULL)
  22. {
  23. CVirtualChan* pChan = m_ListChan.GetNext(Pos);
  24. ASSERT(pChan != NULL);
  25. if(lstrcmp(pChan->chanId(), ChanId) == 0)
  26. return pChan;
  27. }
  28. return NULL;
  29. }
  30. /*****************************************************************
  31. **【函数名称】 __findChan
  32. **【函数功能】 查找通道
  33. **【参数】
  34. **【返回值】
  35. *****************************************************************/
  36. CVirtualChan* CSession::__findChan( PCHAN_EVENT_NOTIFY pNotify )
  37. {
  38. CVirtualChan* pChan = NULL;
  39. if(pNotify->EventId == CHANNEL_EVENT_CREATE)
  40. {
  41. UINT ExtenNo = 0;
  42. if(pNotify->Direction == CALL_DIRECTION_INBOUND)
  43. sscanf_s(pNotify->Caller, "%u", &ExtenNo); // 呼入FS
  44. else
  45. sscanf_s(pNotify->Callee, "%u", &ExtenNo); // FS呼出
  46. pChan = m_pParent->getExten(ExtenNo);
  47. if(pChan == NULL) // 分机通道中无,则说明是中继通道
  48. {
  49. pChan = m_pParent->getFreeTrunk();
  50. if(pChan == NULL)
  51. {
  52. LOGGER(LOG_LEVEL_WARNING, _T("{Fs.Session}: 处理通道事件时获取空闲中继通道失败, Caller = %s, Callee = %s"), pNotify->Caller, pNotify->Callee);
  53. m_pParent->onChanPoor(this, pNotify);
  54. }
  55. }
  56. }
  57. else
  58. {
  59. pChan = m_pParent->getBusyChan(pNotify->ChanId);
  60. }
  61. return pChan;
  62. }
  63. /*****************************************************************
  64. **【函数名称】 __addChan
  65. **【函数功能】 添加指定通道
  66. **【参数】
  67. **【返回值】
  68. *****************************************************************/
  69. void CSession::__addChan( CVirtualChan* pChan )
  70. {
  71. m_ListChan.AddTail(pChan);
  72. }
  73. /*****************************************************************
  74. **【函数名称】 __delChan
  75. **【函数功能】 删除指定通道
  76. **【参数】
  77. **【返回值】
  78. *****************************************************************/
  79. void CSession::__delChan( CVirtualChan* pChan )
  80. {
  81. POSITION Pos = m_ListChan.Find(pChan);
  82. if(Pos != NULL)
  83. m_ListChan.RemoveAt(Pos);
  84. }
  85. /*****************************************************************
  86. **【函数名称】 __clearChan
  87. **【函数功能】 清空通道
  88. **【参数】
  89. **【返回值】
  90. *****************************************************************/
  91. void CSession::__clearChan( void )
  92. {
  93. m_ListChan.RemoveAll();
  94. }
  95. /*****************************************************************
  96. **【函数名称】 __notifySessionChanEvent
  97. **【函数功能】 通知会话关联通道事件处理
  98. **【参数】
  99. **【返回值】
  100. *****************************************************************/
  101. void CSession::__notifySessionChanEvent( CVirtualChan* pChanHost, PCHAN_EVENT_NOTIFY pNotify )
  102. {
  103. POSITION Pos = m_ListChan.GetHeadPosition();
  104. while(Pos != NULL)
  105. {
  106. CVirtualChan* pChanInSession = m_ListChan.GetNext(Pos);
  107. ASSERT(pChanInSession != NULL);
  108. if(pChanInSession != pChanHost)
  109. pChanInSession->onSessionChanEvent(pChanHost, pNotify);
  110. }
  111. }
  112. /*****************************************************************
  113. **【函数名称】 __onChanFree
  114. **【函数功能】 通道空闲的处理函数
  115. **【参数】
  116. **【返回值】
  117. *****************************************************************/
  118. void CSession::__onChanFree( CVirtualChan* pChan, PCHAN_EVENT_NOTIFY pNotify )
  119. {
  120. if(m_Id == pNotify->ChanId) // 若会话主通道空闲则清空会话
  121. __clearChan();
  122. else
  123. __delChan(pChan);
  124. if(pChan->isVoid()) // 若通道已被丢弃,则删除
  125. m_pParent->delChan(pChan);
  126. }
  127. /*****************************************************************
  128. **【函数名称】 prepare
  129. **【函数功能】 会话准备
  130. **【参数】
  131. **【返回值】
  132. *****************************************************************/
  133. void CSession::prepare( PCHAN_EVENT_NOTIFY pNotify )
  134. {
  135. if(m_Id != pNotify->ChanId) // 触发会话的通道不是会话主通道,则查找并添加主通道
  136. {
  137. CVirtualChan* pChan = m_pParent->getBusyChan(m_Id);
  138. if(pChan != NULL)
  139. __addChan(pChan);
  140. }
  141. }
  142. /*****************************************************************
  143. **【函数名称】 onChanEvent
  144. **【函数功能】 通道事件处理
  145. **【参数】
  146. **【返回值】
  147. *****************************************************************/
  148. void CSession::onChanEvent( PCHAN_EVENT_NOTIFY pNotify )
  149. {
  150. ASSERT(pNotify != NULL);
  151. if (pNotify == NULL)
  152. return;
  153. CVirtualChan* pChan = __getChan(pNotify->ChanId);
  154. if(pChan == NULL)
  155. {
  156. pChan = __findChan(pNotify);
  157. if(pChan != NULL)
  158. __addChan(pChan);
  159. else
  160. {
  161. LOGGER(LOG_LEVEL_WARNING, _T("{Fs.Session}: 处理通道事件时查找对应通道失败, Caller = %s, Callee = %s"), pNotify->Caller, pNotify->Callee);
  162. return;
  163. }
  164. }
  165. //LOGGER(LOG_LEVEL_NORMAL, _T("{Fs.Session}: 处理通道事件,EventId=%d,ChanId=%s,CallId=%s,Caller = %s, Callee = %s,ChanState=%d"), pNotify->EventId, pNotify->ChanId, pNotify->CallId, pNotify->Caller, pNotify->Callee, pChan->state());
  166. pChan->onChanEvent(pNotify);
  167. // 过滤无效状态
  168. if(pChan->state() == CHAN_LOGIC_STATE_FREE && pNotify->EventId == CHANNEL_EVENT_CREATE)
  169. return;
  170. __notifySessionChanEvent(pChan, pNotify);
  171. if(pChan->isFree())
  172. __onChanFree(pChan, pNotify);
  173. }
  174. /*****************************************************************
  175. **【函数名称】 onChanDtmf
  176. **【函数功能】 通道DTMF事件处理
  177. **【参数】
  178. **【返回值】
  179. *****************************************************************/
  180. void CSession::onChanDtmf( PDTMF_NOTIFY pNotify )
  181. {
  182. CVirtualChan* pChan = __getChan(pNotify->ChanId);
  183. if(pChan != NULL)
  184. {
  185. pChan->onChanDtmf(pNotify->DTMF);
  186. }
  187. }
  188. /*****************************************************************
  189. **【函数名称】 onChanHold
  190. **【函数功能】 通道保持事件处理
  191. **【参数】
  192. **【返回值】
  193. *****************************************************************/
  194. void CSession::onChanHold( PHOLD_NOTIFY pNotify )
  195. {
  196. CVirtualChan* pChan = __getChan(pNotify->ChanId);
  197. if(pChan != NULL)
  198. {
  199. pChan->onChanHold(pNotify->EvtType);
  200. }
  201. }
  202. /*****************************************************************
  203. **【函数名称】 getAssoChan
  204. **【函数功能】 获取关联通道
  205. **【参数】
  206. **【返回值】
  207. *****************************************************************/
  208. CVirtualChan* CSession::getAssoChan( CVirtualChan* pChan )
  209. {
  210. POSITION Pos = m_ListChan.GetHeadPosition();
  211. while(Pos != NULL)
  212. {
  213. CVirtualChan* pChanInSession = m_ListChan.GetNext(Pos);
  214. ASSERT(pChanInSession != NULL);
  215. if(pChanInSession != pChan)
  216. return pChanInSession;
  217. }
  218. return NULL;
  219. }