imgtools/romtools/rombuild/r_dir.h
changeset 0 044383f39525
child 590 360bd6b35136
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/romtools/rombuild/r_dir.h	Tue Oct 27 16:36:35 2009 +0000
@@ -0,0 +1,214 @@
+/*
+* Copyright (c) 1998-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: 
+*
+*/
+
+
+#ifndef __R_DIR_H__
+#define __R_DIR_H__
+
+#include <e32std.h>
+
+// Generalised set handling
+class SetMember
+	{
+public:
+	TBool operator==(const SetMember& aMember) {return(Compare(aMember)==0);}
+	virtual SetMember* Copy() const =0;
+	virtual void Close();
+public:
+	TInt Type() const {return iType;}
+	virtual TInt Compare(const SetMember& aMember) const =0;
+	virtual void DebugPrint() const =0;
+protected:
+	virtual ~SetMember();
+	SetMember(TInt aType) : iType(aType) {TotalInSystem++;}
+	SetMember(const SetMember& aMember) : iType(aMember.iType) {TotalInSystem++;}
+	TBool operator<(const SetMember& aMember) {return(Compare(aMember)<0);}
+	TBool operator>(const SetMember& aMember) {return(Compare(aMember)>0);}
+private:
+	TInt iType;
+	static TInt TotalInSystem;
+	};
+
+class FiniteSet : public SetMember
+	{
+protected:
+	enum TFiniteSetType {EFiniteSetType=100};
+public:
+	static FiniteSet* New(TInt aMaxCount);
+	static FiniteSet* Singleton(TInt aMaxCount, const SetMember& aMember);
+	virtual ~FiniteSet();
+	virtual SetMember* Copy() const;
+	TInt Find(const SetMember& aMember) const;
+	TBool SubsetOf(const FiniteSet& aSet) const;
+	TInt Intersection(const FiniteSet& aSet);
+	TInt Union(const FiniteSet& aSet);
+	TInt Difference(const FiniteSet& aSet);
+	TInt Add(const SetMember& aMember);
+	TInt Remove(const SetMember& aMember);
+	SetMember* Detach(TInt anIndex);
+	TInt Count() const {return iCount;}
+	TBool Empty() const {return !iCount;}
+	SetMember& operator[](TInt anIndex) const {return *iMembers[anIndex];}
+	virtual void DebugPrint() const;
+protected:
+	FiniteSet(TInt aMaxCount);
+	FiniteSet(const FiniteSet& aSet);
+	FiniteSet* Construct();
+	virtual TInt Compare(const SetMember& aMember) const;
+	TInt Find(const SetMember& aMember, TInt& anIndex) const;
+	TInt Insert(const SetMember& aMember, TInt anIndex);
+protected:
+	TInt iMaxCount;
+	TInt iCount;
+	SetMember** iMembers;
+	};
+
+// ROMBUILD-specific stuff
+#include <e32rom.h>
+
+class CObeyFile;
+class TRomNode;
+class THardwareVariant;
+
+class RomFileStructure;
+class TVariantList
+	{
+public:
+	enum {EMaxVariants=32};
+	static void Setup(CObeyFile* aObey);
+	TVariantList() : iList(0)
+		{}
+	TVariantList(TInt aVariant)
+		{iList=TUint(1<<aVariant);}
+	TVariantList(THardwareVariant a);
+	void Add(TInt aVariant)
+		{iList|=TUint(1<<aVariant);}
+	TVariantList& Union(const TVariantList aList)
+		{iList|=aList.iList; return *this;}
+	TVariantList& Intersection(const TVariantList aList)
+		{iList&=aList.iList; return *this;}
+	TBool operator==(const TVariantList aList) const
+		{return(iList==aList.iList);}
+	TBool operator!=(const TVariantList aList) const
+		{return(iList!=aList.iList);}
+	TBool operator<=(const TVariantList aList) const
+		{return(iList==(iList&aList.iList));}
+	TBool operator>=(const TVariantList aList) const
+		{return(iList==(iList|aList.iList));}
+	TBool operator[](TInt aVariant) const
+		{return(iList&TUint(1<<aVariant));}
+	TBool Empty() const
+		{return !iList;}
+	TUint Mask() const
+		{return iList;}
+	THardwareVariant Lookup() const;
+	static void SetNumVariants(TInt aNumVariants);
+	static void SetVariants(THardwareVariant* aVariants);
+private:
+	friend class RomFileStructure;
+	TUint iList;
+	static TInt NumVariants;
+	static THardwareVariant Variants[EMaxVariants];
+	};
+
+class Entry : public SetMember
+	{
+public:
+	Entry(TInt aType) : SetMember(aType), iRomNode(NULL) {}
+	Entry(const Entry& anEntry) : SetMember(anEntry), iRomNode(NULL) {}
+	TBool IsFile() const {return (Type()==EFile);}
+	TBool IsDir() const {return (Type()==EDir);}
+	TVariantList Variants() const {return iVariants;}
+	TRomEntry* CreateRomEntry(char*& anAddr) const;
+	void Restrict(TVariantList aList) {iVariants.Intersection(aList);}
+	const TText* Name() const;
+protected:
+	enum {EFile=0, EDir=1};
+	TVariantList iVariants;
+	TRomNode* iRomNode;
+	};
+
+class FileEntry : public Entry
+	{
+public:
+	static FileEntry* New(TRomNode* aFile);
+	virtual SetMember* Copy() const;
+	virtual ~FileEntry();
+	virtual void DebugPrint() const;
+protected:
+	FileEntry() : Entry(EFile) {}
+	FileEntry(const FileEntry& aFileEntry);
+	virtual TInt Compare(const SetMember& aMember) const;
+	};
+
+class Directory;
+class DirEntry : public Entry
+	{
+public:
+	static DirEntry* New(TRomNode* aFile, Directory* aDir);
+	virtual SetMember* Copy() const;
+	virtual ~DirEntry();
+	Directory* Dir() const {return iDir;}
+	TRomDir* CreateRomEntries(char*& anAddr) const;
+	virtual void DebugPrint() const;
+protected:
+	DirEntry() : Entry(EDir) {}
+	DirEntry(const DirEntry& aDirEntry);
+	virtual TInt Compare(const SetMember& aMember) const;
+protected:
+	Directory* iDir;
+	};
+
+class Directory : public FiniteSet
+	{
+public:
+	static Directory* New(TInt aMaxCount, TVariantList aList);
+	TInt Compile(const FiniteSet& aSet);
+	TInt Merge(const Directory& aDir);
+	TVariantList Variants() const {return iVariants;}
+	virtual void DebugPrint() const;
+	void Open();
+	virtual void Close();
+protected:
+	Directory(TInt aMaxCount);
+private:
+	Directory(const Directory &);
+	~Directory();
+protected:
+	friend class DirEntry;
+	TVariantList iVariants;
+	TRomDir* iRomDir;
+private:
+	static TInt DirectoryCount;
+private:
+	TInt iAccessCount;
+	TInt iIdentifier;
+	};
+
+class RomFileStructure : public FiniteSet
+	{
+public:
+	static RomFileStructure* New(TInt aMaxCount);
+	~RomFileStructure();
+	void Destroy();
+	TInt ProcessDirectory(TRomNode* aDir);
+protected:
+	RomFileStructure(TInt aMaxCount);
+	};
+
+
+#endif