diff -r 000000000000 -r ba25891c3a9e secureswitools/swisistools/source/scrtool/options.cpp --- /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 +#include +#include +#include + +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::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 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