--- 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;
+}