imgtools/imgcheck/src/cmdlinehandler.cpp
changeset 590 360bd6b35136
parent 0 044383f39525
--- a/imgtools/imgcheck/src/cmdlinehandler.cpp	Wed Jun 16 16:51:40 2010 +0300
+++ b/imgtools/imgcheck/src/cmdlinehandler.cpp	Wed Jun 23 16:56:47 2010 +0800
@@ -1,786 +1,688 @@
-/*
-* 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: 
-* Commandline handler for imgcheck Tool, responsible to parse the
-* commandline options and preserve the data for later use
-*
-*/
-
-
-/**
- @file
- @internalComponent
- @released
-*/
-
-#include "cmdlinehandler.h"
-
-/**
-Constructor initializes the iOptionMap with short and long option names as key and
-the value pair says whether the respective option can have value or not.
-
-@internalComponent
-@released
-*/
-CmdLineHandler::CmdLineHandler()
-:iDebuggableFlagVal(false),iXmlFileName(GXmlFileName), iNoImage(true), iCommmandFlag(0), iValidations(0), iSuppressions(0) 
-{
-	iOptionMap[KLongHelpOption] = ENone;
-	iOptionMap[KLongAllOption] = ENone;
-	iOptionMap[KLongXmlOption] = ENone;
-	iOptionMap[KLongOutputOption] = ESingle; //option can have only 1 value
-	iOptionMap[KLongQuietOption] = ENone;
-	iOptionMap[KLongVerboseOption] = ENone;
-	iOptionMap[KLongSuppressOption]= EMultiple; //This value should be updated, while introducing new validations
-	iOptionMap[KLongVidValOption]= EMultiple;
-	iOptionMap[KShortHelpOption] = ENone;
-	iOptionMap[KShortAllOption] = ENone;
-	iOptionMap[KShortXmlOption] = ENone;
-	iOptionMap[KShortOutputOption] = ESingle; //option can have only 1 value
-	iOptionMap[KShortQuietOption] = ENone;
-	iOptionMap[KShortVerboseOption] = ENone;
-	iOptionMap[KShortSuppressOption] = EMultiple;
-	iOptionMap[KShortNoCheck] = ENone;
-	iOptionMap[KLongSidAllOption] = ENone;
-	iOptionMap[KLongEnableDepCheck] = ENone;
-	iOptionMap[KLongEnableSidCheck] = ENone;
-	iOptionMap[KLongEnableVidCheck] = ENone;
-	iOptionMap[KLongEnableDbgFlagCheck] = EOptional;
-	iOptionMap[KLongE32InputOption] = ENone;
-	iOptionMap[KLongNoCheck] = ENone;
-	iSuppressVal[KSuppressDependency] = EDep;
-	iSuppressVal[KSuppressSid] = ESid;
-	iSuppressVal[KSuppressVid] = EVid;
-
-	Version();
-	Usage();
-}
-
-/**
-Destructor.
-
-@internalComponent
-@released
-*/
-CmdLineHandler::~CmdLineHandler()
-{
-	iOptionMap.clear();
-	iImageNameList.clear();
-	iSuppressVal.clear();
-	iVidValList.clear();
-}
-
-/**
-Function to parse the command line options.
-Responsible to
-1. Parse the input values.
-2. Print the usage note. 
-3. Identify the valdations to be carried out.
-4. Type of report needs to be generated.
-
-@internalComponent
-@released
-
-@param aArgc - argument count
-@param aArgv[] - argument values
-*/
-ReturnType CmdLineHandler::ProcessCommandLine(unsigned int aArgc, char* aArgv[])
-{
-	if(aArgc < 2)
-	{
-		std::cout << PrintVersion().c_str() << std::endl;
-		std::cout << PrintUsage().c_str() << std::endl;
-		return EQuit;
-	}
-	ArgumentList argumentList(&aArgv[0], aArgv + aArgc);
-	int argCount = argumentList.size();
-
-	 iInputCommand = KToolName;
-
-	for( int i = 1; i < argCount; i++ ) //Skip tool name
-	{
-		String name = argumentList.at(i);
-		iInputCommand += " ";
-		iInputCommand += name;
-		int longOptionFlag = 0;
-		if(IsOption(name, longOptionFlag))
-		{
-			String optionName;
-			bool optionValue = false;
-			StringList optionValueList;
-			ParseOption(name, optionName, optionValueList, optionValue);
-			char shortOption = KNull;
-			if(Validate(ReaderUtil::ToLower(optionName), optionValue, optionValueList.size()))
-			{
-				if(longOptionFlag)
-				{
-					shortOption = optionName.at(2);
-				}
-				else
-				{
-					shortOption = optionName.at(1);
-				}
-			}
-
-			switch(shortOption)
-			{
-				case 'q':
-					iCommmandFlag |= QuietMode;
-					break;
-				case 'a':
-					iCommmandFlag |= KAll;
-					break;
-				case 'x':
-					iCommmandFlag |= KXmlReport;
-					break;
-				case 'o':
-					iXmlFileName.assign(optionValueList.front());
-					NormaliseName();
-					break;
-				case 's':
-					if((optionName == KShortSuppressOption) || (optionName == KLongSuppressOption))
-					{
-						String value;
-						while(optionValueList.size() > 0)
-						{
-							value = optionValueList.front();
-							if(iSuppressVal[value])
-							{
-								if(iValidations > 0) //Is any check enabled?
-								{
-									if(iValidations & iSuppressVal[value])
-									{
-										iValidations ^= iSuppressVal[value]; //Consider only 3 LSB's
-									}
-								}
-								else //Is this valid value?
-								{
-									iSuppressions |= iSuppressVal[value];
-								}
-							}
-							else
-							{
-								throw ExceptionReporter(UNKNOWNSUPPRESSVAL,(char*)(optionValueList.front().c_str()));
-							}
-							optionValueList.pop_front();
-						}
-					}
-					else if(optionName == KLongEnableSidCheck)
-					{
-						iValidations |= KMarkEnable;
-						iValidations |= ESid;
-					}
-					else if(optionName == KLongSidAllOption)
-					{
-						iCommmandFlag |= KSidAll;
-					}
-					break;
-				case 'd':
-					if(optionName == KLongEnableDbgFlagCheck)
-					{
-						iValidations |= KMarkEnable;
-						iValidations |= EDbg;
-						if(optionValueList.size() > 0)
-						{
-							if(optionValueList.front() == String("true"))
-							{
-								iDebuggableFlagVal = true;
-							}
-							else if (optionValueList.front() == String("false"))
-							{
-								iDebuggableFlagVal = false; 
-							}
-							else
-							{
-								throw ExceptionReporter(UNKNOWNDBGVALUE);
-							}
-						}
-					}
-					else if (optionName == KLongEnableDepCheck)
-					{
-						iValidations |= KMarkEnable;
-						iValidations |= EDep;
-					}
-					break;
-
-				case 'e':
-					if (optionName == KLongE32InputOption)
-					{
-						iCommmandFlag |= KE32Input;
-					}
-					break;
-
-				case 'v':
-					if(optionName == KLongVidValOption)
-					{
-						StringListToUnIntList(optionValueList, iVidValList);
-					}
-					else if(optionName == KLongEnableVidCheck)
-					{
-						iValidations |= KMarkEnable;
-						iValidations |= EVid;
-					}
-					else
-					{
-						iCommmandFlag |= KVerbose;
-						/**Initialize ExceptionImplementation class with verbose mode flag
-						to print all status information to standard output*/
-						ExceptionImplementation::Instance(iCommmandFlag);
-					}
-					break;
-				case 'n':
-						iCommmandFlag |= KNoCheck;
-					break;
-				case 'h':
-					std::cout << PrintVersion().c_str() << std::endl;
-					std::cout << PrintUsage().c_str() << std::endl;
-					return EQuit; //Don't proceed further
-			}
-		}
-		else
-		{
-			if(!AlreadyReceived(name))
-			{
-				iImageNameList.push_back(name);
-			}
-			else
-			{
-				ExceptionReporter(IMAGENAMEALREADYRECEIVED, (char*)name.c_str()).Report();
-			}
-
-			iNoImage = false;
-		}
-	} //While loop ends here
-	if((iCommmandFlag || iValidations || iSuppressions) && iNoImage)
-	{
-		PrintVersion();
-		PrintUsage();
-	}
-	//Always log the version information into log file
-	ExceptionImplementation::Instance(iCommmandFlag)->Log(iVersion);
-	ValidateArguments();
-	ValidateE32NoCheckArguments();
-	if(iCommmandFlag & KE32Input)
-	{
-		ValidateImageNameList();
-	}
-	return ESuccess;
-}
-
-/**
-Function identify whether the passed string is an option or not.
-
-@internalComponent
-@released
-
-@param aName - a string received as part of command line
-@param aLongOptionFlag - this flag is set if the option is long else
-it is assumed as short option.
-
-@return - returns true or false
-*/
-bool CmdLineHandler::IsOption(const String& aName, int& aLongOptionFlag)
-{
-	unsigned int prefixCount = 0;
-	while(aName.at(prefixCount) == KShortOptionPrefix)
-	{
-		if(aName.length() == ++prefixCount)
-		{
-			throw ExceptionReporter(UNKNOWNOPTION, (char*)aName.c_str());
-		}
-	}
-
-	switch(prefixCount)
-	{
-		case 0: //argument can be an image
-			return false;
-		case 1: // '-'
-			return true;
-		case 2: // '--'
-			aLongOptionFlag = 1;
-			return true;
-		default:
-			throw ExceptionReporter(UNKNOWNPREFIX, (char*)aName.c_str());
-	}
-}
-
-/**
-Function to do syntax validation on the received option.
-1. Identifies whether the received option is valid or not.
-2. Identifies whether the option can have vaue or not.
-3. Throws an error if no value received for an option which should have value.
-4. Throws an error if more number of values received.
-5. Throws an error if an unwanted value received.
-6. Throws an error if the option is not a valid one.
-
-@internalComponent
-@released
-
-@param aOption - a string received as part of command line.
-@param aOptionValue - Whether option value received or not.
-@param aNoOfVal - Number of values received for this option.
-
-@return - returns true if it is a valid option
-*/
-bool CmdLineHandler::Validate(const String& aOption, bool aOptionValue, unsigned int aNoOfVal)
-{
-	if(iOptionMap.find(aOption) != iOptionMap.end())
-	{
-		if(iOptionMap[aOption]) //Option can have value?
-		{
-			if((aNoOfVal == ENone) && (iOptionMap[aOption] != EOptional)) //No values received?
-			{
-				throw ExceptionReporter(VALUEEXPECTED, (char*)aOption.c_str());
-			}
-			
-			if((iOptionMap[aOption] == ESingle) && (ESingle < aNoOfVal)) //Received values are more than expected
-			{
-				throw ExceptionReporter(UNEXPECTEDNUMBEROFVALUE,(char*)aOption.c_str());
-  			}
-		}
-		else
-		{
-			if(aOptionValue) //Is option value received? Any character after the option considered as value.
-			{
-				throw ExceptionReporter(VALUENOTEXPECTED, (char*)aOption.c_str());
-			}
-		}
-		return true;
-	}
-	throw ExceptionReporter(UNKNOWNOPTION, (char*)aOption.c_str());
-}
-
-/**
-Function to split the option name and option values.
-1. Ignore's the '=' symbol which is following the option. But this is an error, if that
-option does not expecting any value.
-2. Parses the value received with options.
-
-@internalComponent
-@released
-
-@param aFullName - Option with its value
-@param aOptionName - Option name put into this parameter
-@param aOptionValues - Option values put into this parameter
-@param aOptionValue - Set this flag if any value received with the option.
-*/
-void CmdLineHandler::ParseOption(const String& aFullName, String& aOptionName, StringList& aOptionValues, bool& aOptionValue)
-{
-	unsigned int optionEndLocation = aFullName.find("=");
-	if(optionEndLocation != String::npos)
-	{
-		aOptionValue = true;
-		aOptionName = aFullName.substr(0, optionEndLocation++);
-		if(aFullName.length() == optionEndLocation)
-		{
-			throw ExceptionReporter(VALUEEXPECTED, (char*)aOptionName.c_str());
-		}
-		String sub = aFullName.substr(optionEndLocation);
-		char* optionValues = (char*)sub.c_str();
-		//Get all the values; use (,) as delimiter
-		char* value = strtok(optionValues,",");
-		while(value != KNull)
-		{
-			String str(value);
-			aOptionValues.push_back(ReaderUtil::ToLower(str));
-			value = strtok(KNull,",");
-		}
-		return;
-	}
-	aOptionName = aFullName;
-}
-
-/**
-Function to initialize the usage.
-
-@internalComponent
-@released
-*/
-void CmdLineHandler::Usage(void)
-{
-    iUsage.assign("imgcheck [options] <img1> [<img2 .. imgN>] \n"
-		"imgcheck --e32input [options] (<file> | <directory>) \n"
-        "\n"
-        "options: \n"
-		"  -a, --all,             Report all executable's status\n"
-	    "  -q, --quiet,           Command line display off\n"
-	    "  -x, --xml,             Generate XML report\n"
-        "  -o=xxx, --output=xxx   Override default XML file name\n"
-		"  -v, --verbose,         Verbose mode output\n"
-		"  -h, --help,            Display this message\n"
-		"  -s=val1[,val2][...], --suppress=val1[,val2][...] \n"
-		"                         Suppress one or more check,\n"
-		"                         Possible values are dep, sid and vid\n"
-        "  --vidlist=val1[,val2][...] \n"
-		"                         One or more VID value(s) \n"
-        "  --dep                  Enable dependency check\n"
-        "  --vid                  Enable VID check\n"
-        "  --sid                  Enable SID check, only EXEs are considered by default\n"
-		"  --sidall               Include DLL also into SID check\n"
-		"  --dbg[=val]            Enable Debug flag check,\n"
-		"                         Optionally over ride the default value 'false'\n"
-		"  --e32input             Switches the tool to filesystem mode\n"
-		"  -n, --nocheck          Don't report any check(s) status\n");
-}
-
-/**
-Function to return the usage.
-
-@internalComponent
-@released
-*/
-const String& CmdLineHandler::PrintUsage(void) const
-{
-	return iUsage;
-}
-
-/**
-Function to prepare the version information.
-
-@internalComponent
-@released
-*/
-void CmdLineHandler::Version(void)
-{
-	iVersion.append(gToolDesc);
-	iVersion.append(gMajorVersion);
-	iVersion.append(gMinorVersion);
-	iVersion.append(gMaintenanceVersion);
-	iVersion.append(gCopyright);
-}
-
-/**
-Function to return the version information.
-
-@internalComponent
-@released
-*/
-const String& CmdLineHandler::PrintVersion(void) const
-{
-	return iVersion;
-}
-
-/**
-Function to return the image name one by one.
-
-@internalComponent
-@released
-
-@return - returns image name
-*/
-String CmdLineHandler::NextImageName(void)
-{
-	String imageName = iImageNameList.front();
-	iImageNameList.pop_front();
-	return imageName;
-}
-
-/**
-Function to return the iCommmandFlag.
-
-@internalComponent
-@released
-
-@return - returns iCommmandFlag value.
-*/
-const unsigned int CmdLineHandler::ReportFlag(void) const
-{
-	return iCommmandFlag;
-}
-
-/**
-Function to return the iXmlFileName.
-
-@internalComponent
-@released
-
-@return - returns iXmlFileName value.
-*/
-const String& CmdLineHandler::XmlReportName(void) const
-{
-	return iXmlFileName;
-}
-
-
-/**
-Function to append the XML extension to the received XML name.
-
-@internalComponent
-@released
-*/
-void CmdLineHandler::NormaliseName(void)
-{
-	if (iXmlFileName.find(KXmlExtension) == String::npos)
-	{
-		iXmlFileName.append(KXmlExtension);
-	}
-}
-
-/**
-Function to validate the arguements to ensure that the tool is invoked with proper
-arguments.
-
-@internalComponent
-@released
-*/
-void CmdLineHandler::ValidateArguments(void) const
-{
-	unsigned int validations = EnabledValidations();
-	validations = (validations & KMarkEnable) ? iValidations ^ KMarkEnable:validations; //disable MSB
-
-	if( iCommmandFlag & QuietMode && !(iCommmandFlag & KXmlReport))
-	{
-		throw ExceptionReporter(QUIETMODESELECTED);
-	}
-
-	if(!(iCommmandFlag & KXmlReport) && (iXmlFileName != GXmlFileName))
-	{
-		ExceptionReporter(XMLOPTION).Report();
-	}
-
-	if((iVidValList.size() > 0) && (validations & EVid) == 0)
-	{
-		ExceptionReporter(SUPPRESSCOMBINEDWITHVIDVAL).Report();
-	}
-
-	if((iCommmandFlag & KSidAll) && ((validations & ESid)==0))
-	{
-		ExceptionReporter(SIDALLCOMBINEDWITHSID).Report();
-	}
-
-	if( validations == ENone)
-	{
-		throw ExceptionReporter(ALLCHECKSSUPPRESSED);
-	}
-	
-	if(iNoImage)
-	{
-		throw ExceptionReporter(NOIMAGE);
-	}
-}
-
-/**
-Function to return number of images received through command line.
-
-@internalComponent
-@released
-*/
-unsigned int CmdLineHandler::NoOfImages(void) const
-{
-	return iImageNameList.size();
-}
-
-/**
-Function to return Validations needs to be performed.
-1. If any validation is enabled, then only enabled validations are carried.
-2. If any validation is suppressed, then all validations are carried execept the suppressed ones.
-
-@internalComponent
-@released
-
-@return - returns the enabled Validations
-*/
-const unsigned int CmdLineHandler::EnabledValidations(void) const
-{
-	if(iValidations > 0)
-	{
-		return iValidations;
-	}
-	return (iSuppressions ^ EAllValidation); //Enable unsuppressed options
-}
-
-/**
-Function to convert strings to integers.
-1. If any validation is enabled, then only enabled validations are carried.
-2. If any validation is suppressed, then all validations are carried execept the suppressed ones.
-3. Throws an error if the value is not a decimal or hexadecimal one.
-
-@internalComponent
-@released
-
-@param aStrList - List VID values received at command line
-@param aUnIntList - Received values are validated and put into this container.
-*/
-void CmdLineHandler::StringListToUnIntList(StringList& aStrList, UnIntList& aUnIntList)
-{
-    String tempString;
-	Long64 intValue = 0;
-    while(aStrList.size() > 0)
-    {
-		tempString = aStrList.front();
-		if(tempString.length() >= 2) //Hex number should start with '0x'
-		{
-			//is this an Hexadecimal number?
-			if((tempString.at(0) == '0') && (tempString.at(1) == 'x'))
-			{
-				tempString = tempString.substr(2);
-				unsigned int location = 0;
-				if(!tempString.empty())
-				{
-					while(location < tempString.length()) //Ignore proceeding zeros.
-					{
-						if(tempString.at(location) == '0')
-						{
-							location++; 
-							continue;
-						}
-						break;
-					}
-				}
-				else
-				{
-					throw ExceptionReporter(INVALIDVIDVALUE,(char*)aStrList.front().c_str());
-				}
-				tempString = tempString.substr(location);
-				if(tempString.empty() && location != 0)
-				{
-					tempString = '0';
-				}
-				unsigned int strLength = tempString.length();
-				if(strLength <= KHexEightByte && strLength > 0)
-				{
-					if(tempString.find_first_not_of(KHexNumber) == String::npos)
-					{
-						aUnIntList.push_back(ReaderUtil::HexStrToInt(tempString));
-						aStrList.pop_front();
-						continue;
-					}
-				}
-				else
-				{
-					throw ExceptionReporter(DATAOVERFLOW,(char*)tempString.c_str());
-				}
-			}
-		}
-		//is this an Decimal number?
-		if(tempString.find_first_not_of(KDecNumber) == String::npos)
-		{
-			intValue = ReaderUtil::DecStrToInt(tempString);
-			if(intValue <= KDecHighValue)
-			{
-				aUnIntList.push_back(intValue);
-			}
-			else
-			{
-				throw ExceptionReporter(DATAOVERFLOW,(char*)tempString.c_str());
-			}
-		}
-		else
-		{
-			throw ExceptionReporter(INVALIDVIDVALUE,(char*)tempString.c_str());
-		}
-		aStrList.pop_front();
-    }
-}
-
-
-
-/**
-Function to return vid value list.
-
-@internalComponent
-@released
-
-@return - returns vid value list.
-*/
-UnIntList& CmdLineHandler::VidValueList()
-{
-	return iVidValList;
-}
-
-/**
-Function to return input command string.
-
-@internalComponent
-@released
-
-@return - returns iInputCommand.
-*/
-const String& CmdLineHandler::Command() const
-{
-	return iInputCommand;
-}
-
-/**
-Function identifies whether the image is already received or not.
-
-@internalComponent
-@released
-
-@return	- returns true if the image is already received.
-		- returns false if the image is not received already.
-*/
-bool CmdLineHandler::AlreadyReceived(String& aName)
-{
-	StringList::iterator nameBegin = iImageNameList.begin();
-	StringList::iterator nameEnd = iImageNameList.end();
-	while(nameBegin != nameEnd)
-	{
-		if(aName == *nameBegin)
-		{
-			return true;
-		}
-		++nameBegin;
-	}
-	return false;
-}
-
-/**
-Function to return debug flag value.
-
-@internalComponent
-@released
-
-@return - returns iDebuggableFlagVal.
-*/
-bool CmdLineHandler::DebuggableFlagVal()
-{
-	return iDebuggableFlagVal;
-}
-
-/**
-Function to validate the e32 input.
-
-@internalComponent
-@released
-
-*/
-void CmdLineHandler::ValidateImageNameList(void) 
-{
-	if(iImageNameList.size() > 1)
-	{
-		throw ExceptionReporter(ONLYSINGLEDIRECTORYEXPECTED);
-	}
-}
-
-
-/**
-Function to validate the e32 and no check option arguments.
-
-@internalComponent
-@released
-
-*/
-void CmdLineHandler::ValidateE32NoCheckArguments(void)
-{
-	if((iCommmandFlag & KE32Input) && !iValidations)
-	{
-		throw ExceptionReporter(NOVALIDATIONSENABLED);
-	}
-
-	if((iCommmandFlag & KE32Input) && (iValidations & (EDep | ESid)))
-	{
-		ExceptionReporter(INCORRECTVALUES).Report();
-	}
-}
+/*
+* 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: 
+* Commandline handler for imgcheck Tool, responsible to parse the
+* commandline options and preserve the data for later use
+*
+*/
+
+
+/**
+@file
+@internalComponent
+@released
+*/
+
+#include "cmdlinehandler.h"
+
+/**
+Constructor initializes the iOptionMap with short and long option names as key and
+the value pair says whether the respective option can have value or not.
+
+@internalComponent
+@released
+*/
+CmdLineHandler::CmdLineHandler()
+:iDebuggableFlagVal(false),iXmlFileName(GXmlFileName), iNoImage(true), iCommmandFlag(0), iValidations(0), iSuppressions(0)  {
+	iOptionMap[KLongHelpOption] = ENone;
+	iOptionMap[KLongAllOption] = ENone;
+	iOptionMap[KLongXmlOption] = ENone;
+	iOptionMap[KLongOutputOption] = ESingle; //option can have only 1 value
+	iOptionMap[KLongQuietOption] = ENone;
+	iOptionMap[KLongVerboseOption] = ENone;
+	iOptionMap[KLongSuppressOption]= EMultiple; //This value should be updated, while introducing new validations
+	iOptionMap[KLongVidValOption]= EMultiple;
+	iOptionMap[KShortHelpOption] = ENone;
+	iOptionMap[KShortAllOption] = ENone;
+	iOptionMap[KShortXmlOption] = ENone;
+	iOptionMap[KShortOutputOption] = ESingle; //option can have only 1 value
+	iOptionMap[KShortQuietOption] = ENone;
+	iOptionMap[KShortVerboseOption] = ENone;
+	iOptionMap[KShortSuppressOption] = EMultiple;
+	iOptionMap[KShortNoCheck] = ENone;
+	iOptionMap[KLongSidAllOption] = ENone;
+	iOptionMap[KLongEnableDepCheck] = ENone;
+	iOptionMap[KLongEnableSidCheck] = ENone;
+	iOptionMap[KLongEnableVidCheck] = ENone;
+	iOptionMap[KLongEnableDbgFlagCheck] = EOptional;
+	iOptionMap[KLongE32InputOption] = ENone;
+	iOptionMap[KLongNoCheck] = ENone;
+	iSuppressVal[KSuppressDependency] = EDep;
+	iSuppressVal[KSuppressSid] = ESid;
+	iSuppressVal[KSuppressVid] = EVid;
+
+	Version();
+	Usage();
+}
+
+/**
+Destructor.
+
+@internalComponent
+@released
+*/
+CmdLineHandler::~CmdLineHandler() {
+	iOptionMap.clear();
+	iImageNameList.clear();
+	iSuppressVal.clear();
+	iVidValList.clear();
+}
+
+/**
+Function to parse the command line options.
+Responsible to
+1. Parse the input values.
+2. Print the usage note. 
+3. Identify the valdations to be carried out.
+4. Type of report needs to be generated.
+
+@internalComponent
+@released
+
+@param aArgc - argument count
+@param aArgv[] - argument values
+*/
+ReturnType CmdLineHandler::ProcessCommandLine(unsigned int aArgc, char* aArgv[]) {
+	if(aArgc < 2) {
+		cout << PrintVersion().c_str() << endl;
+		cout << PrintUsage().c_str() << endl;
+		return EQuit;
+	}
+	//ArgumentList argumentList(&aArgv[0], aArgv + aArgc);
+	//int argCount = argumentList.size();
+
+	iInputCommand = KToolName;
+
+	for(unsigned int i = 1; i < aArgc; i++ )  {//Skip tool name		 
+		iInputCommand.append(1,' ');
+		char* arg = aArgv[i];
+		iInputCommand.append(arg);
+		int longOptionFlag = 0;
+		if(IsOption(arg, longOptionFlag)) { 
+			bool optionValue = false;
+			cstrings optionValueList;
+			ParseOption(arg, optionValueList, optionValue);
+			string optionName(arg) ;
+			ReaderUtil::ToLower(optionName);
+			char shortOption = 0;
+			if(Validate(optionName, optionValue, optionValueList.size())) {
+				if(longOptionFlag) {
+					shortOption = optionName.at(2);
+				}
+				else {
+					shortOption = optionName.at(1);
+				}
+			}
+
+			switch(shortOption) {
+				case 'q':
+					iCommmandFlag |= QuietMode;
+					break;
+				case 'a': 
+					iCommmandFlag |= KAll;
+					break;
+				case 'x':
+					iCommmandFlag |= KXmlReport;
+					break;
+				case 'o':
+					iXmlFileName = string(optionValueList.front()); 
+					NormaliseName();
+					break;
+				case 's':
+					if((optionName == KShortSuppressOption) || (optionName == KLongSuppressOption)) {
+						int size = optionValueList.size();
+						for(int idx = 0 ; idx < size ; idx++) {
+							string value(optionValueList.at(idx));
+							SuppressionsMap::iterator it = iSuppressVal.find(value);
+							if(it != iSuppressVal.end()) {
+								if(iValidations > 0) { //Is any check enabled? 
+									if(iValidations & it->second) {
+										iValidations ^= it->second; //Consider only 3 LSB's
+									}
+								}
+								else {//Is this valid value? 
+									iSuppressions |= it->second;
+								}
+							}
+							else {
+								throw ExceptionReporter(UNKNOWNSUPPRESSVAL,optionValueList.at(idx));
+							} 
+						}
+						optionValueList.clear();
+					}
+					else if(optionName == KLongEnableSidCheck) {
+						iValidations |= KMarkEnable;
+						iValidations |= ESid;
+					}
+					else if(optionName == KLongSidAllOption) {
+						iCommmandFlag |= KSidAll;
+					}
+					break;
+				case 'd':
+					if(optionName == KLongEnableDbgFlagCheck) {
+						iValidations |= KMarkEnable;
+						iValidations |= EDbg;
+						if(optionValueList.size() > 0) {
+							if(strcmp(optionValueList.front(),"true") == 0) {
+								iDebuggableFlagVal = true;
+							}
+							else if (strcmp(optionValueList.front(),"false") == 0) {
+								iDebuggableFlagVal = false; 
+							}
+							else {
+								throw ExceptionReporter(UNKNOWNDBGVALUE);
+							}
+						}
+					}
+					else if (optionName == KLongEnableDepCheck) {
+						iValidations |= KMarkEnable;
+						iValidations |= EDep;
+					}
+					break;
+
+				case 'e':
+					if (optionName == KLongE32InputOption) {
+						iCommmandFlag |= KE32Input;
+					}
+					break;
+
+				case 'v':
+					if(optionName == KLongVidValOption) {
+						StringListToUnIntList(optionValueList, iVidValList);
+					}
+					else if(optionName == KLongEnableVidCheck) {
+						iValidations |= KMarkEnable;
+						iValidations |= EVid;
+					}
+					else {
+						iCommmandFlag |= KVerbose;
+						/**Initialize ExceptionImplementation class with verbose mode flag
+						to print all status information to standard output*/
+						ExceptionImplementation::Instance(iCommmandFlag);
+					}
+					break;
+				case 'n':
+					iCommmandFlag |= KNoCheck;
+					break;
+				case 'h':
+					cout << PrintVersion().c_str() << endl;
+					cout << PrintUsage().c_str() << endl;
+					return EQuit; //Don't proceed further
+			}
+		}
+		else {
+			if(!AlreadyReceived(arg)) {
+				iImageNameList.push_back(arg);
+			}
+			else {
+				ExceptionReporter(IMAGENAMEALREADYRECEIVED, arg).Report();
+			}
+
+			iNoImage = false;
+		}
+	} //While loop ends here
+	if((iCommmandFlag || iValidations || iSuppressions) && iNoImage) {
+		PrintVersion();
+		PrintUsage();
+	}
+	//Always log the version information into log file
+	ExceptionImplementation::Instance(iCommmandFlag)->Log(iVersion);
+	ValidateArguments();
+	ValidateE32NoCheckArguments();
+	if(iCommmandFlag & KE32Input) {
+		ValidateImageNameList();
+	}
+	return ESuccess;
+}
+
+/**
+Function identify whether the passed string is an option or not.
+
+@internalComponent
+@released
+
+@param aName - a string received as part of command line
+@param aLongOptionFlag - this flag is set if the option is long else
+it is assumed as short option.
+
+@return - returns true or false
+*/
+bool CmdLineHandler::IsOption(const char* aName, int& aLongOptionFlag) {
+	int prefixCount = 0;
+	int len = strlen(aName);
+	while(aName[prefixCount] == KShortOptionPrefix) {
+		if(len == ++prefixCount) {
+			throw ExceptionReporter(UNKNOWNOPTION, aName);
+		}
+	}
+
+	switch(prefixCount) {
+		case 0: //argument can be an image
+			return false;
+		case 1: // '-'
+			return true;
+		case 2: // '--'
+			aLongOptionFlag = 1;
+			return true;
+		default:
+			throw ExceptionReporter(UNKNOWNPREFIX, aName);
+	}
+}
+
+/**
+Function to do syntax validation on the received option.
+1. Identifies whether the received option is valid or not.
+2. Identifies whether the option can have vaue or not.
+3. Throws an error if no value received for an option which should have value.
+4. Throws an error if more number of values received.
+5. Throws an error if an unwanted value received.
+6. Throws an error if the option is not a valid one.
+
+@internalComponent
+@released
+
+@param aOption - a string received as part of command line.
+@param aOptionValue - Whether option value received or not.
+@param aNoOfVal - Number of values received for this option.
+
+@return - returns true if it is a valid option
+*/
+bool CmdLineHandler::Validate(const string& aOption, bool aOptionValue, unsigned int aNoOfVal) {
+	if(iOptionMap.find(aOption) != iOptionMap.end()) {
+		if(iOptionMap[aOption]) {//Option can have value? 
+			if((aNoOfVal == ENone) && (iOptionMap[aOption] != EOptional)) {//No values received? 
+				throw ExceptionReporter(VALUEEXPECTED, aOption.c_str());
+			}
+
+			if((iOptionMap[aOption] == ESingle) && (ESingle < aNoOfVal)){ //Received values are more than expected 
+				throw ExceptionReporter(UNEXPECTEDNUMBEROFVALUE,aOption.c_str());
+			}
+		}
+		else {
+			if(aOptionValue) {//Is option value received? Any character after the option considered as value. 
+				throw ExceptionReporter(VALUENOTEXPECTED, aOption.c_str());
+			}
+		}
+		return true;
+	}
+	throw ExceptionReporter(UNKNOWNOPTION, aOption.c_str());
+}
+
+/**
+Function to split the option name and option values.
+1. Ignore's the '=' symbol which is following the option. But this is an error, if that
+option does not expecting any value.
+2. Parses the value received with options.
+
+@internalComponent
+@released
+
+@param aFullName - Option with its value 
+@param aOptionValues - Option values put into this parameter
+@param aOptionValue - Set this flag if any value received with the option.
+*/
+void CmdLineHandler::ParseOption(char* aFullName, cstrings& aOptionValues, bool& aOptionValue) { 
+	//unsigned int optionEndLocation = aFullName.find('='); 
+	char* p = strchr(aFullName,'=');
+	if(NULL != p) {
+		aOptionValue = true;
+		*p = 0 ;
+		p++ ;
+		if(0 == *p) {
+			throw ExceptionReporter(VALUEEXPECTED, aFullName);
+		}		 
+		 
+		//Get all the values; use (,) as delimiter
+		char* start = p , *stop = p ; 
+		bool cont = true ;
+		while(cont){
+			while(*stop != ',' && *stop != 0)
+				stop ++;	
+			cont = (0 != *stop) ;
+			if(stop > start){  
+				*stop = 0 ;
+				aOptionValues.push_back(start); 
+				
+			}			 
+			start = stop + 1;
+			stop = start ;
+		}  
+	} 
+}
+
+/**
+Function to initialize the usage.
+
+@internalComponent
+@released
+*/
+void CmdLineHandler::Usage(void) {
+	iUsage.assign("syntax: imgcheck [options] <img1> [<img2 .. imgN>] \n"
+		"imgcheck --e32input [options] (<file> | <directory>) \n"
+		"\n"
+		"options: \n"
+		"  -a, --all,             Report all executable's status\n"
+		"  -q, --quiet,           Command line display off\n"
+		"  -x, --xml,             Generate XML report\n"
+		"  -o=xxx, --output=xxx   Override default XML file name\n"
+		"  -v, --verbose,         Verbose mode output\n"
+		"  -h, --help,            Display this message\n"
+		"  -s=val1[,val2][...], --suppress=val1[,val2][...] \n"
+		"                         Suppress one or more check,\n"
+		"                         Possible values are dep, sid and vid\n"
+		"  --vidlist=val1[,val2][...] \n"
+		"                         One or more VID value(s) \n"
+		"  --dep                  Enable dependency check\n"
+		"  --vid                  Enable VID check\n"
+		"  --sid                  Enable SID check, only EXEs are considered by default\n"
+		"  --sidall               Include DLL also into SID check\n"
+		"  --dbg[=val]            Enable Debug flag check,\n"
+		"                         Optionally over ride the default value 'false'\n"
+		"  --e32input             Switches the tool to filesystem mode\n"
+		"  -n, --nocheck          Don't report any check(s) status\n");
+}
+
+/**
+Function to return the usage.
+
+@internalComponent
+@released
+*/
+const string& CmdLineHandler::PrintUsage(void) const {
+	return iUsage;
+}
+
+/**
+Function to prepare the version information.
+
+@internalComponent
+@released
+*/
+void CmdLineHandler::Version(void) {
+	iVersion.append(gToolDesc);
+	iVersion.append(gMajorVersion);
+	iVersion.append(gMinorVersion);
+	iVersion.append(gMaintenanceVersion);
+	iVersion.append(gCopyright);
+}
+
+/**
+Function to return the version information.
+
+@internalComponent
+@released
+*/
+const string& CmdLineHandler::PrintVersion(void) const {
+	return iVersion;
+}
+
+/**
+Function to return the image name one by one.
+
+@internalComponent
+@released
+
+@return - returns image name
+*/
+const char* CmdLineHandler::NextImageName(void) {
+	const char* imageName = 0 ;
+	if( iImageNameList.size() > 0 ) {
+		imageName = iImageNameList.at(0);
+		iImageNameList.erase(iImageNameList.begin());
+	}
+	return imageName;
+}
+
+/**
+Function to return the iCommmandFlag.
+
+@internalComponent
+@released
+
+@return - returns iCommmandFlag value.
+*/
+const unsigned int CmdLineHandler::ReportFlag(void) const {
+	return iCommmandFlag;
+}
+
+/**
+Function to return the iXmlFileName.
+
+@internalComponent
+@released
+
+@return - returns iXmlFileName value.
+*/
+const string& CmdLineHandler::XmlReportName(void) const {
+	return iXmlFileName;
+}
+
+
+/**
+Function to append the XML extension to the received XML name.
+
+@internalComponent
+@released
+*/
+void CmdLineHandler::NormaliseName(void) {
+	if (iXmlFileName.find(KXmlExtension) == string::npos) {
+		iXmlFileName.append(KXmlExtension);
+	}
+}
+
+/**
+Function to validate the arguements to ensure that the tool is invoked with proper
+arguments.
+
+@internalComponent
+@released
+*/
+void CmdLineHandler::ValidateArguments(void) const {
+	unsigned int validations = EnabledValidations();
+	validations = (validations & KMarkEnable) ? iValidations ^ KMarkEnable:validations; //disable MSB
+
+	if( iCommmandFlag & QuietMode && !(iCommmandFlag & KXmlReport)) {
+		throw ExceptionReporter(QUIETMODESELECTED);
+	}
+
+	if(!(iCommmandFlag & KXmlReport) && (iXmlFileName != GXmlFileName)) {
+		ExceptionReporter(XMLOPTION).Report();
+	}
+
+	if((iVidValList.size() > 0) && (validations & EVid) == 0) {
+		ExceptionReporter(SUPPRESSCOMBINEDWITHVIDVAL).Report();
+	}
+
+	if((iCommmandFlag & KSidAll) && ((validations & ESid)==0)) {
+		ExceptionReporter(SIDALLCOMBINEDWITHSID).Report();
+	}
+
+	if( validations == ENone) {
+		throw ExceptionReporter(ALLCHECKSSUPPRESSED);
+	}
+
+	if(iNoImage) {
+		throw ExceptionReporter(NOIMAGE);
+	}
+}
+
+/**
+Function to return number of images received through command line.
+
+@internalComponent
+@released
+*/
+unsigned int CmdLineHandler::NoOfImages(void) const {
+	return iImageNameList.size();
+}
+
+/**
+Function to return Validations needs to be performed.
+1. If any validation is enabled, then only enabled validations are carried.
+2. If any validation is suppressed, then all validations are carried execept the suppressed ones.
+
+@internalComponent
+@released
+
+@return - returns the enabled Validations
+*/
+const unsigned int CmdLineHandler::EnabledValidations(void) const {
+	if(iValidations > 0) {
+		return iValidations;
+	}
+	return (iSuppressions ^ EAllValidation); //Enable unsuppressed options
+}
+static int indexOf(const char* str, char ch){ 
+	for(int i = 0 ; str[i] != 0 ; i++){
+		if(str[i] == ch) 
+			return i ;
+	}
+	return -1 ;
+}
+/**
+Function to convert cstrings to integers.
+1. If any validation is enabled, then only enabled validations are carried.
+2. If any validation is suppressed, then all validations are carried execept the suppressed ones.
+3. Throws an error if the value is not a decimal or hexadecimal one.
+
+@internalComponent
+@released
+
+@param aStrList - List VID values received at command line
+@param aUnIntList - Received values are validated and put into this container.
+*/
+void CmdLineHandler::StringListToUnIntList(cstrings& aStrList, UnIntList& aUnIntList) { 
+	int size = aStrList.size();
+	for(int i = 0 ; i < size ; i++ ) {
+		const char* arg = aStrList.at(i); 
+		unsigned int val = 0 ;
+		if('0' == arg[0]  && 'x' == (arg[1] | 0x20)){ // hex
+			arg += 2; 		
+			const char* savedStr = arg ;
+			int index;			
+			while(*arg){ 
+				if(val > 0x0fffffff)
+					throw ExceptionReporter(DATAOVERFLOW,savedStr);
+				index = indexOf(KHexNumber,*arg);
+				if(-1 == index)
+					throw ExceptionReporter(INVALIDVIDVALUE,savedStr);
+				val <<= 4 ;
+				val += index ;
+				arg ++ ;
+			}
+		}else{ // dec
+			const char* savedStr = arg ;
+			int index;
+			while(*arg){ 
+				if(val >= 0x1999999A) // 0xffffffff / 10
+					throw ExceptionReporter(DATAOVERFLOW,savedStr);
+				index = indexOf(KDecNumber,*arg);
+				if(-1 == index)
+					throw ExceptionReporter(INVALIDVIDVALUE,savedStr);
+				val *= 10 ;
+				val += index ;
+				arg ++ ;
+			}
+		}		
+		aUnIntList.push_back(val);	 
+	}
+	aStrList.clear();
+}
+
+
+
+/**
+Function to return vid value list.
+
+@internalComponent
+@released
+
+@return - returns vid value list.
+*/
+UnIntList& CmdLineHandler::VidValueList() {
+	return iVidValList;
+}
+
+/**
+Function to return input command string.
+
+@internalComponent
+@released
+
+@return - returns iInputCommand.
+*/
+const string& CmdLineHandler::Command() const {
+	return iInputCommand;
+}
+
+/**
+Function identifies whether the image is already received or not.
+
+@internalComponent
+@released
+
+@return	- returns true if the image is already received.
+- returns false if the image is not received already.
+*/
+bool CmdLineHandler::AlreadyReceived(const char* aName) {
+	for(cstrings::iterator it = iImageNameList.begin(); it != iImageNameList.end();it++) {
+		if(aName == *it || strcmp(aName,*it) == 0) {
+			return true;
+		} 
+	}
+	return false;
+}
+
+/**
+Function to return debug flag value.
+
+@internalComponent
+@released
+
+@return - returns iDebuggableFlagVal.
+*/
+bool CmdLineHandler::DebuggableFlagVal() {
+	return iDebuggableFlagVal;
+}
+
+/**
+Function to validate the e32 input.
+
+@internalComponent
+@released
+
+*/
+void CmdLineHandler::ValidateImageNameList(void)  {
+	if(iImageNameList.size() > 1) {
+		throw ExceptionReporter(ONLYSINGLEDIRECTORYEXPECTED);
+	}
+}
+
+
+/**
+Function to validate the e32 and no check option arguments.
+
+@internalComponent
+@released
+
+*/
+void CmdLineHandler::ValidateE32NoCheckArguments(void) {
+	if((iCommmandFlag & KE32Input) && !iValidations) {
+		throw ExceptionReporter(NOVALIDATIONSENABLED);
+	}
+
+	if((iCommmandFlag & KE32Input) && (iValidations & (EDep | ESid))) {
+		ExceptionReporter(INCORRECTVALUES).Report();
+	}
+}