diff -r 000000000000 -r a41df078684a userlibandfileserver/fileserver/srofs/sr_rofs.h --- /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 +#include +#include +#include +#include +#include + +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 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 iQue; + CRofsMountCB* iMount; + TInt64 iMediaSize; + }; +#endif + + +#include "sr_rofs.inl"