Fix for bug 2283 (RVCT 4.0 support is missing from PDK 3.0.h)
Have multiple extension sections in the bld.inf, one for each version
of the compiler. The RVCT version building the tools will build the
runtime libraries for its version, but make sure we extract all the other
versions from zip archives. Also add the archive for RVCT4.
// 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"