cryptomgmtlibs/securitytestfw/test/testutil/server/testutilsession.cpp
changeset 8 35751d3474b7
parent 0 2c201484c85f
--- a/cryptomgmtlibs/securitytestfw/test/testutil/server/testutilsession.cpp	Tue Jul 21 01:04:32 2009 +0100
+++ b/cryptomgmtlibs/securitytestfw/test/testutil/server/testutilsession.cpp	Thu Sep 10 14:01:51 2009 +0300
@@ -1,463 +1,472 @@
-/*
-* Copyright (c) 2008-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 "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: 
-* TestUtil - server implementation
-*
-*/
-
-
-
-
-/**
- @file 
- @test
- @internalComponent
-*/
-
-#include "testutilserver.h"
-#include "testutilsession.h"
-#include "testutilclientserver.h"
-
-// Timer implementation
-CGenericTimer* CGenericTimer::NewL(MTimeoutClient& aClient)
-	{
-	CGenericTimer* self = new(ELeave) CGenericTimer(aClient);
-	CleanupStack::PushL(self);
-	self->ConstructL(); // calls CTimer::Construct
-	CleanupStack::Pop(self);
-	return self;
-	}
-
-CGenericTimer::CGenericTimer(MTimeoutClient& aClient)
-	: CTimer(-1), iClient(aClient)
-	{
-	CActiveScheduler::Add(this);
-	}
-
-void CGenericTimer::RunL()
-	{
-	// When the timeout expires, then call the client's handler
-	iClient.HandleTimeout();
-	};
-
-// file detector implementation
-CTestFileDetector* CTestFileDetector::NewL(const RMessage2& aMessage, RFs& aFs)
-	{
-	CTestFileDetector* self = new (ELeave) CTestFileDetector(aMessage, aFs);
-	CleanupStack::PushL(self);
-	self->ConstructL();
-	CleanupStack::Pop(self);
-	return self;
-	}
-
-CTestFileDetector::CTestFileDetector(const RMessage2& aMessage, RFs& aFs)
-	:CActive(EPriorityNormal), iFs(aFs), iMessage(aMessage)
-	{
-	iTimeInterval = iMessage.Int1();
-	CActiveScheduler::Add(this);
-	}
-
-CTestFileDetector::~CTestFileDetector()
-	{
-	Cancel();
-	delete iTimer;
-	delete iFileName;
-	}
-
-void CTestFileDetector::ConstructL()
-	{
-	if (iTimeInterval!=0)
-		{
-		iTimer=CGenericTimer::NewL(*this);
-		}
-	iFileName = CTestUtilSessionCommon::AllocateInputBufferLC(iMessage, 0);
-	CleanupStack::Pop();
-	}
-
-void CTestFileDetector::DetectFile()
-	{
-	if (!iTimer)
-		{
-		CheckAndComplete();
-		}
-	else
-		{
-		TEntry entry;
-		TInt err=iFs.Entry(iFileName->Des(), entry);
-		if (err == KErrNone)
-			{
-			TPckgC<TBool> exists(ETrue);
-			iMessage.WriteL(2, exists);
-			iMessage.Complete(KErrNone);
-			}
-		else
-			{
-			iTimer->After(iTimeInterval*1000);
-			iFs.NotifyChange(ENotifyFile, 
-							iStatus, 
-							iFileName->Des());
-			SetActive();			
-			}
-		}
-	}
-
-void CTestFileDetector::RunL()
-	{
-	if (iTimer)
-		{
-		iTimer->Cancel();
-		}
-	CheckAndComplete();
-	}
-
-void CTestFileDetector::DoCancel()
-	{
-	iFs.NotifyChangeCancel(iStatus);
-	}
-
-void CTestFileDetector::HandleTimeout()
-	{
-	Cancel();
-	CheckAndComplete();
-	}
-
-void CTestFileDetector::CheckAndComplete()
-	{
-	TEntry entry;
-	TInt err=iFs.Entry(iFileName->Des(), entry);
-	if (err == KErrNone)
-		{
-		TPckgC<TBool> exists(ETrue);
-		iMessage.WriteL(2, exists);
-		iMessage.Complete(KErrNone);
-		}
-	else if (err == KErrNotFound 
-			|| err == KErrPathNotFound
-			|| err == KErrNotReady 
-			|| err == KErrCorrupt)
-		{
-		TPckgC<TBool> exists(EFalse);
-		iMessage.WriteL(2, exists);
-		iMessage.Complete(KErrNone);
-		}
-	else
-		{
-		iMessage.Complete(err);
-		}
-	}
-
-// CTestUtilSession Implementation
-CTestUtilSession::CTestUtilSession()
-	{
-	}
-
-CTestUtilSession::~CTestUtilSession()
-	{
-	Server().DropSession();
-	for (TInt i = 0;i < iLockedFileHandles.Count(); i++)
-		{
-		iLockedFileHandles[i].Close();
-		}
-	iLockedFileHandles.Close();
-	
-	delete iFileWatcher;
-	delete iDetector;
-	}
-	
-void CTestUtilSession::CreateL()
- 	{
-	Server().AddSession();
-  	}
-
-_LIT(KBP, ":\\");
-_LIT(KFAT,"Fat");
-	
-void CTestUtilSession::ServiceL(const RMessage2& aMessage)
-	{
-	switch (aMessage.Function())
-		{
-		case ECopy:
-			{
-			HBufC* source = CTestUtilSessionCommon::AllocateInputBufferLC(aMessage,0);
-			HBufC* destination = CTestUtilSessionCommon::AllocateInputBufferLC(aMessage,1);
-
-			TInt err = Server().FileMan().Copy(*source, *destination, CFileMan::ERecurse | CFileMan::EOverWrite);
-			if (err == KErrNone)
-				{
-				// Turn off the read only attributes
-				TTime time(0); // must specify 0, or a valid time, otherwise sets time to a random value and causes -6/-21 errors
-				err = Server().FileMan().Attribs(*destination, 0, KEntryAttReadOnly, time, CFileMan::ERecurse);
-				}
-			
-			CleanupStack::PopAndDestroy(destination);
-			CleanupStack::PopAndDestroy(source);
-
-			aMessage.Complete(err);
-			break;
-			}
-		case EMove:
-			{
-			HBufC* source = CTestUtilSessionCommon::AllocateInputBufferLC(aMessage,0);
-			HBufC* destination = CTestUtilSessionCommon::AllocateInputBufferLC(aMessage,1);
-
-			TInt err = Server().FS().Rename(*source,*destination);
-			if (err == KErrNone)
-				{
-				// Turn off the read only attributes
-				TTime time(0); // must specify 0, or a valid time, otherwise sets time to a random value and causes -6/-21 errors
-				err = Server().FileMan().Attribs(*destination, 0, KEntryAttReadOnly, time, CFileMan::ERecurse);
-				}
-			
-			CleanupStack::PopAndDestroy(destination);
-			CleanupStack::PopAndDestroy(source);
-			
-			aMessage.Complete(err);
-			break;
-			}
-		case EDelete:
-			{
-			HBufC* fileName = CTestUtilSessionCommon::AllocateInputBufferLC(aMessage,0);
-			TEntry entry;
-			TInt err = Server().FS().Entry(*fileName, entry);
-			if (err == KErrNone)
-				{
-				if (entry.IsDir())
-					{
-					TPath pathName(*fileName);
-					if (pathName[pathName.Length() - 1] != KPathDelimiter)
-						{
-						pathName.Append(KPathDelimiter);
-						}
-					err = Server().FileMan().RmDir(pathName);
-					}
-				else
-					{
-					err = Server().FS().Delete(*fileName);
-					}
-				}
-			CleanupStack::PopAndDestroy(fileName);
-			
-			aMessage.Complete(err);
-			break;
-			}
-		case ERmDir:
-			{
-			HBufC* fileName = CTestUtilSessionCommon::AllocateInputBufferLC(aMessage,0);
-			TParsePtrC parsePtr(*fileName);
-			if(parsePtr.IsRoot())
-				{
-				User::Leave(KErrAccessDenied);
-				}
-			TInt err = Server().FileMan().RmDir(*fileName);
-			CleanupStack::PopAndDestroy(fileName);
-			
-			aMessage.Complete(err);
-			break;
-			}
-		case EMkDirAll:
-			{
-			HBufC* fileName = CTestUtilSessionCommon::AllocateInputBufferLC(aMessage,0);
-			TInt err = Server().FS().MkDirAll(*fileName);
-			CleanupStack::PopAndDestroy(fileName);
-			
-			aMessage.Complete(err);
-			break;
-			}
-		case EFileExists:
-			{			
-			delete iDetector;
-			iDetector=CTestFileDetector::NewL(aMessage,
-												Server().FS());			
-			iDetector->DetectFile();
-			break;
-			}
-		case ELock:
-			{
-			HBufC* fileName = CTestUtilSessionCommon::AllocateInputBufferLC(aMessage,0);
-			RFile lockFile;
-			TInt err = lockFile.Open(Server().FS(), *fileName, EFileWrite);
-			if (err == KErrNone)
-				iLockedFileHandles.Append(lockFile);
-
-			CleanupStack::PopAndDestroy(fileName);			
-			aMessage.Complete(err);
-			break;
-			}			
-		case EUnlock:
-			{
-			HBufC* fileName = CTestUtilSessionCommon::AllocateInputBufferLC(aMessage,0);
-			TInt err = KErrNotFound;
-			TFileName lockedFileName;
-			for (TInt i = 0; i < iLockedFileHandles.Count() && err;i++)
-				{
-				TInt err2 = iLockedFileHandles[i].FullName(lockedFileName);
-				User::LeaveIfError(err2);
-				if (lockedFileName.MatchF(*fileName) != KErrNotFound)
-					{
-					iLockedFileHandles[i].Close();
-					iLockedFileHandles.Remove(i);
-					err = KErrNone;
-					}
-				}
-			CleanupStack::PopAndDestroy(fileName);			
-			aMessage.Complete(err);
-			break;
-			}
-			case EFormat:
-			{
-			TInt drive = aMessage.Int0();
-			TBool formatFatOnly = aMessage.Int1();
-			TChar aDriveChar;
-			User::LeaveIfError(Server().FS().DriveToChar(drive, aDriveChar));
-			TBuf<3> bfDrv;
-			bfDrv.Append(aDriveChar);
-			bfDrv.Append(KBP);
-	
-			RFormat format;
-			TInt count;
-			User::LeaveIfError(format.Open(Server().FS(), bfDrv, EHighDensity, count));
-			CleanupClosePushL(format);
-			
-			if (formatFatOnly)
-   				{
-   				User::LeaveIfError(format.Next(count));
-   				}
-			else
-				{
-				while (count > 0)
-					{
-					User::LeaveIfError(format.Next(count));
-					}
-				}
-				
-			CleanupStack::PopAndDestroy(&format);
-			aMessage.Complete(KErrNone);
-			break;
-			}
-		case EMount:
-			{
-			TInt drive = aMessage.Int0();
-			User::LeaveIfError(Server().FS().Connect());
-			//Mount the drive synchronizely to make sure the drive is ready for the next operation
-			User::LeaveIfError(Server().FS().MountFileSystem(KFAT, drive, ETrue));
-			aMessage.Complete(KErrNone);
-			break;
-			}
-		case EUnMount:
-			{
-			TInt drive = aMessage.Int0();
-			TFileName fsName;
-			User::LeaveIfError(Server().FS().FileSystemName(fsName, drive));
-			User::LeaveIfError(Server().FS().DismountFileSystem(fsName, drive));
-			aMessage.Complete(KErrNone);
-			break;
-			}
-		case ESetReadOnly:
-			{
-			HBufC* fileName = CTestUtilSessionCommon::AllocateInputBufferLC(aMessage,0);
-			TInt setReadOnly = aMessage.Int1();
-			TUint setmask;
-			TUint clearmask;
-			if (setReadOnly)
-				{
-				// Setting read only attribute
-				setmask = KEntryAttReadOnly;
-				clearmask = 0;
-				}
-			else
-				{
-				// Clearing read only attribute
-				setmask = 0;
-				clearmask = KEntryAttReadOnly;				
-				}
-			
-			// Turn off the read only attributes
-			TTime time(0);
-			TInt err = Server().FileMan().Attribs(*fileName, setmask, clearmask, time);
-			CleanupStack::PopAndDestroy(fileName);			
-			aMessage.Complete(err);
-			break;
-			}
-		case EGetFileHandle:
-			{
-			HBufC* fileName = CTestUtilSessionCommon::AllocateInputBufferLC(aMessage,0); 
-			RFile file;
-			CleanupClosePushL(file);
-			User::LeaveIfError(file.Open(Server().FS(), *fileName, EFileRead | EFileShareReadersOnly));
-			User::LeaveIfError(file.TransferToClient(aMessage, 1));
-			CleanupStack::PopAndDestroy(2, fileName); // file
-			break;
-			}
-		case EWatchFile:
-			{
-			if (iFileWatcher)
-				{
-				if (iFileWatcher->IsActive())
-					{
-					aMessage.Complete(KErrServerBusy);
-					break;
-					}
-				else
-					{
-					delete iFileWatcher;
-					iFileWatcher = NULL;
-					}
-				}
-			// Create a new file watcher for this session
-			iFileWatcher = CFileWatcher::NewL(Server().FS(), aMessage);
-			break;
-			}
-		case EWatchFileCancel:
-			{
-			if (iFileWatcher)
-				{
-				iFileWatcher->Cancel();
-				aMessage.Complete(KErrNone);
-				}
-			else
-				{
-				// No file watch request to cancel!
-				aMessage.Complete(KErrNotReady);
-				}
-			break;
-			}
-		case EGetNumFiles:
-			{
-			HBufC* dirPath = CTestUtilSessionCommon::AllocateInputBufferLC(aMessage,0);
-			CDir* dirContents = NULL;
-			
-			User::LeaveIfError(Server().FS().GetDir(*dirPath, KEntryAttNormal, ESortNone, dirContents));
-			TPckg<TInt> numFiles(dirContents->Count());
-			
-			delete dirContents;
-			aMessage.WriteL(1, numFiles);
-			aMessage.Complete(KErrNone);
-			CleanupStack::PopAndDestroy(dirPath);
-			break;
-			}
-		default:
-			{
-			PanicClient(aMessage,EPanicIllegalFunction);
-			break;
-			}
-		}
-	}
-
-void CTestUtilSession::ServiceError(const RMessage2& aMessage,TInt aError)
-	{
-	if (aError==KErrBadDescriptor)
-		PanicClient(aMessage,EPanicBadDescriptor);
-	CSession2::ServiceError(aMessage,aError);
-	}
-// End of file
+/*
+* Copyright (c) 2004-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 "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: 
+* TestUtil - server implementation
+*
+*/
+
+
+/**
+ @file 
+ @test
+ @internalComponent
+*/
+
+#include "testutilserver.h"
+#include "testutilsession.h"
+#include "testutilclientserver.h"
+
+// Timer implementation
+CGenericTimer* CGenericTimer::NewL(MTimeoutClient& aClient)
+	{
+	CGenericTimer* self = new(ELeave) CGenericTimer(aClient);
+	CleanupStack::PushL(self);
+	self->ConstructL(); // calls CTimer::Construct
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+CGenericTimer::CGenericTimer(MTimeoutClient& aClient)
+	: CTimer(-1), iClient(aClient)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+void CGenericTimer::RunL()
+	{
+	// When the timeout expires, then call the client's handler
+	iClient.HandleTimeout();
+	};
+
+// file detector implementation
+CTestFileDetector* CTestFileDetector::NewL(const RMessage2& aMessage, RFs& aFs)
+	{
+	CTestFileDetector* self = new (ELeave) CTestFileDetector(aMessage, aFs);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+CTestFileDetector::CTestFileDetector(const RMessage2& aMessage, RFs& aFs)
+	:CActive(EPriorityNormal), iFs(aFs), iMessage(aMessage)
+	{
+	iTimeInterval = iMessage.Int1();
+	CActiveScheduler::Add(this);
+	}
+
+CTestFileDetector::~CTestFileDetector()
+	{
+	Cancel();
+	delete iTimer;
+	delete iFileName;
+	}
+
+void CTestFileDetector::ConstructL()
+	{
+	if (iTimeInterval!=0)
+		{
+		iTimer=CGenericTimer::NewL(*this);
+		}
+	iFileName = CTestUtilSessionCommon::AllocateInputBufferLC(iMessage, 0);
+	CleanupStack::Pop();
+	}
+
+void CTestFileDetector::DetectFile()
+	{
+	if (!iTimer)
+		{
+		CheckAndComplete();
+		}
+	else
+		{
+		TEntry entry;
+		TInt err=iFs.Entry(iFileName->Des(), entry);
+		if (err == KErrNone)
+			{
+			TPckgC<TBool> exists(ETrue);
+			iMessage.WriteL(2, exists);
+			iMessage.Complete(KErrNone);
+			}
+		else
+			{
+			iTimer->After(iTimeInterval*1000);
+			iFs.NotifyChange(ENotifyFile, 
+							iStatus, 
+							iFileName->Des());
+			SetActive();			
+			}
+		}
+	}
+
+void CTestFileDetector::RunL()
+	{
+	if (iTimer)
+		{
+		iTimer->Cancel();
+		}
+	CheckAndComplete();
+	}
+
+void CTestFileDetector::DoCancel()
+	{
+	iFs.NotifyChangeCancel(iStatus);
+	}
+
+void CTestFileDetector::HandleTimeout()
+	{
+	Cancel();
+	CheckAndComplete();
+	}
+
+void CTestFileDetector::CheckAndComplete()
+	{
+	TEntry entry;
+	TInt err=iFs.Entry(iFileName->Des(), entry);
+	if (err == KErrNone)
+		{
+		TPckgC<TBool> exists(ETrue);
+		iMessage.WriteL(2, exists);
+		iMessage.Complete(KErrNone);
+		}
+	else if (err == KErrNotFound 
+			|| err == KErrPathNotFound
+			|| err == KErrNotReady 
+			|| err == KErrCorrupt)
+		{
+		TPckgC<TBool> exists(EFalse);
+		iMessage.WriteL(2, exists);
+		iMessage.Complete(KErrNone);
+		}
+	else
+		{
+		iMessage.Complete(err);
+		}
+	}
+
+// CTestUtilSession Implementation
+CTestUtilSession::CTestUtilSession()
+	{
+	}
+
+CTestUtilSession::~CTestUtilSession()
+	{
+	Server().DropSession();
+	for (TInt i = 0;i < iLockedFileHandles.Count(); i++)
+		{
+		iLockedFileHandles[i].Close();
+		}
+	iLockedFileHandles.Close();
+	
+	delete iFileWatcher;
+	delete iDetector;
+	}
+	
+void CTestUtilSession::CreateL()
+ 	{
+	Server().AddSession();
+  	}
+
+_LIT(KBP, ":\\");
+_LIT(KFAT,"Fat");
+	
+void CTestUtilSession::ServiceL(const RMessage2& aMessage)
+	{
+	switch (aMessage.Function())
+		{
+		case ECopy:
+			{
+			HBufC* source = CTestUtilSessionCommon::AllocateInputBufferLC(aMessage,0);
+			HBufC* destination = CTestUtilSessionCommon::AllocateInputBufferLC(aMessage,1);
+
+			TInt err = Server().FileMan().Copy(*source, *destination, CFileMan::ERecurse | CFileMan::EOverWrite);
+			if (err == KErrNone)
+				{
+				// Turn off the read only attributes
+				TTime time(0); // must specify 0, or a valid time, otherwise sets time to a random value and causes -6/-21 errors
+				err = Server().FileMan().Attribs(*destination, 0, KEntryAttReadOnly, time, CFileMan::ERecurse);
+				}
+			
+			CleanupStack::PopAndDestroy(destination);
+			CleanupStack::PopAndDestroy(source);
+
+			aMessage.Complete(err);
+			break;
+			}
+		case EMove:
+			{
+			HBufC* source = CTestUtilSessionCommon::AllocateInputBufferLC(aMessage,0);
+			HBufC* destination = CTestUtilSessionCommon::AllocateInputBufferLC(aMessage,1);
+
+			TInt err = Server().FS().Rename(*source,*destination);
+			if (err == KErrNone)
+				{
+				// Turn off the read only attributes
+				TTime time(0); // must specify 0, or a valid time, otherwise sets time to a random value and causes -6/-21 errors
+				err = Server().FileMan().Attribs(*destination, 0, KEntryAttReadOnly, time, CFileMan::ERecurse);
+				}
+			
+			CleanupStack::PopAndDestroy(destination);
+			CleanupStack::PopAndDestroy(source);
+			
+			aMessage.Complete(err);
+			break;
+			}
+		case EDelete:
+			{
+			HBufC* fileName = CTestUtilSessionCommon::AllocateInputBufferLC(aMessage,0);
+			TEntry entry;
+			TInt err = Server().FS().Entry(*fileName, entry);
+			if (err == KErrNone)
+				{
+				if (entry.IsDir())
+					{
+					TPath pathName(*fileName);
+					if (pathName[pathName.Length() - 1] != KPathDelimiter)
+						{
+						pathName.Append(KPathDelimiter);
+						}
+					err = Server().FileMan().RmDir(pathName);
+					}
+				else
+					{
+					err = Server().FS().Delete(*fileName);
+					}
+				}
+			CleanupStack::PopAndDestroy(fileName);
+			
+			aMessage.Complete(err);
+			break;
+			}
+		case ERmDir:
+			{
+			HBufC* fileName = CTestUtilSessionCommon::AllocateInputBufferLC(aMessage,0);
+			TParsePtrC parsePtr(*fileName);
+			if(parsePtr.IsRoot())
+				{
+				User::Leave(KErrAccessDenied);
+				}
+			TInt err = Server().FileMan().RmDir(*fileName);
+			CleanupStack::PopAndDestroy(fileName);
+			
+			aMessage.Complete(err);
+			break;
+			}
+		case EMkDirAll:
+			{
+			HBufC* fileName = CTestUtilSessionCommon::AllocateInputBufferLC(aMessage,0);
+			TInt err = Server().FS().MkDirAll(*fileName);
+			CleanupStack::PopAndDestroy(fileName);
+			
+			aMessage.Complete(err);
+			break;
+			}
+		case EFileExists:
+			{			
+			delete iDetector;
+			iDetector=CTestFileDetector::NewL(aMessage,
+												Server().FS());			
+			iDetector->DetectFile();
+			break;
+			}
+		case ELock:
+			{
+			HBufC* fileName = CTestUtilSessionCommon::AllocateInputBufferLC(aMessage,0);
+			RFile lockFile;
+			TInt err = lockFile.Open(Server().FS(), *fileName, EFileWrite);
+			if (err == KErrNone)
+				iLockedFileHandles.Append(lockFile);
+
+			CleanupStack::PopAndDestroy(fileName);			
+			aMessage.Complete(err);
+			break;
+			}			
+		case EUnlock:
+			{
+			HBufC* fileName = CTestUtilSessionCommon::AllocateInputBufferLC(aMessage,0);
+			TInt err = KErrNotFound;
+			TFileName lockedFileName;
+			for (TInt i = 0; i < iLockedFileHandles.Count() && err;i++)
+				{
+				TInt err2 = iLockedFileHandles[i].FullName(lockedFileName);
+				User::LeaveIfError(err2);
+				if (lockedFileName.MatchF(*fileName) != KErrNotFound)
+					{
+					iLockedFileHandles[i].Close();
+					iLockedFileHandles.Remove(i);
+					err = KErrNone;
+					}
+				}
+			CleanupStack::PopAndDestroy(fileName);			
+			aMessage.Complete(err);
+			break;
+			}
+			case EFormat:
+			{
+			TInt drive = aMessage.Int0();
+			TBool formatFatOnly = aMessage.Int1();
+			TChar aDriveChar;
+			User::LeaveIfError(Server().FS().DriveToChar(drive, aDriveChar));
+			TBuf<3> bfDrv;
+			bfDrv.Append(aDriveChar);
+			bfDrv.Append(KBP);
+	
+			RFormat format;
+			TInt count;
+			User::LeaveIfError(format.Open(Server().FS(), bfDrv, EHighDensity, count));
+			CleanupClosePushL(format);
+			
+			if (formatFatOnly)
+   				{
+   				User::LeaveIfError(format.Next(count));
+   				}
+			else
+				{
+				while (count > 0)
+					{
+					User::LeaveIfError(format.Next(count));
+					}
+				}
+				
+			CleanupStack::PopAndDestroy(&format);
+			aMessage.Complete(KErrNone);
+			break;
+			}
+		case EMount:
+			{
+			TInt drive = aMessage.Int0();
+			User::LeaveIfError(Server().FS().Connect());
+			//Mount the drive synchronizely to make sure the drive is ready for the next operation
+			User::LeaveIfError(Server().FS().MountFileSystem(KFAT, drive, ETrue));
+			aMessage.Complete(KErrNone);
+			break;
+			}
+		case EUnMount:
+			{
+			TInt drive = aMessage.Int0();
+			TFileName fsName;
+			User::LeaveIfError(Server().FS().FileSystemName(fsName, drive));
+			User::LeaveIfError(Server().FS().DismountFileSystem(fsName, drive));
+			aMessage.Complete(KErrNone);
+			break;
+			}
+		case ESetReadOnly:
+			{
+			HBufC* fileName = CTestUtilSessionCommon::AllocateInputBufferLC(aMessage,0);
+			TInt setReadOnly = aMessage.Int1();
+			TUint setmask;
+			TUint clearmask;
+			if (setReadOnly)
+				{
+				// Setting read only attribute
+				setmask = KEntryAttReadOnly;
+				clearmask = 0;
+				}
+			else
+				{
+				// Clearing read only attribute
+				setmask = 0;
+				clearmask = KEntryAttReadOnly;				
+				}
+			
+			// Turn off the read only attributes
+			TTime time(0);
+			TInt err = Server().FileMan().Attribs(*fileName, setmask, clearmask, time);
+			CleanupStack::PopAndDestroy(fileName);			
+			aMessage.Complete(err);
+			break;
+			}
+		case EGetFileHandle:
+			{
+			HBufC* fileName = CTestUtilSessionCommon::AllocateInputBufferLC(aMessage,0); 
+			RFile file;
+			CleanupClosePushL(file);
+			User::LeaveIfError(file.Open(Server().FS(), *fileName, EFileRead | EFileShareReadersOnly));
+			User::LeaveIfError(file.TransferToClient(aMessage, 1));
+			CleanupStack::PopAndDestroy(2, fileName); // file
+			break;
+			}
+		case EWatchFile:
+			{
+			if (iFileWatcher)
+				{
+				if (iFileWatcher->IsActive())
+					{
+					aMessage.Complete(KErrServerBusy);
+					break;
+					}
+				else
+					{
+					delete iFileWatcher;
+					iFileWatcher = NULL;
+					}
+				}
+			// Create a new file watcher for this session
+			iFileWatcher = CFileWatcher::NewL(Server().FS(), aMessage);
+			break;
+			}
+		case EWatchFileCancel:
+			{
+			if (iFileWatcher)
+				{
+				iFileWatcher->Cancel();
+				aMessage.Complete(KErrNone);
+				}
+			else
+				{
+				// No file watch request to cancel!
+				aMessage.Complete(KErrNotReady);
+				}
+			break;
+			}
+		case EGetNumFiles:
+			{
+			HBufC* dirPath = CTestUtilSessionCommon::AllocateInputBufferLC(aMessage,0);
+			CDir* dirContents = NULL;
+			
+			User::LeaveIfError(Server().FS().GetDir(*dirPath, KEntryAttNormal, ESortNone, dirContents));
+			TPckg<TInt> numFiles(dirContents->Count());
+			
+			delete dirContents;
+			aMessage.WriteL(1, numFiles);
+			aMessage.Complete(KErrNone);
+			CleanupStack::PopAndDestroy(dirPath);
+			break;
+			}
+		case ESetSecureClock:
+			{
+			TTime currentTime(0);
+			currentTime.UniversalTime();
+			TTimeIntervalSeconds increment(aMessage.Int0());
+			currentTime += increment;
+			User::SetUTCTimeSecure(currentTime);
+			aMessage.Complete(KErrNone);
+
+			}
+			break;
+		default:
+			{
+			PanicClient(aMessage,EPanicIllegalFunction);
+			break;
+			}
+		}
+	}
+
+void CTestUtilSession::ServiceError(const RMessage2& aMessage,TInt aError)
+	{
+	if (aError==KErrBadDescriptor)
+		PanicClient(aMessage,EPanicBadDescriptor);
+	CSession2::ServiceError(aMessage,aError);
+	}
+// End of file