diff -r c7c26511138f -r 360bd6b35136 imgtools/imgcheck/src/depchecker.cpp --- a/imgtools/imgcheck/src/depchecker.cpp Wed Jun 16 16:51:40 2010 +0300 +++ b/imgtools/imgcheck/src/depchecker.cpp Wed Jun 23 16:56:47 2010 +0800 @@ -1,243 +1,227 @@ -/* -* 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: -* DepChecker class is responsible to Validate the dependencies existence and put the -* prepared data into Reporter. -* -*/ - - -/** - @file - @internalComponent - @released -*/ - -#include "depchecker.h" - -/** -Constructor intializes the iHashPtr and iHiddenExeHashPtr members. - -@internalComponent -@released - -@param aCmdInput - pointer to a processed CmdLineHandler object -@param aImageReaderList - List of ImageReader insatance pointers -*/ -DepChecker::DepChecker(CmdLineHandler* aCmdPtr, ImageReaderPtrList& aImageReaderList, bool aNoRomImage) -:Checker(aCmdPtr, aImageReaderList), iNoRomImage(aNoRomImage) -{ - iHashPtr = new HashTable(KHashTableSize); - iHiddenExeHashPtr = new HashTable(KHiddenExeHashSize); -} - -/** -Destructor deletes the imagereader objects and hash tables. - -@internalComponent -@released -*/ -DepChecker::~DepChecker() -{ - DELETE(iHiddenExeHashPtr); - DELETE(iHashPtr); - iAddressVsExeName.clear(); -} - -/** -Fucntion responsible to -1. Prepare the ROM and ROFS image executable List -2. Gather Dependencies of all executables present in the ROFS image -3. Prepare the input data for Reporter - -@internalComponent -@released - -@param ImgVsExeStatus - Global integrated container which contains image, exes and attribute value status. -*/ -void DepChecker::Check(ImgVsExeStatus& aImgVsExeStatus) -{ - unsigned int imgCnt = 0; - RomImagePassed(); - String imageName; - ExeNamesVsDepListMap::iterator exeBegin; - ExeNamesVsDepListMap::iterator exeEnd; - while(imgCnt < iImageReaderList.size()) - { - imageName = iImageReaderList[imgCnt]->ImageName(); - PrepareImageExeList(iImageReaderList[imgCnt]); - //Gather dependencies of all the images. - ExceptionReporter(GATHERINGDEPENDENCIES, (char*)imageName.c_str()).Log(); - ExeNamesVsDepListMap& depMap = iImageReaderList[imgCnt]->GatherDependencies(); - exeBegin = depMap.begin(); - exeEnd = depMap.end(); - while(exeBegin != exeEnd) - { - StringList& list = exeBegin->second; - aImgVsExeStatus[imageName][exeBegin->first].iIdData = KNull; - aImgVsExeStatus[imageName][exeBegin->first].iDepList = list; - ++exeBegin; - } - ++imgCnt; - } -} - -/** -Function responsible to -1. Prepare the ExecutableList -2. Put the received Excutable list into HASH table, this data will be used later - to identify the dependencies existense. - -@internalComponent -@released - -@param aImageReader - ImageReader instance pointer. -*/ -void DepChecker::PrepareImageExeList(ImageReader* aImageReader) -{ - aImageReader->PrepareExecutableList(); - StringList aExeList = aImageReader->GetExecutableList(); - iHashPtr->InsertStringList(aExeList); //Put executable names into Hash - /** - In ROM if any file is hidden then its entry is not placed in the directory - section of the image during image building time. But still the entry data is - already resolved and ready for xip. So this entry is marked here as Unknown - Dependency and its status is Hidden. - */ - StringList hiddenExeList = aImageReader->GetHiddenExeList(); - iHiddenExeHashPtr->Insert(KUnknownDependency); //ROm Specific and only once - iHiddenExeHashPtr->InsertStringList(hiddenExeList); - DeleteHiddenExeFromExecutableList(aImageReader, hiddenExeList); - String imgName = aImageReader->ImageName(); - ExceptionReporter(NOOFEXECUTABLES, (char*)imgName.c_str(), aExeList.size()).Log(); - ExceptionReporter(NOOFHEXECUTABLES, (char*)imgName.c_str(), hiddenExeList.size()).Log(); -} - -/** -Function responsible to delete the hidden executables from iExecutableList. -In ROFS image, if a file is hidden then its duplicate entry is created to say it is -hidden. But the other entry is already placed in the executable list and it is -available in iHashPtr Hash table. So this needs to be deleted form iHashPtr, then only -it is possible to get the status "Hidden" for such executables. - -@internalComponent -@released - -@param aImageReader - ImageReader instance pointer. -@param aHiddenExeList - List containing the hidden exe's. -*/ -void DepChecker::DeleteHiddenExeFromExecutableList(ImageReader* /*aImageReader*/, StringList& aHiddenExeList) -{ - StringList::iterator begin = aHiddenExeList.begin(); - StringList::iterator end = aHiddenExeList.end(); - while(begin != end) - { - iHashPtr->Delete(*begin); - ++begin; - } -} - -/** -Function responsible to prepare the data input for Report Generator. -Traverses through all the images to identify the executables dependency status. - -@internalComponent -@released - -@param aExeContainer - Global integrated container which contains all the attribute, values and the status. -*/ -void DepChecker::PrepareAndWriteData(ExeContainer* aExeContainer) -{ - ExeAttribute* exeAtt; - StringList& depList = aExeContainer->iDepList; - StringList::iterator depBegin = depList.begin(); - StringList::iterator depEnd = depList.end(); - while(depBegin != depEnd) - { - String status; - if(!iNoCheck) - { - CollectDependencyStatus((*depBegin), status); - - if(status == String(KStatusNo)) - { - if(iHiddenExeHashPtr->IsAvailable(*depBegin)) - { - status.assign(KStatusHidden); - } - } - //Include only missing dependencies by default - if(!iAllExecutables && (status != String(KStatusNo))) - { - ++depBegin; - continue; - } - } - exeAtt = new ExeAttribute; - if(exeAtt == KNull) - { - throw ExceptionReporter(NOMEMORY, __FILE__, __LINE__); - } - exeAtt->iAttName = KDependency; - exeAtt->iAttValue = *depBegin; - if(!iNoCheck) - { - exeAtt->iAttStatus = status; - } - else - { - exeAtt->iAttStatus = KNull; - } - aExeContainer->iExeAttList.push_back(exeAtt); - ++depBegin; - } -} - -/** -Function responsible to Get the dependency status for one executable at instant. -Check for the existence of executable in the Hash table which is created while -preparing executable list. - -@internalComponent -@released - -@param aString - Individual dependency name. (input) -@param aStatus - Dependency status.(for output) -*/ -void DepChecker::CollectDependencyStatus(String& aString, String& aStatus) const -{ - if(iHashPtr->IsAvailable(aString)) - { - aStatus.assign(KStatusYes); - return; - } - aStatus.assign(KStatusNo); -} - -/** -Function responsible to display the no rom image warning. -While checking for dependency if ROM image is not passed and only ROFS is passed then -there is a chance that most of the executables dependencies will not be available. -Hence this warning is raised. - -@internalComponent -@released -*/ -void DepChecker::RomImagePassed(void) const -{ - if(iNoRomImage) - { - ExceptionReporter(NOROMIMAGE).Report(); - } -} +/* +* 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: +* DepChecker class is responsible to Validate the dependencies existence and put the +* prepared data into Reporter. +* +*/ + + +/** +@file +@internalComponent +@released +*/ + +#include "depchecker.h" + +/** +Constructor intializes the iHashPtr and iHiddenExeHashPtr members. + +@internalComponent +@released + +@param aCmdInput - pointer to a processed CmdLineHandler object +@param aImageReaderList - List of ImageReader insatance pointers +*/ +DepChecker::DepChecker(CmdLineHandler* aCmdPtr, ImageReaderPtrList& aImageReaderList, bool aNoRomImage) +:Checker(aCmdPtr, aImageReaderList), iNoRomImage(aNoRomImage) { + iHashPtr = new HashTable(KHashTableSize); + iHiddenExeHashPtr = new HashTable(KHiddenExeHashSize); +} + +/** +Destructor deletes the imagereader objects and hash tables. + +@internalComponent +@released +*/ +DepChecker::~DepChecker() { + if(iHiddenExeHashPtr){ + delete iHiddenExeHashPtr; + iHiddenExeHashPtr = 0 ; + } + if(iHashPtr){ + delete iHashPtr ; + iHashPtr = 0 ; + } + iAddressVsExeName.clear(); +} + +/** +Fucntion responsible to +1. Prepare the ROM and ROFS image executable List +2. Gather Dependencies of all executables present in the ROFS image +3. Prepare the input data for Reporter + +@internalComponent +@released + +@param ImgVsExeStatus - Global integrated container which contains image, exes and attribute value status. +*/ +void DepChecker::Check(ImgVsExeStatus& aImgVsExeStatus) { + RomImagePassed(); + int readerCount = iImageReaderList.size(); + + for(int i = 0 ; i < readerCount ; i++){ + ImageReader* reader = iImageReaderList.at(i); + const char* name = reader->ImageName(); + PrepareImageExeList(reader); + //Gather dependencies of all the images. + ExceptionReporter(GATHERINGDEPENDENCIES, name).Log(); + ExeNamesVsDepListMap& depMap = iImageReaderList[i]->GatherDependencies(); + for(ExeNamesVsDepListMap::iterator it = depMap.begin() ; + it != depMap.end() ; it++) { + StringList& list = it->second; + ImgVsExeStatus::iterator pos = aImgVsExeStatus.find(name); + ExeVsMetaData* p = 0; + if(pos == aImgVsExeStatus.end()){ + p = new ExeVsMetaData(); + put_item_to_map(aImgVsExeStatus,name,p); + } + else + p = pos->second ; + ExeContainer container ; + container.iExeName = it->first ; + container.iIdData = KNull; + container.iDepList = list ; + put_item_to_map(*p,it->first,container); + } + } +} + +/** +Function responsible to +1. Prepare the ExecutableList +2. Put the received Excutable list into HASH table, this data will be used later +to identify the dependencies existense. + +@internalComponent +@released + +@param aImageReader - ImageReader instance pointer. +*/ +void DepChecker::PrepareImageExeList(ImageReader* aImageReader) { + + aImageReader->PrepareExecutableList(); + const StringList& aExeList = aImageReader->GetExecutableList(); + iHashPtr->InsertStringList(aExeList); //Put executable names into Hash + /** + In ROM if any file is hidden then its entry is not placed in the directory + section of the image during image building time. But still the entry data is + already resolved and ready for xip. So this entry is marked here as Unknown + Dependency and its status is Hidden. + */ + const StringList& hiddenExeList = aImageReader->GetHiddenExeList(); + iHiddenExeHashPtr->Insert(KUnknownDependency); //ROm Specific and only once + iHiddenExeHashPtr->InsertStringList(hiddenExeList); + DeleteHiddenExeFromExecutableList(aImageReader, hiddenExeList); + const char* imgName = aImageReader->ImageName(); + ExceptionReporter(NOOFEXECUTABLES, imgName, aExeList.size()).Log(); + ExceptionReporter(NOOFHEXECUTABLES, imgName, hiddenExeList.size()).Log(); +} + +/** +Function responsible to delete the hidden executables from iExecutableList. +In ROFS image, if a file is hidden then its duplicate entry is created to say it is +hidden. But the other entry is already placed in the executable list and it is +available in iHashPtr Hash table. So this needs to be deleted form iHashPtr, then only +it is possible to get the status "Hidden" for such executables. + +@internalComponent +@released + +@param aImageReader - ImageReader instance pointer. +@param aHiddenExeList - List containing the hidden exe's. +*/ +void DepChecker::DeleteHiddenExeFromExecutableList(ImageReader* /*aImageReader*/, const StringList& aHiddenExeList) { + for(StringList::const_iterator it = aHiddenExeList.begin(); it != aHiddenExeList.end(); it++){ + iHashPtr->Delete(*it); + } +} + +/** +Function responsible to prepare the data input for Report Generator. +Traverses through all the images to identify the executables dependency status. + +@internalComponent +@released + +@param aExeContainer - Global integrated container which contains all the attribute, values and the status. +*/ +void DepChecker::PrepareAndWriteData(ExeContainer& aExeContainer) { + StringList& depList = aExeContainer.iDepList; + for(StringList::iterator it = depList.begin(); it != depList.end(); it++) { + string status; + const char* str = it->c_str() ; + if(!iNoCheck) { + CollectDependencyStatus(str, status); + if(status == KStatusNo) { + if(iHiddenExeHashPtr->IsAvailable(str)) { + status.assign(KStatusHidden); + } + } + //Include only missing dependencies by default + if(!iAllExecutables && (status != KStatusNo)) { + continue; + } + } + ExeAttribute* exeAtt = new ExeAttribute(); + if(exeAtt == KNull) { + throw ExceptionReporter(NOMEMORY, __FILE__, __LINE__); + } + exeAtt->iAttName.assign(KDependency); + exeAtt->iAttValue.assign(str); + if(!iNoCheck) { + exeAtt->iAttStatus = status; + } + else { + exeAtt->iAttStatus = KNull; + } + aExeContainer.iExeAttList.push_back(exeAtt); + } +} + +/** +Function responsible to Get the dependency status for one executable at instant. +Check for the existence of executable in the Hash table which is created while +preparing executable list. + +@internalComponent +@released + +@param aString - Individual dependency name. (input) +@param aStatus - Dependency status.(for output) +*/ +void DepChecker::CollectDependencyStatus(const char* aString, string& aStatus) const { + if(iHashPtr->IsAvailable(aString)) + aStatus.assign(KStatusYes); + else + aStatus.assign(KStatusNo); +} + +/** +Function responsible to display the no rom image warning. +While checking for dependency if ROM image is not passed and only ROFS is passed then +there is a chance that most of the executables dependencies will not be available. +Hence this warning is raised. + +@internalComponent +@released +*/ +void DepChecker::RomImagePassed(void) const { + if(iNoRomImage) { + ExceptionReporter(NOROMIMAGE).Report(); + } +}