imgtools/imglib/filesystem/include/dirregion.h
author timothy.murphy@nokia.com
Thu, 25 Mar 2010 13:43:28 +0000
branchfix
changeset 408 a819f9223567
parent 0 044383f39525
child 590 360bd6b35136
permissions -rw-r--r--
fix: stop using "magic" numbers in string operations for the copyannofile2log feature fix: When using the copylogfromannofile workaround, extract the build ID and build duration and add to the log as these are useful for analysis. The log should now be identical to the stdout file. fix: Remove extra blank lines from output in copylogfromannofile mode.

/*
* Copyright (c) 2006-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: 
* CDIRREGION.H
* Directory Region Operations for FileSystem component
* @internalComponent
* @released
*
*/


#ifndef DIRREGION_H
#define DIRREGION_H

#include "filesystemclass.h"
#include "longname.h"

#include <fstream>
#include <map>
#include <string>

class CFileSystem;

typedef std::ofstream OfStream;
typedef std::ifstream IfStream;
typedef std::ios Ios;
typedef std::map<unsigned int,std::string> StringMap;

/**
This class describes the member functions and data members required to create directory/data
region of FAT image.

@internalComponent
@released
*/

class CDirRegion
	{
	private:
		void FormatName(String& aString,char aAttrValue);
		unsigned int Get32BitClusterNumber(unsigned int aHighWord, unsigned int aLowWord);
		void CheckEntry(EntryList aNodeList);
		void CreateDirEntry(CDirectory* aEntry,unsigned int aParentDirClusterNumber);
		void CreateAndWriteCurrentDirEntry(unsigned int aCurClusterNumber,String& aString);
		void CreateAndWriteParentDirEntry(unsigned int aParDirClusterNumber,String& aString);
		void WriteEntryToString(CDirectory* aEntry,String& aString);
		bool IsLongEntry(CDirectory* aEntry) const;
		void CreateLongEntries(CDirectory* aEntry,String& aDirString);
		void WriteFileDataInToCluster(CDirectory* aEntry); 
		void PushStringIntoClusterMap(unsigned int aNumber, 
									  String& aDirString,
									  unsigned long int aClusterSize,
									  char aAttribute);
		void PushDirectoryEntryString(unsigned int aNumber,String& aString,int aClustersRequired);

	public:
		CDirRegion(	EntryList iNodeList,
					CFileSystem *aFileSystemPtr);
		~CDirRegion();
		void Execute();
		void WriteClustersIntoFile(OfStream& aOutPutStream);
		TClustersPerEntryMap* GetClustersPerEntryMap() const;

	private:
		IfStream iInputStream; //Input stream, used to read file contents
		CCluster* iClusterPtr; //pointer to class CCluster
		bool iCurrentDirEntry; //Is current entry(.) is created?
		bool iParentDirEntry;//Is parent entry (..) is created?
		bool iFirstCluster; //Is this the first cluster for the current FAT image?

		unsigned int iCurEntryClusterNumber; //Holds current entries cluster number
		unsigned int iClusterKey; //Number used to map cluster with cluster contents
		/* To avoid calling CCluster::GetClusterSize() function multiple times, this 
		 *variable introduced.
		 */
		unsigned long int iClusterSize;
		
		StringMap iClusterMap; //The map between cluster number and cluster
		unsigned int iRootDirSizeInBytes;//Reserved sectors for root directory entry
		EntryList iNodeList;//To hold root directory entry
	};

#endif //DIRREGION_H