diff -r 000000000000 -r 044383f39525 imgtools/imgcheck/src/imgcheckmanager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/imgtools/imgcheck/src/imgcheckmanager.cpp Tue Oct 27 16:36:35 2009 +0000 @@ -0,0 +1,305 @@ +/* +* 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: +* ImgCheckManager controller class Controls the instantiation and +* operations of ImageReader, Checker, Reporter and ReportWriter. +* +*/ + + +/** + @file + @internalComponent + @released +*/ + +#include "imgcheckmanager.h" +#include "romreader.h" +#include "rofsreader.h" +#include "dirreader.h" +#include "depchecker.h" +#include "sidchecker.h" +#include "vidchecker.h" +#include "dbgflagchecker.h" + +/** +Constructor initializes command line handler pointer. +Which can be used by any tool which is derived from this class. + +@internalComponent +@released + +@param aCmdPtr - command line handler pointer +*/ +ImgCheckManager::ImgCheckManager(CmdLineHandler* aCmdPtr) +:iCmdLine(aCmdPtr) +{ + iReporter = Reporter::Instance(iCmdLine->ReportFlag()); + iNoRomImage = true; +} + +/** +Destructor traverses through the imagereader list and delets the same + +@internalComponent +@released +*/ +ImgCheckManager::~ImgCheckManager() +{ + while(iImageReaderList.size() > 0) + { + DELETE(iImageReaderList.back()); + iImageReaderList.pop_back(); + } + while(iCheckerList.size() > 0) + { + DELETE(iCheckerList.back()); + iCheckerList.pop_back(); + } + while(iWriterList.size() > 0) + { + DELETE(iWriterList.back()) + iWriterList.pop_back(); + } + Reporter::DeleteInstance(); + iCmdLine = 0; +} + +/** +Function responsible to read the header and directory section. + +@internalComponent +@released + +@param aImageName - image name +@param aImageType - image type +*/ +void ImgCheckManager::Process(ImageReader* aImageReader) +{ + ExceptionReporter(READINGIMAGE,(char*)aImageReader->ImageName().c_str()).Log(); + aImageReader->ReadImage(); + aImageReader->ProcessImage(); + if(!aImageReader->ExecutableAvailable()) + { + throw ExceptionReporter(NOEXEPRESENT); + } +} + +/** +Function responsible to +1. get the image names one by one. +2. Identify the image type and Create respective Reader objects. +3. Identify the required validations and create respective Instances. +4. Identify the required Writers and create respective instances. + +@internalComponent +@released +*/ +void ImgCheckManager::CreateObjects(void) +{ + unsigned int imgCnt = iCmdLine->NoOfImages(); + String imgName; + + while(imgCnt > 0) + { + imgName = iCmdLine->NextImageName(); + --imgCnt; + HandleImage(imgName); + } + + Checker* checkerPtr = KNull; + unsigned int checks = iCmdLine->EnabledValidations(); + unsigned short int bitPos = 1; + while(bitPos) + { + if(bitPos & checks) + { + switch(bitPos) + { + case EDep: + checkerPtr = new DepChecker(iCmdLine, iImageReaderList,iNoRomImage); + break; + case ESid: + checkerPtr = new SidChecker(iCmdLine, iImageReaderList); + break; + case EVid: + checkerPtr = new VidChecker(iCmdLine, iImageReaderList); + break; + case EDbg: + checkerPtr = new DbgFlagChecker(iCmdLine, iImageReaderList); + break; + } + if(checkerPtr == KNull) + { + throw ExceptionReporter(NOMEMORY, __FILE__, __LINE__); + } + iCheckerList.push_back(checkerPtr); + } + bitPos <<= 1; //Shift one bit left + } + + unsigned int rptFlag = iCmdLine->ReportFlag(); + ReportWriter* rptWriter = KNull; + if(!( rptFlag & QuietMode)) + { + rptWriter = new CmdLineWriter(rptFlag); + InsertWriter(rptWriter); + } + if(iCmdLine->ReportFlag() & KXmlReport) + { + rptWriter = new XmlWriter(iCmdLine->XmlReportName(), iCmdLine->Command()); + InsertWriter(rptWriter); + } +} + +/** +Function responsible to insert the ReprtWriter into iWriterList + +@internalComponent +@released +*/ +void ImgCheckManager::InsertWriter(ReportWriter* aWriter) +{ + if(aWriter == KNull) + { + throw ExceptionReporter(NOMEMORY, __FILE__, __LINE__); + } + iWriterList.push_back(aWriter); +} + +/** +Function responsible to initiate the enabled validations + +@internalComponent +@released +*/ +void ImgCheckManager::Execute(void) +{ + unsigned int cnt = 0; + ImgVsExeStatus& imgVsExeStatus = iReporter->GetContainerReference(); + while(cnt < iCheckerList.size()) + { + iCheckerList[cnt++]->Check(imgVsExeStatus); + } +} + +/** +Function responsible to write the validated data into Reporter. + +@internalComponent +@released +*/ +void ImgCheckManager::FillReporterData(void) +{ + + ImgVsExeStatus& imgVsExeStatus = iReporter->GetContainerReference(); + ImgVsExeStatus::iterator imgBegin = imgVsExeStatus.begin(); + ImgVsExeStatus::iterator imgEnd = imgVsExeStatus.end(); + + ExeVsMetaData::iterator exeBegin; + ExeVsMetaData::iterator exeEnd; + + + while(imgBegin != imgEnd) + { + ExeVsMetaData& exeVsMetaData = imgBegin->second; + exeBegin = exeVsMetaData.begin(); + exeEnd = exeVsMetaData.end(); + while(exeBegin != exeEnd) + { + ExeContainer& exeContainer = (*exeBegin).second; + + unsigned int cnt = 0; + while(cnt < iCheckerList.size()) + { + iCheckerList[cnt++]->PrepareAndWriteData(&exeContainer); + } + ++exeBegin; + } + ++imgBegin; + } +} + +/** +Function responsible to start report generation. This function invokes the Reporter's +CreateReport function by passing iWriterList as argument. + +@internalComponent +@released + +@return - returns the return value of Reporter::CreateReport function. +*/ +void ImgCheckManager::GenerateReport(void) +{ + iReporter->CreateReport(iWriterList); +} + +/** +Function to identify the image type and read the header and file and/or directory entries. + +@internalComponent +@released + +@param aImageName - image name received as part of command line +@param EImageType - type of the input image +*/ +void ImgCheckManager::HandleImage(const String& aImageName, EImageType aImageType) +{ + unsigned int rptFlag = iCmdLine->ReportFlag(); + if(rptFlag & KE32Input) + { + aImageType = DirReader::EntryType((char*)aImageName.c_str()); + } + else if(aImageType == EUnknownImage) + { + aImageType = ImageReader::ReadImageType(aImageName); + } + ImageReader* imgReader = KNull; + + switch(aImageType) + { + case ERomImage: + iNoRomImage = false; + case ERomExImage: + imgReader = new RomReader((char*)aImageName.c_str(), aImageType); + break; + + case ERofsImage: + case ERofsExImage: + imgReader = new RofsReader((char*)aImageName.c_str(), aImageType); + break; + + case EE32Directoy: + imgReader = new DirReader((char*)aImageName.c_str()); + break; + + case EE32File: + imgReader = new E32Reader((char*)aImageName.c_str()); + break; + + case EUnknownImage: + throw ExceptionReporter(UNKNOWNIMAGETYPE, (char*)aImageName.c_str()); + break; + + case EE32InputNotExist: + throw ExceptionReporter(E32INPUTNOTEXIST, (char*)aImageName.c_str()); + break; + } + if(imgReader == KNull) + { + throw ExceptionReporter(NOMEMORY, __FILE__, __LINE__); + } + Process(imgReader); + iImageReaderList.push_back(imgReader); +}