imgtools/imgcheck/src/imgcheckmanager.cpp
changeset 0 044383f39525
child 590 360bd6b35136
--- /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);
+}