diff -r 000000000000 -r 044383f39525 imgtools/imgcheck/src/sidchecker.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/imgtools/imgcheck/src/sidchecker.cpp Tue Oct 27 16:36:35 2009 +0000 @@ -0,0 +1,258 @@ +/* +* Copyright (c) 2008-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: +* SidChecker class is to +* 1. extract all SID's from all executables present in ROM/ROFS sections. +* 2. Validate them. +* 3. Put the validated data into Reporter class Instance. +* +*/ + + +/** + @file + @internalComponent + @released +*/ +#include "sidchecker.h" + +/** +Constructor. + +@internalComponent +@released + +@param aCmdPtr - pointer to an processed CmdLineHandler object +@param aImageReaderList - List of ImageReader insatance pointers +*/ +SidChecker::SidChecker(CmdLineHandler* aCmdPtr, ImageReaderPtrList& aImageReaderList) +:Checker(aCmdPtr, aImageReaderList) +{ + iSidAll = (iCmdLine->ReportFlag() & KSidAll) ? true : false; + iE32Mode = (iCmdLine->ReportFlag() & KE32Input) ? true : false; +} + +/** +Destructor + +@internalComponent +@released +*/ +SidChecker::~SidChecker() +{ + iSidVsExeMap.clear(); +} + +/** +Function responsible to Prepare the ROM and ROFS image SID data + +@internalComponent +@released + +@param ImgVsExeStatus - Global integrated container which contains image, exes and attribute value status. +*/ +void SidChecker::Check(ImgVsExeStatus& aImgVsExeStatus) +{ + ImageReaderPtrList::iterator begin = iImageReaderList.begin(); + ImageReaderPtrList::iterator end = iImageReaderList.end(); + + ExeVsIdDataMap::iterator exeBegin; + ExeVsIdDataMap::iterator exeEnd; + ExeVsIdDataMap exeVsIdDataMap; + ImageReader* imageReader = KNull; + String imageName; + while(begin != end) + { + imageReader = *begin; + imageName = imageReader->ImageName(); + ExceptionReporter(GATHERINGIDDATA, (char*)KSid.c_str(),(char*)imageName.c_str()).Log(); + imageReader->PrepareExeVsIdMap(); + + exeVsIdDataMap = imageReader->GetExeVsIdMap(); + exeBegin = exeVsIdDataMap.begin(); + exeEnd = exeVsIdDataMap.end(); + if((aImgVsExeStatus[imageName].size() == 0) + || (aImgVsExeStatus[imageName][exeBegin->first].iIdData == KNull)) + { + while(exeBegin != exeEnd) + { + if(!iSidAll) + { + if(ReaderUtil::IsExe(&exeBegin->second->iUid)) + { + iSidVsExeMap.insert(std::make_pair(exeBegin->second->iSid, exeBegin->first)); + } + } + else + { + iSidVsExeMap.insert(std::make_pair(exeBegin->second->iSid, exeBegin->first)); + } + aImgVsExeStatus[imageName][exeBegin->first].iIdData = exeBegin->second; + aImgVsExeStatus[imageName][exeBegin->first].iExeName = exeBegin->first; + ++exeBegin; + } + } + ++begin; + } +} + +/** +Function responsible to Validate and write the SID data into reporter. + +@internalComponent +@released + +@param aExeContainer - Global integrated container which contains all the attribute, values and the status. +*/ +void SidChecker::PrepareAndWriteData(ExeContainer* aExeContainer) +{ + if(!iSidAll) + { + /**This map is used to find the uniqueness of the SID, instead of traversing through + the iImgVsExeStatus again and again to get all Executables SID*/ + if(ReaderUtil::IsExe(&aExeContainer->iIdData->iUid)) + { + FillExeAttribute(aExeContainer); + } + } + else + { + FillExeAttribute(aExeContainer); + } +} + +/** +Function responsible to Validate the executble SID. +1. If the SID occurence across all the ROM/ROFS sections is one then the status is Unique. +2. If more than one entry found and those executables Offset in ROM/ROFS section are same +then its status is Unique(Alias). +3. If those Offsets are differnt, then the status is Duplicate. + +@internalComponent +@released + +@param aExeContainer - Global integrated container which contains all the attribute, values and the status. +*/ +void SidChecker::FillExeSidStatus(ExeContainer* aExeContainer) +{ + SidVsExeMap::iterator sidIter; + unsigned int cnt = iSidVsExeMap.count(aExeContainer->iIdData->iSid); + if(cnt > 1) //Is More than one SID exists? + { + sidIter = iSidVsExeMap.find(aExeContainer->iIdData->iSid); + while(cnt > 0) + { + if( aExeContainer->iExeName != sidIter->second) + { + aExeContainer->iIdData->iSidStatus = KDuplicate; + + if(!iE32Mode) + { + unsigned int offset = GetExecutableOffset(sidIter->second); + if(aExeContainer->iIdData->iFileOffset == offset) + { + aExeContainer->iIdData->iSidStatus = KUniqueAlias; + break; + } + } + } + --cnt; + ++sidIter; + } + } + else + { + aExeContainer->iIdData->iSidStatus = KUnique; + } +} + +/** +Function to get an executable's Offset location. +1. Traverse through all the image entries available in the iImgVsExeStatus container. +2. Get the executable Offset. + +@internalComponent +@released + +@param aExeName - Executable's name. + +@return - returns 0 upon failure to find the Executable. + - otherwise returns the Offset. +*/ +const unsigned int SidChecker::GetExecutableOffset(const String& aExeName) +{ + Reporter* reporter = Reporter::Instance(iCmdLine->ReportFlag()); + ImgVsExeStatus& aImgVsExeStatus = reporter->GetContainerReference(); + + ImgVsExeStatus::iterator imgBegin = aImgVsExeStatus.begin(); + ImgVsExeStatus::iterator imgEnd = aImgVsExeStatus.end(); + + ExeVsMetaData::iterator exeBegin; + ExeVsMetaData::iterator exeEnd; + + while(imgBegin != imgEnd) + { + ExeVsMetaData& exeVsMetaData = imgBegin->second; + exeBegin = exeVsMetaData.begin(); + exeEnd = exeVsMetaData.end(); + + while(exeBegin != exeEnd) + { + if(aExeName == (exeBegin->second).iExeName) + { + return (exeBegin->second).iIdData->iFileOffset; + } + ++exeBegin; + } + ++imgBegin; + } + return 0; +} + +/** +Function responsible fill up the exe attribute list + +@internalComponent +@released + +@param aExeContainer - Global integrated container which contains all the attribute, values and the status. +*/ +void SidChecker::FillExeAttribute(ExeContainer* aExeContainer) +{ + ExeAttribute* exeAtt = KNull; + + exeAtt = new ExeAttribute; + if(!exeAtt) + { + throw ExceptionReporter(NOMEMORY, __FILE__, __LINE__); + } + + exeAtt->iAttName = KSid; + exeAtt->iAttValue = Common::IntToString(aExeContainer->iIdData->iSid); + if(!iNoCheck) + { + FillExeSidStatus(aExeContainer); + exeAtt->iAttStatus = aExeContainer->iIdData->iSidStatus; + } + else + { + exeAtt->iAttStatus = KNull; + } + if((iAllExecutables + || (exeAtt->iAttStatus == KDuplicate)) && !exeAtt->iAttStatus.empty() + || iNoCheck) + { + aExeContainer->iExeAttList.push_back(exeAtt); + } +}