diff -r f5050f1da672 -r 04becd199f91 javaruntimes/starterutils/src/ueiargsparser.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/javaruntimes/starterutils/src/ueiargsparser.cpp Tue Apr 27 16:30:29 2010 +0300 @@ -0,0 +1,179 @@ +/* +* 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 "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: Converts Universal Emulator Interface (UEI) arguments to +* JVM arguments +* +*/ + + +#include + +#include "ueiargsparser.h" + +#include "logger.h" + +const wchar_t* const SUPPORTED_UEI_ARGS[] = {L"-Xverbose", L"-Xrunjdwp", 0}; +const wchar_t* const SUPPORTED_JVM_ARGS[] = {L"-verbose", L"-Xrunjdwp", 0}; +const int INDEX_VERBOSE = 0; +const int INDEX_RUNJDWP = 1; + +const wchar_t* const ALL = L"all"; +const wchar_t* const GC = L"gc"; +const wchar_t* const CLASS = L"class"; +const wchar_t* const JVM_SUPPORTED_VERBOSE_OPTIONS = L"gc,class,stack,sizes"; + +const wchar_t* const OPTION_SEPARATOR = L":"; +const wchar_t* const SPACE = L" "; +const wchar_t* const COMMA = L","; + +using namespace java::runtime; + +std::wstring UeiArgsParser::convertUeiArgsToJvmArgs(const std::wstring& aUeiParameters) +{ + std::vector args = getArgs(aUeiParameters); + + std::wostringstream jvmArgs; + for (int i = 0; i < args.size(); ++i) + { + LOG2(EDebugApi, EInfo,"args(%S): %d", args.at(i).c_str(), i); + if (isVerbose(args.at(i))) + { + jvmArgs << convertVerbose(args.at(i)) << SPACE; + } + else if (isRundjwp(args.at(i))) + { + jvmArgs << convertRundjwp(args.at(i)) << SPACE; + } + } + + std::wstring result = jvmArgs.str(); + trimTrailingSpaces(result, SPACE); + + LOG2(EDebugApi, EInfo,"convertUeiArgsToJvmArgs(%S): %S", aUeiParameters.c_str(), result.c_str()); + return result; +} + +std::vector UeiArgsParser::getArgs(const std::wstring& aUeiParameters) +{ + std::vector result; + std::wstringstream stream; + stream << aUeiParameters; // codescanner::leave + std::wstring arg; + while (stream.good()) + { + stream >> arg; // codescanner::leave + if (arg.size() != 0) + { + result.push_back(arg); + } + } + + LOG2(EDebugApi, EInfo,"getArgs(%S): count=%d", aUeiParameters.c_str(), result.size()); + return result; +} + +bool UeiArgsParser::isVerbose(const std::wstring& aUeiArg) +{ + std::wstring verbose(SUPPORTED_UEI_ARGS[INDEX_VERBOSE]); + if (aUeiArg.compare(0, verbose.length(), verbose) == 0) + { + return true; + } + return false; +} + +bool UeiArgsParser::isRundjwp(const std::wstring& aUeiArg) +{ + std::wstring rundjwp(SUPPORTED_UEI_ARGS[INDEX_RUNJDWP]); + if (aUeiArg.compare(0, rundjwp.length(), rundjwp) == 0) + { + return true; + } + return false; +} + +// hasOption() assumes that options are separated by ',' +bool UeiArgsParser::hasOption(const std::wstring& aArg, const std::wstring& aOption) +{ + // option is in the middle: option,zzz + size_t found = aArg.find(aOption + COMMA); + if (found != std::wstring::npos) + { + return true; + } + + // option is the last one: zzz,option + found = aArg.find(aOption); + if (found != std::wstring::npos) + { + // avoid false alarm: zzz,optionz + int expectedSize = found + aOption.size(); + if (expectedSize == aArg.size()) + { + return true; + } + } + + return false; +} + +std::wstring UeiArgsParser::convertVerbose(const std::wstring& aVerbose) +{ + std::wostringstream arg; + arg << SUPPORTED_JVM_ARGS[INDEX_VERBOSE]; + + if (aVerbose.find(OPTION_SEPARATOR) != std::wstring::npos) + { + arg << OPTION_SEPARATOR; + if (hasOption(aVerbose, ALL)) + { + arg << JVM_SUPPORTED_VERBOSE_OPTIONS; + } + else + { + if (hasOption(aVerbose, GC)) + { + arg << GC << COMMA; + } + if (hasOption(aVerbose, CLASS)) + { + arg << CLASS << COMMA; + } + } + } + + std::wstring result = arg.str(); + std::wostringstream whitespaces; + whitespaces << OPTION_SEPARATOR << COMMA; + trimTrailingSpaces(result, whitespaces.str()); + + LOG2(EDebugApi, EInfo,"convertVerbose(%S): %S", aVerbose.c_str(), result.c_str()); + return result; +} + +std::wstring UeiArgsParser::convertRundjwp(const std::wstring& aRunjdwp) +{ + return aRunjdwp; +} + +std::wstring UeiArgsParser::trimTrailingSpaces(std::wstring& aString, const std::wstring& aWhitespaces) +{ + size_t trailingSpace = aString.find_last_not_of(aWhitespaces); + if (trailingSpace != std::wstring::npos) + { + aString.erase(trailingSpace + 1); + } + return aString; +} +