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 "combinational_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: CCombinationalPlugin* CCombinationalPlugin::NewL() sl@0: { sl@0: CCombinationalPlugin* self = new(ELeave) CCombinationalPlugin; 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: CCombinationalPlugin::CCombinationalPlugin() : iInterceptsEnabled(EFalse), sl@0: iLogging(ETrue) sl@0: { sl@0: } sl@0: sl@0: sl@0: void CCombinationalPlugin::ConstructL() sl@0: { sl@0: //iFile = RFilePlugin::Open(); sl@0: } sl@0: sl@0: /** sl@0: The destructor for the plugin sl@0: @internalComponent sl@0: */ sl@0: CCombinationalPlugin::~CCombinationalPlugin() sl@0: { sl@0: } sl@0: sl@0: /** sl@0: Initialise the plugin. sl@0: @internalComponent sl@0: */ sl@0: void CCombinationalPlugin::InitialiseL() sl@0: { sl@0: _LOG(_L("CCombinationalPlugin InitialiseL")); sl@0: EnableInterceptsL(); sl@0: } sl@0: sl@0: /** sl@0: Enable the plugin's intercepts. sl@0: @internalComponent sl@0: */ sl@0: void CCombinationalPlugin::EnableInterceptsL() sl@0: { sl@0: if (iInterceptsEnabled) return; sl@0: sl@0: User::LeaveIfError(RegisterIntercept(EFsFileRead, EPrePostIntercept)); sl@0: User::LeaveIfError(RegisterIntercept(EFsFileWrite, EPrePostIntercept)); sl@0: User::LeaveIfError(RegisterIntercept(EFsDirOpen, EPrePostIntercept)); sl@0: User::LeaveIfError(RegisterIntercept(EFsFileLock, EPrePostIntercept)); sl@0: User::LeaveIfError(RegisterIntercept(EFsFileUnLock, EPrePostIntercept)); sl@0: User::LeaveIfError(RegisterIntercept(EFsFileSeek, EPrePostIntercept)); sl@0: User::LeaveIfError(RegisterIntercept(EFsFileSize, EPrePostIntercept)); sl@0: User::LeaveIfError(RegisterIntercept(EFsFileSetSize, EPrePostIntercept)); sl@0: User::LeaveIfError(RegisterIntercept(EFsDirReadOne, EPrePostIntercept)); sl@0: User::LeaveIfError(RegisterIntercept(EFsDirReadPacked, EPrePostIntercept)); sl@0: User::LeaveIfError(RegisterIntercept(EFsFileOpen, EPrePostIntercept)); sl@0: User::LeaveIfError(RegisterIntercept(EFsFileCreate, EPrePostIntercept)); sl@0: User::LeaveIfError(RegisterIntercept(EFsFileReplace, EPrePostIntercept)); sl@0: User::LeaveIfError(RegisterIntercept(EFsFileRename, EPrePostIntercept)); sl@0: User::LeaveIfError(RegisterIntercept(EFsReadFileSection, EPrePostIntercept)); sl@0: User::LeaveIfError(RegisterIntercept(EFsFileSubClose, EPrePostIntercept)); sl@0: User::LeaveIfError(RegisterIntercept(EFsEntry, EPrePostIntercept)); sl@0: User::LeaveIfError(RegisterIntercept(EFsSetEntry, EPrePostIntercept)); sl@0: sl@0: _LOG(_L("Combinational 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 CCombinationalPlugin::DisableInterceptsL() sl@0: { sl@0: if (!iInterceptsEnabled) return; sl@0: sl@0: User::LeaveIfError(UnregisterIntercept(EFsFileRead, EPrePostIntercept)); sl@0: User::LeaveIfError(UnregisterIntercept(EFsFileRename, EPrePostIntercept)); sl@0: User::LeaveIfError(UnregisterIntercept(EFsFileWrite, EPrePostIntercept)); sl@0: User::LeaveIfError(UnregisterIntercept(EFsDirOpen, EPrePostIntercept)); sl@0: User::LeaveIfError(UnregisterIntercept(EFsFileLock, EPrePostIntercept)); sl@0: User::LeaveIfError(UnregisterIntercept(EFsFileUnLock, EPrePostIntercept)); sl@0: User::LeaveIfError(UnregisterIntercept(EFsFileSeek, EPrePostIntercept)); sl@0: User::LeaveIfError(UnregisterIntercept(EFsFileSize, EPrePostIntercept)); sl@0: User::LeaveIfError(UnregisterIntercept(EFsFileSetSize, EPrePostIntercept)); sl@0: User::LeaveIfError(UnregisterIntercept(EFsFileCreate, EPrePostIntercept)); sl@0: User::LeaveIfError(UnregisterIntercept(EFsFileOpen, EPrePostIntercept)); sl@0: User::LeaveIfError(UnregisterIntercept(EFsFileReplace, EPrePostIntercept)); sl@0: User::LeaveIfError(UnregisterIntercept(EFsFileSubClose, EPrePostIntercept)); sl@0: User::LeaveIfError(UnregisterIntercept(EFsReadFileSection, EPrePostIntercept)); sl@0: User::LeaveIfError(UnregisterIntercept(EFsDirReadOne, EPrePostIntercept)); sl@0: User::LeaveIfError(UnregisterIntercept(EFsDirReadPacked, EPrePostIntercept)); sl@0: User::LeaveIfError(UnregisterIntercept(EFsEntry, EPrePostIntercept)); sl@0: User::LeaveIfError(UnregisterIntercept(EFsSetEntry, EPrePostIntercept)); sl@0: sl@0: _LOG(_L("Combinational 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 CCombinationalPlugin::DoRequestL(TFsPluginRequest& aRequest) sl@0: { sl@0: TInt r = KErrNone; sl@0: TInt function = aRequest.Function(); sl@0: sl@0: if (aRequest.IsPostOperation()) sl@0: { sl@0: _LOG2(_L("CCombinationalPlugin post intercept for function %d"), function); sl@0: } sl@0: else sl@0: { sl@0: _LOG2(_L("CCombinationalPlugin pre intercept for function %d"), function); sl@0: } sl@0: sl@0: switch (function) sl@0: { sl@0: case EFsFileOpen: sl@0: r= DoFileOpen(aRequest); sl@0: break; sl@0: case EFsFileSubClose: sl@0: r = DoFileSubClose(aRequest); sl@0: break; sl@0: case EFsFileReplace: sl@0: r = DoFileReplace(aRequest); sl@0: break; sl@0: case EFsEntry: sl@0: r = DoEntry(aRequest); sl@0: break; sl@0: case EFsDirReadPacked: sl@0: r = DoDirReadPacked(aRequest); sl@0: break; sl@0: case EFsDirOpen: sl@0: aRequest.Src(); sl@0: break; sl@0: default: sl@0: break; sl@0: } sl@0: return r; sl@0: } sl@0: sl@0: sl@0: sl@0: sl@0: TInt CCombinationalPlugin::DoFileRead(TFsPluginRequest& /*aRequest*/) sl@0: { sl@0: iLastError = KErrNotSupported; sl@0: iLineNumber = __LINE__; sl@0: return KErrNotSupported; sl@0: } sl@0: TInt CCombinationalPlugin::DoFileWrite(TFsPluginRequest& /*aRequest*/) sl@0: { sl@0: iLastError = KErrNotSupported; sl@0: iLineNumber = __LINE__; sl@0: return KErrNotSupported; sl@0: } sl@0: sl@0: /* sl@0: Test - Perform an Open here, sl@0: then make sure we get the right details in the second plugin. sl@0: */ sl@0: TInt CCombinationalPlugin::DoEntry(TFsPluginRequest& aRequest) sl@0: { sl@0: TInt err = KErrNone; sl@0: TFileName name; 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.entry.combi")); sl@0: sl@0: name = aRequest.Src().FullName(); sl@0: sl@0: if(!aRequest.IsPostOperation()) //pre sl@0: { sl@0: err = KErrNone; sl@0: sl@0: TBuf<256> clientfilename; sl@0: clientfilename.Append(iDriveToTest); sl@0: clientfilename.Append(_L(":\\combi.txt")); sl@0: sl@0: if(name.Compare(clientfilename) == 0) sl@0: { sl@0: RFilePlugin file(aRequest); sl@0: err = file.Replace(testfilename1, EFileWrite);//open sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: return err; sl@0: sl@0: file.Close(); sl@0: } sl@0: sl@0: } sl@0: else //post sl@0: { sl@0: TEntry entry; sl@0: TPckg entryPckg(entry); sl@0: err = aRequest.Read(TFsPluginRequest::EEntry, entryPckg); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: return err; sl@0: } sl@0: sl@0: return err; sl@0: } sl@0: sl@0: TInt CCombinationalPlugin::DoDirReadPacked(TFsPluginRequest& aRequest) sl@0: { sl@0: TInt err = KErrNone; sl@0: sl@0: TBuf<16> compareName; sl@0: compareName.Append(iDriveToTest); sl@0: compareName.Append(_L(":\\dir3\\")); sl@0: if(iDirFullName.Compare(compareName) == 0) sl@0: { sl@0: return KErrNone; sl@0: } sl@0: sl@0: if (aRequest.IsPostOperation()) //Post sl@0: { sl@0: // NOP sl@0: } sl@0: else //Pre sl@0: { sl@0: RDirPlugin dir1(aRequest); sl@0: err = dir1.Open(iDirFullName, KEntryAttMatchMask); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: return err; sl@0: sl@0: TBuf<16> dirname2; sl@0: dirname2.Append(iDriveToTest); sl@0: dirname2.Append(_L(":\\dir2\\")); sl@0: sl@0: TEntryArray entryarray1; sl@0: err = dir1.Read(entryarray1); //we can complete sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone && err!=KErrEof) sl@0: return err; sl@0: sl@0: TUidType uid(TUid::Null(),TUid::Null(),TUid::Null()); sl@0: sl@0: RDirPlugin dir2(aRequest); sl@0: err = dir2.Open(dirname2,uid); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: return err; sl@0: sl@0: TEntryArray entryarray2; sl@0: err = dir2.Read(entryarray2); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone && err!=KErrEof) sl@0: return err; sl@0: sl@0: if(entryarray1.Count() >= 1 && entryarray2.Count() >= 1) sl@0: { sl@0: TEntry e1 = entryarray1[0]; sl@0: sl@0: TBuf<16> dir1file; sl@0: dir1file.Append(_L("dir1.file")); sl@0: if(e1.iName.Compare(dir1file) != 0) sl@0: { sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: return err; sl@0: } sl@0: } sl@0: else sl@0: { sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: return err; sl@0: } sl@0: sl@0: TBuf<16> dirname3; sl@0: dirname3.Append(iDriveToTest); sl@0: dirname3.Append(_L(":\\dir3\\")); sl@0: sl@0: TRawEntryArray entryarray3; sl@0: RDirPlugin dir3(aRequest); sl@0: TUidType uid3(TUid::Null(), TUid::Null(), TUid::Null()); sl@0: err = dir3.Open(dirname3,uid3); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: return err; sl@0: sl@0: err = dir3.Read(entryarray3); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone && err!=KErrEof) sl@0: return err; sl@0: sl@0: err = aRequest.Write(TFsPluginRequest::EEntryArray,entryarray3.Buf()); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: return err; sl@0: sl@0: dir1.Close(); sl@0: dir2.Close(); sl@0: dir3.Close(); sl@0: sl@0: return KErrCompletion; sl@0: } sl@0: sl@0: return err; sl@0: } sl@0: sl@0: sl@0: /* sl@0: sl@0: Test 1 - This test opens 3 files and reads their contents (which was written in the test harness) sl@0: sl@0: Test 2 - sl@0: sl@0: */ sl@0: TInt CCombinationalPlugin::DoFileOpen(TFsPluginRequest& aRequest) sl@0: { sl@0: //intercept open sl@0: TInt err = KErrNone; sl@0: sl@0: if (aRequest.IsPostOperation()) //Post sl@0: { sl@0: //Start of test sl@0: RFilePlugin file(aRequest); sl@0: err = file.AdoptFromClient(); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: return err; sl@0: sl@0: TFileName filename; sl@0: filename.FillZ(); sl@0: sl@0: //TODO: get rid of this? sl@0: #ifdef __WINS__ sl@0: _LIT(KSecondFile,"X:\\combi1.txt"); sl@0: #else sl@0: _LIT(KSecondFile,"D:\\combi1.txt"); sl@0: #endif sl@0: sl@0: filename.SetLength(KSecondFile().Length()); sl@0: filename.Replace(0,KSecondFile().Length(),KSecondFile()); sl@0: sl@0: TUint mode; sl@0: err = aRequest.Read(TFsPluginRequest::EMode, mode); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: return err; sl@0: sl@0: //try to open a second file. sl@0: err = file.Open(filename, mode); sl@0: sl@0: //NEGATIVE TESTING: sl@0: if(err!=KErrBadHandle) sl@0: { sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: return err; sl@0: } sl@0: sl@0: RFilePlugin file2(aRequest); sl@0: err = file2.Open(filename, mode); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: return err; sl@0: sl@0: //Lets write something sl@0: TBuf8<64> combi1Buf; sl@0: combi1Buf.SetLength(10); sl@0: err = file2.Read(0,combi1Buf,6); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: return err; sl@0: sl@0: // second file is open. sl@0: // lets be wild and open a third! sl@0: filename.FillZ(); sl@0: sl@0: //TODO: Get rid of this? sl@0: #ifdef __WINS__ sl@0: _LIT(KThirdFile,"X:\\combi2.txt"); sl@0: #else sl@0: _LIT(KThirdFile,"D:\\combi2.txt"); sl@0: #endif sl@0: sl@0: filename.SetLength(KThirdFile().Length()); sl@0: filename.Replace(0,KThirdFile().Length(),KThirdFile()); sl@0: sl@0: RFilePlugin file3(aRequest); sl@0: err = file3.Open(filename, mode); sl@0: User::LeaveIfError(err); sl@0: sl@0: TBuf8<64> combi2Buf; sl@0: combi2Buf.SetLength(20); sl@0: err = file3.Read(0, combi2Buf, 18); sl@0: User::LeaveIfError(err); sl@0: sl@0: _LOG2(_L("combi1Buf := %S"),&combi1Buf); sl@0: _LOG2(_L("combi2Buf := %S"),&combi2Buf); sl@0: sl@0: err = combi1Buf.Compare(combi2Buf); sl@0: if(err != 0) // is equal sl@0: { sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: return err; sl@0: } sl@0: sl@0: // Right, best close these then eh? sl@0: sl@0: //close in different order - should be fine. sl@0: file2.Close(); sl@0: file.Close(); sl@0: file3.Close(); sl@0: sl@0: return KErrNone; sl@0: } sl@0: else // PRE sl@0: { sl@0: RFilePlugin file(aRequest); sl@0: sl@0: TFileName filename; sl@0: sl@0: sl@0: filename = aRequest.Src().FullName(); sl@0: sl@0: TUint mode; sl@0: err = aRequest.Read(TFsPluginRequest::EMode, mode); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: return err; sl@0: sl@0: // Combinational test 1) Try to perform an RfilePlugin:Open on the same file. sl@0: err = file.Open(filename, mode); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: return err; sl@0: sl@0: err = file.TransferToClient(); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: return err; sl@0: sl@0: file.Close(); sl@0: sl@0: return KErrCompletion; sl@0: } sl@0: } sl@0: sl@0: TInt CCombinationalPlugin::DoFileSubClose(TFsPluginRequest& aRequest) sl@0: { sl@0: TInt err = KErrNone; sl@0: if (aRequest.IsPostOperation()) sl@0: { sl@0: } sl@0: else sl@0: { //PRE sl@0: RFilePlugin file(aRequest); sl@0: err = file.AdoptFromClient(); //This is weird but it follows the open/close pattern; sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: return err; sl@0: file.Close(); sl@0: } sl@0: return err; sl@0: } sl@0: sl@0: /* sl@0: * This test is testing the following scenario : sl@0: * sl@0: Intercept Replace: sl@0: plugin: replace file1, write to file1,replace file2, write to file2, rfsplugin.delete file3, create file3, write3, read, compare, close, read, compare 2, close, read, compare 1, close. sl@0: (basically, open/replace/create 3 files, write to them and read back from them and check the contents) sl@0: */ sl@0: TInt CCombinationalPlugin::DoFileReplace(TFsPluginRequest& aRequest) sl@0: { sl@0: TInt err = KErrNone; 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(":\\combiReplace2.txt")); sl@0: sl@0: testfilename2.Append(iDriveToTest); sl@0: testfilename2.Append(_L(":\\combiReplace3.txt")); sl@0: sl@0: if (aRequest.IsPostOperation()) //POST sl@0: { sl@0: } sl@0: else //PRE sl@0: { sl@0: TFileName filename; sl@0: filename = aRequest.Src().FullName(); sl@0: sl@0: RFsPlugin rfs(aRequest); sl@0: err = rfs.Connect(); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: return err; sl@0: sl@0: //rfs.Delete(aRequest,filename); sl@0: sl@0: RFilePlugin file(aRequest); sl@0: sl@0: TUint mode = 0; sl@0: err = aRequest.Read(TFsPluginRequest::EMode, mode); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: return err; sl@0: sl@0: err = file.Replace(filename, mode); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: return err; sl@0: sl@0: //we have replace/opened our file, now lets write to it. sl@0: sl@0: TBuf8<64> writeData; sl@0: writeData.FillZ(64); sl@0: writeData.Copy(_L8("0123456789")); sl@0: err = file.Write(0, writeData, 10); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: return err; sl@0: sl@0: //Now lets EFsFileReplace another file sl@0: TFileName secondName; sl@0: secondName.Append(testfilename1); sl@0: RFilePlugin file2(aRequest); sl@0: err = file2.Replace(secondName, mode); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: return err; sl@0: sl@0: //Now lets write to it. sl@0: TBuf8<64> writeData2; sl@0: writeData2.FillZ(64); sl@0: writeData2.Copy(_L8("9876543210")); sl@0: err = file2.Write(0,writeData2,10); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: return err; sl@0: sl@0: //Now lets open another file. sl@0: TFileName thirdFile; sl@0: thirdFile.Append(testfilename2); sl@0: err = rfs.Delete(thirdFile); sl@0: if(err == KErrNotFound) sl@0: err = KErrNone; sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: return err; sl@0: sl@0: RFilePlugin file3(aRequest); sl@0: err = file3.Create(thirdFile, EFileWrite); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: return err; sl@0: sl@0: //Now lets write to it. sl@0: TBuf8<64> writeData3; sl@0: writeData3.FillZ(64); sl@0: writeData3.Copy(_L8("3333333333")); sl@0: err = file3.Write(0,writeData3,10); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: return err; sl@0: sl@0: // Now we need to read the data and make sure that the correct data is in the correct files, sl@0: // this check probably needs to be checked from RFile/test_harness as well. sl@0: TBuf8<64> readData3; sl@0: readData3.SetLength(10); sl@0: err = file3.Read(0, readData3, 10); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: return err; sl@0: sl@0: err = readData3.Compare(writeData3); sl@0: if(err != KErrNone) sl@0: { sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: return err; sl@0: } sl@0: sl@0: //close file 3 sl@0: file3.Close(); sl@0: sl@0: // read from file2 sl@0: TBuf8<64> readData2; sl@0: readData2.SetLength(10); sl@0: err = file2.Read(0, readData2, 10); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: return err; sl@0: sl@0: err = readData2.Compare(writeData2); sl@0: if(err != KErrNone) sl@0: { sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: return err; sl@0: } sl@0: sl@0: //close file 2 sl@0: file2.Close(); sl@0: sl@0: // read from file1 sl@0: TBuf8<64> readData1; sl@0: readData1.SetLength(10); sl@0: err = file.Read(0, readData1, 10); sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: if(err!=KErrNone) sl@0: return err; sl@0: sl@0: err = readData1.Compare(writeData); sl@0: if(err != KErrNone) sl@0: { sl@0: iLastError = err; sl@0: iLineNumber = __LINE__; sl@0: return err; sl@0: } sl@0: sl@0: file.TransferToClient(); sl@0: sl@0: rfs.Close(); sl@0: sl@0: return KErrCompletion; sl@0: sl@0: } sl@0: return err; sl@0: } sl@0: sl@0: sl@0: CFsPluginConn* CCombinationalPlugin::NewPluginConnL() sl@0: { sl@0: return new(ELeave) CCombinationalPluginConn(); sl@0: } sl@0: sl@0: sl@0: //Synchronous RPlugin::DoControl sl@0: TInt CCombinationalPlugin::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: TInt function = aRequest.Function(); sl@0: TPckg drive(iDriveToTest); sl@0: typedef TBuf<256> TDirName; sl@0: TPckg dirnamePckg(iDirFullName); sl@0: TPckg errCodeDes(iLastError); sl@0: TPckg lineNumberDes(iLineNumber); sl@0: 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 KPluginSetDirFullName: sl@0: { sl@0: //This is necessary as at present we have nwo way of getting the name of sl@0: //a directory! sl@0: TRAP(err,aRequest.ReadParam1L(dirnamePckg)); 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: default: sl@0: break; sl@0: } sl@0: sl@0: return err; sl@0: } sl@0: sl@0: sl@0: TInt CCombinationalPluginConn::DoControl(CFsPluginConnRequest& aRequest) sl@0: { sl@0: return ((CCombinationalPlugin*)Plugin())->FsPluginDoControlL(aRequest); sl@0: } sl@0: sl@0: void CCombinationalPluginConn::DoRequest(CFsPluginConnRequest& aRequest) sl@0: { sl@0: DoControl(aRequest); sl@0: } sl@0: sl@0: void CCombinationalPluginConn::DoCancel(TInt /*aReqMask*/) sl@0: { sl@0: } sl@0: sl@0: sl@0: sl@0: //factory functions sl@0: sl@0: class CCombinationalPluginFactory : public CFsPluginFactory sl@0: { sl@0: public: sl@0: CCombinationalPluginFactory(); 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: CCombinationalPluginFactory::CCombinationalPluginFactory() sl@0: { sl@0: } sl@0: sl@0: /** sl@0: Install function for the plugin factory sl@0: @internalComponent sl@0: */ sl@0: TInt CCombinationalPluginFactory::Install() sl@0: { sl@0: SetSupportedDrives(KPluginSupportAllDrives); sl@0: return(SetName(&KCombinationalPluginName)); sl@0: } sl@0: sl@0: /** sl@0: @internalComponent sl@0: */ sl@0: TInt CCombinationalPluginFactory::UniquePosition() sl@0: { sl@0: return(KCombinationalPos); sl@0: } sl@0: sl@0: /** sl@0: Plugin factory function sl@0: @internalComponent sl@0: */ sl@0: CFsPlugin* CCombinationalPluginFactory::NewPluginL() sl@0: sl@0: { sl@0: return CCombinationalPlugin::NewL(); sl@0: } sl@0: sl@0: /** sl@0: Plugin factory function sl@0: @internalComponent sl@0: */ sl@0: CFsPlugin* CCombinationalPluginFactory::NewPluginConnL() sl@0: sl@0: { sl@0: return CCombinationalPlugin::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 CCombinationalPluginFactory()); sl@0: } sl@0: } sl@0: