#include "StdAfx.h" #include "CellMapRecord2Var.h" #include "IvrFlow.h" #include "FlowDataProvider.h" IMPLEMENT_CELL_AUTOCREATE(CCellMapRecord2Var, CELL_NAME_RECORDSET) CCellMapRecord2Var::CCellMapRecord2Var(void) : m_LPos(0), m_EPos(0), m_GPos(0) { } CCellMapRecord2Var::CCellMapRecord2Var( CCellMapRecord2Var & CellMapRecord2Var ) : CCellBase(CellMapRecord2Var) { m_LPos = CellMapRecord2Var.m_LPos; m_EPos = CellMapRecord2Var.m_EPos; m_GPos = CellMapRecord2Var.m_GPos; int Count = CellMapRecord2Var.m_VarArray.GetCount(); for( int i = 0; i < Count; ++i ) m_VarArray.Add( CellMapRecord2Var.m_VarArray[i] ); } CCellMapRecord2Var::~CCellMapRecord2Var(void) { } /***************************************************************** **【函数名称】 Operate **【函数功能】 节点执行函数 **【参数】 **【返回值】 下一个节点编号 ****************************************************************/ int CCellMapRecord2Var::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); // 要保存变量的个数 const int nCount = m_VarArray.GetCount(); DataSet& RS = m_pIvrFlow->recordSet(); POSITION pos = RS.GetHeadPosition(); int nIndex = 0; CString strResult = _T(""); while(pos != NULL) { CString strName = m_VarArray[nIndex]; CString strValue = RS.GetNext(pos); // 保存变量 m_pIvrFlow->addVar( strName, strValue ); if (strValue.GetLength() >= BUFF_LEN) strResult += "{" + strName + "};"; else strResult += "{" + strName + "=" + strValue + "};"; // 字段数多于要保存的变量数 if(++nIndex >= nCount) break; } // end while ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{Cell}: 执行[%s]结束, Result = %s"), Info, strResult); if(nCount == RS.GetCount()) return m_EPos; else if(nCount < RS.GetCount()) return m_LPos; else return m_GPos; } /***************************************************************** **【函数名称】 copy **【函数功能】 拷贝自身 **【参数】 **【返回值】 拷贝副本 ****************************************************************/ CCellBase * CCellMapRecord2Var::copy( void ) { CCellBase *pCellBase = new CCellMapRecord2Var(*this); return pCellBase; } /***************************************************************** **【函数名称】 fillData **【函数功能】 节点解析,填充数据 **【参数】 Provider:数据提供器 **【返回值】 成功true,失败false ****************************************************************/ bool CCellMapRecord2Var::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; } } Data.Format(_T("%s[@%s='%d']/%s"), XPATH_CELL, CELL_ATTRIBUTE_POS, m_Pos, FLOW_SUB_NODE_MAP); if(!Provider.getDataSet(Data, CELL_ATTRIBUTE_VAR, m_VarArray)) { Data = _T("映射变量"); break; } if(!Provider.getData(CELL_ATTRIBUTE_LPOS, Data)) { Data = _T("映射数小于记录集时跳转节点"); break; } else { sscanf_s(Data, _T("%d"), &m_LPos); if(m_LPos < 0) { Data = _T("映射数小于记录集时跳转节点"); break; } } if(!Provider.getData(CELL_ATTRIBUTE_EPOS, Data)) { Data = _T("映射数等于记录集时跳转节点"); break; } else { sscanf_s(Data, _T("%d"), &m_EPos); if(m_EPos < 0) { Data = _T("映射数等于记录集时跳转节点"); break; } } if(!Provider.getData(CELL_ATTRIBUTE_GPOS, Data)) { Data = _T("映射数大于记录集时跳转节点"); break; } else { sscanf_s(Data, _T("%d"), &m_GPos); if(m_GPos < 0) { 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_RECORDSET, Data); return false; }