userlibandfileserver/fileserver/srofs/sr_rofs.h
changeset 0 a41df078684a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/userlibandfileserver/fileserver/srofs/sr_rofs.h	Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,275 @@
+// Copyright (c) 1995-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 <e32std.h>
+#include <f32fsys.h>
+#include <f32ver.h>
+#include <e32rom.h>
+#include <rofs.h>
+#include <f32dbg.h>
+
+IMPORT_C TUint32 DebugRegister();
+#if defined(_DEBUG) || defined(_DEBUG_RELEASE)
+#define __LOCK_SR_STD__
+#define __PRINT(t)			{if (DebugRegister()&KROFS) RDebug::Print(t);}
+#define __PRINT1(t,d)		{if (DebugRegister()&KROFS) RDebug::Print(t,d);}
+#define __PRINT2(t,d,d1)	{if (DebugRegister()&KROFS) RDebug::Print( t, d , d1);}
+#else
+#define __PRINT(t)
+#define __PRINT1(t,d)
+#define __PRINT2(t,d,d1)
+#endif
+
+//
+
+#define _USE_TRUE_LRU_CACHE
+
+const TUint KFileHidden = 0xFFFFFFFF;
+
+class CRofs : public CFileSystem
+	{
+public:
+	enum TPanic
+		{
+		EPanicEntryNotDir,
+		EPanicNullSubDir,
+		EPanicNullFileBlock,
+		EPanicNullFileBlock2,
+		EPanicEntryBeforeDirectory,
+		EPanicEntryAfterDirectory,
+		EPanicBadMatchName,
+		EPanicRemountNotSupported,
+		EPanicGetFileInfo,
+		EPanicFileTooBig,
+		EPanicReadUid,
+		EPanicDirCacheNull,
+		EPanicDriveInfo
+		};
+	static void Panic( TPanic aPanic );
+
+public:
+	CRofs();
+	~CRofs();
+	
+	static CRofs* New();
+
+	TInt Install();
+	CMountCB* NewMountL() const;
+	CFileCB* NewFileL() const;
+	CDirCB* NewDirL() const;
+	CFormatCB* NewFormatL() const;
+
+	void DriveInfo(TDriveInfo& anInfo,TInt aDriveNumber) const;
+	TInt DefaultPath(TDes& aPath) const;
+	TInt TotalSupportedDrives() const;
+	TBool IsExtensionSupported() const{	return(ETrue);};
+private:
+	TInt	iTotalSupportedDrives;
+	};
+
+
+class CRofsMountCB;
+class CDirectoryCache : public CBase
+	{
+	public:
+		CDirectoryCache( CRofsMountCB& aMount, CProxyDrive& aLocalDrive, const TRofsHeader& aHeader );
+		~CDirectoryCache();
+	
+		void ConstructL();
+
+		void FindLeafDirL(const TDesC& aName, const TRofsDir*& aDir) const;
+		void FindFileEntryL(const TDesC& aName, const TRofsEntry*& aEntry) const;
+		void FindDirectoryEntryL(const TDesC& aName, const TRofsDir*& aDir) const;
+		void GetNextMatchingL(const TDesC& aName, TUint aAtt, const TRofsDir*& aDir, const TRofsEntry*& aEntry, TInt aError, TBool bUseBinarySearch) const;
+		void FindGeneralEntryL(const TDesC& aName, TUint aAtt, const TRofsDir*& aDir, const TRofsEntry*& aEntry ) const;
+
+		static inline const TText* NameAddress( const TRofsEntry* aEntry );
+		TUint8 GetMountId(void);
+
+	private:
+		CDirectoryCache();
+		static inline TUint32 AlignUp( TUint32 aValue );
+		inline const TRofsDir* RootDirectory() const;
+		inline const TRofsDir* RofsDirFromMediaOffset( TUint aMediaOffset ) const;
+		inline const TRofsDir* RofsDirFromSubDirEntry( const TRofsEntry* aEntry ) const;
+		static inline const TRofsEntry* FirstSubDirEntryFromDir( const TRofsDir* aDir );
+		inline const TRofsEntry* FirstFileEntryFromDir( const TRofsDir* aDir ) const;
+		inline const TAny* EndOfFileBlockPlusOne( const TRofsDir* aDir ) const;
+		inline const TAny* EndOfDirPlusOne( const TRofsDir* aDir ) const;
+		static inline const TRofsEntry* NextEntry( const TRofsEntry* aEntry );
+
+		TInt DoFindSubDir(const TDesC& aName, TUint aAtt, const TRofsDir* aDir, const TRofsEntry*& aEntry) const;
+		TInt DoFindFile(const TDesC& aName, TUint aAtt, const TRofsDir* aDir, const TRofsEntry*& aEntry) const;
+
+		TInt DoBinaryFindSubDir(const TDesC& aName, TUint aAtt, const TRofsDir* aDir, const TRofsEntry*& aEntry) const;
+		TInt DoBinaryFindFile(const TDesC& aName, TUint aAtt, const TRofsDir* aDir, const TRofsEntry*& aEntry) const;
+
+		TInt GetDirCount(const TRofsDir* aDir) const;
+		TInt GetFileCount(const TRofsDir* aDir) const;
+		TInt Compare(const TDesC& aLeft, const TDesC& aRight) const;
+		TInt ExtractMangleInfo(const TDesC& searchName, TUint8 &MountId, TUint8 &Reserved) const;
+	private:
+		CRofsMountCB&	iMount;
+		CProxyDrive&	iLocalDrive;
+		const TUint		iTreeMediaOffset;
+		const TUint		iTreeSize;
+		const TUint		iFilesMediaOffset;
+		const TUint		iFilesSize;
+		HBufC8*	iTreeBuffer;
+		HBufC8*	iFilesBuffer;
+	};
+
+class CRofsFileCB;
+/**
+
+*/
+class CRofsLruCache;
+class CRofsMountCB : public CLocDrvMountCB, public CMountCB::MFileAccessor
+	{
+public:
+	CRofsMountCB();
+	void MountL(TBool aForceMount);
+	TInt ReMount();
+	void Dismounted();
+	void VolumeL(TVolumeInfo& aVolume) const;
+	void SetVolumeL(TDes& aName);
+	void MkDirL(const TDesC& aName);
+	void RmDirL(const TDesC& aName);
+	void DeleteL(const TDesC& aName);
+	void RenameL(const TDesC& anOldName,const TDesC& anNewName);
+	void ReplaceL(const TDesC& anOldName,const TDesC& anNewName);
+	void EntryL(const TDesC& aName,TEntry& anEntry) const;
+	void SetEntryL(const TDesC& aName,const TTime& aTime,TUint aMask,TUint aVal);
+	void FileOpenL(const TDesC& aName,TUint aMode,TFileOpen anOpen,CFileCB* aFile);
+	void DirOpenL(const TDesC& aName,CDirCB* aDir);
+	void RawReadL(TInt64 aPos,TInt aLength,const TAny* aTrg,TInt anOffset,const RMessagePtr2& aMessage) const;
+	void RawWriteL(TInt64 aPos,TInt aLength,const TAny* aSrc,TInt anOffset,const RMessagePtr2& aMessage);
+	void GetShortNameL(const TDesC& aLongName,TDes& aShortName);
+	void GetLongNameL(const TDesC& aShortName,TDes& aLongName);
+	void ReadSectionL(const TDesC& aName,TInt aPos,TAny* aTrg,TInt aLength,const RMessagePtr2& aMessage);
+	void ReadUidL( TUint aMediaOffset, TEntry& aEntry, TRofsEntry* aRofsEntry) const;
+	inline CRofs& FileSystem() const;
+	virtual TInt GetInterface(TInt aInterfaceId,TAny*& aInterface,TAny* aInput);
+	virtual TInt GetFileUniqueId(const TDesC& aName, TInt64& aUniqueId);
+	virtual TInt Spare3(TInt aVal, TAny* aPtr1, TAny* aPtr2);
+	virtual TInt Spare2(TInt aVal, TAny* aPtr1, TAny* aPtr2);
+	virtual TInt Spare1(TInt aVal, TAny* aPtr1, TAny* aPtr2);
+
+#ifdef _USE_TRUE_LRU_CACHE
+	void CacheReadL(TInt aPos, TInt aLength, const TAny* aDes, TInt anOffset, const RMessagePtr2& aMessage) const;
+#endif
+	TUint8 iMountId;
+
+private:
+	TInt CheckHeader() const;
+	TInt CheckExtension();
+
+private:
+	TPckgBuf<TRofsHeader>	iHeader;
+	CDirectoryCache*	iDirectoryCache;
+	TInt64				iMediaSize;
+
+#ifdef _USE_TRUE_LRU_CACHE
+ 	CRofsLruCache*		iDataCache;
+#endif
+
+	};
+
+class CRofsFileCB : public CFileCB, public CFileCB::MBlockMapInterface, public CFileCB::MExtendedFileInterface
+	{
+public:
+	CRofsFileCB();
+	void RenameL(const TDesC& aNewName);
+	void ReadL(TInt aPos,TInt& aLength,const TAny* aDes,const RMessagePtr2& aMessage);
+	void WriteL(TInt aPos,TInt& aLength,const TAny* aDes,const RMessagePtr2& aMessage);
+	void SetSizeL(TInt aSize);
+	void SetEntryL(const TTime& aTime,TUint aMask,TUint aVal);
+	void FlushDataL();
+	void FlushAllL();
+	inline void SetMediaBase(const TUint aBase);
+	inline void SetAttExtra( TUint8 aAttExtra );
+	TInt GetInterface(TInt aInterfaceId,TAny*& aInterface,TAny* aInput);
+
+	// from CFileCB::MExtendedFileInterface
+	virtual void ReadL(TInt64 aPos,TInt& aLength,TDes8* aDes,const RMessagePtr2& aMessage, TInt aOffset);
+	virtual void WriteL(TInt64 aPos,TInt& aLength,const TDesC8* aDes,const RMessagePtr2& aMessage, TInt aOffset);
+	virtual void SetSizeL(TInt64 aSize);
+
+private:
+	inline CRofsMountCB& RofsMount();
+	TInt BlockMap(SBlockMapInfo& aInfo, TInt64& aStartPos, TInt64 aEndPos);
+
+private:
+	TUint iMediaBase;
+	TUint8	iAttExtra;
+	};
+
+class CRofsDirCB : public CDirCB
+	{
+public:
+	CRofsDirCB();
+	~CRofsDirCB();
+	void ReadL(TEntry& anEntry);
+	void SetDir(const TRofsDir* aDir, const TDesC& aMatch, TInt64& aTimeStamp );
+	inline void SetCache( CDirectoryCache* aCache );
+private:
+	TBool MatchUid();
+private:
+	CDirectoryCache* iCache;
+	TEntry iEntry;
+	TTime	iTimeStamp;
+	const TRofsDir* iDir;
+	const TRofsEntry* iNext;
+	HBufC* iMatch;
+	};
+
+#ifdef _USE_TRUE_LRU_CACHE
+const TInt KSizeOfCacheInPages = 5;	// 5K Cache
+const TInt KSizeOfSegment = 1024;	//Two pages
+const TInt KPageSize = 512;
+
+class TCacheSegment
+	{
+public:
+	TCacheSegment();
+	void Set(TInt aPos);
+	TUint8* Data() {return(((TUint8*)this)+sizeof(TCacheSegment));}
+public:
+	TInt iPos;	
+	TDblQueLink iLink;
+	};
+
+//
+//Data cache for Rofs, (read only cache)
+//
+class CRofsLruCache: public CBase
+	{
+public:
+	~CRofsLruCache();
+	static CRofsLruCache* New(TInt aSegmentSize, CRofsMountCB* aMount, TInt64 aMediaSize);
+	TUint8* Find(TInt aPos , TInt aLength);
+	TUint8* ReadL(TInt aPos , TInt aLength);
+protected:
+	CRofsLruCache(CRofsMountCB* aMount, TInt64 aMediaSize);
+private:
+	TDblQue<TCacheSegment> iQue;
+	CRofsMountCB* iMount;
+	TInt64 iMediaSize;
+	};
+#endif
+
+
+#include "sr_rofs.inl"