summaryrefslogtreecommitdiffstats
path: root/logic/minecraft
diff options
context:
space:
mode:
authorPetr Mrázek <peterix@gmail.com>2015-05-04 01:20:48 +0200
committerPetr Mrázek <peterix@gmail.com>2015-05-04 01:20:48 +0200
commit1b884d0a9dc28d8bca38fe8756482d991d0ea850 (patch)
treefabe4350a3d64123ad0801fe7c285c2150f9562b /logic/minecraft
parent8e9d5f56b592fd0dd0f54e747a835391a775120d (diff)
downloadMultiMC-1b884d0a9dc28d8bca38fe8756482d991d0ea850.tar
MultiMC-1b884d0a9dc28d8bca38fe8756482d991d0ea850.tar.gz
MultiMC-1b884d0a9dc28d8bca38fe8756482d991d0ea850.tar.lz
MultiMC-1b884d0a9dc28d8bca38fe8756482d991d0ea850.tar.xz
MultiMC-1b884d0a9dc28d8bca38fe8756482d991d0ea850.zip
GH-907 improve Java testing and PermGen deprecation handling
Diffstat (limited to 'logic/minecraft')
-rw-r--r--logic/minecraft/MinecraftInstance.cpp6
-rw-r--r--logic/minecraft/MinecraftProcess.cpp70
2 files changed, 68 insertions, 8 deletions
diff --git a/logic/minecraft/MinecraftInstance.cpp b/logic/minecraft/MinecraftInstance.cpp
index e4273cb9..2813a609 100644
--- a/logic/minecraft/MinecraftInstance.cpp
+++ b/logic/minecraft/MinecraftInstance.cpp
@@ -9,11 +9,15 @@ MinecraftInstance::MinecraftInstance(SettingsObjectPtr globalSettings, SettingsO
{
// Java Settings
m_settings->registerSetting("OverrideJava", false);
- m_settings->registerSetting("OverrideJavaLocation", false);
+ auto locationOverride = m_settings->registerSetting("OverrideJavaLocation", false);
m_settings->registerSetting("OverrideJavaArgs", false);
m_settings->registerOverride(globalSettings->getSetting("JavaPath"));
m_settings->registerOverride(globalSettings->getSetting("JvmArgs"));
+ // special!
+ m_settings->registerPassthrough(globalSettings->getSetting("JavaTimestamp"), locationOverride);
+ m_settings->registerPassthrough(globalSettings->getSetting("JavaVersion"), locationOverride);
+
// Window Size
m_settings->registerSetting("OverrideWindow", false);
m_settings->registerOverride(globalSettings->getSetting("LaunchMaximized"));
diff --git a/logic/minecraft/MinecraftProcess.cpp b/logic/minecraft/MinecraftProcess.cpp
index 9d18ad90..10d30b73 100644
--- a/logic/minecraft/MinecraftProcess.cpp
+++ b/logic/minecraft/MinecraftProcess.cpp
@@ -16,6 +16,8 @@
*/
#include "minecraft/MinecraftProcess.h"
#include "BaseInstance.h"
+#include <java/JavaChecker.h>
+#include <MMCStrings.h>
#include <QDataStream>
#include <QFile>
@@ -141,11 +143,18 @@ QStringList MinecraftProcess::javaArguments() const
args << QString("-Xms%1m").arg(m_instance->settings().get("MinMemAlloc").toInt());
args << QString("-Xmx%1m").arg(m_instance->settings().get("MaxMemAlloc").toInt());
- auto permgen = m_instance->settings().get("PermGen").toInt();
- if (permgen != 64)
+
+ // No PermGen in newer java.
+ auto javaVersion = m_instance->settings().get("JavaVersion");
+ if(Strings::naturalCompare(javaVersion.toString(), "1.8.0", Qt::CaseInsensitive) < 0)
{
- args << QString("-XX:PermSize=%1m").arg(permgen);
+ auto permgen = m_instance->settings().get("PermGen").toInt();
+ if (permgen != 64)
+ {
+ args << QString("-XX:PermSize=%1m").arg(permgen);
+ }
}
+
args << "-Duser.language=en";
if (!m_nativeFolder.isEmpty())
args << QString("-Djava.library.path=%1").arg(m_nativeFolder);
@@ -167,12 +176,8 @@ void MinecraftProcess::arm()
m_instance->setLastLaunch();
- QStringList args = javaArguments();
-
QString JavaPath = m_instance->settings().get("JavaPath").toString();
emit log("Java path is:\n" + JavaPath + "\n\n");
- QString allArgs = args.join(", ");
- emit log("Java Arguments:\n[" + censorPrivateInfo(allArgs) + "]\n\n");
auto realJavaPath = QStandardPaths::findExecutable(JavaPath);
if (realJavaPath.isEmpty())
@@ -182,6 +187,57 @@ void MinecraftProcess::arm()
MessageLevel::Warning);
}
+ // check java version here.
+ {
+ QFileInfo javaInfo(realJavaPath);
+ qlonglong javaUnixTime = javaInfo.lastModified().toMSecsSinceEpoch();
+ auto storedUnixTime = m_instance->settings().get("JavaTimestamp").toLongLong();
+ // if they are not the same, check!
+ if(javaUnixTime != storedUnixTime)
+ {
+ QEventLoop ev;
+ auto checker = std::make_shared<JavaChecker>();
+ bool successful = false;
+ QString errorLog;
+ QString version;
+ emit log(tr("Checking Java version..."), MessageLevel::MultiMC);
+ connect(checker.get(), &JavaChecker::checkFinished,
+ [&](JavaCheckResult result)
+ {
+ successful = result.valid;
+ errorLog = result.stderr;
+ version = result.javaVersion;
+ ev.exit();
+ });
+ checker->m_path = realJavaPath;
+ checker->performCheck();
+ ev.exec();
+ if(!successful)
+ {
+ // Error message displayed if java can't start
+ emit log(tr("Could not start java:"), MessageLevel::Error);
+ auto lines = errorLog.split('\n');
+ for(auto line: lines)
+ {
+ emit log(line, MessageLevel::Error);
+ }
+ emit log("\nCheck your MultiMC Java settings.", MessageLevel::MultiMC);
+ m_instance->cleanupAfterRun();
+ emit launch_failed(m_instance);
+ // not running, failed
+ m_instance->setRunning(false);
+ return;
+ }
+ emit log(tr("Java version is %1!\n").arg(version), MessageLevel::MultiMC);
+ m_instance->settings().set("JavaVersion", version);
+ m_instance->settings().set("JavaTimestamp", javaUnixTime);
+ }
+ }
+
+ QStringList args = javaArguments();
+ QString allArgs = args.join(", ");
+ emit log("Java Arguments:\n[" + censorPrivateInfo(allArgs) + "]\n\n");
+
// instantiate the launcher part
start(JavaPath, args);
if (!waitForStarted())