imgtools/romtools/rofsbuild/r_romnode.h
changeset 0 044383f39525
child 590 360bd6b35136
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/romtools/rofsbuild/r_romnode.h	Tue Oct 27 16:36:35 2009 +0000
@@ -0,0 +1,291 @@
+/*
+* 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: 
+*
+*/
+
+
+#ifndef __R_ROMNODE_H__
+#define __R_ROMNODE_H__
+
+#if defined(__MSVCDOTNET__) || defined(__TOOLS2__)
+#include <fstream>
+#else //!__MSVCDOTNET__
+#include <fstream.h>
+#endif //__MSVCDOTNET__
+
+#include <e32std.h>
+#include "rofs.h"
+#include "e32image.h"
+#include "h_utl.h"
+
+const TUint KOverrideStack = 0x01;
+const TUint KOverrideHeapMin = 0x02;
+const TUint KOverrideHeapMax = 0x04;
+const TUint KOverrideRelocationAddress = 0x08;
+const TUint KOverrideUid1 = 0x10;
+const TUint KOverrideUid2 = 0x20;
+const TUint KOverrideUid3 = 0x40;
+const TUint KOverrideCallEntryPoint = 0x80;
+const TUint KOverrideNoCallEntryPoint = 0x100;
+const TUint KOverridePriority = 0x200;
+const TUint KOverrideStackReserve = 0x400;
+const TUint KOverrideKeepIAT = 0x800;
+const TUint KOverrideCapability = 0x1000;
+const TUint KOverrideFixed = 0x2000;
+const TUint KOverrideDllData  = 0x4000;
+const TUint KOverrideCodeUnpaged = 0x8000;
+const TUint KOverrideCodePaged = 0x10000;
+const TUint KOverrideDataUnpaged = 0x20000;
+const TUint KOverrideDataPaged = 0x40000;
+
+enum ECompression{
+	ECompressionUnknown=0,
+	ECompressionCompress=1,
+	ECompressionUncompress=2
+};
+
+const TInt KFileHidden = 0xFFFFFFFF;
+
+
+
+class TRomBuilderEntry;
+class RomFileStructure;
+class TRomNode
+	{
+public:
+	TRomNode(TText* aName, TRomBuilderEntry* aEntry=0);
+	~TRomNode();
+	void Destroy();
+
+	static inline TRomNode* FirstNode() { return TheFirstNode; };
+	inline TRomNode* NextNode() { return iNextNode; };
+	inline void SetNextNode(TRomNode* aNode) { iNextNode = aNode; };
+	inline TRomNode* Currentchild() const { return iChild; };
+	inline TRomNode* Currentsibling() const { return iSibling; };
+
+	void DisplayStructure(ostream* aOut);
+	TRomNode* FindInDirectory(TText *aName);
+	void AddFile(TRomNode *aChild);
+	TRomNode* NewSubDir(TText *aName);
+	TInt SetAtt(TText *anAttWord);
+	TInt SetAttExtra(TText *anAttWord, TRomBuilderEntry* aFile, enum EKeyword aKeyword);
+	inline void SetStackSize(TInt aValue);
+	inline void SetHeapSizeMin(TInt aValue);
+	inline void SetHeapSizeMax(TInt aValue);
+	inline void SetCapability(SCapabilitySet& aCapability);
+	inline void SetUid1(TInt aValue);
+	inline void SetUid2(TInt aValue);
+	inline void SetUid3(TInt aValue);
+	inline void SetPriority(TProcessPriority aValue);
+	inline void SetFixed();
+	inline void SetDllData();
+
+
+	TBool IsDirectory() const { return 0==iEntry; };
+	TBool IsFile() const { return 0!=iEntry; };
+
+	TInt CalculateDirectoryEntrySize( TInt& aDirectoryBlockSize,
+										    TInt& aFileBlockSize );
+
+	TInt CountFileAndDir(TInt& aFileCount, TInt& aDirCount);
+
+	TInt PlaceFile( TUint8* &aDest, TUint aOffset, TUint aMaxSize, CBytePair *aBPE );
+	TInt Place( TUint8* aDestBase );
+
+	TInt NameCpy(char* aDest, TUint8& aUnicodeLength );
+	TInt NameLengthUnicode() const;
+
+	void Rename(TRomNode *aOldParent, TRomNode* aNewParent, TText* aNewName);
+
+	TRofsEntry* RofsEntry() const { return iRofsEntry; };
+	void SetRofsEntry(TRofsEntry* aEntry);
+	inline void SetImagePosition( TInt aPosition ) { iImagePosition = aPosition; };
+	inline void SetFileBlockPosition( TInt aPosition ) { iFileBlockPosition = aPosition; };
+	
+	void AddNodeForSameFile(TRomNode* aPreviousNode, TRomBuilderEntry* aFile);
+
+	void CountDirectory(TInt& aFileCount, TInt& aDirCount);
+	TInt ProcessDirectory(RomFileStructure* aRFS);
+
+	TRomNode* CopyDirectory(TRomNode*& aLastExecutable);
+	void Alias(TRomNode* aNode);
+	
+	static void deleteTheFirstNode();
+	static void displayFlatList();
+	TInt FullNameLength(TBool aIgnoreHiddenAttrib = EFalse) const;
+	TInt GetFullName(char* aBuf, TBool aIgnoreHiddenAttrib = EFalse) const;
+	static void InitializeCount();
+	// Accessor Function.
+    inline TRomNode* GetParent() const { return iParent; }
+
+private:
+	void Remove(TRomNode* aChild);
+	void Add(TRomNode* aChild);
+	void Clone(TRomNode* aOriginal);
+
+	TInt CalculateEntrySize() const;
+
+private:	
+	static TInt Count;			// seed for unique identifiers
+
+	// Flat linked list of TRomNode structures
+	static TRomNode*	TheFirstNode;
+	static TRomNode*	TheLastNode;
+	TRomNode* iNextNode;
+
+	TRomNode* iParent;
+	TRomNode* iSibling;
+	TRomNode* iChild;
+	TRomNode* iNextNodeForSameFile;
+
+protected:
+	TInt iIdentifier;
+	TRofsEntry* iRofsEntry;		// in ROM image buffer
+
+	TInt	iTotalDirectoryBlockSize;	// calculated size of directory block
+	TInt	iTotalFileBlockSize;		// calculated size of file block
+
+
+	TInt iImagePosition;		// position of directory entry in image
+	TInt iFileBlockPosition;	// position of directory file block in image
+
+	friend class FileEntry;
+
+public:
+	TText* iName;
+	TUint8 iAtt;
+	TUint8 iAttExtra;
+	TBool iHidden;
+	TRomBuilderEntry* iEntry;		// represents file data
+	TUint	iFileStartOffset;		// position in image of start of file
+	TInt iSize;			        // size of associated file
+
+	// Override values
+	TInt iStackSize;
+	TInt iHeapSizeMin;
+	TInt iHeapSizeMax;
+	SCapabilitySet iCapability;
+	TInt iUid1;
+	TInt iUid2;
+	TInt iUid3;
+	TProcessPriority iPriority;
+
+	TInt iOverride;
+	TBool iFileUpdate;
+  bool iAlias;
+  // for a ROM image, all the files have a default read-only attribute, but in data drive, files's default attribute should be 0 
+	static TUint8 sDefaultInitialAttr ;
+	};
+
+
+
+class DllDataEntry;
+class TRomBuilderEntry
+	{
+public:
+	TRomBuilderEntry(const char *aFileName, TText *aName);
+	~TRomBuilderEntry();
+	void SetRomNode(TRomNode* aNode);
+	TRofsEntry* RofsEntry() const {return iRomNode->RofsEntry(); };
+	TInt PlaceFile( TUint8* &aDest, TUint aMaxSize, CBytePair *aBPE );
+
+	inline TInt RealFileSize() const { return iRealFileSize; };
+	inline void SetRealFileSize(TInt aFileSize) { iRealFileSize=aFileSize;};
+	void DisplaySize(TPrintType aWhere);
+	
+private:
+	TRomBuilderEntry();
+	TRomBuilderEntry(const TRomBuilderEntry&);
+	const TRomBuilderEntry& operator==(const TRomBuilderEntry &);
+	DllDataEntry* iFirstDllDataEntry;
+
+public:
+	TText *iName;
+	char *iFileName;
+
+	TRomBuilderEntry* iNext;
+	TRomBuilderEntry* iNextInArea;
+	TBool iExecutable;
+	TBool iFileOffset; // offset of the file in ROM
+	TUint iCompressEnabled;
+	TUint8 iUids[sizeof(TCheckedUid)];
+	TBool iHidden;
+  	DllDataEntry* GetFirstDllDataEntry() const;
+	void SetFirstDllDataEntry(DllDataEntry *aDllDataEntry);
+
+private:
+	TRomNode *iRomNode;
+	TInt	iRealFileSize;	
+	};
+
+
+inline void TRomNode::SetStackSize(TInt aValue)
+	{
+	iStackSize = aValue;
+	iOverride |= KOverrideStack;
+	}
+
+inline void TRomNode::SetHeapSizeMin(TInt aValue)
+	{
+	iHeapSizeMin = aValue;
+	iOverride |= KOverrideHeapMin;
+	}
+
+inline void TRomNode::SetHeapSizeMax(TInt aValue)
+	{
+	iHeapSizeMax = aValue;
+	iOverride |= KOverrideHeapMax;
+	}
+
+inline void TRomNode::SetCapability(SCapabilitySet& aCapability)
+	{
+	iCapability = aCapability;
+	iOverride |= KOverrideCapability;
+	}
+
+inline void TRomNode::SetUid1(TInt aValue)
+	{
+	iUid1 = aValue;
+	iOverride |= KOverrideUid1;
+	}
+
+inline void TRomNode::SetUid2(TInt aValue)
+	{
+	iUid2 = aValue;
+	iOverride |= KOverrideUid2;
+	}
+
+inline void TRomNode::SetUid3(TInt aValue)
+	{
+	iUid3 = aValue;
+	iOverride |= KOverrideUid3;
+	}
+
+inline void TRomNode::SetPriority(TProcessPriority aValue)
+	{
+	iPriority = aValue;
+	iOverride |= KOverridePriority;
+	}
+
+inline void TRomNode::SetFixed()
+	{
+	iOverride |= KOverrideFixed;
+	}
+inline void TRomNode::SetDllData()
+{
+	iOverride |= KOverrideDllData;
+}
+
+#endif