diff -r 000000000000 -r 3553901f7fa8 telephonyprotocols/csdagt/script/SVARLAB.CPP --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telephonyprotocols/csdagt/script/SVARLAB.CPP Tue Feb 02 01:41:59 2010 +0200 @@ -0,0 +1,258 @@ +// Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// Variable and Label Storage/Retrieval +// +// + +/** + @file Svarlab.cpp +*/ + +#include "SVARLAB.H" +#include "ND_STD.H" +#include "SSCRREAD.H" + +_LIT(KIntegerVariableString,"%d"); + +const TInt KLabelArrayGranularity=10; +const TInt KVarArrayGranularity=20; +const TInt KVarValueLength=15; + +// CScriptLabelMan definitions + +CScriptLabelMan* CScriptLabelMan::NewL() + +/** +2 phased constructor for CScriptLabelMan, first phase. + +@exception Leaves if ConstructL() leaves, or not enough memory is available. +@return a new CScriptLabelMan object. +*/ + { + CScriptLabelMan* m=new(ELeave) CScriptLabelMan(); + CleanupStack::PushL(m); + m->ConstructL(); + CleanupStack::Pop(); + return m; + } + +CScriptLabelMan::CScriptLabelMan() +/** +Constructor for CScriptReader, used in the first phase of construction. +*/ + {} + +void CScriptLabelMan::ConstructL() +/** +Instantiate member variables. +*/ + { + iLabelArray=new(ELeave) CArrayFixFlat(KLabelArrayGranularity); + } + +CScriptLabelMan::~CScriptLabelMan() +/** +Destructor. +Delete members. +*/ + { + DeleteAll(); + delete iLabelArray; + } + +void CScriptLabelMan::AddLabelL(const TDesC& aLabelName,const TLinePosition& aPosition) +/** +Add a label with name aLabelName and position aPosition to the array if it is +not already in the array. + +@param aLabelName a reference to label name. +@param aPosition a reference to script position. +*/ + { + if (aLabelName.Length()>KMaxLabelLength) + User::Leave(KErrLabelNameTooLong); + + TLinePosition dummyPos; + if (FindLabel(aLabelName,dummyPos)==KErrNotFound) + { + TLabel label; + label.iName.CopyF(aLabelName); + label.iPosition=aPosition; + iLabelArray->AppendL(label); + } + else + { + // Encountered a label name that already exists - If it's + // in EXACTLY the same place in the script as the existing + // instance then it's actually the SAME label re-visited as + // a result of executing a loop/branch operation, if it's in + // a different place then it's an error in the script... + if ((aPosition.iLineCount != dummyPos.iLineCount) || + (aPosition.iOffset != dummyPos.iOffset)) + { + User::Leave(KErrAlreadyExists); + } + } + } + +TInt CScriptLabelMan::FindLabel(const TDesC& aLabelName,TLinePosition& aPosition) +/** +Find label with name aLabelName and set aPos to position and aLine to line. + +@param aLabelName a reference to label name. +@param aPosition a reference to script position. +@return a KErrNone or KErrNotFound. +*/ + { + TInt index; + for (index=0; indexCount(); index++) + { + if((*iLabelArray)[index].iName.CompareF(aLabelName)==0) + { + aPosition=(*iLabelArray)[index].iPosition; + return KErrNone; + } + } + return KErrNotFound; + } + +void CScriptLabelMan::DeleteAll() +/** +Delete all labels from the array +*/ + { + if (!iLabelArray) + return; + + TInt count=iLabelArray->Count(); + iLabelArray->Delete(0,count); + } + +// CScriptVarMan definitions + +CScriptVarMan* CScriptVarMan::NewL() +/** +2 phased constructor for CScriptVarMan, first phase. + +@exception Leaves if ConstructL() leaves, or not enough memory is available. +@return a new CScriptVarMan object. +*/ + { + CScriptVarMan* m=new(ELeave) CScriptVarMan(); + CleanupStack::PushL(m); + m->ConstructL(); + CleanupStack::Pop(); + return m; + } + +CScriptVarMan::CScriptVarMan() +/** +Constructor for CScriptReader, used in the first phase of construction. +*/ + {} + +void CScriptVarMan::ConstructL() +/** +Instantiate member variables. +*/ + { + iVarArray=new(ELeave) CArrayFixFlat(KVarArrayGranularity); + } + +CScriptVarMan::~CScriptVarMan() +/** +Destructor. +Delete members. +*/ + { + DeleteAll(); + delete iVarArray; + } + +void CScriptVarMan::AddVariableL(const TDesC& aName,const TDesC& aContent) +/** +Add variable with name aName and aContent to the array + +@param aName a reference to variable name. +@param aContent a reference to content. +*/ + { + if (aName.Length()>KMaxVarNameLength) + User::Leave(KErrVariableNameTooLong); + + HBufC* contentCopy=HBufC::NewLC(aContent.Length()); + contentCopy->Des().Copy(aContent); + + TPtrC dummy; + if (FindVariable(aName,dummy)==KErrNotFound) + { + TVar var; + var.iContent=contentCopy; + var.iName.CopyF(aName); + iVarArray->AppendL(var); + } + else + { + delete (*iVarArray)[iIndex].iContent; // FindVariable() will have set iIndex correctly + (*iVarArray)[iIndex].iContent=contentCopy; + } + CleanupStack::Pop(); + } + +void CScriptVarMan::AddVariableL(const TDesC& aName,TInt aVal) +/** +Add variable with name aName and value aVal to the array + +@param aName a reference to variable name. +@param aVal is variable value. +*/ + { + TBuf buf; + buf.Format(KIntegerVariableString,aVal); + AddVariableL(aName,buf); + } + +TInt CScriptVarMan::FindVariable(const TDesC& aName,TPtrC& aContent) +/** +Find variable with name aName and put its value in aContent + +@param aName a reference to variable name. +@param aContent a reference to content. +@return a KErrNone or KErrNotFound. +*/ + { + for (iIndex=0; iIndexCount(); iIndex++) + { + if ((*iVarArray)[iIndex].iName.CompareF(aName)==0) + { + aContent.Set((*iVarArray)[iIndex].iContent->Des()); + return KErrNone; + } + } + return KErrNotFound; + } + +void CScriptVarMan::DeleteAll() +/** +Delete all variables from the array +*/ + { + if (!iVarArray) + return; + + TInt i; + for (i=0; iCount(); i++) + delete (*iVarArray)[i].iContent; + iVarArray->Reset(); + }