secureswitools/swisistools/source/scrtool/options.cpp
changeset 0 ba25891c3a9e
child 25 7333d7932ef7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/secureswitools/swisistools/source/scrtool/options.cpp	Thu Dec 17 08:51:10 2009 +0200
@@ -0,0 +1,297 @@
+/*
+* Copyright (c) 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 "../common/exception.h"
+
+#include <fstream.h>
+#include <vector>
+#include <string>
+#include <algorithm>
+
+std::string COptions::iCurrentVersion = "Registry Database Generator Version 1, 0, 1";
+
+std::string COptions::iDescription =	"A utility for generating and updating the Software Component Registry database which stores "
+							"information for all installed software components.";
+
+std::string COptions::iCopyright = "Copyright (c) 2008 Symbian Software Ltd. All rights reserved.";
+
+std::string COptions::iUsage	=	
+						"Usage : scrtool [-h|-?] [-v] [-l] [-w] -c or -d [DB name] -f [Environment XML file] -p [Pre-provision XML file]"
+						
+						"\n-h|-? Show help usage."
+						
+						"\n-v Show tool version."
+						
+						"\n-c [mandatory if -d not specified]" 
+						"\n\tCreate or regenerate database. This option would always create a new database." 
+						"\n\tIf a database with the same name already exists it would be overwritten.\n"
+						
+						"-d [mandatory if -c not specified]"
+						"\n\tName of an already existing SCR database."
+						"\n\tThis option assumes existence of a database and updates it with" 
+						"\n\tadditional software environment or pre-provisioning information."
+						
+						"\n-f\tXML file which contains software environment information."
+						
+						"\n-p\tXML file which contains pre-provision information."
+
+						"\n-l\tName of the log file, Default: scrtool.log\n"
+						
+						"\n-w\tLevel of logging information [ERROR,WARN,INFO,ALL], Default: ALL.\n";
+						
+std::string COptions::iGeneralInfo =  
+							"Tool can be used in the following ways: \n"
+							"1. [-c and -f]: Create database with environment information.\n"
+							"2. [-c and -f]: Replace an existing database with new environment information.\n"
+							"3. [-d and -f]: Add new environment information to an existing database as specified in input XML files.\n"
+							"4. [-d and -p]: Add pre-provision details to an already existing database.\n"
+							"5. [-c,-f and -p]: Create database, populate environments and update the pre-provision information.\n"
+							"Name of the database ( either -c or -d ) and at least one XML file (-f) with environment update"
+							"\nshould be specified.";
+
+
+COptions::COptions(int aParamsCount, char** aParams)
+	:iDbExist(false),
+	 iLoggingEnabled(false),
+	 iLogLevel(CLogger::ELogAll),
+	 iLogFileName("scrtool.log"),
+	 iPreProvisionUpdate(false)
+	{
+	ValidateOptions(aParamsCount, aParams);
+	}
+
+COptions::~COptions()
+	{
+	}
+
+void COptions::ValidateOptions(int aParamsCount, char** aParams)
+	{
+	bool envFileNameOptionExists = false;
+	bool createDbOptionExists=  false;
+	bool preProvFileExists = false;
+
+	int count = 0;
+	while(++count < aParamsCount)
+		{
+		// each option should have a corresponding data present 
+		if(*aParams[count] != '-' )
+			{
+			DisplayUsage();
+			throw CException("Invalid argument passed.",ExceptionCodes::EInvalidArgument);
+			}
+
+		const char* ch = aParams[count]+1;
+
+		switch(*ch)
+			{
+			case 'h':
+			case '?':
+				DisplayDetailedUsage();
+				exit(0);
+				break;
+			case 'v':
+				DisplayVersion();
+				exit(0);
+				break;
+			case 'c':
+				CheckParamExists(aParamsCount,++count);
+				iScrDbName = aParams[count];
+				createDbOptionExists = true;
+				break;
+			case 'd':
+				CheckParamExists(aParamsCount,++count);
+				iScrDbName = aParams[count];
+				iDbExist = true;
+				break;
+			case 'f':
+				{
+				CheckParamExists(aParamsCount,count+1);
+				// get the XML file names
+				char * xmlFileName;
+				do
+					{
+					xmlFileName = aParams[++count];
+					if(IsFileAbsent(xmlFileName))
+						{
+						DisplayUsage();
+						std::string errMsg(xmlFileName);
+						errMsg += " not present";
+						throw CException(errMsg,ExceptionCodes::EFileNotPresent);
+						}
+					iXmlFileNames.push_back(xmlFileName);
+					} while( count+1 < aParamsCount && *aParams[count+1] != '-'  );
+				envFileNameOptionExists = true;
+				break;
+				}
+
+			case 'p':
+				{
+				CheckParamExists(aParamsCount,++count);
+				// get the XML file names
+				char * xmlFileName = aParams[count];
+				
+				if(IsFileAbsent(xmlFileName))
+					{
+					DisplayUsage();
+					std::string errMsg(xmlFileName);
+					errMsg += " not present";
+					throw CException(errMsg,ExceptionCodes::EFileNotPresent);
+					}
+				iPreProvisionFileName = xmlFileName;
+				iPreProvisionUpdate = true;
+				break;
+				}
+			case 'l':
+				CheckParamExists(aParamsCount,++count);
+				iLogFileName = aParams[count];
+				break;
+			case 'w':
+				CheckParamExists(aParamsCount,++count);
+				SetLogLevel(aParams[count]);
+				break;
+			default:
+				{
+				DisplayUsage();
+				throw CException("Invalid argument passed.",ExceptionCodes::EInvalidArgument);
+				}
+			} // end of switch
+		} // end of while
+	
+	// if any of these 3 options are not satisfied then 
+	// mandatory option has not been specified.	
+	if( // existing db name and pre-provision file
+		!((iDbExist && iPreProvisionUpdate)
+		// existing db and env file
+		|| (envFileNameOptionExists && iDbExist) 
+		// create new db and env file
+		|| (createDbOptionExists && envFileNameOptionExists)))
+		{
+		DisplayUsage();
+		throw CException("Mandatory option not specified",ExceptionCodes::EMandatoryOption);
+		}
+	if(createDbOptionExists && iDbExist)
+		{
+		DisplayUsage();
+		throw CException("-c and -d cannot be specified at the same time.",ExceptionCodes::EMutuallyExclusive);
+		}
+	if(createDbOptionExists)
+		{
+		remove(iScrDbName.c_str());
+		}
+	}
+
+
+void COptions::CheckParamExists(int aParamsCount, int aCurrentCount)
+	{
+	if(aCurrentCount >= aParamsCount)
+		{
+		DisplayUsage();
+		throw CException("Invalid argument passed.",ExceptionCodes::EInvalidArgument);
+		}
+	}
+
+bool COptions::IsFileAbsent(const char* aFileName)
+	{
+	std::ifstream fileStream(aFileName,ios::in);
+	if(!fileStream)
+		return true;
+	fileStream.close();
+	return false;
+	}
+
+void COptions::DisplayDetailedUsage()
+	{
+	std::cout << iDescription << std::endl;
+	std::cout << iCopyright << std::endl;
+	DisplayUsage();
+	std::cout << iGeneralInfo << std::endl;
+	}
+
+void COptions::DisplayUsage()
+	{
+	DisplayVersion();
+	std::cout << iUsage << std::endl;
+	}
+
+void COptions::DisplayVersion()
+	{
+	std::cout << iCurrentVersion << std::endl;
+	}
+
+void COptions::SetLogLevel(const char* aLogLevel)
+	{
+	std::string logLevel(aLogLevel);
+	std::transform(logLevel.begin(), logLevel.end(), logLevel.begin(), ::toupper);
+
+	if(logLevel == "ERROR")
+		{
+		iLogLevel = CLogger::ELogError;
+		}
+	else if(logLevel == "WARN")
+		{
+		iLogLevel = CLogger::ELogWarning;
+		}
+	else if(logLevel == "INFO")
+		{
+		iLogLevel = static_cast<CLogger::TLogLevel>(CLogger::ELogEnter | CLogger::ELogExit | CLogger::ELog);
+		}
+	else if(logLevel == "ALL")
+		{
+		iLogLevel = CLogger::ELogAll;
+		}	
+	else
+		{
+		throw CException("Invalid log level specified",ExceptionCodes::EInvalidArgument);
+		}
+	}
+
+std::string COptions::GetLogFileName()
+	{
+	return iLogFileName;
+	}
+
+CLogger::TLogLevel COptions::GetLogLevel()
+	{
+	return iLogLevel;
+	}
+
+std::string COptions::GetDbFileName()
+	{
+	return iScrDbName;
+	}
+
+std::vector<std::string> COptions::GetEnvFileNames()
+	{
+	return iXmlFileNames;
+	}
+
+std::string COptions::GetPrePovisionFileName()
+	{
+	return iPreProvisionFileName;
+	}
+
+bool COptions::IsDbAbsent()
+	{
+	return !iDbExist;
+	}
+
+bool COptions::IsPreProvisionInfoAvailable()
+	{
+	return iPreProvisionUpdate;
+	}
\ No newline at end of file