diff -r ab72d5c1d770 -r b34bb05ac869 telephonyserverplugins/simtsy/testconfigfileparser/src/testconfigsection.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telephonyserverplugins/simtsy/testconfigfileparser/src/testconfigsection.cpp Wed Aug 25 14:35:42 2010 +0100 @@ -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 + + +// +// 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& 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& 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; + }