telephonyserverplugins/simtsy/testconfigfileparser/src/testconfigsection.cpp
branchRCL_3
changeset 19 630d2f34d719
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/telephonyserverplugins/simtsy/testconfigfileparser/src/testconfigsection.cpp	Tue Aug 31 16:23:08 2010 +0300
@@ -0,0 +1,312 @@
+/*
+* Copyright (c) 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: 
+*
+*/
+#include "testconfigfileparser.h"
+#include <f32file.h>
+
+
+//
+// CTestConfigSection
+//
+
+CTestConfigSection::CTestConfigSection()
+	: CBase()
+	{
+	}
+
+EXPORT_C CTestConfigSection* CTestConfigSection::NewLC(const TDesC8& aSectionName, CTestConfigSection& aDefaults)
+	{
+	CTestConfigSection* self = new (ELeave) CTestConfigSection();
+	CleanupStack::PushL(self);
+	self->iDefaults = aDefaults.CopyLC();
+	CleanupStack::Pop(self->iDefaults);
+	self->ConstructL(aSectionName);
+	return self;
+	}
+
+EXPORT_C CTestConfigSection* CTestConfigSection::NewLC(const TDesC8& aSectionName)
+	{
+	CTestConfigSection* self = new (ELeave) CTestConfigSection();
+	CleanupStack::PushL(self);
+	self->ConstructL(aSectionName);
+	return self;
+	}
+
+void CTestConfigSection::ConstructL(const TDesC8& aSectionName)
+	{
+	iSectionName = aSectionName.AllocL();
+	}
+
+EXPORT_C const TDesC8& CTestConfigSection::ItemValue(const TDesC8& aItem, const TDesC8& aDefault) const
+	{
+	const CTestConfigItem* sectionItem = Item(aItem);
+
+	if (sectionItem != NULL)
+		{
+		const TPtrC8 value(sectionItem->Value());
+
+		if (iDefaults != NULL && (value.CompareF(KScriptDefault1) == 0 || value.CompareF(KScriptDefault2) == 0))
+			{
+			return iDefaults->ItemValue(aItem, aDefault);
+			}
+		else
+			{
+			return sectionItem->Value();
+			}
+		}
+	else if (iDefaults != NULL)
+		{
+		return iDefaults->ItemValue(aItem, aDefault);
+		}
+	else
+		{
+		return aDefault;
+		}
+	}
+
+
+EXPORT_C TInt CTestConfigSection::ItemValue(const TDesC8& aItem, const TInt aDefault) const
+	{
+	const TDesC8& value = ItemValue(aItem, KNullDesC8);
+
+	if (value.Length() == 0)
+		{
+		if (iDefaults != NULL)
+			return iDefaults->ItemValue(aItem, aDefault);
+		else
+			return aDefault;
+		}
+
+	TLex8 input(value);
+	TInt ret = aDefault;
+	TInt err = input.Val(ret);
+	
+	if (err)
+		{
+		if (iDefaults != NULL)
+			return iDefaults->ItemValue(aItem, aDefault);
+		else
+			return aDefault;
+		}
+
+	return ret;
+	}
+
+EXPORT_C CTestConfigItem& CTestConfigSection::AddItemL(const TDesC8& aItem, const TDesC8& aValue)
+	{
+	CTestConfigItem* sectionItem = CTestConfigItem::NewLC(*this, aItem, aValue);
+	User::LeaveIfError(iItems.Append(sectionItem));
+	CleanupStack::Pop(sectionItem);
+	return *sectionItem;
+	}
+
+EXPORT_C void CTestConfigSection::DeleteItemsL(const TDesC8& aItem)
+	{
+	TInt count = iItems.Count();
+
+	//Remove existing CTestConfigItems that have the same item name
+	while (count--)
+		{
+		CTestConfigItem* sectionItem = iItems[count];
+
+		if (sectionItem->Item().CompareF(aItem) == 0)
+			{
+			delete sectionItem;
+			iItems.Remove(count);
+			}
+		}	
+	}
+
+
+EXPORT_C CTestConfigSection::~CTestConfigSection()
+	{
+	iItems.ResetAndDestroy();
+	iItems.Close();
+
+	delete iSectionName;
+	delete iDefaults;
+	}
+
+EXPORT_C CTestConfigSection* CTestConfigSection::CopyLC() const
+	{
+	TInt count = iItems.Count();
+	CTestConfigSection* copy = NULL;
+
+	if (iDefaults != NULL)
+		copy = CTestConfigSection::NewLC(SectionName(), *iDefaults);
+	else
+		copy = CTestConfigSection::NewLC(SectionName());
+		
+	while (count--)
+		{
+		CTestConfigItem* item = iItems[count]->CopyLC();
+		User::LeaveIfError(copy->iItems.Append(item));
+		CleanupStack::Pop(item);
+		}
+
+	return copy;
+	}
+
+void CTestConfigSection::WriteL(RFile& aFile) const
+	{
+	//Write the section name
+	HBufC8* buf = HBufC8::NewLC(iSectionName->Length());
+	buf->Des().Copy(*iSectionName);
+
+	User::LeaveIfError(aFile.Write(KScriptSectionStart));
+	User::LeaveIfError(aFile.Write(*buf));
+	User::LeaveIfError(aFile.Write(KScriptSectionEnd));
+	User::LeaveIfError(aFile.Write(KScriptCRLF8));
+
+	CleanupStack::PopAndDestroy(buf);
+	const TInt count = iItems.Count();
+
+	//Write the items
+	for (TInt i = 0; i < count; i++)
+		iItems[i]->WriteL(aFile);
+
+	User::LeaveIfError(aFile.Write(KScriptCRLF8));
+	}
+
+TBool CTestConfigSection::operator==(const CTestConfigSection& aSection) const
+	{
+	TInt count = iItems.Count();
+
+	if (count != aSection.Items().Count())
+		return EFalse;
+
+	TBool retVal = (*iSectionName == aSection.SectionName());
+
+	while (count-- && retVal)
+		{
+		retVal = retVal && (*iItems[count] == aSection[count]);
+		}
+
+	return retVal;
+	}
+
+EXPORT_C const CTestConfigItem* CTestConfigSection::Item(const TDesC8& aItem) const
+	{
+	const CTestConfigItem* sectionItem = NULL;
+	const TInt count = iItems.Count();
+	for (TInt i = 0; i < count; i++)
+		{
+		if (iItems[i]->Item().CompareF(aItem) == 0)
+			{
+			sectionItem = iItems[i];
+			break;
+			}
+		}
+	return sectionItem;
+	}
+
+EXPORT_C CTestConfigItem* CTestConfigSection::Item(const TDesC8& aItem)
+	{
+	CTestConfigItem* sectionItem = NULL;
+	const TInt count = iItems.Count();
+	for (TInt i = 0; i < count; i++)
+		{
+		if (iItems[i]->Item().CompareF(aItem) == 0)
+			{
+			sectionItem = iItems[i];
+			break;
+			}
+		}
+	return sectionItem;
+	}
+
+EXPORT_C const CTestConfigItem* CTestConfigSection::Item(const TDesC8& aItem,TInt aIndex) const
+	{
+	const CTestConfigItem* sectionItem = NULL;
+	const TInt count = iItems.Count();
+	TInt foundItemCnt=0;
+	for (TInt i = 0; i < count; i++)
+		{
+		if (iItems[i]->Item().CompareF(aItem) == 0)
+			{
+			if(foundItemCnt++==aIndex)
+				{
+				sectionItem = iItems[i];
+				break;
+				}
+			}
+		}
+	return sectionItem;
+	}
+
+EXPORT_C CTestConfigItem* CTestConfigSection::Item(const TDesC8& aItem,TInt aIndex)
+	{
+	CTestConfigItem* sectionItem = NULL;
+	const TInt count = iItems.Count();
+	TInt foundItemCnt=0;
+	for (TInt i = 0; i < count; i++)
+		{
+		if (iItems[i]->Item().CompareF(aItem) == 0)
+			{
+			if(foundItemCnt++==aIndex)
+				{
+				sectionItem = iItems[i];
+				break;
+				}
+			}
+		}
+	return sectionItem;
+	}
+
+EXPORT_C void CTestConfigSection::ItemsL(RPointerArray<CTestConfigItem>& aArray, const TDesC8& aItemTag)
+	{
+	aArray.Reset();
+	const TInt count = iItems.Count();
+
+	for (TInt i = 0; i < count; i++) //< Order important
+		{
+		CTestConfigItem& item = *iItems[i];
+
+		if (item.Item().CompareF(aItemTag) == 0)
+			{
+			User::LeaveIfError(aArray.Append(&item));
+			}
+		}
+	}
+
+EXPORT_C void CTestConfigSection::ItemsL(RPointerArray<const CTestConfigItem>& aArray, const TDesC8& aItemTag) const
+	{
+	aArray.Reset();
+	const TInt count = iItems.Count();
+
+	for (TInt i = 0; i < count; i++) //< Order important
+		{
+		const CTestConfigItem& item = *iItems[i];
+
+		if (item.Item().CompareF(aItemTag) == 0)
+			{
+			User::LeaveIfError(aArray.Append(&item));
+			}
+		}
+	}
+
+
+EXPORT_C TInt CTestConfigSection::ItemCount(const TDesC8& aItem) const
+	{
+	const TInt count = iItems.Count();
+	TInt foundItemCnt=0;
+	for (TInt i = 0; i < count; i++)
+		{
+		if (iItems[i]->Item().CompareF(aItem) == 0)
+			foundItemCnt++;
+		}
+	return foundItemCnt;
+	}