summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLoetkolben <sirloetkolben@gmail.com>2014-07-27 15:50:03 +0200
committerJan Dalheimer <jan@dalheimer.de>2014-07-30 21:40:18 +0200
commitc0254d9a75a1f0f784a3e9b6874475b2c2a3ab8f (patch)
tree113e3561122c70b51e97b530c8055bdf91533cb8
parente5b393318fb2a143c9520928dd45c697af68f498 (diff)
downloadMultiMC-c0254d9a75a1f0f784a3e9b6874475b2c2a3ab8f.tar
MultiMC-c0254d9a75a1f0f784a3e9b6874475b2c2a3ab8f.tar.gz
MultiMC-c0254d9a75a1f0f784a3e9b6874475b2c2a3ab8f.tar.lz
MultiMC-c0254d9a75a1f0f784a3e9b6874475b2c2a3ab8f.tar.xz
MultiMC-c0254d9a75a1f0f784a3e9b6874475b2c2a3ab8f.zip
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.
-rw-r--r--MultiMC.cpp107
-rw-r--r--depends/util/include/pathutils.h4
-rw-r--r--depends/util/src/pathutils.cpp8
-rw-r--r--gui/MainWindow.cpp18
-rw-r--r--gui/MainWindow.h1
-rw-r--r--gui/pages/global/MultiMCPage.cpp29
-rw-r--r--main.cpp1
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<BaseDetachedToolFactory>(new MCEditFactory()));
+ m_tools.insert("mcedit", std::shared_ptr<BaseDetachedToolFactory>(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<URNResolver> 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 <QString>
+#include <QDir>
#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: <br/>"
+ " - ignore this warning <br/>"
+ " - change the instance dir in the settings <br/>"
+ " - 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();
}