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

Session.cpp 7.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  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 (pChan != NULL)
  26. {
  27. if (lstrcmp(pChan->chanId(), ChanId) == 0)
  28. return pChan;
  29. }
  30. }
  31. return NULL;
  32. }
  33. /*****************************************************************
  34. **【函数名称】 __findChan
  35. **【函数功能】 查找通道
  36. **【参数】
  37. **【返回值】
  38. *****************************************************************/
  39. CVirtualChan* CSession::__findChan( PCHAN_EVENT_NOTIFY pNotify )
  40. {
  41. CVirtualChan* pChan = NULL;
  42. if(pNotify->EventId == CHANNEL_EVENT_CREATE)
  43. {
  44. UINT ExtenNo = 0;
  45. if(pNotify->Direction == CALL_DIRECTION_INBOUND)
  46. sscanf_s(pNotify->Caller, "%u", &ExtenNo); // 呼入FS
  47. else
  48. sscanf_s(pNotify->Callee, "%u", &ExtenNo); // FS呼出
  49. //by 2019-09-11
  50. pChan = m_pParent->getExten(ExtenNo);
  51. if(pChan == NULL) // 分机通道中无,则说明是中继通道
  52. {
  53. pChan = m_pParent->getFreeTrunk();
  54. if(pChan == NULL)
  55. {
  56. LOGGER(LOG_LEVEL_WARNING, _T("{Fs.Session}: 处理通道事件时获取空闲中继通道失败, Caller = %s, Callee = %s"), pNotify->Caller, pNotify->Callee);
  57. m_pParent->onChanPoor(this, pNotify);
  58. }
  59. }
  60. }
  61. else
  62. {
  63. pChan = m_pParent->getBusyChan(pNotify->ChanId);
  64. }
  65. return pChan;
  66. }
  67. /*****************************************************************
  68. **【函数名称】 __addChan
  69. **【函数功能】 添加指定通道
  70. **【参数】
  71. **【返回值】
  72. *****************************************************************/
  73. void CSession::__addChan( CVirtualChan* pChan )
  74. {
  75. m_ListChan.AddTail(pChan);
  76. }
  77. /*****************************************************************
  78. **【函数名称】 __delChan
  79. **【函数功能】 删除指定通道
  80. **【参数】
  81. **【返回值】
  82. *****************************************************************/
  83. void CSession::__delChan( CVirtualChan* pChan )
  84. {
  85. POSITION Pos = m_ListChan.Find(pChan);
  86. if(Pos != NULL)
  87. m_ListChan.RemoveAt(Pos);
  88. }
  89. /*****************************************************************
  90. **【函数名称】 __clearChan
  91. **【函数功能】 清空通道
  92. **【参数】
  93. **【返回值】
  94. *****************************************************************/
  95. void CSession::__clearChan( void )
  96. {
  97. m_ListChan.RemoveAll();
  98. }
  99. /*****************************************************************
  100. **【函数名称】 __notifySessionChanEvent
  101. **【函数功能】 通知会话关联通道事件处理
  102. **【参数】
  103. **【返回值】
  104. *****************************************************************/
  105. void CSession::__notifySessionChanEvent( CVirtualChan* pChanHost, PCHAN_EVENT_NOTIFY pNotify )
  106. {
  107. POSITION Pos = m_ListChan.GetHeadPosition();
  108. while(Pos != NULL)
  109. {
  110. // by
  111. CVirtualChan* pChanInSession = m_ListChan.GetNext(Pos);
  112. ASSERT(pChanInSession != NULL);
  113. if (pChanInSession != pChanHost)
  114. {
  115. pChanInSession->onSessionChanEvent(pChanHost, pNotify);
  116. std::cout << "pChanInSession != pChanHost" << pNotify->CallId << endl;
  117. }
  118. else
  119. {
  120. std::cout << "pChanInSession == pChanHost" << pChanInSession->sessionId() << endl;
  121. }
  122. }
  123. }
  124. /*****************************************************************
  125. **【函数名称】 __onChanFree
  126. **【函数功能】 通道空闲的处理函数
  127. **【参数】
  128. **【返回值】
  129. *****************************************************************/
  130. void CSession::__onChanFree( CVirtualChan* pChan, PCHAN_EVENT_NOTIFY pNotify )
  131. {
  132. if(m_Id == pNotify->ChanId) // 若会话主通道空闲则清空会话
  133. __clearChan();
  134. else
  135. __delChan(pChan);
  136. if(pChan->isVoid()) // 若通道已被丢弃,则删除
  137. m_pParent->delChan(pChan);
  138. }
  139. /*****************************************************************
  140. **【函数名称】 prepare
  141. **【函数功能】 会话准备
  142. **【参数】
  143. **【返回值】
  144. *****************************************************************/
  145. void CSession::prepare( PCHAN_EVENT_NOTIFY pNotify )
  146. {
  147. if(m_Id != pNotify->ChanId) // 触发会话的通道不是会话主通道,则查找并添加主通道
  148. {
  149. // by 屏蔽原有的addChan
  150. CVirtualChan* pChan = m_pParent->getBusyChan(m_Id);
  151. if(pChan != NULL)
  152. __addChan(pChan);
  153. }
  154. }
  155. /*****************************************************************
  156. **【函数名称】 onChanEvent
  157. **【函数功能】 通道事件处理
  158. **【参数】
  159. **【返回值】
  160. *****************************************************************/
  161. void CSession::onChanEvent( PCHAN_EVENT_NOTIFY pNotify )
  162. {
  163. ASSERT(pNotify != NULL);
  164. if (pNotify == NULL)
  165. return;
  166. CVirtualChan* pChan = __getChan(pNotify->ChanId);
  167. if(pChan == NULL)
  168. {
  169. pChan = __findChan(pNotify);
  170. if(pChan != NULL)
  171. __addChan(pChan);
  172. else
  173. {
  174. //LOGGER(LOG_LEVEL_WARNING, _T("{Fs.Session}: 处理通道事件时查找对应通道失败, Caller = %s, Callee = %s"), pNotify->Caller, pNotify->Callee);
  175. return;
  176. }
  177. }
  178. //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());
  179. __try
  180. {
  181. pChan->onChanEvent(pNotify);
  182. std::cout << "__notifySessionChanEvent" << pNotify->CallId << endl;
  183. }
  184. __except (EXCEPTION_EXECUTE_HANDLER)
  185. {
  186. LOGGER(LOG_LEVEL_WARNING, _T("{Fs.Session.onChanEvent}: 处理通道事件时发生异常, Caller = %s, Callee = %s"), pNotify->Caller, pNotify->Callee);
  187. return;
  188. }
  189. // 过滤无效状态
  190. if(pChan->state() == CHAN_LOGIC_STATE_FREE && pNotify->EventId == CHANNEL_EVENT_CREATE)
  191. return;
  192. __try
  193. {
  194. std::cout << "__notifySessionChanEvent" << pNotify->CallId << endl;
  195. __notifySessionChanEvent(pChan, pNotify);
  196. }
  197. __except (EXCEPTION_EXECUTE_HANDLER)
  198. {
  199. LOGGER(LOG_LEVEL_WARNING, _T("{Fs.Session.onChanEvent}: 通知会话关联通道事件处理发生异常, Caller = %s, Callee = %s"), pNotify->Caller, pNotify->Callee);
  200. return;
  201. }
  202. __try
  203. {
  204. if (pChan->isFree())
  205. __onChanFree(pChan, pNotify);
  206. }
  207. __except (EXCEPTION_EXECUTE_HANDLER)
  208. {
  209. LOGGER(LOG_LEVEL_WARNING, _T("{Fs.Session.onChanEvent}: 通道空闲处理函数执行发生异常, Caller = %s, Callee = %s"), pNotify->Caller, pNotify->Callee);
  210. return;
  211. }
  212. }
  213. /*****************************************************************
  214. **【函数名称】 onChanDtmf
  215. **【函数功能】 通道DTMF事件处理
  216. **【参数】
  217. **【返回值】
  218. *****************************************************************/
  219. void CSession::onChanDtmf( PDTMF_NOTIFY pNotify )
  220. {
  221. CVirtualChan* pChan = __getChan(pNotify->ChanId);
  222. if(pChan != NULL)
  223. {
  224. pChan->onChanDtmf(pNotify->DTMF);
  225. }
  226. }
  227. /*****************************************************************
  228. **【函数名称】 onChanHold
  229. **【函数功能】 通道保持事件处理
  230. **【参数】
  231. **【返回值】
  232. *****************************************************************/
  233. void CSession::onChanHold( PHOLD_NOTIFY pNotify )
  234. {
  235. CVirtualChan* pChan = __getChan(pNotify->ChanId);
  236. if(pChan != NULL)
  237. {
  238. pChan->onChanHold(pNotify->EvtType);
  239. }
  240. }
  241. /*****************************************************************
  242. **【函数名称】 getAssoChan
  243. **【函数功能】 获取关联通道
  244. **【参数】
  245. **【返回值】
  246. *****************************************************************/
  247. CVirtualChan* CSession::getAssoChan( CVirtualChan* pChan )
  248. {
  249. POSITION Pos = m_ListChan.GetHeadPosition();
  250. while(Pos != NULL)
  251. {
  252. CVirtualChan* pChanInSession = m_ListChan.GetNext(Pos);
  253. ASSERT(pChanInSession != NULL);
  254. if(pChanInSession != pChan)
  255. return pChanInSession;
  256. }
  257. return NULL;
  258. }