kerneltest/f32test/plugins/version_2/src/premodifier_plugin.cpp
changeset 43 96e5fb8b040d
child 36 538db54a451d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/f32test/plugins/version_2/src/premodifier_plugin.cpp	Thu Dec 17 09:24:54 2009 +0200
@@ -0,0 +1,1363 @@
+// Copyright (c) 2007-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:
+// modifier_plugin.cpp
+// 
+//
+
+#include "premodifier_plugin.h"
+#include "plugincommon.h"
+
+/**
+Leaving New function for the plugin
+@internalComponent
+*/
+CPreModifierPlugin* CPreModifierPlugin::NewL()
+	{
+	CPreModifierPlugin* self = new(ELeave) CPreModifierPlugin;
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop();
+	return self;
+	}
+
+
+/**
+Constructor for the plugin
+@internalComponent
+*/
+CPreModifierPlugin::CPreModifierPlugin() : iInterceptsEnabled(EFalse),
+									 iLogging(ETrue)
+	{
+	}
+
+
+void CPreModifierPlugin::ConstructL()
+	{
+	}
+
+/**
+The destructor for the plugin
+@internalComponent
+*/
+CPreModifierPlugin::~CPreModifierPlugin()
+	{
+	}
+
+/**
+Initialise the plugin.
+@internalComponent
+*/
+void CPreModifierPlugin::InitialiseL()
+	{
+	EnableInterceptsL();
+	}
+
+/**
+Enable the plugin's intercepts.
+@internalComponent
+*/
+void CPreModifierPlugin::EnableInterceptsL()
+	{
+	if (iInterceptsEnabled) return;
+
+    User::LeaveIfError(RegisterIntercept(EFsFileRead,   		EPostIntercept));
+    User::LeaveIfError(RegisterIntercept(EFsFileWrite, 		 	EPostIntercept));
+	User::LeaveIfError(RegisterIntercept(EFsFileRename,		 	EPostIntercept));
+	User::LeaveIfError(RegisterIntercept(EFsFileCreate,		 	EPostIntercept));
+	User::LeaveIfError(RegisterIntercept(EFsFileSize,  		 	EPostIntercept));
+	User::LeaveIfError(RegisterIntercept(EFsFileSetSize,	 	EPostIntercept));
+	User::LeaveIfError(RegisterIntercept(EFsFileLock,  			EPostIntercept));
+	User::LeaveIfError(RegisterIntercept(EFsFileUnLock,  		EPostIntercept));
+	User::LeaveIfError(RegisterIntercept(EFsFileOpen,			EPostIntercept));
+	User::LeaveIfError(RegisterIntercept(EFsFileReplace,		EPostIntercept));
+	User::LeaveIfError(RegisterIntercept(EFsReadFileSection,	EPostIntercept));
+	User::LeaveIfError(RegisterIntercept(EFsDirReadOne,  		EPostIntercept));
+	User::LeaveIfError(RegisterIntercept(EFsDirReadPacked,		EPostIntercept));
+	User::LeaveIfError(RegisterIntercept(EFsFileSubClose,       EPostIntercept));
+	User::LeaveIfError(RegisterIntercept(EFsDirOpen,			EPostIntercept));
+	User::LeaveIfError(RegisterIntercept(EFsFileTemp,			EPostIntercept));
+	User::LeaveIfError(RegisterIntercept(EFsDelete,				EPostIntercept));
+	User::LeaveIfError(RegisterIntercept(EFsReplace,			EPostIntercept));
+	User::LeaveIfError(RegisterIntercept(EFsRename,				EPostIntercept));
+	User::LeaveIfError(RegisterIntercept(EFsEntry,				EPostIntercept));
+	User::LeaveIfError(RegisterIntercept(EFsSetEntry,			EPostIntercept));
+	User::LeaveIfError(RegisterIntercept(EFsFileSeek,			EPostIntercept));
+
+    _LOG(_L("Pre-Modifier Plugin: Enabled intercepts."));
+
+    iInterceptsEnabled = ETrue;
+	}
+
+/**
+Disable the plugin's intercepts.
+@internalComponent
+*/
+void CPreModifierPlugin::DisableInterceptsL()
+	{
+	if (!iInterceptsEnabled) return;
+
+    User::LeaveIfError(UnregisterIntercept(EFsFileRead,    		EPostIntercept));
+    User::LeaveIfError(UnregisterIntercept(EFsFileWrite,   		EPostIntercept));
+    User::LeaveIfError(UnregisterIntercept(EFsFileRename,  		EPostIntercept));
+	User::LeaveIfError(UnregisterIntercept(EFsFileCreate,  		EPostIntercept));
+	User::LeaveIfError(UnregisterIntercept(EFsFileSize,    		EPostIntercept));
+	User::LeaveIfError(UnregisterIntercept(EFsFileSetSize, 		EPostIntercept));
+	User::LeaveIfError(UnregisterIntercept(EFsFileLock,    		EPostIntercept));
+	User::LeaveIfError(UnregisterIntercept(EFsFileUnLock,  		EPostIntercept));
+	User::LeaveIfError(UnregisterIntercept(EFsFileOpen,        	EPostIntercept));
+	User::LeaveIfError(UnregisterIntercept(EFsFileReplace,      EPostIntercept));
+	User::LeaveIfError(UnregisterIntercept(EFsReadFileSection,  EPostIntercept));
+	User::LeaveIfError(UnregisterIntercept(EFsDirReadOne,  		EPostIntercept));
+	User::LeaveIfError(UnregisterIntercept(EFsDirReadPacked,	EPostIntercept));
+	User::LeaveIfError(UnregisterIntercept(EFsFileSubClose,     EPostIntercept));
+	User::LeaveIfError(UnregisterIntercept(EFsDirOpen,			EPostIntercept));
+	User::LeaveIfError(UnregisterIntercept(EFsFileTemp,			EPostIntercept));
+	User::LeaveIfError(UnregisterIntercept(EFsDelete,			EPostIntercept));
+	User::LeaveIfError(UnregisterIntercept(EFsReplace,			EPostIntercept));
+	User::LeaveIfError(UnregisterIntercept(EFsRename,			EPostIntercept));
+	User::LeaveIfError(UnregisterIntercept(EFsEntry,			EPostIntercept));
+	User::LeaveIfError(UnregisterIntercept(EFsSetEntry,			EPostIntercept));
+	User::LeaveIfError(UnregisterIntercept(EFsFileSeek,			EPostIntercept));
+
+    _LOG(_L("Pre-Modifier Plugin: Disabled intercepts."));
+
+    iInterceptsEnabled = EFalse;
+	}
+
+/**
+Handle requests
+@internalComponent
+*/
+TInt CPreModifierPlugin::DoRequestL(TFsPluginRequest& aRequest)
+	{
+	TInt err = KErrNone;
+
+	TInt function = aRequest.Function();
+
+	switch(function)
+		{
+		case EFsFileRead:
+			TRAP(err, FsFileReadL(aRequest));
+			break;
+
+		case EFsFileWrite:
+			TRAP(err, FsFileWriteL(aRequest));
+			break;
+
+		case EFsFileRename:
+			TRAP(err, FsFileRenameL(aRequest));
+			break;
+
+		case EFsFileCreate:
+			TRAP(err, FsFileCreateL(aRequest));
+			break;
+
+		case EFsFileSize:
+			TRAP(err, FsFileSizeL(aRequest));
+			break;
+
+		case EFsFileSetSize:
+			TRAP(err, FsFileSetSizeL(aRequest));
+			break;
+
+		case EFsFileLock:
+			TRAP(err, FsFileLockL(aRequest));
+			break;
+
+		case EFsFileUnLock:
+			TRAP(err, FsFileUnLockL(aRequest));
+			break;
+
+		case EFsFileSeek:
+			TRAP(err, FsFileSeekL(aRequest));
+			break;
+
+		case EFsDirReadOne:
+			TRAP(err,FsDirReadOneL(aRequest));
+			break;
+
+		case EFsDirReadPacked:
+			TRAP(err,FsDirReadPackedL(aRequest));
+			break;
+
+		case EFsFileOpen:
+			TRAP(err, FsFileOpenL(aRequest));
+			break;
+
+		case EFsFileReplace:
+			TRAP(err, FsFileReplaceL(aRequest));
+			break;
+
+		case EFsReadFileSection:
+			TRAP(err, FsReadFileSectionL(aRequest));
+			break;
+
+		case EFsFileSubClose:
+			TRAP(err, FsFileSubCloseL(aRequest));
+			break;
+
+		case EFsDirOpen:
+			TRAP(err, FsDirOpenL(aRequest));
+			break;
+
+		case EFsFileTemp:
+			TRAP(err, FsFileTempL(aRequest));
+			break;
+
+		case EFsDelete:
+			TRAP(err, FsDeleteL(aRequest));
+			break;
+
+		case EFsReplace:
+			TRAP(err, FsReplaceL(aRequest));
+			break;
+
+		case EFsRename:
+			TRAP(err, FsRenameL(aRequest));
+			break;
+
+		case EFsEntry:
+			TRAP(err, FsEntryL(aRequest));
+			break;
+
+		case EFsSetEntry:
+			TRAP(err, FsSetEntryL(aRequest));
+			break;
+
+		default:
+			break;
+		}
+
+	return err;
+	}
+
+
+/**
+@internalComponent
+*/
+void CPreModifierPlugin::FsFileUnLockL(TFsPluginRequest& aRequest)
+	{
+	TInt length = 0;
+	TInt64 pos = 0;
+	TFileName filename;
+	TParse parse;
+
+	TInt err = aRequest.FileName(filename);
+	iLastError = err;
+	iLineNumber = __LINE__;
+	if(err!=KErrNone)
+		User::Leave(err); //trapped in DoRequestL
+
+	err = aRequest.Read(TFsPluginRequest::ELength, length);
+	iLastError = err;
+	iLineNumber = __LINE__;
+	if(err!=KErrNone)
+		User::Leave(err); //trapped in DoRequestL
+
+	err = aRequest.Read(TFsPluginRequest::EPosition, pos);
+	iLastError = err;
+	iLineNumber = __LINE__;
+	if(err!=KErrNone)
+		User::Leave(err); //trapped in DoRequestL
+	
+    parse.Set(filename, NULL, NULL);
+	//TPtrC extension(parse.Ext());
+
+	_LOG4(_L("CPreModifierPlugin::FsFileUnLockL, file: %S, pos: %d, length: %d"), &filename, pos, length);
+	
+	if (aRequest.IsPostOperation())
+		{
+		_LOG(_L("CPreModifierPlugin::FsFileUnLockL, post intercept"));
+		}
+	else
+		{
+			User::Invariant();
+		}
+	}
+
+/**
+@internalComponent
+*/
+void CPreModifierPlugin::FsFileLockL(TFsPluginRequest& aRequest)
+	{
+	TInt length = 0;
+	TInt64 pos = 0;
+	TFileName filename;
+	TParse parse;
+	
+	TInt err = aRequest.FileName(filename);
+	iLastError = err;
+	iLineNumber = __LINE__;
+	if(err!=KErrNone)
+		User::Leave(err); //trapped in DoRequestL
+
+	err = aRequest.Read(TFsPluginRequest::ELength, length);
+	iLastError = err;
+	iLineNumber = __LINE__;
+	if(err!=KErrNone)
+		User::Leave(err); //trapped in DoRequestL
+
+	err = aRequest.Read(TFsPluginRequest::EPosition, pos);
+	iLastError = err;
+	iLineNumber = __LINE__;
+	if(err!=KErrNone)
+		User::Leave(err); //trapped in DoRequestL
+
+    parse.Set(filename, NULL, NULL);
+	TPtrC extension(parse.Ext());
+
+	_LOG4(_L("CPreModifierPlugin::FsFileLockL, file: %S, pos: %d, length: %d"), &filename, pos, length);
+	
+	if (aRequest.IsPostOperation())
+		{
+		_LOG(_L("CPreModifierPlugin::FsFileLockL, post intercept"));
+
+		// Request read from post interception
+		if (extension.CompareF(_L(".lockread")) == 0)
+			{
+			length = 10;
+			HBufC8* tempBuf = HBufC8::NewMaxLC(length);
+			TPtr8 tempBufPtr((TUint8 *)tempBuf->Des().Ptr(), length, length);		
+			_LOG(_L("CPreModifierPlugin::FsFileLockL , calling AdoptFromClient in post intercept"));
+			RFilePlugin fileplugin(aRequest);
+			TInt err = fileplugin.AdoptFromClient();
+			iLastError = err;
+			iLineNumber = __LINE__;
+			if(err!=KErrNone)
+				User::Leave(err); //trapped in DoRequestL
+			
+			_LOG2(_L("CPreModifierPlugin::FsFileLockL, Adopt returned %d"), err);
+			
+			err = fileplugin.Read(pos, tempBufPtr, length); 
+			_LOG2(_L("CPreModifierPlugin::FsFileLockL, FileRead returned %d"), err);
+			iLastError = err;
+			iLineNumber = __LINE__;
+			if(err!=KErrNone)
+				User::Leave(err); //trapped in DoRequestL
+			fileplugin.Close();
+			CleanupStack::PopAndDestroy();						          
+			}
+
+		// Request close from post interception
+		if(extension.CompareF(_L(".lockclose")) == 0)
+			{		
+			_LOG(_L("CPreModifierPlugin::FsFileLockL, file = *.lockclose post intercept "));
+			RFilePlugin fileplugin(aRequest);
+		    TInt err = fileplugin.AdoptFromClient();
+			_LOG2(_L("CPreModifierPlugin::FsFileLockL ,Open %d"), err);
+			iLastError = err;
+			iLineNumber = __LINE__;
+			if(err!=KErrNone)
+				User::Leave(err); //trapped in DoRequestL		
+			fileplugin.Close();			
+			_LOG(_L("CPreModifierPlugin::FsFileLockL, Close"));
+			}
+
+		}
+	else
+		{
+			User::Invariant();
+		}
+	}
+
+/**
+@internalComponent
+*/
+void CPreModifierPlugin::FsFileSeekL(TFsPluginRequest& aRequest)
+	{
+	TFileName filename;
+	TParse parse;
+
+	TInt err = aRequest.FileName(filename);
+	iLastError = err;
+	iLineNumber = __LINE__;
+	if(err!=KErrNone)
+		User::Leave(err); //trapped in DoRequestL
+
+    parse.Set(filename, NULL, NULL);
+
+	_LOG2(_L("CPreModifierPlugin::FsFileSeekL, file: %S"), &filename);
+	
+	if (aRequest.IsPostOperation())
+		{
+		_LOG(_L("CPreModifierPlugin::FsFileSeekL, post intercept"));
+		}
+	else
+		{
+			User::Invariant();
+		}
+	}
+
+/**
+@internalComponent
+*/
+void CPreModifierPlugin::FsFileSizeL(TFsPluginRequest& aRequest)
+	{
+	TFileName filename;
+	TParse parse;
+
+	TInt err = aRequest.FileName(filename);
+	iLastError = err;
+	iLineNumber = __LINE__;
+	if(err!=KErrNone)
+		User::Leave(err); //trapped in DoRequestL
+
+    parse.Set(filename, NULL, NULL);
+
+	_LOG2(_L("CPreModifierPlugin::FsFileSizeL, file: %S"), &filename);
+	
+	if (aRequest.IsPostOperation())
+		{
+		_LOG(_L("CPreModifierPlugin::FsFileSizeL, post intercept"));
+		}
+	else
+		{
+			User::Invariant();
+		}
+	}
+
+/**
+@internalComponent
+*/
+void CPreModifierPlugin::FsFileSetSizeL(TFsPluginRequest& aRequest)
+	{
+	TFileName filename;
+	TParse parse;
+
+	TInt err = aRequest.FileName(filename);
+	iLastError = err;
+	iLineNumber = __LINE__;
+	if(err!=KErrNone)
+		User::Leave(err); //trapped in DoRequestL
+
+    parse.Set(filename, NULL, NULL);
+
+	_LOG2(_L("CPreModifierPlugin::FsFileSetSizeL, file: %S"), &filename);
+	
+	if (aRequest.IsPostOperation())
+		{
+		_LOG(_L("CPreModifierPlugin::FsFileSetSizeL, post intercept"));
+		}
+	else
+		{
+			User::Invariant();
+		}
+	}
+
+/**
+@internalComponent
+*/
+void CPreModifierPlugin::FsFileReadL(TFsPluginRequest& aRequest)
+	{
+	TInt length = 0;
+	TInt64 pos = 0;
+	TFileName filename;
+	TParse parse;
+
+	TInt err = aRequest.FileName(filename);
+	iLastError = err;
+	iLineNumber = __LINE__;
+	if(err!=KErrNone)
+		User::Leave(err); //trapped in DoRequestL
+
+	err = aRequest.Read(TFsPluginRequest::ELength, length);
+	iLastError = err;
+	iLineNumber = __LINE__;
+	if(err!=KErrNone)
+		User::Leave(err); //trapped in DoRequestL
+	
+	err = aRequest.Read(TFsPluginRequest::EPosition, pos);
+	iLastError = err;
+	iLineNumber = __LINE__;
+	if(err!=KErrNone)
+		User::Leave(err); //trapped in DoRequestL
+
+    parse.Set(filename, NULL, NULL);
+
+	_LOG4(_L("CPreModifierPlugin::FsFileReadL, file: %S, pos: %d, length: %d"), &filename, pos, length);
+	
+	if (aRequest.IsPostOperation())
+		{
+		_LOG(_L("CPreModifierPlugin::FsFileReadL, post intercept"));
+		}
+	else
+		{
+		User::Invariant();
+		}
+	}
+
+
+/**
+@internalComponent
+*/
+void CPreModifierPlugin::FsFileWriteL(TFsPluginRequest& aRequest)
+	{
+	TInt err = KErrNone;
+	TInt length = 0;
+	TInt64 pos = 0;
+	TFileName filename;
+	TParse parse;
+
+	TBuf<256> testfilename1;
+	TBuf<256> testfilename2;
+
+	//setting up test files
+	testfilename1.Append(iDriveToTest);
+	testfilename1.Append(_L(":\\Data\\test.txt"));
+
+	testfilename2.Append(iDriveToTest);
+	testfilename2.Append(_L(":\\Data\\createcreate3.txt"));
+
+	err = aRequest.FileName(filename);
+	iLastError = err;
+	iLineNumber = __LINE__;
+	if(err!=KErrNone)
+		User::Leave(err); //trapped in DoRequestL
+
+	err = aRequest.Read(TFsPluginRequest::ELength, length);
+	iLastError = err;
+	iLineNumber = __LINE__;
+	if(err!=KErrNone)
+		User::Leave(err); //trapped in DoRequestL
+	
+	err = aRequest.Read(TFsPluginRequest::EPosition, pos);
+	iLastError = err;
+	iLineNumber = __LINE__;
+	if(err!=KErrNone)
+		User::Leave(err); //trapped in DoRequestL
+
+    parse.Set(filename, NULL, NULL);
+
+	_LOG4(_L("CPreModifierPlugin::FsFileWriteL, file: %S, pos: %d, length: %d"), &filename, pos, length);
+	
+	if (aRequest.IsPostOperation())
+		{
+		_LOG(_L("CPreModifierPlugin::FsFileWriteL, post intercept"));
+		}
+	else
+		{
+			User::Invariant();
+		}
+	}
+
+
+
+/**
+@internalComponent
+*/
+void CPreModifierPlugin::FsFileRenameL(TFsPluginRequest& aRequest)
+	{
+	TFileName oldfilename, newfilename;
+	TParse parse;
+
+	oldfilename = aRequest.Src().FullName();
+	newfilename = aRequest.Dest().FullName();
+	
+    parse.Set(oldfilename, NULL, NULL);
+	TPtrC extension(parse.Ext());
+
+	_LOG3(_L("CPreModifierPlugin::FsFileRenameL, old name: %S, new name: %S"), &oldfilename, &newfilename);
+	
+	if (aRequest.IsPostOperation())
+		{
+		_LOG(_L("CPreModifierPlugin::FsFileRenameL, post intercept"));
+
+		if (extension.CompareF(_L(".tst")) == 0)
+			{
+			TBuf8<32> tempBuf = (_L8("Rename Post Intercept"));
+			RFilePlugin fileplugin(aRequest);
+			TInt err = fileplugin.AdoptFromClient();
+			iLastError = err;
+			iLineNumber = __LINE__;
+			if(err!=KErrNone)
+				User::Leave(err); //trapped in DoRequestL
+
+			err = fileplugin.Write(20, tempBuf);
+			_LOG2(_L("CPreModifierPlugin::FsFileRenameL, FileWrite returned %d"), err);
+			iLastError = err;
+			iLineNumber = __LINE__;
+			if(err!=KErrNone)
+				User::Leave(err); //trapped in DoRequestL
+			fileplugin.Close();
+			}
+		}
+	else
+		{
+			User::Invariant();
+		}
+	}
+
+
+void CPreModifierPlugin::FsFileCreateL(TFsPluginRequest& aRequest)
+	{
+	TFileName filename;
+	TParse parse;
+	
+	filename = aRequest.Src().FullName();
+
+	TUint mode;
+	TInt err = aRequest.Read(TFsPluginRequest::EMode, mode);
+	iLastError = err;
+	iLineNumber = __LINE__;
+	if(err!=KErrNone)
+		User::Leave(err); //trapped in DoRequestL
+
+    parse.Set(filename, NULL, NULL);
+	TPtrC extension(parse.Ext());
+
+	if (aRequest.IsPostOperation())
+		{
+		_LOG(_L("CPreModifierPlugin::FsFileCreateL, post intercept"));
+
+		if (extension.CompareF(_L(".tst")) == 0)
+			{			
+			RFilePlugin fileplugin(aRequest);
+			TInt err = fileplugin.AdoptFromClient();
+			iLastError = err;
+			iLineNumber = __LINE__;
+			if(err!=KErrNone)
+				User::Leave(err); //trapped in DoRequestL
+			
+			//write to the newly created file
+			TBuf8<64> wbuffer;
+			wbuffer.Copy(_L8("TestTestTest"));
+	    	err = fileplugin.Write(0, wbuffer);
+			_LOG2(_L("CPreModifierPlugin::FsFileCreateL, RFilePlugin::Write to the newly created file returned %d"), err);
+			iLastError = err;
+			iLineNumber = __LINE__;
+			if(err!=KErrNone)
+				User::Leave(err); //trapped in DoRequestL
+	
+			TInt length = wbuffer.Length();
+			HBufC8* tempBuf = HBufC8::NewMaxLC(length);
+			TPtr8 tempBufPtr((TUint8 *)tempBuf->Des().Ptr(), length, length);
+			err = fileplugin.Read(0, tempBufPtr);
+			_LOG2(_L("CPreModifierPlugin::FsFileCreateL, RFilePlugin::Read returned %d"), err);
+			iLastError = err;
+			iLineNumber = __LINE__;
+			if(err!=KErrNone)
+				User::Leave(err); //trapped in DoRequestL
+			//testing the correct thing has been written to the drive
+			err = wbuffer.Compare(tempBufPtr);
+			iLastError = err;
+			iLineNumber = __LINE__;
+			if(err!=KErrNone)
+				User::Leave(err); //trapped in DoRequestL
+	
+			fileplugin.Close();
+			CleanupStack::PopAndDestroy(); //tempBuf
+			}
+		}
+	else
+		{
+			User::Invariant();
+		}
+	}
+
+void CPreModifierPlugin::FsFileOpenL(TFsPluginRequest& aRequest)
+	{
+
+	TFileName filename;
+	TParse parse;
+	
+	filename = aRequest.Src().FullName();
+
+	TUint mode;
+	TInt err = aRequest.Read(TFsPluginRequest::EMode, mode);
+	iLastError = err;
+	iLineNumber = __LINE__;
+	if(err!=KErrNone)
+		User::Leave(err); //trapped in DoRequestL
+
+	parse.Set(filename, NULL, NULL);
+	TPtrC extension(parse.Ext());
+
+	_LOG2(_L("CPreModifierPlugin::FsFileOpenL, file: %S"), &filename);
+	
+	if (aRequest.IsPostOperation())
+		{
+		_LOG(_L("CPreModifierPlugin::FsFileOpenL, post intercept"));
+		if ((extension.CompareF(_L(".tst")) == 0) && (aRequest.Message().Int1() != 0) && (mode & EFileWrite))
+			{
+
+			RFilePlugin fileplugin(aRequest);
+			err = fileplugin.AdoptFromClient();
+			iLastError = err;
+			iLineNumber = __LINE__;
+			if(err!=KErrNone)
+				User::Leave(err); //trapped in DoRequestL
+
+			//write to the newly opened file
+			TBuf8<64> wbuffer;
+			wbuffer.Copy(_L8("TestTestTest"));
+			err = fileplugin.Write(0, wbuffer);
+			_LOG2(_L("CPreModifierPlugin::FsFileOpenL, RFilePlugin::Write to the newly opened file returned %d"), err);
+			iLastError = err;
+			iLineNumber = __LINE__;
+			if(err!=KErrNone)
+				User::Leave(err); //trapped in DoRequestL
+	
+			TInt length = wbuffer.Length();
+			HBufC8* tempBuf = HBufC8::NewMaxLC(length);
+			TPtr8 tempBufPtr((TUint8 *)tempBuf->Des().Ptr(), length, length);
+			err = fileplugin.Read(0, tempBufPtr);
+			_LOG2(_L("CPreModifierPlugin::FsFileOpenL, RFilePlugin::Read returned %d"), err);
+			iLastError = err;
+			iLineNumber = __LINE__;
+			if(err!=KErrNone)
+				User::Leave(err); //trapped in DoRequestL
+	
+			//testing the correct thing has been written to the drive
+			err = wbuffer.Compare(tempBufPtr);
+			iLastError = err;
+			iLineNumber = __LINE__;
+			if(err!=KErrNone)
+				User::Leave(err); //trapped in DoRequestL
+			
+			fileplugin.Close();
+
+			CleanupStack::PopAndDestroy(); //tempbuf
+			}
+		}
+	else
+		{
+			User::Invariant();
+		}
+	}
+
+
+void CPreModifierPlugin::FsFileTempL(TFsPluginRequest& aRequest)
+	{
+	TBuf<256> testfilename1;
+
+	//setting up test files
+	testfilename1.Append(iDriveToTest);
+	testfilename1.Append(_L(":\\Data\\"));
+
+	if (aRequest.IsPostOperation())
+		{
+		_LOG(_L("CPreModifierPlugin::FsFileTempL, post intercept"));
+
+		RFilePlugin fileplugin(aRequest);
+		TInt err = fileplugin.AdoptFromClient();
+		iLastError = err;
+		iLineNumber = __LINE__;
+		if(err!=KErrNone)
+			User::Leave(err); //trapped in DoRequestL
+		
+		//write to the newly created temp file
+		TBuf8<64> wbuffer;
+		wbuffer.Copy(_L8("TestTestTest"));
+		err = fileplugin.Write(0, wbuffer);
+		_LOG2(_L("CPreModifierPlugin::FsFileTempL, RFilePlugin::Write to the newly created temp file returned %d"), err);
+		iLastError = err;
+		iLineNumber = __LINE__;
+		if(err!=KErrNone)
+			User::Leave(err); //trapped in DoRequestL
+
+		TInt length = wbuffer.Length();
+		HBufC8* tempBuf = HBufC8::NewMaxLC(length);
+		TPtr8 tempBufPtr((TUint8 *)tempBuf->Des().Ptr(), length, length);
+		err = fileplugin.Read(0, tempBufPtr);
+		_LOG2(_L("CPreModifierPlugin::FsFileTempL, RFilePlugin::Read returned %d"), err);
+		iLastError = err;
+		iLineNumber = __LINE__;
+		if(err!=KErrNone)
+			User::Leave(err); //trapped in DoRequestL
+		
+		fileplugin.Close();
+
+		//testing the correct thing has been written to the drive
+		err = wbuffer.Compare(tempBufPtr);
+		iLastError = err;
+		iLineNumber = __LINE__;
+		if(err!=KErrNone)
+			User::Leave(err); //trapped in DoRequestL
+			
+		CleanupStack::PopAndDestroy();
+		}
+	else
+		{
+		User::Invariant();
+		}
+	}
+
+
+void CPreModifierPlugin::FsFileReplaceL(TFsPluginRequest& aRequest)
+	{
+	TFileName filename;
+	TParse parse;
+	
+	filename = aRequest.Src().FullName();
+
+	TUint mode;
+	TInt err = aRequest.Read(TFsPluginRequest::EMode, mode);
+	iLastError = err;
+	iLineNumber = __LINE__;
+	if(err!=KErrNone)
+		User::Leave(err); //trapped in DoRequestL
+
+	parse.Set(filename, NULL, NULL);
+	TPtrC extension(parse.Ext());
+
+	_LOG2(_L("CPreModifierPlugin::FsFileReplaceL, file: %S"), &filename);
+	
+	if (aRequest.IsPostOperation())
+		{
+		_LOG(_L("CPreModifierPlugin::FsFileReplaceL, post intercept"));
+		if ((extension.CompareF(_L(".tst")) == 0) && (aRequest.Message().Int1() != 0))
+			{
+			//write to the newly replaced file
+			TBuf8<64> wbuffer;
+			wbuffer.Copy(_L8("TestTestTest"));
+
+			RFilePlugin fileplugin(aRequest);
+			TInt err = fileplugin.AdoptFromClient();
+			iLastError = err;
+			iLineNumber = __LINE__;
+			if(err!=KErrNone)
+				User::Leave(err); //trapped in DoRequestL
+
+    		err = fileplugin.Write(0, wbuffer);
+			_LOG2(_L("CPreModifierPlugin::FsFileReplaceL, RFilePlugin::Write to the newly created file returned %d"), err);
+			iLastError = err;
+			iLineNumber = __LINE__;
+			if(err!=KErrNone)
+				User::Leave(err); //trapped in DoRequestL
+
+			TInt length = wbuffer.Length();
+			HBufC8* tempBuf = HBufC8::NewMaxLC(length);
+			TPtr8 tempBufPtr((TUint8 *)tempBuf->Des().Ptr(), length, length);
+			err = fileplugin.Read(0, tempBufPtr);
+			_LOG2(_L("CPreModifierPlugin::FsFileReplaceL, RFilePlugin::Read returned %d"), err);
+			iLastError = err;
+			iLineNumber = __LINE__;
+			if(err!=KErrNone)
+				User::Leave(err); //trapped in DoRe
+
+			//testing the correct thing has been written to the drive
+			err = wbuffer.Compare(tempBufPtr);
+			iLastError = err;
+			iLineNumber = __LINE__;
+			if(err!=KErrNone)
+				User::Leave(err); //trapped in DoRequestL
+			
+			fileplugin.Close();
+			CleanupStack::PopAndDestroy();
+			}
+		}
+	else
+		{
+		User::Invariant();
+		}
+	}
+
+
+
+void CPreModifierPlugin::FsReadFileSectionL(TFsPluginRequest& aRequest)
+	{
+	TInt err = KErrNone;
+	TInt length = 0;
+	TInt64 pos = 0;
+	TFileName filename;
+	TParse parse;
+	TBuf<256> testfilename1;
+
+	//setting up test files
+	testfilename1.Append(iDriveToTest);
+	testfilename1.Append(_L(":\\Data\\test.txt"));
+
+	filename = aRequest.Src().FullName();
+
+	err = aRequest.Read(TFsPluginRequest::ELength, length);
+	iLastError = err;
+	iLineNumber = __LINE__;
+	if(err!=KErrNone)
+		User::Leave(err); //trapped in DoRequestL
+	
+	err = aRequest.Read(TFsPluginRequest::EPosition, pos);
+	iLastError = err;
+	iLineNumber = __LINE__;
+	if(err!=KErrNone)
+		User::Leave(err); //trapped in DoRequestL
+
+    parse.Set(filename, NULL, NULL);
+
+	_LOG2(_L("CPreModifierPlugin::FsReadFileSectionL, file: %S"), &filename);
+	
+	if (aRequest.IsPostOperation())
+		{
+		_LOG(_L("CPreModifierPlugin::FsReadFileSectionL, post intercept - enter"));
+		RFilePlugin fileplugin2(aRequest,ETrue);
+		//open a second file
+		err = fileplugin2.Open(testfilename1, EFileWrite);
+		_LOG3(_L("CPreModifierPlugin::FsReadFileSectionL - RFilePlugin::Open for %S returned %d"), &testfilename1, err);
+		iLastError = err;
+		iLineNumber = __LINE__;
+		if(err!=KErrNone)
+			User::Leave(err); //trapped in DoRequestL
+								
+		TInt64 size=0;
+		err = fileplugin2.Size(size);
+		_LOG3(_L("CPreModifierPlugin::FsReadFileSectionL - RFilePlugin::Size for %S returned %d"), &testfilename1, err);
+		iLastError = err;
+		iLineNumber = __LINE__;
+		if(err!=KErrNone)
+			User::Leave(err); //trapped in DoRequestL
+
+		//close the second file
+		fileplugin2.Close();
+		_LOG(_L("CPreModifierPlugin::FsReadFileSectionL - post intercept - exit"));
+		}
+	else
+		{
+			User::Invariant();
+		}
+	}
+
+
+void CPreModifierPlugin::FsDeleteL(TFsPluginRequest& aRequest)
+	{
+	TInt err = KErrNone;
+	TFileName filename;
+
+	TBuf<256> testfilename1;
+
+	//setting up test files
+	testfilename1.Append(iDriveToTest);
+	testfilename1.Append(_L(":\\Data\\test.txt"));
+
+	filename = aRequest.Src().FullName();
+    	
+	if (aRequest.IsPostOperation())
+		{
+		_LOG(_L("CPreModifierPlugin::FsDeleteL, post intercept"));
+
+		RFilePlugin fileplugin2(aRequest);
+		//open a second file
+		err = fileplugin2.Open(testfilename1, EFileWrite);
+		_LOG3(_L("RFilePlugin::Open for %S returned %d"), &testfilename1, err);
+		iLastError = err;
+		iLineNumber = __LINE__;
+		if(err!=KErrNone)
+			User::Leave(err); //trapped in DoRequestL
+								
+		TInt64 size=0;
+		err = fileplugin2.Size(size);
+		iLastError = err;
+		iLineNumber = __LINE__;
+		if(err!=KErrNone)
+			User::Leave(err); //trapped in DoRequestL
+
+		//close the second file
+		fileplugin2.Close();
+		_LOG2(_L("CPreModifierPlugin::FsFileWriteL, RFilePlugin::Close to the second file returned %d"), err);
+		}
+	else
+		{
+		User::Invariant();
+		}
+	}
+
+
+void CPreModifierPlugin::FsReplaceL(TFsPluginRequest& aRequest)
+	{
+	TFileName oldfilename;
+	TFileName newfilename;
+
+	oldfilename = aRequest.Src().FullName();
+	newfilename = aRequest.Dest().FullName();
+
+	TBuf<256> testfilename1;
+
+	//setting up test files
+	testfilename1.Append(iDriveToTest);
+	testfilename1.Append(_L(":\\Data\\test.txt"));
+
+    	
+	if (aRequest.IsPostOperation())
+		{
+		//STF: Is this code going to get called - the pre-operation completes early?
+
+		_LOG(_L("CPreModifierPlugin::FsReplaceL, post intercept"));
+		//We should check that the name has changed here.
+		RFilePlugin file(aRequest);
+		TInt err = file.AdoptFromClient();
+		iLastError = err;
+		iLineNumber = __LINE__;
+		if(err!=KErrNone)
+			User::Leave(err); //trapped in DoRequestL
+
+		TInt compare = oldfilename.Compare(newfilename);
+		if(compare != 0) //is equal
+			{
+			//User::Leave(compare);
+			//It wont be equal as the name is coming from the request aint it.
+			//Pointless comparison then eh?
+			}
+
+		file.Close();
+
+		RFilePlugin fileplugin2(aRequest);
+		//open a second file
+		err = fileplugin2.Open(testfilename1, EFileWrite);
+		_LOG3(_L("RFilePlugin::Open for %S returned %d"), &testfilename1, err);
+		iLastError = err;
+		iLineNumber = __LINE__;
+		if(err!=KErrNone)
+			User::Leave(err); //trapped in DoRequestL
+								
+		TInt64 size=0;
+		err =fileplugin2.Size(size);
+		iLastError = err;
+		iLineNumber = __LINE__;
+		if(err!=KErrNone)
+			User::Leave(err); //trapped in DoRequestL
+
+		//close the second file
+		fileplugin2.Close();
+		_LOG2(_L("CPreModifierPlugin::FsFileWriteL, RFilePlugin::Close to the second file returned %d"), err);
+		}
+	else
+		{
+		User::Invariant();
+		}
+	}
+
+
+void CPreModifierPlugin::FsRenameL(TFsPluginRequest& aRequest)
+	{
+	TInt err = KErrNone;
+	TFileName oldfilename;
+	TFileName newfilename;
+
+	oldfilename = aRequest.Src().FullName();
+	newfilename = aRequest.Dest().FullName();
+
+	TBuf<256> testfilename1;
+
+	//setting up test files
+	testfilename1.Append(iDriveToTest);
+	testfilename1.Append(_L(":\\Data\\test.txt"));
+
+	if (aRequest.IsPostOperation())
+		{
+		_LOG(_L("CPreModifierPlugin::FsRenameL, post intercept"));
+		RFilePlugin fileplugin2(aRequest);
+		//open a second file
+		err = fileplugin2.Open(testfilename1, EFileWrite);
+		_LOG3(_L("RFilePlugin::Open for %S returned %d"), &testfilename1, err);
+		iLastError = err;
+		iLineNumber = __LINE__;
+		if(err!=KErrNone)
+			User::Leave(err); //trapped in DoRequestL
+								
+		TInt64 size=0;
+		err = fileplugin2.Size(size);
+		iLastError = err;
+		iLineNumber = __LINE__;
+		if(err!=KErrNone)
+			User::Leave(err); //trapped in DoRequestL		
+
+		//close the second file
+		fileplugin2.Close();
+		_LOG2(_L("CPreModifierPlugin::FsFileWriteL, RFilePlugin::Close to the second file returned %d"), err);
+		}
+	else
+		{
+		User::Invariant();
+		}
+	}
+
+void CPreModifierPlugin::FsEntryL(TFsPluginRequest& aRequest)
+	{
+	TInt err = KErrNone;
+	TFileName filename;
+
+	filename = aRequest.Src().FullName();
+
+	TBuf<256> testfilename1;
+
+	//setting up test files
+	testfilename1.Append(iDriveToTest);
+	testfilename1.Append(_L(":\\Data\\test.txt"));
+	    	
+	if (aRequest.IsPostOperation())
+		{
+		_LOG(_L("CPreModifierPlugin::FsEntryL, post intercept"));
+		RFilePlugin fileplugin2(aRequest);
+		//open a second file
+		err = fileplugin2.Open(testfilename1, EFileWrite);
+		_LOG3(_L("RFilePlugin::Open for %S returned %d"), &testfilename1, err);
+		iLastError = err;
+		iLineNumber = __LINE__;
+		if(err!=KErrNone)
+			User::Leave(err); //trapped in DoRequestL
+								
+		TInt64 size=0;
+		err = fileplugin2.Size(size);
+		iLastError = err;
+		iLineNumber = __LINE__;
+		if(err!=KErrNone)
+			User::Leave(err); //trapped in DoRequestL
+
+		//close the second file
+		fileplugin2.Close();
+		_LOG2(_L("CPreModifierPlugin::FsFileWriteL, RFilePlugin::Close to the second file returned %d"), err);
+		}
+	else
+		{
+		User::Invariant();
+		}
+	}
+
+
+
+void CPreModifierPlugin::FsSetEntryL(TFsPluginRequest& aRequest)
+	{
+	TInt err = KErrNone;
+	
+	TBuf<256> testfilename1;
+
+	//setting up test files
+	testfilename1.Append(iDriveToTest);
+	testfilename1.Append(_L(":\\Data\\test.txt"));
+		    	
+	if (aRequest.IsPostOperation())
+		{
+		_LOG(_L("CPreModifierPlugin::FsRenameL, post intercept"));
+		RFilePlugin fileplugin2(aRequest);
+		//open a second file
+		err = fileplugin2.Open(testfilename1, EFileWrite);
+		_LOG3(_L("RFilePlugin::Open for %S returned %d"), &testfilename1, err);
+		iLastError = err;
+		iLineNumber = __LINE__;
+		if(err!=KErrNone)
+			User::Leave(err); //trapped in DoRequestL
+								
+		TInt64 size=0;
+		err = fileplugin2.Size(size);
+		iLastError = err;
+		iLineNumber = __LINE__;
+		if(err!=KErrNone)
+			User::Leave(err); //trapped in DoRequestL
+
+		//close the second file
+		fileplugin2.Close();
+		_LOG2(_L("CPreModifierPlugin::FsFileWriteL, RFilePlugin::Close to the second file returned %d"), err);
+		}
+	else
+		{
+		User::Invariant();
+		}
+	}
+
+
+/**
+@internalComponent
+*/
+void CPreModifierPlugin::FsFileSubCloseL(TFsPluginRequest& aRequest)
+	{
+	if (aRequest.IsPostOperation())
+		{
+		_LOG(_L("CPreModifierPlugin::FsFileSubCloseL, post intercept"));
+		}
+	else
+		{
+		User::Invariant();
+		}
+	}
+
+/**
+@internalComponent
+*/
+void CPreModifierPlugin::FsDirOpenL(TFsPluginRequest& aRequest)
+	{
+	if (aRequest.IsPostOperation())
+		{
+		_LOG(_L("CPreModifierPlugin::FsDirOpenL, post intercept"));
+		}
+	else
+		{
+		User::Invariant();
+		}
+	}
+
+void CPreModifierPlugin::FsDirReadOneL(TFsPluginRequest& aRequest)
+	{
+
+	TFileName name;
+	TInt err = aRequest.FileName(name);
+	iLastError = err;
+	iLineNumber = __LINE__;
+	if(err!=KErrNone)
+		User::Leave(err); //trapped in DoRequestL
+	
+	if (aRequest.IsPostOperation())
+		{
+		_LOG(_L("CPreModifierPlugin::FsDirReadL, post intercept"));
+		}
+	else
+		{
+		User::Invariant();
+		}
+	}
+
+
+/**
+@internalComponent
+*/
+void CPreModifierPlugin::FsDirReadPackedL(TFsPluginRequest& aRequest)
+	{
+	if (aRequest.IsPostOperation())
+		{
+		_LOG(_L("CPreModifierPlugin::FsDirReadPackedL, post intercept"));
+		}
+	else
+		{
+		User::Invariant();
+		}
+	}
+
+
+CFsPluginConn* CPreModifierPlugin::NewPluginConnL()
+	{
+	return new(ELeave) CPreModifierPluginConn();
+	}
+
+//Asynchronous RPlugin::DoRequest
+void CPreModifierPlugin::FsPluginDoRequestL(CFsPluginConnRequest& aRequest)
+	{
+	FsPluginDoControlL(aRequest);
+	}
+
+//Synchronous RPlugin::DoControl
+TInt CPreModifierPlugin::FsPluginDoControlL(CFsPluginConnRequest& aRequest)
+	{
+	TInt err = KErrNone;
+
+	//We can use this to set the drive
+	//We can store this as a member of this class.
+	
+	TPckg<TInt> errCodeDes(iLastError);
+	TPckg<TInt> errMsgDes(iLineNumber);
+	
+	
+	TInt function = aRequest.Function();
+	switch(function)
+		{
+		case KPluginSetDrive:
+			{
+			TPckg<TChar> drive(iDriveToTest);
+			TRAP(err,aRequest.ReadParam1L(drive));
+			break;
+			}
+		case KPluginGetError:
+			{
+			TRAP(err,aRequest.WriteParam1L(errCodeDes));
+			TRAP(err,aRequest.WriteParam2L(errMsgDes));
+			break;
+			}
+		default:
+			break;
+		}
+
+	return err;
+	}
+
+TInt CPreModifierPluginConn::DoControl(CFsPluginConnRequest& aRequest)
+	{
+	return ((CPreModifierPlugin*)Plugin())->FsPluginDoControlL(aRequest);
+	}
+
+void CPreModifierPluginConn::DoRequest(CFsPluginConnRequest& aRequest)
+	{
+	DoControl(aRequest);
+	}
+
+void CPreModifierPluginConn::DoCancel(TInt /*aReqMask*/)
+	{
+	}
+
+//factory functions
+
+class CPreModifierPluginFactory : public CFsPluginFactory
+	{
+public:
+	CPreModifierPluginFactory();
+	virtual TInt Install();
+	virtual CFsPlugin* NewPluginL();
+	virtual CFsPlugin* NewPluginConnL();
+	virtual TInt UniquePosition();
+	};
+
+/**
+Constructor for the plugin factory
+@internalComponent
+*/
+CPreModifierPluginFactory::CPreModifierPluginFactory()
+	{
+	}
+
+/**
+Install function for the plugin factory
+@internalComponent
+*/
+TInt CPreModifierPluginFactory::Install()
+	{
+	SetSupportedDrives(KPluginSupportAllDrives);
+	//iSupportedDrives = 1<<23;
+	return(SetName(&KPreModifierPluginName));
+	}
+
+/**
+@internalComponent
+*/
+TInt CPreModifierPluginFactory::UniquePosition()
+	{
+	return(KPreModifierPos);
+	}
+
+/**
+Plugin factory function
+@internalComponent
+*/
+CFsPlugin* CPreModifierPluginFactory::NewPluginL()
+
+	{
+	return CPreModifierPlugin::NewL();
+	}
+
+/**
+Plugin factory function
+@internalComponent
+*/
+CFsPlugin* CPreModifierPluginFactory::NewPluginConnL()
+
+	{
+	return CPreModifierPlugin::NewL();
+	}
+
+/**
+Create a new Plugin
+@internalComponent
+*/
+extern "C" {
+
+EXPORT_C CFsPluginFactory* CreateFileSystem()
+	{
+	return(new CPreModifierPluginFactory());
+	}
+}
+