| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212 |
- #include "StdAfx.h"
- #include "FlowTemplateMgr.h"
- #include "FlowTemplate.h"
- #include "FLowFileReader.h"
- #include "FlowDataProvider.h"
- #include "IvrFlowMgr.h"
- #include "IvrFlow.h"
- CFlowTemplateMgr::CFlowTemplateMgr(void)
- {
- }
- CFlowTemplateMgr::~CFlowTemplateMgr(void)
- {
- __release();
- }
- /*****************************************************************
- **【函数名称】 __release
- **【函数功能】 释放资源
- **【参数】
- **【返回值】
- ****************************************************************/
- void CFlowTemplateMgr::__release( void )
- {
- if(!m_FlowTempList.IsEmpty())
- {
- POSITION pos = m_FlowTempList.GetHeadPosition();
- while(pos != NULL)
- {
- CFlowTemplate* pTemplate = m_FlowTempList.GetNext(pos);
- ASSERT(pTemplate != NULL);
- if(pTemplate != NULL)
- delete pTemplate;
- }
- m_FlowTempList.RemoveAll();
- }
- }
- /*****************************************************************
- **【函数名称】 parseIvrFile
- **【函数功能】 解析流程文件
- **【参数】 IvrFile:文件名
- **【返回值】 TRUE:解析成功,FALSE:解析失败
- ****************************************************************/
- bool CFlowTemplateMgr::parseIvrFile( const CString& IvrFile )
- {
- CFLowFileReader Reader(this);
- return Reader.read(IvrFile);
- }
- /*****************************************************************
- **【函数名称】 createTemplate
- **【函数功能】 创建流程模板
- **【参数】 Provider:流程数据提供器
- **【返回值】 流程模板对象
- ****************************************************************/
- CFlowTemplate* CFlowTemplateMgr::createTemplate( CFlowDataProvider& Provider )
- {
- CFlowTemplate* pTemplate = new CFlowTemplate();
- ASSERT(pTemplate != NULL);
- if(pTemplate != NULL)
- {
- if(pTemplate->fillData(Provider))
- m_FlowTempList.AddTail(pTemplate);
- else
- {
- delete pTemplate;
- pTemplate = NULL;
- }
- }
- return pTemplate;
- }
- /*****************************************************************
- **【函数名称】 getTemplate
- **【函数功能】 根据外线ID寻找适配流程
- **【参数】 TrunkId:外线Id
- **【返回值】 流程模板对象
- ****************************************************************/
- CFlowTemplate* CFlowTemplateMgr::getTemplate( UINT TrunkId )
- {
- CFlowTemplate* pTemplate = NULL;
- CFlowTemplate* pDefaultTemp = NULL;
- POSITION Pos = m_FlowTempList.GetHeadPosition();
- while(Pos != NULL)
- {
- pTemplate = m_FlowTempList.GetNext(Pos);
- ASSERT(pTemplate != NULL);
- int Res = pTemplate->matchLine(TrunkId);
- if(Res == 0)
- continue;
- else if(Res == 1)
- return pTemplate;
- else if(Res == -1 && pDefaultTemp == NULL)
- pDefaultTemp = pTemplate;
- }
- return pDefaultTemp;
- }
- /*****************************************************************
- **【函数名称】 getTemplate
- **【函数功能】 根据主叫号码寻找适配流程
- **【参数】 Caller:主叫号码
- **【返回值】 流程模板对象
- ****************************************************************/
- CFlowTemplate* CFlowTemplateMgr::getTemplate( const CString& Caller )
- {
- CFlowTemplate* pTemplate = NULL;
- POSITION Pos = m_FlowTempList.GetHeadPosition();
- while(Pos != NULL)
- {
- pTemplate = m_FlowTempList.GetNext(Pos);
- ASSERT(pTemplate != NULL);
- if(pTemplate->matchCaller(Caller))
- return pTemplate;
- }
- return NULL;
- }
- /*****************************************************************
- **【函数名称】 getPreCallTemplate
- **【函数功能】 获取预测呼叫流程
- **【参数】
- **【返回值】 流程文件对象
- ****************************************************************/
- CFlowTemplate* CFlowTemplateMgr::getPreCallTemplate( void )
- {
- CFlowTemplate* pTemplate = NULL;
- POSITION Pos = m_FlowTempList.GetHeadPosition();
- while(Pos != NULL)
- {
- pTemplate = m_FlowTempList.GetNext(Pos);
- ASSERT(pTemplate != NULL);
- if(pTemplate->isMatchedPreCall())
- return pTemplate;
- }
- return NULL;
- }
- /*****************************************************************
- **【函数名称】 findTemplate
- **【函数功能】 根据流程文件名查找流程文件对象
- **【参数】 Name:流程文件名
- **【返回值】 流程文件对象
- ****************************************************************/
- CFlowTemplate* CFlowTemplateMgr::findTemplate( const CString& Name )
- {
- CFlowTemplate* pTemplate = NULL;
- POSITION Pos = m_FlowTempList.GetHeadPosition();
- while(Pos != NULL)
- {
- pTemplate = m_FlowTempList.GetNext(Pos);
- if(pTemplate != NULL && pTemplate->name() == Name)
- return pTemplate;
- }
- return NULL;
- }
- /*****************************************************************
- **【函数名称】 findTemplate
- **【函数功能】 执行自动流程模板
- **【参数】 FlowMgr:流程管理器
- **【返回值】
- ****************************************************************/
- void CFlowTemplateMgr::execAutoFlowTemplate( CIvrFlowMgr& FlowMgr )
- {
- CFlowTemplate* pTemplate = NULL;
- POSITION Pos = m_FlowTempList.GetHeadPosition();
- while(Pos != NULL)
- {
- pTemplate = m_FlowTempList.GetNext(Pos);
- if(pTemplate != NULL && pTemplate->type() == FLOW_AUTO)
- {
- for(int i = 0; i < pTemplate->concurrency(); ++i)
- {
- CIvrFlow* pFlow = FlowMgr.getFreeFlow();
- if(pFlow != NULL)
- {
- ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, _T("{TemplateMgr}: 开始执行自动流程模板[%s], Flow = %d"), pTemplate->name(), pFlow->id());
- pFlow->start(pTemplate);
- }
- else
- {
- ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_WARNING, _T("{TemplateMgr}: 自动流程模板[%s]执行出错, 没有空闲流程"), pTemplate->name());
- return;
- }
- }
- }
- }
- }
|