email/testutils/src/T_Utils.cpp
branchSymbian2
changeset 1 8758140453c0
child 6 c108117318cb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/email/testutils/src/T_Utils.cpp	Thu Jan 21 12:53:44 2010 +0000
@@ -0,0 +1,904 @@
+// 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 the utility functions common across the servers
+// 
+//
+
+
+
+/**
+ @file
+*/
+
+
+// User includes
+#include <t_utils.h>
+#include <t_utilscentralrepository.h>
+
+// Epoc includes
+#include <msvids.h>
+#include <bautils.h>
+#include <msvutils.h>
+#include <barsc.h>
+
+
+// Literals Used
+const TInt KDefBufferSize = 1024;
+
+
+/**
+CT_MsgUtils()
+Constructor
+*/
+EXPORT_C CT_MsgUtils::CT_MsgUtils()
+	{
+	}
+
+
+/**
+~CT_MsgUtils()
+Constructor
+*/
+CT_MsgUtils::~CT_MsgUtils()
+	{
+	}
+
+/**
+OpenResourceFileL()
+Opens a resource File
+
+@param rFile
+Resource File Handle
+
+@param anFs
+File Session associated
+
+@param aFileName
+The Name of resource File to be opened
+*/
+EXPORT_C void CT_MsgUtils::OpenResourceFileL(RResourceFile& rFile, RFs& anFs, const TDesC& aFileName )
+ 	{
+ 	// open resource file
+ 	TFileName fileName(aFileName);
+ 	MsvUtils::AddPathAndExtensionToResFileL(fileName);
+ 	BaflUtils::NearestLanguageFile( anFs, fileName );
+ 	if (BaflUtils::FileExists(anFs,fileName))
+  		{
+ 		rFile.OpenL( anFs, fileName );
+  		return;
+  		}
+  	User::Leave(KErrNotFound);
+ 	}
+
+/**
+CloseResourceFile()
+Closes a recource File
+
+@param aFile
+The Name of resource File to be closed
+*/
+ EXPORT_C void CT_MsgUtils::CloseResourceFile( TAny* aFile )
+ 	{
+ 	((RResourceFile*)aFile)->Close();
+ 	}
+
+
+/**
+FindEntryByNameL()
+Search the entries under a given folder ID by name of the entry
+i.e, iDescription or iDetails value of an entry
+
+@param aSession
+Session object
+
+@param aParentId
+Parent Id under which the entry needs to be found
+
+@param aEntryName
+The entry name that needs to be found
+
+@leave KErrNotFound
+Leaves if no entry's iDescription or iDetails matches with aEntryName
+
+@return
+Id of the entry that match 
+*/
+EXPORT_C TMsvId CT_MsgUtils::FindEntryByNameL(CMsvSession* aSession, TMsvId aParentId, TDesC& aEntryName, TBool aCaseSensitive)
+	{
+	
+	TMsvId msgEntryId = KMsvNullIndexEntryId;
+
+	// Set the context to the Parent
+	CMsvEntry* entry = CMsvEntry::NewL(*aSession, aParentId,TMsvSelectionOrdering
+									(KMsvNoGrouping,EMsvSortByNone, ETrue));
+	CleanupStack::PushL(entry);
+	
+	entry->SetEntryL(aParentId);
+ 	
+ 	msgEntryId = FindEntryByNameL(entry, aEntryName, aCaseSensitive);
+ 	
+ 	CleanupStack::PopAndDestroy(entry);
+ 	
+ 	return msgEntryId;
+	}
+
+
+/**
+FindEntryByNameL()
+Search the entries under a given folder ID by name of the entry
+i.e, iDescription or iDetails value of an entry
+
+@param aSession
+Session object
+
+@param aParentId
+Parent Id under which the entry needs to be found
+
+@param aEntryName
+The entry name that needs to be found
+
+@param aParentEntryName
+The Parent entry name that needs to be matched with the entry found
+
+@leave KErrNotFound
+Leaves if no entry's iDescription or iDetails matches with aEntryName
+
+@return
+Id of the entry that match 
+*/
+EXPORT_C TMsvId CT_MsgUtils::FindEntryByNameL(CMsvSession* aSession, TMsvId aParentId, TDesC& aEntryName, TDesC& aParentEntryName, TBool aCaseSensitive)
+	{
+	
+	TMsvId msgEntryId = KMsvNullIndexEntryId;
+	
+	// Set the context to the Parent
+	CMsvEntry* entry = CMsvEntry::NewL(*aSession, aParentId,TMsvSelectionOrdering
+									(KMsvNoGrouping,EMsvSortByNone, ETrue));
+	CleanupStack::PushL(entry);
+	
+	entry->SetEntryL(aParentId);
+
+ 	msgEntryId = FindEntryByNameL(entry, aEntryName, aParentEntryName, aCaseSensitive);
+ 	
+ 	CleanupStack::PopAndDestroy(entry);
+ 	
+ 	return msgEntryId;
+	}
+
+
+/**
+FindEntryByNameL()
+Search the entries under a given entry(an object of CMsvEntry) by name of the entry
+i.e, iDescription or iDetails value of an entry
+
+@param aEntry	
+Parent entry under which the given entry needs to be searched
+
+@param aEntryName
+The entry name that needs to be found
+
+@leave KErrNotFound
+Leaves if no entry's iDescription or iDetails matches with aEntryName
+
+@return
+Id of the entry that match 
+*/
+EXPORT_C TMsvId  CT_MsgUtils::FindEntryByNameL(CMsvEntry* aEntry,TDesC& aEntryName, TBool aCaseSensitive)
+	{
+	TMsvId msgEntryId = KMsvNullIndexEntryId;
+	
+	msgEntryId = RecFindEntryByNameL(*aEntry, aEntryName, aCaseSensitive);
+	
+	if(msgEntryId == KMsvNullIndexEntryId)
+		{
+		User::Leave(KErrNotFound);
+		}
+
+	return msgEntryId;
+	}
+
+
+/**
+FindEntryByNameL()
+Search the entries under a given entry(an object of CMsvEntry) by name of the entry
+i.e, iDescription or iDetails value of an entry
+
+@param aEntry	
+Parent entry under which the given entry needs to be searched
+
+@param aEntryName
+The entry name that needs to be found
+
+@param aParentEntryName
+The Parent entry name that needs to be matched with the entry found
+
+@leave KErrNotFound
+Leaves if no entry's iDescription or iDetails matches with aEntryName
+
+@return
+Id of the entry that match 
+*/
+EXPORT_C TMsvId  CT_MsgUtils::FindEntryByNameL(CMsvEntry* aEntry,TDesC& aEntryName, TDesC& aParentEntryName, TBool aCaseSensitive)
+	{
+	TMsvId msgEntryId = KMsvNullIndexEntryId;
+	
+	msgEntryId = RecFindEntryByNameL(*aEntry, aEntryName, aParentEntryName, aCaseSensitive);
+	
+	if(msgEntryId == KMsvNullIndexEntryId)
+		{
+		User::Leave(KErrNotFound);
+		}
+
+	return msgEntryId;
+	}
+
+
+/**
+RecFindEntryByNameL()
+Recursively search the entries (including all sub entries) under a given entry (an object of CMsvEntry) 
+by name of the entry i.e, iDescription or iDetails value of an entry
+
+@param aEntry	
+Parent entry under which the given entry needs to be searched
+
+@param aEntryName
+The entry name that needs to be found
+
+@leave KErrNotFound
+Leaves if no entry's iDescription or iDetails matches with aEntryName
+
+@return
+Id of the entry that match 
+*/
+TMsvId  CT_MsgUtils::RecFindEntryByNameL(CMsvEntry& aEntry, TDesC& aEntryName, TBool aCaseSensitive)
+ 	{
+ 
+ 	TMsvId msgEntryId = KMsvNullIndexEntryId;
+ 	
+ 	CMsvEntrySelection* selection = aEntry.ChildrenL();
+ 	CleanupStack::PushL(selection);
+ 	// Search for the entry in the children selection, based on the entry name given
+ 	TBool	found = EFalse;
+ 	TInt count = selection->Count();
+ 	for (TInt index = 0; (index<count) && (!found); index++)
+ 		{
+  		// Set the context to the child entry
+  		aEntry.SetEntryL((*selection)[index]);
+
+		if (aCaseSensitive)
+			{
+			if (( aEntryName.Compare( aEntry.Entry().iDescription ) == 0 ) ||
+			    ( aEntryName.Compare( aEntry.Entry().iDetails ) == 0 ))
+				{
+				found = ETrue;
+				}
+			}
+		else if (( aEntryName.CompareF( aEntry.Entry().iDescription ) == 0 ) ||
+		         ( aEntryName.CompareF( aEntry.Entry().iDetails ) == 0 ))
+			{
+			found = ETrue;
+			}
+
+		if (found)
+			{
+			msgEntryId = (*selection)[index];
+			}
+		else
+			{
+			CMsvEntry* nextEntry = CMsvEntry::NewL(aEntry.Session(), (*selection)[index],TMsvSelectionOrdering(KMsvNoGrouping, EMsvSortByNone, ETrue));
+			CleanupStack::PushL(nextEntry);
+
+			msgEntryId = RecFindEntryByNameL(*nextEntry, aEntryName, aCaseSensitive);
+			if(msgEntryId != KMsvNullIndexEntryId)
+				{
+				found = ETrue;
+				}
+   		CleanupStack::PopAndDestroy(nextEntry);  
+   		}
+ 		}
+		
+ 	CleanupStack::PopAndDestroy(selection);
+ 	return msgEntryId;
+ 	}
+
+
+/**
+RecFindEntryByNameL()
+Recursively search the entries (including all sub entries) under a given entry (an object of CMsvEntry) 
+by name of the entry i.e, iDescription or iDetails value of an entry
+
+@param aEntry	
+Parent entry under which the given entry needs to be searched
+
+@param aEntryName
+The entry name that needs to be found
+
+@param aParentEntryName
+The Parent entry name that needs to be matched with the entry found
+
+@leave KErrNotFound
+Leaves if no entry's iDescription or iDetails matches with aEntryName
+
+@return
+Id of the entry that match 
+*/
+TMsvId  CT_MsgUtils::RecFindEntryByNameL(CMsvEntry& aEntry, TDesC& aEntryName, TDesC& aParentEntryName, TBool aCaseSensitive)
+ 	{
+ 	TMsvId msgEntryId = KMsvNullIndexEntryId;
+ 	
+ 	CMsvEntrySelection* selection = aEntry.ChildrenL();
+ 	CleanupStack::PushL(selection);
+ 	// Search for the entry in the children selection, based on the entry name given
+ 	TBool	found = EFalse;
+ 	TInt count = selection->Count();
+	TBool matched = EFalse;
+ 	
+ 	for (TInt index = 0; (index<count) && (!found); index++)
+ 		{
+  		// Set the context to the child entry
+  		aEntry.SetEntryL((*selection)[index]);
+
+		matched = EFalse;
+
+		if (aCaseSensitive)
+			{
+			if (( aEntryName.Compare( aEntry.Entry().iDescription ) == 0 ) ||
+			    ( aEntryName.Compare( aEntry.Entry().iDetails ) == 0 ))
+				{
+				matched = ETrue;
+				}
+			}
+		else if (( aEntryName.CompareF( aEntry.Entry().iDescription ) == 0 ) ||
+		         ( aEntryName.CompareF( aEntry.Entry().iDetails ) == 0 ))
+			{
+			matched = ETrue;
+			}
+
+		if (matched)
+			{
+			//Check Parent
+			CMsvEntry* parentEntry = CMsvEntry::NewL(aEntry.Session(), aEntry.Entry().Parent(),TMsvSelectionOrdering(KMsvNoGrouping, EMsvSortByNone, ETrue));
+			CleanupStack::PushL(parentEntry);
+
+			if(CheckParent(*parentEntry,aParentEntryName))
+				{
+				found = ETrue;
+				msgEntryId = (*selection)[index];
+				}
+			CleanupStack::PopAndDestroy(parentEntry);
+			}
+
+		if (!found)
+			{
+			CMsvEntry* nextEntry = CMsvEntry::NewL(aEntry.Session(), (*selection)[index],TMsvSelectionOrdering(KMsvNoGrouping, EMsvSortByNone, ETrue));
+			CleanupStack::PushL(nextEntry);
+
+			msgEntryId = RecFindEntryByNameL(*nextEntry, aEntryName, aParentEntryName, aCaseSensitive);
+			if(msgEntryId != KMsvNullIndexEntryId)
+				{
+				found = ETrue;
+				}
+			CleanupStack::PopAndDestroy(nextEntry);
+			}
+  		}
+
+ 	CleanupStack::PopAndDestroy(selection);
+ 	return msgEntryId;
+ 	}
+ 
+ 
+/**
+CheckParent()
+Checks if the given parent name matches the name of the given parent entry
+
+@param aParentEntry	
+Parent entry whose name is to be checked
+
+@param aParentEntryName
+The Parent entry name that we are checking against
+
+@return
+ETrue if they match and EFalse if they do not
+*/
+TBool CT_MsgUtils::CheckParent(CMsvEntry& aParentEntry, TDesC& aParentEntryName)
+	{
+
+ 	TBool ret = EFalse;
+ 	
+ 	if (( aParentEntryName.CompareF( aParentEntry.Entry().iDescription ) == 0 ) ||
+     	( aParentEntryName.CompareF( aParentEntry.Entry().iDetails ) == 0 ))
+ 		{
+ 		ret = ETrue;
+ 		}
+ 	
+ 	return ret;
+	}
+
+
+/**
+CreateChildrenSelectionL()
+This function creates a selection of the children entries under a given parent Id
+
+@param aSession	
+A CMsvSession object
+		
+@param aEntryId	
+Id of the entry
+
+@return
+Returns a selection of all child entries under the given entry
+*/
+EXPORT_C CMsvEntrySelection* CT_MsgUtils::CreateChildrenSelectionL(CMsvSession* aSession, 
+																   TMsvId       aEntryId)
+	{
+	CMsvEntry* entry = CMsvEntry::NewL(*aSession, aEntryId,TMsvSelectionOrdering
+									( KMsvNoGrouping,EMsvSortByNone, ETrue));
+	CleanupStack::PushL(entry);
+	entry->SetEntryL(aEntryId);
+
+	TMsvSelectionOrdering order;
+	order.SetShowInvisibleEntries(ETrue);
+	entry->SetSortTypeL(order);
+
+	CMsvEntrySelection* selection = entry->ChildrenL();
+	CleanupStack::PopAndDestroy(entry);
+	
+	return selection;
+	}
+
+/**
+CreateChildrenSelectionWithTypeL()
+This function creates a selection of the children entries under a given parent Id
+which are of a specified type.
+
+@param aSession	
+A CMsvSession object
+		
+@param aEntryId	
+Id of the entry
+
+@param aType
+Type of entry to look for
+
+@return
+Returns a selection of all child entries under the given entry of the specified type
+*/
+EXPORT_C CMsvEntrySelection* CT_MsgUtils::CreateChildrenSelectionWithTypeL(CMsvSession* aSession, TMsvId aEntryId, TUid aType)
+	{
+	CMsvEntry* entry = CMsvEntry::NewL(*aSession, aEntryId, TMsvSelectionOrdering(KMsvNoGrouping, EMsvSortByNone, ETrue));
+	CleanupStack::PushL(entry);
+	entry->SetEntryL(aEntryId);
+
+	TMsvSelectionOrdering order;
+	order.SetShowInvisibleEntries(ETrue);
+	entry->SetSortTypeL(order);
+
+	CMsvEntrySelection* selection = entry->ChildrenWithTypeL(aType);
+	CleanupStack::PopAndDestroy(entry);
+
+	return selection;
+	}
+
+
+/**
+CreateChildrenSelectionRemoteFolderL()
+This function creates a selection of the child entries under the 
+remote folder Id if the service name is specified
+
+@param aSession		
+A CMsvSession object
+
+@param aAccountName	
+The account name or service name
+
+@param aFolderName
+The name of the remote folder whose entries need to be fetched
+
+@return
+The selection of all entries under the given entry
+*/
+EXPORT_C CMsvEntrySelection*  CT_MsgUtils::CreateChildrenSelectionRemoteFolderL(CMsvSession*
+										aSession,TPtrC aAccountName,TPtrC aFolderName)
+	{
+	TMsvId remoteFolderId = GetRemoteFolderIdByNameL(aSession, aAccountName, aFolderName);
+	return 	CreateChildrenSelectionL(aSession,remoteFolderId);
+	}
+
+/**
+CreateChildrenSelectionRemoteFolderWithTypeL()
+This function creates a selection of the child entries under the 
+remote folder Id with a specified type if the service name is specified
+
+@param aSession		
+A CMsvSession object
+
+@param aAccountName	
+The account name or service name
+
+@param aFolderName
+The name of the remote folder whose entries need to be fetched
+
+@param aType
+Type of entry to look for
+
+@return
+The selection of all entries under the given entry with the specified type
+*/
+EXPORT_C CMsvEntrySelection*  CT_MsgUtils::CreateChildrenSelectionRemoteFolderWithTypeL(CMsvSession*
+										aSession,TPtrC aAccountName,TPtrC aFolderName, TUid aType)
+	{
+	TMsvId remoteFolderId = GetRemoteFolderIdByNameL(aSession, aAccountName, aFolderName);
+	return CreateChildrenSelectionWithTypeL(aSession, remoteFolderId, aType);
+	}
+
+
+/**
+GetRemoteFolderIdByNameL()
+Searches for a given entry under the remote folder Id specified and gets it Id
+
+@param aSession		
+A CMsvSession object
+
+@param aAccountName
+The account name
+
+@param aFolderName
+The name of the remote folder whose Id is to be found
+
+@return
+The Id of the specified folder
+*/
+EXPORT_C TMsvId CT_MsgUtils::GetRemoteFolderIdByNameL(CMsvSession* aSession,TPtrC aAccountName,TPtrC aFolderName, TBool aCaseSensitive)
+	{
+	TMsvId imapServiceId = CT_MsgUtilsCentralRepository::GetImapServiceIdL((TDes&)aAccountName);
+	return CT_MsgUtils::FindEntryByNameL(aSession, imapServiceId, (TDesC&)aFolderName, aCaseSensitive);
+	}
+
+
+/**
+GetRemoteFolderIdByNameL()
+Searches for a given entry under the remote folder Id specified and gets it Id
+
+@param aSession		
+A CMsvSession object
+
+@param aAccountName
+The account name
+
+@param aFolderName
+The name of the remote folder whose Id is to be found
+
+@param aFolderName
+The name of the remote parent folder of the entry to be found
+
+@return
+The Id of the specified folder
+*/
+EXPORT_C TMsvId CT_MsgUtils::GetRemoteFolderIdByNameL(CMsvSession* aSession,TPtrC aAccountName,TPtrC aFolderName, TPtrC aParentFolderName, TBool aCaseSensitive)
+	{
+	TMsvId imapServiceId = CT_MsgUtilsCentralRepository::GetImapServiceIdL((TDes&)aAccountName);
+	return CT_MsgUtils::FindEntryByNameL(aSession, imapServiceId, (TDesC&)aFolderName, (TDesC&)aParentFolderName, aCaseSensitive);
+	}
+
+
+/**
+SearchMessageBySubjectL()
+This function searches for a message based on the 
+subject under the specified local folder
+
+@param aSession
+A CMsvSession object
+
+@param afolderId
+The folder Id under which the search needs to be done
+
+@param aSubject
+The subject name of the message
+
+@leave KErrNotFound
+Leaves if the message is not found
+
+@return
+If the message is found it returns the message Id
+*/
+EXPORT_C TMsvId CT_MsgUtils::SearchMessageBySubjectL(CMsvSession* aSession,TMsvId afolderId,TPtrC aSubject)
+	{
+	TMsvId	messageId = KMsvNullIndexEntryId;
+
+	CMsvEntry*	entry = aSession->GetEntryL(afolderId);
+	CleanupStack::PushL(entry);
+
+	// Set the entry to the source folder id
+	entry->SetEntryL(afolderId);
+
+	//Get CMsvEntrySelection object
+	CMsvEntrySelection*	selection = entry->ChildrenL();
+	CleanupStack::PushL(selection);
+	
+	TInt count = selection->Count();
+
+	if ( count > 0)
+		{
+		CMsvEntry*	childEntry = aSession->GetEntryL(selection->At(0));
+		CleanupStack::PushL(childEntry);
+
+		for(TInt entryIndex = 0 ; entryIndex< count; entryIndex++)
+			{
+			childEntry->SetEntryL(selection->At(entryIndex));
+					
+			if (childEntry->Entry().iDescription.Compare(aSubject) == 0)
+				{	
+				messageId = selection->At(entryIndex);
+				break;
+				}
+			}
+		CleanupStack::PopAndDestroy(childEntry);
+		}
+	if(messageId == KMsvNullIndexEntryId)
+		{
+		User::Leave(KErrNotFound);
+		}
+	CleanupStack::PopAndDestroy(2,entry);	//selection,entry
+	return messageId; 
+	}
+	
+/**
+SearchMessageBySubjectL()
+This function searches for a message based on the subject 
+under the specified local folder. This fucntion provides the
+flexibility of making the invisible children entries visible.
+
+@param aSession
+A CMsvSession object
+
+@param afolderId
+The folder Id under which the search needs to be done
+
+@param aSubject
+The subject name of the message
+
+@leave KErrNotFound
+Leaves if the message is not found
+
+@return
+If the message is found it returns the message Id
+*/
+EXPORT_C TMsvId CT_MsgUtils::SearchMessageBySubjectL(CMsvSession* aSession,TMsvId afolderId,TPtrC aSubject, TBool aVisibleFlag)
+	{
+	TMsvId	messageId = KMsvNullIndexEntryId;
+
+	CMsvEntry*	entry = aSession->GetEntryL(afolderId);
+	CleanupStack::PushL(entry);
+
+	// Set the entry to the source folder id
+	entry->SetEntryL(afolderId);
+	if(aVisibleFlag)
+		{
+		// Make the message entries visible
+		TMsvSelectionOrdering order;
+		order.SetShowInvisibleEntries(ETrue);
+		entry->SetSortTypeL(order);	
+		}
+
+	//Get CMsvEntrySelection object
+	CMsvEntrySelection*	selection = entry->ChildrenL();
+	CleanupStack::PushL(selection);
+	
+	TInt count = selection->Count();
+
+	if ( count > 0)
+		{
+		CMsvEntry*	childEntry = aSession->GetEntryL(selection->At(0));
+		CleanupStack::PushL(childEntry);
+
+		for(TInt entryIndex = 0 ; entryIndex< count; entryIndex++)
+			{
+			childEntry->SetEntryL(selection->At(entryIndex));
+					
+			if (childEntry->Entry().iDescription.Compare(aSubject) == 0)
+				{	
+				messageId = selection->At(entryIndex);
+				break;
+				}
+			}
+		CleanupStack::PopAndDestroy(childEntry);
+		}
+	if(messageId == KMsvNullIndexEntryId)
+		{
+		User::Leave(KErrNotFound);
+		}
+	CleanupStack::PopAndDestroy(2,entry);	//selection,entry
+	return messageId; 
+	}
+	
+/**
+CompareFilesL()
+Compares two input files (ASCII & Unicode).
+
+@param aFileOne
+The first file to be compared
+
+@param aFileTwo
+The second file to be compared
+
+@param aIsUnicode
+To check if its unicode
+
+@param aIgnoreCharList
+An array of type CArrayFixFlat
+
+@param aDiffFlag
+Flag to indicate the difference
+
+@return
+Returns ETrue if the files are different.
+*/
+EXPORT_C TInt CT_MsgUtils::CompareFilesL(TPtrC aFileOne, TPtrC aFileTwo, TBool aIsUnicode,
+									  CArrayFixFlat<TUint16>* aIgnoreCharList, TBool& aDiffFlag)
+	{
+	// Return Code
+	TInt retCode = KErrNone;
+
+	// Streams for the file1 and file2 to compare
+	RFileReadStream fileReadStream1;
+	RFileReadStream fileReadStream2;
+
+	// Files difference flag
+	aDiffFlag = EFalse;
+
+	RFs iFs;
+	User::LeaveIfError(iFs.Connect());
+
+	// Open file one to compare in the read only mode
+	retCode = fileReadStream1.Open( iFs, aFileOne, EFileShareReadersOnly);
+
+	// If the file open of the first file is successful then open the second file, also in read only mode
+	if(retCode == KErrNone)
+		{
+		retCode = fileReadStream2.Open( iFs, aFileTwo, EFileShareReadersOnly);
+
+		// The file open of the second file is successful
+		if(retCode == KErrNone)
+			{
+			// To hold the line content of file one 
+			HBufC* lineOneBuffer = HBufC::NewLC(KDefBufferSize);
+			TPtr ptrLineOne = lineOneBuffer->Des();
+			
+			// To hold the line content of file two
+			HBufC* lineTwoBuffer = HBufC::NewLC(KDefBufferSize);
+			TPtr ptrLineTwo = lineTwoBuffer->Des();
+
+			// End of File indicators
+			TBool	eofOne = EFalse;
+			TBool	eofTwo = EFalse; 
+			
+			// Read the file one and file two data
+			do   
+				{
+				// Read file one data
+				eofOne = ReadDataL(fileReadStream1, ptrLineOne, aIsUnicode, aIgnoreCharList);
+
+				// Read file two data
+				eofTwo = ReadDataL(fileReadStream2, ptrLineTwo, aIsUnicode, aIgnoreCharList);
+
+				// Check EOF state of the files.
+				// Either both the files will be in EOF state or 
+				// none of the files will be in EOF state			  
+				if((!eofOne && !eofTwo)||(eofOne && eofTwo))
+	            	{			
+					// Compare the read lines from file one and the file two
+					if(ptrLineOne.Compare(ptrLineTwo) != 0)
+						{
+						// Different data content so set the differnce flag
+						aDiffFlag = ETrue;
+						}
+					}
+				else
+					{
+					// Different EOF 
+					aDiffFlag = ETrue;
+					}
+				} while(!eofOne && !eofTwo && !aDiffFlag);				
+			
+			// Delete line buffers
+			CleanupStack::PopAndDestroy(2, lineOneBuffer);				
+			}
+		}
+	
+	// Close the open streams
+	fileReadStream1.Close();
+	fileReadStream2.Close();	
+
+	iFs.Close();
+	// Return the difference flag
+	return retCode;
+	}
+
+
+/**
+ReadDataL()
+Reads data chunk from the file stream. Returns ETrue if the EOF found
+
+@param aFileReadStream
+File Stream
+
+@param aPtrLineBuffer		
+Buffer to hold a line
+
+@param aIsUnicode
+To check if its unicode
+
+@param aIgnoreCharList
+List of the characters to be ignored
+
+@leave KErrNotFound
+Leaves if aIgnoreCharList is empty
+
+@return 
+Return end of file flag	
+*/
+EXPORT_C TBool CT_MsgUtils::ReadDataL(RFileReadStream& aFileReadStream,
+	  TPtr& aPtrLineBuffer, TBool aIsUnicode, CArrayFixFlat<TUint16>* aIgnoreCharList)
+ 	{
+	TUint16			element = 0;
+	TKeyArrayFix	key(0, ECmpTUint16);
+	TInt			charPosition = 0;
+	TBool			eof = EFalse;
+	TInt			errorCode = KErrNone;
+	TUint8			aCharASCII = 0;
+	
+	aPtrLineBuffer.FillZ();
+	aPtrLineBuffer.SetLength(0);	
+	
+	// Validate the input ignore char list
+	if (!aIgnoreCharList)
+		{
+		// Invalid parameter passed to ReadDataL: No ignore char list passed
+		User::Leave(KErrNotFound);
+		}
+
+	// Read data from file and store it in lineBuffer 
+	do   
+		{
+		if(aIsUnicode)
+			{
+			TRAP(errorCode, (element = aFileReadStream.ReadUint16L()));
+			}
+		else
+			{
+			TRAP(errorCode, (aCharASCII = aFileReadStream.ReadUint8L()));
+			element = (TUint16) aCharASCII;
+			}
+			
+		if (errorCode != KErrEof)
+			{		
+			// Check the availability of ignore char in the array							
+			if ( aIgnoreCharList->Find(element, key, charPosition) != KErrNone )
+				{
+				// Append the char to the buffer if the read char is not ignore char
+				aPtrLineBuffer.Append(element);
+				}
+			}								
+			else
+				{
+				eof = ETrue;
+				break;
+				}
+				
+			// Stop at the end of line or no more data 
+			} while(aPtrLineBuffer.Length() < KDefBufferSize);
+	
+	// Return end of file flag		
+	return eof;	
+	}