From c0254d9a75a1f0f784a3e9b6874475b2c2a3ab8f Mon Sep 17 00:00:00 2001 From: Loetkolben Date: Sun, 27 Jul 2014 15:50:03 +0200 Subject: [PATCH] Show a warning if the instance path contains a '!' The checks and warnings happen the time MMC loads (via QLOG_INFO), the time the GUI starts (via a dialog) and when the user changes the instance path via the settings window. --- MultiMC.cpp | 107 +++++++++++++++++-------------- depends/util/include/pathutils.h | 4 ++ depends/util/src/pathutils.cpp | 8 +++ gui/MainWindow.cpp | 18 ++++++ gui/MainWindow.h | 1 + gui/pages/global/MultiMCPage.cpp | 29 +++++++-- main.cpp | 1 + 7 files changed, 116 insertions(+), 52 deletions(-) diff --git a/MultiMC.cpp b/MultiMC.cpp index acf05c89..94be69f8 100644 --- a/MultiMC.cpp +++ b/MultiMC.cpp @@ -54,8 +54,7 @@ static const int APPDATA_BUFFER_SIZE = 1024; using namespace Util::Commandline; -MultiMC::MultiMC(int &argc, char **argv, bool root_override) - : QApplication(argc, argv) +MultiMC::MultiMC(int &argc, char **argv, bool root_override) : QApplication(argc, argv) { setOrganizationName("MultiMC"); setApplicationName("MultiMC5"); @@ -139,7 +138,7 @@ MultiMC::MultiMC(int &argc, char **argv, bool root_override) adjustedBy += "Fallback to binary path " + dataPath; } - if(!ensureFolderPathExists(dataPath) || !QDir::setCurrent(dataPath)) + if (!ensureFolderPathExists(dataPath) || !QDir::setCurrent(dataPath)) { // BAD STUFF. WHAT DO? initLogger(); @@ -154,27 +153,27 @@ MultiMC::MultiMC(int &argc, char **argv, bool root_override) } else { - #ifdef Q_OS_LINUX +#ifdef Q_OS_LINUX QDir foo(PathCombine(binPath, "..")); rootPath = foo.absolutePath(); - #elif defined(Q_OS_WIN32) +#elif defined(Q_OS_WIN32) rootPath = binPath; - #elif defined(Q_OS_MAC) +#elif defined(Q_OS_MAC) QDir foo(PathCombine(binPath, "../..")); rootPath = foo.absolutePath(); - #endif +#endif } - // static data paths... mostly just for translations - #ifdef Q_OS_LINUX - QDir foo(PathCombine(binPath, "..")); - staticDataPath = foo.absolutePath(); - #elif defined(Q_OS_WIN32) - staticDataPath = binPath; - #elif defined(Q_OS_MAC) - QDir foo(PathCombine(rootPath, "Contents/Resources")); - staticDataPath = foo.absolutePath(); - #endif +// static data paths... mostly just for translations +#ifdef Q_OS_LINUX + QDir foo(PathCombine(binPath, "..")); + staticDataPath = foo.absolutePath(); +#elif defined(Q_OS_WIN32) + staticDataPath = binPath; +#elif defined(Q_OS_MAC) + QDir foo(PathCombine(rootPath, "Contents/Resources")); + staticDataPath = foo.absolutePath(); +#endif // init the logger initLogger(); @@ -216,6 +215,15 @@ MultiMC::MultiMC(int &argc, char **argv, bool root_override) // and instances auto InstDirSetting = m_settings->getSetting("InstanceDir"); + // instance path: check for problems with '!' in instance path and warn the user in the log + // and rememer that we have to show him a dialog when the gui starts (if it does so) + QString instDir = MMC->settings()->get("InstanceDir").toString(); + QLOG_INFO() << "Instance path : " << instDir; + if (checkProblemticPathJava(QDir(instDir))) + { + QLOG_WARN() + << "Your instance path contains \'!\' and this is known to cause java problems"; + } m_instances.reset(new InstanceList(InstDirSetting->get().toString(), this)); QLOG_INFO() << "Loading Instances..."; m_instances->loadList(); @@ -245,8 +253,7 @@ MultiMC::MultiMC(int &argc, char **argv, bool root_override) { profiler->registerSettings(m_settings.get()); } - m_tools.insert("mcedit", - std::shared_ptr(new MCEditFactory())); + m_tools.insert("mcedit", std::shared_ptr(new MCEditFactory())); for (auto tool : m_tools.values()) { tool->registerSettings(m_settings.get()); @@ -374,7 +381,9 @@ void MultiMC::initGlobalSettings() QString ftbDefault, newFtbDefault, oldFtbDefault; if (!GetEnvironmentVariableW(L"LOCALAPPDATA", newBuf, APPDATA_BUFFER_SIZE)) { - QLOG_FATAL() << "Your LOCALAPPDATA folder is missing! If you are on windows, this means your system is broken. If you aren't on windows, how the **** are you running the windows build????"; + QLOG_FATAL() << "Your LOCALAPPDATA folder is missing! If you are on windows, this " + "means your system is broken. If you aren't on windows, how the **** " + "are you running the windows build????"; } else { @@ -382,7 +391,9 @@ void MultiMC::initGlobalSettings() } if (!GetEnvironmentVariableW(L"APPDATA", buf, APPDATA_BUFFER_SIZE)) { - QLOG_FATAL() << "Your APPDATA folder is missing! If you are on windows, this means your system is broken. If you aren't on windows, how the **** are you running the windows build????"; + QLOG_FATAL() << "Your APPDATA folder is missing! If you are on windows, this means " + "your system is broken. If you aren't on windows, how the **** are you " + "running the windows build????"; } else { @@ -401,21 +412,19 @@ void MultiMC::initGlobalSettings() } #elif defined(Q_OS_MAC) QString ftbDefault = ftbDataDefault = - PathCombine(QDir::homePath(), "Library/Application Support/ftblauncher"); + PathCombine(QDir::homePath(), "Library/Application Support/ftblauncher"); #endif m_settings->registerSetting("FTBLauncherDataRoot", ftbDataDefault); m_settings->registerSetting("FTBLauncherRoot", ftbDefault); - QLOG_INFO() << "FTB Launcher paths:" - << m_settings->get("FTBLauncherDataRoot").toString() - << "and" - << m_settings->get("FTBLauncherRoot").toString(); + QLOG_INFO() << "FTB Launcher paths:" << m_settings->get("FTBLauncherDataRoot").toString() + << "and" << m_settings->get("FTBLauncherRoot").toString(); m_settings->registerSetting("FTBRoot"); if (m_settings->get("FTBRoot").isNull()) { QString ftbRoot; QFile f(QDir(m_settings->get("FTBLauncherRoot").toString()) - .absoluteFilePath("ftblaunch.cfg")); + .absoluteFilePath("ftblaunch.cfg")); QLOG_INFO() << "Attempting to read" << f.fileName(); if (f.open(QFile::ReadOnly)) { @@ -544,11 +553,13 @@ void MultiMC::updateProxySettings() // Set the application proxy settings. if (proxyTypeStr == "SOCKS5") { - QNetworkProxy::setApplicationProxy(QNetworkProxy(QNetworkProxy::Socks5Proxy, addr, port, user, pass)); + QNetworkProxy::setApplicationProxy( + QNetworkProxy(QNetworkProxy::Socks5Proxy, addr, port, user, pass)); } else if (proxyTypeStr == "HTTP") { - QNetworkProxy::setApplicationProxy(QNetworkProxy(QNetworkProxy::HttpProxy, addr, port, user, pass)); + QNetworkProxy::setApplicationProxy( + QNetworkProxy(QNetworkProxy::HttpProxy, addr, port, user, pass)); } else if (proxyTypeStr == "None") { @@ -563,7 +574,8 @@ void MultiMC::updateProxySettings() QLOG_INFO() << "Detecting proxy settings..."; QNetworkProxy proxy = QNetworkProxy::applicationProxy(); - if (m_qnam.get()) m_qnam->setProxy(proxy); + if (m_qnam.get()) + m_qnam->setProxy(proxy); QString proxyDesc; if (proxy.type() == QNetworkProxy::NoProxy) { @@ -662,35 +674,34 @@ std::shared_ptr MultiMC::resolver() return m_resolver; } - void MultiMC::installUpdates(const QString updateFilesDir, UpdateFlags flags) { // if we are going to update on exit, save the params now - if(flags & OnExit) + if (flags & OnExit) { m_updateOnExitPath = updateFilesDir; m_updateOnExitFlags = flags & ~OnExit; return; } // otherwise if there already were some params for on exit update, clear them and continue - else if(m_updateOnExitPath.size()) + else if (m_updateOnExitPath.size()) { m_updateOnExitFlags = None; m_updateOnExitPath.clear(); } QLOG_INFO() << "Installing updates."; - #ifdef WINDOWS - QString finishCmd = MMC->applicationFilePath(); - QString updaterBinary = PathCombine(bin(), "updater.exe"); - #elif LINUX - QString finishCmd = PathCombine(root(), "MultiMC"); - QString updaterBinary = PathCombine(bin(), "updater"); - #elif OSX - QString finishCmd = MMC->applicationFilePath(); - QString updaterBinary = PathCombine(bin(), "updater"); - #else - #error Unsupported operating system. - #endif +#ifdef WINDOWS + QString finishCmd = MMC->applicationFilePath(); + QString updaterBinary = PathCombine(bin(), "updater.exe"); +#elif LINUX + QString finishCmd = PathCombine(root(), "MultiMC"); + QString updaterBinary = PathCombine(bin(), "updater"); +#elif OSX + QString finishCmd = MMC->applicationFilePath(); + QString updaterBinary = PathCombine(bin(), "updater"); +#else +#error Unsupported operating system. +#endif QStringList args; // ./updater --install-dir $INSTALL_DIR --package-dir $UPDATEFILES_DIR --script @@ -699,7 +710,7 @@ void MultiMC::installUpdates(const QString updateFilesDir, UpdateFlags flags) args << "--package-dir" << updateFilesDir; args << "--script" << PathCombine(updateFilesDir, "file_list.xml"); args << "--wait" << QString::number(MMC->applicationPid()); - if(flags & DryRun) + if (flags & DryRun) args << "--dry-run"; if (flags & RestartOnFinish) { @@ -709,7 +720,7 @@ void MultiMC::installUpdates(const QString updateFilesDir, UpdateFlags flags) QLOG_INFO() << "Running updater with command" << updaterBinary << args.join(" "); QFile::setPermissions(updaterBinary, (QFileDevice::Permission)0x7755); - if (!QProcess::startDetached(updaterBinary, args/*, root()*/)) + if (!QProcess::startDetached(updaterBinary, args /*, root()*/)) { QLOG_ERROR() << "Failed to start the updater process!"; return; @@ -721,7 +732,7 @@ void MultiMC::installUpdates(const QString updateFilesDir, UpdateFlags flags) void MultiMC::onExit() { - if(m_updateOnExitPath.size()) + if (m_updateOnExitPath.size()) { installUpdates(m_updateOnExitPath, m_updateOnExitFlags); } diff --git a/depends/util/include/pathutils.h b/depends/util/include/pathutils.h index 45c2a6de..f5990b85 100644 --- a/depends/util/include/pathutils.h +++ b/depends/util/include/pathutils.h @@ -16,6 +16,7 @@ #pragma once #include +#include #include "libutil_config.h" @@ -57,3 +58,6 @@ LIBUTIL_EXPORT void openFileInDefaultProgram(QString filename); /// Opens the given directory in the default application. LIBUTIL_EXPORT void openDirInDefaultProgram(QString dirpath, bool ensureExists = false); + +/// Checks if the a given Path contains "!" +LIBUTIL_EXPORT bool checkProblemticPathJava(QDir folder); diff --git a/depends/util/src/pathutils.cpp b/depends/util/src/pathutils.cpp index 1d09fe45..ba66898e 100644 --- a/depends/util/src/pathutils.cpp +++ b/depends/util/src/pathutils.cpp @@ -144,3 +144,11 @@ void openFileInDefaultProgram(QString filename) { QDesktopServices::openUrl(QUrl::fromLocalFile(filename)); } + +// Does the directory path contain any '!'? If yes, return true, otherwise false. +// (This is a problem for Java) +bool checkProblemticPathJava(QDir folder) +{ + QString pathfoldername = folder.absolutePath(); + return pathfoldername.contains("!", Qt::CaseInsensitive); +} diff --git a/gui/MainWindow.cpp b/gui/MainWindow.cpp index ce03d7b9..d3dc8f6e 100644 --- a/gui/MainWindow.cpp +++ b/gui/MainWindow.cpp @@ -1533,3 +1533,21 @@ void MainWindow::checkSetDefaultJava() MMC->settings()->set("JavaPath", QString("java")); } } + +void MainWindow::checkInstancePathForProblems() +{ + QString instanceFolder = MMC->settings()->get("InstanceDir").toString(); + if (checkProblemticPathJava(QDir(instanceFolder))) + { + QMessageBox warning; + warning.setText(tr( + "Your instance folder contains \'!\' and this is known to cause Java problems!")); + warning.setInformativeText( + tr("You have now three options:
" + " - ignore this warning
" + " - change the instance dir in the settings
" + " - move this installation of MultiMC5 to a different folder")); + warning.setDefaultButton(QMessageBox::Ok); + warning.exec(); + } +} diff --git a/gui/MainWindow.h b/gui/MainWindow.h index 32ad4daf..d32a245c 100644 --- a/gui/MainWindow.h +++ b/gui/MainWindow.h @@ -52,6 +52,7 @@ public: void checkSetDefaultJava(); void checkMigrateLegacyAssets(); + void checkInstancePathForProblems(); private slots: diff --git a/gui/pages/global/MultiMCPage.cpp b/gui/pages/global/MultiMCPage.cpp index 2d6eb7d5..73a5ff20 100644 --- a/gui/pages/global/MultiMCPage.cpp +++ b/gui/pages/global/MultiMCPage.cpp @@ -112,16 +112,37 @@ void MultiMCPage::on_ftbBrowseBtn_clicked() void MultiMCPage::on_instDirBrowseBtn_clicked() { - QString raw_dir = QFileDialog::getExistingDirectory(this, tr("Instance Directory"), - ui->instDirTextBox->text()); - QString cooked_dir = NormalizePath(raw_dir); + QString raw_dir = QFileDialog::getExistingDirectory(this, tr("Instance Directory"), + ui->instDirTextBox->text()); + QString cooked_dir = NormalizePath(raw_dir); // do not allow current dir - it's dirty. Do not allow dirs that don't exist if (!cooked_dir.isEmpty() && QDir(cooked_dir).exists()) { - ui->instDirTextBox->setText(cooked_dir); + if (checkProblemticPathJava(QDir(cooked_dir))) + { + QMessageBox warning; + warning.setText(tr("You're trying to specify an instance folder which\'s path " + "contains at least one \'!\'. " + "Java is known to cause problems if that is the case, your " + "instances (probably) won't start!")); + warning.setInformativeText( + tr("Do you really want to use this path? " + "Selecting \"No\" will close this and not alter your instance path.")); + warning.setStandardButtons(QMessageBox::Yes | QMessageBox::No); + int result = warning.exec(); + if (result == QMessageBox::Yes) + { + ui->instDirTextBox->setText(cooked_dir); + } + } + else + { + ui->instDirTextBox->setText(cooked_dir); + } } } + void MultiMCPage::on_iconsDirBrowseBtn_clicked() { QString raw_dir = QFileDialog::getExistingDirectory(this, tr("Icons Directory"), diff --git a/main.cpp b/main.cpp index 618e6745..988649e5 100644 --- a/main.cpp +++ b/main.cpp @@ -17,6 +17,7 @@ int main_gui(MultiMC &app) mainWin.show(); mainWin.checkMigrateLegacyAssets(); mainWin.checkSetDefaultJava(); + mainWin.checkInstancePathForProblems(); return app.exec(); }