#include "StdAfx.h" #include "CellStringOp.h" #include "IvrFlow.h" #include "FlowDataProvider.h" IMPLEMENT_CELL_AUTOCREATE(CCellStringOp, CELL_NAME_STRING_OP) CCellStringOp::CCellStringOp(void) { m_OpType = 0; m_InterceptIdx = 0; m_InterceptLen = 0; m_NextPos = 0; m_MatchTruePos = 0; m_MatchFalsePos = 0; m_OpVarName = ""; m_ResultVarName = ""; m_ReplaceVarName = ""; m_ReplaceAsVarName = ""; m_MatchVarName = ""; m_AppendVarName = ""; } CCellStringOp::CCellStringOp( CCellStringOp & CellStringOp ) : CCellBase(CellStringOp) { m_OpType = CellStringOp.m_OpType; m_InterceptIdx = CellStringOp.m_InterceptIdx; m_InterceptLen = CellStringOp.m_InterceptLen; m_NextPos = CellStringOp.m_NextPos; m_MatchTruePos = CellStringOp.m_MatchTruePos; m_MatchFalsePos = CellStringOp.m_MatchFalsePos; m_OpVarName = CellStringOp.m_OpVarName; m_ResultVarName = CellStringOp.m_ResultVarName; m_ReplaceVarName = CellStringOp.m_ReplaceVarName; m_ReplaceAsVarName = CellStringOp.m_ReplaceAsVarName; m_MatchVarName = CellStringOp.m_MatchVarName; m_AppendVarName = CellStringOp.m_AppendVarName; } CCellStringOp::~CCellStringOp(void) { } /***************************************************************** **【函数名称】 operate **【函数功能】 节点执行函数 **【参数】 **【返回值】 下一个节点编号 ****************************************************************/ int CCellStringOp::operate( void ) { if(m_pIvrFlow == NULL) return CELL_OP_ERROR; CString Info; _getCellInfo(Info); ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{Cell}: 开始执行[%s]"), Info); CString strSourceString; if( !m_pIvrFlow->findVarValue( m_OpVarName, strSourceString ) ) { ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{Cell}: 执行[%s]出错, 操作字符串[%s]未找到相应值"), Info, m_OpVarName); return CELL_OP_ERROR; } switch(m_OpType) { case STRING_OP_TRIM: { strSourceString.Trim(); m_pIvrFlow->addVar(m_ResultVarName, strSourceString); return m_NextPos; } break; case STRING_OP_SUB: { CString strTmp = strSourceString.Mid( m_InterceptIdx, m_InterceptLen ); m_pIvrFlow->addVar(m_ResultVarName, strTmp); return m_NextPos; } break; case STRING_OP_REPLACE: { CString strSourceReplace = ""; CString strDestReplace = ""; if( !m_pIvrFlow->findVarValue( m_ReplaceVarName, strSourceReplace ) ) { ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{Cell}: 执行[%s]出错, 被替换字符串[%s]未找到相应值"), Info, m_ReplaceVarName); return CELL_OP_ERROR; } if( !m_pIvrFlow->findVarValue( m_ReplaceAsVarName, strDestReplace ) ) { ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{Cell}: 执行[%s]出错, 替换为字符串[%s]未找到相应值"), Info, m_ReplaceAsVarName); return CELL_OP_ERROR; } strSourceString.Replace( strSourceReplace, strDestReplace ); m_pIvrFlow->addVar( m_ResultVarName, strSourceString ); return m_NextPos; } break; case STRING_OP_MATCH: { CString strMatch; if( !m_pIvrFlow->findVarValue( m_MatchVarName, strMatch ) ) { ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{Cell}: 执行[%s]出错, 匹配字符串[%s]未找到相应值"), Info, m_MatchVarName); return CELL_OP_ERROR; } if( strMatch == strSourceString ) return m_MatchTruePos; else return m_MatchFalsePos; } break; case STRING_OP_APPEND: { CString strDestString; if( !m_pIvrFlow->findVarValue( m_AppendVarName, strDestString ) ) { ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{Cell}: 执行[%s]出错, 合并字符串[%s]未找到相应值"), Info, m_AppendVarName); return CELL_OP_ERROR; } strSourceString += strDestString; m_pIvrFlow->addVar( m_ResultVarName, strSourceString ); return m_NextPos; } break; default: ASSERT(FALSE); } return CELL_OP_ERROR; } /***************************************************************** **【函数名称】 copy **【函数功能】 拷贝自身 **【参数】 **【返回值】 拷贝副本 ****************************************************************/ CCellBase * CCellStringOp::copy( void ) { CCellBase * pCellBase = new CCellStringOp(*this); return pCellBase; } /***************************************************************** **【函数名称】 fillData **【函数功能】 节点解析,填充数据 **【参数】 Provider:数据提供器 **【返回值】 成功true,失败false ****************************************************************/ bool CCellStringOp::fillData( IFlowDataProvider& Provider ) { CString Data; do { if(!Provider.getData(CELL_ATTRIBUTE_POS, Data)) { Data = _T("节点号"); break; } else { sscanf_s(Data, _T("%d"), &m_Pos); if(m_Pos < 1) { Data = _T("节点号"); break; } } if(!Provider.getData(CELL_ATTRIBUTE_OPERATE_TYPE, Data)) { Data = _T("操作类型"); break; } else { sscanf_s(Data, _T("%d"), &m_OpType); if(m_OpType < STRING_OP_TRIM || m_OpType > STRING_OP_APPEND) { Data = _T("操作类型"); break; } } if(!Provider.getData(CELL_ATTRIBUTE_OPERATE_VAR, m_OpVarName)) { Data = _T("操作字符串"); break; } if(!Provider.getData(CELL_ATTRIBUTE_RESULT_VAR, m_ResultVarName)) { Data = _T("存储结果变量"); break; } if(!Provider.getData(CELL_ATTRIBUTE_REPLACE_VAR, m_ReplaceVarName)) { Data = _T("被替换字符串变量"); break; } if(!Provider.getData(CELL_ATTRIBUTE_REP_AS_VAR, m_ReplaceAsVarName)) { Data = _T("替换为字符串变量"); break; } if(!Provider.getData(CELL_ATTRIBUTE_MATCH_VAR, m_MatchVarName)) { Data = _T("匹配字符串变量"); break; } if(!Provider.getData(CELL_ATTRIBUTE_APPEND_VAR, m_AppendVarName)) { Data = _T("合并字符串变量"); break; } if(!Provider.getData(CELL_ATTRIBUTE_INTERCEPT_INDEX, Data)) { Data = _T("截取开始索引"); break; } else { sscanf_s(Data, _T("%d"), &m_InterceptIdx); if(m_OpType == STRING_OP_SUB && m_InterceptIdx < 0) { Data = _T("截取开始索引"); break; } } if(!Provider.getData(CELL_ATTRIBUTE_INTERCEPT_LEN, Data)) { Data = _T("截取长度"); break; } else { sscanf_s(Data, _T("%d"), &m_InterceptLen); if(m_OpType == STRING_OP_SUB && m_InterceptLen < 1) { Data = _T("截取长度"); break; } } if(!Provider.getData(CELL_ATTRIBUTE_NEXT, Data)) { Data = _T("跳转节点"); break; } else { sscanf_s(Data, _T("%d"), &m_NextPos); if(m_NextPos < 1) { Data = _T("跳转节点"); break; } } if(!Provider.getData(CELL_ATTRIBUTE_TRUE_POS, Data)) { Data = _T("匹配为真跳转节点"); break; } else { sscanf_s(Data, _T("%d"), &m_MatchTruePos); if(m_OpType == STRING_OP_MATCH && m_MatchTruePos < 1) { Data = _T("匹配为真跳转节点"); break; } } if(!Provider.getData(CELL_ATTRIBUTE_FALSE_POS, Data)) { Data = _T("匹配为假跳转节点"); break; } else { sscanf_s(Data, _T("%d"), &m_MatchFalsePos); if(m_OpType == STRING_OP_MATCH && m_MatchFalsePos < 1) { Data = _T("匹配为假跳转节点"); break; } } Provider.getData(CELL_ATTRIBUTE_NOTE, m_Note); return true; } while (false); ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_ERROR, _T("{Cell}: 节点[%s]解析失败, '%s'错误"), CELL_NAME_STRING_OP, Data); return false; }