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) 2008-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:
// f32\sfat32\inc\sl_leafdir_cache.h
//
//
/**
@file
@internalTechnology
*/
#ifndef SL_LEAFDIR_CACHE_H
#define SL_LEAFDIR_CACHE_H
//---------------------------------------------------------------------------------------------------------------------------------
class CLeafDirTree;
/*
A data structure to define the location of a direcotry
*/
class TLeafDirData
{
public:
TLeafDirData();
TLeafDirData(TUint aClusterNum);
TLeafDirData(TUint aClusterNum, const TEntryPos& aMRUPos);
inline TBool operator==(const TLeafDirData &aDirPos) const;
inline TBool operator!=(const TLeafDirData &aDirPos) const;
public:
TUint iClusterNum;
TEntryPos iMRUPos;
};
/*
Class definition for the nodes of the leaf dir cache
All cached direcotries are stored as nodes in a tree structure
*/
class CLeafDirTreeNode : public CBase
{
public:
// Types of the nodes
enum TLeafDirTreeNodeType
{
ERoot, // Represents the root node, i.e. the root path
ELeaf, // Represents a pure 'leaf' nodes, no child
ELeafIntermediary, // Represents a 'leaf' node, but has at least one child
EPureIntermediary, // Represents a pure 'intermediary' node, which only exists to share the common path of other nodes
};
static CLeafDirTreeNode* NewL(CLeafDirTree* aOwnerTree, const TDesC& aPathName, const TLeafDirData& aDirPos, TLeafDirTreeNodeType aType);
~CLeafDirTreeNode();
inline CLeafDirTreeNode* Parent();
inline void SetParent(CLeafDirTreeNode* aNode);
inline RPointerArray<CLeafDirTreeNode>& Children();
void MakeItChildL(CLeafDirTreeNode* aNode);
TInt RemoveChild(CLeafDirTreeNode* aNode);
inline const TLeafDirData& LeafDirData() const;
inline TUint32 StartClusterNum() const;
inline void SetLeafDirData(const TLeafDirData& aLeafDirData);
inline const TDesC& Path() const;
void SetPathL(const TDesC& aPathData);
void SetType(const CLeafDirTreeNode::TLeafDirTreeNodeType aType);
inline TBool IsRoot() const;
inline TBool IsLeaf();
inline TBool IsLeafIntermediary();
inline TBool IsPureIntermediary();
private:
void ConstructL(CLeafDirTree* aOwnerTree, const TDesC& aPathName);
CLeafDirTreeNode(const TLeafDirData& aDirPos , TLeafDirTreeNodeType aType);
CLeafDirTreeNode(const CLeafDirTreeNode& aLeafDirTreeNode);
CLeafDirTreeNode* operator=(CLeafDirTreeNode& aLeafDirTreeNode);
private:
CLeafDirTree* iOwnerTree; // A pointer to the owner of this node.
CLeafDirTreeNode* iParent; // The parent of this node
RPointerArray<CLeafDirTreeNode> iChildren; // The children of this node
RBuf iPath; // The path of the direcotry this node represents
TLeafDirData iLeafDirData; // The position of the direcotry this node represents
TLeafDirTreeNodeType iNodeType; // The type of the node
};
/*
Class definition for the tree structure of the leaf dir cache
All cached direcotries are stored as nodes in a tree structure
*/
class CLeafDirTree : public CBase
{
public:
static CLeafDirTree* NewL(TUint32 aSize);
~CLeafDirTree();
public:
TInt Search(const TDesC& aPath, CLeafDirTreeNode*& aNodeFound, TLeafDirData& aDirPos);
TInt DoSearch(const TDesC& aPath, CLeafDirTreeNode* aNodeToStart, CLeafDirTreeNode*& aNodeFound, TLeafDirData& aDirPos);
void InsertL(const TDesC& aPath, const TLeafDirData& aDirPos, CLeafDirTreeNode*& aNodeInserted);
void DoInsertL(CLeafDirTreeNode* aNodeToStart, const TDesC& aPath, const TLeafDirData& aDirPos, CLeafDirTreeNode*& aNodeInserted);
void RemoveDirL(const TLeafDirData& aDirPos);
void UpdateMRUPos(const TLeafDirData& aLeafDirData);
void RemoveFromCacheL(CLeafDirTreeNode* aNodeToDelete);
CLeafDirTreeNode* FindLeftestLeafNode(CLeafDirTreeNode* aNodeToStart) const;
void DeleteSubTreeL(CLeafDirTreeNode* aNodeToStart);
void Reset();
CLeafDirTreeNode* LruNode();
void AddOntoLruL(CLeafDirTreeNode* aNodeToAdd);
TInt RemoveFromLru(CLeafDirTreeNode* aNodeToRemove);
TInt MakeMostRecentlyUsed(CLeafDirTreeNode* aNodeUsed);
inline TInt LruCount() const;
void CheckLimitL();
// For debugging & testing only
#ifdef _DEBUG
TInt ObjectCount() const {return iContainer.Count();};
void AddToObjectContainerL(CLeafDirTreeNode* aNode);
void RemoveFromObjectContainerL(CLeafDirTreeNode* aNode);
void DumpTreeContentL() const;
#endif //_DEBUG
private:
void ConstructL();
CLeafDirTree(TUint32 aSize);
private:
CLeafDirTreeNode* iRoot; // The root node
RPointerArray<CLeafDirTreeNode> iLruList; // The list containing all the LRU cached nodes
TUint32 iSize; // The maximum number of items allowed to cache
// For debugging & testing only
#ifdef _DEBUG
RPointerArray<CLeafDirTreeNode> iContainer; // The container containing all nodes
#endif //_DEBUG
};
/*
Class definition for leaf directory cache.
Acting as an interface class for CFatMountCB to use.
*/
class CLeafDirCache : public CBase
{
public:
static CLeafDirCache* NewL(TUint32 aLimit);
~CLeafDirCache();
void Reset();
TInt FindInCache(const TDesC& aLeafDirName, TLeafDirData& aDirPos) const;
void AddToCacheL(const TDesC& aLeafDirName, const TLeafDirData& aDirPos);
void RemoveDirL(const TLeafDirData& aDirPos);
void UpdateMRUPos(const TLeafDirData& aLeafDirData);
TInt CacheCount() const;
// For debugging & testing only
#ifdef _DEBUG
void DumpCacheContentL() const;
TInt NodeCount() const;
#endif //_DEBUG
private:
CLeafDirCache(TUint32 aLimit);
void ConstructL();
private:
TUint32 iSize; // The cache size
CLeafDirTree* iTree; // The cache content, represented as a tree structure
};
//---------------------------------------------------------------------------------------------------------------------------------
#include"sl_leafdir_cache.inl"
#endif //SL_LEAFDIR_CACHE_H