userlibandfileserver/fileserver/sfat32/sl_leafdir_cache.h
author Tom Cosgrove <tom.cosgrove@nokia.com>
Fri, 28 May 2010 16:29:07 +0100
changeset 30 8aab599e3476
parent 2 4122176ea935
permissions -rw-r--r--
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