telephonyprotocols/csdagt/script/SVARLAB.CPP
changeset 0 3553901f7fa8
--- /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<TLabel>(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; index<iLabelArray->Count(); 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<TVar>(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<KVarValueLength> 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; iIndex<iVarArray->Count(); 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; i<iVarArray->Count(); i++)
+		delete (*iVarArray)[i].iContent;
+	iVarArray->Reset();
+	}