sl@0: // Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of the License "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // sl@0: sl@0: #include "modifier_plugin.h" sl@0: #include "plugincommon.h" sl@0: #include sl@0: sl@0: /** sl@0: Leaving New function for the plugin sl@0: @internalComponent sl@0: */ sl@0: CModifierPlugin* CModifierPlugin::NewL() sl@0: { sl@0: CModifierPlugin* self = new(ELeave) CModifierPlugin; sl@0: CleanupStack::PushL(self); sl@0: self->ConstructL(); sl@0: CleanupStack::Pop(); sl@0: return self; sl@0: } sl@0: sl@0: sl@0: /** sl@0: Constructor for the plugin sl@0: @internalComponent sl@0: */ sl@0: CModifierPlugin::CModifierPlugin() : iInterceptsEnabled(EFalse), sl@0: iLogging(ETrue) sl@0: { sl@0: } sl@0: sl@0: sl@0: void CModifierPlugin::ConstructL() sl@0: { sl@0: } sl@0: sl@0: /** sl@0: The destructor for the plugin sl@0: @internalComponent sl@0: */ sl@0: CModifierPlugin::~CModifierPlugin() sl@0: { sl@0: } sl@0: sl@0: /** sl@0: Initialise the plugin. sl@0: @internalComponent sl@0: */ sl@0: void CModifierPlugin::InitialiseL() sl@0: { sl@0: EnableInterceptsL(); sl@0: } sl@0: sl@0: /** sl@0: Enable the plugin's intercepts. sl@0: @internalComponent sl@0: */ sl@0: void CModifierPlugin::EnableInterceptsL() sl@0: { sl@0: if (iInterceptsEnabled) return; sl@0: sl@0: User::LeaveIfError(RegisterIntercept(EFsFileRead, EPreIntercept)); sl@0: User::LeaveIfError(RegisterIntercept(EFsFileWrite, EPreIntercept)); sl@0: User::LeaveIfError(RegisterIntercept(EFsFileRename, EPreIntercept)); sl@0: User::LeaveIfError(RegisterIntercept(EFsFileCreate, EPreIntercept)); sl@0: User::LeaveIfError(RegisterIntercept(EFsFileSize, EPreIntercept)); sl@0: User::LeaveIfError(RegisterIntercept(EFsFileSetSize, EPreIntercept)); sl@0: User::LeaveIfError(RegisterIntercept(EFsFileLock, EPreIntercept)); sl@0: User::LeaveIfError(RegisterIntercept(EFsFileUnLock, EPreIntercept)); sl@0: User::LeaveIfError(RegisterIntercept(EFsFileOpen, EPreIntercept)); sl@0: User::LeaveIfError(RegisterIntercept(EFsFileReplace, EPreIntercept)); sl@0: User::LeaveIfError(RegisterIntercept(EFsReadFileSection, EPreIntercept)); sl@0: User::LeaveIfError(RegisterIntercept(EFsDirReadOne, EPreIntercept)); sl@0: User::LeaveIfError(RegisterIntercept(EFsDirReadPacked, EPreIntercept)); sl@0: User::LeaveIfError(RegisterIntercept(EFsFileSubClose, EPreIntercept)); sl@0: User::LeaveIfError(RegisterIntercept(EFsDirOpen, EPreIntercept)); sl@0: User::LeaveIfError(RegisterIntercept(EFsFileTemp, EPreIntercept)); sl@0: User::LeaveIfError(RegisterIntercept(EFsDelete, EPreIntercept)); sl@0: User::LeaveIfError(RegisterIntercept(EFsReplace, EPreIntercept)); sl@0: User::LeaveIfError(RegisterIntercept(EFsRename, EPreIntercept)); sl@0: User::LeaveIfError(RegisterIntercept(EFsEntry, EPreIntercept)); sl@0: User::LeaveIfError(RegisterIntercept(EFsSetEntry, EPreIntercept)); sl@0: User::LeaveIfError(RegisterIntercept(EFsFileSeek, EPreIntercept)); sl@0: User::LeaveIfError(RegisterIntercept(EFsPluginDoControl, EPreIntercept)); sl@0: User::LeaveIfError(RegisterIntercept(EFsPluginDoRequest, EPreIntercept)); sl@0: User::LeaveIfError(RegisterIntercept(EFsVolume, EPreIntercept)); sl@0: sl@0: sl@0: _LOG(_L("Modifier Plugin: Enabled intercepts.")); sl@0: sl@0: iInterceptsEnabled = ETrue; sl@0: } sl@0: sl@0: /** sl@0: Disable the plugin's intercepts. sl@0: @internalComponent sl@0: */ sl@0: void CModifierPlugin::DisableInterceptsL() sl@0: { sl@0: if (!iInterceptsEnabled) return; sl@0: sl@0: User::LeaveIfError(UnregisterIntercept(EFsFileRead, EPreIntercept)); sl@0: User::LeaveIfError(UnregisterIntercept(EFsFileWrite, EPreIntercept)); sl@0: User::LeaveIfError(UnregisterIntercept(EFsFileRename, EPreIntercept)); sl@0: User::LeaveIfError(UnregisterIntercept(EFsFileCreate, EPreIntercept)); sl@0: User::LeaveIfError(UnregisterIntercept(EFsFileSize, EPreIntercept)); sl@0: User::LeaveIfError(UnregisterIntercept(EFsFileSetSize, EPreIntercept)); sl@0: User::LeaveIfError(UnregisterIntercept(EFsFileLock, EPreIntercept)); sl@0: User::LeaveIfError(UnregisterIntercept(EFsFileUnLock, EPreIntercept)); sl@0: User::LeaveIfError(UnregisterIntercept(EFsFileOpen, EPreIntercept)); sl@0: User::LeaveIfError(UnregisterIntercept(EFsFileReplace, EPreIntercept)); sl@0: User::LeaveIfError(UnregisterIntercept(EFsReadFileSection, EPreIntercept)); sl@0: User::LeaveIfError(UnregisterIntercept(EFsDirReadOne, EPreIntercept)); sl@0: User::LeaveIfError(UnregisterIntercept(EFsDirReadPacked, EPreIntercept)); sl@0: User::LeaveIfError(UnregisterIntercept(EFsFileSubClose, EPreIntercept)); sl@0: User::LeaveIfError(UnregisterIntercept(EFsDirOpen, EPreIntercept)); sl@0: User::LeaveIfError(UnregisterIntercept(EFsFileTemp, EPreIntercept)); sl@0: User::LeaveIfError(UnregisterIntercept(EFsDelete, EPreIntercept)); sl@0: User::LeaveIfError(UnregisterIntercept(EFsReplace, EPreIntercept)); sl@0: User::LeaveIfError(UnregisterIntercept(EFsRename, EPreIntercept)); sl@0: User::LeaveIfError(UnregisterIntercept(EFsEntry, EPreIntercept)); sl@0: User::LeaveIfError(UnregisterIntercept(EFsSetEntry, EPreIntercept)); sl@0: User::LeaveIfError(UnregisterIntercept(EFsFileSeek, EPreIntercept)); sl@0: User::LeaveIfError(UnregisterIntercept(EFsVolume, EPreIntercept)); sl@0: sl@0: _LOG(_L("Modifier Plugin: Disabled intercepts.")); sl@0: sl@0: iInterceptsEnabled = EFalse; sl@0: } sl@0: sl@0: /** sl@0: Handle requests sl@0: @internalComponent sl@0: */ sl@0: TInt CModifierPlugin::DoRequestL(TFsPluginRequest& aRequest) sl@0: { sl@0: iLastError = KErrNone; sl@0: iLineNumber = __LINE__; sl@0: sl@0: TInt err = KErrNone; sl@0: sl@0: TInt function = aRequest.Function(); sl@0: sl@0: if(aRequest.IsPostOperation()) sl@0: { sl@0: _LOG2(_L("CModifierPlugin::DoRequestL for Function %d in Post-Interception"),function); sl@0: } sl@0: else sl@0: { sl@0: _LOG2(_L("CModifierPlugin::DoRequestL for Function %d in Pre-Interception"),function); sl@0: } sl@0: sl@0: switch(function) sl@0: { sl@0: case EFsFileRead: sl@0: TRAP(err, FsFileReadL(aRequest)); sl@0: break; sl@0: sl@0: case EFsFileWrite: sl@0: TRAP(err, FsFileWriteL(aRequest)); sl@0: break; sl@0: sl@0: case EFsFileRename: sl@0: TRAP(err, FsFileRenameL(aRequest)); sl@0: break; sl@0: sl@0: case EFsFileCreate: sl@0: TRAP(err, FsFileCreateL(aRequest)); sl@0: break; sl@0: sl@0: case EFsFileSize: sl@0: TRAP(err, FsFileSizeL(aRequest)); sl@0: break; sl@0: sl@0: case EFsFileSetSize: sl@0: TRAP(err, FsFileSetSizeL(aRequest)); sl@0: break; sl@0: sl@0: case EFsFileLock: sl@0: TRAP(err, FsFileLockL(aRequest)); sl@0: break; sl@0: sl@0: case EFsFileUnLock: sl@0: TRAP(err, FsFileUnLockL(aRequest)); sl@0: break; sl@0: sl@0: case EFsFileSeek: sl@0: TRAP(err, FsFileSeekL(aRequest)); sl@0: break; sl@0: sl@0: case EFsDirReadOne: sl@0: TRAP(err,FsDirReadOneL(aRequest)); sl@0: break; sl@0: sl@0: case EFsDirReadPacked: sl@0: TRAP(err,FsDirReadPackedL(aRequest)); sl@0: break; sl@0: sl@0: case EFsFileOpen: sl@0: TRAP(err, FsFileOpenL(aRequest)); sl@0: break; sl@0: sl@0: case EFsFileReplace: sl@0: TRAP(err, FsFileReplaceL(aRequest)); sl@0: break; sl@0: sl@0: case EFsReadFileSection: sl@0: TRAP(err, FsReadFileSectionL(aRequest)); sl@0: break; sl@0: sl@0: case EFsFileSubClose: sl@0: TRAP(err, FsFileSubCloseL(aRequest)); sl@0: break; sl@0: sl@0: case EFsDirOpen: sl@0: TRAP(err, FsDirOpenL(aRequest)); sl@0: break; sl@0: sl@0: case EFsFileTemp: sl@0: TRAP(err, FsFileTempL(aRequest)); sl@0: break; sl@0: sl@0: case EFsDelete: sl@0: TRAP(err, FsDeleteL(aRequest)); sl@0: break; sl@0: sl@0: case EFsReplace: sl@0: TRAP(err, FsReplaceL(aRequest)); sl@0: break; sl@0: sl@0: case EFsRename: sl@0: TRAP(err, FsRenameL(aRequest)); sl@0: break; sl@0: sl@0: case EFsEntry: sl@0: TRAP(err, FsEntryL(aRequest)); sl@0: break; sl@0: sl@0: case EFsSetEntry: sl@0: TRAP(err, FsSetEntryL(aRequest)); sl@0: break; sl@0: sl@0: case EFsVolume: sl@0: TRAP(err, FsVolumeL(aRequest)); sl@0: break; sl@0: sl@0: default: sl@0: break; sl@0: } sl@0: sl@0: return err; sl@0: } sl@0: sl@0: sl@0: /** sl@0: @internalComponent sl@0: */ sl@0: void CModifierPlugin::FsFileUnLockL(TFsPluginRequest& aRequest) sl@0: { sl@0: TInt length = 0; sl@0: TInt64 pos = 0; sl@0: TFileName filename; sl@0: TParse parse; sl@0: sl@0: TInt err = aRequest.FileName(filename); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: err = aRequest.Read(TFsPluginRequest::ELength, length); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: err = aRequest.Read(TFsPluginRequest::EPosition, pos); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: parse.Set(filename, NULL, NULL); sl@0: TPtrC extension(parse.Ext()); sl@0: sl@0: _LOG4(_L("CModifierPlugin::FsFileUnLockL, file: %S, pos: %d, length: %d"), &filename, pos, length); sl@0: sl@0: if (aRequest.IsPostOperation()) sl@0: { sl@0: _LOG(_L("CModifierPlugin::FsFileUnLockL, post intercept")); sl@0: } sl@0: else sl@0: { sl@0: _LOG(_L("CModifierPlugin::FsFileUnLockL, pre intercept")); sl@0: if(extension.CompareF(_L(".unlock")) == 0) sl@0: { sl@0: RFilePlugin fileplugin(aRequest); sl@0: err = fileplugin.AdoptFromClient(); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: err = fileplugin.UnLock(pos, length); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: fileplugin.Close(); sl@0: sl@0: User::Leave(KErrCompletion); sl@0: } sl@0: } sl@0: } sl@0: sl@0: /** sl@0: @internalComponent sl@0: */ sl@0: void CModifierPlugin::FsFileLockL(TFsPluginRequest& aRequest) sl@0: { sl@0: TInt length = 0; sl@0: TInt64 pos = 0; sl@0: TFileName filename; sl@0: TParse parse; sl@0: sl@0: TInt err = aRequest.FileName(filename); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: err = aRequest.Read(TFsPluginRequest::ELength, length); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: err = aRequest.Read(TFsPluginRequest::EPosition, pos); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: parse.Set(filename, NULL, NULL); sl@0: TPtrC extension(parse.Ext()); sl@0: sl@0: _LOG4(_L("CModifierPlugin::FsFileLockL, file: %S, pos: %d, length: %d"), &filename, pos, length); sl@0: sl@0: if (aRequest.IsPostOperation()) sl@0: { sl@0: _LOG(_L("CModifierPlugin::FsFileLockL, post intercept")); sl@0: sl@0: // Request read from post interception sl@0: if (extension.CompareF(_L(".lockread")) == 0) sl@0: { sl@0: length = 10; sl@0: HBufC8* tempBuf = HBufC8::NewMaxLC(length); sl@0: TPtr8 tempBufPtr((TUint8 *)tempBuf->Des().Ptr(), length, length); sl@0: _LOG(_L("CModifierPlugin::FsFileLockL , calling FileRead in post intercept")); sl@0: RFilePlugin fileplugin(aRequest); sl@0: TInt err = fileplugin.AdoptFromClient(); sl@0: _LOG2(_L("CModifierPlugin::FsFileLockL, Adopt returned %d"), err); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: err = fileplugin.Read(pos, tempBufPtr, length); sl@0: _LOG2(_L("CModifierPlugin::FsFileLockL, FileRead returned %d"), err); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: fileplugin.Close(); sl@0: CleanupStack::PopAndDestroy(); sl@0: } sl@0: sl@0: // Request close from post interception sl@0: if(extension.CompareF(_L(".lockclose")) == 0) sl@0: { sl@0: _LOG(_L("CModifierPlugin::FsFileLockL, calling Close in post intercept ")); sl@0: sl@0: RFilePlugin fileplugin(aRequest); sl@0: TInt err = fileplugin.AdoptFromClient(); sl@0: _LOG2(_L("CModifierPlugin::FsFileLockL ,Open %d"), err); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: fileplugin.Close(); sl@0: _LOG(_L("CModifierPlugin::FsFileLockL, Close")); sl@0: //Try to close twice? sl@0: fileplugin.Close(); sl@0: _LOG(_L("CModifierPlugin::FsFileLockL, Close")); sl@0: } sl@0: sl@0: } sl@0: else sl@0: { sl@0: _LOG(_L("CModifierPlugin::FsFileLockL, pre intercept")); sl@0: if((extension.CompareF(_L(".lock")) == 0) sl@0: || (extension.CompareF(_L(".lockclose")) == 0) sl@0: || (extension.CompareF(_L(".lockread")) == 0) ) sl@0: { sl@0: RFilePlugin fileplugin(aRequest); sl@0: TInt err = fileplugin.AdoptFromClient(); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: err = fileplugin.Lock(0,2); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: fileplugin.Close(); sl@0: sl@0: User::Leave(KErrCompletion); sl@0: } sl@0: } sl@0: } sl@0: sl@0: /** sl@0: @internalComponent sl@0: */ sl@0: void CModifierPlugin::FsFileSeekL(TFsPluginRequest& aRequest) sl@0: { sl@0: TFileName filename; sl@0: TParse parse; sl@0: sl@0: TInt err = aRequest.FileName(filename); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: parse.Set(filename, NULL, NULL); sl@0: TPtrC extension(parse.Ext()); sl@0: sl@0: _LOG2(_L("CModifierPlugin::FsFileSeekL, file: %S"), &filename); sl@0: sl@0: if (aRequest.IsPostOperation()) sl@0: { sl@0: _LOG(_L("CModifierPlugin::FsFileSeekL, post intercept")); sl@0: } sl@0: else sl@0: { sl@0: _LOG(_L("CModifierPlugin::FsFileSeekL, pre intercept")); sl@0: if(extension.CompareF(_L(".seek")) == 0) sl@0: { sl@0: RFilePlugin fileplugin(aRequest); sl@0: TInt err = fileplugin.AdoptFromClient(); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: TInt64 pos; sl@0: TSeek mode; sl@0: err = aRequest.Read(TFsPluginRequest::EPosition, pos); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: err = aRequest.Read(TFsPluginRequest::EMode, (TUint&)mode); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: err = fileplugin.Seek(mode,pos); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: //STF: When we add TInt64 write, should also add TInt write also... sl@0: TPtrC8 p((TUint8*)&pos,sizeof(TInt)); sl@0: err = aRequest.Write(TFsPluginRequest::ENewPosition, p); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: fileplugin.Close(); sl@0: } sl@0: } sl@0: } sl@0: sl@0: /** sl@0: @internalComponent sl@0: */ sl@0: void CModifierPlugin::FsFileSizeL(TFsPluginRequest& aRequest) sl@0: { sl@0: TFileName filename; sl@0: TParse parse; sl@0: sl@0: TInt err = aRequest.FileName(filename); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: parse.Set(filename, NULL, NULL); sl@0: TPtrC extension(parse.Ext()); sl@0: sl@0: _LOG2(_L("CModifierPlugin::FsFileSizeL, file: %S"), &filename); sl@0: sl@0: if (aRequest.IsPostOperation()) sl@0: { sl@0: _LOG(_L("CModifierPlugin::FsFileSizeL, post intercept")); sl@0: } sl@0: else sl@0: { sl@0: _LOG(_L("CModifierPlugin::FsFileSizeL, pre intercept")); sl@0: if(extension.CompareF(_L(".size")) == 0) sl@0: { sl@0: _LOG(_L("CModifierPlugin::FsFileSizeL")); sl@0: sl@0: RFilePlugin fileplugin(aRequest); sl@0: TInt err = fileplugin.AdoptFromClient(); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: TInt64 size=0; sl@0: err = fileplugin.Size(size); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: TInt sizeLow = I64LOW(size); //STF: Need 64-bit write for size? sl@0: TPckgBuf sizeBuf(sizeLow); sl@0: err = aRequest.Write(TFsPluginRequest::ESize, sizeBuf); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: fileplugin.Close(); sl@0: sl@0: // request processed by plug-in sl@0: User::Leave(KErrCompletion); sl@0: } sl@0: } sl@0: } sl@0: sl@0: /** sl@0: @internalComponent sl@0: */ sl@0: void CModifierPlugin::FsFileSetSizeL(TFsPluginRequest& aRequest) sl@0: { sl@0: TFileName filename; sl@0: TParse parse; sl@0: sl@0: TInt err = aRequest.FileName(filename); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: parse.Set(filename, NULL, NULL); sl@0: sl@0: _LOG2(_L("CModifierPlugin::FsFileSetSizeL, file: %S"), &filename); sl@0: sl@0: if (aRequest.IsPostOperation()) sl@0: { sl@0: _LOG(_L("CModifierPlugin::FsFileSetSizeL, post intercept")); sl@0: } sl@0: else sl@0: { sl@0: RFilePlugin fileplugin(aRequest); sl@0: TInt err = fileplugin.AdoptFromClient(); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: _LOG(_L("CModifierPlugin::FsFileSetSizeL, pre intercept")); sl@0: sl@0: TInt size = 0; sl@0: err = aRequest.Read(TFsPluginRequest::ESize, size); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: err = fileplugin.SetSize(size); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: fileplugin.Close(); sl@0: sl@0: // request processed by plug-in sl@0: User::Leave(KErrCompletion); sl@0: } sl@0: } sl@0: sl@0: /** sl@0: @internalComponent sl@0: */ sl@0: void CModifierPlugin::FsFileReadL(TFsPluginRequest& aRequest) sl@0: { sl@0: TInt length = 0; sl@0: TInt64 pos = 0; sl@0: TFileName filename; sl@0: TParse parse; sl@0: sl@0: TInt err = aRequest.FileName(filename); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: err = aRequest.Read(TFsPluginRequest::ELength, length); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: err = aRequest.Read(TFsPluginRequest::EPosition, pos); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: parse.Set(filename, NULL, NULL); sl@0: TPtrC extension(parse.Ext()); sl@0: sl@0: _LOG4(_L("CModifierPlugin::FsFileReadL, file: %S, pos: %d, length: %d"), &filename, pos, length); sl@0: sl@0: if (aRequest.IsPostOperation()) sl@0: { sl@0: _LOG(_L("CModifierPlugin::FsFileReadL, post intercept")); sl@0: } sl@0: else sl@0: { sl@0: _LOG(_L("CModifierPlugin::FsFileReadL, pre intercept")); sl@0: if (extension.CompareF(_L(".tst")) == 0) sl@0: { sl@0: sl@0: HBufC8* tempBuf = HBufC8::NewMaxLC(length); sl@0: TPtr8 tempBufPtr((TUint8 *)tempBuf->Des().Ptr(), length, length); sl@0: sl@0: _LOG(_L("CModifierPlugin::FsFileReadL, calling FileRead")); sl@0: sl@0: RFilePlugin fileplugin(aRequest); sl@0: TInt err = fileplugin.AdoptFromClient(); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: err = fileplugin.Read(pos, tempBufPtr, length); sl@0: _LOG2(_L("CModifierPlugin::FsFileReadL, FileRead returned %d"), err); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: err = aRequest.Write(TFsPluginRequest::EData, tempBufPtr); sl@0: _LOG2(_L("CModifierPlugin::FsFileReadL, ClientWrite returned %d"), err); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: fileplugin.Close(); sl@0: sl@0: CleanupStack::PopAndDestroy(); //tempBuf sl@0: sl@0: // request processed by plug-in sl@0: User::Leave(KErrCompletion); sl@0: } sl@0: sl@0: // Intercepting a Read(has handle) and performing a ReadFileSection (lacks handle) instead sl@0: if (extension.CompareF(_L(".readfile")) == 0) sl@0: { sl@0: HBufC8* tempBuf = HBufC8::NewMaxLC(length); sl@0: TPtr8 tempBufPtr((TUint8 *)tempBuf->Des().Ptr(), length, length); sl@0: sl@0: _LOG(_L("CModifierPlugin::FileRead, calling FsReadFileSection ")); sl@0: sl@0: RFsPlugin fsplugin(aRequest); sl@0: TInt err = fsplugin.Connect(); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: err = fsplugin.ReadFileSection(filename, pos, tempBufPtr, length); sl@0: _LOG2(_L("CModifierPlugin::FileRead, FileRead returned %d"), err); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: sl@0: err = aRequest.Write(TFsPluginRequest::EData, tempBufPtr); sl@0: _LOG2(_L("CModifierPlugin::FileRead, ClientWrite returned %d"), err); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: fsplugin.Close(); sl@0: CleanupStack::PopAndDestroy(); sl@0: sl@0: // request processed by plug-in sl@0: User::Leave(KErrCompletion); sl@0: } sl@0: sl@0: } sl@0: } sl@0: sl@0: sl@0: /** sl@0: @internalComponent sl@0: */ sl@0: void CModifierPlugin::FsFileWriteL(TFsPluginRequest& aRequest) sl@0: { sl@0: TInt length = 0; sl@0: TInt64 pos = 0; sl@0: TFileName filename; sl@0: TParse parse; sl@0: sl@0: TBuf<256> testfilename1; sl@0: TBuf<256> testfilename2; sl@0: sl@0: //setting up test files sl@0: testfilename1.Append(iDriveToTest); sl@0: testfilename1.Append(_L(":\\Data\\test.txt")); sl@0: sl@0: testfilename2.Append(iDriveToTest); sl@0: testfilename2.Append(_L(":\\Data\\createcreate3.txt")); sl@0: sl@0: TInt err = aRequest.FileName(filename); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: err = aRequest.Read(TFsPluginRequest::ELength, length); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: err = aRequest.Read(TFsPluginRequest::EPosition, pos); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: parse.Set(filename, NULL, NULL); sl@0: TPtrC extension(parse.Ext()); sl@0: sl@0: _LOG4(_L("CModifierPlugin::FsFileWriteL, file: %S, pos: %d, length: %d"), &filename, pos, length); sl@0: sl@0: if (aRequest.IsPostOperation()) sl@0: { sl@0: _LOG(_L("CModifierPlugin::FsFileWriteL, post intercept")); sl@0: } sl@0: else sl@0: { sl@0: _LOG(_L("CModifierPlugin::FsFileWriteL, pre intercept")); sl@0: sl@0: if (extension.CompareF(_L(".tst")) == 0) sl@0: { sl@0: HBufC8* tempBuf = HBufC8::NewMaxLC(length); sl@0: TPtr8 tempBufPtr((TUint8 *)tempBuf->Des().Ptr(), length, length); sl@0: sl@0: TInt err = aRequest.Read(TFsPluginRequest::EData, tempBufPtr); sl@0: _LOG2(_L("CModifierPlugin::FsFileWriteL, ClientRead returned %d"), err); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: RFilePlugin fileplugin(aRequest); sl@0: err = fileplugin.AdoptFromClient(); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: //Test Lock sl@0: err = fileplugin.Lock(0,2); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: err = fileplugin.UnLock(0,2); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: //End test lock sl@0: sl@0: err = fileplugin.Write(pos, tempBufPtr); sl@0: _LOG2(_L("CModifierPlugin::FsFileWriteL, RFilePlugin::Write returned %d"), err); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: //Test sending multiple plugin requests using the RFilePlugin class sl@0: HBufC8* tempBuf2 = HBufC8::NewMaxLC(length); sl@0: TPtr8 tempBufPtr2((TUint8 *)tempBuf2->Des().Ptr(), length, length); sl@0: err = fileplugin.Read(pos, tempBufPtr2); sl@0: _LOG2(_L("CModifierPlugin::FsFileWriteL, RFilePlugin::Read returned %d"), err); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: //testing the correct thing has been written to the drive sl@0: err = tempBufPtr.Compare(tempBufPtr2); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: RFilePlugin fileplugin2(aRequest); sl@0: sl@0: //open a second file sl@0: sl@0: err = fileplugin2.Open(testfilename1, EFileWrite); sl@0: _LOG3(_L("CModifierPlugin::FsFileWriteL, RFilePlugin::Open for %S returned %d"), &testfilename1, err); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: sl@0: //write to the second file sl@0: err = fileplugin2.Write(pos, tempBufPtr2); sl@0: _LOG2(_L("CModifierPlugin::FsFileWriteL, RFilePlugin::Write to the second file returned %d"), err); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: //close the second file sl@0: fileplugin2.Close(); sl@0: _LOG2(_L("CModifierPlugin::FsFileWriteL, RFilePlugin::Close to the second file returned %d"), err); sl@0: sl@0: //read from the first file sl@0: HBufC8* tempBuf3 = HBufC8::NewMaxLC(length); sl@0: TPtr8 tempBufPtr3((TUint8 *)tempBuf3->Des().Ptr(), length, length); sl@0: err = fileplugin.Read(pos, tempBufPtr3); sl@0: _LOG2(_L("CModifierPlugin::FsFileWriteL, RFilePlugin::Read returned %d"), err); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: RFsPlugin fsplugin(aRequest); sl@0: err = fsplugin.Connect(); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: err = fsplugin.Delete(testfilename2); sl@0: if(err == KErrNone || err == KErrNotFound) sl@0: err = KErrNone; sl@0: sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: //close the first file. sl@0: fileplugin.Close(); sl@0: sl@0: //Create new file sl@0: err = fileplugin.Create(testfilename2, EFileWrite); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: _LOG2(_L("CModifierPlugin::FsFileWriteL, RFilePlugin::Create returned %d"), err); sl@0: sl@0: //write to the newly created file sl@0: err = fileplugin.Write(pos, tempBufPtr2); sl@0: _LOG2(_L("CModifierPlugin::FsFileWriteL, RFilePlugin::Write to the newly created file returned %d"), err); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: //close the newly created file sl@0: fileplugin.Close(); sl@0: sl@0: //delete the newly created file sl@0: err = fsplugin.Delete(testfilename2); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: fsplugin.Close(); sl@0: sl@0: CleanupStack::PopAndDestroy(); sl@0: sl@0: // request processed by plug-in sl@0: User::Leave(KErrCompletion); sl@0: } sl@0: } sl@0: } sl@0: sl@0: sl@0: sl@0: /** sl@0: @internalComponent sl@0: */ sl@0: void CModifierPlugin::FsFileRenameL(TFsPluginRequest& aRequest) sl@0: { sl@0: TFileName oldfilename, newfilename; sl@0: TParse parse; sl@0: sl@0: oldfilename = aRequest.Src().FullName(); sl@0: newfilename = aRequest.Dest().FullName(); sl@0: sl@0: parse.Set(oldfilename, NULL, NULL); sl@0: TPtrC extension(parse.Ext()); sl@0: sl@0: _LOG3(_L("CModifierPlugin::FsFileRenameL, old name: %S, new name: %S"), &oldfilename, &newfilename); sl@0: sl@0: if (aRequest.IsPostOperation()) sl@0: { sl@0: _LOG(_L("CModifierPlugin::FsFileRenameL, post intercept")); sl@0: sl@0: if (extension.CompareF(_L(".tst")) == 0) sl@0: { sl@0: TBuf8<32> tempBuf = (_L8("Rename Post Intercept")); sl@0: RFilePlugin fileplugin(aRequest); sl@0: TInt err = fileplugin.AdoptFromClient(); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: err = fileplugin.Write(20, tempBuf); sl@0: _LOG2(_L("CModifierPlugin::FsFileRenameL, FileWrite returned %d"), err); sl@0: fileplugin.Close(); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: } sl@0: } sl@0: else sl@0: { sl@0: _LOG(_L("CModifierPlugin::FsFileRenameL, pre intercept")); sl@0: sl@0: if (extension.CompareF(_L(".tst")) == 0) sl@0: { sl@0: TBuf8<32> tempBuf = (_L8("Rename Pre Intercept")); sl@0: RFilePlugin fileplugin(aRequest); sl@0: TInt err = fileplugin.AdoptFromClient(); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: err = fileplugin.Write(0, tempBuf); sl@0: _LOG2(_L("CModifierPlugin::FsFileRenameL, FileWrite returned %d"), err); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: err = fileplugin.Rename(newfilename); sl@0: _LOG2(_L("CModifierPlugin::FsFileRenameL, FilePlugin::Rename returned %d"), err); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: fileplugin.Close(); sl@0: User::Leave(KErrCompletion); sl@0: } sl@0: } sl@0: } sl@0: sl@0: sl@0: void CModifierPlugin::FsFileCreateL(TFsPluginRequest& aRequest) sl@0: { sl@0: TFileName filename; sl@0: TParse parse; sl@0: sl@0: filename = aRequest.Src().FullName(); sl@0: sl@0: TUint mode; sl@0: TInt err = aRequest.Read(TFsPluginRequest::EMode, mode); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: parse.Set(filename, NULL, NULL); sl@0: TPtrC extension(parse.Ext()); sl@0: sl@0: if (aRequest.IsPostOperation()) sl@0: { sl@0: _LOG(_L("CModifierPlugin::FsFileCreateL, post intercept")); sl@0: sl@0: if (extension.CompareF(_L(".tst")) == 0) sl@0: { sl@0: RFilePlugin fileplugin(aRequest); sl@0: TInt err = fileplugin.AdoptFromClient(); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: //write to the newly created file sl@0: TBuf8<64> wbuffer; sl@0: wbuffer.Copy(_L8("TestTestTest")); sl@0: err = fileplugin.Write(0, wbuffer); sl@0: _LOG2(_L("CModifierPlugin::FsFileCreateL, RFilePlugin::Write to the newly created file returned %d"), err); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: TInt length = wbuffer.Length(); sl@0: HBufC8* tempBuf = HBufC8::NewMaxLC(length); sl@0: TPtr8 tempBufPtr((TUint8 *)tempBuf->Des().Ptr(), length, length); sl@0: err = fileplugin.Read(0, tempBufPtr); sl@0: _LOG2(_L("CModifierPlugin::FsFileCreateL, RFilePlugin::Read returned %d"), err); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: //testing the correct thing has been written to the drive sl@0: err = wbuffer.Compare(tempBufPtr); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: fileplugin.Close(); sl@0: CleanupStack::PopAndDestroy(); //tempBuf sl@0: } sl@0: } sl@0: else sl@0: { sl@0: _LOG(_L("CModifierPlugin::FsFileCreateL, pre intercept")); sl@0: sl@0: RFilePlugin fileplugin(aRequest); sl@0: sl@0: TInt err = fileplugin.Create(filename, mode); sl@0: sl@0: _LOG2(_L("CModifierPlugin::FsFileCreateL, RFilePlugin::Create returned %d"), err); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: err = fileplugin.TransferToClient(); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: fileplugin.Close(); sl@0: User::Leave(KErrCompletion); sl@0: } sl@0: } sl@0: sl@0: void CModifierPlugin::FsFileOpenL(TFsPluginRequest& aRequest) sl@0: { sl@0: sl@0: TFileName filename; sl@0: TParse parse; sl@0: sl@0: filename = aRequest.Src().FullName(); sl@0: sl@0: TUint mode; sl@0: TInt err = aRequest.Read(TFsPluginRequest::EMode, mode); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: parse.Set(filename, NULL, NULL); sl@0: TPtrC extension(parse.Ext()); sl@0: sl@0: _LOG2(_L("CModifierPlugin::FsFileOpenL, file: %S"), &filename); sl@0: sl@0: // Check that FileName can't be used in pre-operation (as the handle doesn't exist yet!) sl@0: TFileName shareName; sl@0: err = aRequest.FileName(shareName); sl@0: if (aRequest.IsPostOperation()) sl@0: { sl@0: err = filename.Compare(shareName); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: } sl@0: else if(err != KErrNotSupported) sl@0: { sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: } sl@0: sl@0: if (aRequest.IsPostOperation()) sl@0: { sl@0: _LOG(_L("CModifierPlugin::FsFileOpenL, post intercept")); sl@0: if ((extension.CompareF(_L(".tst")) == 0) && (aRequest.Message().Int1() != 0) && (mode & EFileWrite)) sl@0: { sl@0: sl@0: RFilePlugin fileplugin(aRequest); sl@0: err = fileplugin.AdoptFromClient(); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: //write to the newly opened file sl@0: TBuf8<64> wbuffer; sl@0: wbuffer.Copy(_L8("TestTestTest")); sl@0: err = fileplugin.Write(0, wbuffer); sl@0: _LOG2(_L("CModifierPlugin::FsFileOpenL, RFilePlugin::Write to the newly opened file returned %d"), err); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: TInt length = wbuffer.Length(); sl@0: HBufC8* tempBuf = HBufC8::NewMaxLC(length); sl@0: TPtr8 tempBufPtr((TUint8 *)tempBuf->Des().Ptr(), length, length); sl@0: err = fileplugin.Read(0, tempBufPtr); sl@0: _LOG2(_L("CModifierPlugin::FsFileOpenL, RFilePlugin::Read returned %d"), err); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: //testing the correct thing has been written to the drive sl@0: err = wbuffer.Compare(tempBufPtr); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: fileplugin.Close(); sl@0: sl@0: CleanupStack::PopAndDestroy(); //tempbuf sl@0: } sl@0: } sl@0: else sl@0: { sl@0: _LOG(_L("CModifierPlugin::FsFileOpenL, pre intercept")); sl@0: sl@0: RFilePlugin fileplugin(aRequest); sl@0: err = fileplugin.Open(filename, mode); sl@0: _LOG3(_L("CModifierPlugin::FsFileOpenL, RFilePlugin::Open for %S returned %d"), &filename, err); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: err = fileplugin.TransferToClient(); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: User::Leave(KErrCompletion); // STF : Completing and not setting the handle of the original request? sl@0: } sl@0: } sl@0: sl@0: sl@0: void CModifierPlugin::FsFileTempL(TFsPluginRequest& aRequest) sl@0: { sl@0: TBuf<256> testfilename1; sl@0: sl@0: //setting up test files sl@0: testfilename1.Append(iDriveToTest); sl@0: testfilename1.Append(_L(":\\Data\\")); sl@0: sl@0: if (aRequest.IsPostOperation()) sl@0: { sl@0: _LOG(_L("CModifierPlugin::FsFileTempL, post intercept")); sl@0: sl@0: RFilePlugin fileplugin(aRequest); sl@0: TInt err = fileplugin.AdoptFromClient(); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: //write to the newly created temp file sl@0: TBuf8<64> wbuffer; sl@0: wbuffer.Copy(_L8("TestTestTest")); sl@0: err = fileplugin.Write(0, wbuffer); sl@0: _LOG2(_L("CModifierPlugin::FsFileTempL, RFilePlugin::Write to the newly created temp file returned %d"), err); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: TInt length = wbuffer.Length(); sl@0: HBufC8* tempBuf = HBufC8::NewMaxLC(length); sl@0: TPtr8 tempBufPtr((TUint8 *)tempBuf->Des().Ptr(), length, length); sl@0: err = fileplugin.Read(0, tempBufPtr); sl@0: _LOG2(_L("CModifierPlugin::FsFileTempL, RFilePlugin::Read returned %d"), err); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: fileplugin.Close(); sl@0: sl@0: //testing the correct thing has been written to the drive sl@0: err = wbuffer.Compare(tempBufPtr); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: CleanupStack::PopAndDestroy(); sl@0: } sl@0: else sl@0: { sl@0: _LOG(_L("CModifierPlugin::FsFileTempL, pre intercept")); sl@0: sl@0: TInt mode; sl@0: TInt err = aRequest.Read(TFsPluginRequest::EMode, mode); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: TFileName fn; sl@0: RFilePlugin fileplugin(aRequest); sl@0: err = fileplugin.Temp(testfilename1, fn, mode); sl@0: _LOG2(_L("CModifierPlugin::FsFileTempL, RFilePlugin::Temp returned %d"), err); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: err = aRequest.Write(TFsPluginRequest::ENewName, fn); sl@0: _LOG2(_L("CModifierPlugin::FsFileTempL, ClientWrite returned %d"), err); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: err = fileplugin.TransferToClient(); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: fileplugin.Close(); sl@0: sl@0: User::Leave(KErrCompletion); sl@0: } sl@0: } sl@0: sl@0: sl@0: void CModifierPlugin::FsFileReplaceL(TFsPluginRequest& aRequest) sl@0: { sl@0: TFileName filename; sl@0: TParse parse; sl@0: sl@0: filename = aRequest.Src().FullName(); sl@0: sl@0: TUint mode; sl@0: TInt err = aRequest.Read(TFsPluginRequest::EMode, mode); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: parse.Set(filename, NULL, NULL); sl@0: TPtrC extension(parse.Ext()); sl@0: sl@0: _LOG2(_L("CModifierPlugin::FsFileReplaceL, file: %S"), &filename); sl@0: sl@0: if (aRequest.IsPostOperation()) sl@0: { sl@0: _LOG(_L("CModifierPlugin::FsFileReplaceL, post intercept")); sl@0: if ((extension.CompareF(_L(".tst")) == 0) && (aRequest.Message().Int1() != 0)) sl@0: { sl@0: //write to the newly replaced file sl@0: TBuf8<64> wbuffer; sl@0: wbuffer.Copy(_L8("TestTestTest")); sl@0: sl@0: RFilePlugin fileplugin(aRequest); sl@0: TInt err = fileplugin.AdoptFromClient(); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: err = fileplugin.Write(0, wbuffer); sl@0: _LOG2(_L("CModifierPlugin::FsFileReplaceL, RFilePlugin::Write to the newly created file returned %d"), err); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: TInt length = wbuffer.Length(); sl@0: HBufC8* tempBuf = HBufC8::NewMaxLC(length); sl@0: TPtr8 tempBufPtr((TUint8 *)tempBuf->Des().Ptr(), length, length); sl@0: err = fileplugin.Read(0, tempBufPtr); sl@0: _LOG2(_L("CModifierPlugin::FsFileReplaceL, RFilePlugin::Read returned %d"), err); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: //testing the correct thing has been written to the drive sl@0: err = wbuffer.Compare(tempBufPtr); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: fileplugin.Close(); sl@0: CleanupStack::PopAndDestroy(); sl@0: } sl@0: } sl@0: else sl@0: { sl@0: RFilePlugin fileplugin(aRequest); sl@0: sl@0: TInt err = fileplugin.Replace(filename, mode); sl@0: _LOG2(_L("CModifierPlugin::FsFileReplaceL, RFilePlugin::Replace returned %d"), err); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: err = fileplugin.TransferToClient(); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: fileplugin.Close(); sl@0: User::Leave(KErrCompletion); sl@0: } sl@0: } sl@0: sl@0: sl@0: sl@0: void CModifierPlugin::FsReadFileSectionL(TFsPluginRequest& aRequest) sl@0: { sl@0: TInt err = KErrNone; sl@0: TInt length = 0; sl@0: TInt64 pos = 0; sl@0: TFileName filename; sl@0: TParse parse; sl@0: TBuf<256> testfilename1; sl@0: sl@0: //setting up test files sl@0: testfilename1.Append(iDriveToTest); sl@0: testfilename1.Append(_L(":\\Data\\test.txt")); sl@0: sl@0: filename = aRequest.Src().FullName(); sl@0: sl@0: err = aRequest.Read(TFsPluginRequest::ELength, length); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: err = aRequest.Read(TFsPluginRequest::EPosition, pos); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: parse.Set(filename, NULL, NULL); sl@0: TPtrC extension(parse.Ext()); sl@0: sl@0: _LOG2(_L("CModifierPlugin::FsReadFileSectionL, file: %S"), &filename); sl@0: sl@0: if (aRequest.IsPostOperation()) sl@0: { sl@0: _LOG(_L("CModifierPlugin::FsReadFileSectionL, post intercept")); sl@0: User::Invariant(); sl@0: _LOG(_L("CModifierPlugin::FsReadFileSectionL - Exit")); sl@0: } sl@0: else sl@0: { sl@0: _LOG(_L("CModifierPlugin::FsReadFileSectionL, pre intercept - enter")); sl@0: sl@0: if (extension.CompareF(_L(".tst")) == 0) sl@0: { sl@0: sl@0: RFilePlugin fileplugin2(aRequest); sl@0: //open a second file sl@0: err = fileplugin2.Open(testfilename1, EFileWrite); sl@0: _LOG3(_L("CModifierPlugin::FsReadFileSectionL - RFilePlugin::Open for %S returned %d"), &testfilename1, err); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: TInt64 size=0; sl@0: err = fileplugin2.Size(size); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: //close the second file sl@0: fileplugin2.Close(); sl@0: _LOG(_L("CModifierPlugin::FsReadFileSectionL - fileplugin2.Close()")); sl@0: sl@0: TBuf8<26> temp; sl@0: sl@0: RFsPlugin fsplugin(aRequest); sl@0: err = fsplugin.Connect(); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: err = fsplugin.ReadFileSection(filename, pos, temp, length); sl@0: _LOG3(_L("CModifierPlugin::FsReadFileSectionL - RFsPlugin::ReadFilePlugin for %S returned %d"), &testfilename1, err); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: fsplugin.Close(); sl@0: sl@0: TBuf<26> temp_wide; sl@0: temp_wide.Copy(temp); sl@0: sl@0: iLogging = ETrue; sl@0: _LOG2(_L("CModifierPlugin::FsReadFileSectionL - wanted to read length = %d\n"),length); sl@0: _LOG2(_L("CModifierPlugin::FsReadFileSectionL - data read length = %d\n"),temp.Length()); sl@0: _LOG2(_L("CModifierPlugin::FsReadFileSectionL - data read = %S\n"),&temp_wide); sl@0: iLogging = EFalse; sl@0: sl@0: sl@0: err = aRequest.Write(TFsPluginRequest::EData, temp); sl@0: _LOG3(_L("CModifierPlugin::FsReadFileSectionL - RFilePlugin::Write for %S returned %d"), &testfilename1, err); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: // request processed by plug-in sl@0: User::Leave(KErrCompletion); sl@0: } sl@0: _LOG(_L("CModifierPlugin::FsReadFileSectionL, pre intercept - exit")); sl@0: } sl@0: } sl@0: sl@0: sl@0: void CModifierPlugin::FsDeleteL(TFsPluginRequest& aRequest) sl@0: { sl@0: TInt err = KErrNone; sl@0: TFileName filename; sl@0: sl@0: TBuf<256> testfilename1; sl@0: sl@0: //setting up test files sl@0: testfilename1.Append(iDriveToTest); sl@0: testfilename1.Append(_L(":\\Data\\test.txt")); sl@0: sl@0: filename = aRequest.Src().FullName(); sl@0: sl@0: if (aRequest.IsPostOperation()) sl@0: { sl@0: _LOG(_L("CModifierPlugin::FsDeleteL, post intercept")); sl@0: sl@0: RFilePlugin fileplugin2(aRequest); sl@0: //open a second file sl@0: err = fileplugin2.Open(testfilename1, EFileWrite); sl@0: _LOG3(_L("CModifierPlugin::FsDeleteL, RFilePlugin::Open for %S returned %d"), &testfilename1, err); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: TInt64 size=0; sl@0: err = fileplugin2.Size(size); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: //close the second file sl@0: fileplugin2.Close(); sl@0: _LOG2(_L("CModifierPlugin::FsDeleteL, RFilePlugin::Close to the second file returned %d"), err); sl@0: } sl@0: else sl@0: { sl@0: _LOG(_L("CModifierPlugin::FsDeleteL, pre intercept")); sl@0: sl@0: _LOG(_L("CModifierPlugin::FsDeleteL, calling RFsPlugin::Delete")); sl@0: RFilePlugin fileplugin2(aRequest); sl@0: //open a second file sl@0: err = fileplugin2.Open(testfilename1, EFileWrite); sl@0: _LOG3(_L("CModifierPlugin::FsDeleteL, RFilePlugin::Open for %S returned %d"), &testfilename1, err); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: TInt64 size=0; sl@0: err = fileplugin2.Size(size); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: //close the second file sl@0: fileplugin2.Close(); sl@0: _LOG2(_L("CModifierPlugin::FsDeleteL, RFilePlugin::Close to the second file returned %d"), err); sl@0: sl@0: RFsPlugin fsplugin(aRequest); sl@0: err = fsplugin.Connect(); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: err = fsplugin.Delete(filename); sl@0: _LOG2(_L("CModifierPlugin::FsDeleteL, RFsPlugin::Delete returned %d"), err); sl@0: sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: fsplugin.Close(); sl@0: sl@0: // request processed by plug-in sl@0: User::Leave(KErrCompletion); sl@0: } sl@0: } sl@0: sl@0: sl@0: void CModifierPlugin::FsReplaceL(TFsPluginRequest& aRequest) sl@0: { sl@0: TInt err = KErrNone; sl@0: TFileName oldfilename; sl@0: TFileName newfilename; sl@0: sl@0: oldfilename = aRequest.Src().FullName(); sl@0: newfilename = aRequest.Dest().FullName(); sl@0: sl@0: TBuf<256> testfilename1; sl@0: sl@0: //setting up test files sl@0: testfilename1.Append(iDriveToTest); sl@0: testfilename1.Append(_L(":\\Data\\test.txt")); sl@0: sl@0: sl@0: if (aRequest.IsPostOperation()) sl@0: { sl@0: //STF: Is this code going to get called - the pre-operation completes early? sl@0: sl@0: _LOG(_L("CModifierPlugin::FsReplaceL, post intercept")); sl@0: //We should check that the name has changed here. sl@0: RFilePlugin file(aRequest); sl@0: TInt err = file.AdoptFromClient(); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: TInt compare = oldfilename.Compare(newfilename); sl@0: if(compare != 0) //is equal sl@0: { sl@0: //User::Leave(compare); sl@0: //It wont be equal as the name is coming from the request aint it. sl@0: //Bit of a pointless comparison in retrospect eh? sl@0: } sl@0: sl@0: file.Close(); sl@0: sl@0: RFilePlugin fileplugin2(aRequest); sl@0: //open a second file sl@0: err = fileplugin2.Open(testfilename1, EFileWrite); sl@0: _LOG3(_L("CModifierPlugin::FsReplaceL, RFilePlugin::Open for %S returned %d"), &testfilename1, err); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: TInt64 size=0; sl@0: err =fileplugin2.Size(size); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: //close the second file sl@0: fileplugin2.Close(); sl@0: _LOG2(_L("CModifierPlugin::FsReplaceL, RFilePlugin::Close to the second file returned %d"), err); sl@0: } sl@0: else sl@0: { sl@0: _LOG(_L("CModifierPlugin::FsReplaceL, pre intercept")); sl@0: RFilePlugin fileplugin2(aRequest); sl@0: //open a second file sl@0: err = fileplugin2.Open(testfilename1, EFileWrite); sl@0: _LOG3(_L("CModifierPlugin::FsReplaceL, RFilePlugin::Open for %S returned %d"), &testfilename1, err); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: TInt64 size=0; sl@0: err =fileplugin2.Size(size); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: //close the second file sl@0: fileplugin2.Close(); sl@0: _LOG2(_L("CModifierPlugin::FsReplaceL, FilePlugin::Close to the second file returned %d"), err); sl@0: sl@0: _LOG(_L("CModifierPlugin::FsReplaceL, calling RFsPlugin::Replace")); sl@0: RFsPlugin fsplugin(aRequest); sl@0: err = fsplugin.Connect(); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: err = fsplugin.Replace(oldfilename, newfilename); sl@0: _LOG2(_L("CModifierPlugin::FsReplaceL, RFsPlugin::Replace returned %d"), err); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: fsplugin.Close(); sl@0: sl@0: // request processed by plug-in sl@0: User::Leave(KErrCompletion); sl@0: } sl@0: } sl@0: sl@0: sl@0: void CModifierPlugin::FsRenameL(TFsPluginRequest& aRequest) sl@0: { sl@0: TInt err = KErrNone; sl@0: TFileName oldfilename; sl@0: TFileName newfilename; sl@0: sl@0: oldfilename = aRequest.Src().FullName(); sl@0: newfilename = aRequest.Dest().FullName(); sl@0: sl@0: TBuf<256> testfilename1; sl@0: sl@0: //setting up test files sl@0: testfilename1.Append(iDriveToTest); sl@0: testfilename1.Append(_L(":\\Data\\test.txt")); sl@0: sl@0: if (aRequest.IsPostOperation()) sl@0: { sl@0: _LOG(_L("CModifierPlugin::FsRenameL, post intercept")); sl@0: RFilePlugin fileplugin2(aRequest); sl@0: //open a second file sl@0: err = fileplugin2.Open(testfilename1, EFileWrite); sl@0: _LOG3(_L("RFilePlugin::Open for %S returned %d"), &testfilename1, err); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: TInt64 size=0; sl@0: err = fileplugin2.Size(size); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: //close the second file sl@0: fileplugin2.Close(); sl@0: _LOG2(_L("CModifierPlugin::FsRenameL, RFilePlugin::Close to the second file returned %d"), err); sl@0: } sl@0: else sl@0: { sl@0: _LOG(_L("CModifierPlugin::FsRenameL, pre intercept")); sl@0: RFilePlugin fileplugin2(aRequest); sl@0: //open a second file sl@0: fileplugin2.Open(testfilename1, EFileWrite); sl@0: _LOG3(_L("CModifierPlugin::FsRenameL, RFilePlugin::Open for %S returned %d"), &testfilename1, err); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: TInt64 size=0; sl@0: err = fileplugin2.Size(size); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: //close the second file sl@0: fileplugin2.Close(); sl@0: _LOG2(_L("CModifierPlugin::FsRenameL, RFilePlugin::Close to the second file returned %d"), err); sl@0: sl@0: _LOG(_L("CModifierPlugin::FsRenameL, calling RFsPlugin::Rename")); sl@0: RFsPlugin fsplugin(aRequest); sl@0: err = fsplugin.Connect(); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: err = fsplugin.Rename(oldfilename, newfilename); sl@0: _LOG2(_L("CModifierPlugin::FsRenameL, RFsPlugin::Rename returned %d"), err); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: fsplugin.Close(); sl@0: sl@0: // request processed by plug-in sl@0: User::Leave(KErrCompletion); sl@0: } sl@0: } sl@0: sl@0: void CModifierPlugin::FsEntryL(TFsPluginRequest& aRequest) sl@0: { sl@0: TInt err = KErrNone; sl@0: TFileName filename; sl@0: sl@0: filename = aRequest.Src().FullName(); sl@0: sl@0: TBuf<256> testfilename1; sl@0: sl@0: //setting up test files sl@0: testfilename1.Append(iDriveToTest); sl@0: testfilename1.Append(_L(":\\Data\\test.txt")); sl@0: sl@0: sl@0: sl@0: if (aRequest.IsPostOperation()) sl@0: { sl@0: _LOG(_L("CModifierPlugin::FsEntryL, post intercept")); sl@0: RFilePlugin fileplugin2(aRequest); sl@0: //open a second file sl@0: err = fileplugin2.Open(testfilename1, EFileWrite); sl@0: _LOG3(_L("CModifierPlugin::FsEntryL, RFilePlugin::Open for %S returned %d"), &testfilename1, err); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: TInt64 size=0; sl@0: err = fileplugin2.Size(size); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: //close the second file sl@0: fileplugin2.Close(); sl@0: _LOG2(_L("CModifierPlugin::FsEntryL, RFilePlugin::Close to the second file returned %d"), err); sl@0: } sl@0: else sl@0: { sl@0: _LOG(_L("CModifierPlugin::FsEntryL, pre intercept")); sl@0: RFilePlugin fileplugin2(aRequest); sl@0: //open a second file sl@0: err = fileplugin2.Open(testfilename1, EFileWrite); sl@0: _LOG3(_L("CModifierPlugin::FsEntryL, RFilePlugin::Open for %S returned %d"), &testfilename1, err); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: TInt64 size=0; sl@0: err = fileplugin2.Size(size); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: //close the second file sl@0: fileplugin2.Close(); sl@0: _LOG2(_L("CModifierPlugin::FsEntryL, RFilePlugin::Close to the second file returned %d"), err); sl@0: sl@0: _LOG(_L("CModifierPlugin::FsEntryL, calling RFsPlugin::Entry")); sl@0: RFsPlugin fsplugin(aRequest); sl@0: err = fsplugin.Connect(); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: TEntry entry; sl@0: err = fsplugin.Entry(filename, entry); sl@0: _LOG2(_L("CModifierPlugin::FsEntryL, RFsPlugin::Entry returned %d"), err); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: fsplugin.Close(); sl@0: sl@0: TPckgC data(entry); sl@0: err = aRequest.Write(TFsPluginRequest::EEntry, data); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: // request processed by plug-in sl@0: User::Leave(KErrCompletion); sl@0: } sl@0: } sl@0: sl@0: sl@0: void CModifierPlugin::FsSetEntryL(TFsPluginRequest& aRequest) sl@0: { sl@0: TInt err = KErrNone; sl@0: TFileName filename; sl@0: sl@0: TBuf<256> testfilename1; sl@0: sl@0: //setting up test files sl@0: testfilename1.Append(iDriveToTest); sl@0: testfilename1.Append(_L(":\\Data\\test.txt")); sl@0: sl@0: if (aRequest.IsPostOperation()) sl@0: { sl@0: _LOG(_L("CModifierPlugin::FsSetEntryL, post intercept")); sl@0: RFilePlugin fileplugin2(aRequest); sl@0: //open a second file sl@0: err = fileplugin2.Open(testfilename1, EFileWrite); sl@0: _LOG3(_L("CModifierPlugin::FsSetEntryL, RFilePlugin::Open for %S returned %d"), &testfilename1, err); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: TInt64 size=0; sl@0: err = fileplugin2.Size(size); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: //close the second file sl@0: fileplugin2.Close(); sl@0: _LOG2(_L("CModifierPlugin::FsSetEntryL, RFilePlugin::Close to the second file returned %d"), err); sl@0: } sl@0: else sl@0: { sl@0: _LOG(_L("CModifierPlugin::FsSetEntryL, pre intercept")); sl@0: RFilePlugin fileplugin2(aRequest); sl@0: //open a second file sl@0: err = fileplugin2.Open(testfilename1, EFileWrite); sl@0: _LOG3(_L("CModifierPlugin::FsSetEntryL, RFilePlugin::Open for %S returned %d"), &testfilename1, err); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: TInt64 size=0; sl@0: err = fileplugin2.Size(size); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: //close the second file sl@0: fileplugin2.Close(); sl@0: _LOG2(_L("CModifierPlugin::FsSetEntryL, FilePlugin::Close to the second file returned %d"), err); sl@0: sl@0: TTime time; sl@0: TPtr8 t((TUint8*)&time,sizeof(TTime)); sl@0: err = aRequest.Read(TFsPluginRequest::ETime, t); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: filename = aRequest.Src().FullName(); sl@0: sl@0: TInt setMode, clearMode; sl@0: err = aRequest.Read(TFsPluginRequest::ESetAtt, setMode); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: err = aRequest.Read(TFsPluginRequest::EClearAtt, clearMode); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: RFsPlugin fsplugin(aRequest); sl@0: err = fsplugin.Connect(); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: err = fsplugin.SetEntry(filename, time, setMode, clearMode); sl@0: _LOG2(_L("CModifierPlugin::FsSetEntryL, RFsPlugin::SetEntry returned %d"), err); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: fsplugin.Close(); sl@0: sl@0: // request processed by plug-in sl@0: User::Leave(KErrCompletion); sl@0: } sl@0: } sl@0: sl@0: /** sl@0: @see TestVolume() sl@0: */ sl@0: void CModifierPlugin::FsVolumeL(TFsPluginRequest& aRequest) sl@0: { sl@0: if (aRequest.IsPostOperation()) sl@0: { sl@0: _LOG(_L("CModifierPlugin::FsVolumeL, post intercept")); sl@0: } sl@0: else sl@0: { sl@0: _LOG(_L("CModifierPlugin::FsVolumeL, pre intercept")); sl@0: RFsPlugin fsplugin(aRequest); sl@0: CleanupClosePushL(fsplugin); sl@0: sl@0: TInt err = fsplugin.Connect(); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); // Trapped in DoRequestL sl@0: sl@0: TVolumeInfo volInfo; sl@0: TInt drive = (TInt)(iDriveToTest - (TChar)'A'); sl@0: err = fsplugin.Volume(volInfo,drive); sl@0: _LOG3(_L("CModifierPlugin::FsVolumeL, RFsPlugin::Volume(drive %d) returned %d"), drive, err); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); // Trapped in DoRequestL sl@0: sl@0: // Check that the volume label is the same as what was set in t_plugin_v2 sl@0: _LIT(KVolumeLabel,"1Volume"); sl@0: err = volInfo.iName.Compare(KVolumeLabel); sl@0: _LOG2(_L("CModifierPlugin::FsVolumeL, Compare volume label returned %d"), err); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); // Trapped in DoRequestL sl@0: sl@0: // Modify volume name sl@0: _LOG2(_L("CModifierPlugin::FsVolumeL, Old volume name = %S"), &volInfo.iName); sl@0: TBuf<7> newVolumeName = volInfo.iName; sl@0: newVolumeName[0] = '2'; sl@0: volInfo.iName = newVolumeName; sl@0: _LOG2(_L("CModifierPlugin::FsVolumeL, New volume name = %S"), &volInfo.iName); sl@0: sl@0: // Send back volume info sl@0: TPckgC volInfoPckg(volInfo); sl@0: err = aRequest.Write(TFsPluginRequest::EVolumeInfo, volInfoPckg); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); // Trapped in DoRequestL sl@0: sl@0: CleanupStack::PopAndDestroy(); sl@0: sl@0: // Request processed by plug-in sl@0: User::Leave(KErrCompletion); sl@0: } sl@0: } sl@0: sl@0: sl@0: /** sl@0: @internalComponent sl@0: */ sl@0: void CModifierPlugin::FsFileSubCloseL(TFsPluginRequest& aRequest) sl@0: { sl@0: if (aRequest.IsPostOperation()) sl@0: { sl@0: _LOG(_L("CModifierPlugin::FsFileSubCloseL, post intercept")); sl@0: } sl@0: else sl@0: { sl@0: _LOG(_L("CModifierPlugin::FsFileSubCloseL, pre intercept")); sl@0: } sl@0: } sl@0: sl@0: /** sl@0: @internalComponent sl@0: */ sl@0: void CModifierPlugin::FsDirOpenL(TFsPluginRequest& aRequest) sl@0: { sl@0: sl@0: TBuf<256> testfilename1; sl@0: sl@0: TBuf<25> testtemp; sl@0: TInt err = aRequest.FileName(testtemp); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: //setting up test files sl@0: testfilename1.Append(iDriveToTest); sl@0: testfilename1.Append(_L(":\\Data2\\")); sl@0: sl@0: if (aRequest.IsPostOperation()) sl@0: { sl@0: _LOG(_L("CModifierPlugin::FsDirOpenL, post intercept")); sl@0: } sl@0: else sl@0: { sl@0: _LOG(_L("CModifierPlugin::FsDirOpenL, pre intercept")); sl@0: sl@0: _LOG(_L("CModifierPlugin::FsDirOpenL, calling RDirPlugin::Open")); sl@0: sl@0: TPckgBuf uidPckg; sl@0: err = aRequest.Read(TFsPluginRequest::EUid, uidPckg); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: TUidType uidType = uidPckg(); sl@0: TFileName filename; sl@0: filename = iDirFullName; sl@0: sl@0: RDirPlugin dirplugin(aRequest); sl@0: err = dirplugin.Open(filename, uidType); sl@0: _LOG2(_L("CModifierPlugin::FsDirOpenL, RDirPlugin::Open returned %d"), err); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: dirplugin.Close(); sl@0: sl@0: err = dirplugin.Open(testfilename1, uidType); sl@0: _LOG2(_L("CModifierPlugin::FsDirOpenL, RDirPlugin::Open returned %d"), err); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: dirplugin.Close(); sl@0: } sl@0: } sl@0: sl@0: void CModifierPlugin::FsDirReadOneL(TFsPluginRequest& aRequest) sl@0: { sl@0: TFileName filename; sl@0: TInt err = aRequest.FileName(filename); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: TBuf<256> drivename; sl@0: sl@0: //setting up test files sl@0: drivename.Append(iDriveToTest); sl@0: drivename.Append(_L(":\\")); sl@0: sl@0: //filename = iDirFullName; //STF: Can this be policed by checking EParseSrc flag? sl@0: sl@0: if (aRequest.IsPostOperation()) sl@0: { sl@0: _LOG(_L("CModifierPlugin::FsDirReadL, post intercept")); sl@0: } sl@0: else sl@0: { sl@0: _LOG(_L("CModifierPlugin::FsDirReadL, pre intercept")); sl@0: sl@0: TInt x = filename.CompareF(drivename); sl@0: if(x==0) sl@0: { sl@0: RDirPlugin dir(aRequest); sl@0: err = dir.Open(filename, KEntryAttMatchMask); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: TEntry entry; sl@0: err = dir.Read(entry); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: _LOG2(_L("CModifierPlugin::FsDirReadL, Read returned %S (first entry)"), &entry.iName); sl@0: sl@0: TPckgC data(entry); sl@0: err = aRequest.Write(TFsPluginRequest::EEntry, data); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: dir.Close(); sl@0: User::Leave(KErrCompletion); sl@0: } sl@0: } sl@0: } sl@0: sl@0: sl@0: /** sl@0: @internalComponent sl@0: */ sl@0: void CModifierPlugin::FsDirReadPackedL(TFsPluginRequest& aRequest) sl@0: { sl@0: TFileName filename; sl@0: TInt err = aRequest.FileName(filename); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: TParse parse; sl@0: sl@0: parse.Set(filename, NULL, NULL); sl@0: //TPtrC extension(parse.Ext()); sl@0: TBuf<256> drivename; sl@0: sl@0: //setting up test files sl@0: drivename.Append(iDriveToTest); sl@0: drivename.Append(_L(":\\")); sl@0: sl@0: //filename = iDirFullName; sl@0: sl@0: if (aRequest.IsPostOperation()) sl@0: { sl@0: _LOG(_L("CModifierPlugin::FsDirReadPackedL, post intercept")); sl@0: } sl@0: else sl@0: { sl@0: _LOG(_L("CModifierPlugin::FsDirReadPackedL, pre intercept")); sl@0: sl@0: TInt x = filename.CompareF(drivename); sl@0: if(x==0) sl@0: { sl@0: RDirPlugin dir(aRequest); sl@0: err = dir.Open(filename, KEntryAttMatchMask); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: TRawEntryArray aArray; sl@0: err = dir.Read(aArray); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone && err!=KErrEof) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: TEntry entry = aArray[0]; sl@0: _LOG2(_L("CModifierPlugin::FsDirReadPackedL, Read returned %S (first entry)"), &entry.iName); sl@0: sl@0: dir.Close(); sl@0: sl@0: err = aRequest.Write(TFsPluginRequest::EEntryArray,aArray.Buf()); // Careful not to overwrite the KErrEof sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: User::Leave(err); //trapped in DoRequestL sl@0: sl@0: User::Leave(KErrEof); //This is effectively a completion code for FSDirReadPacked sl@0: } sl@0: } sl@0: } sl@0: sl@0: CFsPluginConn* CModifierPlugin::NewPluginConnL() sl@0: { sl@0: return new(ELeave) CModifierPluginConn(); sl@0: } sl@0: sl@0: sl@0: //Synchronous RPlugin::DoControl sl@0: TInt CModifierPlugin::FsPluginDoControlL(CFsPluginConnRequest& aRequest) sl@0: { sl@0: TInt err = KErrNone; sl@0: sl@0: //We can use this to set the drive sl@0: //We can store this as a member of this class. sl@0: sl@0: TPckg errCodeDes(iLastError); sl@0: TPckg lineNumberDes(iLineNumber); sl@0: TPckg drive(iDriveToTest); sl@0: TPckg interceptStatusDes(iInterceptsEnabled); sl@0: typedef TBuf<256> TDirName; sl@0: TPckg dirnamePckg(iDirFullName); sl@0: sl@0: TInt function = aRequest.Function(); sl@0: switch(function) sl@0: { sl@0: case KPluginSetDrive: sl@0: { sl@0: TRAP(err,aRequest.ReadParam1L(drive)); sl@0: break; sl@0: } sl@0: case KPluginGetError: sl@0: { sl@0: TRAP(err,aRequest.WriteParam1L(errCodeDes)); sl@0: TRAP(err,aRequest.WriteParam2L(lineNumberDes)); sl@0: break; sl@0: } sl@0: case KPluginToggleIntercepts: sl@0: { sl@0: iInterceptsEnabled ^= 1; //toggle intercepts; sl@0: TRAP(err,aRequest.WriteParam1L(interceptStatusDes)); sl@0: break; sl@0: } sl@0: case KPluginSetDirFullName: sl@0: { sl@0: //This is necessary as at present we have no way of getting the name of sl@0: //a directory! sl@0: TRAP(err,aRequest.ReadParam1L(dirnamePckg)); sl@0: break; sl@0: } sl@0: default: sl@0: break; sl@0: } sl@0: sl@0: return err; sl@0: } sl@0: sl@0: TInt CModifierPluginConn::DoControl(CFsPluginConnRequest& aRequest) sl@0: { sl@0: return ((CModifierPlugin*)Plugin())->FsPluginDoControlL(aRequest); sl@0: } sl@0: sl@0: void CModifierPluginConn::DoRequest(CFsPluginConnRequest& aRequest) sl@0: { sl@0: TInt r = DoControl(aRequest); sl@0: aRequest.Complete(r); sl@0: } sl@0: sl@0: void CModifierPluginConn::DoCancel(TInt /*aReqMask*/) sl@0: { sl@0: } sl@0: sl@0: //factory functions sl@0: sl@0: class CModifierPluginFactory : public CFsPluginFactory sl@0: { sl@0: public: sl@0: CModifierPluginFactory(); sl@0: virtual TInt Install(); sl@0: virtual CFsPlugin* NewPluginL(); sl@0: virtual CFsPlugin* NewPluginConnL(); sl@0: virtual TInt UniquePosition(); sl@0: }; sl@0: sl@0: /** sl@0: Constructor for the plugin factory sl@0: @internalComponent sl@0: */ sl@0: CModifierPluginFactory::CModifierPluginFactory() sl@0: { sl@0: } sl@0: sl@0: /** sl@0: Install function for the plugin factory sl@0: @internalComponent sl@0: */ sl@0: TInt CModifierPluginFactory::Install() sl@0: { sl@0: SetSupportedDrives(KPluginSupportAllDrives); sl@0: //iSupportedDrives = 1<<23; sl@0: return(SetName(&KModifierPluginName)); sl@0: } sl@0: sl@0: /** sl@0: @internalComponent sl@0: */ sl@0: TInt CModifierPluginFactory::UniquePosition() sl@0: { sl@0: return(KModifierPos); sl@0: } sl@0: sl@0: /** sl@0: Plugin factory function sl@0: @internalComponent sl@0: */ sl@0: CFsPlugin* CModifierPluginFactory::NewPluginL() sl@0: sl@0: { sl@0: return CModifierPlugin::NewL(); sl@0: } sl@0: sl@0: /** sl@0: Plugin factory function sl@0: @internalComponent sl@0: */ sl@0: CFsPlugin* CModifierPluginFactory::NewPluginConnL() sl@0: sl@0: { sl@0: return CModifierPlugin::NewL(); sl@0: } sl@0: sl@0: /** sl@0: Create a new Plugin sl@0: @internalComponent sl@0: */ sl@0: extern "C" { sl@0: sl@0: EXPORT_C CFsPluginFactory* CreateFileSystem() sl@0: { sl@0: return(new CModifierPluginFactory()); sl@0: } sl@0: } sl@0: