diff options
author | Sky <git@bunnies.cc> | 2013-10-21 18:24:29 +0100 |
---|---|---|
committer | Sky <git@bunnies.cc> | 2013-10-21 18:24:29 +0100 |
commit | aaf6fe894406ab8aa814de83692504493060e303 (patch) | |
tree | a7ac3a60534322f70cbdc34111228885e0606691 /MultiMC.cpp | |
parent | 6892c11e9f287dcfb1e698f8f46233a01fb7abb6 (diff) | |
parent | 11813a0621dd7b500c2d7966a2671c0ab93be692 (diff) | |
download | MultiMC-aaf6fe894406ab8aa814de83692504493060e303.tar MultiMC-aaf6fe894406ab8aa814de83692504493060e303.tar.gz MultiMC-aaf6fe894406ab8aa814de83692504493060e303.tar.lz MultiMC-aaf6fe894406ab8aa814de83692504493060e303.tar.xz MultiMC-aaf6fe894406ab8aa814de83692504493060e303.zip |
Merge branch 'develop'
Diffstat (limited to 'MultiMC.cpp')
-rw-r--r-- | MultiMC.cpp | 262 |
1 files changed, 204 insertions, 58 deletions
diff --git a/MultiMC.cpp b/MultiMC.cpp index 88eb3e62..25c53185 100644 --- a/MultiMC.cpp +++ b/MultiMC.cpp @@ -3,36 +3,49 @@ #include <iostream> #include <QDir> #include <QNetworkAccessManager> +#include <QTranslator> +#include <QLibraryInfo> +#include <QMessageBox> #include "gui/mainwindow.h" +#include "gui/versionselectdialog.h" #include "logic/lists/InstanceList.h" #include "logic/lists/IconList.h" +#include "logic/lists/LwjglVersionList.h" +#include "logic/lists/MinecraftVersionList.h" +#include "logic/lists/ForgeVersionList.h" + #include "logic/InstanceLauncher.h" +#include "logic/net/HttpMetaCache.h" +#include "logic/JavaUtils.h" #include "pathutils.h" #include "cmdutils.h" #include <inisettingsobject.h> #include <setting.h> +#include <logger/QsLog.h> +#include <logger/QsLogDest.h> #include "config.h" using namespace Util::Commandline; -MultiMC::MultiMC ( int& argc, char** argv ) - :QApplication ( argc, argv ) +MultiMC::MultiMC(int &argc, char **argv) : QApplication(argc, argv) { - setOrganizationName("Forkk"); - setApplicationName("MultiMC 5"); - + setOrganizationName("MultiMC"); + setApplicationName("MultiMC5"); + + initTranslations(); + // Print app header std::cout << "MultiMC 5" << std::endl; std::cout << "(c) 2013 MultiMC Contributors" << std::endl << std::endl; - + // Commandline parsing QHash<QString, QVariant> args; { Parser parser(FlagStyle::GNU, ArgumentStyle::SpaceAndEquals); - + // --help parser.addSwitch("help"); parser.addShortOpt("help", 'h'); @@ -44,33 +57,37 @@ MultiMC::MultiMC ( int& argc, char** argv ) // --dir parser.addOption("dir", applicationDirPath()); parser.addShortOpt("dir", 'd'); - parser.addDocumentation("dir", "use the supplied directory as MultiMC root instead of the binary location (use '.' for current)"); + parser.addDocumentation("dir", "use the supplied directory as MultiMC root instead of " + "the binary location (use '.' for current)"); // --update parser.addOption("update"); parser.addShortOpt("update", 'u'); - parser.addDocumentation("update", "replaces the given file with the running executable", "<path>"); + parser.addDocumentation("update", "replaces the given file with the running executable", + "<path>"); // --quietupdate parser.addSwitch("quietupdate"); parser.addShortOpt("quietupdate", 'U'); - parser.addDocumentation("quietupdate", "doesn't restart MultiMC after installing updates"); + parser.addDocumentation("quietupdate", + "doesn't restart MultiMC after installing updates"); // --launch parser.addOption("launch"); parser.addShortOpt("launch", 'l'); parser.addDocumentation("launch", "tries to launch the given instance", "<inst>"); - + // parse the arguments try { args = parser.parse(arguments()); } - catch(ParsingError e) + catch (ParsingError e) { std::cerr << "CommandLineError: " << e.what() << std::endl; - std::cerr << "Try '%1 -h' to get help on MultiMC's command line parameters." << std::endl; + std::cerr << "Try '%1 -h' to get help on MultiMC's command line parameters." + << std::endl; m_status = MultiMC::Failed; return; } - + // display help and exit if (args["help"].toBool()) { @@ -78,27 +95,29 @@ MultiMC::MultiMC ( int& argc, char** argv ) m_status = MultiMC::Succeeded; return; } - + // display version and exit if (args["version"].toBool()) { std::cout << "Version " << VERSION_STR << std::endl; std::cout << "Git " << GIT_COMMIT << std::endl; - std::cout << "Tag: " << JENKINS_BUILD_TAG << " " << (ARCH==x64?"x86_64":"x86") << std::endl; + std::cout << "Tag: " << JENKINS_BUILD_TAG << " " << (ARCH == x64 ? "x86_64" : "x86") + << std::endl; m_status = MultiMC::Succeeded; return; } - + // update // Note: cwd is always the current executable path! if (!args["update"].isNull()) { - std::cout << "Performing MultiMC update: " << qPrintable(args["update"].toString()) << std::endl; + std::cout << "Performing MultiMC update: " << qPrintable(args["update"].toString()) + << std::endl; QString cwd = QDir::currentPath(); QDir::setCurrent(applicationDirPath()); QFile file(applicationFilePath()); file.copy(args["update"].toString()); - if(args["quietupdate"].toBool()) + if (args["quietupdate"].toBool()) { m_status = MultiMC::Succeeded; return; @@ -106,26 +125,34 @@ MultiMC::MultiMC ( int& argc, char** argv ) QDir::setCurrent(cwd); } } - + // change directory QDir::setCurrent(args["dir"].toString()); - + + // init the logger + initLogger(); + // load settings initGlobalSettings(); + // and instances - m_instances = new InstanceList(m_settings->get("InstanceDir").toString(),this); - std::cout << "Loading Instances..." << std::endl; + m_instances.reset(new InstanceList(m_settings->get("InstanceDir").toString(), this)); + QLOG_INFO() << "Loading Instances..."; m_instances->loadList(); - // network manager - m_qnam = new QNetworkAccessManager(this); - + + // init the http meta cache + initHttpMetaCache(); + + // create the global network manager + m_qnam.reset(new QNetworkAccessManager(this)); + // Register meta types. qRegisterMetaType<LoginResponse>("LoginResponse"); - + // launch instance, if that's what should be done if (!args["launch"].isNull()) { - if(InstanceLauncher(args["launch"].toString()).launch()) + if (InstanceLauncher(args["launch"].toString()).launch()) m_status = MultiMC::Succeeded; else m_status = MultiMC::Failed; @@ -136,87 +163,206 @@ MultiMC::MultiMC ( int& argc, char** argv ) MultiMC::~MultiMC() { - delete m_settings; + if (m_mmc_translator) + { + removeTranslator(m_mmc_translator.get()); + } + if (m_qt_translator) + { + removeTranslator(m_qt_translator.get()); + } +} + +void MultiMC::initTranslations() +{ + m_qt_translator.reset(new QTranslator()); + if (m_qt_translator->load("qt_" + QLocale::system().name(), + QLibraryInfo::location(QLibraryInfo::TranslationsPath))) + { + std::cout << "Loading Qt Language File for " + << QLocale::system().name().toLocal8Bit().constData() << "..."; + if (!installTranslator(m_qt_translator.get())) + { + std::cout << " failed."; + m_qt_translator.reset(); + } + std::cout << std::endl; + } + else + { + m_qt_translator.reset(); + } + + m_mmc_translator.reset(new QTranslator()); + if (m_mmc_translator->load("mmc_" + QLocale::system().name(), + QDir("translations").absolutePath())) + { + std::cout << "Loading MMC Language File for " + << QLocale::system().name().toLocal8Bit().constData() << "..."; + if (!installTranslator(m_mmc_translator.get())) + { + std::cout << " failed."; + m_mmc_translator.reset(); + } + std::cout << std::endl; + } + else + { + m_mmc_translator.reset(); + } +} + +void MultiMC::initLogger() +{ + // init the logging mechanism + QsLogging::Logger &logger = QsLogging::Logger::instance(); + logger.setLoggingLevel(QsLogging::TraceLevel); + m_fileDestination = QsLogging::DestinationFactory::MakeFileDestination("MultiMC.log"); + m_debugDestination = QsLogging::DestinationFactory::MakeDebugOutputDestination(); + logger.addDestination(m_fileDestination.get()); + logger.addDestination(m_debugDestination.get()); + // log all the things + logger.setLoggingLevel(QsLogging::TraceLevel); } void MultiMC::initGlobalSettings() { - m_settings = new INISettingsObject(applicationDirPath() + "/multimc.cfg", this); - // Updates + m_settings.reset(new INISettingsObject("multimc.cfg", this)); + // Updates m_settings->registerSetting(new Setting("UseDevBuilds", false)); m_settings->registerSetting(new Setting("AutoUpdate", true)); - + // Folders m_settings->registerSetting(new Setting("InstanceDir", "instances")); m_settings->registerSetting(new Setting("CentralModsDir", "mods")); m_settings->registerSetting(new Setting("LWJGLDir", "lwjgl")); - + // Console m_settings->registerSetting(new Setting("ShowConsole", true)); m_settings->registerSetting(new Setting("AutoCloseConsole", true)); - + // Toolbar settings m_settings->registerSetting(new Setting("InstanceToolbarVisible", true)); m_settings->registerSetting(new Setting("InstanceToolbarPosition", QPoint())); - + // Console Colors -// m_settings->registerSetting(new Setting("SysMessageColor", QColor(Qt::blue))); -// m_settings->registerSetting(new Setting("StdOutColor", QColor(Qt::black))); -// m_settings->registerSetting(new Setting("StdErrColor", QColor(Qt::red))); - + // m_settings->registerSetting(new Setting("SysMessageColor", QColor(Qt::blue))); + // m_settings->registerSetting(new Setting("StdOutColor", QColor(Qt::black))); + // m_settings->registerSetting(new Setting("StdErrColor", QColor(Qt::red))); + // Window Size m_settings->registerSetting(new Setting("LaunchMaximized", false)); m_settings->registerSetting(new Setting("MinecraftWinWidth", 854)); m_settings->registerSetting(new Setting("MinecraftWinHeight", 480)); - + // Auto login m_settings->registerSetting(new Setting("AutoLogin", false)); - + // Memory m_settings->registerSetting(new Setting("MinMemAlloc", 512)); m_settings->registerSetting(new Setting("MaxMemAlloc", 1024)); m_settings->registerSetting(new Setting("PermGen", 64)); - + // Java Settings - m_settings->registerSetting(new Setting("JavaPath", "java")); + m_settings->registerSetting(new Setting("JavaPath", "")); + m_settings->registerSetting(new Setting("LastHostname", "")); m_settings->registerSetting(new Setting("JvmArgs", "")); - + // Custom Commands m_settings->registerSetting(new Setting("PreLaunchCommand", "")); m_settings->registerSetting(new Setting("PostExitCommand", "")); - + // The cat m_settings->registerSetting(new Setting("TheCat", false)); + + // Shall the main window hide on instance launch + m_settings->registerSetting(new Setting("NoHide", false)); + + // Persistent value for the client ID + m_settings->registerSetting(new Setting("YggdrasilClientToken", "")); + QString currentYggID = m_settings->get("YggdrasilClientToken").toString(); + if (currentYggID.isEmpty()) + { + QUuid uuid = QUuid::createUuid(); + m_settings->set("YggdrasilClientToken", uuid.toString()); + } } -IconList* MultiMC::icons() +void MultiMC::initHttpMetaCache() { - if ( !m_icons ) + m_metacache.reset(new HttpMetaCache("metacache")); + m_metacache->addBase("assets", QDir("assets").absolutePath()); + m_metacache->addBase("versions", QDir("versions").absolutePath()); + m_metacache->addBase("libraries", QDir("libraries").absolutePath()); + m_metacache->addBase("minecraftforge", QDir("mods/minecraftforge").absolutePath()); + m_metacache->addBase("skins", QDir("accounts/skins").absolutePath()); + m_metacache->Load(); +} + +std::shared_ptr<IconList> MultiMC::icons() +{ + if (!m_icons) { - m_icons = new IconList; + m_icons.reset(new IconList); } return m_icons; } +std::shared_ptr<LWJGLVersionList> MultiMC::lwjgllist() +{ + if (!m_lwjgllist) + { + m_lwjgllist.reset(new LWJGLVersionList()); + } + return m_lwjgllist; +} + +std::shared_ptr<ForgeVersionList> MultiMC::forgelist() +{ + if (!m_forgelist) + { + m_forgelist.reset(new ForgeVersionList()); + } + return m_forgelist; +} + +std::shared_ptr<MinecraftVersionList> MultiMC::minecraftlist() +{ + if (!m_minecraftlist) + { + m_minecraftlist.reset(new MinecraftVersionList()); + } + return m_minecraftlist; +} + +std::shared_ptr<JavaVersionList> MultiMC::javalist() +{ + if (!m_javalist) + { + m_javalist.reset(new JavaVersionList()); + } + return m_javalist; +} int main(int argc, char *argv[]) { // initialize Qt MultiMC app(argc, argv); - + // show main window MainWindow mainWin; mainWin.show(); - - switch(app.status()) + mainWin.checkSetDefaultJava(); + + switch (app.status()) { - case MultiMC::Initialized: - return app.exec(); - case MultiMC::Failed: - return 1; - case MultiMC::Succeeded: - return 0; + case MultiMC::Initialized: + return app.exec(); + case MultiMC::Failed: + return 1; + case MultiMC::Succeeded: + return 0; } } -#include "MultiMC.moc"
\ No newline at end of file +#include "MultiMC.moc" |