imgtools/imgcheck/libimgutils/src/rofsreader.cpp
changeset 590 360bd6b35136
parent 0 044383f39525
child 633 a4eca1f021ac
--- a/imgtools/imgcheck/libimgutils/src/rofsreader.cpp	Wed Jun 16 16:51:40 2010 +0300
+++ b/imgtools/imgcheck/libimgutils/src/rofsreader.cpp	Wed Jun 23 16:56:47 2010 +0800
@@ -1,384 +1,337 @@
-/*
-* Copyright (c) 2007-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: 
-*
-*/
-
-
-/**
- @file
- @internalComponent
- @released
-*/
-#include "rofsreader.h"
-#include "r_romnode.h"
-
-
-/** 
-Constructor intializes the class pointer members.
-
-@internalComponent
-@released
-
-@param aFile - image file name
-@param aImageType - image type
-*/
-RofsReader::RofsReader(char* aFile, EImageType aImageType)
-:ImageReader(aFile), iImageType(aImageType)
-{
-	iImageReader = new RCoreImageReader(aFile);
-	iImage = new RofsImage(iImageReader);
-	iInputStream.open(aFile, Ios::binary | Ios::in);
-}
-
-/** 
-Destructor deletes the class pointer members.
-
-@internalComponent
-@released
-*/
-RofsReader::~RofsReader()
-{
-	ExeVsE32ImageMap::iterator e32ImageBegin = iExeVsE32ImageMap.begin();
-    ExeVsE32ImageMap::iterator e32ImageEnd  = iExeVsE32ImageMap.end();
-	while(e32ImageBegin != e32ImageEnd)
-	{
-		DELETE(e32ImageBegin->second);
-		++e32ImageBegin;
-	}
-	iRootDirEntry->Destroy();
-	iExeVsOffsetMap.clear();
-	DELETE(iImageReader);
-	iInputStream.close();
-	iExeVsE32ImageMap.clear();
-}
-
-/** 
-Dummy function for compatibility
-
-@internalComponent
-@released
-*/
-void RofsReader::ReadImage()
-{
-}
-
-/** 
-Function responsible to 
-1. Invoke E32Imagefile process method which will read the header part and identifies the 
-   compression method.
-2. Prepare executable vs E32Image map, which will be used later to read the E32Image contents.
-
-@internalComponent
-@released
-*/
-void RofsReader::ProcessImage()
-{
-	int retVal = iImage->ProcessImage();
-	if(retVal != KErrNone)
-	{
-		exit(retVal);
-	}
-	iRootDirEntry = iImage->RootDirectory();
-	PrepareExeVsE32ImageMap(iRootDirEntry, iImage, iImageType, iInputStream, iExeVsE32ImageMap, iExeVsOffsetMap, iHiddenExeList);
-}
-
-/** 
-Function to check whether the node is an executable or not.
-
-@internalComponent
-@released
-
-@param aName - Executable name
-*/
-bool RofsReader::IsExecutable(String aName)
-{
-	unsigned int extOffset = aName.find_last_of('.');
-	if(extOffset != String::npos)
-	{
-		aName = aName.substr(extOffset);
-		if(aName.length() <= 4)
-		{
-			ReaderUtil::ToLower(aName);
-			if (aName.find(".exe") != String::npos || aName.find(".dll") != String::npos || 
-				aName.find(".prt") != String::npos || aName.find(".nif") != String::npos || 
-				aName.find(".tsy") != String::npos || aName.find(".pdl") != String::npos || 
-				aName.find(".csy") != String::npos || aName.find(".agt") != String::npos || 
-				aName.find(".ani") != String::npos || aName.find(".loc") != String::npos || 
-				aName.find(".pdd") != String::npos || aName.find(".ldd") != String::npos ||
-				aName.find(".drv") != String::npos) 
-			{
-				return true;
-			}
-		}
-	}
-	return false;
-}
-
-/** 
-Function responsible to prepare iExeVsE32ImageMap by traversing the tree recursively.
-
-@internalComponent
-@released
-
-@param aEntry - Root directory entry
-@param aImage - core image
-@param aImageType - Image type
-@param aInputStream - Input stream to read image file
-@param aExeVsE32ImageMap - Container to be filled
-@param aExeVsOffsetMap - Container to be filled
-@param aHiddenExeList - Hidden executables filled here.
-*/
-void RofsReader::PrepareExeVsE32ImageMap(TRomNode* aEntry, CCoreImage *aImage, EImageType aImageType, Ifstream& aInputStream, ExeVsE32ImageMap& aExeVsE32ImageMap, ExeVsOffsetMap& aExeVsOffsetMap, StringList& aHiddenExeList)
-{
-    String name((char*)aEntry->iName);
-	bool insideRofs = false;
-    E32Image* e32Image;
-    if(IsExecutable(name))
-    {
-		iExeAvailable = true;
-		//V9.1 images has hidden file offset as 0x0
-		//V9.2 to V9.6 has hidden file offset as 0xFFFFFFFFF
-        if(aEntry->iEntry->iFileOffset != KFileHidden && aEntry->iEntry->iFileOffset != KFileHidden_9_1)
-        {
-            long fileOffset = 0;
-            if(aImageType == ERofsExImage)
-            {
-				if(aEntry->iEntry->iFileOffset > (long)((RofsImage*)aImage)->iAdjustment)
-				{
-	            // File exists in Rofs extension 
-		            fileOffset = aEntry->iEntry->iFileOffset - ((RofsImage*)aImage)->iAdjustment;
-				}
-				else
-				{
-					insideRofs = true;
-				}
-            }
-            else
-            {
-	            // For rofs files
-	            fileOffset = aEntry->iEntry->iFileOffset;
-            }
-	            
-            aInputStream.seekg(fileOffset, Ios::beg);
-            /*
-            Due to the complexities involved in sending the physical file size to E32Reader class, 
-            here we avoided using it for gathering dependencies. Hence class E32ImageFile is used
-            directly.
-            */
-            e32Image = new E32Image();
-            e32Image->iFileSize = aEntry->iSize;
-            e32Image->Adjust(aEntry->iSize); //Initialise the data pointer to the file size
-            aInputStream >> *e32Image; //Input the E32 file to E32ImageFile class
-            aExeVsOffsetMap[ReaderUtil::ToLower(name)] = fileOffset;
-			if(!insideRofs)
-			{
-				aExeVsE32ImageMap.insert(std::make_pair(ReaderUtil::ToLower(name), e32Image));
-			}
-        }
-        else
-        {
-            aHiddenExeList.push_back(ReaderUtil::ToLower(name));
-        }
-    }
-
-    if(aEntry->Currentchild())
-    {
-        PrepareExeVsE32ImageMap(aEntry->Currentchild(), aImage, aImageType, aInputStream, aExeVsE32ImageMap, aExeVsOffsetMap, aHiddenExeList);
-    }
-    if(aEntry->Currentsibling())
-    {
-        PrepareExeVsE32ImageMap(aEntry->Currentsibling(), aImage, aImageType, aInputStream, aExeVsE32ImageMap, aExeVsOffsetMap, aHiddenExeList);
-    }
-}
-
-/** 
-Function responsible to the executable lists using the container iExeVsE32ImageMap.
-
-@internalComponent
-@released
-*/
-void RofsReader::PrepareExecutableList()
-{
-    ExeVsE32ImageMap::iterator e32ImageBegin = iExeVsE32ImageMap.begin();
-    ExeVsE32ImageMap::iterator e32ImageEnd  = iExeVsE32ImageMap.end();
-    E32Image* entry;
-    String name;
-    while(e32ImageBegin != e32ImageEnd)
-    {
-        entry = e32ImageBegin->second;
-        name = e32ImageBegin->first;
-        iExecutableList.push_back(name);
-        ++e32ImageBegin;
-    }
-	DeleteHiddenExecutableVsE32ImageEntry();
-}
-
-/** 
-Function responsible to delete the hidden executable nodes, in order to
-avoid the dependency data collection for the same.
-
-@internalComponent
-@released
-*/
-void RofsReader::DeleteHiddenExecutableVsE32ImageEntry()
-{
-	StringList::iterator hExeBegin = iHiddenExeList.begin();
-	StringList::iterator hExeEnd = iHiddenExeList.end();
-	ExeVsE32ImageMap::iterator loc;
-
-	while(hExeBegin != hExeEnd)
-	{
-		//Remove the hidden executable entry from executables vs RomNode Map
-		loc = iExeVsE32ImageMap.find(*hExeBegin);
-		if(loc != iExeVsE32ImageMap.end())
-		{
-			iExeVsE32ImageMap.erase(loc);
-		}
-		++hExeBegin;
-	}
-}
-
-/** 
-Function responsible to gather dependencies for all the executables using the container iExeVsE32ImageMap.
-
-@internalComponent
-@released
-
-@return iImageVsDepList - returns all executable's dependencies
-*/
-ExeNamesVsDepListMap& RofsReader::GatherDependencies()
-{
-	ExeVsE32ImageMap::iterator begin = iExeVsE32ImageMap.begin();
-	ExeVsE32ImageMap::iterator end = iExeVsE32ImageMap.end();
-
-	StringList executableList;
-	while(begin != end)
-	{
-		PrepareExeDependencyList((*begin).second, executableList);
-		iImageVsDepList.insert(std::make_pair((*begin).first, executableList));
-		executableList.clear();
-		++begin;
-	}
-	return iImageVsDepList;
-}
-
-/** 
-Function responsible to prepare the dependency list.
-This function can handle ROFS and ROFS extension images.
-
-@internalComponent
-@released
-
-@param - aE32Image, Using this, can get all the information about the executable
-@param - aExecutableList, Excutables placed into this list
-*/
-void RofsReader::PrepareExeDependencyList(E32Image* aE32Image, StringList& aExecutableList)
-{
-	int count = 0;
-	char** nameList = aE32Image->GetImportExecutableNames(count);
-	int i = 0;
-	String dependency;
-	for(; i < count; ++i)
-	{
-		dependency.assign(nameList[i]);
-		aExecutableList.push_back(ReaderUtil::ToLower(dependency));
-	}
-	DELETE(nameList);
-}
-
-/** 
-Function responsible to say whether it is an ROFS image or not.
-
-@internalComponent
-@released
-
-@param - aWord which has the identifier string
-*/
-bool RofsReader::IsRofsImage(String& aWord)
-{
-	if(aWord.find(KRofsImageIdentifier) == 0) //Identifier should start at the beginning
-	{
-		return true;
-	}
-	return false;
-}
-
-/** 
-Function responsible to say whether it is an ROFS extension image or not.
-
-@internalComponent
-@released
-
-@param - aWord which has the identifier string
-*/
-bool RofsReader::IsRofsExtImage(String& aWord)
-{
-	if(aWord.find(KRofsExtImageIdentifier) == 0) //Identifier should start at the beginning
-	{
-		return true;
-	}
-	return false;
-}
-
-/** 
-Function responsible to traverse through the the map using the container iExeVsE32ImageMap to collect 
-iExeVsIdData.
-
-@internalComponent
-@released
-*/
-void RofsReader::PrepareExeVsIdMap()
-{
-    ExeVsE32ImageMap::iterator begin = iExeVsE32ImageMap.begin();
-    ExeVsE32ImageMap::iterator end = iExeVsE32ImageMap.end();
-    String exeName;
-    E32Image* e32Image;
-    IdData* id;
-    if(iExeVsIdData.size() == 0) //Is not already prepared
-    {
-        while(begin != end)
-        {
-            exeName = begin->first;
-            e32Image = begin->second;
-			id = new IdData;
-			id->iUid = e32Image->iOrigHdr->iUid1;
-			id->iDbgFlag = (e32Image->iOrigHdr->iFlags & KImageDebuggable)? true : false;
-            TUint aHeaderFmt = E32ImageHeader::HdrFmtFromFlags(e32Image->iOrigHdr->iFlags);
-	        if (aHeaderFmt >= KImageHdrFmt_V)
-	        {
-                E32ImageHeaderV* v = e32Image->iHdr;
-                id->iSid = v->iS.iSecureId;
-                id->iVid = v->iS.iVendorId;
-	        }
-			id->iFileOffset = iExeVsOffsetMap[exeName];
-			iExeVsIdData[exeName] = id;
-            ++begin;
-        }
-    }
-	id = KNull;
-}
-
-/** 
-Function responsible to return the Executable versus IdData container. 
-
-@internalComponent
-@released
-
-@return - returns iExeVsIdData
-*/
-const ExeVsIdDataMap& RofsReader::GetExeVsIdMap() const
-{
-    return iExeVsIdData;
-}
+/*
+* Copyright (c) 2007-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: 
+*
+*/
+
+
+/**
+ @file
+ @internalComponent
+ @released
+*/
+#include "rofsreader.h"
+#include "r_romnode.h"
+
+
+/** 
+Constructor intializes the class pointer members.
+
+@internalComponent
+@released
+
+@param aFile - image file name
+@param aImageType - image type
+*/
+RofsReader::RofsReader(const char* aFile, EImageType aImageType)
+:ImageReader(aFile), iImageType(aImageType) {
+	iImageReader = new RCoreImageReader(aFile);
+	iImage = new RofsImage(iImageReader);
+	iInputStream.open(aFile, ios_base::binary | ios_base::in);
+}
+
+/** 
+Destructor deletes the class pointer members.
+
+@internalComponent
+@released
+*/
+RofsReader::~RofsReader() {
+	 
+	 for(ExeVsE32ImageMap::iterator it = iExeVsE32ImageMap.begin();
+		it != iExeVsE32ImageMap.end(); it++) {
+		if(it->second){
+			delete it->second ;
+			it->second = 0 ;
+		}
+		
+	} 
+	 
+	iRootDirEntry = 0 ;
+	 
+	iExeVsOffsetMap.clear();
+	if(iImageReader){
+		delete iImageReader;
+		iImageReader = 0 ;
+	}
+	if(iImage){
+		delete iImage;
+		iImage = 0 ;
+	}
+	iInputStream.close();
+	iExeVsE32ImageMap.clear();
+}
+
+/** 
+Dummy function for compatibility
+
+@internalComponent
+@released
+*/
+void RofsReader::ReadImage() {
+}
+
+/** 
+Function responsible to 
+1. Invoke E32Imagefile process method which will read the header part and identifies the 
+   compression method.
+2. Prepare executable vs E32Image map, which will be used later to read the E32Image contents.
+
+@internalComponent
+@released
+*/
+void RofsReader::ProcessImage() {
+	int retVal = iImage->ProcessImage();
+	if(retVal != KErrNone) {
+		exit(retVal);
+	}
+	iRootDirEntry = iImage->RootDirectory();
+	PrepareExeVsE32ImageMap(iRootDirEntry, iImage, iImageType, iInputStream, iExeVsE32ImageMap, iExeVsOffsetMap, iHiddenExeList);
+}
+
+/** 
+Function to check whether the node is an executable or not.
+
+@internalComponent
+@released
+
+@param aName - Executable name
+*/
+bool RofsReader::IsExecutable(const string& aName) {
+	unsigned int extOffset = aName.find_last_of('.');
+	if(extOffset != string::npos) {
+		string ext = aName.substr(extOffset);
+		if(ext.length() <= 4) {
+			ReaderUtil::ToLower(ext);
+			if (ext.find(".exe") != string::npos || ext.find(".dll") != string::npos || 
+				ext.find(".prt") != string::npos || ext.find(".nif") != string::npos || 
+				ext.find(".tsy") != string::npos || ext.find(".pdl") != string::npos || 
+				ext.find(".csy") != string::npos || ext.find(".agt") != string::npos || 
+				ext.find(".ani") != string::npos || ext.find(".loc") != string::npos || 
+				ext.find(".pdd") != string::npos || ext.find(".ldd") != string::npos ||
+				ext.find(".drv") != string::npos)  {
+				return true;
+			}
+		}
+	}
+	return false;
+}
+
+/** 
+Function responsible to prepare iExeVsE32ImageMap by traversing the tree recursively.
+
+@internalComponent
+@released
+
+@param aEntry - Root directory entry
+@param aImage - core image
+@param aImageType - Image type
+@param aInputStream - Input stream to read image file
+@param aExeVsE32ImageMap - Container to be filled
+@param aExeVsOffsetMap - Container to be filled
+@param aHiddenExeList - Hidden executables filled here.
+*/
+void RofsReader::PrepareExeVsE32ImageMap(TRomNode* aEntry, CCoreImage *aImage, EImageType aImageType, ifstream& aInputStream, ExeVsE32ImageMap& aExeVsE32ImageMap, ExeVsOffsetMap& aExeVsOffsetMap, StringList& aHiddenExes) {
+    string name(aEntry->iName);
+	bool insideRofs = false;
+    E32Image* e32Image;
+    if(IsExecutable(name)) {
+		iExeAvailable = true;
+		//V9.1 images has hidden file offset as 0x0
+		//V9.2 to V9.6 has hidden file offset as 0xFFFFFFFFF
+        if(aEntry->iEntry->iFileOffset != KFileHidden && aEntry->iEntry->iFileOffset != KFileHidden_9_1) {
+            long fileOffset = 0;
+            if(aImageType == ERofsExImage) {
+				if(aEntry->iEntry->iFileOffset > (long)((RofsImage*)aImage)->iAdjustment) {
+	            // File exists in Rofs extension 
+		            fileOffset = aEntry->iEntry->iFileOffset - ((RofsImage*)aImage)->iAdjustment;
+				}
+				else {
+					insideRofs = true;
+				}
+            }
+            else {
+	            // For rofs files
+	            fileOffset = aEntry->iEntry->iFileOffset;
+            }
+	            
+            aInputStream.seekg(fileOffset, ios_base::beg);
+            /*
+            Due to the complexities involved in sending the physical file size to E32Reader class, 
+            here we avoided using it for gathering dependencies. Hence class E32ImageFile is used
+            directly.
+            */
+            e32Image = new E32Image();
+            e32Image->iFileSize = aEntry->iSize;
+            e32Image->Adjust(aEntry->iSize); //Initialise the data pointer to the file size
+            aInputStream >> *e32Image; //Input the E32 file to E32ImageFile class
+            put_item_to_map(aExeVsOffsetMap,aEntry->iName,fileOffset);
+			if(!insideRofs) {
+				put_item_to_map_2(aExeVsE32ImageMap,aEntry->iName, e32Image);
+				
+			}
+        }
+        else { 
+            aHiddenExes.push_back(aEntry->iName);
+        }
+    }
+
+    if(aEntry->Currentchild()) {
+        PrepareExeVsE32ImageMap(aEntry->Currentchild(), aImage, aImageType, aInputStream, aExeVsE32ImageMap, aExeVsOffsetMap, aHiddenExes);
+    }
+    if(aEntry->Currentsibling()) {
+        PrepareExeVsE32ImageMap(aEntry->Currentsibling(), aImage, aImageType, aInputStream, aExeVsE32ImageMap, aExeVsOffsetMap, aHiddenExes);
+    }
+}
+
+/** 
+Function responsible to the executable lists using the container iExeVsE32ImageMap.
+
+@internalComponent
+@released
+*/
+void RofsReader::PrepareExecutableList() { 
+	iExecutableList.clear();
+    for(ExeVsE32ImageMap::iterator it = iExeVsE32ImageMap.begin();
+		it != iExeVsE32ImageMap.end() ; it ++) { 
+        iExecutableList.push_back(it->first); 
+    }
+	DeleteHiddenExecutableVsE32ImageEntry();
+}
+
+/** 
+Function responsible to delete the hidden executable nodes, in order to
+avoid the dependency data collection for the same.
+
+@internalComponent
+@released
+*/
+void RofsReader::DeleteHiddenExecutableVsE32ImageEntry() { 
+	for(StringList::iterator it = iHiddenExeList.begin();
+		it != iHiddenExeList.end(); it++){ 
+		//Remove the hidden executable entry from executables vs RomNode Map
+		ExeVsE32ImageMap::iterator pos = iExeVsE32ImageMap.find(*it);
+		if(pos != iExeVsE32ImageMap.end()) { 
+			if(pos->second)
+				delete pos->second ;
+			iExeVsE32ImageMap.erase(pos);
+		} 
+	}
+}
+
+/** 
+Function responsible to gather dependencies for all the executables using the container iExeVsE32ImageMap.
+
+@internalComponent
+@released
+
+@return iImageVsDepList - returns all executable's dependencies
+*/
+ExeNamesVsDepListMap& RofsReader::GatherDependencies() { 
+
+	StringList executables;
+	for(ExeVsE32ImageMap::iterator it = iExeVsE32ImageMap.begin() ; 
+		it != iExeVsE32ImageMap.end() ; it++) {
+		PrepareExeDependencyList(it->second, executables);
+		put_item_to_map(iImageVsDepList,it->first, executables);
+		executables.clear(); 
+	}
+	return iImageVsDepList;
+}
+
+/** 
+Function responsible to prepare the dependency list.
+This function can handle ROFS and ROFS extension images.
+
+@internalComponent
+@released
+
+@param - aE32Image, Using this, can get all the information about the executable
+@param - aExecutables, Excutables placed into this list
+*/
+void RofsReader::PrepareExeDependencyList(E32Image* aE32Image, StringList& aExecutables) {
+	int count = 0;
+	char** names = aE32Image->GetImportExecutableNames(count); 
+	for(int i = 0 ; i < count; ++i) { 
+		aExecutables.push_back(names[i]);
+	}
+	if(names){
+		delete [](reinterpret_cast<long*>(names));
+	}
+}
+
+/** 
+Function responsible to say whether it is an ROFS image or not.
+
+@internalComponent
+@released
+
+@param - aWord which has the identifier string
+*/
+bool RofsReader::IsRofsImage(const string& aWord) {
+	return (aWord.find(KRofsImageIdentifier) == 0);//Identifier should start at the beginning
+ 
+}
+
+/** 
+Function responsible to say whether it is an ROFS extension image or not.
+
+@internalComponent
+@released
+
+@param - aWord which has the identifier string
+*/
+bool RofsReader::IsRofsExtImage(const string& aWord) {
+	return (aWord.find(KRofsExtImageIdentifier) == 0) ;//Identifier should start at the beginning
+}
+
+/** 
+Function responsible to traverse through the the map using the container iExeVsE32ImageMap to collect 
+iExeVsIdData.
+
+@internalComponent
+@released
+*/
+void RofsReader::PrepareExeVsIdMap() { 
+    if(iExeVsIdData.size() == 0) {//Is not already prepared 
+        for(ExeVsE32ImageMap::iterator it = iExeVsE32ImageMap.begin();
+			it != iExeVsE32ImageMap.end() ; it++) {
+            string exeName(it->first);
+            E32Image* e32Image = it->second;
+			IdData* id = new IdData;
+			id->iUid = e32Image->iOrigHdr->iUid1;
+			id->iDbgFlag = (e32Image->iOrigHdr->iFlags & KImageDebuggable)? true : false;
+            TUint aHeaderFmt = E32ImageHeader::HdrFmtFromFlags(e32Image->iOrigHdr->iFlags);
+	        if (aHeaderFmt >= KImageHdrFmt_V) {
+                E32ImageHeaderV* v = e32Image->iHdr;
+                id->iSid = v->iS.iSecureId;
+                id->iVid = v->iS.iVendorId;
+	        }
+			id->iFileOffset = iExeVsOffsetMap[exeName]; 
+			put_item_to_map_2(iExeVsIdData,exeName,id); 
+        }
+    } 
+}
+
+/** 
+Function responsible to return the Executable versus IdData container. 
+
+@internalComponent
+@released
+
+@return - returns iExeVsIdData
+*/
+const ExeVsIdDataMap& RofsReader::GetExeVsIdMap() const {
+    return iExeVsIdData;
+}