#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; } } } } }