diff -r fe881edfd9c1 o.n.bootstrap/launcher/windows/jvmlauncher.cpp --- a/o.n.bootstrap/launcher/windows/jvmlauncher.cpp Sat May 01 14:50:01 2010 +0400 +++ b/o.n.bootstrap/launcher/windows/jvmlauncher.cpp Tue May 04 00:12:20 2010 +0200 @@ -121,16 +121,16 @@ return !javaPath.empty(); } -bool JvmLauncher::start(const char *mainClassName, list args, list options, bool &separateProcess, DWORD *retCode) { +bool JvmLauncher::start(const char *mainClassName, const list &args, const list &options, bool &separateProcess, DWORD *retCode) { assert(mainClassName); logMsg("JvmLauncher::start()\n\tmainClassName: %s\n\tseparateProcess: %s", mainClassName, separateProcess ? "true" : "false"); logMsg(" args:"); - for (list::iterator it = args.begin(); it != args.end(); ++it) { + for (list::const_iterator it = args.begin(); it != args.end(); ++it) { logMsg("\t%s", it->c_str()); } logMsg(" options:"); - for (list::iterator it = options.begin(); it != options.end(); ++it) { + for (list::const_iterator it = options.begin(); it != options.end(); ++it) { logMsg("\t%s", it->c_str()); } @@ -166,8 +166,8 @@ : startInProcJvm(mainClassName, args, options); } -bool JvmLauncher::findClientOption(list &options) { - for (list::iterator it = options.begin(); it != options.end(); ++it) { +bool JvmLauncher::findClientOption(const list &options) { + for (list::const_iterator it = options.begin(); it != options.end(); ++it) { if (*it == "-client") { return true; } @@ -195,7 +195,7 @@ return *end == '\0'; } -bool JvmLauncher::startInProcJvm(const char *mainClassName, std::list args, std::list options) { +bool JvmLauncher::startInProcJvm(const char *mainClassName, const std::list &args, const std::list &options) { class Jvm { public: @@ -228,7 +228,7 @@ } } - bool init(list options) { + bool init(const list &options) { logMsg("JvmLauncher::Jvm::init()"); logMsg("LoadLibrary(\"%s\")", jvmLauncher->javaDllPath.c_str()); { @@ -249,8 +249,8 @@ logMsg("JVM options:"); jvmOptions = new JavaVMOption[options.size()]; int i = 0; - for (list::iterator it = options.begin(); it != options.end(); ++it, ++i) { - string &option = *it; + for (list::const_iterator it = options.begin(); it != options.end(); ++it, ++i) { + const string &option = *it; logMsg("\t%s", option.c_str()); jvmOptions[i].optionString = (char *) option.c_str(); jvmOptions[i].extraInfo = 0; @@ -314,9 +314,13 @@ return false; } int i = 0; - for (list::iterator it = args.begin(); it != args.end(); ++it, ++i) { - string &arg = *it; - jstring jstringArg = jvm.env->NewStringUTF(arg.c_str()); + for (list::const_iterator it = args.begin(); it != args.end(); ++it, ++i) { + const string &arg = *it; + const int len = 32*1024; + char utf8[len] = ""; + if (convertAnsiToUtf8(arg.c_str(), utf8, len)) + logMsg("Conversion to UTF8 failed"); + jstring jstringArg = jvm.env->NewStringUTF(utf8); if (!jstringArg) { logErr(false, true, "NewStringUTF() failed"); return false; @@ -329,10 +333,10 @@ } -bool JvmLauncher::startOutProcJvm(const char *mainClassName, std::list args, std::list options, DWORD *retCode) { +bool JvmLauncher::startOutProcJvm(const char *mainClassName, const std::list &args, const std::list &options, DWORD *retCode) { string cmdLine = '\"' + (suppressConsole ? javawExePath : javaExePath) + '\"'; cmdLine.reserve(32*1024); - for (list::iterator it = options.begin(); it != options.end(); ++it) { + for (list::const_iterator it = options.begin(); it != options.end(); ++it) { cmdLine += " \""; cmdLine += *it; cmdLine += "\""; @@ -341,7 +345,7 @@ // mainClass and args cmdLine += ' '; cmdLine += mainClassName; - for (list::iterator it = args.begin(); it != args.end(); ++it) { + for (list::const_iterator it = args.begin(); it != args.end(); ++it) { if (javaClientDllPath.empty() && *it == "-client") { logMsg("Removing -client option, client java dll not found."); // remove client parameter, no client java found diff -r fe881edfd9c1 o.n.bootstrap/launcher/windows/jvmlauncher.h --- a/o.n.bootstrap/launcher/windows/jvmlauncher.h Sat May 01 14:50:01 2010 +0400 +++ b/o.n.bootstrap/launcher/windows/jvmlauncher.h Tue May 04 00:12:20 2010 +0200 @@ -71,7 +71,7 @@ bool initialize(const char *javaPathOrMinVersion); bool getJavaPath(std::string &path); - bool start(const char *mainClassName, std::list args, std::list options, bool &separateProcess, DWORD *retCode); + bool start(const char *mainClassName, const std::list &args, const std::list &options, bool &separateProcess, DWORD *retCode); void setSuppressConsole(bool val) { suppressConsole = val; @@ -83,11 +83,11 @@ bool checkJava(const char *javaPath, const char *prefix); bool findJava(const char *minJavaVersion); bool findJava(const char *javaKey, const char *prefix, const char *minJavaVersion); - bool startOutProcJvm(const char *mainClassName, std::list args, std::list options, DWORD *retCode); - bool startInProcJvm(const char *mainClassName, std::list args, std::list options); + bool startOutProcJvm(const char *mainClassName, const std::list &args, const std::list &options, DWORD *retCode); + bool startInProcJvm(const char *mainClassName, const std::list &args, const std::list &options); bool isVersionString(const char *str); bool canLoadJavaDll(); - bool findClientOption(std::list &options); + bool findClientOption(const std::list &options); private: bool suppressConsole; diff -r fe881edfd9c1 o.n.bootstrap/launcher/windows/platformlauncher.h --- a/o.n.bootstrap/launcher/windows/platformlauncher.h Sat May 01 14:50:01 2010 +0400 +++ b/o.n.bootstrap/launcher/windows/platformlauncher.h Tue May 04 00:12:20 2010 +0200 @@ -110,11 +110,11 @@ bool restartRequested(); private: - bool exiting; bool separateProcess; bool suppressConsole; bool heapDumpPathOptFound; bool nosplash; + bool exiting; std::string platformDir; std::string userDir; std::string clusters; diff -r fe881edfd9c1 o.n.bootstrap/launcher/windows/utilsfuncs.cpp --- a/o.n.bootstrap/launcher/windows/utilsfuncs.cpp Sat May 01 14:50:01 2010 +0400 +++ b/o.n.bootstrap/launcher/windows/utilsfuncs.cpp Tue May 04 00:12:20 2010 +0200 @@ -455,3 +455,14 @@ } return IsWow64; } + +int convertAnsiToUtf8(const char *ansi, char *utf8, int utf8Len) { + const int len = 32*1024; + WCHAR tmp[len] = L""; + if (MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, ansi, -1, tmp, len) == 0) + return -1; + if (WideCharToMultiByte(CP_UTF8, 0, tmp, -1, utf8, utf8Len, NULL, NULL) == 0) + return -1; + return 0; +} + diff -r fe881edfd9c1 o.n.bootstrap/launcher/windows/utilsfuncs.h --- a/o.n.bootstrap/launcher/windows/utilsfuncs.h Sat May 01 14:50:01 2010 +0400 +++ b/o.n.bootstrap/launcher/windows/utilsfuncs.h Tue May 04 00:12:20 2010 +0200 @@ -67,6 +67,7 @@ bool printToConsole(const char *msg); bool getParentProcessID(DWORD &id); bool isConsoleAttached(); +int convertAnsiToUtf8(const char *ansi, char *utf8, int utf8Len); #endif /* _UTILSFUNCS_H */