diff -r 000000000000 -r bde4ae8d615e os/kernelhwsrv/kerneltest/f32test/plugins/version_2/src/premodifier_plugin.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/os/kernelhwsrv/kerneltest/f32test/plugins/version_2/src/premodifier_plugin.cpp Fri Jun 15 03:10:57 2012 +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::FsDeleteL, 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("CPreModifierPlugin::FsReplaceL, 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::FsReplaceL, 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("CPreModifierPlugin::FsRenameL, 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::FsRenameL, 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("CPreModifierPlugin::FsEntryL, 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::FsEntryL, 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::FsSetEntryL, post intercept")); + RFilePlugin fileplugin2(aRequest); + //open a second file + err = fileplugin2.Open(testfilename1, EFileWrite); + _LOG3(_L("CPreModifierPlugin::FsSetEntryL, 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::FsSetEntryL, 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::FsDirReadOneL, 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 errCodeDes(iLastError); + TPckg errMsgDes(iLineNumber); + + + TInt function = aRequest.Function(); + switch(function) + { + case KPluginSetDrive: + { + TPckg 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()); + } +} +