--- /dev/null 2019-01-11 12:11:17.000000000 -0500 +++ new/src/jdk.jpackage/share/native/libapplauncher/Helpers.cpp 2019-01-11 12:11:16.421276400 -0500 @@ -0,0 +1,296 @@ +/* + * Copyright (c) 2014, 2019, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +#include "Helpers.h" +#include "PlatformString.h" +#include "PropertyFile.h" + + +bool Helpers::SplitOptionIntoNameValue( + TString option, TString& Name, TString& Value) { + bool hasValue = false; + Name = _T(""); + Value = _T(""); + unsigned int index = 0; + + for (; index < option.length(); index++) { + TCHAR c = option[index]; + + switch (c) { + case '=': { + index++; + hasValue = true; + break; + } + + case '\\': { + if (index + 1 < option.length()) { + c = option[index + 1]; + + switch (c) { + case '\\': { + index++; + Name += '\\'; + break; + } + + case '=': { + index++; + Name += '='; + break; + } + } + + } + + continue; + } + + default: { + Name += c; + continue; + } + } + + break; + } + + if (hasValue) { + Value = option.substr(index, index - option.length()); + } + + return (option.length() > 0); +} + + +TString Helpers::ReplaceString(TString subject, const TString& search, + const TString& replace) { + size_t pos = 0; + while((pos = subject.find(search, pos)) != TString::npos) { + subject.replace(pos, search.length(), replace); + pos += replace.length(); + } + return subject; +} + +TString Helpers::ConvertIdToFilePath(TString Value) { + TString search; + search = '.'; + TString replace; + replace = '/'; + TString result = ReplaceString(Value, search, replace); + return result; +} + +TString Helpers::ConvertIdToJavaPath(TString Value) { + TString search; + search = '.'; + TString replace; + replace = '/'; + TString result = ReplaceString(Value, search, replace); + search = '\\'; + result = ReplaceString(result, search, replace); + return result; +} + +TString Helpers::ConvertJavaPathToId(TString Value) { + TString search; + search = '/'; + TString replace; + replace = '.'; + TString result = ReplaceString(Value, search, replace); + return result; +} + +OrderedMap + Helpers::GetJVMArgsFromConfig(IPropertyContainer* config) { + OrderedMap result; + + for (unsigned int index = 0; index < config->GetCount(); index++) { + TString argname = + TString(_T("jvmarg.")) + PlatformString(index + 1).toString(); + TString argvalue; + + if (config->GetValue(argname, argvalue) == false) { + break; + } + else if (argvalue.empty() == false) { + TString name; + TString value; + if (Helpers::SplitOptionIntoNameValue(argvalue, name, value)) { + result.Append(name, value); + } + } + } + + return result; +} + +std::list Helpers::GetArgsFromConfig(IPropertyContainer* config) { + std::list result; + + for (unsigned int index = 0; index < config->GetCount(); index++) { + TString argname = TString(_T("arg.")) + + PlatformString(index + 1).toString(); + TString argvalue; + + if (config->GetValue(argname, argvalue) == false) { + break; + } + else if (argvalue.empty() == false) { + result.push_back((argvalue)); + } + } + + return result; +} + +void AppendToIni(PropertyFile &Source, IniFile* Destination, TString Key) { + TString value; + + if (Source.GetValue(Key, value) == true) { + Platform& platform = Platform::GetInstance(); + std::map keys = platform.GetKeys(); + Destination->Append(keys[CONFIG_SECTION_APPLICATION], Key, value); + } +} + +void Helpers::LoadOldConfigFile(TString FileName, IniFile* Container) { + PropertyFile propertyFile; + + if (propertyFile.LoadFromFile(FileName) == true) { + Platform& platform = Platform::GetInstance(); + + std::map keys = platform.GetKeys(); + + // Application Section + AppendToIni(propertyFile, Container, keys[CONFIG_MAINJAR_KEY]); + AppendToIni(propertyFile, Container, keys[CONFIG_MAINMODULE_KEY]); + AppendToIni(propertyFile, Container, keys[CONFIG_MAINCLASSNAME_KEY]); + AppendToIni(propertyFile, Container, keys[CONFIG_CLASSPATH_KEY]); + AppendToIni(propertyFile, Container, keys[APP_NAME_KEY]); + AppendToIni(propertyFile, Container, keys[CONFIG_APP_ID_KEY]); + AppendToIni(propertyFile, Container, keys[JVM_RUNTIME_KEY]); + AppendToIni(propertyFile, Container, keys[JPACKAGE_APP_DATA_DIR]); + + AppendToIni(propertyFile, Container, keys[CONFIG_APP_MEMORY]); + AppendToIni(propertyFile, Container, keys[CONFIG_SPLASH_KEY]); + + // JVMOptions Section + OrderedMap JVMArgs = + Helpers::GetJVMArgsFromConfig(&propertyFile); + Container->AppendSection(keys[CONFIG_SECTION_JVMOPTIONS], JVMArgs); + + // ArgOptions Section + std::list args = Helpers::GetArgsFromConfig(&propertyFile); + OrderedMap convertedArgs; + + for (std::list::iterator iterator = args.begin(); + iterator != args.end(); iterator++) { + TString arg = *iterator; + TString name; + TString value; + + if (Helpers::SplitOptionIntoNameValue(arg, name, value) == true) { + convertedArgs.Append(name, value); + } + } + + Container->AppendSection(keys[CONFIG_SECTION_ARGOPTIONS], + convertedArgs); + } +} + +std::list + Helpers::MapToNameValueList(OrderedMap Map) { + std::list result; + std::vector keys = Map.GetKeys(); + + for (OrderedMap::const_iterator iterator = Map.begin(); + iterator != Map.end(); iterator++) { + pair *item = *iterator; + TString key = item->first; + TString value = item->second; + + if (value.length() == 0) { + result.push_back(key); + } else { + result.push_back(key + _T('=') + value); + } + } + + return result; +} + +TString Helpers::NameValueToString(TString name, TString value) { + TString result; + + if (value.empty() == true) { + result = name; + } + else { + result = name + TString(_T("=")) + value; + } + + return result; +} + +std::list Helpers::StringToArray(TString Value) { + std::list result; + TString line; + + for (unsigned int index = 0; index < Value.length(); index++) { + TCHAR c = Value[index]; + + switch (c) { + case '\n': { + result.push_back(line); + line = _T(""); + break; + } + + case '\r': { + result.push_back(line); + line = _T(""); + + if (Value[index + 1] == '\n') + index++; + + break; + } + + default: { + line += c; + } + } + } + + // The buffer may not have ended with a Carriage Return/Line Feed. + if (line.length() > 0) { + result.push_back(line); + } + + return result; +}