Update contrib.
1 // Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
2 // All rights reserved.
3 // This component and the accompanying materials are made available
4 // under the terms of the License "Eclipse Public License v1.0"
5 // which accompanies this distribution, and is available
6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
8 // Initial Contributors:
9 // Nokia Corporation - initial contribution.
16 #include "combinational_plugin.h"
17 #include "plugincommon.h"
18 #include <f32pluginutils.h>
21 Leaving New function for the plugin
24 CCombinationalPlugin* CCombinationalPlugin::NewL()
26 CCombinationalPlugin* self = new(ELeave) CCombinationalPlugin;
27 CleanupStack::PushL(self);
35 Constructor for the plugin
38 CCombinationalPlugin::CCombinationalPlugin() : iInterceptsEnabled(EFalse),
44 void CCombinationalPlugin::ConstructL()
46 //iFile = RFilePlugin::Open();
50 The destructor for the plugin
53 CCombinationalPlugin::~CCombinationalPlugin()
58 Initialise the plugin.
61 void CCombinationalPlugin::InitialiseL()
63 _LOG(_L("CCombinationalPlugin InitialiseL"));
68 Enable the plugin's intercepts.
71 void CCombinationalPlugin::EnableInterceptsL()
73 if (iInterceptsEnabled) return;
75 User::LeaveIfError(RegisterIntercept(EFsFileRead, EPrePostIntercept));
76 User::LeaveIfError(RegisterIntercept(EFsFileWrite, EPrePostIntercept));
77 User::LeaveIfError(RegisterIntercept(EFsDirOpen, EPrePostIntercept));
78 User::LeaveIfError(RegisterIntercept(EFsFileLock, EPrePostIntercept));
79 User::LeaveIfError(RegisterIntercept(EFsFileUnLock, EPrePostIntercept));
80 User::LeaveIfError(RegisterIntercept(EFsFileSeek, EPrePostIntercept));
81 User::LeaveIfError(RegisterIntercept(EFsFileSize, EPrePostIntercept));
82 User::LeaveIfError(RegisterIntercept(EFsFileSetSize, EPrePostIntercept));
83 User::LeaveIfError(RegisterIntercept(EFsDirReadOne, EPrePostIntercept));
84 User::LeaveIfError(RegisterIntercept(EFsDirReadPacked, EPrePostIntercept));
85 User::LeaveIfError(RegisterIntercept(EFsFileOpen, EPrePostIntercept));
86 User::LeaveIfError(RegisterIntercept(EFsFileCreate, EPrePostIntercept));
87 User::LeaveIfError(RegisterIntercept(EFsFileReplace, EPrePostIntercept));
88 User::LeaveIfError(RegisterIntercept(EFsFileRename, EPrePostIntercept));
89 User::LeaveIfError(RegisterIntercept(EFsReadFileSection, EPrePostIntercept));
90 User::LeaveIfError(RegisterIntercept(EFsFileSubClose, EPrePostIntercept));
91 User::LeaveIfError(RegisterIntercept(EFsEntry, EPrePostIntercept));
92 User::LeaveIfError(RegisterIntercept(EFsSetEntry, EPrePostIntercept));
94 _LOG(_L("Combinational Plugin: Enabled intercepts."));
96 iInterceptsEnabled = ETrue;
100 Disable the plugin's intercepts.
103 void CCombinationalPlugin::DisableInterceptsL()
105 if (!iInterceptsEnabled) return;
107 User::LeaveIfError(UnregisterIntercept(EFsFileRead, EPrePostIntercept));
108 User::LeaveIfError(UnregisterIntercept(EFsFileRename, EPrePostIntercept));
109 User::LeaveIfError(UnregisterIntercept(EFsFileWrite, EPrePostIntercept));
110 User::LeaveIfError(UnregisterIntercept(EFsDirOpen, EPrePostIntercept));
111 User::LeaveIfError(UnregisterIntercept(EFsFileLock, EPrePostIntercept));
112 User::LeaveIfError(UnregisterIntercept(EFsFileUnLock, EPrePostIntercept));
113 User::LeaveIfError(UnregisterIntercept(EFsFileSeek, EPrePostIntercept));
114 User::LeaveIfError(UnregisterIntercept(EFsFileSize, EPrePostIntercept));
115 User::LeaveIfError(UnregisterIntercept(EFsFileSetSize, EPrePostIntercept));
116 User::LeaveIfError(UnregisterIntercept(EFsFileCreate, EPrePostIntercept));
117 User::LeaveIfError(UnregisterIntercept(EFsFileOpen, EPrePostIntercept));
118 User::LeaveIfError(UnregisterIntercept(EFsFileReplace, EPrePostIntercept));
119 User::LeaveIfError(UnregisterIntercept(EFsFileSubClose, EPrePostIntercept));
120 User::LeaveIfError(UnregisterIntercept(EFsReadFileSection, EPrePostIntercept));
121 User::LeaveIfError(UnregisterIntercept(EFsDirReadOne, EPrePostIntercept));
122 User::LeaveIfError(UnregisterIntercept(EFsDirReadPacked, EPrePostIntercept));
123 User::LeaveIfError(UnregisterIntercept(EFsEntry, EPrePostIntercept));
124 User::LeaveIfError(UnregisterIntercept(EFsSetEntry, EPrePostIntercept));
126 _LOG(_L("Combinational Plugin: Disabled intercepts."));
128 iInterceptsEnabled = EFalse;
135 TInt CCombinationalPlugin::DoRequestL(TFsPluginRequest& aRequest)
138 TInt function = aRequest.Function();
140 if (aRequest.IsPostOperation())
142 _LOG2(_L("CCombinationalPlugin post intercept for function %d"), function);
146 _LOG2(_L("CCombinationalPlugin pre intercept for function %d"), function);
152 r= DoFileOpen(aRequest);
154 case EFsFileSubClose:
155 r = DoFileSubClose(aRequest);
158 r = DoFileReplace(aRequest);
161 r = DoEntry(aRequest);
163 case EFsDirReadPacked:
164 r = DoDirReadPacked(aRequest);
178 TInt CCombinationalPlugin::DoFileRead(TFsPluginRequest& /*aRequest*/)
180 iLastError = KErrNotSupported;
181 iLineNumber = __LINE__;
182 return KErrNotSupported;
184 TInt CCombinationalPlugin::DoFileWrite(TFsPluginRequest& /*aRequest*/)
186 iLastError = KErrNotSupported;
187 iLineNumber = __LINE__;
188 return KErrNotSupported;
192 Test - Perform an Open here,
193 then make sure we get the right details in the second plugin.
195 TInt CCombinationalPlugin::DoEntry(TFsPluginRequest& aRequest)
200 TBuf<256> testfilename1;
202 //setting up test files
203 testfilename1.Append(iDriveToTest);
204 testfilename1.Append(_L(":\\data\\test.entry.combi"));
206 name = aRequest.Src().FullName();
208 if(!aRequest.IsPostOperation()) //pre
212 TBuf<256> clientfilename;
213 clientfilename.Append(iDriveToTest);
214 clientfilename.Append(_L(":\\combi.txt"));
216 if(name.Compare(clientfilename) == 0)
218 RFilePlugin file(aRequest);
219 err = file.Replace(testfilename1, EFileWrite);//open
221 iLineNumber = __LINE__;
232 TPckg<TEntry> entryPckg(entry);
233 err = aRequest.Read(TFsPluginRequest::EEntry, entryPckg);
235 iLineNumber = __LINE__;
243 TInt CCombinationalPlugin::DoDirReadPacked(TFsPluginRequest& aRequest)
247 TBuf<16> compareName;
248 compareName.Append(iDriveToTest);
249 compareName.Append(_L(":\\dir3\\"));
250 if(iDirFullName.Compare(compareName) == 0)
255 if (aRequest.IsPostOperation()) //Post
261 RDirPlugin dir1(aRequest);
262 err = dir1.Open(iDirFullName, KEntryAttMatchMask);
264 iLineNumber = __LINE__;
269 dirname2.Append(iDriveToTest);
270 dirname2.Append(_L(":\\dir2\\"));
272 TEntryArray entryarray1;
273 err = dir1.Read(entryarray1); //we can complete
275 iLineNumber = __LINE__;
276 if(err!=KErrNone && err!=KErrEof)
279 TUidType uid(TUid::Null(),TUid::Null(),TUid::Null());
281 RDirPlugin dir2(aRequest);
282 err = dir2.Open(dirname2,uid);
284 iLineNumber = __LINE__;
288 TEntryArray entryarray2;
289 err = dir2.Read(entryarray2);
291 iLineNumber = __LINE__;
292 if(err!=KErrNone && err!=KErrEof)
295 if(entryarray1.Count() >= 1 && entryarray2.Count() >= 1)
297 TEntry e1 = entryarray1[0];
300 dir1file.Append(_L("dir1.file"));
301 if(e1.iName.Compare(dir1file) != 0)
304 iLineNumber = __LINE__;
312 iLineNumber = __LINE__;
318 dirname3.Append(iDriveToTest);
319 dirname3.Append(_L(":\\dir3\\"));
321 TRawEntryArray entryarray3;
322 RDirPlugin dir3(aRequest);
323 TUidType uid3(TUid::Null(), TUid::Null(), TUid::Null());
324 err = dir3.Open(dirname3,uid3);
326 iLineNumber = __LINE__;
330 err = dir3.Read(entryarray3);
332 iLineNumber = __LINE__;
333 if(err!=KErrNone && err!=KErrEof)
336 err = aRequest.Write(TFsPluginRequest::EEntryArray,entryarray3.Buf());
338 iLineNumber = __LINE__;
346 return KErrCompletion;
355 Test 1 - This test opens 3 files and reads their contents (which was written in the test harness)
360 TInt CCombinationalPlugin::DoFileOpen(TFsPluginRequest& aRequest)
365 if (aRequest.IsPostOperation()) //Post
368 RFilePlugin file(aRequest);
369 err = file.AdoptFromClient();
371 iLineNumber = __LINE__;
378 //TODO: get rid of this?
380 _LIT(KSecondFile,"X:\\combi1.txt");
382 _LIT(KSecondFile,"D:\\combi1.txt");
385 filename.SetLength(KSecondFile().Length());
386 filename.Replace(0,KSecondFile().Length(),KSecondFile());
389 err = aRequest.Read(TFsPluginRequest::EMode, mode);
391 iLineNumber = __LINE__;
395 //try to open a second file.
396 err = file.Open(filename, mode);
399 if(err!=KErrBadHandle)
402 iLineNumber = __LINE__;
407 RFilePlugin file2(aRequest);
408 err = file2.Open(filename, mode);
410 iLineNumber = __LINE__;
414 //Lets write something
416 combi1Buf.SetLength(10);
417 err = file2.Read(0,combi1Buf,6);
419 iLineNumber = __LINE__;
423 // second file is open.
424 // lets be wild and open a third!
427 //TODO: Get rid of this?
429 _LIT(KThirdFile,"X:\\combi2.txt");
431 _LIT(KThirdFile,"D:\\combi2.txt");
434 filename.SetLength(KThirdFile().Length());
435 filename.Replace(0,KThirdFile().Length(),KThirdFile());
437 RFilePlugin file3(aRequest);
438 err = file3.Open(filename, mode);
439 User::LeaveIfError(err);
442 combi2Buf.SetLength(20);
443 err = file3.Read(0, combi2Buf, 18);
444 User::LeaveIfError(err);
446 _LOG2(_L("combi1Buf := %S"),&combi1Buf);
447 _LOG2(_L("combi2Buf := %S"),&combi2Buf);
449 err = combi1Buf.Compare(combi2Buf);
450 if(err != 0) // is equal
453 iLineNumber = __LINE__;
457 // Right, best close these then eh?
459 //close in different order - should be fine.
468 RFilePlugin file(aRequest);
473 filename = aRequest.Src().FullName();
476 err = aRequest.Read(TFsPluginRequest::EMode, mode);
478 iLineNumber = __LINE__;
482 // Combinational test 1) Try to perform an RfilePlugin:Open on the same file.
483 err = file.Open(filename, mode);
485 iLineNumber = __LINE__;
489 err = file.TransferToClient();
491 iLineNumber = __LINE__;
497 return KErrCompletion;
501 TInt CCombinationalPlugin::DoFileSubClose(TFsPluginRequest& aRequest)
504 if (aRequest.IsPostOperation())
509 RFilePlugin file(aRequest);
510 err = file.AdoptFromClient(); //This is weird but it follows the open/close pattern;
512 iLineNumber = __LINE__;
521 * This test is testing the following scenario :
524 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.
525 (basically, open/replace/create 3 files, write to them and read back from them and check the contents)
527 TInt CCombinationalPlugin::DoFileReplace(TFsPluginRequest& aRequest)
531 TBuf<256> testfilename1;
532 TBuf<256> testfilename2;
534 //setting up test files
535 testfilename1.Append(iDriveToTest);
536 testfilename1.Append(_L(":\\combiReplace2.txt"));
538 testfilename2.Append(iDriveToTest);
539 testfilename2.Append(_L(":\\combiReplace3.txt"));
541 if (aRequest.IsPostOperation()) //POST
547 filename = aRequest.Src().FullName();
549 RFsPlugin rfs(aRequest);
552 iLineNumber = __LINE__;
556 //rfs.Delete(aRequest,filename);
558 RFilePlugin file(aRequest);
561 err = aRequest.Read(TFsPluginRequest::EMode, mode);
563 iLineNumber = __LINE__;
567 err = file.Replace(filename, mode);
569 iLineNumber = __LINE__;
573 //we have replace/opened our file, now lets write to it.
577 writeData.Copy(_L8("0123456789"));
578 err = file.Write(0, writeData, 10);
580 iLineNumber = __LINE__;
584 //Now lets EFsFileReplace another file
585 TFileName secondName;
586 secondName.Append(testfilename1);
587 RFilePlugin file2(aRequest);
588 err = file2.Replace(secondName, mode);
590 iLineNumber = __LINE__;
594 //Now lets write to it.
595 TBuf8<64> writeData2;
596 writeData2.FillZ(64);
597 writeData2.Copy(_L8("9876543210"));
598 err = file2.Write(0,writeData2,10);
600 iLineNumber = __LINE__;
604 //Now lets open another file.
606 thirdFile.Append(testfilename2);
607 err = rfs.Delete(thirdFile);
608 if(err == KErrNotFound)
611 iLineNumber = __LINE__;
615 RFilePlugin file3(aRequest);
616 err = file3.Create(thirdFile, EFileWrite);
618 iLineNumber = __LINE__;
622 //Now lets write to it.
623 TBuf8<64> writeData3;
624 writeData3.FillZ(64);
625 writeData3.Copy(_L8("3333333333"));
626 err = file3.Write(0,writeData3,10);
628 iLineNumber = __LINE__;
632 // Now we need to read the data and make sure that the correct data is in the correct files,
633 // this check probably needs to be checked from RFile/test_harness as well.
635 readData3.SetLength(10);
636 err = file3.Read(0, readData3, 10);
638 iLineNumber = __LINE__;
642 err = readData3.Compare(writeData3);
646 iLineNumber = __LINE__;
655 readData2.SetLength(10);
656 err = file2.Read(0, readData2, 10);
658 iLineNumber = __LINE__;
662 err = readData2.Compare(writeData2);
666 iLineNumber = __LINE__;
675 readData1.SetLength(10);
676 err = file.Read(0, readData1, 10);
678 iLineNumber = __LINE__;
682 err = readData1.Compare(writeData);
686 iLineNumber = __LINE__;
690 file.TransferToClient();
694 return KErrCompletion;
701 CFsPluginConn* CCombinationalPlugin::NewPluginConnL()
703 return new(ELeave) CCombinationalPluginConn();
707 //Synchronous RPlugin::DoControl
708 TInt CCombinationalPlugin::FsPluginDoControlL(CFsPluginConnRequest& aRequest)
712 //We can use this to set the drive
713 //We can store this as a member of this class.
714 TInt function = aRequest.Function();
715 TPckg<TChar> drive(iDriveToTest);
716 typedef TBuf<256> TDirName;
717 TPckg<TDirName> dirnamePckg(iDirFullName);
718 TPckg<TInt> errCodeDes(iLastError);
719 TPckg<TInt> lineNumberDes(iLineNumber);
723 case KPluginSetDrive:
725 TRAP(err,aRequest.ReadParam1L(drive));
728 case KPluginSetDirFullName:
730 //This is necessary as at present we have nwo way of getting the name of
732 TRAP(err,aRequest.ReadParam1L(dirnamePckg));
735 case KPluginGetError:
737 TRAP(err,aRequest.WriteParam1L(errCodeDes));
738 TRAP(err,aRequest.WriteParam2L(lineNumberDes));
749 TInt CCombinationalPluginConn::DoControl(CFsPluginConnRequest& aRequest)
751 return ((CCombinationalPlugin*)Plugin())->FsPluginDoControlL(aRequest);
754 void CCombinationalPluginConn::DoRequest(CFsPluginConnRequest& aRequest)
759 void CCombinationalPluginConn::DoCancel(TInt /*aReqMask*/)
767 class CCombinationalPluginFactory : public CFsPluginFactory
770 CCombinationalPluginFactory();
771 virtual TInt Install();
772 virtual CFsPlugin* NewPluginL();
773 virtual CFsPlugin* NewPluginConnL();
774 virtual TInt UniquePosition();
778 Constructor for the plugin factory
781 CCombinationalPluginFactory::CCombinationalPluginFactory()
786 Install function for the plugin factory
789 TInt CCombinationalPluginFactory::Install()
791 SetSupportedDrives(KPluginSupportAllDrives);
792 return(SetName(&KCombinationalPluginName));
798 TInt CCombinationalPluginFactory::UniquePosition()
800 return(KCombinationalPos);
804 Plugin factory function
807 CFsPlugin* CCombinationalPluginFactory::NewPluginL()
810 return CCombinationalPlugin::NewL();
814 Plugin factory function
817 CFsPlugin* CCombinationalPluginFactory::NewPluginConnL()
820 return CCombinationalPlugin::NewL();
829 EXPORT_C CFsPluginFactory* CreateFileSystem()
831 return(new CCombinationalPluginFactory());