多数据源中间件标准版1.0

FlowTemplateMgr.cpp 5.2KB

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