imgtools/romtools/readimage/src/rom_image_reader.cpp
changeset 590 360bd6b35136
parent 0 044383f39525
child 712 df89378e9223
--- a/imgtools/romtools/readimage/src/rom_image_reader.cpp	Wed Jun 16 16:51:40 2010 +0300
+++ b/imgtools/romtools/readimage/src/rom_image_reader.cpp	Wed Jun 23 16:56:47 2010 +0800
@@ -1,953 +1,913 @@
-/*
-* Copyright (c) 2005-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: 
-* @internalComponent 
-* @released
-*
-*/
-
-#include <e32rom.h>
-#include "rom_image_reader.h"
-#include "r_rom.h"
-
-void InflateUnCompress(unsigned char* source, int sourcesize, unsigned char* dest, int destsize);
-RomImageFSEntry::RomImageFSEntry (const char* aName) : iName(aName), iSibling(0), iChildren(0) {
-}
-RomImageFSEntry::~RomImageFSEntry() {
-	if(iChildren){
-		delete iChildren;
-		iChildren = NULL ;
-	}
-	if(iSibling){
-		delete iSibling ;
-		iSibling = NULL ;
-	}	
-}
-
-//Rom Image header 
-RomImageHeader::RomImageHeader(char* aHdr, EImageType aImgType)
-{
-	switch( aImgType)
-	{
-	case EROM_IMAGE:
-		iLoaderHdr = (TRomLoaderHeader*)aHdr;
-		iRomHdr = (TRomHeader*)(aHdr + sizeof(TRomLoaderHeader));
-		iExtRomHdr = 0;
-		break;
-
-	case EROMX_IMAGE:
-		iExtRomHdr = (TExtensionRomHeader*)(aHdr);
-		iRomHdr = 0;
-		iLoaderHdr = 0;
-		break;
-        
-    case EBAREROM_IMAGE:
-        iLoaderHdr = 0;
-        iRomHdr = (TRomHeader*)aHdr;
-        iExtRomHdr = 0;
-        break;
-   default:
-   		iExtRomHdr = 0;
-		iRomHdr = 0;
-		iLoaderHdr = 0;
-   	break ;
-	}
-}
-
-
-void RomImageHeader::DumpRomHdr()
-{
-    if(iLoaderHdr)
-        *out << "ROM Image " << endl << endl;
-    else
-        *out << "Bare ROM Image" << endl << endl;
-	TUint aPos = 0;
-	bool aContinue = true;
-	
-	*out << "Image Signature .................";
-
-    if(iLoaderHdr){
-        TText *aRomName =  reinterpret_cast<TText *>(iLoaderHdr) ;
-        while (aPos < KRomNameSize) {
-            *out << (char)aRomName[aPos++];
-        }
-    }
-
-	*out << endl << endl;
-
-	DumpInHex("Timestamp", (iRomHdr->iTime >> 32)) ;
-	DumpInHex(" ", (iRomHdr->iTime &0xffffffff), aContinue) << endl;
-
-	DumpInHex("RomBase", iRomHdr->iRomBase) << endl;
-
-	DumpInHex("RomSize", iRomHdr->iRomSize) << endl;
-	DumpInHex("KernelDataAddress", iRomHdr->iKernDataAddress) << endl;
-	DumpInHex("KernelLimit", iRomHdr->iKernelLimit) << endl;
-	DumpInHex("PrimaryFile", iRomHdr->iPrimaryFile) << endl;
-	DumpInHex("SecondaryFile", iRomHdr->iSecondaryFile) << endl;
-	DumpInHex("CheckSum", iRomHdr->iCheckSum) << endl;
-	DumpInHex("Hardware", iRomHdr->iHardware) << endl;
-
-	DumpInHex("Language", (TUint)(iRomHdr->iLanguage >> 32));
-	DumpInHex(" ", ((TUint)(iRomHdr->iLanguage & 0xffffffff)), aContinue) <<endl;
-
-	DumpInHex("KernelConfigFlags", iRomHdr->iKernelConfigFlags) << endl;
-	DumpInHex("RomExceptionSearchTable", iRomHdr->iRomExceptionSearchTable) << endl;
-	DumpInHex("RomHeaderSize", iRomHdr->iRomHeaderSize) << endl;
-	DumpInHex("RomSectionHeader", iRomHdr->iRomSectionHeader) << endl;
-	DumpInHex("TotalSvDataSize", iRomHdr->iTotalSvDataSize) << endl;
-	DumpInHex("VariantFile", iRomHdr->iVariantFile) << endl;
-	DumpInHex("ExtensionFile", iRomHdr->iExtensionFile) << endl;
-	DumpInHex("RelocInfo", iRomHdr->iRelocInfo) << endl;
-	DumpInHex("OldTraceMask", iRomHdr->iOldTraceMask) << endl;
-	DumpInHex("UserDataAddress", iRomHdr->iUserDataAddress) << endl;
-	DumpInHex("TotalUserDataSize", iRomHdr->iTotalUserDataSize) << endl;
-	DumpInHex("DebugPort", iRomHdr->iDebugPort) << endl;
-	
-	DumpInHex("Version", iRomHdr->iVersion.iMajor, false, 2);
-	DumpInHex(".", iRomHdr->iVersion.iMinor, aContinue, 2);
-	DumpInHex("(" ,iRomHdr->iVersion.iBuild, aContinue, 2);
-	*out << ")" << endl;
-
-	DumpInHex("CompressionType", iRomHdr->iCompressionType) << endl;
-	DumpInHex("CompressedSize", iRomHdr->iCompressedSize) << endl;
-	DumpInHex("UncompressedSize", iRomHdr->iUncompressedSize) << endl;
-	DumpInHex("HcrFileAddress", iRomHdr->iHcrFileAddress) << endl;
-	
-	DumpInHex("DisabledCapabilities", iRomHdr->iDisabledCapabilities[0]);
-	DumpInHex(" ", iRomHdr->iDisabledCapabilities[1], aContinue) << endl;
-
-	DumpInHex("TraceMask", iRomHdr->iTraceMask[0]);
-	aPos = 1;
-	while( aPos < (TUint)KNumTraceMaskWords)
-	{
-		if(iRomHdr->iTraceMask[aPos])
-		{
-			DumpInHex(" ", iRomHdr->iTraceMask[aPos++], aContinue);
-		}
-		else
-		{
-			DumpInHex(" ", iRomHdr->iTraceMask[aPos++], aContinue, 1);
-		}
-
-	}
-
-	*out << endl << endl;
-
-}
-void RomImageHeader::DumpRomXHdr()
-{
-	*out << "Extension ROM Image" << endl << endl;
-	bool aContinue = true;
-	
-	DumpInHex("Timestamp", (iExtRomHdr->iTime >> 32)) ;
-	DumpInHex(" ", (iExtRomHdr->iTime &0xffffffff), aContinue) << endl;
-
-	DumpInHex("RomBase", iExtRomHdr->iRomBase) << endl;
-
-	DumpInHex("RomSize", iExtRomHdr->iRomSize) << endl;
-	DumpInHex("CheckSum", iExtRomHdr->iCheckSum) << endl;
-	
-	DumpInHex("Version", iExtRomHdr->iVersion.iMajor, false, 2);
-	DumpInHex(".", iExtRomHdr->iVersion.iMinor, aContinue, 2);
-	DumpInHex("(" ,iExtRomHdr->iVersion.iBuild, aContinue, 2);
-	*out << ")" << endl;
-
-	DumpInHex("CompressionType", iExtRomHdr->iCompressionType) << endl;
-	DumpInHex("CompressedSize", iExtRomHdr->iCompressedSize) << endl;
-	DumpInHex("UncompressedSize", iExtRomHdr->iUncompressedSize) << endl;
-	
-	*out << endl << endl;
-
-}
-//Rom Image reader
-RomImageReader::RomImageReader(const char* aFile, EImageType aImgType) :
-ImageReader(aFile), iImageHeader(0),
-iRomSize(0),iHeaderBuffer(0),
-iRomLayoutData(0),iImgType(aImgType)
-{
-	iRomImageRootDirEntry = new RomImageDirEntry("");
-}
-
-RomImageReader::~RomImageReader()
-{
-	if(iFile.is_open())
-		iFile.close();
-	if(iHeaderBuffer)
-		delete []iHeaderBuffer;
-	if(iRomLayoutData)
-		delete []iRomLayoutData;  
-	delete iRomImageRootDirEntry;
-
-	
-}
-
-void RomImageReader::ReadImage()
-{
-	if(iFile.is_open()) return ;
-	iFile.open(iImgFileName.c_str(), ios::binary | ios::in);
-	if( !iFile.is_open() ) {
-		throw ImageReaderException(iImgFileName.c_str(), "Cannot open file ");
-	}	
-	
-	TUint headerSize = GetHdrSize() ;	
-	if(headerSize > 0){
-		iHeaderBuffer = new char[headerSize];
-		iFile.read(iHeaderBuffer,headerSize);
-	}	
-}
- 
-void RomImageReader::Validate()
-{
-}
-
-TUint32 RomImageReader::GetImageCompressionType()
-{
-	if(iImageHeader->iRomHdr )// iImageType == EROM_IMAGE
-		return iImageHeader->iRomHdr->iCompressionType;
-	else
-		return iImageHeader->iExtRomHdr->iCompressionType;
-}
-
- 
-TLinAddr RomImageReader::GetRomBase()
-{
-	if(iImageHeader->iRomHdr )// iImageType == EROM_IMAGE
-		return iImageHeader->iRomHdr->iRomBase ;
-	else
-		return iImageHeader->iExtRomHdr->iRomBase;
-}
-
-TLinAddr RomImageReader::GetRootDirList()
-{
-	if(iImageHeader->iRomHdr )// iImageType == EROM_IMAGE
-		return iImageHeader->iRomHdr->iRomRootDirectoryList;
-	else
-		return iImageHeader->iExtRomHdr->iRomRootDirectoryList;
-}
-
-TUint RomImageReader::GetHdrSize()
-{
-	TUint headerSize = 0;
-	if(EROM_IMAGE == iImgType){
-		headerSize = sizeof(TRomLoaderHeader) + sizeof(TRomHeader);
-	}else if(EROMX_IMAGE == iImgType){
-		headerSize = sizeof(TExtensionRomHeader);
-	}else if(EBAREROM_IMAGE == iImgType){
-		headerSize = sizeof(TRomHeader);
-	}
-	return headerSize;
-}
- 
- 
-static const TInt KIOBytes = 0x100000;
-// reading a huge buffer at a time is very slow, reading 1MB bytes at a time is much faster
-void RomImageReader::ReadData(char* aBuffer, TUint aLength)
-{
-	TUint readBytes = 0 ;
-	while(readBytes < aLength){
-		TUint toRead = KIOBytes;
-		if(readBytes + toRead > aLength)
-			toRead = aLength - readBytes ;
-		iFile.read(&aBuffer[readBytes],toRead);
-		readBytes += toRead ;
-	}	
-}
-void RomImageReader::ProcessImage()
-{
-	if(iRomLayoutData) return ;
-	iImageHeader = new RomImageHeader(iHeaderBuffer, iImgType);
-
-	iFile.seekg(0, ios::end);
-	// fileSize
-	TUint fileSize = iFile.tellg(); 
-
-	//let's skip the RomLoaderHeader
-	TUint romDataBegin = (EROM_IMAGE == iImgType) ? sizeof(TRomLoaderHeader) : 0 ; 
-	iFile.seekg(romDataBegin,ios::beg);	
-
-	if(EROMX_IMAGE == iImgType){// EROMX_IMAGE, just set the iUnpagedRomBuffer		
-		if(GetImageCompressionType() == KUidCompressionDeflate){
-			TUint32 readLen = fileSize - sizeof(TExtensionRomHeader) ; 
-			iRomSize = iImageHeader->iExtRomHdr->iUncompressedSize ;	 
-			iRomLayoutData = new char[iRomSize];
-			char* temp = new char[readLen];
-			// header is not compressed.
-			iFile.read(iRomLayoutData,sizeof(TExtensionRomHeader)); 
-			ReadData(temp ,readLen);
-			TUint8* uncompressDest = reinterpret_cast<TUint8*>(iRomLayoutData + sizeof(TExtensionRomHeader));
-			InflateUnCompress(reinterpret_cast<TUint8*>(temp),readLen,uncompressDest,iRomSize - sizeof(TExtensionRomHeader));
-			delete []temp ;	 
-			
-		}else{
-			iRomSize = fileSize  ;
-			iRomLayoutData = new char[iRomSize]; 
-			ReadData(iRomLayoutData,iRomSize);
-		}	 
-	} // end EROMX_IMAGE
-	else {
-		 //EROM_IMAGE or EBAREROM_IMAGE
-		const TInt KPageSize = 0x1000; 
-		TRomHeader *hdr = iImageHeader->iRomHdr; 
-		iRomSize = hdr->iUncompressedSize ; 
-		iRomLayoutData = new char[iRomSize]; 
-		char* curDataPointer = iRomLayoutData ;
-		TUint totalReadBytes = 0;
-		bool hasPageableSec = (hdr->iPageableRomStart > 0 && hdr->iPageableRomSize > 0) ;
-		
-		// read data before unpaged 
-		ReadData(curDataPointer,hdr->iCompressedUnpagedStart); 
-		curDataPointer += hdr->iCompressedUnpagedStart ; 
-		totalReadBytes += hdr->iCompressedUnpagedStart;		
-
-		// read the unpaged part, if compressed , then decompress		 
-		if(GetImageCompressionType() == KUidCompressionDeflate){
-			char* temp = new char[hdr->iUnpagedCompressedSize];
-			ReadData(temp,hdr->iUnpagedCompressedSize);
-			totalReadBytes += hdr->iUnpagedCompressedSize;
-			InflateUnCompress(reinterpret_cast<TUint8*>(temp),hdr->iUnpagedCompressedSize,reinterpret_cast<TUint8*>(curDataPointer) ,hdr->iUnpagedUncompressedSize);
-			delete []temp ;			
-		}else{
-			TUint unpagedSeclen ;
-			if(hasPageableSec) { // there is paged section 
-				unpagedSeclen = hdr->iPageableRomStart - hdr->iCompressedUnpagedStart;
-			}else{
-				unpagedSeclen = iRomSize - hdr->iCompressedUnpagedStart;
-			}
-			ReadData(curDataPointer,unpagedSeclen);			 
-			totalReadBytes += unpagedSeclen ;
-		}
-		curDataPointer = iRomLayoutData + totalReadBytes; 
-		//if there is a paged section , read and extract it 
-
-		// read the paged section,
-		if(hasPageableSec){		
-			if((TUint)(hdr->iPageableRomStart + hdr->iPageableRomSize) > iRomSize){
-					throw ImageReaderException("Incorrect values of ROM header fields.", "");
-			}
-			if(0 == hdr->iRomPageIndex){ //
-				// no compression for paged section ,just read it 			 
-				iFile.read(curDataPointer,iRomSize - totalReadBytes);
-			}
-			else{
-				//aligment calculation
-				TUint pagedSecOffset = (totalReadBytes + KPageSize - 1) & (~(KPageSize - 1));
-				if(pagedSecOffset > totalReadBytes){
-					// there are gap bytes between unpaged and paged sections
-					iFile.read(curDataPointer,pagedSecOffset - totalReadBytes);
-					curDataPointer = iRomLayoutData + pagedSecOffset;
-				}
-				TUint pagedIndexCount = ( hdr->iUncompressedSize + KPageSize - 1) / KPageSize;
-				// how many bytes ?
-				// the page index table include the unpaged part ;
-				TUint firstPagedIndexTblItem = hdr->iPageableRomStart / KPageSize;
-			 
-				TUint tempBufLen = KPageSize << 8;
-				char* readBuffer = new char[tempBufLen]; 
-			 
-				TUint8* src,*srcNext = NULL;
-				SRomPageInfo* pageInfo = reinterpret_cast<SRomPageInfo*>(&iRomLayoutData[hdr->iRomPageIndex]);
-				CBytePair bp(EFalse);
-				for(TUint i = firstPagedIndexTblItem ; i < pagedIndexCount ; i+= 256){
-					TUint endIndex = i + 255 ;
-					if(endIndex >= pagedIndexCount)
-						endIndex = pagedIndexCount - 1;
-					TUint readLen = pageInfo[endIndex].iDataStart + pageInfo[endIndex].iDataSize - pageInfo[i].iDataStart ; 
-					iFile.read(readBuffer,readLen);
-					src = reinterpret_cast<TUint8*>(readBuffer);
-					for(TUint j = i ; j <= endIndex ; j++){
-						switch(pageInfo[j].iCompressionType)
-						{
-						case SRomPageInfo::EBytePair:
-							{
-							TInt unpacked = bp.Decompress(reinterpret_cast<TUint8*>(curDataPointer), KPageSize, src, pageInfo[j].iDataSize, srcNext);
-							if (unpacked < 0) {
-								delete []readBuffer;
-								throw ImageReaderException("Corrupted BytePair compressed ROM image", "");
-							}
-							curDataPointer += unpacked;
-							break ;
-							}
-						case SRomPageInfo::ENoCompression:
-							memcpy(curDataPointer,src,pageInfo[j].iDataSize);
-							curDataPointer +=  pageInfo[j].iDataSize ;
-							break ;
-						default:
-							delete []readBuffer;
-							throw ImageReaderException("Undefined compression type", "");
-							break ;
-						
-						}
-						src += pageInfo[j].iDataSize; 
-					} // end for(TUint j = i ; j <= endIndex ; j++) 
-				} // end for(TUint i = firstPagedIndexTblItem ; i < pagedIndexCount ; i+= 256) 
-				delete []readBuffer ;
-			}// else
-			 
-		} // if(hasPageableSec)  
-
-	}
-	TUint32 offset = GetRootDirList() - GetRomBase(); 
-	TRomRootDirectoryList* rootDirList = reinterpret_cast<TRomRootDirectoryList*>(iRomLayoutData + offset );
-	TInt dirCount = rootDirList->iNumRootDirs ; 
-	string tempName ;
-	for(TInt i = 0 ; i < dirCount ; i++) {
-		offset = rootDirList->iRootDir[i].iAddressLin - GetRomBase(); 
-		TRomDir* romDir = reinterpret_cast<TRomDir*>(iRomLayoutData + offset);		
-		Name(tempName,reinterpret_cast<const wchar_t *>(romDir->iEntry.iName),romDir->iEntry.iNameLength); 		 
-		BuildDir(romDir, iRomImageRootDirEntry);		 
-	}
- 
-}
- 
- 
-void RomImageReader::BuildDir(TRomDir* aDir, RomImageFSEntry* aPaFSEntry)
-{	 
-	
-	TInt processBytes = 0 ;
-	TInt totalDirBytes = aDir->iSize - sizeof(aDir->iSize);
-	TRomEntry* entry = &aDir->iEntry;
-	RomImageFSEntry *fsEntry ;
-	string name ;
-	const char* pritableName = "";
-
-	while(processBytes < totalDirBytes){
-		Name(name,reinterpret_cast<const wchar_t *>(entry->iName),entry->iNameLength);
-		pritableName = name.c_str(); 
-		if(entry->iAtt & 0x10) { // is a directory
-			fsEntry = new RomImageDirEntry(pritableName); 
-			AddChild(aPaFSEntry,fsEntry,NULL);
-			TUint offset = entry->iAddressLin - GetRomBase();
-			TRomDir* subFolder = reinterpret_cast<TRomDir*>(iRomLayoutData + offset);		 
-			BuildDir(subFolder,fsEntry); 
-		}
-		else{
-			fsEntry = new RomImageFileEntry(pritableName); 
-			AddChild(aPaFSEntry,fsEntry,entry);
-		} 
-		// increase the processedBytes
-		processBytes += (entry->iNameLength << 1) +  reinterpret_cast<TInt>(entry->iName) - reinterpret_cast<TInt>(entry); 
-
-		//align to next 4 bytes
-		processBytes = (processBytes + 3) & ( ~3 ); 
-		// get next entry
-		entry =  reinterpret_cast<TRomEntry*>( reinterpret_cast<char*>(&aDir->iEntry) + processBytes);
-	} 
-	
-}
-
-void RomImageReader::AddChild(RomImageFSEntry *aParent, RomImageFSEntry *aChild, TRomEntry* aRomEntry)
-{
-	if(!aParent->iChildren)
-		aParent->iChildren = aChild;
-	else {
-		RomImageFSEntry *aLast = aParent->iChildren;
-
-		while(aLast->iSibling)
-			aLast = aLast->iSibling;
-		aLast->iSibling = aChild;
-	}
-
-	if(!aChild->IsDirectory()) { 
-		RomImageFileEntry* file = static_cast<RomImageFileEntry*>(aChild);
-		file->iTRomEntryPtr = aRomEntry;
-
-		if(aRomEntry->iAddressLin > GetRomBase()) {
-			TUint32 offset = aRomEntry->iAddressLin - GetRomBase();	 
-		 
-			TRomImageHeader* imgHdr = reinterpret_cast<TRomImageHeader*>(iRomLayoutData + offset);
-			 
-			file->ImagePtr.iRomFileEntry = imgHdr;
-
-			TUint8 aUid1[4];
-			memcpy(aUid1, &file->ImagePtr.iRomFileEntry->iUid1, 4);
-
-			if( ReaderUtil::IsExecutable(aUid1) ) {
-				file->iExecutable = true;
-			}
-			else {
-				file->iExecutable = false;
-				file->ImagePtr.iDataFileAddr = aRomEntry->iAddressLin;
-			}
-		}
-		else {
-			file->ImagePtr.iRomFileEntry = NULL; 
-		}
-	}
-
-	if(aParent != iRomImageRootDirEntry) {
-		aChild->iPath = aParent->iPath;
-		aChild->iPath += DIR_SEPARATOR;
-		aChild->iPath += aParent->iName.c_str();
-	}
-}
-
-void RomImageReader::Name(string& aName, const wchar_t* aUnicodeName, TUint aLen)
-{
-	char* temp = (char*)_alloca((aLen << 1) + 1) ;
-	size_t n = wcsrtombs(temp,&aUnicodeName,aLen,NULL);
-	if(n == (size_t)-1){ // the unicode string can not be coverted.
-		aName = "???";
-	}
-	temp[n] = 0;
-	if(n > 0)
-		aName.assign(temp,n) ;
-	else
-		aName = "";
- 
-}
-
-void RomImageReader::DumpTree()
-{
-	RomImageFSEntry* aFsEntry = iRomImageRootDirEntry;
-	if( aFsEntry->iChildren ) 
-		DumpSubTree(aFsEntry->iChildren); 
-}
-
-void RomImageReader::DumpDirStructure()
-{
-	*out << "Directory Listing" << endl;
-	*out << "=================" << endl;
-	int aPadding = 0;
-	if( iRomImageRootDirEntry ){
-		DumpDirStructure(iRomImageRootDirEntry, aPadding);
-	}	
-	*out << endl << endl;
-}
-
-void RomImageReader::DumpDirStructure(RomImageFSEntry* aEntry, int &aPadding)
-{
-	if(!aEntry)
-		return;
-
-	int aPadLen = 2 * aPadding;//scaling for legibility
-	for (int i = 0; i < aPadLen; i++)
-		*out << " ";
-
-	*out << aEntry->Name() << endl;
-
-	if( aEntry->iChildren){
-		aPadding++;
-		DumpDirStructure(aEntry->iChildren, aPadding);
-		aPadding--;
-	}
-	DumpDirStructure(aEntry->iSibling, aPadding);
-}
-
-void RomImageReader::DumpSubTree(RomImageFSEntry* aFsEntry)
-{
-	if(!aFsEntry)
-		return;
-
-	if( aFsEntry->iChildren ){
-		DumpSubTree(aFsEntry->iChildren);
-	}
-
-	if( aFsEntry->iSibling )
-		DumpSubTree(aFsEntry->iSibling);
-
-	RomImageFSEntry *aEntry = aFsEntry;
-	
-	if(!aEntry->IsDirectory()) {
-		*out << "********************************************************************" << endl;
-		*out << "File........................" << aEntry->iPath.c_str() << DIR_SEPARATOR << aEntry->Name() << endl;
-
-		if( ((RomImageFileEntry*)aEntry)->iExecutable )	{
-			DumpImage((RomImageFileEntry*)aEntry);
-		}
-		else{
-			*out << "Linear Addr................." << ((RomImageFileEntry*)aEntry)->ImagePtr.iDataFileAddr << endl;
-		}
-	}
-}
-
-void RomImageReader::DumpImage(RomImageFileEntry * aEntry)
-{
-	bool aContinue = true;
-
-	DumpInHex("Load Address", aEntry->iTRomEntryPtr->iAddressLin) << endl;
-	DumpInHex("Size", aEntry->iTRomEntryPtr->iSize) << endl;
-
-	TRomImageHeader		*aRomImgEntry = aEntry->ImagePtr.iRomFileEntry;
-
-	if( !aRomImgEntry )
-		return;
-	//UIDs
-	DumpInHex("Uids", aRomImgEntry->iUid1);
-	DumpInHex(" ", aRomImgEntry->iUid2, aContinue);
-	DumpInHex(" ", aRomImgEntry->iUid3, aContinue);
-	DumpInHex(" ", aRomImgEntry->iUidChecksum, aContinue) << endl;
-
-	DumpInHex("Entry point", aRomImgEntry->iEntryPoint) << endl;
-	DumpInHex("Code start addr", aRomImgEntry->iCodeAddress) << endl;
-	DumpInHex("Data start addr", aRomImgEntry->iDataAddress) << endl;
-	DumpInHex("DataBssLinearBase", aRomImgEntry->iDataBssLinearBase) << endl;
-	DumpInHex("Text size", aRomImgEntry->iTextSize) << endl;
-	DumpInHex("Code size", aRomImgEntry->iCodeSize) << endl;
-	DumpInHex("Data size", aRomImgEntry->iDataSize) << endl;
-	DumpInHex("Bss size", (aRomImgEntry->iBssSize)) << endl;
-	DumpInHex("Total data size", aRomImgEntry->iTotalDataSize) << endl;
-	DumpInHex("Heap min", aRomImgEntry->iHeapSizeMin) << endl;
-	DumpInHex("Heap max", aRomImgEntry->iHeapSizeMax) << endl;
-	DumpInHex("Stack size", aRomImgEntry->iStackSize) << endl;
-
-	TDllRefTable *aRefTbl = NULL;
-
-	if( aRomImgEntry->iDllRefTable ) {
-		TUint32 aOff = (TUint32)aRomImgEntry->iDllRefTable - iImageHeader->iRomHdr->iRomBase;
-		aRefTbl = (TDllRefTable*) ((char*)iImageHeader->iRomHdr + aOff);
-		TUint32 aVirtualAddr = (TUint32)aRefTbl->iEntry[0];
-		DumpInHex("Dll ref table", aVirtualAddr) << endl;
-	}
-
-	DumpInHex("Export directory", aRomImgEntry->iExportDir) << endl;
-	DumpInHex("Export dir count", aRomImgEntry->iExportDirCount) << endl;
-	DumpInHex("Hardware variant", aRomImgEntry->iHardwareVariant) << endl;
-	DumpInHex("Flags", aRomImgEntry->iFlags) << endl;
-	DumpInHex("Secure ID", aRomImgEntry->iS.iSecureId) << endl;
-	DumpInHex("Vendor ID", aRomImgEntry->iS.iVendorId) << endl;
-
-	DumpInHex("Capability", aRomImgEntry->iS.iCaps[1]);
-	DumpInHex(" ", aRomImgEntry->iS.iCaps[0], aContinue) << endl;
-	
-	*out << "Tools Version..............." << dec << (TUint)aRomImgEntry->iToolsVersion.iMajor;
-	*out << "." ; 
-	out->width(2) ;
-	out->fill('0');
-	*out << dec << (TUint)aRomImgEntry->iToolsVersion.iMinor ;
-	*out << "(" << dec << aRomImgEntry->iToolsVersion.iBuild << ")";
-	*out << endl;
-
-	*out << "Module Version.............." << dec << (aRomImgEntry->iModuleVersion >> 16) << endl;
-	DumpInHex("Exception Descriptor", aRomImgEntry->iExceptionDescriptor) << endl;
-	*out << "Priority...................." << dec << aRomImgEntry->iPriority << endl;
-
-	if( aRefTbl )
-		DumpInHex("Dll ref table size", aRefTbl->iNumberOfEntries*8) << endl;
-	else
-		DumpInHex("Dll ref table size", 0) << endl;
-
-	if( iDisplayOptions & DUMP_E32_IMG_FLAG){
-		if(stricmp(iE32ImgFileName.c_str(), aEntry->Name()) == 0){
-			TUint aSectionOffset = aRomImgEntry->iCodeAddress - iImageHeader->iRomHdr->iRomBase;
-			TUint* aCodeSection = (TUint*)((char*)iImageHeader->iRomHdr + aSectionOffset);
-			*out << "\nCode (Size=0x" << hex << aRomImgEntry->iCodeSize << ")" << endl;
-			DumpData(aCodeSection, aRomImgEntry->iCodeSize);
-
-			aSectionOffset = aRomImgEntry->iDataAddress - iImageHeader->iRomHdr->iRomBase;
-			TUint* aDataSection = (TUint*)((char*)iImageHeader->iRomHdr + aSectionOffset);
-			if( aRomImgEntry->iDataSize){
-				*out << "\nData (Size=0x" << hex << aRomImgEntry->iDataSize << ")" << endl;
-				DumpData(aDataSection, aRomImgEntry->iDataSize);
-			}
-		}
-	}
-
-	*out << endl << endl;
-}
-
-void RomImageReader::DumpAttribs(RomImageFSEntry* aFsEntry)
-{
- 
-// a larger rom image cause stack overflow under visual studio if we use recursion algorithm here.
-// can gcc compiler guarantee this overflow will never be happen ?
- 	if( aFsEntry->iChildren )
-		DumpAttribs(aFsEntry->iChildren);
-
-	if(aFsEntry->iSibling)
-		DumpAttribs(aFsEntry->iSibling);
-	if(aFsEntry->IsDirectory()) return ;
-	RomImageFileEntry* file = static_cast<RomImageFileEntry*>(aFsEntry);
-	if(!file->iExecutable) return ; 
-	TRomImageHeader* aRomImgEntry = file->ImagePtr.iRomFileEntry;
-
-	if( !aRomImgEntry)  return; 
-	
-	const char* prefix ;
-	if(aRomImgEntry->iFlags & KRomImageFlagPrimary){
-		prefix = "Primary";
-	}
-	else if(aRomImgEntry->iFlags & KRomImageFlagVariant){
-		prefix = "Variant";
-	}
-	else if(aRomImgEntry->iFlags & KRomImageFlagExtension){
-		prefix = "Extension";
-	}
-	else if(aRomImgEntry->iFlags & KRomImageFlagDevice){
-		prefix = "Device";
-	}
-	else
-		return;
-
-	out->width(10);
-	out->fill(' '); 
-	*out << left << prefix;
-	out->width(40);	
-	*out << right << file->Name() << "[" ;
-	DumpInHex( "", aRomImgEntry->iHardwareVariant, true) << "] ";
-	DumpInHex( " DataSize=", (aRomImgEntry->iBssSize + aRomImgEntry->iDataSize), true) << endl;
-	
-}
-
-void RomImageReader::Dump()
-{
-	if( !((iDisplayOptions & EXTRACT_FILES_FLAG) || 
-		(iDisplayOptions & LOG_IMAGE_CONTENTS_FLAG) ||
-		(iDisplayOptions & EXTRACT_FILE_SET_FLAG)) ) {
-		*out << "Image Name................." << iImgFileName.c_str() << endl;
-
-		if( iImageHeader->iRomHdr )
-		iImageHeader->DumpRomHdr();
-		else
-		iImageHeader->DumpRomXHdr();
-
-		DumpAttribs(iRomImageRootDirEntry);
-		*out << endl ;
-
-		if(iDisplayOptions & DUMP_VERBOSE_FLAG) {
-			DumpDirStructure();
-			DumpTree();
-		}
-
-		if(iDisplayOptions & DUMP_DIR_ENTRIES_FLAG) {
-			DumpDirStructure();
-		}
-	}
-}
-
-
-/** 
-Function iterates through all the entries in the image 
-by making a call to TraverseImage function.
-
-@internalComponent
-@released
-*/
-void RomImageReader::ExtractImageContents()
-{
-	if( (iDisplayOptions & EXTRACT_FILE_SET_FLAG) )
-	{
-		//TODO:
-		ImageReader::ExtractFileSet(iRomLayoutData);
-	}
-
-	if( iDisplayOptions & EXTRACT_FILES_FLAG || iDisplayOptions & LOG_IMAGE_CONTENTS_FLAG )
-	{
-		if(iRomImageRootDirEntry)
-		{
-			// name of the log file.
-			string logFile;
-			// output stream for the log file.
-			ofstream oFile;
-			
-			if( iDisplayOptions & LOG_IMAGE_CONTENTS_FLAG){
-				if( ImageReader::iZdrivePath.compare("")){
-					// create a string to hold path information.
-					string filePath(ImageReader::iZdrivePath);
-					string delimiter("\\"); 
-					// replace backslash with double backslash. 
-					FindAndInsertString(filePath,delimiter,delimiter);
-					logFile = filePath;
-					// create specified directory.
-					CreateSpecifiedDir(&filePath[0],"\\\\");
-					logFile.append("\\\\");
-					logFile.append(ImageReader::iLogFileName);
-				}
-				else
-				{				
-					logFile = ImageReader::iLogFileName;
-				}
-				// open the specified file in append mode.
-				oFile.open(logFile.c_str() ,ios::out|ios::app);
-
-				if(!oFile.is_open()){
-					throw ImageReaderException((char*)ImageReader::iLogFileName.c_str(), "Failed to open the log file");
-				}
-			}
-			TraverseImage(iRomImageRootDirEntry,oFile);
-			if(oFile.is_open())  oFile.close();  
-		}
-	}
-}
-
-
-/** 
-Function to traverse entire image and check for an entity.If the entity found in the image is a file 
-then it makes a call to CheckFileExtension to check for extension.
-
-@internalComponent
-@released
-
-@param aEntity		- pointer to the entry in rom image.
-@param aFile		- output stream.
-*/
-void RomImageReader::TraverseImage(RomImageFSEntry*  aEntity,ofstream& aFile)
-{
-	if(!aEntity->IsDirectory())	{
-		CheckFileExtension(aEntity,aFile);
-	}
-	
- 	if (aEntity->iChildren)	{
-		TraverseImage(aEntity->iChildren,aFile);
-	}
-
-	if (aEntity->iSibling)	{
-		TraverseImage(aEntity->iSibling,aFile);
-	}
-}
-
-
-/** 
-Function to get check extension of the given file.If the extension of the file is "sis"
-then call ExtractFile function to extract the file from the image.  
-
-@internalComponent
-@released
-
-@param aEntity		- pointer to the entry in rom image.
-@param aFile		- output stream.
-*/
-void RomImageReader::CheckFileExtension(RomImageFSEntry*  aEntity,ofstream& aFile)
-{
-	RomImageFileEntry*	romEntry = (RomImageFileEntry*)aEntity;
-	// get the size of the entity.
-	TUint32 size = romEntry->iTRomEntryPtr->iSize;
-	// get the offset of the entity.
-	TUint32 offset =  romEntry->iTRomEntryPtr->iAddressLin - GetRomBase() ;
-
-	const char* fileName = aEntity->iName.c_str();
-
-	// create a string to hold the path information.
-	string romfilePath(romEntry->iPath);
-	string forwardSlash("/");
-	string slash("\\");  
-	//replace slash with double backward slash.
-	FindAndReplaceString( romfilePath, forwardSlash, slash );
-	
-	if( iDisplayOptions & LOG_IMAGE_CONTENTS_FLAG && iDisplayOptions & EXTRACT_FILES_FLAG ) {
-		// get the position.
-		size_t pos = aEntity->iName.find_last_of(".");
-		
-		const char* extName = fileName + ( pos + 1 );
-		if ( !stricmp(extName ,"SIS")	||  !stricmp(extName ,"DAT") ) {
-			// if the two strings are same then extract the corresponding file.
-			ImageReader::ExtractFile(offset,size,fileName,&romfilePath[0],&ImageReader::iZdrivePath[0],iRomLayoutData);
-		}
-		else {
-			LogRomEnrtyToFile(romfilePath.c_str(),fileName,aFile);
-		}
-	}
-	else if( iDisplayOptions & LOG_IMAGE_CONTENTS_FLAG ) {
-		LogRomEnrtyToFile(romfilePath.c_str(),fileName,aFile);
-	}
-	else {
-		if(romEntry->iExecutable) {
-			size += sizeof(TRomImageHeader);
-		}
-		// extract the corresponding file. 
-		ImageReader::ExtractFile(offset,size,fileName,&romfilePath[0],&ImageReader::iZdrivePath[0],iRomLayoutData);
-	}
-}
-
-
-/** 
-Function to log the rom entry to a specified file. 
-
-@internalComponent
-@released
-
-@param aPath		- Complete path of an entity.
-@param aEntityName	- Entity name. 
-@param aFile		- output stream.
-*/
-void RomImageReader::LogRomEnrtyToFile(const char* aPath,const char* aEntityName,ofstream& aFile)
-{
-	if(aFile.is_open())
-	{
-		aFile.seekp(0,ios::end);
-		aFile<<aPath<<"\\"<<aEntityName<<"\n";
-	}
-}
-
-
-/** 
-Function to read the directory structure details of te ROM image.  
-
-@internalComponent
-@released
-
-@param aEntity		- pointer to the entry in rom image.
-@param aFileMap		- map of filename with its size and offset values.
-@param aImgSize		- Image size
-*/
-void RomImageReader::ProcessDirectory(RomImageFSEntry *aEntity, FILEINFOMAP &aFileMap)
-{
-	if(!aEntity->IsDirectory()) { 
-
-		RomImageFileEntry*	romEntry = (RomImageFileEntry*)aEntity;
-
-		PFILEINFO fileInfo = new FILEINFO;
-
-		// get the size of the entity.
-		fileInfo->iSize = romEntry->iTRomEntryPtr->iSize;
-		// get the offset of the entity.
-		fileInfo->iOffset = (romEntry->iTRomEntryPtr->iAddressLin - GetRomBase()); 
-
-		if(romEntry->iExecutable) {
-			fileInfo->iSize += sizeof(TRomImageHeader);
-		}
-
-		if((fileInfo->iOffset + fileInfo->iSize) > iRomSize) {
-			fileInfo->iOffset = 0;
-			fileInfo->iSize = 0;
-		}
-
-		string fileName(romEntry->iPath);
-		fileName.append(DIR_SEPARATOR);
-		fileName.append(aEntity->iName);
-
-		aFileMap[fileName] = fileInfo;
-	}
-	
- 	if (aEntity->iChildren) {
-		ProcessDirectory(aEntity->iChildren, aFileMap);
-	}
-
-	if (aEntity->iSibling) {
-		ProcessDirectory(aEntity->iSibling, aFileMap);
-	}
-}
-
-/** 
-Function to read the directory structure details of te ROM image.  
-
-@internalComponent
-@released
-
-@param aFileMap		- map of filename with its size and offset values.
-*/
-void RomImageReader::GetFileInfo(FILEINFOMAP &aFileMap) {
-	ProcessDirectory(iRomImageRootDirEntry, aFileMap);
-}
-
-/** 
-Function to get the ROM image size.
-
-@internalComponent
-@released
-*/
-TUint32 RomImageReader::GetImageSize() {
-	return iRomSize;
-}
-
+/*
+* Copyright (c) 2005-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: 
+* @internalComponent 
+* @released
+*
+*/
+
+#include <e32rom.h>
+#include "rom_image_reader.h"
+#include "r_rom.h"
+#ifdef __LINUX__
+#define _alloca alloca 
+#endif
+#include "utf16string.h"
+void InflateUnCompress(unsigned char* source, int sourcesize, unsigned char* dest, int destsize);
+RomImageFSEntry::RomImageFSEntry (const char* aName) : iName(aName), iSibling(0), iChildren(0) {
+}
+RomImageFSEntry::~RomImageFSEntry() {
+	if(iChildren){
+		delete iChildren;
+		iChildren = NULL ;
+	}
+	if(iSibling){
+		delete iSibling ;
+		iSibling = NULL ;
+	}	
+}
+
+//Rom Image header 
+RomImageHeader::RomImageHeader(char* aHdr, EImageType aImgType) {
+	switch( aImgType) {
+	case EROM_IMAGE:
+		iLoaderHdr = (TRomLoaderHeader*)aHdr;
+		iRomHdr = (TRomHeader*)(aHdr + sizeof(TRomLoaderHeader));
+		iExtRomHdr = 0;
+		break;
+
+	case EROMX_IMAGE:
+		iExtRomHdr = (TExtensionRomHeader*)(aHdr);
+		iRomHdr = 0;
+		iLoaderHdr = 0;
+		break;
+
+	case EBAREROM_IMAGE:
+		iLoaderHdr = 0;
+		iRomHdr = (TRomHeader*)aHdr;
+		iExtRomHdr = 0;
+		break;
+	default:
+		iExtRomHdr = 0;
+		iRomHdr = 0;
+		iLoaderHdr = 0;
+		break ;
+	}
+}
+
+
+void RomImageHeader::DumpRomHdr() {
+	if(iLoaderHdr)
+		*out << "ROM Image " << endl << endl;
+	else
+		*out << "Bare ROM Image" << endl << endl;
+	TUint aPos = 0;
+	bool aContinue = true;
+
+	*out << "Image Signature .................";
+
+	if(iLoaderHdr){     
+		char temp[KRomNameSize + 1];
+		memcpy(temp,reinterpret_cast<char*>(iLoaderHdr),KRomNameSize);        
+		temp[KRomNameSize] = 0;
+		*out << temp;
+	}
+
+	*out << endl << endl;
+
+	DumpInHex("Timestamp", (iRomHdr->iTime >> 32)) ;
+	DumpInHex(" ", (iRomHdr->iTime &0xffffffff), aContinue) << endl;
+
+	DumpInHex("RomBase", iRomHdr->iRomBase) << endl;
+
+	DumpInHex("RomSize", iRomHdr->iRomSize) << endl;
+	DumpInHex("KernelDataAddress", iRomHdr->iKernDataAddress) << endl;
+	DumpInHex("KernelLimit", iRomHdr->iKernelLimit) << endl;
+	DumpInHex("PrimaryFile", iRomHdr->iPrimaryFile) << endl;
+	DumpInHex("SecondaryFile", iRomHdr->iSecondaryFile) << endl;
+	DumpInHex("CheckSum", iRomHdr->iCheckSum) << endl;
+	DumpInHex("Hardware", iRomHdr->iHardware) << endl;
+
+	DumpInHex("Language", (TUint)(iRomHdr->iLanguage >> 32));
+	DumpInHex(" ", ((TUint)(iRomHdr->iLanguage & 0xffffffff)), aContinue) <<endl;
+
+	DumpInHex("KernelConfigFlags", iRomHdr->iKernelConfigFlags) << endl;
+	DumpInHex("RomExceptionSearchTable", iRomHdr->iRomExceptionSearchTable) << endl;
+	DumpInHex("RomHeaderSize", iRomHdr->iRomHeaderSize) << endl;
+	DumpInHex("RomSectionHeader", iRomHdr->iRomSectionHeader) << endl;
+	DumpInHex("TotalSvDataSize", iRomHdr->iTotalSvDataSize) << endl;
+	DumpInHex("VariantFile", iRomHdr->iVariantFile) << endl;
+	DumpInHex("ExtensionFile", iRomHdr->iExtensionFile) << endl;
+	DumpInHex("RelocInfo", iRomHdr->iRelocInfo) << endl;
+	DumpInHex("OldTraceMask", iRomHdr->iOldTraceMask) << endl;
+	DumpInHex("UserDataAddress", iRomHdr->iUserDataAddress) << endl;
+	DumpInHex("TotalUserDataSize", iRomHdr->iTotalUserDataSize) << endl;
+	DumpInHex("DebugPort", iRomHdr->iDebugPort) << endl;
+
+	DumpInHex("Version", iRomHdr->iVersion.iMajor, false, 2);
+	DumpInHex(".", iRomHdr->iVersion.iMinor, aContinue, 2);
+	DumpInHex("(" ,iRomHdr->iVersion.iBuild, aContinue, 2);
+	*out << ")" << endl;
+
+	DumpInHex("CompressionType", iRomHdr->iCompressionType) << endl;
+	DumpInHex("CompressedSize", iRomHdr->iCompressedSize) << endl;
+	DumpInHex("UncompressedSize", iRomHdr->iUncompressedSize) << endl;
+	DumpInHex("HcrFileAddress", iRomHdr->iHcrFileAddress) << endl;
+
+	DumpInHex("DisabledCapabilities", iRomHdr->iDisabledCapabilities[0]);
+	DumpInHex(" ", iRomHdr->iDisabledCapabilities[1], aContinue) << endl;
+
+	DumpInHex("TraceMask", iRomHdr->iTraceMask[0]);
+	aPos = 1;
+	while( aPos < (TUint)KNumTraceMaskWords) {
+		if(iRomHdr->iTraceMask[aPos]) {
+			DumpInHex(" ", iRomHdr->iTraceMask[aPos++], aContinue);
+		}
+		else {
+			DumpInHex(" ", iRomHdr->iTraceMask[aPos++], aContinue, 1);
+		}
+
+	}
+
+	*out << endl << endl;
+
+}
+void RomImageHeader::DumpRomXHdr() {
+	*out << "Extension ROM Image" << endl << endl;
+	bool aContinue = true;
+
+	DumpInHex("Timestamp", (iExtRomHdr->iTime >> 32)) ;
+	DumpInHex(" ", (iExtRomHdr->iTime &0xffffffff), aContinue) << endl;
+
+	DumpInHex("RomBase", iExtRomHdr->iRomBase) << endl;
+
+	DumpInHex("RomSize", iExtRomHdr->iRomSize) << endl;
+	DumpInHex("CheckSum", iExtRomHdr->iCheckSum) << endl;
+
+	DumpInHex("Version", iExtRomHdr->iVersion.iMajor, false, 2);
+	DumpInHex(".", iExtRomHdr->iVersion.iMinor, aContinue, 2);
+	DumpInHex("(" ,iExtRomHdr->iVersion.iBuild, aContinue, 2);
+	*out << ")" << endl;
+
+	DumpInHex("CompressionType", iExtRomHdr->iCompressionType) << endl;
+	DumpInHex("CompressedSize", iExtRomHdr->iCompressedSize) << endl;
+	DumpInHex("UncompressedSize", iExtRomHdr->iUncompressedSize) << endl;
+
+	*out << endl << endl;
+
+}
+//Rom Image reader
+RomImageReader::RomImageReader(const char* aFile, EImageType aImgType) :
+ImageReader(aFile), iImageHeader(0),
+iRomSize(0),iHeaderBuffer(0),
+iRomLayoutData(0),iImgType(aImgType) {
+	iRomImageRootDirEntry = new RomImageDirEntry("");
+}
+
+RomImageReader::~RomImageReader() {
+	if(iFile.is_open())
+		iFile.close();
+	if(iHeaderBuffer)
+		delete []iHeaderBuffer;
+	if(iRomLayoutData)
+		delete []iRomLayoutData;  
+	delete iRomImageRootDirEntry;
+
+
+}
+
+void RomImageReader::ReadImage() {
+	if(iFile.is_open()) return ;
+	iFile.open(iImgFileName.c_str(), ios_base::binary | ios_base::in);
+	if( !iFile.is_open() ) {
+		throw ImageReaderException(iImgFileName.c_str(), "Cannot open file ");
+	}	
+
+	TUint headerSize = GetHdrSize() ;	
+	if(headerSize > 0){
+		iHeaderBuffer = new char[headerSize];
+		iFile.read(iHeaderBuffer,headerSize);
+	}	
+}
+
+void RomImageReader::Validate() {
+}
+
+TUint32 RomImageReader::GetImageCompressionType() {
+	if(iImageHeader->iRomHdr )// iImageType == EROM_IMAGE
+		return iImageHeader->iRomHdr->iCompressionType;
+	else
+		return iImageHeader->iExtRomHdr->iCompressionType;
+}
+
+
+TLinAddr RomImageReader::GetRomBase() {
+	if(iImageHeader->iRomHdr )// iImageType == EROM_IMAGE
+		return iImageHeader->iRomHdr->iRomBase ;
+	else
+		return iImageHeader->iExtRomHdr->iRomBase;
+}
+
+TLinAddr RomImageReader::GetRootDirList() {
+	if(iImageHeader->iRomHdr )// iImageType == EROM_IMAGE
+		return iImageHeader->iRomHdr->iRomRootDirectoryList;
+	else
+		return iImageHeader->iExtRomHdr->iRomRootDirectoryList;
+}
+
+TUint RomImageReader::GetHdrSize() {
+	TUint headerSize = 0;
+	if(EROM_IMAGE == iImgType){
+		headerSize = sizeof(TRomLoaderHeader) + sizeof(TRomHeader);
+	}else if(EROMX_IMAGE == iImgType){
+		headerSize = sizeof(TExtensionRomHeader);
+	}else if(EBAREROM_IMAGE == iImgType){
+		headerSize = sizeof(TRomHeader);
+	}
+	return headerSize;
+}
+
+
+static const TInt KIOBytes = 0x100000;
+// reading a huge buffer at a time is very slow, reading 1MB bytes at a time is much faster
+void RomImageReader::ReadData(char* aBuffer, TUint aLength) {
+	TUint readBytes = 0 ;
+	while(readBytes < aLength){
+		TUint toRead = KIOBytes;
+		if(readBytes + toRead > aLength)
+			toRead = aLength - readBytes ;
+		iFile.read(&aBuffer[readBytes],toRead);
+		readBytes += toRead ;
+	}	
+}
+void RomImageReader::ProcessImage() {
+	if(iRomLayoutData) return ;
+	iImageHeader = new RomImageHeader(iHeaderBuffer, iImgType);
+
+	iFile.seekg(0, ios_base::end);
+	// fileSize
+	TUint fileSize = iFile.tellg(); 
+
+	//let's skip the RomLoaderHeader
+	TUint romDataBegin = (EROM_IMAGE == iImgType) ? sizeof(TRomLoaderHeader) : 0 ; 
+	iFile.seekg(romDataBegin,ios_base::beg);	
+
+	if(EROMX_IMAGE == iImgType){// EROMX_IMAGE, just set the iUnpagedRomBuffer		
+		if(GetImageCompressionType() == KUidCompressionDeflate){
+			TUint32 readLen = fileSize - sizeof(TExtensionRomHeader) ; 
+			iRomSize = iImageHeader->iExtRomHdr->iUncompressedSize ;	 
+			iRomLayoutData = new char[iRomSize];
+			char* temp = new char[readLen];
+			// header is not compressed.
+			iFile.read(iRomLayoutData,sizeof(TExtensionRomHeader)); 
+			ReadData(temp ,readLen);
+			TUint8* uncompressDest = reinterpret_cast<TUint8*>(iRomLayoutData + sizeof(TExtensionRomHeader));
+			InflateUnCompress(reinterpret_cast<TUint8*>(temp),readLen,uncompressDest,iRomSize - sizeof(TExtensionRomHeader));
+			delete []temp ;	 
+
+		}else{
+			iRomSize = fileSize  ;
+			iRomLayoutData = new char[iRomSize]; 
+			ReadData(iRomLayoutData,iRomSize);
+		}	 
+	} // end EROMX_IMAGE
+	else {
+		//EROM_IMAGE or EBAREROM_IMAGE
+		const TInt KPageSize = 0x1000; 
+		TRomHeader *hdr = iImageHeader->iRomHdr; 
+		iRomSize = hdr->iUncompressedSize ; 
+		iRomLayoutData = new char[iRomSize]; 
+		char* curDataPointer = iRomLayoutData ;
+		TUint totalReadBytes = 0;
+		bool hasPageableSec = (hdr->iPageableRomStart > 0 && hdr->iPageableRomSize > 0) ;
+
+		// read data before unpaged 
+		ReadData(curDataPointer,hdr->iCompressedUnpagedStart); 
+		curDataPointer += hdr->iCompressedUnpagedStart ; 
+		totalReadBytes += hdr->iCompressedUnpagedStart;		
+
+		// read the unpaged part, if compressed , then decompress		 
+		if(GetImageCompressionType() == KUidCompressionDeflate){
+			char* temp = new char[hdr->iUnpagedCompressedSize];
+			ReadData(temp,hdr->iUnpagedCompressedSize);
+			totalReadBytes += hdr->iUnpagedCompressedSize;
+			InflateUnCompress(reinterpret_cast<TUint8*>(temp),hdr->iUnpagedCompressedSize,reinterpret_cast<TUint8*>(curDataPointer) ,hdr->iUnpagedUncompressedSize);
+			delete []temp ;			
+		}else{
+			TUint unpagedSeclen ;
+			if(hasPageableSec) { // there is paged section 
+				unpagedSeclen = hdr->iPageableRomStart - hdr->iCompressedUnpagedStart;
+			}else{
+				unpagedSeclen = iRomSize - hdr->iCompressedUnpagedStart;
+			}
+			ReadData(curDataPointer,unpagedSeclen);			 
+			totalReadBytes += unpagedSeclen ;
+		}
+		curDataPointer = iRomLayoutData + totalReadBytes; 
+		//if there is a paged section , read and extract it 
+
+		// read the paged section,
+		if(hasPageableSec){		
+			if((TUint)(hdr->iPageableRomStart + hdr->iPageableRomSize) > iRomSize){
+				throw ImageReaderException("Incorrect values of ROM header fields.", "");
+			}
+			if(0 == hdr->iRomPageIndex){ //
+				// no compression for paged section ,just read it 			 
+				iFile.read(curDataPointer,iRomSize - totalReadBytes);
+			}
+			else{
+				//aligment calculation
+				TUint pagedSecOffset = (totalReadBytes + KPageSize - 1) & (~(KPageSize - 1));
+				if(pagedSecOffset > totalReadBytes){
+					// there are gap bytes between unpaged and paged sections
+					iFile.read(curDataPointer,pagedSecOffset - totalReadBytes);
+					curDataPointer = iRomLayoutData + pagedSecOffset;
+				}
+				TUint pagedIndexCount = ( hdr->iUncompressedSize + KPageSize - 1) / KPageSize;
+				// how many bytes ?
+				// the page index table include the unpaged part ;
+				TUint firstPagedIndexTblItem = hdr->iPageableRomStart / KPageSize;
+
+				TUint tempBufLen = KPageSize << 8;
+				char* readBuffer = new char[tempBufLen]; 
+
+				TUint8* src,*srcNext = NULL;
+				SRomPageInfo* pageInfo = reinterpret_cast<SRomPageInfo*>(&iRomLayoutData[hdr->iRomPageIndex]);
+				CBytePair bpe;
+				for(TUint i = firstPagedIndexTblItem ; i < pagedIndexCount ; i+= 256){
+					TUint endIndex = i + 255 ;
+					if(endIndex >= pagedIndexCount)
+						endIndex = pagedIndexCount - 1;
+					TUint readLen = pageInfo[endIndex].iDataStart + pageInfo[endIndex].iDataSize - pageInfo[i].iDataStart ; 
+					iFile.read(readBuffer,readLen);
+					src = reinterpret_cast<TUint8*>(readBuffer);
+					for(TUint j = i ; j <= endIndex ; j++){
+						switch(pageInfo[j].iCompressionType) {
+						case SRomPageInfo::EBytePair: {
+							TInt unpacked = bpe.Decompress(reinterpret_cast<TUint8*>(curDataPointer), KPageSize, src, pageInfo[j].iDataSize, srcNext);
+							if (unpacked < 0) {
+								delete []readBuffer;
+								throw ImageReaderException("Corrupted BytePair compressed ROM image", "");
+							}
+							curDataPointer += unpacked;
+							break ;
+													  }
+						case SRomPageInfo::ENoCompression:
+							memcpy(curDataPointer,src,pageInfo[j].iDataSize);
+							curDataPointer +=  pageInfo[j].iDataSize ;
+							break ;
+						default:
+							delete []readBuffer;
+							throw ImageReaderException("Undefined compression type", "");
+							break ;
+
+						}
+						src += pageInfo[j].iDataSize; 
+					} // end for(TUint j = i ; j <= endIndex ; j++) 
+				} // end for(TUint i = firstPagedIndexTblItem ; i < pagedIndexCount ; i+= 256) 
+				delete []readBuffer ;
+			}// else
+
+		} // if(hasPageableSec)  
+
+	}
+	TUint32 offset = GetRootDirList() - GetRomBase(); 
+	TRomRootDirectoryList* rootDirList = reinterpret_cast<TRomRootDirectoryList*>(iRomLayoutData + offset );
+	TInt dirCount = rootDirList->iNumRootDirs ; 
+	string tempName ;
+	for(TInt i = 0 ; i < dirCount ; i++) {
+		offset = rootDirList->iRootDir[i].iAddressLin - GetRomBase(); 
+		TRomDir* romDir = reinterpret_cast<TRomDir*>(iRomLayoutData + offset);	
+		UTF16String unistr(reinterpret_cast<const TUint16*>(romDir->iEntry.iName),romDir->iEntry.iNameLength); 
+		if(!unistr.ToUTF8(tempName)) //not utf16?
+			tempName.assign(reinterpret_cast<const char*>(romDir->iEntry.iName),romDir->iEntry.iNameLength) ;
+		BuildDir(romDir, iRomImageRootDirEntry);		 
+	}
+
+}
+
+
+void RomImageReader::BuildDir(TRomDir* aDir, RomImageFSEntry* aPaFSEntry)
+{	 
+
+	TInt processBytes = 0 ;
+	TInt totalDirBytes = aDir->iSize - sizeof(aDir->iSize);
+	TRomEntry* entry = &aDir->iEntry;
+	RomImageFSEntry *fsEntry ;
+	string pritableName ; 
+
+	while(processBytes < totalDirBytes){ 
+		UTF16String unistr(reinterpret_cast<const TUint16*>(entry->iName),entry->iNameLength);
+		if(!unistr.ToUTF8(pritableName)) 
+			pritableName.assign(reinterpret_cast<const char*>(entry->iName),entry->iNameLength);
+		if(entry->iAtt & 0x10) { // is a directory
+			fsEntry = new RomImageDirEntry(pritableName.c_str()); 
+			AddChild(aPaFSEntry,fsEntry,NULL);
+			TUint offset = entry->iAddressLin - GetRomBase();
+			TRomDir* subFolder = reinterpret_cast<TRomDir*>(iRomLayoutData + offset);		 
+			BuildDir(subFolder,fsEntry); 
+		}
+		else{
+			fsEntry = new RomImageFileEntry(pritableName.c_str()); 
+			AddChild(aPaFSEntry,fsEntry,entry);
+		} 
+		// increase the processedBytes
+		processBytes += (entry->iNameLength << 1) +  reinterpret_cast<TInt>(entry->iName) - reinterpret_cast<TInt>(entry); 
+
+		//align to next 4 bytes
+		processBytes = (processBytes + 3) & ( ~3 ); 
+		// get next entry
+		entry =  reinterpret_cast<TRomEntry*>( reinterpret_cast<char*>(&aDir->iEntry) + processBytes);
+	} 
+
+}
+
+void RomImageReader::AddChild(RomImageFSEntry *aParent, RomImageFSEntry *aChild, TRomEntry* aRomEntry) {
+	if(!aParent->iChildren)
+		aParent->iChildren = aChild;
+	else {
+		RomImageFSEntry *aLast = aParent->iChildren;
+
+		while(aLast->iSibling)
+			aLast = aLast->iSibling;
+		aLast->iSibling = aChild;
+	}
+
+	if(!aChild->IsDirectory()) { 
+		RomImageFileEntry* file = static_cast<RomImageFileEntry*>(aChild);
+		file->iTRomEntryPtr = aRomEntry;
+
+		if(aRomEntry->iAddressLin > GetRomBase()) {
+			TUint32 offset = aRomEntry->iAddressLin - GetRomBase();	 
+
+			TRomImageHeader* imgHdr = reinterpret_cast<TRomImageHeader*>(iRomLayoutData + offset);
+
+			file->ImagePtr.iRomFileEntry = imgHdr;
+
+			TUint8 aUid1[4];
+			memcpy(aUid1, &file->ImagePtr.iRomFileEntry->iUid1, 4);
+
+			if( ReaderUtil::IsExecutable(aUid1) ) {
+				file->iExecutable = true;
+			}
+			else {
+				file->iExecutable = false;
+				file->ImagePtr.iDataFileAddr = aRomEntry->iAddressLin;
+			}
+		}
+		else {
+			file->ImagePtr.iRomFileEntry = NULL; 
+		}
+	}
+
+	if(aParent != iRomImageRootDirEntry) {
+		aChild->iPath = aParent->iPath;
+		aChild->iPath += SLASH_CHAR1;
+		aChild->iPath += aParent->iName.c_str();
+	}
+}
+
+void RomImageReader::DumpTree() {
+	RomImageFSEntry* aFsEntry = iRomImageRootDirEntry;
+	if( aFsEntry->iChildren ) 
+		DumpSubTree(aFsEntry->iChildren); 
+}
+
+void RomImageReader::DumpDirStructure() {
+	*out << "Directory Listing" << endl;
+	*out << "=================" << endl;
+	int aPadding = 0;
+	if( iRomImageRootDirEntry ){
+		DumpDirStructure(iRomImageRootDirEntry, aPadding);
+	}	
+	*out << endl << endl;
+}
+
+void RomImageReader::DumpDirStructure(RomImageFSEntry* aEntry, int &aPadding) {
+	if(!aEntry)
+		return;
+
+	int aPadLen = 2 * aPadding;//scaling for legibility
+	for (int i = 0; i < aPadLen; i++)
+		*out << " ";
+
+	*out << aEntry->Name() << endl;
+
+	if( aEntry->iChildren){
+		aPadding++;
+		DumpDirStructure(aEntry->iChildren, aPadding);
+		aPadding--;
+	}
+	DumpDirStructure(aEntry->iSibling, aPadding);
+}
+
+void RomImageReader::DumpSubTree(RomImageFSEntry* aFsEntry) {
+	if(!aFsEntry)
+		return;
+
+	if( aFsEntry->iChildren ){
+		DumpSubTree(aFsEntry->iChildren);
+	}
+
+	if( aFsEntry->iSibling )
+		DumpSubTree(aFsEntry->iSibling);
+
+	RomImageFSEntry *aEntry = aFsEntry;
+
+	if(!aEntry->IsDirectory()) {
+		*out << "********************************************************************" << endl;
+		*out << "File........................" << aEntry->iPath.c_str() << SLASH_CHAR1 << aEntry->Name() << endl;
+
+		if( ((RomImageFileEntry*)aEntry)->iExecutable )	{
+			DumpImage((RomImageFileEntry*)aEntry);
+		}
+		else{
+			*out << "Linear Addr................." << ((RomImageFileEntry*)aEntry)->ImagePtr.iDataFileAddr << endl;
+		}
+	}
+}
+
+void RomImageReader::DumpImage(RomImageFileEntry * aEntry) {
+	bool aContinue = true;
+
+	DumpInHex("Load Address", aEntry->iTRomEntryPtr->iAddressLin) << endl;
+	DumpInHex("Size", aEntry->iTRomEntryPtr->iSize) << endl;
+
+	TRomImageHeader		*aRomImgEntry = aEntry->ImagePtr.iRomFileEntry;
+
+	if( !aRomImgEntry )
+		return;
+	//UIDs
+	DumpInHex("Uids", aRomImgEntry->iUid1);
+	DumpInHex(" ", aRomImgEntry->iUid2, aContinue);
+	DumpInHex(" ", aRomImgEntry->iUid3, aContinue);
+	DumpInHex(" ", aRomImgEntry->iUidChecksum, aContinue) << endl;
+
+	DumpInHex("Entry point", aRomImgEntry->iEntryPoint) << endl;
+	DumpInHex("Code start addr", aRomImgEntry->iCodeAddress) << endl;
+	DumpInHex("Data start addr", aRomImgEntry->iDataAddress) << endl;
+	DumpInHex("DataBssLinearBase", aRomImgEntry->iDataBssLinearBase) << endl;
+	DumpInHex("Text size", aRomImgEntry->iTextSize) << endl;
+	DumpInHex("Code size", aRomImgEntry->iCodeSize) << endl;
+	DumpInHex("Data size", aRomImgEntry->iDataSize) << endl;
+	DumpInHex("Bss size", (aRomImgEntry->iBssSize)) << endl;
+	DumpInHex("Total data size", aRomImgEntry->iTotalDataSize) << endl;
+	DumpInHex("Heap min", aRomImgEntry->iHeapSizeMin) << endl;
+	DumpInHex("Heap max", aRomImgEntry->iHeapSizeMax) << endl;
+	DumpInHex("Stack size", aRomImgEntry->iStackSize) << endl;
+
+	TDllRefTable *aRefTbl = NULL;
+
+	if( aRomImgEntry->iDllRefTable ) {
+		TUint32 aOff = (TUint32)aRomImgEntry->iDllRefTable - iImageHeader->iRomHdr->iRomBase;
+		aRefTbl = (TDllRefTable*) ((char*)iImageHeader->iRomHdr + aOff);
+		TUint32 aVirtualAddr = (TUint32)aRefTbl->iEntry[0];
+		DumpInHex("Dll ref table", aVirtualAddr) << endl;
+	}
+
+	DumpInHex("Export directory", aRomImgEntry->iExportDir) << endl;
+	DumpInHex("Export dir count", aRomImgEntry->iExportDirCount) << endl;
+	DumpInHex("Hardware variant", aRomImgEntry->iHardwareVariant) << endl;
+	DumpInHex("Flags", aRomImgEntry->iFlags) << endl;
+	DumpInHex("Secure ID", aRomImgEntry->iS.iSecureId) << endl;
+	DumpInHex("Vendor ID", aRomImgEntry->iS.iVendorId) << endl;
+
+	DumpInHex("Capability", aRomImgEntry->iS.iCaps[1]);
+	DumpInHex(" ", aRomImgEntry->iS.iCaps[0], aContinue) << endl;
+
+	*out << "Tools Version..............." << dec << (TUint)aRomImgEntry->iToolsVersion.iMajor;
+	*out << "." ; 
+	out->width(2) ;
+	out->fill('0');
+	*out << dec << (TUint)aRomImgEntry->iToolsVersion.iMinor ;
+	*out << "(" << dec << aRomImgEntry->iToolsVersion.iBuild << ")";
+	*out << endl;
+
+	*out << "Module Version.............." << dec << (aRomImgEntry->iModuleVersion >> 16) << endl;
+	DumpInHex("Exception Descriptor", aRomImgEntry->iExceptionDescriptor) << endl;
+	*out << "Priority...................." << dec << aRomImgEntry->iPriority << endl;
+
+	if( aRefTbl )
+		DumpInHex("Dll ref table size", aRefTbl->iNumberOfEntries*8) << endl;
+	else
+		DumpInHex("Dll ref table size", 0) << endl;
+
+	if( iDisplayOptions & DUMP_E32_IMG_FLAG){
+		if(stricmp(iE32ImgFileName.c_str(), aEntry->Name()) == 0){
+			TUint aSectionOffset = aRomImgEntry->iCodeAddress - iImageHeader->iRomHdr->iRomBase;
+			TUint* aCodeSection = (TUint*)((char*)iImageHeader->iRomHdr + aSectionOffset);
+			*out << "\nCode (Size=0x" << hex << aRomImgEntry->iCodeSize << ")" << endl;
+			DumpData(aCodeSection, aRomImgEntry->iCodeSize);
+
+			aSectionOffset = aRomImgEntry->iDataAddress - iImageHeader->iRomHdr->iRomBase;
+			TUint* aDataSection = (TUint*)((char*)iImageHeader->iRomHdr + aSectionOffset);
+			if( aRomImgEntry->iDataSize){
+				*out << "\nData (Size=0x" << hex << aRomImgEntry->iDataSize << ")" << endl;
+				DumpData(aDataSection, aRomImgEntry->iDataSize);
+			}
+		}
+	}
+
+	*out << endl << endl;
+}
+
+void RomImageReader::DumpAttribs(RomImageFSEntry* aFsEntry) {
+
+	// a larger rom image cause stack overflow under visual studio if we use recursion algorithm here.
+	// can gcc compiler guarantee this overflow will never be happen ?
+	if( aFsEntry->iChildren )
+		DumpAttribs(aFsEntry->iChildren);
+
+	if(aFsEntry->iSibling)
+		DumpAttribs(aFsEntry->iSibling);
+	if(aFsEntry->IsDirectory()) return ;
+	RomImageFileEntry* file = static_cast<RomImageFileEntry*>(aFsEntry);
+	if(!file->iExecutable) return ; 
+	TRomImageHeader* aRomImgEntry = file->ImagePtr.iRomFileEntry;
+
+	if( !aRomImgEntry)  return; 
+
+	const char* prefix ;
+	if(aRomImgEntry->iFlags & KRomImageFlagPrimary){
+		prefix = "Primary";
+	}
+	else if(aRomImgEntry->iFlags & KRomImageFlagVariant){
+		prefix = "Variant";
+	}
+	else if(aRomImgEntry->iFlags & KRomImageFlagExtension){
+		prefix = "Extension";
+	}
+	else if(aRomImgEntry->iFlags & KRomImageFlagDevice){
+		prefix = "Device";
+	}
+	else
+		return;
+
+	out->width(10);
+	out->fill(' '); 
+	*out << left << prefix;
+	out->width(40);	
+	*out << right << file->Name() << "[" ;
+	DumpInHex( "", aRomImgEntry->iHardwareVariant, true) << "] ";
+	DumpInHex( " DataSize=", (aRomImgEntry->iBssSize + aRomImgEntry->iDataSize), true) << endl;
+
+}
+
+void RomImageReader::Dump() {
+	if( !((iDisplayOptions & EXTRACT_FILES_FLAG) || 
+		(iDisplayOptions & LOG_IMAGE_CONTENTS_FLAG) ||
+		(iDisplayOptions & EXTRACT_FILE_SET_FLAG)) ) {
+			*out << "Image Name................." << iImgFileName.c_str() << endl;
+
+			if( iImageHeader->iRomHdr )
+				iImageHeader->DumpRomHdr();
+			else
+				iImageHeader->DumpRomXHdr();
+
+			DumpAttribs(iRomImageRootDirEntry);
+			*out << endl ;
+
+			if(iDisplayOptions & DUMP_VERBOSE_FLAG) {
+				DumpDirStructure();
+				DumpTree();
+			}
+
+			if(iDisplayOptions & DUMP_DIR_ENTRIES_FLAG) {
+				DumpDirStructure();
+			}
+	}
+}
+
+
+/** 
+Function iterates through all the entries in the image 
+by making a call to TraverseImage function.
+
+@internalComponent
+@released
+*/
+void RomImageReader::ExtractImageContents() {
+	if( (iDisplayOptions & EXTRACT_FILE_SET_FLAG) ) { 
+		ImageReader::ExtractFileSet(iRomLayoutData);
+	}
+
+	if( iDisplayOptions & EXTRACT_FILES_FLAG || iDisplayOptions & LOG_IMAGE_CONTENTS_FLAG ) {
+		if(iRomImageRootDirEntry) {
+			// name of the log file.
+			string logFile;
+			// output stream for the log file. 
+			ofstream oFile;
+
+			if( iDisplayOptions & LOG_IMAGE_CONTENTS_FLAG){
+				if( ImageReader::iZdrivePath.compare("")){				 
+					// create specified directory.
+					CreateSpecifiedDir(ImageReader::iZdrivePath); 
+					int len = ImageReader::iZdrivePath.length() ;
+					const char* z = ImageReader::iZdrivePath.c_str();
+					logFile = "";
+					for(int i = 0 ; i < len ; i++){
+						if(z[i] == SLASH_CHAR2)
+							logFile += SLASH_CHAR1;
+						else
+							logFile += z[i];
+					}
+					len -- ;
+					if(z[len] != SLASH_CHAR1)
+						logFile += SLASH_CHAR1;
+					logFile += ImageReader::iLogFileName ;
+				}
+				else {				
+					logFile = ImageReader::iLogFileName;
+				}
+				// open the specified file in append mode.
+				oFile.open(logFile.c_str() ,ios_base::out|ios_base::app);
+
+				if(!oFile.is_open()){
+					throw ImageReaderException(ImageReader::iLogFileName.c_str(), "Failed to open the log file");
+				}
+			}
+			TraverseImage(iRomImageRootDirEntry,oFile);
+			if(oFile.is_open())  oFile.close();  
+		}
+	}
+}
+
+
+/** 
+Function to traverse entire image and check for an entity.If the entity found in the image is a file 
+then it makes a call to CheckFileExtension to check for extension.
+
+@internalComponent
+@released
+
+@param aEntity		- pointer to the entry in rom image.
+@param aFile		- output stream.
+*/
+void RomImageReader::TraverseImage(RomImageFSEntry*  aEntity,ofstream& aFile) {
+	if(!aEntity->IsDirectory())	{
+		CheckFileExtension(aEntity,aFile);
+	}
+
+	if (aEntity->iChildren)	{
+		TraverseImage(aEntity->iChildren,aFile);
+	}
+
+	if (aEntity->iSibling)	{
+		TraverseImage(aEntity->iSibling,aFile);
+	}
+}
+
+
+/** 
+Function to get check extension of the given file.If the extension of the file is "sis"
+then call ExtractFile function to extract the file from the image.  
+
+@internalComponent
+@released
+
+@param aEntity		- pointer to the entry in rom image.
+@param aFile		- output stream.
+*/
+void RomImageReader::CheckFileExtension(RomImageFSEntry*  aEntity,ofstream& aFile) {
+	RomImageFileEntry*	romEntry = (RomImageFileEntry*)aEntity;
+	// get the size of the entity.
+	TUint32 size = romEntry->iTRomEntryPtr->iSize;
+	// get the offset of the entity.
+	TUint32 offset =  romEntry->iTRomEntryPtr->iAddressLin - GetRomBase() ;
+
+	const char* fileName = aEntity->iName.c_str();
+
+	// create a string to hold the path information.
+	string romfilePath(romEntry->iPath);
+	int len = romfilePath.length();
+	char* str = const_cast<char*>(romfilePath.c_str());
+	for(int i = 0 ; i < len ; i++){
+		if(str[i] == SLASH_CHAR2)
+			str[i] = SLASH_CHAR1;
+	}
+	if(str[len - 1] != SLASH_CHAR1)
+		romfilePath += SLASH_CHAR1;
+
+	if( iDisplayOptions & LOG_IMAGE_CONTENTS_FLAG && iDisplayOptions & EXTRACT_FILES_FLAG ) {
+		// get the position.
+		size_t pos = aEntity->iName.find_last_of(".");
+
+		const char* extName = fileName + ( pos + 1 );
+		if ( !stricmp(extName ,"SIS")	||  !stricmp(extName ,"DAT") ) {
+			// if the two strings are same then extract the corresponding file.
+			ImageReader::ExtractFile(offset,size,fileName,romfilePath.c_str(),ImageReader::iZdrivePath.c_str(),iRomLayoutData);
+		}
+		else {
+			LogRomEnrtyToFile(romfilePath.c_str(),fileName,aFile);
+		}
+	}
+	else if( iDisplayOptions & LOG_IMAGE_CONTENTS_FLAG ) {
+		LogRomEnrtyToFile(romfilePath.c_str(),fileName,aFile);
+	}
+	else {
+		if(romEntry->iExecutable) {
+			size += sizeof(TRomImageHeader);
+		}
+		// extract the corresponding file. 
+		ImageReader::ExtractFile(offset,size,fileName,romfilePath.c_str(),ImageReader::iZdrivePath.c_str(),iRomLayoutData);
+	}
+}
+
+
+/** 
+Function to log the rom entry to a specified file. 
+
+@internalComponent
+@released
+
+@param aPath		- Complete path of an entity.
+@param aEntityName	- Entity name. 
+@param aFile		- output stream.
+*/
+void RomImageReader::LogRomEnrtyToFile(const char* aPath,const char* aEntityName,ofstream& aFile) {
+	if(aFile.is_open()) {
+		aFile.seekp(0,ios_base::end);
+		aFile<<aPath <<aEntityName << endl;
+	}
+}
+
+
+/** 
+Function to read the directory structure details of te ROM image.  
+
+@internalComponent
+@released
+
+@param aEntity		- pointer to the entry in rom image.
+@param aFileMap		- map of filename with its size and offset values.
+@param aImgSize		- Image size
+*/
+void RomImageReader::ProcessDirectory(RomImageFSEntry *aEntity, FILEINFOMAP &aFileMap) {
+	if(!aEntity->IsDirectory()) { 
+
+		RomImageFileEntry*	romEntry = (RomImageFileEntry*)aEntity;
+
+		PFILEINFO fileInfo = new FILEINFO;
+
+		// get the size of the entity.
+		fileInfo->iSize = romEntry->iTRomEntryPtr->iSize;
+		// get the offset of the entity.
+		fileInfo->iOffset = (romEntry->iTRomEntryPtr->iAddressLin - GetRomBase()); 
+
+		if(romEntry->iExecutable) {
+			fileInfo->iSize += sizeof(TRomImageHeader);
+		}
+
+		if((fileInfo->iOffset + fileInfo->iSize) > iRomSize) {
+			fileInfo->iOffset = 0;
+			fileInfo->iSize = 0;
+		}
+
+		string fileName(romEntry->iPath);
+		fileName += SLASH_CHAR1;
+		fileName.append(aEntity->iName);
+		aFileMap[fileName] = fileInfo;
+	}
+
+	if (aEntity->iChildren) {
+		ProcessDirectory(aEntity->iChildren, aFileMap);
+	}
+
+	if (aEntity->iSibling) {
+		ProcessDirectory(aEntity->iSibling, aFileMap);
+	}
+}
+
+/** 
+Function to read the directory structure details of te ROM image.  
+
+@internalComponent
+@released
+
+@param aFileMap		- map of filename with its size and offset values.
+*/
+void RomImageReader::GetFileInfo(FILEINFOMAP &aFileMap) {
+	ProcessDirectory(iRomImageRootDirEntry, aFileMap);
+}
+
+/** 
+Function to get the ROM image size.
+
+@internalComponent
+@released
+*/
+TUint32 RomImageReader::GetImageSize() {
+	return iRomSize;
+}
+