From 1dee4bb60d08995f0fd4eb229f131f2ca546d24c Mon Sep 17 00:00:00 2001 From: Sky Date: Sat, 5 Oct 2013 01:08:13 +0100 Subject: Add naive Windows Java detection - JavaUtils for finding it on other systems (incomplete) --- logic/JavaUtils.cpp | 114 ++++++++++++++++++++++++++++++++++++++++++++++++++++ logic/JavaUtils.h | 26 ++++++++++++ 2 files changed, 140 insertions(+) create mode 100644 logic/JavaUtils.cpp create mode 100644 logic/JavaUtils.h (limited to 'logic') diff --git a/logic/JavaUtils.cpp b/logic/JavaUtils.cpp new file mode 100644 index 00000000..d89ab9c5 --- /dev/null +++ b/logic/JavaUtils.cpp @@ -0,0 +1,114 @@ +/* Copyright 2013 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "JavaUtils.h" +#include "osutils.h" +#include "pathutils.h" + +#include +#include +#include +#include + +#if WINDOWS +#include + +#endif + +JavaUtils::JavaUtils() +{ + +} + +#if WINDOWS +QStringList JavaUtils::FindJavaPath() +{ + QStringList paths; + + HKEY jreKey; + QString jreKeyName = "SOFTWARE\\JavaSoft\\Java Runtime Environment"; + if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, jreKeyName.toStdString().c_str(), 0, KEY_READ | KEY_WOW64_64KEY, &jreKey) == ERROR_SUCCESS) + { + // Read the current JRE version from the registry. + // This will be used to find the key that contains the JavaHome value. + char *value = new char[0]; + DWORD valueSz = 0; + if (RegQueryValueExA(jreKey, "CurrentVersion", NULL, NULL, (BYTE*)value, &valueSz) == ERROR_MORE_DATA) + { + value = new char[valueSz]; + RegQueryValueExA(jreKey, "CurrentVersion", NULL, NULL, (BYTE*)value, &valueSz); + } + + RegCloseKey(jreKey); + + // Now open the registry key for the JRE version that we just got. + jreKeyName.append("\\").append(value); + if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, jreKeyName.toStdString().c_str(), 0, KEY_READ | KEY_WOW64_64KEY, &jreKey) == ERROR_SUCCESS) + { + // Read the JavaHome value to find where Java is installed. + value = new char[0]; + valueSz = 0; + if (RegQueryValueExA(jreKey, "JavaHome", NULL, NULL, (BYTE*)value, &valueSz) == ERROR_MORE_DATA) + { + value = new char[valueSz]; + RegQueryValueExA(jreKey, "JavaHome", NULL, NULL, (BYTE*)value, &valueSz); + + paths << QDir(PathCombine(value, "bin")).absoluteFilePath("java.exe"); + } + + RegCloseKey(jreKey); + } + } + + if(paths.length() <= 0) + { + qWarning() << "Failed to find Java in the Windows registry - defaulting to \"java\""; + paths << "java"; + } + + return paths; +} +#elif OSX +QStringList JavaUtils::FindJavaPath() +{ + qWarning() << "OS X Java detection incomplete - defaulting to \"java\""; + + QStringList paths; + paths << "java"; + + return paths; +} + +#elif LINUX +QStringList JavaUtils::FindJavaPath() +{ + qWarning() << "Linux Java detection incomplete - defaulting to \"java\""; + + QStringList paths; + paths << "java"; + + return paths; +} +#else +QStringList JavaUtils::FindJavaPath() +{ + qWarning() << "Unknown operating system build - defaulting to \"java\""; + + QStringList paths; + paths << "java"; + + return paths; +} +#endif diff --git a/logic/JavaUtils.h b/logic/JavaUtils.h new file mode 100644 index 00000000..fef2a1bf --- /dev/null +++ b/logic/JavaUtils.h @@ -0,0 +1,26 @@ +/* Copyright 2013 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include + +class JavaUtils +{ +public: + JavaUtils(); + + QStringList FindJavaPath(); +}; -- cgit v1.2.3