secureswitools/swianalysistoolkit/source/chainvalidityandinstallfilestatustools/dumpinstallfilestatustool/options.cpp
changeset 0 ba25891c3a9e
child 25 7333d7932ef7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/secureswitools/swianalysistoolkit/source/chainvalidityandinstallfilestatustools/dumpinstallfilestatustool/options.cpp	Thu Dec 17 08:51:10 2009 +0200
@@ -0,0 +1,279 @@
+/*
+* Copyright (c) 2005-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: 
+*
+*/
+
+
+#include "options.h"
+#include "openssllicense.h"
+#include "capabilities.h"
+using namespace std;
+
+/**
+ * Command Line Exception Messages
+ */
+
+void Options::DisplayError (const Exceptions& aErr)
+	{
+	const char* msg;
+	switch (aErr)
+		{
+		case EUnknownOption:
+			msg = "Unknown option specified";
+			DisplayUsage ();
+			break;
+		case EMissingDATFile:
+			msg = "Dat file input not specified ";
+			DisplayUsage ();
+			break;
+		case ESupportingExeError:
+			msg = "Unable to execute supporting executable";
+			break;
+		case EMissingSISFile:
+			msg = "SIS file input not specified ";
+			DisplayUsage ();
+			break;
+		case EUnableToOpenFile:
+			msg = "Unable to open file ";
+			break;
+		case ECorruptCCIFile:
+			msg = "File containing signing chain information is corrupted " ;
+			break;
+		case EErrorExecutingSupportingExeDumpsis:
+			msg = "Error while executing supporting \nexecutable dumpsis.exe";
+			break;
+		case EErrorExecutingSupportingExeSignsis:
+			msg = "Error while executing supporting \nexecutable signsis.exe";
+			break;
+		case EErrorExecutingSupportingDumpSwiCertstoreExe:
+			msg = "Error while executing supporting \nexecutable dumpswicertstore.exe";
+			break;
+		case ENotADerBitString:
+			msg = "Error reading a DER encoded ASN.1 Bit String Type .";
+			break;
+		case ENotADerSequence:
+			msg = "Error reading a DER Encoded ASN.1 Sequence Type." ;
+			break;
+		case ENotADerInteger:
+			msg = "Error reading a DER Encoded ASN.1 Integer Type." ;
+			break;
+		case ENotADerUtf8String:
+			msg = "Error reading a DER Encoded ASN.1 UTF8 String." ;
+			break;
+		default:
+			msg = "Unknown error";
+			break;
+		}
+	cerr << CommandName () << ": Error in command: " << msg << endl;
+	}
+
+
+void Options::DisplayVersion() const
+	{
+	cout << "\nDumpInstallFileStatus Utility   Version " << KMajorVersion << '.' \
+		<< setw(2) << KMinorVersion << setfill('0') <<  "\nCopyright (c) 2005-2006 Symbian Software Limited . All rights reserved.\n\n" << flush;
+	}
+
+void Options::DisplayUsage()
+	{
+	cout <<"Usage:DumpInstallFileStatusTool [-v][-h][-i] SISFile DATFile Directory Capabilities \n\n" \
+				" -v		Specifies the version of the tool. \n" \
+				" -h		Prints the help message. \n"  \
+				" -i        Output licence information \n" \
+				" SISFile	Signed SIS File.\n" \
+				" DATFile	ROM Based SWICertstore.dat.OPTIONAL, if Directory is specified.\n"  \
+				" Directory	Writable SWICertstore.OPTIONAL,if swicertstore.dat is specified.\n" \
+				" Capabilities	List of capabilities to be specified by user(OPTIONAL).\n" \
+				" All Inputs must be specified in the same order as mentioned above.\n\n" <<flush; 
+	}
+
+
+Options::Options (int argc, char** argv)
+	:iVersion (false),
+	iHelpFlag (false),
+	iDATFileSpecified (false),
+	iSISFileSpecified (false),
+	iDirectorySpecified (false),
+	iUserCapabilities(0)
+	{
+	StringVector userCapabilities;
+	unsigned char stage = 0;
+	bool ssl = false;
+	string fileInput;
+	while (--argc > 0)
+		{
+		argv++;
+		if ((**argv == '-') || (**argv == '/'))
+			{
+			const char* optPtr = *argv;
+			while (*++optPtr)
+				{
+				switch (*optPtr)
+					{
+					case 'h':
+					case 'H':
+					case '?':
+						{
+						iHelpFlag = true;
+						DisplayUsage();
+						break;
+						}
+					case 'v':
+					case 'V':
+						{
+						iVersion = true;
+						DisplayVersion();
+						break;
+						}
+					case 'i' :
+					case 'I' :
+						{
+						ssl = true;
+						break;
+						}
+
+					default:
+						throw EUnknownOption;
+					}
+				}
+			}
+	
+			else
+				{
+				switch(stage)
+					{
+					case 0:
+						{
+						iSisFile = *argv;
+						iSISFileSpecified = true;
+						break;
+						}
+					case 1:
+						{
+						iDATFile = *argv;
+						iDATFileSpecified = true;
+						break;
+						}
+
+					default:
+						{
+						string fileInput = *argv;
+						if(PathIsDirectory(fileInput.c_str()))
+							{
+							iCertstore = fileInput;
+							iDirectorySpecified = true;
+							}
+						else if(fileInput.find(".")== string::npos)
+							{
+							string capabilities = fileInput;
+							userCapabilities.push_back(capabilities);
+							}
+						else
+							{
+							throw EUnknownOption;
+							}
+						break;
+						}
+					}
+				stage++;
+				}
+		}
+
+		//displays OpenSSL copyright notice.
+		if (ssl)
+			{
+			for (int index = 0; index < (sizeof(openSSLLicenseString)/sizeof(openSSLLicenseString[0])); ++index)
+				{
+				cout << openSSLLicenseString [index] << endl;
+				}
+			}
+
+		//if user capabilities specified.
+		if(userCapabilities.size())
+			{
+			iUserCapabilities = ConvertUserCapsToInt(userCapabilities);
+			}
+
+		if(iDirectorySpecified && iDATFileSpecified)
+			{
+			iCertstore.append(" ");
+			iCertstore.append(iDATFile);
+			}
+
+		if(iDATFileSpecified && !iDirectorySpecified)
+				{
+				iCertstore = iDATFile;
+				}
+		
+		//if only -h or -v is specified,display and exit.
+		if(!iDATFileSpecified && !iDirectorySpecified && !iSISFileSpecified)	
+			{
+			exit(0);
+			}
+				
+		if (!iDATFileSpecified && !iDirectorySpecified)
+			{
+			throw EMissingDATFile;	
+			}
+
+		if(!iSISFileSpecified)
+			{
+			throw EMissingSISFile;
+			}
+	}
+
+const int Options::ConvertUserCapsToInt(vector <string>& aUserCapabilities)
+	{
+	string listOfCapabilities[KNumberOfCaps];
+	int userCaps = 0;
+	if(aUserCapabilities.size())
+		{
+		for(StringVector::iterator userCapsIter = aUserCapabilities.begin(); userCapsIter != aUserCapabilities.end(); ++userCapsIter)
+			{
+			string capabilities = *userCapsIter;
+			//convert each user capability to uppercase.
+			for(int j = 0 ; j < capabilities.length() ; j++)
+				{
+				capabilities[j] = ::toupper(capabilities[j]);
+				}
+
+			//convert the predefined CapabilityList into uppercase.
+			for(int k = 0 ; k < KNumberOfCaps ; k++)
+				{
+				listOfCapabilities[k] = CapabilityList[k];
+				for(int j = 0 ; j < listOfCapabilities[k].length() ; j++)
+					{
+					listOfCapabilities[k][j] = ::toupper(listOfCapabilities[k][j]);
+					}
+				}
+		
+			for (int i = 0; i < KNumberOfCaps; i++)
+				{
+					if(capabilities.compare(listOfCapabilities[i])==0)
+					{
+					userCaps += pow(2,i);
+					}
+				}
+			}
+		}
+	return  userCaps;
+	}
+
+Options::~Options()
+	{
+	}
+
+
+