imgtools/imgcheck/src/depchecker.cpp
changeset 0 044383f39525
child 590 360bd6b35136
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imgcheck/src/depchecker.cpp	Tue Oct 27 16:36:35 2009 +0000
@@ -0,0 +1,243 @@
+/*
+* 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();
+	}
+}