imgtools/imgcheck/src/reporter.cpp
author timothy.murphy@nokia.com
Thu, 25 Mar 2010 13:43:28 +0000
branchfix
changeset 408 a819f9223567
parent 0 044383f39525
child 590 360bd6b35136
permissions -rw-r--r--
fix: stop using "magic" numbers in string operations for the copyannofile2log feature fix: When using the copylogfromannofile workaround, extract the build ID and build duration and add to the log as these are useful for analysis. The log should now be identical to the stdout file. fix: Remove extra blank lines from output in copylogfromannofile mode.

/*
* 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: 
* Base for commandline or xml report generation.
*
*/


/**
 @file
 @internalComponent
 @released
*/

#include "reporter.h"

/**
Static variable as instance pointer

@internalComponent
@released
*/
Reporter* Reporter::iInstance = KNull;

/**
Constructor: Reporter class
Initilize the parameters to data members.

@internalComponent
@released
*/
Reporter::Reporter(unsigned int aCmdOptions)
:iInputOptions(aCmdOptions)
{
}


/**
Destructor: Reporter class 
Release the objects. 

@internalComponent
@released
*/
Reporter::~Reporter()
{
	iImgVsExeStatus.clear();
}

/**
Function responsible to return the reference of iImgVsExeStatus

@internalComponent
@released

@return - returns the reference of iImgVsExeStatus
*/
ImgVsExeStatus& Reporter::GetContainerReference()
{
	return iImgVsExeStatus;
}


/**
Function responsible to create the report instances.

@internalComponent
@released

@param aReportType - report type either commandline or XML
@param aXmlFile - if XML then pass the xml filename

@return - return the new report instance created
*/
Reporter* Reporter::Instance(unsigned int aCmdOptions)
{
	if(iInstance == KNull)
	{
		iInstance = new Reporter(aCmdOptions);
		if(!iInstance)
		{
			throw ExceptionReporter(NOMEMORY, __FILE__, __LINE__);
		}
	}
	return iInstance;
}

/**
Function to delete the instance.

@internalComponent
@released
*/
void Reporter::DeleteInstance()
{
	DELETE(iInstance);
}


/**
Function responsible to create the report which is common for both the XML and command line output.

@internalComponent
@released

@param aWriterList - Container which stores the report objects
*/
void Reporter::CreateReport(const WriterPtrList& aWriterList)
{
	int wtrPtrLstCnt = aWriterList.size();
	int attrCnt=0;
	int serNo = 0;
	ReportWriter* rptWriter = KNull;

	// fetches the begin and end of the image and the related data from the integrated container
	ImgVsExeStatus::iterator imgBegin;
	ImgVsExeStatus::iterator imgEnd;

	ExeVsMetaData::iterator exeBegin;
	ExeVsMetaData::iterator exeEnd;
	
	if(IsAttributeAvailable())
	{
		while(wtrPtrLstCnt)
		{
			imgBegin = iImgVsExeStatus.begin();
			imgEnd = iImgVsExeStatus.end();

			rptWriter = aWriterList[wtrPtrLstCnt-1];
			ExceptionReporter(GENERATINGREPORT, (char*)rptWriter->ReportType().c_str()).Log();
			// starts the report
			rptWriter->StartReport();
			
			while(imgBegin != imgEnd)
			{
				// starts the image
				rptWriter->StartImage(imgBegin->first);

				// fetches the begin and end of the executable container
				ExeVsMetaData& exeAttStatus = imgBegin->second;
				exeBegin = exeAttStatus.begin();
				exeEnd = exeAttStatus.end();
				serNo = 1;
				while(exeBegin != exeEnd)
				{
					ExeAttList exeAttList = exeBegin->second.iExeAttList;
					attrCnt = exeAttList.size();
					if(attrCnt)
					{
						// starts the executable	
						rptWriter->StartExecutable(serNo, exeBegin->first);
					
						while(attrCnt)
						{
							// writes the attributes
							rptWriter->WriteExeAttribute(*exeAttList.front());
							if(wtrPtrLstCnt == 1)
							{
								DELETE(exeAttList.front()); //If no more reports to be generated, delete it
							}
							exeAttList.pop_front();
							--attrCnt;
						}
						// ends the executable
						rptWriter->EndExecutable();	
						++serNo;
					}
					++exeBegin;
				}
				++imgBegin;
				// ends the image
				rptWriter->EndImage();
			}
			rptWriter->WriteNote();
			// ends the report
			rptWriter->EndReport();
			--wtrPtrLstCnt;
		}
		ExceptionReporter(REPORTGENERATION,"Success").Log();
	}
	else
	{
		if(iInputOptions & KE32Input)
		{
			ExceptionReporter(VALIDE32INPUT).Report();
		}
		else
		{
			ExceptionReporter(VALIDIMAGE).Report();
		}
	}
}

/**
Function checks if the attributes are valid and are not blank.

@internalComponent
@released

*/
bool Reporter::IsAttributeAvailable()
{
	ImgVsExeStatus::iterator imgBegin = iImgVsExeStatus.begin();
	ImgVsExeStatus::iterator imgEnd = iImgVsExeStatus.end();

	ExeVsMetaData::iterator exeBegin;
	ExeVsMetaData::iterator exeEnd;

	while(imgBegin != imgEnd)
	{
		ExeVsMetaData& exeVsMetaData = imgBegin->second;

		exeBegin = exeVsMetaData.begin();
		exeEnd = exeVsMetaData.end();
		while(exeBegin != exeEnd)
		{
			if((exeBegin->second).iExeAttList.size() == 0)
			{
				++exeBegin;
				continue;
			}
			else
			{
				return true;
			}
			++exeBegin;
		}
		++imgBegin;
	}
	return false;
}