email/email/pop/src/T_ComparePopEmailMsgs.cpp
branchSymbian2
changeset 1 8758140453c0
child 6 c108117318cb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/email/email/pop/src/T_ComparePopEmailMsgs.cpp	Thu Jan 21 12:53:44 2010 +0000
@@ -0,0 +1,999 @@
+// 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:
+// [TestStep Name]
+// ComparePopEmailMsgs
+// [Paramaters]
+// PopAccountName		: 		Name of the POP account
+// Compares the recieved mails with the expected numbers of lines to test POP3 TOP command
+// 
+//
+
+
+
+/**
+ @file
+*/
+
+// User includes
+#include "CExpMailInfo.h"
+#include "T_ComparePopEmailMsgs.h"
+#include <t_utils.h>
+#include <t_utilscentralrepository.h>
+#include <t_utilsenumconverter.h>
+
+
+// Epoc includes
+#include <imcm.rsg>
+#include <miutmsg.h>
+#include <mmsvattachmentmanager.h>
+
+
+// Literals Used
+_LIT(KPopAccountName,"PopAccountName");
+
+
+/**
+ConstructL()
+Used to ensure that MMsvAttachmentManager is not destroyed until we want it to be.
+To do this we need to preserve certain objects of CImEmailMessage, which if disappeared
+would invalidate MMsvAttachmentManager. But this should be deleted in a controlled manner.
+
+@param aSession
+An object of type CMsvSession object.
+
+@param aEntry
+An object of type TMsvEntry used to get the entry ID. 
+*/
+void CAttachmentItem::ConstructL(CMsvSession& aSession, TMsvEntry aEntry)
+	{
+	iMsvEntry = aSession.GetEntryL(aEntry.Id());
+
+	iMsvEntry->SetEntryL(aEntry.Id());
+	iEmailMsg = CImEmailMessage::NewL(*iMsvEntry);
+		
+	CMsvOperationActiveSchedulerWait* waiter = CMsvOperationActiveSchedulerWait::NewLC();
+ 	iEmailMsg->GetAttachmentsListL(waiter->iStatus, aEntry.Id(),
+								   CImEmailMessage::EAllAttachments, 
+								   CImEmailMessage::EThisMessageOnly);
+	waiter->Start();
+
+	CleanupStack::PopAndDestroy(1, waiter); //waiter		
+	}
+
+
+/**
+NewL()
+Allocates and creates a new CAttachmentItem object
+
+@param aSession
+An object of type CMsvSession object.
+
+@param aEntry
+An object of type TMsvEntry
+
+@leave KErrNoMemory
+
+@return 
+A pointer to an object of type CAttachmentItem
+
+*/
+CAttachmentItem* CAttachmentItem::NewL(CMsvSession& aSession, TMsvEntry aEntry)
+	{
+	CAttachmentItem* self=CAttachmentItem::NewLC(aSession, aEntry);
+	CleanupStack::Pop(self);
+
+	return self;
+	}
+
+
+/**
+NewLC()
+Static factory constructor. Uses two phase construction and leaves nothing on the CleanupStack.
+
+
+@param aSession
+An object of type CMsvSession object.
+
+@param aEntry
+An object of type TMsvEntry
+
+@leave KErrNoMemory
+@return
+A pointer to the newly created CAttachmentItem object.
+
+*/
+CAttachmentItem* CAttachmentItem::NewLC(CMsvSession& aSession, TMsvEntry aEntry)
+	{
+	CAttachmentItem* self=new (ELeave) CAttachmentItem;
+	CleanupStack::PushL(self);
+	
+	self->ConstructL(aSession, aEntry);
+	
+	return self;
+	}
+
+
+/**
+~CAttachmentItem()
+Destroy the data members.
+*/
+CAttachmentItem::~CAttachmentItem()
+	{
+	delete iEmailMsg;
+	iEmailMsg=NULL;
+
+	delete iMsvEntry;
+	iMsvEntry=NULL;
+	}
+
+
+/**
+MMsvAttachmentManager()
+
+@return
+An object of MMsvAttachmentManager
+*/
+MMsvAttachmentManager& CAttachmentItem::MMsvAttachmentManager() const
+	{			
+	return (iEmailMsg->AttachmentManager());		
+	}
+
+
+/**
+GetExpPop3MailInfoLC()
+Sets the CExpPop3MailInfo attributes reading from the INI file
+
+@param  aIndx
+Index in the selection list.
+
+@leave KErrNotReady
+
+@return
+A pointer to an object of type CExpPop3MailInfo
+*/
+CExpPop3MailInfo* CT_MsgComparePopEmailMsgs::GetExpPop3MailInfoLC(TInt aIndx)
+	{
+	CExpPop3MailInfo* expMailInfo  = new (ELeave) CExpPop3MailInfo;
+	CleanupStack::PushL(expMailInfo);
+	
+	TInt comInt = -1;
+	_LIT(KNumOfLines,"NumOfLines%d");
+	TBuf<256> param;
+	param.Format(KNumOfLines,aIndx);
+	
+	if (!GetIntFromConfig(ConfigSection(), param, comInt))
+		{
+		ERR_PRINTF1(_L("No Input for NumOfLines"));
+		User::Leave(KErrNotReady);
+		}
+	
+	expMailInfo->SetNumLinesBodyText(comInt);
+	comInt = -1;
+	
+	_LIT(KFooterExpected, "FooterExpected%d");
+	param.Format(KFooterExpected,aIndx);
+	if (!GetIntFromConfig(ConfigSection(), param, comInt))
+		{
+		ERR_PRINTF1(_L("No Input for Footer Expected"));
+		User::Leave(KErrNotReady);
+		}
+	expMailInfo->SetFooterExpected(comInt);
+	
+	comInt = -1;
+	_LIT(KNumOfLinesHtml, "NumOfLinesHtml%d");
+	param.Format(KNumOfLinesHtml, aIndx);
+	if (!GetIntFromConfig(ConfigSection(), param, comInt))
+		{
+		ERR_PRINTF1(_L("No Input For NumOfLinesHtml"));
+		User::Leave(KErrNotReady);
+		}
+	expMailInfo->SetNumLinesHtml(comInt);
+	
+	TPtrC ptrDes;
+	_LIT(KDescription, "Description%d");
+	param.Format(KDescription, aIndx);
+	if(!GetStringFromConfig(ConfigSection(), param, ptrDes))
+		{
+		ERR_PRINTF1(_L("No Input for Description"));
+		User::Leave(KErrNotReady);
+		}
+	expMailInfo->SetDescription(ptrDes);
+		
+	_LIT(KNumOfAttachments, "NumOfAttachments%d");
+	param.Format(KNumOfAttachments, aIndx);
+	if (!GetIntFromConfig(ConfigSection(), param, comInt))
+		{
+		ERR_PRINTF1(_L("No Input for NumOfAttachments"));
+		User::Leave(KErrNotReady);
+		}
+	expMailInfo->SetNumAttachments(comInt);
+	
+	comInt = -1;
+	if(expMailInfo->GetFooterExpected())
+		{
+		_LIT(KFooterSize, "FooterSize%d");
+		param.Format(KFooterSize, aIndx);
+		if (!GetIntFromConfig(ConfigSection(), param, comInt))
+			{
+			ERR_PRINTF1(_L("No Input for FooterSize"));
+			User::Leave(KErrNotReady);
+			}
+		expMailInfo->SetFooterSize(comInt);
+		}
+	else
+		{
+		expMailInfo->SetFooterSize(0);
+		}
+	
+	return expMailInfo;
+	}
+
+
+
+/**
+LoadParametersL()
+Loads the test parameters 
+
+@leave KErrNotReady
+@return
+ETrue if parameters loaded, Efalse on failure.
+*/
+TBool CT_MsgComparePopEmailMsgs::LoadParametersL()
+	{
+	TPtrC sentFolder;
+	_LIT(KSentFolder, "SentFolder");
+	if(!GetStringFromConfig(ConfigSection(), KSentFolder, sentFolder))
+		{
+		ERR_PRINTF1(_L("No Input for Sent Folder"));
+		User::Leave(KErrNotReady);
+		}
+			
+	iSentSelectionList = CT_MsgUtils ::CreateChildrenSelectionL(iSharedDataPOP.iSession, CT_MsgUtilsEnumConverter::FindFolderIdByName(sentFolder));
+	if(! iSentSelectionList)
+		{
+		ERR_PRINTF1(_L("Invalid sentSelectionList"));
+		SetTestStepResult(EFail);
+		return EFalse;
+		}
+	
+	TPtrC inboxFolder;
+	_LIT(KInboxFolder, "InboxFolder");
+	if(!GetStringFromConfig(ConfigSection(), KInboxFolder, inboxFolder))
+		{
+		ERR_PRINTF1(_L("No Input for Inbox Folder"));
+		User::Leave(KErrNotReady);
+		}
+	
+	
+	TPtrC popAccountName;
+	if(!GetStringFromConfig(ConfigSection(), KPopAccountName, popAccountName))
+		{
+		ERR_PRINTF1(_L("Account name not specified"));
+		SetTestStepResult(EFail);
+		}
+	if (CT_MsgUtilsEnumConverter::FindFolderIdByName(inboxFolder) == KMsvLocalServiceIndexEntryId)
+		{
+		// We are expecting to get a selection of remote Folder(which is the serviceId)
+		TMsvId popServiceId = CT_MsgUtilsCentralRepository::GetPopServiceIdL((TDes&)popAccountName);
+		
+		CMsvEntry* entry = iSharedDataPOP.iSession->GetEntryL(popServiceId);
+		CleanupStack::PushL(entry);
+		
+		entry->SetEntryL(popServiceId); // Setting the context to remote folder.
+		
+		iInboxSelectionList = CT_MsgUtils ::CreateChildrenSelectionL(iSharedDataPOP.iSession, popServiceId);
+		
+		CleanupStack::PopAndDestroy(entry);
+		}
+	else
+		{
+		iInboxSelectionList = CT_MsgUtils ::CreateChildrenSelectionL(iSharedDataPOP.iSession, CT_MsgUtilsEnumConverter::FindFolderIdByName(inboxFolder));
+		}
+
+	if(! iInboxSelectionList)
+		{
+		ERR_PRINTF1(_L("Invalid inboxSelectionList"));
+		SetTestStepResult(EFail);
+		return EFalse;
+		}
+	//Starting the comparision
+	if(iInboxSelectionList->Count() != iSentSelectionList->Count())
+		{
+		ERR_PRINTF3(_L("iInboxSelectionList->Count(%d) != iSentSelectionList->Count(%d)"),
+								 iInboxSelectionList->Count(), iSentSelectionList->Count());
+		SetTestStepResult(EFail);
+		return EFalse;
+		}
+
+	TInt comInt = -1;
+	_LIT(KNumTest, "NumTest");
+	if (!GetIntFromConfig(ConfigSection(), KNumTest, comInt))
+		{
+		ERR_PRINTF1(_L("No Input for NumTests"));
+		User::Leave(KErrNotReady);
+		}
+	TInt numTests = comInt;
+	if(numTests != iInboxSelectionList->Count())
+		{
+		ERR_PRINTF1(_L("iNumTests != iInboxSelectionList"));
+		SetTestStepResult(EFail);
+		return EFalse;
+		}
+		
+	iExpResults.Reset();
+	for(TInt i = 0;i < numTests; i++) 
+		{
+		
+		CExpPop3MailInfo* pExp = GetExpPop3MailInfoLC(i);
+		if(! pExp)
+			{
+			ERR_PRINTF1(_L("Invalid expected mail Info"));
+			SetTestStepResult(EFail);
+			return EFalse;
+			}
+		else
+			{
+			CleanupStack::Pop(pExp); // pExp			
+			iExpResults.Append(pExp);
+			}
+		}
+	return ETrue;
+	}
+
+
+/**
+DoCompareL()
+Comparison of 2 email messages identified by TMsvEntry
+
+@param  aRecvEntry
+The recieved email identifier.
+
+@param  aMailInfo
+Expected state of the recieved email.
+
+@param  aSentEntry
+Identifier of the original sent email foir comparison purposes.
+
+@return
+ETrue if emails match EFalse otherwise
+*/
+TBool CT_MsgComparePopEmailMsgs::DoCompareL(TMsvEntry& aRecvEntry, CExpPop3MailInfo& aMailInfo, TMsvEntry& aSentEntry)
+	{
+	TBool ret = ETrue;
+	TBool footerExists = EFalse;
+	TInt footersize = 0;
+		
+			
+	TInt nLines = GetMessageLinesL(aRecvEntry, KUidMsvEmailTextEntry, footerExists, footersize);
+	if(nLines != aMailInfo.GetNumLinesBodyText())
+		{
+		ERR_PRINTF3(_L("Lines of body text wrong actual = %d expected = %d!"), nLines, aMailInfo.GetNumLinesBodyText());
+		ret = EFalse;
+		}
+	nLines = GetMessageLinesL(aRecvEntry, KUidMsvEmailHtmlEntry, footerExists, footersize);
+
+	if(nLines != aMailInfo.GetNumLinesHtml())
+		{		
+		ERR_PRINTF3(_L("HTML size wrong actual = %d expected = %d!"), nLines, aMailInfo.GetNumLinesHtml());
+		ret = EFalse;
+		}
+
+	else if(! CheckAttachmentsL(aRecvEntry, aMailInfo, aSentEntry))
+		{
+		ERR_PRINTF1(_L("Attachment comparison failed !"));
+		ret = EFalse;
+		}
+
+	else if(! footerExists && aMailInfo.GetFooterExpected())
+		{
+		ERR_PRINTF1(_L("An expected footer was missing !"));
+		ret = EFalse;
+		}
+	else if(footerExists && ! aMailInfo.GetFooterExpected())
+		{
+		ERR_PRINTF1(_L("An unexpected footer was found !"));
+		ret = EFalse;
+		}
+	else if(aMailInfo.GetFooterExpected() && aMailInfo.GetFooterSize()!=0 
+			&& aMailInfo.GetFooterSize() != footersize)
+		{
+		ERR_PRINTF3(_L("KB left on server size wrong = %d expected = %d!"), footersize, aMailInfo.GetFooterSize());
+		ret = EFalse;			
+		}
+	return ret;
+	}
+
+
+
+
+/**
+CheckAttachmentsL()
+Compares attachments for the email messages aRecvEntry and aSentEntry using
+expected results in aMailInfo
+
+@param aRecvEntry
+An identifier for the recieved email
+
+@param aMailInfo
+Expected state of recieved email attachments
+
+@param aSentEntry
+An identifier for the original email
+
+@return
+ETrue if attachments match otherwise EFalse
+*/
+TBool CT_MsgComparePopEmailMsgs::CheckAttachmentsL(TMsvEntry& aRecvEntry, CExpPop3MailInfo& aMailInfo, TMsvEntry& aSentEntry)
+	{
+	TBool ret = ETrue;
+	CAttachmentItem* recvManager = CAttachmentItem::NewLC(*iSharedDataPOP.iSession, aRecvEntry);
+	CAttachmentItem* sentManager = CAttachmentItem::NewLC(*iSharedDataPOP.iSession, aSentEntry);
+
+	TInt recvCount = recvManager->MMsvAttachmentManager().AttachmentCount();	
+	TInt sentCount = sentManager->MMsvAttachmentManager().AttachmentCount();
+
+	TFileName recvFileName;
+	TFileName sentFileName;
+
+	if(recvCount == aMailInfo.GetNumAttachments())
+		{
+		for(TInt i=0;i<recvCount;i++)
+			{
+			for(TInt j=0;j<sentCount;j++)
+				{
+				CMsvAttachment* recvAttInfo = recvManager->MMsvAttachmentManager().GetAttachmentInfoL(i);
+				CleanupStack::PushL(recvAttInfo);
+
+				CMsvAttachment* sentAttInfo = sentManager->MMsvAttachmentManager().GetAttachmentInfoL(j);
+				CleanupStack::PushL(sentAttInfo);
+
+				if(recvAttInfo->AttachmentName().Compare(sentAttInfo->AttachmentName()) == 0)
+					{
+					recvFileName = recvAttInfo->FilePath();
+					sentFileName = sentAttInfo->FilePath();
+					ret = CompareFilesL(recvFileName, sentFileName);
+					}
+				CleanupStack::PopAndDestroy(2, recvAttInfo);		
+				}
+			}
+		}
+	else
+		{
+		INFO_PRINTF3(_L("Warning - Expected attachments mismatch recieved (%d) expected (%d)"),
+								 recvCount, aMailInfo.GetNumAttachments());
+		ret = EFalse;
+		}
+	CleanupStack::PopAndDestroy(2, recvManager); // recvManager,sentManager
+	return ret;
+	}
+
+
+
+/**
+CompareFilesL()
+Performs byte for byte copmparison of the files indicated by aFileName1 and aFileName2
+
+@param aFileName1
+Filename of first file to be compared
+
+@param aFileName2
+Filename of second file to be compared
+
+@return
+ETrue if files match, EFalse otherwise
+*/
+TBool CT_MsgComparePopEmailMsgs::CompareFilesL(TFileName& aFileName1, TFileName& aFileName2)
+	{
+	TBool ret = ETrue;
+	RFile file1, file2;
+
+	User::LeaveIfError(file1.Open(iFs, aFileName1, EFileRead));
+	User::LeaveIfError(file2.Open(iFs, aFileName2, EFileRead));
+
+	TInt sz1, sz2;
+	User::LeaveIfError(file1.Size(sz1));
+	User::LeaveIfError(file2.Size(sz2));
+	
+	if(sz1 != sz2)
+		{
+		ERR_PRINTF3(_L("File size mismatch 1(%d)   2(%d)"), sz1, sz2);
+		ret = EFalse;
+		}
+	else
+		{
+		TBuf8<1> char1;
+		TBuf8<1> char2;
+		TInt len1, len2;
+		do
+			{
+			file1.Read(char1);
+			file2.Read(char2);
+			len1 = char1.Length();
+			len2 = char2.Length();
+			if(char1.Compare(char2) != 0)
+				{
+				ret = EFalse;
+				break;
+				}
+			}
+		while(len1 && len2);
+		}
+	file1.Close();
+	file2.Close();
+	return ret;
+	}
+
+
+/**
+GetMessageLinesL()
+Counts the number of lines in a message's HTML or body text
+
+@param aEntry
+Email message identifier
+
+@param aUid
+Request identifier KUidMsvEmailHtmlEntry or KUidMsvEmailTextEntry at present
+
+@param aFooterExists
+Reference to a boolean variable only used when aUid == KUidMsvEmailTextEntry
+
+@param aFooterSize
+Expected KB left on server inserted into footer string if present 
+
+@return
+Returns the number of lines in the requested message part
+*/
+TInt CT_MsgComparePopEmailMsgs::GetMessageLinesL(TMsvEntry& aEntry, TUid aUid, TBool& aFooterExists, TInt &aFooterSize)
+	{
+	TInt lines = 0; 
+	
+	TMsvId msgPartIndex = GetMessagePartIndexL(aEntry,aUid);
+	
+	if(msgPartIndex)
+		{
+		CMsvEntry* msvEntry = iSharedDataPOP.iSession->GetEntryL(msgPartIndex);
+		CleanupStack::PushL(msvEntry);
+	
+		msvEntry->SetEntryL(msgPartIndex);
+		if(aUid == KUidMsvEmailTextEntry)
+			{
+			lines = CountLinesOfBodyTextL(*msvEntry, aFooterExists, aFooterSize);
+			}
+		else if(aUid == KUidMsvEmailHtmlEntry)
+			{
+			lines = CountLinesOfHtmlL(*msvEntry);
+			}
+		CleanupStack::PopAndDestroy(msvEntry);
+		}
+	return lines;
+	}
+
+
+/**
+CountLinesOfBodyTextL()
+Counts the lines of body text in the email aEntry
+
+@param aEntry
+A reference to an object representing the email
+
+@param aFooterExists
+Reference to a boolean variable - set to ETrue if the footer string is found in the body text
+
+@param aFooterSize
+Expected KB left on server inserted into footer string if present 
+
+@return
+Number of lines in the body text 
+*/
+TInt CT_MsgComparePopEmailMsgs::CountLinesOfBodyTextL(CMsvEntry& aEntry, TBool& aFooterExists, TInt& aFooterSize)
+	{
+	TInt lines = 0;
+	aFooterExists=EFalse;
+	aFooterSize=0;
+	aEntry.SetEntryL(aEntry.EntryId());
+	if(aEntry.HasStoreL())
+		{
+		CMsvStore*	msvStore1= aEntry.ReadStoreL();
+		CleanupStack::PushL(msvStore1);
+		CParaFormatLayer*	paraFormatLayer1 = CParaFormatLayer::NewL();
+		CleanupStack::PushL(paraFormatLayer1);
+		CCharFormatLayer*	charFormatLayer1 = CCharFormatLayer::NewL(); 
+		CleanupStack::PushL(charFormatLayer1);
+		CRichText*	bodyText1=CRichText::NewL(paraFormatLayer1, charFormatLayer1, CEditableText::EFlatStorage, 256);
+		CleanupStack::PushL(bodyText1);
+
+		bodyText1->Reset();
+		if (msvStore1->HasBodyTextL())
+			{
+			msvStore1->RestoreBodyTextL(*bodyText1);
+			TUint16 val = CEditableText::ELineBreak;
+			TInt n = 0;
+			TInt pos = 0;
+			for(;;)
+				{
+				TPtrC bodyText = bodyText1->Read(pos);
+				n = bodyText.Find(&val, 1);
+				if(n < 0)
+					break;
+				lines++;
+				pos += n+1;
+				
+				//This Check is needed to delete the extra line introduced by communigate Pro Server
+				TInt fpos = CheckIfServerMessageExists(bodyText);
+				if (fpos != KErrNotFound)
+					{
+					lines--;
+					}
+				}
+			TPtrC	pBt = bodyText1->Read(0);
+			aFooterExists = CheckIfFooterMessageExistsL(pBt , aFooterSize);
+			}		
+		CleanupStack::PopAndDestroy(4, msvStore1);  //bodyText1,charFormatLayer1,paraFormatLayer1,msvStore1.
+		}
+	return lines;
+	}
+
+
+/**
+CheckIfServerMessageExists()
+Checks if any server message has been added to the Body text returns the 
+position of the server message in the buffer and the length of the server
+message.This function can be enhanced to check for any other server message encountered.
+If not found, returns KErrNotFound.
+
+@param aBodyText
+The body text of the message
+
+@return
+Position of the message, if not found returns KErrNotFound
+*/
+ TInt CT_MsgComparePopEmailMsgs::CheckIfServerMessageExists(TPtrC aBodyText)
+	{
+	_LIT(KServerMessage,"*This message was transferred with a trial version of CommuniGate(tm) Pro*");
+
+	TInt pos = aBodyText.FindC(KServerMessage);
+	
+	return pos;
+	}
+
+
+/**
+CountLinesOfHtmlL()
+Counts the number of lines of HTML
+
+@param aEntry
+A reference to an object representing the email
+
+@return
+Number of lines of HTML
+*/
+TInt CT_MsgComparePopEmailMsgs::CountLinesOfHtmlL(CMsvEntry& aEntry)
+	{ 
+	TInt lines = 0;
+	aEntry.SetEntryL(aEntry.EntryId());
+	
+	
+	CMsvStore* store = aEntry.ReadStoreL();
+	CleanupStack::PushL(store);
+	
+	MMsvAttachmentManager& attManager = store->AttachmentManagerL();
+	
+	RFile htmlFile = attManager.GetAttachmentFileL(0);
+	CleanupClosePushL(htmlFile);
+	
+	_LIT8(KFindData, "\r\n");
+	TInt htmlSize = 0;
+	User::LeaveIfError(htmlFile.Size(htmlSize));
+	HBufC8* fBuf = HBufC8::NewLC(htmlSize);
+	TPtr8 p = fBuf->Des();
+	htmlFile.Read(p);
+	TInt pos = 0;
+	for(;;)
+		{
+		pos = p.Find(KFindData);
+		if(pos < 0)
+			{
+			break;
+			}
+		p = p.Mid(pos+2);
+		lines++;
+		}
+		
+	CleanupStack::PopAndDestroy(fBuf);
+	CleanupStack::PopAndDestroy(); // htmlFile
+	CleanupStack::PopAndDestroy(store);
+	
+	return lines;
+	}
+
+
+
+/**
+GetMessagePartIndexL()
+Retrieves the part index id for the email identified by aEntry
+
+@param aEntry
+A valid email identifier
+
+@param aUid
+An identifier tfor the type of message part to be retrieved
+
+@return
+TMsvId - message part identifier
+*/
+TMsvId CT_MsgComparePopEmailMsgs::GetMessagePartIndexL(TMsvEntry& aEntry, TUid aUid)
+	{
+	static TBool msgPartFound = EFalse;	
+	TMsvId msgPartId = 0;
+	CMsvEntry*	baseEntry  = iSharedDataPOP.iSession->GetEntryL(aEntry.Id());
+	CleanupStack::PushL(baseEntry);
+	CMsvEntrySelection*	selection =  baseEntry->ChildrenL();
+	CleanupStack::PushL(selection);
+	TInt count = selection->Count();
+	TInt ind1;
+	CMsvEntry* entry = iSharedDataPOP.iSession->GetEntryL(KMsvRootIndexEntryId);
+	CleanupStack::PushL(entry);
+	for (ind1=0, msgPartFound=EFalse; ind1 < count; ind1++)
+		{
+		if(msgPartFound)
+			{
+			break;
+			}		
+		TMsvId	childId  = selection->At(ind1);
+		entry->SetEntryL(childId);
+
+		if (entry->Entry().iType  == aUid)
+			{
+			msgPartId = childId;
+			break;
+			}
+		else if (entry->Entry().iType  == KUidMsvFolderEntry)
+			{
+			TMsvEntry ent = entry->Entry();
+			msgPartId = GetMessagePartIndexL(ent, aUid);
+			}
+		}
+	CleanupStack::PopAndDestroy(3, baseEntry);  // entry,selection,baseEntry
+	return msgPartId;
+	}
+
+
+
+
+/**
+CheckIfFooterMessageExistsL()
+Checks the email for the presence of the footer string
+
+@param aRecvBodyText
+Reference to a descriptor holding the body text
+
+@param aFooterSize
+The expected number of KB remaining on the server which has been inserted into the footer string
+
+@return
+ETrue if footer string found otherwise EFalse 
+*/
+TBool CT_MsgComparePopEmailMsgs::CheckIfFooterMessageExistsL(TPtrC& aRecvBodyText , TInt& aFooterSize)
+	{
+	RResourceFile resFile;
+	CT_MsgUtils ::OpenResourceFileL(resFile, iFs, KImEngineResourceFile);	// NB leaves if file not found
+	TCleanupItem close(CT_MsgUtils ::CloseResourceFile, &resFile);
+	CleanupStack::PushL(close);
+	
+	HBufC8* buf = NULL;
+	buf = resFile.AllocReadLC(PARTIAL_DOWNLOAD_FOOTER_MESSAGE);
+	TResourceReader reader;
+	reader.SetBuffer(buf);
+
+	HBufC* resourceBuf = (reader.ReadTPtrC()).AllocL();
+	CleanupStack::PushL(resourceBuf);
+
+	TInt len = resourceBuf->Find(_L("%d"));
+	const TInt KBufLen = 256;
+	TBuf<KBufLen> findBuf;
+
+	if(len == KErrNotFound)
+		{
+		len = resourceBuf->Length();
+		}
+
+	if(len > KBufLen)
+		{
+		len = KBufLen;
+		}
+	
+	findBuf.Copy(resourceBuf->Ptr(), len);
+	len = aRecvBodyText.Find(findBuf);
+
+	if(len>=0)
+		{
+		TPtrC rest=aRecvBodyText.Right(aRecvBodyText.Length()-len-findBuf.Length());
+		TLex lex(rest.Left(rest.Locate(TChar(' '))));
+		lex.Val(aFooterSize);
+		}
+	else
+		{
+		aFooterSize=0;
+		}
+
+	CT_MsgUtils ::CloseResourceFile(&resFile);
+	CleanupStack::PopAndDestroy(3); // buf, resourceBuf, close
+	return (len != KErrNotFound);
+	}
+
+//const TInt KGranuality = 5;
+
+/**
+CT_MsgComparePopEmailMsgs()
+Constructor
+
+@param  aSharedDataPOP
+Data shared across the POP test steps. Ex. SessionF
+*/
+CT_MsgComparePopEmailMsgs::CT_MsgComparePopEmailMsgs(CT_MsgSharedDataPop& aSharedDataPOP)
+:	CT_MsgAsyncStepPOP(aSharedDataPOP)  
+	{
+	iSentSelectionList = NULL;
+	iInboxSelectionList = NULL;
+	SetTestStepName(KComparePopEmailMsgs);
+	}
+
+
+/**
+NewL()
+Allocates and creates a new CT_MsgComparePopEmailMsgs object
+
+@param aSharedDataPOP
+Data shared across the POP test steps. Ex. Session
+
+@leave KErrNoMemory
+@return
+Returns pointer to an object of CT_MsgComparePopEmailMsgs.
+*/
+CT_MsgComparePopEmailMsgs* CT_MsgComparePopEmailMsgs::NewL(CT_MsgSharedDataPop& aSharedDataPOP)
+	{
+	CT_MsgComparePopEmailMsgs* self = new(ELeave) CT_MsgComparePopEmailMsgs(aSharedDataPOP);
+	CleanupStack::PushL(self);
+	self->ConstructL(); 					 // Call CT_AsyncStep::ConstructL()
+	CleanupStack::Pop(self);
+	return self;
+	}		
+
+
+/**
+ProgressL()
+
+*/
+
+//////////////////////////
+////
+////	I have no idea what this code is doing.
+////	It looks very messy.
+////	Someone is going to have to reowrk this code so that we can cancel and do progress
+////
+//////////////////////////
+void CT_MsgComparePopEmailMsgs::ProgressL(TBool bFinal)
+	{
+	//	TODO
+	if (bFinal)
+		{
+		//	Display final progress
+		}
+	else
+		{
+		//	Display current progress
+		}
+	}
+
+
+/**
+CancelStep()
+
+*/
+void CT_MsgComparePopEmailMsgs::CancelStep()
+	{
+	//	TODO
+	}
+
+
+/**
+~CT_MsgComparePopEmailMsgs()
+Deletes all the data members.
+*/
+CT_MsgComparePopEmailMsgs::~CT_MsgComparePopEmailMsgs()
+	{
+	// To delete each element in the array
+	for(TInt i=0; i < iExpResults.Count(); i++)
+		{
+		CExpPop3MailInfo* pExp = iExpResults[i];
+		delete pExp;
+		pExp=NULL;
+		}
+	iExpResults.Reset();
+	iExpResults.Close();
+
+	delete iSentSelectionList;
+	iSentSelectionList=NULL;
+	delete iInboxSelectionList;
+	iInboxSelectionList=NULL;
+	}
+
+
+/**
+doTestStepL()
+Performs the comparison of POP messages
+
+@return
+Returns the teststep result.
+*/
+TVerdict CT_MsgComparePopEmailMsgs::doTestStepL()
+	{
+	INFO_PRINTF1(_L("Test Step: Compare Pop Email Msgs"));
+		
+	if(LoadParametersL())
+		{
+		User::LeaveIfError(iFs.Connect());
+		CleanupClosePushL(iFs);
+		
+			// Normally do not push an object that is a data member of another object.
+			// But in this case we want to close early if we get a leave.
+			// Otherwise the iFs would be open till the thread had begun to die.
+		if(TestStepResult() == EPass)
+			{
+			CMsvEntry* recvMsvEntry = iSharedDataPOP.iSession->GetEntryL(KMsvRootIndexEntryId);
+			CleanupStack::PushL(recvMsvEntry);
+			CMsvEntry* sentMsvEntry = iSharedDataPOP.iSession->GetEntryL(KMsvRootIndexEntryId);
+			CleanupStack::PushL(sentMsvEntry);
+
+			for(TInt i = 0;i < iInboxSelectionList->Count();i++)
+				{
+				recvMsvEntry->SetEntryL(iInboxSelectionList->At(i));
+				TMsvEntry recvEntry = recvMsvEntry->Entry();
+				for(TInt j = 0;j < iSentSelectionList->Count();j++)
+					{
+					sentMsvEntry->SetEntryL(iSentSelectionList->At(j));
+					TMsvEntry sentEntry = sentMsvEntry->Entry();
+					if(recvEntry.iDescription.Compare(sentEntry.iDescription) == 0) 
+						{
+						CExpPop3MailInfo* pExpMailInfo = NULL;
+						for(int k = 0;k < iExpResults.Count();k++)
+							{
+							if(iExpResults[k]->GetDescription().Compare(recvEntry.iDescription) == 0)
+								{
+								pExpMailInfo =  iExpResults[k];
+								break;
+								}
+							}
+						if(! pExpMailInfo)
+							{
+							ERR_PRINTF2(_L("Test %d failed could not retrieve expected mail info"), j+1);
+							SetTestStepResult(EFail);
+							break;
+							}
+
+						if(! DoCompareL(recvEntry, *pExpMailInfo, sentEntry))
+							{
+							INFO_PRINTF2(_L("Test %d failed"), j + 1);
+							SetTestStepResult(EFail);
+							}														
+						}
+					}
+				}
+			CleanupStack::PopAndDestroy(2, recvMsvEntry); // recvMsvEntry, sentMsvEntry
+			}		
+		CleanupStack::PopAndDestroy();
+		}		
+	INFO_PRINTF1(_L("T_ComparePopEmailMsgs Completed"));
+	return TestStepResult();
+	}