中间件底层,websocket

FlowTemplateMgr.cpp 5.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. #include "StdAfx.h"
  2. #include "FlowTemplateMgr.h"
  3. #include "FlowTemplate.h"
  4. #include "FLowFileReader.h"
  5. #include "FlowDataProvider.h"
  6. #include "IvrFlowMgr.h"
  7. #include "IvrFlow.h"
  8. CFlowTemplateMgr::CFlowTemplateMgr(void)
  9. {
  10. }
  11. CFlowTemplateMgr::~CFlowTemplateMgr(void)
  12. {
  13. __release();
  14. }
  15. /*****************************************************************
  16. **【函数名称】 __release
  17. **【函数功能】 释放资源
  18. **【参数】
  19. **【返回值】
  20. ****************************************************************/
  21. void CFlowTemplateMgr::__release( void )
  22. {
  23. if(!m_FlowTempList.IsEmpty())
  24. {
  25. POSITION pos = m_FlowTempList.GetHeadPosition();
  26. while(pos != NULL)
  27. {
  28. CFlowTemplate* pTemplate = m_FlowTempList.GetNext(pos);
  29. ASSERT(pTemplate != NULL);
  30. if(pTemplate != NULL)
  31. delete pTemplate;
  32. pTemplate = NULL;
  33. }
  34. m_FlowTempList.RemoveAll();
  35. }
  36. }
  37. /*****************************************************************
  38. **【函数名称】 parseIvrFile
  39. **【函数功能】 解析流程文件
  40. **【参数】 IvrFile:文件名
  41. **【返回值】 TRUE:解析成功,FALSE:解析失败
  42. ****************************************************************/
  43. bool CFlowTemplateMgr::parseIvrFile( const CString& IvrFile )
  44. {
  45. CFLowFileReader Reader(this);
  46. return Reader.read(IvrFile);
  47. }
  48. /*****************************************************************
  49. **【函数名称】 createTemplate
  50. **【函数功能】 创建流程模板
  51. **【参数】 Provider:流程数据提供器
  52. **【返回值】 流程模板对象
  53. ****************************************************************/
  54. CFlowTemplate* CFlowTemplateMgr::createTemplate( CFlowDataProvider& Provider )
  55. {
  56. CFlowTemplate* pTemplate = new CFlowTemplate();
  57. ASSERT(pTemplate != NULL);
  58. if(pTemplate != NULL)
  59. {
  60. if(pTemplate->fillData(Provider))
  61. m_FlowTempList.AddTail(pTemplate);
  62. else
  63. {
  64. delete pTemplate;
  65. pTemplate = NULL;
  66. }
  67. }
  68. return pTemplate;
  69. }
  70. /*****************************************************************
  71. **【函数名称】 getTemplate
  72. **【函数功能】 根据外线ID寻找适配流程
  73. **【参数】 TrunkId:外线Id
  74. **【返回值】 流程模板对象
  75. ****************************************************************/
  76. CFlowTemplate* CFlowTemplateMgr::getTemplate( UINT TrunkId )
  77. {
  78. CFlowTemplate* pTemplate = NULL;
  79. CFlowTemplate* pDefaultTemp = NULL;
  80. POSITION Pos = m_FlowTempList.GetHeadPosition();
  81. while(Pos != NULL)
  82. {
  83. pTemplate = m_FlowTempList.GetNext(Pos);
  84. ASSERT(pTemplate != NULL);
  85. int Res = pTemplate->matchLine(TrunkId);
  86. if(Res == 0)
  87. continue;
  88. else if(Res == 1)
  89. return pTemplate;
  90. else if(Res == -1 && pDefaultTemp == NULL)
  91. pDefaultTemp = pTemplate;
  92. }
  93. return pDefaultTemp;
  94. }
  95. /*****************************************************************
  96. **【函数名称】 getTemplate
  97. **【函数功能】 根据主叫号码寻找适配流程
  98. **【参数】 Caller:主叫号码
  99. **【返回值】 流程模板对象
  100. ****************************************************************/
  101. CFlowTemplate* CFlowTemplateMgr::getTemplate( const CString& Caller )
  102. {
  103. CFlowTemplate* pTemplate = NULL;
  104. POSITION Pos = m_FlowTempList.GetHeadPosition();
  105. while(Pos != NULL)
  106. {
  107. pTemplate = m_FlowTempList.GetNext(Pos);
  108. ASSERT(pTemplate != NULL);
  109. if(pTemplate->matchCaller(Caller))
  110. return pTemplate;
  111. }
  112. return NULL;
  113. }
  114. /*****************************************************************
  115. **【函数名称】 getPreCallTemplate
  116. **【函数功能】 获取预测呼叫流程
  117. **【参数】
  118. **【返回值】 流程文件对象
  119. ****************************************************************/
  120. CFlowTemplate* CFlowTemplateMgr::getPreCallTemplate( void )
  121. {
  122. CFlowTemplate* pTemplate = NULL;
  123. POSITION Pos = m_FlowTempList.GetHeadPosition();
  124. while(Pos != NULL)
  125. {
  126. pTemplate = m_FlowTempList.GetNext(Pos);
  127. ASSERT(pTemplate != NULL);
  128. if(pTemplate->isMatchedPreCall())
  129. return pTemplate;
  130. }
  131. return NULL;
  132. }
  133. /*****************************************************************
  134. **【函数名称】 findTemplate
  135. **【函数功能】 根据流程文件名查找流程文件对象
  136. **【参数】 Name:流程文件名
  137. **【返回值】 流程文件对象
  138. ****************************************************************/
  139. CFlowTemplate* CFlowTemplateMgr::findTemplate( const CString& Name )
  140. {
  141. CFlowTemplate* pTemplate = NULL;
  142. POSITION Pos = m_FlowTempList.GetHeadPosition();
  143. while(Pos != NULL)
  144. {
  145. pTemplate = m_FlowTempList.GetNext(Pos);
  146. if(pTemplate != NULL && pTemplate->name() == Name)
  147. return pTemplate;
  148. }
  149. return NULL;
  150. }
  151. /*****************************************************************
  152. **【函数名称】 findTemplate
  153. **【函数功能】 执行自动流程模板
  154. **【参数】 FlowMgr:流程管理器
  155. **【返回值】
  156. ****************************************************************/
  157. void CFlowTemplateMgr::execAutoFlowTemplate( CIvrFlowMgr& FlowMgr )
  158. {
  159. CFlowTemplate* pTemplate = NULL;
  160. POSITION Pos = m_FlowTempList.GetHeadPosition();
  161. while(Pos != NULL)
  162. {
  163. pTemplate = m_FlowTempList.GetNext(Pos);
  164. if(pTemplate != NULL && pTemplate->type() == FLOW_AUTO)
  165. {
  166. for(int i = 0; i < pTemplate->concurrency(); ++i)
  167. {
  168. CIvrFlow* pFlow = FlowMgr.getFreeFlow();
  169. if(pFlow != NULL)
  170. {
  171. ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, _T("{TemplateMgr}: 开始执行自动流程模板[%s], Flow = %d"), pTemplate->name(), pFlow->id());
  172. pFlow->start(pTemplate);
  173. }
  174. else
  175. {
  176. ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_WARNING, _T("{TemplateMgr}: 自动流程模板[%s]执行出错, 没有空闲流程"), pTemplate->name());
  177. return;
  178. }
  179. }
  180. }
  181. }
  182. }