diff -r 000000000000 -r bde4ae8d615e os/kernelhwsrv/kerneltest/f32test/plugins/version_2/src/combinational_plugin.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/os/kernelhwsrv/kerneltest/f32test/plugins/version_2/src/combinational_plugin.cpp	Fri Jun 15 03:10:57 2012 +0200
@@ -0,0 +1,834 @@
+// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#include "combinational_plugin.h"
+#include "plugincommon.h"
+#include <f32pluginutils.h>
+
+/**
+Leaving New function for the plugin
+@internalComponent
+*/
+CCombinationalPlugin* CCombinationalPlugin::NewL()
+	{
+	CCombinationalPlugin* self = new(ELeave) CCombinationalPlugin;
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop();
+	return self;
+	}
+
+
+/**
+Constructor for the plugin
+@internalComponent
+*/
+CCombinationalPlugin::CCombinationalPlugin() : iInterceptsEnabled(EFalse),
+									 iLogging(ETrue)
+	{
+	}
+
+
+void CCombinationalPlugin::ConstructL()
+	{
+	//iFile = RFilePlugin::Open();
+	}
+
+/**
+The destructor for the plugin
+@internalComponent
+*/
+CCombinationalPlugin::~CCombinationalPlugin()
+	{
+	}
+
+/**
+Initialise the plugin.
+@internalComponent
+*/
+void CCombinationalPlugin::InitialiseL()
+	{
+	_LOG(_L("CCombinationalPlugin InitialiseL"));
+	EnableInterceptsL();
+	}
+
+/**
+Enable the plugin's intercepts.
+@internalComponent
+*/
+void CCombinationalPlugin::EnableInterceptsL()
+	{
+	if (iInterceptsEnabled) return;
+	
+	User::LeaveIfError(RegisterIntercept(EFsFileRead,			EPrePostIntercept));
+	User::LeaveIfError(RegisterIntercept(EFsFileWrite,			EPrePostIntercept));
+	User::LeaveIfError(RegisterIntercept(EFsDirOpen,			EPrePostIntercept));
+	User::LeaveIfError(RegisterIntercept(EFsFileLock,			EPrePostIntercept));
+	User::LeaveIfError(RegisterIntercept(EFsFileUnLock,			EPrePostIntercept));
+	User::LeaveIfError(RegisterIntercept(EFsFileSeek,			EPrePostIntercept));
+	User::LeaveIfError(RegisterIntercept(EFsFileSize,			EPrePostIntercept));
+	User::LeaveIfError(RegisterIntercept(EFsFileSetSize,		EPrePostIntercept));
+	User::LeaveIfError(RegisterIntercept(EFsDirReadOne,			EPrePostIntercept));
+	User::LeaveIfError(RegisterIntercept(EFsDirReadPacked,		EPrePostIntercept));
+	User::LeaveIfError(RegisterIntercept(EFsFileOpen,			EPrePostIntercept));
+	User::LeaveIfError(RegisterIntercept(EFsFileCreate,			EPrePostIntercept));
+	User::LeaveIfError(RegisterIntercept(EFsFileReplace,		EPrePostIntercept));
+	User::LeaveIfError(RegisterIntercept(EFsFileRename,			EPrePostIntercept));
+   	User::LeaveIfError(RegisterIntercept(EFsReadFileSection,	EPrePostIntercept));
+	User::LeaveIfError(RegisterIntercept(EFsFileSubClose,       EPrePostIntercept));
+	User::LeaveIfError(RegisterIntercept(EFsEntry,        		EPrePostIntercept));
+	User::LeaveIfError(RegisterIntercept(EFsSetEntry,      		EPrePostIntercept));
+
+	_LOG(_L("Combinational Plugin: Enabled intercepts."));
+    
+	iInterceptsEnabled = ETrue;
+	}
+
+/**
+Disable the plugin's intercepts.
+@internalComponent
+*/
+void CCombinationalPlugin::DisableInterceptsL()
+	{
+	if (!iInterceptsEnabled) return;
+	
+	User::LeaveIfError(UnregisterIntercept(EFsFileRead,			EPrePostIntercept));
+	User::LeaveIfError(UnregisterIntercept(EFsFileRename,		EPrePostIntercept));
+	User::LeaveIfError(UnregisterIntercept(EFsFileWrite,		EPrePostIntercept));
+	User::LeaveIfError(UnregisterIntercept(EFsDirOpen,			EPrePostIntercept));
+	User::LeaveIfError(UnregisterIntercept(EFsFileLock,			EPrePostIntercept));
+	User::LeaveIfError(UnregisterIntercept(EFsFileUnLock,		EPrePostIntercept));
+	User::LeaveIfError(UnregisterIntercept(EFsFileSeek,			EPrePostIntercept));
+	User::LeaveIfError(UnregisterIntercept(EFsFileSize,			EPrePostIntercept));
+	User::LeaveIfError(UnregisterIntercept(EFsFileSetSize,		EPrePostIntercept));
+	User::LeaveIfError(UnregisterIntercept(EFsFileCreate,		EPrePostIntercept));
+	User::LeaveIfError(UnregisterIntercept(EFsFileOpen, 		EPrePostIntercept));
+	User::LeaveIfError(UnregisterIntercept(EFsFileReplace, 		EPrePostIntercept));
+	User::LeaveIfError(UnregisterIntercept(EFsFileSubClose, 	EPrePostIntercept));
+	User::LeaveIfError(UnregisterIntercept(EFsReadFileSection,	EPrePostIntercept));
+	User::LeaveIfError(UnregisterIntercept(EFsDirReadOne,		EPrePostIntercept));
+	User::LeaveIfError(UnregisterIntercept(EFsDirReadPacked,	EPrePostIntercept));
+	User::LeaveIfError(UnregisterIntercept(EFsEntry,        	EPrePostIntercept));
+	User::LeaveIfError(UnregisterIntercept(EFsSetEntry,      	EPrePostIntercept));
+
+	_LOG(_L("Combinational Plugin: Disabled intercepts."));
+    
+	iInterceptsEnabled = EFalse;
+	}
+
+/**
+Handle requests
+@internalComponent
+*/
+TInt CCombinationalPlugin::DoRequestL(TFsPluginRequest& aRequest)
+	{
+	TInt r = KErrNone;
+	TInt function = aRequest.Function();
+	
+	if (aRequest.IsPostOperation())
+		{
+		_LOG2(_L("CCombinationalPlugin post intercept for function %d"), function);
+		}
+	else
+		{
+		_LOG2(_L("CCombinationalPlugin pre intercept for function %d"), function);
+		}
+
+	switch (function)
+		{
+		case EFsFileOpen:
+			r= DoFileOpen(aRequest);
+			break;
+		case EFsFileSubClose:
+			r = DoFileSubClose(aRequest);
+			break;
+		case EFsFileReplace:
+			r = DoFileReplace(aRequest);
+			break;
+		case EFsEntry:
+			r = DoEntry(aRequest);
+			break;
+		case EFsDirReadPacked:
+			r = DoDirReadPacked(aRequest);
+			break;
+		case EFsDirOpen:
+			aRequest.Src();
+			break;
+		default:
+			break;
+		}
+	return r;
+	}
+
+
+
+
+TInt CCombinationalPlugin::DoFileRead(TFsPluginRequest& /*aRequest*/)
+	{
+	iLastError = KErrNotSupported;
+	iLineNumber = __LINE__;
+	return KErrNotSupported;
+	}
+TInt CCombinationalPlugin::DoFileWrite(TFsPluginRequest& /*aRequest*/)
+	{
+	iLastError = KErrNotSupported;
+	iLineNumber = __LINE__;
+	return KErrNotSupported;
+	}
+
+/*
+Test - 	Perform an Open here,
+ 		then make sure we get the right details in the second plugin.
+*/
+TInt CCombinationalPlugin::DoEntry(TFsPluginRequest& aRequest)
+	{
+	TInt err = KErrNone;
+	TFileName name;
+	
+	TBuf<256> testfilename1;
+
+	//setting up test files
+	testfilename1.Append(iDriveToTest);
+	testfilename1.Append(_L(":\\data\\test.entry.combi"));
+
+	name = aRequest.Src().FullName();
+	
+	if(!aRequest.IsPostOperation()) //pre
+		{
+		err = KErrNone;
+		
+		TBuf<256> clientfilename;
+		clientfilename.Append(iDriveToTest);
+		clientfilename.Append(_L(":\\combi.txt"));
+		
+		if(name.Compare(clientfilename) == 0)
+			{
+			RFilePlugin file(aRequest);
+			err = file.Replace(testfilename1, EFileWrite);//open
+			iLastError = err;
+			iLineNumber = __LINE__;
+			if(err!=KErrNone)
+				return err;
+			
+			file.Close();
+			}
+		
+		}
+	else //post
+		{
+		TEntry entry;
+		TPckg<TEntry> entryPckg(entry);
+		err = aRequest.Read(TFsPluginRequest::EEntry, entryPckg);
+		iLastError = err;
+		iLineNumber = __LINE__;
+		if(err!=KErrNone)
+			return err;
+		}
+
+	return err;
+	}
+
+TInt CCombinationalPlugin::DoDirReadPacked(TFsPluginRequest& aRequest)
+	{
+	TInt err = KErrNone;
+	
+	TBuf<16> compareName;
+	compareName.Append(iDriveToTest);
+	compareName.Append(_L(":\\dir3\\"));
+	if(iDirFullName.Compare(compareName) == 0)
+		{
+		return KErrNone;
+		}
+	
+	if (aRequest.IsPostOperation()) //Post
+		{
+		// NOP
+		}
+	else							//Pre 
+		{
+		RDirPlugin dir1(aRequest);
+		err = dir1.Open(iDirFullName, KEntryAttMatchMask); 
+		iLastError = err;
+		iLineNumber = __LINE__;
+		if(err!=KErrNone)
+			return err;
+
+		TBuf<16> dirname2;
+		dirname2.Append(iDriveToTest);
+		dirname2.Append(_L(":\\dir2\\"));
+		
+		TEntryArray entryarray1;
+		err = dir1.Read(entryarray1); //we can complete
+		iLastError = err;
+		iLineNumber = __LINE__;
+		if(err!=KErrNone && err!=KErrEof)
+			return err;
+
+		TUidType uid(TUid::Null(),TUid::Null(),TUid::Null());
+	
+		RDirPlugin dir2(aRequest);
+		err = dir2.Open(dirname2,uid);
+		iLastError = err;
+		iLineNumber = __LINE__;
+		if(err!=KErrNone)
+			return err;
+		
+		TEntryArray entryarray2;
+		err = dir2.Read(entryarray2);
+		iLastError = err;
+		iLineNumber = __LINE__;
+		if(err!=KErrNone && err!=KErrEof)
+			return err;
+		
+		if(entryarray1.Count() >= 1 && entryarray2.Count() >= 1)
+			{
+			TEntry e1 = entryarray1[0];
+			
+			TBuf<16> dir1file;
+			dir1file.Append(_L("dir1.file"));
+			if(e1.iName.Compare(dir1file) != 0)
+				{
+				iLastError = err;
+				iLineNumber = __LINE__;
+				if(err!=KErrNone)
+					return err;
+				}
+			}
+		else 
+			{
+			iLastError = err;
+			iLineNumber = __LINE__;
+			if(err!=KErrNone)
+				return err;
+			}
+		
+		TBuf<16> dirname3;
+		dirname3.Append(iDriveToTest);
+		dirname3.Append(_L(":\\dir3\\"));
+
+		TRawEntryArray entryarray3;
+		RDirPlugin dir3(aRequest);
+		TUidType uid3(TUid::Null(), TUid::Null(), TUid::Null());
+		err = dir3.Open(dirname3,uid3);
+		iLastError = err;
+		iLineNumber = __LINE__;
+		if(err!=KErrNone)
+			return err;
+		
+		err = dir3.Read(entryarray3);
+		iLastError = err;
+		iLineNumber = __LINE__;
+		if(err!=KErrNone && err!=KErrEof)
+			return err;
+		
+		err = aRequest.Write(TFsPluginRequest::EEntryArray,entryarray3.Buf());
+		iLastError = err;
+		iLineNumber = __LINE__;
+		if(err!=KErrNone)
+			return err;
+
+		dir1.Close();
+		dir2.Close();
+		dir3.Close();
+		
+		return KErrCompletion;
+		}
+		
+	return err;
+	}
+
+
+/*
+
+Test 1 - This test opens 3 files and reads their contents (which was written in the test harness)
+
+Test 2 - 
+
+*/
+TInt CCombinationalPlugin::DoFileOpen(TFsPluginRequest& aRequest)
+	{
+	//intercept open
+	TInt err = KErrNone;
+
+	if (aRequest.IsPostOperation()) //Post
+		{
+		//Start of test
+		RFilePlugin file(aRequest);
+		err = file.AdoptFromClient();
+		iLastError = err;
+		iLineNumber = __LINE__;
+		if(err!=KErrNone)
+			return err;
+		
+		TFileName filename;
+		filename.FillZ();
+
+		//TODO: get rid of this?
+		#ifdef __WINS__ 
+			_LIT(KSecondFile,"X:\\combi1.txt");
+		#else
+			_LIT(KSecondFile,"D:\\combi1.txt");
+		#endif
+
+		filename.SetLength(KSecondFile().Length());
+		filename.Replace(0,KSecondFile().Length(),KSecondFile());
+		
+		TUint mode;
+		err = aRequest.Read(TFsPluginRequest::EMode, mode);
+		iLastError = err;
+		iLineNumber = __LINE__;
+		if(err!=KErrNone)
+			return err;
+
+		//try to open a second file.			
+		err = file.Open(filename, mode);
+		
+		//NEGATIVE TESTING: 
+		if(err!=KErrBadHandle)
+			{
+			iLastError = err;
+			iLineNumber = __LINE__;
+			if(err!=KErrNone)
+				return err;
+			}
+		
+		RFilePlugin file2(aRequest);
+		err = file2.Open(filename, mode);
+		iLastError = err;
+		iLineNumber = __LINE__;
+		if(err!=KErrNone)
+			return err;
+		
+		//Lets write something
+		TBuf8<64> combi1Buf;
+		combi1Buf.SetLength(10);
+		err = file2.Read(0,combi1Buf,6);
+		iLastError = err;
+		iLineNumber = __LINE__;
+		if(err!=KErrNone)
+			return err;
+		
+		// second file is open.
+		// lets be wild and open a third!
+		filename.FillZ();
+		
+		//TODO: Get rid of this?
+		#ifdef __WINS__ 
+			_LIT(KThirdFile,"X:\\combi2.txt");
+		#else
+			_LIT(KThirdFile,"D:\\combi2.txt");
+		#endif
+
+		filename.SetLength(KThirdFile().Length());
+		filename.Replace(0,KThirdFile().Length(),KThirdFile());
+		
+		RFilePlugin file3(aRequest);
+		err = file3.Open(filename, mode);
+		User::LeaveIfError(err);
+		
+		TBuf8<64> combi2Buf;
+		combi2Buf.SetLength(20);
+		err = file3.Read(0, combi2Buf, 18);
+		User::LeaveIfError(err);
+		
+		_LOG2(_L("combi1Buf := %S"),&combi1Buf);
+		_LOG2(_L("combi2Buf := %S"),&combi2Buf);
+		
+		err = combi1Buf.Compare(combi2Buf);
+		if(err != 0) // is equal
+		    {
+			iLastError = err;
+			iLineNumber = __LINE__;
+			return err;
+		    }
+		
+		// Right, best close these then eh?
+		
+		//close in different order - should be fine.
+		file2.Close();
+		file.Close();
+		file3.Close();
+		
+		return KErrNone;
+		} 
+	else // PRE
+		{
+		RFilePlugin file(aRequest);
+		
+		TFileName filename;
+
+
+		filename = aRequest.Src().FullName();
+
+		TUint mode;
+		err = aRequest.Read(TFsPluginRequest::EMode, mode);
+		iLastError = err;
+		iLineNumber = __LINE__;
+		if(err!=KErrNone)
+			return err;
+
+		// Combinational test 1) Try to perform an RfilePlugin:Open on the same file.
+		err = file.Open(filename, mode);
+		iLastError = err;
+		iLineNumber = __LINE__;
+		if(err!=KErrNone)
+			return err;
+
+		err = file.TransferToClient();
+		iLastError = err;
+		iLineNumber = __LINE__;
+		if(err!=KErrNone)
+			return err;
+
+		file.Close();
+
+		return KErrCompletion;
+		}
+	}
+
+TInt CCombinationalPlugin::DoFileSubClose(TFsPluginRequest& aRequest)
+	{
+	TInt err = KErrNone;
+	if (aRequest.IsPostOperation())
+		{
+		} 
+	else 
+		{ //PRE
+		RFilePlugin file(aRequest);
+		err = file.AdoptFromClient(); //This is weird but it follows the open/close pattern;
+		iLastError = err;
+		iLineNumber = __LINE__;
+		if(err!=KErrNone)
+			return err;
+		file.Close(); 
+		}
+	return err;
+	}
+
+/*
+ * This test is testing the following scenario : 
+ * 
+Intercept Replace:
+	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.
+	(basically, open/replace/create 3 files, write to them and read back from them and check the contents)  
+ */
+TInt CCombinationalPlugin::DoFileReplace(TFsPluginRequest& aRequest)
+	{
+	TInt err = KErrNone;
+
+	TBuf<256> testfilename1;
+	TBuf<256> testfilename2;
+
+	//setting up test files
+	testfilename1.Append(iDriveToTest);
+	testfilename1.Append(_L(":\\combiReplace2.txt"));
+
+	testfilename2.Append(iDriveToTest);
+	testfilename2.Append(_L(":\\combiReplace3.txt"));
+
+	if (aRequest.IsPostOperation()) //POST
+		{
+		}
+	else //PRE
+		{
+		TFileName filename;
+		filename = aRequest.Src().FullName();
+		
+		RFsPlugin rfs(aRequest);
+		err = rfs.Connect();
+		iLastError = err;
+		iLineNumber = __LINE__;
+		if(err!=KErrNone)
+			return err;
+
+		//rfs.Delete(aRequest,filename);
+		
+		RFilePlugin file(aRequest);
+
+		TUint mode = 0;
+		err = aRequest.Read(TFsPluginRequest::EMode, mode);
+		iLastError = err;
+		iLineNumber = __LINE__;
+		if(err!=KErrNone)
+			return err;
+
+		err = file.Replace(filename, mode);
+		iLastError = err;
+		iLineNumber = __LINE__;
+		if(err!=KErrNone)
+			return err;
+		
+		//we have replace/opened our file, now lets write to it.
+		
+		TBuf8<64> writeData;
+		writeData.FillZ(64);
+		writeData.Copy(_L8("0123456789"));
+		err = file.Write(0, writeData, 10);
+		iLastError = err;
+		iLineNumber = __LINE__;
+		if(err!=KErrNone)
+			return err;
+		
+		//Now lets EFsFileReplace another file
+		TFileName secondName;
+		secondName.Append(testfilename1);
+		RFilePlugin file2(aRequest);
+		err = file2.Replace(secondName, mode);
+		iLastError = err;
+		iLineNumber = __LINE__;
+		if(err!=KErrNone)
+			return err;
+		
+		//Now lets write to it.
+		TBuf8<64> writeData2;
+		writeData2.FillZ(64);
+		writeData2.Copy(_L8("9876543210"));
+		err = file2.Write(0,writeData2,10);
+		iLastError = err;
+		iLineNumber = __LINE__;
+		if(err!=KErrNone)
+			return err;
+		
+		//Now lets open another file.
+		TFileName thirdFile;
+		thirdFile.Append(testfilename2);
+		err = rfs.Delete(thirdFile);
+		if(err == KErrNotFound)
+			err = KErrNone;
+		iLastError = err;
+		iLineNumber = __LINE__;
+		if(err!=KErrNone)
+			return err;
+
+		RFilePlugin file3(aRequest);
+		err = file3.Create(thirdFile, EFileWrite);
+		iLastError = err;
+		iLineNumber = __LINE__;
+		if(err!=KErrNone)
+			return err;
+		
+		//Now lets write to it.
+		TBuf8<64> writeData3;
+		writeData3.FillZ(64);
+		writeData3.Copy(_L8("3333333333"));
+		err = file3.Write(0,writeData3,10);
+		iLastError = err;
+		iLineNumber = __LINE__;
+		if(err!=KErrNone)
+			return err;
+		
+		// Now we need to read the data and make sure that the correct data is in the correct files,
+		// this check probably needs to be checked from RFile/test_harness as well.
+		TBuf8<64> readData3;
+		readData3.SetLength(10);
+		err = file3.Read(0, readData3, 10);
+		iLastError = err;
+		iLineNumber = __LINE__;
+		if(err!=KErrNone)
+			return err;
+			
+		err = readData3.Compare(writeData3);
+		if(err != KErrNone)
+			{
+			iLastError = err;
+			iLineNumber = __LINE__;
+			return err;
+			}
+		
+		//close file 3
+		file3.Close();
+		
+		// read from file2
+		TBuf8<64> readData2;
+		readData2.SetLength(10);
+		err = file2.Read(0, readData2, 10);
+		iLastError = err;
+		iLineNumber = __LINE__;
+		if(err!=KErrNone)
+			return err;
+		
+		err = readData2.Compare(writeData2);
+		if(err != KErrNone)
+			{
+			iLastError = err;
+			iLineNumber = __LINE__;
+			return err;
+			}
+		
+		//close file 2
+		file2.Close();
+		
+		// read from file1
+		TBuf8<64> readData1;
+		readData1.SetLength(10);
+		err = file.Read(0, readData1, 10);
+		iLastError = err;
+		iLineNumber = __LINE__;
+		if(err!=KErrNone)
+			return err;
+		
+		err = readData1.Compare(writeData);
+		if(err != KErrNone)
+			{
+			iLastError = err;
+			iLineNumber = __LINE__;
+			return err;
+			}
+
+		file.TransferToClient();
+
+		rfs.Close();
+		
+		return KErrCompletion;
+	
+		}
+	return err;
+	}
+
+
+CFsPluginConn* CCombinationalPlugin::NewPluginConnL()
+	{
+	return new(ELeave) CCombinationalPluginConn();
+	}
+
+
+//Synchronous RPlugin::DoControl
+TInt CCombinationalPlugin::FsPluginDoControlL(CFsPluginConnRequest& aRequest)
+	{	
+	TInt err = KErrNone;
+
+	//We can use this to set the drive
+	//We can store this as a member of this class.
+	TInt function = aRequest.Function();
+	TPckg<TChar> drive(iDriveToTest);
+	typedef TBuf<256> TDirName;
+	TPckg<TDirName> dirnamePckg(iDirFullName);
+	TPckg<TInt> errCodeDes(iLastError);
+	TPckg<TInt> lineNumberDes(iLineNumber);
+	
+	switch(function)
+		{
+		case KPluginSetDrive:
+			{
+			TRAP(err,aRequest.ReadParam1L(drive));
+			break;
+			}
+		case KPluginSetDirFullName:
+			{
+			//This is necessary as at present we have nwo way of getting the name of
+			//a directory!
+			TRAP(err,aRequest.ReadParam1L(dirnamePckg));
+			break;
+			}
+		case KPluginGetError:
+			{
+			TRAP(err,aRequest.WriteParam1L(errCodeDes));
+			TRAP(err,aRequest.WriteParam2L(lineNumberDes));
+			break;
+			}
+		default:
+			break;
+		}
+
+	return err;
+	}
+
+
+TInt CCombinationalPluginConn::DoControl(CFsPluginConnRequest& aRequest)
+	{
+	return ((CCombinationalPlugin*)Plugin())->FsPluginDoControlL(aRequest);
+	}
+
+void CCombinationalPluginConn::DoRequest(CFsPluginConnRequest& aRequest)
+	{
+	DoControl(aRequest);
+	}
+
+void CCombinationalPluginConn::DoCancel(TInt /*aReqMask*/)
+	{
+	}
+
+
+
+//factory functions
+
+class CCombinationalPluginFactory : public CFsPluginFactory
+	{
+public:
+	CCombinationalPluginFactory();
+	virtual TInt Install();			
+	virtual CFsPlugin* NewPluginL();
+	virtual CFsPlugin* NewPluginConnL();
+	virtual TInt UniquePosition();
+	};
+
+/**
+Constructor for the plugin factory
+@internalComponent
+*/
+CCombinationalPluginFactory::CCombinationalPluginFactory()
+	{
+	}
+
+/**
+Install function for the plugin factory
+@internalComponent
+*/
+TInt CCombinationalPluginFactory::Install()
+	{
+	SetSupportedDrives(KPluginSupportAllDrives);
+	return(SetName(&KCombinationalPluginName));
+	}
+
+/**
+@internalComponent
+*/
+TInt CCombinationalPluginFactory::UniquePosition()
+	{
+	return(KCombinationalPos);
+	}
+
+/**
+Plugin factory function
+@internalComponent
+*/
+CFsPlugin* CCombinationalPluginFactory::NewPluginL()
+
+	{
+	return CCombinationalPlugin::NewL();
+	}
+
+/**
+Plugin factory function
+@internalComponent
+*/
+CFsPlugin* CCombinationalPluginFactory::NewPluginConnL()
+
+	{
+	return CCombinationalPlugin::NewL();
+	}
+
+/**
+Create a new Plugin
+@internalComponent
+*/
+extern "C" {
+
+EXPORT_C CFsPluginFactory* CreateFileSystem()
+	{
+	return(new CCombinationalPluginFactory());
+	}
+}
+