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(); } }
/** Delivers the request to the end of plugin thread's queue. In certain circumstances, where the request requires priority handling it adds it to the front of the queue. @param aRequest: The request to be delivered @return KErrNone */ EXPORT_C TInt CFsPlugin::Deliver(TFsPluginRequest& aRequest) { __ASSERT_ALWAYS(iThreadP != NULL, User::Panic(_L("CFsPlugin::Dispatch"),999)); TInt function = aRequest.Function(); if(function == EFsPluginOpen) { // Don't dispatch open requests to the plugin thread return KPluginMessageForward; } if(function == EFsPluginDoRequest || function == EFsPluginDoControl || function == EFsPluginDoCancel) { iThreadP->DeliverFront(aRequest.Request()); } else { iThreadP->DeliverBack(aRequest.Request()); } return KErrNone; }
/** Handle requests to Dismount the plugin only. This plugin is designed such that its removal is not allowed. @internalComponent */ TInt CUnremovablePlugin::DoRequestL(TFsPluginRequest& aRequest) { TInt err = KErrNone; TInt function = aRequest.Function(); if (aRequest.IsPostOperation()) { _LOG2(_L("CUnremovablePlugin post intercept for function %d"), function); //We should never get here //Is it even correct to post-intercept a EFsDismountPlugin ?? User::Invariant(); } else { _LOG2(_L("CUnremovablePlugin pre intercept for function %d"), function); //If a user is trying to dismount this plugin and this plugin doesn't want //to be dismounted then we should eb able to intecept this and return KErrAccessDenied or some //appropriate error code. if(iRemovable) { return KErrNone; } else { return KErrPermissionDenied; } } return err; }
/** @internalComponent */ TInt CTestHexHook::DoRequestL(TFsPluginRequest& aRequest) { TInt err = KErrNotSupported; TInt function = aRequest.Function(); iDrvNumber = aRequest.DriveNumber(); switch(function) { case EFsFileOpen: err = HexFileOpen(aRequest); break; case EFsFileRead: // Post intercept does nothing except prove that it is possible and that no deadlock occurs. // plugin always calls FileRead() when receiving a EFsFileRead, and so the mesage gets completed // by the plugin and has to be post intercepted by the plugin (if registered to post-intercept the request) // and any plugins above it. if (!(aRequest.IsPostOperation())) err = HexFileRead(aRequest); break; default: break; } return err; }
/** @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(); } }
/** Validate that nobody is trying to touch the virus scanner files. @internalComponent @return A value depending on whethe the virus scanner files are being fiddled with. @param aDriveNum The drive number of the request which called into the test virus scanning hook. @param aName The full pathname of the file being accessed by the request to the file server hook. */ TInt CTestVirusHook::ValidateRequest(TFsPluginRequest& aRequest, TFileName& aFileName) { TInt driveNumber = aRequest.DriveNumber(); TInt err = GetName(&aRequest, aFileName); if(err != KErrNone) return(err); if (driveNumber == EDriveC) { TInt r = aFileName.Find(_L("\\virusdef.txt")); if (r != KErrNotFound) { //Do not allow the deletion of the virus definition file. return KErrAccessDenied; } r = aFileName.Find(_L("\\system\\libs\\t_vshook.pxt")); if (r != KErrNotFound) { //Do not allow the deletion of the this dll return KErrAccessDenied; } r = aFileName.Find(_L("\\sys\\bin\\t_vshook.pxt")); if (r != KErrNotFound) { //Do not allow the deletion of the this dll return KErrAccessDenied; } } return KErrNone; }
/** Handle requests @internalComponent */ TInt CTemplatePlugin::DoRequestL(TFsPluginRequest& aRequest) { TInt err = KErrNone; TInt function = aRequest.Function(); if (aRequest.IsPostOperation()) { _LOG2(_L("CTemplatePlugin post intercept for function %d"), function); } else { _LOG2(_L("CTemplatePlugin pre intercept for function %d"), function); } return err; }
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(); } }
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::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(); } }
/** @internalComponent */ void CPreModifierPlugin::FsDirReadPackedL(TFsPluginRequest& aRequest) { if (aRequest.IsPostOperation()) { _LOG(_L("CPreModifierPlugin::FsDirReadPackedL, post intercept")); } else { User::Invariant(); } }
/** @internalComponent */ void CPreModifierPlugin::FsFileSubCloseL(TFsPluginRequest& aRequest) { if (aRequest.IsPostOperation()) { _LOG(_L("CPreModifierPlugin::FsFileSubCloseL, 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(); } }
/** @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(); } }
/** @internalTechnology @prototype @deprecated Pushes a msgop, dispatches it and waits for it to complete */ TInt CFsPlugin::DispatchOperation(TFsPluginRequest& aRequest, TDes8& aDes, TInt64 aPos, TInt aFunction) { if (aRequest.Function() != EFsFileRead && aRequest.Function() != EFsFileWrite) return KErrNotSupported; if (aFunction != EFsFileRead && aFunction != EFsFileWrite) return KErrNotSupported; CFsMessageRequest& msgRequest = * (CFsMessageRequest*) aRequest.Request(); TInt len = aDes.Length(); if (len <= 0) return CFsRequest::EReqActionComplete; TUint8* ptr = (TUint8*) aDes.Ptr(); TInt r = msgRequest.PushOperation( aPos, len, ptr, 0, // aOffset Complete, // callback 0, // next state aFunction); if (r != KErrNone) return r; CFsPlugin* plugin = this; FsPluginManager::ReadLockChain(); FsPluginManager::NextPlugin(plugin, &msgRequest); msgRequest.iCurrentPlugin = plugin; msgRequest.Dispatch(); FsPluginManager::UnlockChain(); iThreadP->OperationLockWait(); aDes.SetLength(len); return msgRequest.LastError(); // KErrNone; }
/** @internalComponent */ TInt CTestVirusHook::DoRequestL(TFsPluginRequest& aRequest) { TInt err = KErrNotSupported; TInt function = aRequest.Function(); iDrvNumber = aRequest.DriveNumber(); switch(function) { case EFsFileOpen: err = VsFileOpen(aRequest); break; case EFsFileSubClose: VsFileClose(aRequest); break; case EFsFileRename: case EFsRename: case EFsReplace: err = VsFileRename(aRequest); break; case EFsDelete: err = VsFileDelete(aRequest); break; case EFsReadFileSection: err = VsReadFileSection(aRequest); break; default: break; } return err; }
/** @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(); } }
/** @prototype @deprecated @see RFilePlugin::Read */ EXPORT_C TInt CFsPlugin::FileRead(TFsPluginRequest& aRequest, TDes8& aDes, TInt64 aPos) { CFileShare* share; CFileCB* file; GetFileFromScratch((CFsMessageRequest*) aRequest.Request(), share, file); TInt64 fileSize = file->CachedSize64(); if (aPos > fileSize) aPos = fileSize; TInt len = aDes.Length(); if (aPos >= fileSize) len = 0; if (aPos + len > fileSize) // filesize - pos shall of TInt size // Hence to suppress warning len = (TInt)(fileSize - aPos); aDes.SetLength(len); return DispatchOperation(aRequest, aDes, aPos, EFsFileRead); }
/** @prototype */ EXPORT_C TInt CFsPlugin::ClientRead(TFsPluginRequest& aRequest, TDes8& aDes, TInt aOffset) { CFsMessageRequest& msgRequest = * (CFsMessageRequest*) aRequest.Request(); TMsgOperation& currentOperation = msgRequest.CurrentOperation(); TInt r = KErrNone; if (currentOperation.iClientRequest) { r = msgRequest.Read(0, aDes, aOffset); } else { TInt len = aDes.Length(); if (len > (currentOperation.iReadWriteArgs.iTotalLength - aOffset)) return KErrArgument; aDes.Copy ( (TUint8*) currentOperation.iReadWriteArgs.iData + aOffset, len ); currentOperation.iReadWriteArgs.iOffset = aOffset + len; } return r; }
/** Handle requests @internalComponent */ TInt CExclusiveAccessPlugin::DoRequestL(TFsPluginRequest& aRequest) { TInt err = KErrNone; TInt function = aRequest.Function(); switch(function) { case EFsFileRead: err = FsFileReadL(aRequest); break; case EFsFileWrite: err = FsFileWriteL(aRequest); break; default: //Only registered for Read/Write break; } return err; }
/** Handle requests @internalComponent */ TInt CStacked3Plugin::DoRequestL(TFsPluginRequest& aRequest) { TInt err = KErrNone; TInt function = aRequest.Function(); switch(function) { case EFsFileRead: break; case EFsFileWrite: TRAP(err, FsFileWriteL(aRequest)); break; default: break; } return err; }
/** @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(); } }
/** 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; }
/*Test to ensure that when a file has been opened for exclusive access, * i.e. readonly, that froma plugin we can still read from it */ TInt CExclusiveAccessPlugin::FsFileReadL(TFsPluginRequest& aRequest) { if(!aRequest.IsPostOperation()) // pre-operation { RFilePlugin file(aRequest); TInt err = file.AdoptFromClient(); iLastError = err; iLineNumber = __LINE__; if(err!=KErrNone) return err; TInt64 pos; err = aRequest.Read(TFsPluginRequest::EPosition, pos); // get pos iLastError = err; iLineNumber = __LINE__; if(err!=KErrNone) return err; TInt length; err = aRequest.Read(TFsPluginRequest::ELength, length); //get length iLastError = err; iLineNumber = __LINE__; if(err!=KErrNone) return err; if(length>265) length=256; //we should check that this file is in fact registered as read only? //if not.. User::Invariant()? TEntry entry; RFsPlugin rfsplugin(aRequest); err = rfsplugin.Connect(); iLastError = err; iLineNumber = __LINE__; if(err!=KErrNone) return err; TFileName fileName; err = aRequest.FileName(fileName); iLastError = err; iLineNumber = __LINE__; if(err!=KErrNone) return err; err = rfsplugin.Entry(fileName, entry); iLastError = err; iLineNumber = __LINE__; if(err!=KErrNone) return err; //can we read a readonly file? - should be fine. TBuf8<256> data; err = file.Read(pos,data,length); iLastError = err; iLineNumber = __LINE__; if(err!=KErrNone) return err; file.Close(); rfsplugin.Close(); } return KErrNone; }
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::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(); } }
/*Test to ensure that when a file has been opened for exclusive access, * i.e. readonly, that from a plugin we can still write to it regardless */ TInt CExclusiveAccessPlugin::FsFileWriteL(TFsPluginRequest& aRequest) { if(!aRequest.IsPostOperation()) // pre-operation { //Make sure that the file is read only. RFilePlugin file(aRequest); TInt err = file.AdoptFromClient(); iLastError = err; iLineNumber = __LINE__; if(err!=KErrNone) return err; RFsPlugin rfsplugin(aRequest); err = rfsplugin.Connect(); iLastError = err; iLineNumber = __LINE__; if(err!=KErrNone) return err; TEntry entry; err = rfsplugin.Entry(aRequest.Src().FullName(), entry); iLastError = err; iLineNumber = __LINE__; if(err!=KErrNone) return err; // if(!entry.IsReadOnly()) // { // //this test should only being being used for read only files. // User::Invariant(); // } TInt64 pos; err = aRequest.Read(TFsPluginRequest::EPosition, pos); //get pos iLastError = err; iLineNumber = __LINE__; if(err!=KErrNone) return err; TInt length; err = aRequest.Read(TFsPluginRequest::ELength, length); //get length iLastError = err; iLineNumber = __LINE__; if(err!=KErrNone) return err; TBuf8<1024> data; err = aRequest.Read(TFsPluginRequest::EData, data); //get data to write iLastError = err; iLineNumber = __LINE__; if(err!=KErrNone) return err; //Now test that we can actually write to this read-only file //Should pass, kerrnone. err = file.Write(pos,data,length); iLastError = err; iLineNumber = __LINE__; if(err!=KErrNone) return err; file.Close(); //We've performed the efsfilewrite, so return kerrcompletion. return KErrCompletion; } return KErrNone; }
/** @internalComponent */ void CStacked3Plugin::FsFileWriteL(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("CStacked3Plugin::FsFileWriteL, file: %S, pos: %d, length: %d"), &filename, pos, length); if (aRequest.IsPostOperation()) { _LOG(_L("CStacked3Plugin::FsFileWriteL, post intercept")); } else { _LOG(_L("CStacked3Plugin::FsFileWriteL, pre intercept")); //set up test data for plugin TBuf8<20> wbuffer; wbuffer.Copy(_L8("HELLO WORLD SYMBIAN")); TInt length = wbuffer.Length(); HBufC8* tempBuf = HBufC8::NewMaxLC(length); TPtr8 tempBufPtr((TUint8 *)tempBuf->Des().Ptr(), length, length); RFilePlugin fileplugin(aRequest); err = fileplugin.AdoptFromClient(); iLastError = err; iLineNumber = __LINE__; if(err!=KErrNone) User::Leave(err); //trapped in DoRequestL //write to file err = fileplugin.Write(pos, wbuffer); _LOG2(_L("CStacked3Plugin::FsFileWriteL, RFilePlugin::Write returned %d"), err); iLastError = err; iLineNumber = __LINE__; if(err!=KErrNone) User::Leave(err); //trapped in DoRequestL //read from file err = fileplugin.Read(pos, tempBufPtr); _LOG2(_L("CStackedPlugin::FsFileWriteL, 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(); // send request down the stack User::Leave(KErrCompletion); } }