messagingfw/msgtest/testutils/base/src/msvtestutils.cpp
changeset 0 8e480a14352b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingfw/msgtest/testutils/base/src/msvtestutils.cpp	Mon Jan 18 20:36:02 2010 +0200
@@ -0,0 +1,1130 @@
+// Copyright (c) 2000-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:
+// msvtestutils.cpp
+//
+
+#include "msvtestutils.h"
+#include "MSVSERV.H"
+#include <e32uid.h>
+#include <mtsr.h>
+#include <msvruids.h>
+#include <txtfmlyr.h>
+#include <txtetext.h>
+#include <txtrich.h>
+#include <miuthdr.h>
+#include <mtclbase.h>
+#include <flogger.h>
+#include <msventryscheduledata.h>
+#include <csch_cli.h>
+#include <sqldb.h>
+
+#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS  
+#include "msvconsts.h"
+#include "timrfc822datefield.h"
+#endif
+
+_LIT(KStoreInitFileName, "\\private\\1000484b\\StoreInit.tmp");
+#ifdef SYMBIAN_MESSAGESTORE_UNIT_TESTCODE
+_LIT(KDbFileName, "\\messaging.db");
+#else
+_LIT(KDbFileName, "[1000484B]messaging.db");
+#endif
+
+
+//
+//
+//	TestMsvOperationTimer
+//
+//
+
+EXPORT_C TestMsvOperationTimer* TestMsvOperationTimer::NewLC(CConsoleBase* aConsole, CMsvOperation* aMsvOperation, RTest& aRTest)
+	{
+	TestMsvOperationTimer* self = new(ELeave) TestMsvOperationTimer(aConsole, aMsvOperation, aRTest);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	return self;
+	}
+
+EXPORT_C TestMsvOperationTimer::TestMsvOperationTimer(CConsoleBase* aConsole, CMsvOperation* aMsvOperation, RTest& aRTest)
+	: CTimer(EPriorityStandard+3), iMsvOperation(aMsvOperation), iRTest(aRTest)
+	{
+	iConsole = aConsole;
+	iPeriod = KPeriod;
+	iClosing = EFalse;
+	iCount = 0;
+	}
+
+EXPORT_C void TestMsvOperationTimer::ConstructL()
+	{
+	CTimer::ConstructL();
+	CActiveScheduler::Add(this);
+	}
+
+EXPORT_C void TestMsvOperationTimer::IssueRequest()
+	{
+	After(iPeriod);
+	}
+
+EXPORT_C void TestMsvOperationTimer::DoCancel()
+	{
+	CTimer::DoCancel();
+	}
+
+EXPORT_C void TestMsvOperationTimer::RunL()
+	{
+	// display the current progress
+	TMsvId temp;	
+	TPckgC<TMsvId> paramPack(temp);
+
+	const TDesC8& progBuf = iMsvOperation->ProgressL();	
+	paramPack.Set(progBuf);
+	TMsvId progress=paramPack();	
+
+	iRTest.Console()->SetPos(0, 10);
+	iRTest.Printf(_L("   MessageId %d		\n"),progress);
+
+	IssueRequest();
+	};
+
+
+//
+//
+//	CMsvTestUtils
+//
+//
+
+EXPORT_C CMsvTestUtils::CMsvTestUtils(RTest& aRTest)
+: CTestUtils(aRTest)
+	{
+	}
+
+EXPORT_C CMsvTestUtils::~CMsvTestUtils()
+	{
+	Reset();
+
+	delete iServerMtmDllRegistry;
+	delete iMtmRegistryControl;
+	}
+
+EXPORT_C void CMsvTestUtils::Reset()
+	{
+	delete iMsvEntry;
+	iMsvEntry = NULL;
+
+	delete iServerEntry;
+	iServerEntry = NULL;
+
+	delete iMsvServer;
+	iMsvServer = NULL;
+
+	delete iClientMtmRegistry;
+	iClientMtmRegistry = NULL;
+
+	if(iMsvSession!=NULL)
+		{
+		iMsvSession->CloseMessageServer();	
+		}
+		
+	delete iMsvSession;
+	iMsvSession = NULL;
+
+	delete iDummyObserver;
+	iDummyObserver = NULL;
+
+	iClientServer = ENeither;
+	SpecifyRfc822Dir(KRfc822Files);	
+	}
+
+EXPORT_C CBaseMtm* CMsvTestUtils::InstantiateClientMtmL(TUid aMtmType, TMsvId aServiceId)
+	{
+	// client side
+	__ASSERT_ALWAYS(iClientServer == EClientSide, Panic(KErrGeneral));
+
+	if (!iClientMtmRegistry)
+		{
+		iClientMtmRegistry = CClientMtmRegistry::NewL(*iMsvSession);
+		}
+
+	CBaseMtm* newMtm = iClientMtmRegistry->NewMtmL(aMtmType);
+
+	CMsvEntry* entry = iMsvSession->GetEntryL(aServiceId);
+	CleanupStack::PushL(entry);
+	newMtm->SetCurrentEntryL(entry);
+	CleanupStack::Pop(); //entry
+	return newMtm;
+	}
+
+EXPORT_C CBaseServerMtm* CMsvTestUtils::InstantiateServerMtmL(TUid aMtmType, TMsvId aServiceId)
+	{
+	// server side
+	__ASSERT_ALWAYS(iServerMtmDllRegistry, Panic(KErrGeneral));
+	__ASSERT_ALWAYS(iClientServer == EServerSide, Panic(KErrNotSupported));
+	User::LeaveIfError(iServerEntry->SetEntry(aServiceId));  	
+	CBaseServerMtm* newMtm = iServerMtmDllRegistry->NewServerMtmL(aMtmType, iServerEntry);
+	return newMtm;
+	}
+
+
+EXPORT_C void CMsvTestUtils::GoClientSideL()
+	{
+	Reset();
+ 	iFs.SetSessionPath(iDriveName);
+	iDummyObserver = new (ELeave) TMsvDummyObserver;
+	iMsvSession = CMsvSession::OpenSyncL(*iDummyObserver);
+	iMsvEntry = CMsvEntry::NewL(*iMsvSession, KMsvRootIndexEntryId, TMsvSelectionOrdering());
+	iClientServer = EClientSide;
+	}
+
+EXPORT_C void CMsvTestUtils::GoServerSideL()
+	{
+	Reset();
+	
+	_LIT(KMsvServerPattern, "!MsvServer*");
+	TFindProcess findprocess(KMsvServerPattern);
+	TFullName name;
+
+	// wait for the server to close before trying to start
+	// one within this process.
+	for(;;)
+		{	
+		TFindServer find(KMsvServerPattern);
+		if (find.Next(name) != KErrNone)
+			break;
+		User::After(100000);
+		}
+
+	iMsvServer = CMsvServer::NewL();
+	
+	// wait a couple of seconds
+	CTestTimer* timer = CTestTimer::NewL();
+	timer->After(5000000);
+	CActiveScheduler::Start();
+	delete timer;
+
+	iServerEntry = CMsvServerEntry::NewL(*iMsvServer, KMsvRootIndexEntryId);
+	iClientServer = EServerSide;
+	}
+
+EXPORT_C void CMsvTestUtils::CreateServerMtmRegL(const TUid aMsgType, const TDesC& aHumanReadableName, const TMsvTestDllInfo& aServerMtm, const TMsvTestDllInfo& aClientMtm, const TMsvTestDllInfo& aUiMtm, const TMsvTestDllInfo& aUiDataMtm, const TUid aGroup, const TDesC& aDatFile)
+	{
+	CMtmDllInfoArray* mtmdllinfoarray=new(ELeave) CMtmDllInfoArray();
+	CleanupStack::PushL(mtmdllinfoarray);
+
+	CMtmDllInfo* mtmdllinfo1=CMtmDllInfo::NewL(aHumanReadableName,TUidType(KDynamicLibraryUid,KUidMtmServerComponent,TUid::Uid(KUidMtmDefaultSpecificVal)),aServerMtm.iFileName,aServerMtm.iOrdinal,aServerMtm.iVersion);
+	mtmdllinfoarray->AddMtmDllInfoL(mtmdllinfo1);
+
+	CMtmDllInfo* mtmdllinfo2=CMtmDllInfo::NewL(aHumanReadableName,TUidType(KDynamicLibraryUid,KUidMtmClientComponent,TUid::Uid(KUidMtmDefaultSpecificVal)),aClientMtm.iFileName,aClientMtm.iOrdinal,aClientMtm.iVersion);
+	mtmdllinfoarray->AddMtmDllInfoL(mtmdllinfo2);
+
+	CMtmDllInfo* mtmdllinfo3=CMtmDllInfo::NewL(aHumanReadableName,TUidType(KDynamicLibraryUid,KUidMtmUiComponent,TUid::Uid(KUidMtmDefaultSpecificVal)),aUiMtm.iFileName,aUiMtm.iOrdinal,aUiMtm.iVersion);
+	mtmdllinfoarray->AddMtmDllInfoL(mtmdllinfo3);
+
+	CMtmDllInfo* mtmdllinfo4=CMtmDllInfo::NewL(aHumanReadableName,TUidType(KDynamicLibraryUid,KUidMtmUiDataComponent,TUid::Uid(KUidMtmDefaultSpecificVal)),aUiDataMtm.iFileName,aUiDataMtm.iOrdinal,aUiDataMtm.iVersion);
+	mtmdllinfoarray->AddMtmDllInfoL(mtmdllinfo4);
+
+	// Create an empty capability set for creating a new group data object
+	TCapabilitySet capSet;
+	capSet.SetEmpty();
+	CleanupStack::Pop(mtmdllinfoarray); // next line takes ownership
+	CMtmGroupData* mtmgroupdata=CMtmGroupData::NewL(aMsgType, aGroup, mtmdllinfoarray, capSet);
+	CleanupStack::PushL(mtmgroupdata);
+
+	CFileStore* filestore = CPermanentFileStore::ReplaceLC(FileSession(), aDatFile, EFileShareExclusive|EFileStream|EFileWrite);
+	TUidType uidtype(KPermanentFileStoreLayoutUid, KUidMsvDataComponent, aMsgType);
+
+	filestore->SetTypeL(uidtype);
+	RStoreWriteStream out;
+	TStreamId streamid=out.CreateLC(*filestore);	// Push to stack
+	mtmgroupdata->ExternalizeL(out);
+	out.CommitL();
+	CleanupStack::PopAndDestroy(); // out
+	filestore->SetRootL(streamid);
+	filestore->CommitL();
+	CleanupStack::PopAndDestroy(2, mtmgroupdata); // filestore, mtmgroupdata
+	}
+
+EXPORT_C TMsvId CMsvTestUtils::CreateServiceL(const TUid aMtm, TBool aReadOnly, TBool aVisible)
+	{
+	TMsvId id = 0;
+	TMsvEntry entry;
+	entry.iMtm = aMtm;
+	entry.iType = KUidMsvServiceEntry;
+	entry.SetReadOnly(aReadOnly);
+	entry.SetVisible(aVisible);
+	
+	SetEntryL(KMsvRootIndexEntryId);
+	CreateEntryL(entry);
+	id = entry.Id();
+	SetEntryL(id);
+	return id;
+	}
+
+
+EXPORT_C void CMsvTestUtils::CreateRegistryObjectAndControlL()
+	{
+	//	Create the registry object
+	if (!iServerMtmDllRegistry)
+		iServerMtmDllRegistry = CServerMtmDllRegistry::NewL(iFs);
+
+	//	Create the registry control..
+	if (!iMtmRegistryControl)
+		iMtmRegistryControl = CMtmRegistryControl::NewL(iFs, *iServerMtmDllRegistry);
+
+	iRegistryObjectAndControlCreated = ETrue;
+	}
+
+EXPORT_C void CMsvTestUtils::InstallMtmGroupL(const TDesC& aDatFile)
+	{
+	TInt err = KErrNone;
+	
+	if (iClientServer == EClientSide)
+		{
+		err = iMsvSession->InstallMtmGroup(aDatFile);
+		}
+	else
+		{
+		User::LeaveIfNull(iServerMtmDllRegistry);
+		User::LeaveIfNull(iMtmRegistryControl);
+
+		//	Actually load the group data...
+		TUid aUid;
+		err = iMtmRegistryControl->InstallMtmGroup(aDatFile, aUid);
+		}
+
+	if (err != KErrAlreadyExists)
+		User::LeaveIfError(err);
+	}
+
+EXPORT_C void CMsvTestUtils::CleanMessageFolderL()
+	{
+
+	//Kill the message server if its running
+	_LIT(KMsvServerPattern, "!MsvServer*");
+	TFindProcess findprocess(KMsvServerPattern);
+	TFullName name;
+	if(findprocess.Next(name)==KErrNone)
+		{
+		RProcess process;
+    	User::LeaveIfError(process.Open(findprocess));
+     	process.Kill(KErrCancel) ;
+		process.Close() ;
+		}
+	
+	// Wait for the server to close before trying to remove
+	// the message folder
+	
+	TInt loopCount = 0;
+	FOREVER
+		{
+		TFindServer find(KMsvServerPattern);
+		if (find.Next(name) != KErrNone)
+			break;
+		User::After(1000000);
+		++loopCount;
+		if(loopCount > 5)
+			{
+			User::Invariant();
+			}
+		}
+	
+	// remove the drive from the system ini 
+	CDictionaryFileStore* store = CDictionaryFileStore::SystemLC(iFs);
+	if (store->IsPresentL(KUidMsvMessageDriveStream))
+		{
+		store->RemoveL(KUidMsvMessageDriveStream); 
+		store->CommitL();
+		}
+	CleanupStack::PopAndDestroy(); // store
+
+	CFileMan* fileMan = CFileMan::NewL(iFs); 
+	CleanupStack::PushL(fileMan);
+	TParse parse;
+	TInt error;
+	TFileName fileName(KMsvDefaultFolder2); 
+	
+	TChar driveChar=FileSession().GetSystemDriveChar();
+ 	TBuf<2> systemDrive = iDriveName;
+
+	parse.Set(fileName, &systemDrive, NULL);
+	error = fileMan->RmDir(parse.DriveAndPath()); 
+	error = iFs.RmDir(parse.DriveAndPath()); 
+	if (!(error==KErrNotFound||error==KErrNone || error == KErrPathNotFound))
+		{
+        TPtrC driveAndPath = parse.DriveAndPath();
+		Printf(_L("Directory %S cannot be removed. "), &driveAndPath);
+		Printf(_L("Please ensure directory is not in use.\n"));
+		User::Leave(KErrAccessDenied);
+		}
+	
+	//delete DBs in C:, D: and E:.
+	TPath pathNameTemp(iDriveName);
+	pathNameTemp.Append(KDbFileName);
+	RSqlDatabase::Delete(pathNameTemp);
+	pathNameTemp = _L("D:");
+	pathNameTemp.Append(KDbFileName);
+	RSqlDatabase::Delete(pathNameTemp);
+	pathNameTemp = _L("E:");
+	pathNameTemp.Append(KDbFileName);	
+	RSqlDatabase::Delete(pathNameTemp);
+
+	// delete "StoreInit.tmp"
+ 	TPath pathName(iDriveName);
+	pathName.Append(KStoreInitFileName);  	
+	iFs.Delete(pathName); 
+	CleanupStack::PopAndDestroy(fileMan);
+	}
+
+EXPORT_C void CMsvTestUtils::FindChildrenL(TMsvId aFolderToTraverse, const TFileName& aFilepath, TBool aReplace, TBool aOtherFiles)
+	{
+	SpecifyLogsDir(aFilepath);
+	FindChildrenL(aFolderToTraverse, aReplace, aOtherFiles);
+	}
+
+EXPORT_C void CMsvTestUtils::FindChildrenL(TMsvId aFolderToTraverse, TBool aReplace, TBool aOtherFiles)
+	{
+	iFileCount=0;
+
+	CDir* rfcFileList;
+	// Loads the any test files into an EntryList
+	iFs.GetDir(iRfc822Dir, KEntryAttNormal, ESortByName, rfcFileList);
+		
+	TMsvSelectionOrdering ordering;
+	ordering.SetShowInvisibleEntries(ETrue);
+
+	TMsvId entryId;
+	if (iClientServer==EClientSide)
+		{
+		entryId=iMsvEntry->Entry().Id();
+		iMsvEntry->SetEntryL(aFolderToTraverse);
+		iMsvEntry->SetSortTypeL(ordering);
+		}
+	else
+		{
+		entryId=iServerEntry->Entry().Id();
+		iServerEntry->SetEntry(aFolderToTraverse);
+		iServerEntry->SetSort(ordering);
+		}
+
+
+	RFile file;
+	TFileName filename(iLogsDir);
+	filename.Append(KFileNameEntryStructure);
+
+	// Print out Hierarchy - Save to file
+		
+	if (aReplace)
+		{
+		// replace both Entry_Structure.txt and Entry_RichTextBodies.txt
+		TInt err1 = file.Replace(iFs, filename, EFileShareAny | EFileStreamText | EFileWrite);
+		if (err1==KErrNotFound) // file does not exist - create it
+			err1=file.Create(iFs, filename, EFileShareAny | EFileStreamText | EFileWrite);
+		if (err1 == KErrNone)
+			ListChildrenL(aReplace, aOtherFiles, file, *rfcFileList);
+		}
+	else
+		{
+		TInt err1 = file.Open(iFs, filename, EFileShareAny | EFileStreamText | EFileWrite);
+		if (err1==KErrNotFound)
+			file.Create(iFs, filename, EFileShareAny | EFileStreamText | EFileWrite);
+		else if (err1 != KErrNone)
+			User::Leave(err1);
+		TInt position=1;
+		User::LeaveIfError(file.Seek(ESeekEnd, position));
+		ListChildrenL(aReplace, aOtherFiles, file, *rfcFileList);
+		}
+
+	file.Close();
+	
+	if (iClientServer==EClientSide)
+		iMsvEntry->SetEntryL(entryId);
+	else
+		iServerEntry->SetEntry(entryId);
+	delete rfcFileList;
+	}
+
+EXPORT_C void CMsvTestUtils::WriteBodyDataL(TMsvId aId, const TFileName& aFilepath, CMsvStore& fileStore, TBool aReplace)
+	{
+	CParaFormatLayer* paraLayer = CParaFormatLayer::NewL();
+	CCharFormatLayer* charLayer = CCharFormatLayer::NewL();
+	CRichText* body = CRichText::NewL(paraLayer,charLayer);
+
+	fileStore.RestoreBodyTextL(*body);
+
+	HBufC* pBodyText = HBufC::NewLC(body->DocumentLength()+(body->DocumentLength()/70)+1);
+	TPtr pBody = pBodyText->Des();
+	body->Extract(pBody, 0);
+
+	RFile file;
+	TFileName filename(aFilepath);
+	filename.Append(KFileNameBodies);
+	
+	TInt err = KErrNone;
+	if (aReplace)
+		err = file.Replace(iFs, filename, EFileShareAny | EFileStreamText | EFileWrite);
+	else
+		err = file.Open(iFs, filename, EFileShareAny | EFileStreamText | EFileWrite);
+	if(err==KErrNotFound) // file does not exist - create it
+		err=file.Create(iFs, filename, EFileShareAny | EFileStreamText | EFileWrite);
+
+	TInt offset=0;
+	iRTest(file.Seek(ESeekEnd, offset)==KErrNone);
+
+	TBuf<100> buf;
+	buf.Zero();
+	buf.AppendFormat(_L("*** %d *************** RichText Data ***************\n"), aId);
+	buf.AppendFormat(_L("Size >>> %d\n"), body->DocumentLength());	
+	WriteToFileL(file, buf);
+	
+	RemoveRichtextFormating(pBody);
+	WriteToFileL(file, pBody);
+	
+	buf.Zero();
+	buf.AppendFormat(_L("\n********************* end of Body ***********************\n"));
+	WriteToFileL(file, buf);
+	
+	CleanupStack::PopAndDestroy(); // pBodyText
+	file.Close();
+	delete paraLayer;
+	delete charLayer;
+	delete body;
+	}
+
+EXPORT_C void CMsvTestUtils::WriteFileDataL(TMsvId aId, const TFileName& aFileName, const TFileName& aLogFilepath, TBool aReplace)
+	{
+	TParse dirPath;
+	RFile attach;
+
+	dirPath.Set(aFileName, NULL, NULL);
+	TInt err = KErrNone;
+	if (attach.Open(iFs, dirPath.FullName(), KEntryAttNormal) != KErrNone)
+		return; // failed to find attachment
+
+
+	TFileName filename(aLogFilepath);
+	filename.Append(KFileNameFiles);
+	RFile file;
+	if (aReplace)
+		err = file.Replace(iFs, filename, EFileShareAny | EFileStreamText | EFileWrite);
+	else
+		err = file.Open(iFs, filename, EFileShareAny | EFileStreamText | EFileWrite);
+	if(err==KErrNotFound) // file does not exist - create it
+		err=file.Create(iFs, filename, EFileShareAny | EFileStreamText | EFileWrite);
+		
+	TInt offset=0;
+	__ASSERT_ALWAYS(file.Seek(ESeekEnd, offset)==KErrNone, Panic(KErrGeneral));
+
+	TBuf<100> buf;
+	buf.Zero();
+	buf.AppendFormat(_L("\n*** %d *************** File Data ***************\n"), aId);
+	
+	buf.AppendFormat(_L("Filename >>> "));	
+	WriteToFileL(file, buf);
+	WriteToFileL(file, dirPath.NameAndExt());	
+	WriteToFileL(file,_L("\n"));
+	
+	HBufC8* buffer8 = HBufC8::NewLC(1024);
+	TPtr8 buf8 = buffer8->Des();
+	do {
+		attach.Read(buf8);
+		WriteToFileL(file, buf8);
+		} while (buf8.Length());
+	
+	buf.Zero();
+	buf.AppendFormat(_L("\n********************* end of File ***********************\n"));
+	WriteToFileL(file, buf);
+	
+
+	CleanupStack::PopAndDestroy(); // buffer8
+	attach.Close();
+	file.Close();
+	}
+
+
+void CMsvTestUtils::ListChildrenL(TBool aReplace, TBool aOtherFiles, RFile& file, CDir& rfcFileList)
+	{
+	TInt count = 0;
+	TInt entryCount = 0;
+
+	ListChildrenL(file, rfcFileList, count, entryCount, aReplace, aOtherFiles);
+	}
+
+EXPORT_C void CMsvTestUtils::SetFolderType(TMsvEntry& entry, TPtrC& type)
+	{
+
+	if(entry.iType == KUidMsvRootEntry)
+		type.Set(_L("ROOT"));
+	else if(entry.iType == KUidMsvServiceEntry)
+		type.Set(_L("SERVICE"));
+	else if(entry.iType == KUidMsvFolderEntry)
+		type.Set(_L("FOLDER"));
+	else if(entry.iType == KUidMsvMessageEntry)
+		type.Set(_L("MESSAGE"));
+	else if(entry.iType == KUidMsvEmailTextEntry)
+		type.Set(_L("TEXT"));
+	else if(entry.iType == KUidMsvEmailHtmlEntry)
+		type.Set(_L("HTML"));
+	else if(entry.iType == KUidMsvAttachmentEntry)
+		type.Set(_L("ATTACHMENT"));
+	else
+		type.Set(_L("UNKNOWN"));
+	}
+
+EXPORT_C void CMsvTestUtils::ListChildrenL(RFile& aFile, CDir& rfcFileList, TInt& aCount, TInt& aEntryCount, TBool aReplace, TBool aOtherFiles)
+	{
+	// Check details of attachments on current context entry
+
+	// Get list of children IDs
+	CMsvEntrySelection* msvSelection = NULL;
+
+	TMsvEntry entry;
+	if (iClientServer==EClientSide)
+		{
+		entry = iMsvEntry->Entry(); 
+		msvSelection = iMsvEntry->ChildrenL();
+		}
+	else
+		{
+		entry = iServerEntry->Entry(); 
+		msvSelection = new (ELeave) CMsvEntrySelection;
+		iServerEntry->GetChildren(*msvSelection);
+		}
+	CleanupStack::PushL(msvSelection);
+
+	TInt attachCount = msvSelection->Count(); 	// For each child ..
+	TPtrC type;
+	SetFolderType(entry, type);
+
+	TPtrC priority;
+	TMsvPriority temp=entry.Priority();
+	if(temp==EMsvHighPriority)
+		priority.Set(_L("High  "));
+	else if(temp==EMsvMediumPriority)
+		priority.Set(_L("Medium"));
+	else if(temp==EMsvLowPriority)
+		priority.Set(_L("Low   "));
+	else
+		priority.Set(_L("None  "));
+
+	TBuf<11> other=_L("-------  ");
+
+	TBuf<6> streams=_L("------");
+
+	if ((iClientServer==EClientSide && iMsvEntry->HasStoreL()) ||
+		(iClientServer==EServerSide && iServerEntry->HasStoreL()))
+		{
+		CMsvStore* fileStore;
+		fileStore = (iClientServer==EClientSide) ? iMsvEntry->ReadStoreL() : iServerEntry->ReadStoreL();
+		
+		if(aOtherFiles && fileStore->IsPresentL(KMsvEntryRichTextBody))
+			{
+			WriteBodyDataL(entry.Id(), iLogsDir, *fileStore, aReplace);
+			streams.Replace(2, 1, _L("B"));
+			}
+		delete fileStore;
+		}
+
+	if(entry.Attachment())
+		streams.Replace(3, 1, _L("A"));
+
+	if (entry.New())
+		other.Replace(1, 1, _L("N"));
+	if (entry.Unread())
+		other.Replace(2, 1, _L("U"));
+	if (entry.Complete())
+		other.Replace(3, 1, _L("C"));
+
+	TBuf<600> outputLine;
+
+	// Put details into output string buffer
+	TMsvId current=entry.Id();
+	if (iClientServer==EClientSide) 
+		iMsvEntry->SetEntryL(current);
+	else
+		iServerEntry->SetEntry(current);
+	
+	for(TInt i=0; i<aCount; i++)
+		outputLine.AppendFormat(_L("  "));
+		
+	outputLine.AppendFormat(TRefByValue<const TDesC>_L("%S, 00%x, Children=%d, Size=%d, Store=%S, P=%S, Other=%S, Det:%S\r\n"),
+							&type, 
+							entry.Id(),
+							attachCount, 
+							entry.iSize,
+							&streams,
+							&priority,
+							&other,
+							&entry.iDetails);
+	
+	HBufC8* pOutputLine8 = HBufC8::NewLC(outputLine.Length());
+	pOutputLine8->Des().Copy(outputLine);
+	aFile.Write(pOutputLine8->Des());
+	CleanupStack::PopAndDestroy(); // pBuf16
+
+	for(TInt j=0; j<attachCount; j++)
+		{
+		// Get Context of current message
+		if (iClientServer==EClientSide) 
+			iMsvEntry->SetEntryL((*msvSelection)[j]);
+		else
+			iServerEntry->SetEntry((*msvSelection)[j]);
+			
+		aEntryCount++;
+		aCount++;
+		ListChildrenL(aFile, rfcFileList, aCount, aEntryCount, aReplace);
+		aCount--;
+		}	
+
+	CleanupStack::PopAndDestroy(); // msvSelection
+	}
+
+
+EXPORT_C void CMsvTestUtils::CreateAllTestDirectories()
+	{
+	CTestUtils::CreateAllTestDirectories();
+
+	iFs.SetSessionPath(iDriveName);
+
+	if (!iFs.MkDir(KMsvDefaultFolder2))
+		{
+		Printf(_L("Created mail directory\n"));
+		}
+
+	if (!iFs.MkDir(KMtmDir))
+		{
+		Printf(_L("Created mtm directory\n"));
+		}
+	}
+
+EXPORT_C void CMsvTestUtils::ConstructL(TUint aFlags)
+	{
+	if (aFlags & ETuKeepLogFile)
+		CTestUtils::ConstructKeepLogFileL();
+	else		
+		CTestUtils::ConstructL();
+
+	FileSession().SetSessionPath(iDriveName);
+
+	if (aFlags & ETuCleanMessageFolder)
+		{
+		Printf(_L("Clean Message Folder\n"));
+		CleanMessageFolderL();
+		}
+
+	if (aFlags & ETuCreateTestDirectories)
+		{
+		Printf(_L("Create All Test Directories\n"));
+		CreateAllTestDirectories();
+		}
+
+	if (aFlags & ETuDeleteMtmRegistry)
+		{
+		Printf(_L("Delete Mtm Registry\n"));
+		_LIT(KSystemMTMRegister, "\\system\\mtm\\MTM Registry");
+		TPath pathNameTemp(iDriveName) ;
+		pathNameTemp.Append(KSystemMTMRegister);		
+		FileSession().Delete(pathNameTemp);
+		}
+
+	CreateRegistryObjectAndControlL();
+
+	if (aFlags & ETuCreateServerMtmReg)
+		{
+		Printf(_L("Create Server Mtm Regs\n"));
+		CreateServerMtmRegsL();
+		}
+
+	if (aFlags & ETuGoClientSide)
+		{
+		Printf(_L("Go Client Side\n"));
+		__ASSERT_ALWAYS(!(aFlags & ETuGoServerSide), Panic(KErrGeneral));
+		GoClientSideL();
+		}
+
+	if (aFlags & ETuGoServerSide)
+		{
+		Printf(_L("Go Server Side\n"));
+		__ASSERT_ALWAYS(!(aFlags & ETuGoClientSide), Panic(KErrGeneral));
+		GoServerSideL();
+		}
+
+	if (aFlags & ETuInstallMtmGroup)
+		{
+		Printf(_L("Install Mtm Groups\n"));
+		InstallMtmGroupsL();
+		}
+
+	if (aFlags & ETuDeleteService)
+		{
+		Printf(_L("Delete Existing Services\n"));
+		__ASSERT_ALWAYS(iClientServer, Panic(KErrGeneral));
+		DeleteServicesL();
+		}
+	else if (iClientServer)
+		{
+		Printf(_L("Find Existing Services\n"));
+		FindExistingServicesL();
+		}
+
+	if (aFlags & ETuCreateService)
+		{
+		Printf(_L("Create Services\n"));
+		__ASSERT_ALWAYS(iClientServer, Panic(KErrGeneral));
+		CreateServicesL();
+		}
+	TChar driveChar=RFs::GetSystemDriveChar();
+ 	iDriveName.Append(driveChar);
+ 	iDriveName.Append(KDriveDelimiter);	
+
+	SpecifyLogsDir(KLogsDir);
+	FileSession().SetSessionPath(iDriveName);
+	}
+
+EXPORT_C void CMsvTestUtils::ServiceIdL(TUid aMtm, TMsvId& rFirstId, CMsvEntrySelection* rServiceIds)
+	{
+//Returns the Service IDs of MTM aMtm
+
+	rFirstId = KMsvNullIndexEntryId;
+
+	SetEntryL(KMsvRootIndexEntryId);
+
+//	TMsvSelectionOrdering oldOrder = aEntry.SortType();
+	TMsvSelectionOrdering order;
+	order.SetShowInvisibleEntries(ETrue);
+	SetSortTypeL(order);
+
+	//Get the children on the Root Index Entry
+	CMsvEntrySelection* selection = ChildrenWithTypeLC(KUidMsvServiceEntry);
+
+	TInt count = selection->Count();
+
+	//Find an entry for MTM aMtm
+	for (TInt curChild = 0; curChild < count && (rFirstId == KMsvNullIndexEntryId || rServiceIds); curChild++)
+		{
+		SetEntryL(selection->At(curChild));
+
+		if (Entry().iMtm == aMtm)
+			{
+			TMsvId id = Entry().Id();
+
+			if (rFirstId == KMsvNullIndexEntryId)
+				rFirstId = id;
+
+			if (rServiceIds)
+				rServiceIds->AppendL(id);
+			}
+		}
+
+	//Leave if no Service Entry found for MTM aMtm
+	if (rFirstId == KMsvNullIndexEntryId)
+		{
+		CleanupStack::PopAndDestroy(); //selection
+		User::Leave(KErrNotFound);
+		}
+
+	CleanupStack::PopAndDestroy(); //selection
+	}
+
+EXPORT_C void CMsvTestUtils::DeleteServiceL(TUid aMtm)
+	{
+	CMsvEntrySelection* sel = new (ELeave) CMsvEntrySelection();
+	CleanupStack::PushL(sel);
+	TMsvId firstId = 0;
+	TRAPD(err, ServiceIdL(aMtm, firstId, sel));
+	
+	if (!err)
+		{
+		TInt count = sel->Count();
+
+		while (count--)
+			{
+			TMsvId del = sel->At(count);
+			TRAP(err, SetEntryL(del));
+
+			if (!err)
+				{
+				TRAP(err, SetEntryL(Entry().Parent()));
+
+				if (!err)
+					{
+					TRAP(err, DeleteEntryL(del));
+					}
+				}
+
+			if (err)
+				{
+				Printf(_L("Error deleting service entry\n"));
+				}
+			}
+		}
+
+	CleanupStack::PopAndDestroy(); //sel
+	}
+
+EXPORT_C void CMsvTestUtils::SpecifyLogsDir(const TFileName& aFilePath)
+	{
+	iLogsDir.Copy(aFilePath);
+	}
+
+EXPORT_C void CMsvTestUtils::SpecifyRfc822Dir(const TFileName& aFilePath)
+	{
+	iRfc822Dir.Copy(aFilePath);
+	}
+
+//Returns TMsvEntry.iDate for aEntryId, and the time it is scheduled for on the task scheduler
+EXPORT_C TInt CMsvTestUtils::ScheduleTime(TMsvId aEntryId, TTime& rEntryTime, TTime& rTaskSchedulerTime, TTaskInfo& rTaskInfo)
+	{
+	TRAPD(err, DoScheduleTimeL(aEntryId, rEntryTime, rTaskSchedulerTime, rTaskInfo));
+	return err;
+	}
+
+void CMsvTestUtils::DoScheduleTimeL(TMsvId aEntryId, TTime& rEntryTime, TTime& rTaskSchedulerTime, TTaskInfo& rTaskInfo)
+	{
+	SetEntryL(aEntryId);
+	rEntryTime = Entry().iDate;
+
+	CMsvStore* store = ReadStoreL();
+	CleanupStack::PushL(store);
+
+	TMsvEntryScheduleData data;
+	data.RestoreL(*store);
+
+	CleanupStack::PopAndDestroy(); //store
+
+	if (data.iTaskId == KErrNotFound)
+		User::Leave(KErrNotFound);
+
+	RScheduler scheduler;
+	User::LeaveIfError(scheduler.Connect());
+    // Make sure that scheduler connection
+    // is closed if anything fails (and we leave) in this method.
+	CleanupClosePushL(scheduler);
+
+	TSchedulerItemRef ref;
+	TInt size = 0;
+
+	User::LeaveIfError(scheduler.GetTaskDataSize(data.iTaskId, size));
+
+	HBufC* buf = HBufC::NewLC(size);
+	TPtr ptr = buf->Des();
+
+	User::LeaveIfError(scheduler.GetTaskInfoL(data.iTaskId, rTaskInfo, ptr, ref, rTaskSchedulerTime));
+
+	CleanupStack::PopAndDestroy(2,&scheduler); //buf,scheduler.
+	}
+
+EXPORT_C TInt CMsvTestUtils::AppendScheduleTimeL(TMsvId aEntryId, TDes& rOutput)
+	{
+	TTime entryTime, schTime;
+	TTaskInfo info;
+	TInt err = ScheduleTime(aEntryId, entryTime, schTime, info);
+
+	if (!err)
+		{
+		TBuf<128> dateString;
+
+		entryTime.FormatL(dateString, _L("\tEntry: %D%M%Y%/0%1%/1%2%/2%3%/3 %-B%:0%J%:1%T%:2%S%.%*C4%:3%+B"));
+		rOutput.Append(dateString);
+
+		schTime.FormatL(dateString, _L("\n\tSched: %D%M%Y%/0%1%/1%2%/2%3%/3 %-B%:0%J%:1%T%:2%S%.%*C4%:3%+B"));
+		rOutput.Append(dateString);
+
+		rOutput.AppendFormat(_L(" (taskId %d)\n"), info.iTaskId);
+		}
+	else
+		{
+		rOutput.AppendFormat(_L("\tError %d: Cannot read schedule time for msg %d\n"), err, aEntryId);
+		}
+
+	return err;
+	}
+
+EXPORT_C void CMsvTestUtils::NavigateMessageStoreL(TMsvId aParent)
+	{
+	//Allows the user to navigate through the message store
+
+	if (iClientServer != EClientSide)
+		return;
+
+	TInt count = 0;
+	TInt start = 0;
+
+	while (count < 3)
+		{
+		TInt err = DoNavigateMessageStoreL(aParent, start);
+
+		if (err == KErrDied)
+			break;
+		else if (err)
+			count++;
+		else
+			count = 0;
+		}
+	}
+
+TInt CMsvTestUtils::DoNavigateMessageStoreL(TMsvId& aParent, TInt& aStart)
+	{
+	TMsvSelectionOrdering order;
+	order.SetShowInvisibleEntries(ETrue);
+	CMsvEntry* parent = CMsvEntry::NewL(*iMsvSession, aParent, order);
+	CleanupStack::PushL(parent);
+
+	iRTest.Printf(KMsvTestUtilsNewLine);
+	TInt more = 0;
+	const TInt KMax = 10;
+	ShowChildrenL(*parent, aStart, more, KMax);
+	iRTest.Printf(KMsvTestUtilsNewLine);
+
+	iRTest.Printf(_L("Select a message or '.' (for parent) or 'N'ext or 'P'revious or e'X'it\n"));
+
+	const TInt count = Min(KMax, parent->Count() - aStart);
+	const TChar startChar = '0';
+	const TChar endChar = startChar + count - 1;
+	const TChar key = iRTest.Getch();
+
+	TInt ret = KErrNotFound;
+
+	if (key >= '0' && key <= endChar)
+		{
+		iRTest.Printf(KMsvTestUtilsNewLine);
+
+		TMsvEntry entry((*parent)[key - startChar + aStart]);
+
+		if (entry.Owner())
+			{
+			aStart = 0;
+			aParent = entry.Id();
+			}
+		else
+			{
+			DisplayChildDetailsL(entry);
+			}
+
+		ret = KErrNone;
+		}
+	else if (key == '.')
+		{
+		aStart = 0;
+		if (aParent != KMsvRootIndexEntryId)
+			aParent = parent->Entry().Parent();
+
+		ret = KErrNone;
+		}
+	else if (key == 'n' || key == 'N')
+		{
+		if (more > 0)
+			{
+			aStart += KMax;
+			}
+
+		ret = KErrNone;
+		}
+	else if (key == 'p' || key == 'P')
+		{
+		if (aStart > 0)
+			{
+			aStart -= KMax;
+			}
+
+		ret = KErrNone;
+		}
+	else if (key == 'x' || key == 'X')
+		{
+		ret = KErrDied;
+		}
+
+	CleanupStack::PopAndDestroy(parent);
+	return ret;
+	}
+
+void CMsvTestUtils::ShowChildrenL(const CMsvEntry& aEntry, TInt aStart, TInt& aMore, TInt aMaxCount)
+	{
+	iRTest.Printf(_L("Parent: "));
+
+	DisplayChildL(aEntry.Entry());
+
+	iRTest.Printf(KMsvTestUtilsNewLine);
+	iRTest.Printf(KMsvTestUtilsNewLine);
+
+	if (!aEntry.Entry().Owner())
+		return;
+
+	TInt count = aEntry.Count() - aStart;
+
+	if (aMaxCount > 0)
+		count = Min(count, aMaxCount);
+
+	for (TInt i = aStart; i < count + aStart; i++)
+		{
+		TBuf<16> prefix;
+		prefix.Zero();
+		prefix.AppendNum(i - aStart);
+		prefix.Append(_L(". ("));
+		prefix.AppendFormat(_L("%2d"), i + 1),
+		prefix.Append(_L("/"));
+		prefix.AppendFormat(_L("%2d"), aEntry.Count()),
+		prefix.Append(_L(")"));
+		iRTest.Printf(prefix);
+		DisplayChildL(aEntry[i]);
+		iRTest.Printf(KMsvTestUtilsNewLine);
+		}
+
+	aMore = aEntry.Count() - aStart - aMaxCount;
+
+	if (aMore > 0)
+		iRTest.Printf(_L("...%d more...\n"), aMore);
+	}
+
+EXPORT_C void CMsvTestUtils::DisplayChildL(const TMsvEntry& entry)
+	{
+	_LIT(KSpace, " ");
+	_LIT(KQuote, "\"");
+	HBufC* buf = HBufC::NewLC(entry.iDetails.Length() + entry.iDescription.Length() + 100);
+	TPtr temp(buf->Des());
+	temp.AppendFormat(_L("%7.7d"), entry.Id());
+	temp.Append(KSpace);
+
+	switch (entry.iType.iUid)
+		{
+		case KUidMsvServiceEntryValue:
+			temp.Append(_L("Serv"));
+			break;
+		case KUidMsvRootEntryValue:
+			temp.Append(_L("Root"));
+			break;
+		case KUidMsvFolderEntryValue:
+			temp.Append(_L("Fold"));
+			break;
+		case KUidMsvMessageEntryValue:
+			temp.Append(_L("Mesg"));
+			break;
+		case KUidMsvAttachmentEntryValue:
+			temp.Append(_L("Atch"));
+			break;
+		default:
+			temp.Append(_L("Othr"));
+			break;
+		}
+
+	temp.Append(KSpace);
+	temp.Append(KQuote);
+	temp.Append(entry.iDetails);
+	temp.Append(KQuote);
+	temp.Append(_L(" Mtm: "));
+	temp.AppendNum((TInt) entry.iMtm.iUid);
+	temp.Append(_L(" Des: "));
+	temp.Append(entry.iDescription.Left(10));
+
+	iRTest.Printf(temp);
+	CleanupStack::PopAndDestroy(buf);
+	}