diff -r e8c1ea2c6496 -r 8758140453c0 email/testutils/src/T_UtilsConfigFileParserUtility.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/email/testutils/src/T_UtilsConfigFileParserUtility.cpp Thu Jan 21 12:53:44 2010 +0000 @@ -0,0 +1,275 @@ +// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// This is the CPP file which contains utility functions for parsing the config file +// +// + + + +/** + @file +*/ + + +// User include +#include + +// epoc inlcude +#include + +// contants and literals used +const TInt KFileBufferSize = 1024; +_LIT8(KComment,"*#*"); + + +/** +NewL() +Allocates and creates a new CT_MsgUtilsConfigFileParserUtility object + +@param aFileName +Name of the file to be parsed + +@leave KErrNoMemory +@return +The newly created CT_MsgUtilsConfigFileParserUtility object +*/ +EXPORT_C CT_MsgUtilsConfigFileParserUtility* CT_MsgUtilsConfigFileParserUtility::NewL(const TDesC& aFileName) + { + CT_MsgUtilsConfigFileParserUtility* self = new (ELeave) CT_MsgUtilsConfigFileParserUtility(); + CleanupStack::PushL(self); + self->ConstructL(aFileName); + CleanupStack::Pop(); + return self; + } + + +/** +CT_MsgUtilsConfigFileParserUtility() +Constructor +*/ +EXPORT_C CT_MsgUtilsConfigFileParserUtility::CT_MsgUtilsConfigFileParserUtility() + { + } + + +/** +~CT_MsgUtilsConfigFileParserUtility() +Destructor +*/ +CT_MsgUtilsConfigFileParserUtility::~CT_MsgUtilsConfigFileParserUtility() + { + iName.ResetAndDestroy(); + iContent.ResetAndDestroy(); + iContent8.ResetAndDestroy(); + } + + +/** +ConstructL() +Parses a .txt file and creates Arrays of fields and there values + +@param aFileName +Name of the file to be parsed. +*/ +EXPORT_C void CT_MsgUtilsConfigFileParserUtility::ConstructL(const TDesC& aFileName) + { + RFs fileServerSession; + + fileServerSession.Connect(); + + RFile file; + User::LeaveIfError(file.Open(fileServerSession, aFileName, EFileRead)); + + TInt eof = EFalse; + TInt fileOffset = 0; + TBuf8 fileBuffer; + + while (!eof) + { + fileBuffer.SetLength(0); + User::LeaveIfError(file.Read(fileOffset, fileBuffer, KFileBufferSize)); + TInt read = fileBuffer.Length(); + + if (read < KFileBufferSize) + { + fileBuffer.Append('\n'); + eof = ETrue; + } + + TInt lineOverflow = fileBuffer.Locate('\n'); + + if ((lineOverflow == KErrNotFound) && (read == KFileBufferSize)) + { + User::Leave(KErrOverflow); + } + + TInt eol = EFalse; + + while (!eol) + { + TInt lineFeedLocation = fileBuffer.Locate('\n'); + + if (lineFeedLocation == KErrNotFound) + { + eol = ETrue; + } + + else + { + fileOffset += lineFeedLocation + 1; + TInt lineLength; + if ((lineFeedLocation != 0) && (fileBuffer[lineFeedLocation - 1] == '\r')) + { + lineLength = lineFeedLocation - 1; + } + + else + { + lineLength = lineFeedLocation; + } + + TPtrC8 line = fileBuffer.Left(lineLength); + TInt commentLocation = line.Match(KComment); + + if (commentLocation != KErrNotFound) + { + TPtrC8 skipComment = line.Left(commentLocation); + line.Set(skipComment); + } + + TInt seperatorLocation = line.Locate('='); + + if (seperatorLocation != KErrNotFound) + { + if ((seperatorLocation == 0) || (seperatorLocation == line.Length() - 1)) + { + seperatorLocation = KErrNotFound; + } + } + + if (seperatorLocation != KErrNotFound) + { + TPtrC8 namePtr = line.Left(seperatorLocation); + HBufC8* nameBuf8 = HBufC8::NewL(namePtr.Length()); + CleanupStack::PushL(nameBuf8); + + TPtr8 name8 = nameBuf8->Des(); + name8.Copy(namePtr); + name8.Trim(); + HBufC* nameBuf16 = HBufC::NewL(namePtr.Length()); + TPtr name16 = nameBuf16->Des(); + name16.Copy(name8); + iName.Append(nameBuf16); + CleanupStack::PopAndDestroy(nameBuf8); + + TPtrC8 contentPtr = line.Mid(seperatorLocation + 1); + HBufC8* contentBuf8 = HBufC8::NewL(contentPtr.Length()); + CleanupStack::PushL(contentBuf8); + TPtr8 content8 = contentBuf8->Des(); + content8.Copy(contentPtr); + content8.Trim(); + + HBufC* contentBuf16 = HBufC::NewL(contentPtr.Length()); + TPtr content16 = contentBuf16->Des(); + content16.Copy(content8); + iContent.Append(contentBuf16); + iContent8.Append(contentBuf8); + CleanupStack::Pop(contentBuf8); + } + TPtrC8 theRest = fileBuffer.Mid(lineFeedLocation + 1); + fileBuffer.Copy(theRest); + } + } + } + + file.Close(); + fileServerSession.Close(); + } + + +/** +GetFieldAsInteger() +Retrives the content of a field name and Interpret it as an integer. + +@param aFieldName +@param aValue +@return +Returns an integer corresponding to the field +*/ +EXPORT_C TInt CT_MsgUtilsConfigFileParserUtility::GetFieldAsInteger(const TDesC& aFieldName, TInt& aValue) + { + TInt count = iName.Count(); + + for (TInt i = 0; iCompare(aFieldName) == 0) + { + TPtrC content = iContent[i]->Des(); + TLex lex(content); + lex.Val(aValue); + return (KErrNone); + } + } + return (KErrNotFound); + } + + +/** +GetFieldAsString() +Retrives the content of a field name and Interpret it as an string + +@param aFieldName +@param aValue +@return +Returns an string corresponding to the field +*/ +EXPORT_C TInt CT_MsgUtilsConfigFileParserUtility::GetFieldAsString(const TDesC& aFieldName, TPtrC& aString) + { + TInt count = iName.Count(); + + for (TInt i = 0; iCompare(aFieldName) == 0) + { + aString.Set(*iContent[i]); + return (KErrNone); + } + } + return (KErrNotFound); + } + + +/** +GetFieldAsString8() +Retrives the content of a field name and Interpret it as an 8-bit descriptor + +@param aFieldName +@param aValue +@return +Returns an 8-bit descriptor corresponding to the field +*/ +EXPORT_C TInt CT_MsgUtilsConfigFileParserUtility::GetFieldAsString8(const TDesC& aFieldName, TPtrC8& aString) + { + TInt count = iName.Count(); + + for (TInt i = 0; iCompare(aFieldName) == 0) + { + aString.Set(*iContent8[i]); + return (KErrNone); + } + } + return (KErrNotFound); + }