--- /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 <t_utilsconfigfileparserutility.h>
+
+// epoc inlcude
+#include <f32file.h>
+
+// 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<KFileBufferSize> 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; i<count; i++)
+ {
+ if (iName[i]->Compare(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; i<count; i++)
+ {
+ if (iName[i]->Compare(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; i<count; i++)
+ {
+ if (iName[i]->Compare(aFieldName) == 0)
+ {
+ aString.Set(*iContent8[i]);
+ return (KErrNone);
+ }
+ }
+ return (KErrNotFound);
+ }