2013-09-07 07:30:58 +05:30
# include "MultiMC.h"
2014-04-06 07:29:37 +05:30
# include "BuildConfig.h"
2014-04-06 02:28:47 +05:30
2013-09-07 07:30:58 +05:30
# include <iostream>
# include <QDir>
2013-12-07 00:29:58 +05:30
# include <QFileInfo>
2013-09-07 07:30:58 +05:30
# include <QNetworkAccessManager>
2013-09-09 03:13:19 +05:30
# include <QTranslator>
# include <QLibraryInfo>
2013-10-14 07:29:21 +05:30
# include <QMessageBox>
2013-12-07 00:29:58 +05:30
# include <QStringList>
2013-12-29 22:21:16 +05:30
# include <QDesktopServices>
2013-09-07 07:30:58 +05:30
2013-11-04 07:23:05 +05:30
# include "gui/dialogs/VersionSelectDialog.h"
2014-05-09 00:50:10 +05:30
# include "logic/InstanceList.h"
2013-12-13 07:17:59 +05:30
# include "logic/auth/MojangAccountList.h"
2013-12-31 05:54:28 +05:30
# include "logic/icons/IconList.h"
2014-05-09 00:50:10 +05:30
# include "logic/LwjglVersionList.h"
# include "logic/minecraft/MinecraftVersionList.h"
2014-04-23 05:57:40 +05:30
# include "logic/liteloader/LiteLoaderVersionList.h"
# include "logic/forge/ForgeVersionList.h"
2013-09-16 04:24:39 +05:30
2013-12-16 02:18:58 +05:30
# include "logic/news/NewsChecker.h"
2014-01-12 23:58:42 +05:30
# include "logic/status/StatusChecker.h"
2013-09-07 07:30:58 +05:30
# include "logic/InstanceLauncher.h"
2013-09-08 05:45:20 +05:30
# include "logic/net/HttpMetaCache.h"
2014-01-12 23:58:42 +05:30
# include "logic/net/URLConstants.h"
2013-09-07 07:30:58 +05:30
2014-05-09 00:50:10 +05:30
# include "logic/java/JavaUtils.h"
2013-10-07 04:14:34 +05:30
2013-12-05 00:04:12 +05:30
# include "logic/updater/UpdateChecker.h"
2014-01-03 23:49:27 +05:30
# include "logic/updater/NotificationChecker.h"
2013-10-07 04:14:34 +05:30
2014-02-16 17:22:35 +05:30
# include "logic/tools/JProfiler.h"
# include "logic/tools/JVisualVM.h"
# include "logic/tools/MCEditTool.h"
2014-02-15 18:49:35 +05:30
2014-05-05 03:40:59 +05:30
# include "logic/URNResolver.h"
2013-09-07 07:30:58 +05:30
# include "pathutils.h"
# include "cmdutils.h"
# include <inisettingsobject.h>
# include <setting.h>
2013-11-04 07:23:05 +05:30
# include "logger/QsLog.h"
2013-10-06 04:43:40 +05:30
# include <logger/QsLogDest.h>
2013-09-07 07:30:58 +05:30
2014-03-06 02:50:45 +05:30
# ifdef Q_OS_WIN32
2014-03-06 03:05:35 +05:30
# include <windows.h>
static const int APPDATA_BUFFER_SIZE = 1024 ;
2014-03-06 02:50:45 +05:30
# endif
2013-09-07 07:30:58 +05:30
using namespace Util : : Commandline ;
2014-01-05 21:17:12 +05:30
MultiMC : : MultiMC ( int & argc , char * * argv , bool root_override )
2014-04-06 02:28:47 +05:30
: QApplication ( argc , argv )
2013-09-07 07:30:58 +05:30
{
2013-10-29 01:25:12 +05:30
setOrganizationName ( " MultiMC " ) ;
setApplicationName ( " MultiMC5 " ) ;
2013-09-23 03:53:50 +05:30
2014-01-01 20:12:43 +05:30
setAttribute ( Qt : : AA_UseHighDpiPixmaps ) ;
2013-10-26 13:08:21 +05:30
// Don't quit on hiding the last window
this - > setQuitOnLastWindowClosed ( false ) ;
2013-09-07 07:30:58 +05:30
// Commandline parsing
QHash < QString , QVariant > args ;
{
Parser parser ( FlagStyle : : GNU , ArgumentStyle : : SpaceAndEquals ) ;
2013-09-23 03:53:50 +05:30
2013-09-07 07:30:58 +05:30
// --help
parser . addSwitch ( " help " ) ;
parser . addShortOpt ( " help " , ' h ' ) ;
parser . addDocumentation ( " help " , " display this help and exit. " ) ;
// --version
parser . addSwitch ( " version " ) ;
parser . addShortOpt ( " version " , ' V ' ) ;
parser . addDocumentation ( " version " , " display program version and exit. " ) ;
// --dir
parser . addOption ( " dir " , applicationDirPath ( ) ) ;
parser . addShortOpt ( " dir " , ' d ' ) ;
2013-09-23 03:53:50 +05:30
parser . addDocumentation ( " dir " , " use the supplied directory as MultiMC root instead of "
" the binary location (use '.' for current) " ) ;
2013-12-13 07:17:59 +05:30
// WARNING: disabled until further notice
/*
2013-09-07 07:30:58 +05:30
// --launch
parser . addOption ( " launch " ) ;
parser . addShortOpt ( " launch " , ' l ' ) ;
parser . addDocumentation ( " launch " , " tries to launch the given instance " , " <inst> " ) ;
2013-12-13 07:17:59 +05:30
*/
2014-05-22 11:19:45 +05:30
2013-09-07 07:30:58 +05:30
// parse the arguments
try
{
args = parser . parse ( arguments ( ) ) ;
}
2013-09-23 03:53:50 +05:30
catch ( ParsingError e )
2013-09-07 07:30:58 +05:30
{
std : : cerr < < " CommandLineError: " < < e . what ( ) < < std : : endl ;
2013-09-23 03:53:50 +05:30
std : : cerr < < " Try '%1 -h' to get help on MultiMC's command line parameters. "
< < std : : endl ;
2013-09-07 07:30:58 +05:30
m_status = MultiMC : : Failed ;
return ;
}
2013-09-23 03:53:50 +05:30
2013-09-07 07:30:58 +05:30
// display help and exit
if ( args [ " help " ] . toBool ( ) )
{
std : : cout < < qPrintable ( parser . compileHelp ( arguments ( ) [ 0 ] ) ) ;
m_status = MultiMC : : Succeeded ;
return ;
}
2013-09-23 03:53:50 +05:30
2013-09-07 07:30:58 +05:30
// display version and exit
if ( args [ " version " ] . toBool ( ) )
{
2014-04-06 02:28:47 +05:30
std : : cout < < " Version " < < BuildConfig . VERSION_STR . toStdString ( ) < < std : : endl ;
std : : cout < < " Git " < < BuildConfig . GIT_COMMIT . toStdString ( ) < < std : : endl ;
2013-09-07 07:30:58 +05:30
m_status = MultiMC : : Succeeded ;
return ;
}
}
2014-01-03 06:59:05 +05:30
origcwdPath = QDir : : currentPath ( ) ;
binPath = applicationDirPath ( ) ;
QString adjustedBy ;
2013-09-07 07:30:58 +05:30
// change directory
2014-01-03 06:59:05 +05:30
QString dirParam = args [ " dir " ] . toString ( ) ;
2014-01-05 21:17:12 +05:30
if ( ! dirParam . isEmpty ( ) )
2014-01-03 06:59:05 +05:30
{
// the dir param. it makes multimc data path point to whatever the user specified
// on command line
adjustedBy + = " Command line " + dirParam ;
dataPath = dirParam ;
}
2014-01-05 04:36:55 +05:30
else
{
dataPath = applicationDirPath ( ) ;
adjustedBy + = " Fallback to binary path " + dataPath ;
}
2014-01-05 21:17:12 +05:30
2014-01-03 06:59:05 +05:30
if ( ! ensureFolderPathExists ( dataPath ) | | ! QDir : : setCurrent ( dataPath ) )
{
// BAD STUFF. WHAT DO?
initLogger ( ) ;
QLOG_ERROR ( ) < < " Failed to set work path. Will exit. NOW. " ;
m_status = MultiMC : : Failed ;
return ;
}
2014-01-05 21:17:12 +05:30
if ( root_override )
{
rootPath = binPath ;
}
else
2014-01-03 06:59:05 +05:30
{
# ifdef Q_OS_LINUX
QDir foo ( PathCombine ( binPath , " .. " ) ) ;
rootPath = foo . absolutePath ( ) ;
# elif defined(Q_OS_WIN32)
2014-01-05 04:36:55 +05:30
rootPath = binPath ;
2014-01-03 06:59:05 +05:30
# elif defined(Q_OS_MAC)
QDir foo ( PathCombine ( binPath , " ../.. " ) ) ;
rootPath = foo . absolutePath ( ) ;
# endif
}
2013-09-23 03:53:50 +05:30
2014-05-17 21:51:32 +05:30
// 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
2013-10-06 04:43:40 +05:30
// init the logger
initLogger ( ) ;
2014-01-03 06:59:05 +05:30
QLOG_INFO ( ) < < " MultiMC 5, (c) 2013 MultiMC Contributors " ;
2014-04-06 02:28:47 +05:30
QLOG_INFO ( ) < < " Version : " < < BuildConfig . VERSION_STR ;
QLOG_INFO ( ) < < " Git commit : " < < BuildConfig . GIT_COMMIT ;
2014-01-03 06:59:05 +05:30
if ( adjustedBy . size ( ) )
{
QLOG_INFO ( ) < < " Work dir before adjustment : " < < origcwdPath ;
QLOG_INFO ( ) < < " Work dir after adjustment : " < < QDir : : currentPath ( ) ;
QLOG_INFO ( ) < < " Adjusted by : " < < adjustedBy ;
}
else
{
QLOG_INFO ( ) < < " Work dir : " < < QDir : : currentPath ( ) ;
}
QLOG_INFO ( ) < < " Binary path : " < < binPath ;
QLOG_INFO ( ) < < " Application root path : " < < rootPath ;
2014-05-17 21:51:32 +05:30
QLOG_INFO ( ) < < " Static data path : " < < staticDataPath ;
2014-01-03 06:59:05 +05:30
2013-09-07 07:30:58 +05:30
// load settings
initGlobalSettings ( ) ;
2013-09-23 03:53:50 +05:30
2014-01-04 20:43:28 +05:30
// load translations
initTranslations ( ) ;
2013-12-02 05:25:24 +05:30
// initialize the updater
2013-12-05 00:04:12 +05:30
m_updateChecker . reset ( new UpdateChecker ( ) ) ;
2013-12-02 05:25:24 +05:30
2014-01-03 23:49:27 +05:30
// initialize the notification checker
m_notificationChecker . reset ( new NotificationChecker ( ) ) ;
2013-12-16 02:18:58 +05:30
// initialize the news checker
2014-04-06 02:28:47 +05:30
m_newsChecker . reset ( new NewsChecker ( BuildConfig . NEWS_RSS_URL ) ) ;
2013-12-16 02:18:58 +05:30
2014-01-12 23:58:42 +05:30
// initialize the status checker
m_statusChecker . reset ( new StatusChecker ( ) ) ;
2013-09-07 07:30:58 +05:30
// and instances
2013-10-29 01:25:12 +05:30
auto InstDirSetting = m_settings - > getSetting ( " InstanceDir " ) ;
m_instances . reset ( new InstanceList ( InstDirSetting - > get ( ) . toString ( ) , this ) ) ;
2013-10-06 06:37:57 +05:30
QLOG_INFO ( ) < < " Loading Instances... " ;
2013-09-07 07:30:58 +05:30
m_instances - > loadList ( ) ;
2014-01-01 19:38:40 +05:30
connect ( InstDirSetting . get ( ) , SIGNAL ( settingChanged ( const Setting & , QVariant ) ) ,
2013-10-29 01:25:12 +05:30
m_instances . get ( ) , SLOT ( on_InstFolderChanged ( const Setting & , QVariant ) ) ) ;
2013-09-23 03:53:50 +05:30
2013-11-19 00:28:03 +05:30
// and accounts
m_accounts . reset ( new MojangAccountList ( this ) ) ;
QLOG_INFO ( ) < < " Loading accounts... " ;
2013-11-20 00:23:30 +05:30
m_accounts - > setListFilePath ( " accounts.json " , true ) ;
2013-11-19 00:28:03 +05:30
m_accounts - > loadList ( ) ;
2013-09-08 05:45:20 +05:30
// init the http meta cache
initHttpMetaCache ( ) ;
2013-09-23 03:53:50 +05:30
2013-09-08 05:45:20 +05:30
// create the global network manager
2013-09-22 07:51:36 +05:30
m_qnam . reset ( new QNetworkAccessManager ( this ) ) ;
2013-09-23 03:53:50 +05:30
2014-01-07 02:32:58 +05:30
// init proxy settings
updateProxySettings ( ) ;
2014-02-15 18:49:35 +05:30
m_profilers . insert ( " jprofiler " ,
std : : shared_ptr < BaseProfilerFactory > ( new JProfilerFactory ( ) ) ) ;
m_profilers . insert ( " jvisualvm " ,
std : : shared_ptr < BaseProfilerFactory > ( new JVisualVMFactory ( ) ) ) ;
for ( auto profiler : m_profilers . values ( ) )
{
profiler - > registerSettings ( m_settings . get ( ) ) ;
}
2014-02-16 15:16:14 +05:30
m_tools . insert ( " mcedit " ,
std : : shared_ptr < BaseDetachedToolFactory > ( new MCEditFactory ( ) ) ) ;
for ( auto tool : m_tools . values ( ) )
{
tool - > registerSettings ( m_settings . get ( ) ) ;
}
2014-02-15 18:49:35 +05:30
2013-09-07 07:30:58 +05:30
// launch instance, if that's what should be done
2013-12-13 07:17:59 +05:30
// WARNING: disabled until further notice
/*
2013-09-07 07:30:58 +05:30
if ( ! args [ " launch " ] . isNull ( ) )
{
2013-09-23 03:53:50 +05:30
if ( InstanceLauncher ( args [ " launch " ] . toString ( ) ) . launch ( ) )
2013-09-07 07:30:58 +05:30
m_status = MultiMC : : Succeeded ;
else
m_status = MultiMC : : Failed ;
return ;
}
2013-12-13 07:17:59 +05:30
*/
2014-01-05 17:47:42 +05:30
connect ( this , SIGNAL ( aboutToQuit ( ) ) , SLOT ( onExit ( ) ) ) ;
2013-09-07 07:30:58 +05:30
m_status = MultiMC : : Initialized ;
}
MultiMC : : ~ MultiMC ( )
{
2013-09-23 03:53:50 +05:30
if ( m_mmc_translator )
2013-09-09 04:50:17 +05:30
{
2013-10-06 04:43:40 +05:30
removeTranslator ( m_mmc_translator . get ( ) ) ;
2013-09-09 04:50:17 +05:30
}
2013-09-23 03:53:50 +05:30
if ( m_qt_translator )
2013-09-09 04:50:17 +05:30
{
2013-10-06 04:43:40 +05:30
removeTranslator ( m_qt_translator . get ( ) ) ;
2013-09-09 04:50:17 +05:30
}
2013-09-07 07:30:58 +05:30
}
2013-09-09 04:50:17 +05:30
void MultiMC : : initTranslations ( )
{
2014-01-04 20:43:28 +05:30
QLocale locale ( m_settings - > get ( " Language " ) . toString ( ) ) ;
QLocale : : setDefault ( locale ) ;
QLOG_INFO ( ) < < " Your language is " < < locale . bcp47Name ( ) ;
2013-09-22 07:51:36 +05:30
m_qt_translator . reset ( new QTranslator ( ) ) ;
2014-01-04 20:43:28 +05:30
if ( m_qt_translator - > load ( " qt_ " + locale . bcp47Name ( ) ,
2013-09-23 03:53:50 +05:30
QLibraryInfo : : location ( QLibraryInfo : : TranslationsPath ) ) )
2013-09-09 04:50:17 +05:30
{
2014-01-04 20:43:28 +05:30
QLOG_DEBUG ( ) < < " Loading Qt Language File for "
< < locale . bcp47Name ( ) . toLocal8Bit ( ) . constData ( ) < < " ... " ;
2013-10-06 04:43:40 +05:30
if ( ! installTranslator ( m_qt_translator . get ( ) ) )
2013-09-09 04:50:17 +05:30
{
2014-01-04 20:43:28 +05:30
QLOG_ERROR ( ) < < " Loading Qt Language File failed. " ;
2013-09-22 07:51:36 +05:30
m_qt_translator . reset ( ) ;
2013-09-09 04:50:17 +05:30
}
}
else
{
2013-09-22 07:51:36 +05:30
m_qt_translator . reset ( ) ;
2013-09-09 04:50:17 +05:30
}
2013-09-22 07:51:36 +05:30
m_mmc_translator . reset ( new QTranslator ( ) ) ;
2014-05-17 21:51:32 +05:30
if ( m_mmc_translator - > load ( " mmc_ " + locale . bcp47Name ( ) ,
MMC - > staticData ( ) + " /translations " ) )
2013-09-09 04:50:17 +05:30
{
2014-01-04 20:43:28 +05:30
QLOG_DEBUG ( ) < < " Loading MMC Language File for "
< < locale . bcp47Name ( ) . toLocal8Bit ( ) . constData ( ) < < " ... " ;
2013-10-06 04:43:40 +05:30
if ( ! installTranslator ( m_mmc_translator . get ( ) ) )
2013-09-09 04:50:17 +05:30
{
2014-01-04 20:43:28 +05:30
QLOG_ERROR ( ) < < " Loading MMC Language File failed. " ;
2013-09-22 07:51:36 +05:30
m_mmc_translator . reset ( ) ;
2013-09-09 04:50:17 +05:30
}
}
else
{
2013-09-22 07:51:36 +05:30
m_mmc_translator . reset ( ) ;
2013-09-09 04:50:17 +05:30
}
}
2013-12-21 15:35:44 +05:30
void moveFile ( const QString & oldName , const QString & newName )
{
QFile : : remove ( newName ) ;
QFile : : copy ( oldName , newName ) ;
QFile : : remove ( oldName ) ;
}
2013-10-06 04:43:40 +05:30
void MultiMC : : initLogger ( )
{
2013-12-21 15:35:44 +05:30
static const QString logBase = " MultiMC-%0.log " ;
moveFile ( logBase . arg ( 3 ) , logBase . arg ( 4 ) ) ;
moveFile ( logBase . arg ( 2 ) , logBase . arg ( 3 ) ) ;
moveFile ( logBase . arg ( 1 ) , logBase . arg ( 2 ) ) ;
moveFile ( logBase . arg ( 0 ) , logBase . arg ( 1 ) ) ;
2013-10-06 04:43:40 +05:30
// init the logging mechanism
QsLogging : : Logger & logger = QsLogging : : Logger : : instance ( ) ;
logger . setLoggingLevel ( QsLogging : : TraceLevel ) ;
2013-12-21 15:35:44 +05:30
m_fileDestination = QsLogging : : DestinationFactory : : MakeFileDestination ( logBase . arg ( 0 ) ) ;
2014-05-13 02:57:50 +05:30
m_debugDestination = QsLogging : : DestinationFactory : : MakeDebugOutputDestination ( ) ;
2013-10-06 04:43:40 +05:30
logger . addDestination ( m_fileDestination . get ( ) ) ;
logger . addDestination ( m_debugDestination . get ( ) ) ;
// log all the things
logger . setLoggingLevel ( QsLogging : : TraceLevel ) ;
2014-05-10 04:03:32 +05:30
loggerInitialized = true ;
2013-10-06 04:43:40 +05:30
}
2014-05-10 04:03:32 +05:30
bool loggerInitialized = false ;
2013-09-07 07:30:58 +05:30
void MultiMC : : initGlobalSettings ( )
{
2013-09-22 07:51:36 +05:30
m_settings . reset ( new INISettingsObject ( " multimc.cfg " , this ) ) ;
2013-09-23 03:53:50 +05:30
// Updates
2014-04-06 02:28:47 +05:30
m_settings - > registerSetting ( " UpdateChannel " , BuildConfig . VERSION_CHANNEL ) ;
2014-01-01 19:38:40 +05:30
m_settings - > registerSetting ( " AutoUpdate " , true ) ;
2014-02-14 02:30:51 +05:30
2014-01-05 07:16:47 +05:30
// Notifications
2014-01-03 23:49:27 +05:30
m_settings - > registerSetting ( " ShownNotifications " , QString ( ) ) ;
2013-09-23 03:53:50 +05:30
2013-12-20 19:17:26 +05:30
// FTB
2014-01-01 19:38:40 +05:30
m_settings - > registerSetting ( " TrackFTBInstances " , false ) ;
2014-05-23 21:49:20 +05:30
QString ftbDataDefault ;
2013-12-22 09:01:30 +05:30
# ifdef Q_OS_LINUX
2014-05-23 21:49:20 +05:30
QString ftbDefault = ftbDataDefault = QDir : : home ( ) . absoluteFilePath ( " .ftblauncher " ) ;
2013-12-22 09:01:30 +05:30
# elif defined(Q_OS_WIN32)
2014-03-06 03:05:35 +05:30
wchar_t buf [ APPDATA_BUFFER_SIZE ] ;
2014-05-22 11:19:45 +05:30
wchar_t newBuf [ APPDATA_BUFFER_SIZE ] ;
2014-05-23 19:16:12 +05:30
QString ftbDefault , newFtbDefault , oldFtbDefault ;
2014-05-22 11:19:45 +05:30
if ( ! GetEnvironmentVariableW ( L " LOCALAPPDATA " , newBuf , APPDATA_BUFFER_SIZE ) )
2014-03-06 02:50:45 +05:30
{
2014-05-22 11:19:45 +05:30
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???? " ;
2014-03-06 02:57:18 +05:30
}
else
{
2014-05-23 20:09:14 +05:30
newFtbDefault = QDir ( QString : : fromWCharArray ( newBuf ) ) . absoluteFilePath ( " ftblauncher " ) ;
2014-05-22 11:19:45 +05:30
}
2014-05-23 21:49:20 +05:30
if ( ! GetEnvironmentVariableW ( L " APPDATA " , buf , APPDATA_BUFFER_SIZE ) )
2014-05-22 11:19:45 +05:30
{
2014-05-23 21:49:20 +05:30
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???? " ;
2014-05-22 11:19:45 +05:30
}
2014-05-23 19:16:12 +05:30
else
{
2014-05-23 21:49:20 +05:30
oldFtbDefault = QDir ( QString : : fromWCharArray ( buf ) ) . absoluteFilePath ( " ftblauncher " ) ;
2014-05-23 19:16:12 +05:30
}
2014-05-23 21:49:20 +05:30
if ( QFile : : exists ( QDir ( newFtbDefault ) . absoluteFilePath ( " ftblaunch.cfg " ) ) )
2014-05-22 11:19:45 +05:30
{
2014-05-23 21:49:20 +05:30
QLOG_INFO ( ) < < " Old FTB setup " ;
ftbDefault = ftbDataDefault = oldFtbDefault ;
}
else
{
QLOG_INFO ( ) < < " New FTB setup " ;
ftbDefault = oldFtbDefault ;
ftbDataDefault = newFtbDefault ;
2014-03-06 02:50:45 +05:30
}
2013-12-22 09:01:30 +05:30
# elif defined(Q_OS_MAC)
2014-05-23 21:49:20 +05:30
QString ftbDefault = ftbDataDefault =
2014-05-23 19:16:12 +05:30
PathCombine ( QDir : : homePath ( ) , " Library/Application Support/ftblauncher " ) ;
2013-12-22 09:01:30 +05:30
# endif
2014-05-23 21:49:20 +05:30
m_settings - > registerSetting ( " FTBLauncherDataRoot " , ftbDataDefault ) ;
m_settings - > registerSetting ( " FTBLauncherRoot " , ftbDefault ) ;
2014-05-23 22:11:22 +05:30
QLOG_INFO ( ) < < " FTB Launcher paths: "
< < m_settings - > get ( " FTBLauncherDataRoot " ) . toString ( )
< < " and "
< < m_settings - > get ( " FTBLauncherRoot " ) . toString ( ) ;
2013-12-20 19:17:26 +05:30
2014-01-01 19:38:40 +05:30
m_settings - > registerSetting ( " FTBRoot " ) ;
2013-12-20 19:17:26 +05:30
if ( m_settings - > get ( " FTBRoot " ) . isNull ( ) )
{
QString ftbRoot ;
2013-12-22 09:01:30 +05:30
QFile f ( QDir ( m_settings - > get ( " FTBLauncherRoot " ) . toString ( ) )
2014-05-23 19:16:12 +05:30
. absoluteFilePath ( " ftblaunch.cfg " ) ) ;
2013-12-20 19:17:26 +05:30
QLOG_INFO ( ) < < " Attempting to read " < < f . fileName ( ) ;
if ( f . open ( QFile : : ReadOnly ) )
{
const QString data = QString : : fromLatin1 ( f . readAll ( ) ) ;
QRegularExpression exp ( " installPath=(.*) " ) ;
ftbRoot = QDir : : cleanPath ( exp . match ( data ) . captured ( 1 ) ) ;
# ifdef Q_OS_WIN32
if ( ! ftbRoot . isEmpty ( ) )
{
if ( ftbRoot . at ( 0 ) . isLetter ( ) & & ftbRoot . size ( ) > 1 & & ftbRoot . at ( 1 ) = = ' / ' )
{
ftbRoot . remove ( 1 , 1 ) ;
}
}
# endif
if ( ftbRoot . isEmpty ( ) )
{
QLOG_INFO ( ) < < " Failed to get FTB root path " ;
}
else
{
QLOG_INFO ( ) < < " FTB is installed at " < < ftbRoot ;
m_settings - > set ( " FTBRoot " , ftbRoot ) ;
}
}
else
{
QLOG_WARN ( ) < < " Couldn't open " < < f . fileName ( ) < < " : " < < f . errorString ( ) ;
QLOG_WARN ( ) < < " This is perfectly normal if you don't have FTB installed " ;
}
}
2013-09-23 03:53:50 +05:30
2013-09-07 07:30:58 +05:30
// Folders
2014-01-01 19:38:40 +05:30
m_settings - > registerSetting ( " InstanceDir " , " instances " ) ;
m_settings - > registerSetting ( { " CentralModsDir " , " ModsDir " } , " mods " ) ;
m_settings - > registerSetting ( { " LWJGLDir " , " LwjglDir " } , " lwjgl " ) ;
m_settings - > registerSetting ( " IconsDir " , " icons " ) ;
2013-09-23 03:53:50 +05:30
2013-12-29 22:21:16 +05:30
// Editors
2014-01-01 19:38:40 +05:30
m_settings - > registerSetting ( " JsonEditor " , QString ( ) ) ;
2013-09-23 03:53:50 +05:30
2014-01-04 20:43:28 +05:30
// Language
m_settings - > registerSetting ( " Language " , QLocale ( QLocale : : system ( ) . language ( ) ) . bcp47Name ( ) ) ;
2013-09-07 07:30:58 +05:30
// Console
2014-01-01 19:38:40 +05:30
m_settings - > registerSetting ( " ShowConsole " , true ) ;
2014-04-17 17:43:16 +05:30
m_settings - > registerSetting ( " RaiseConsole " , true ) ;
2014-01-01 19:38:40 +05:30
m_settings - > registerSetting ( " AutoCloseConsole " , true ) ;
2014-01-18 03:25:10 +05:30
m_settings - > registerSetting ( " LogPrePostOutput " , true ) ;
2013-09-23 03:53:50 +05:30
2013-09-07 07:30:58 +05:30
// Console Colors
2014-01-01 19:38:40 +05:30
// m_settings->registerSetting("SysMessageColor", QColor(Qt::blue));
// m_settings->registerSetting("StdOutColor", QColor(Qt::black));
// m_settings->registerSetting("StdErrColor", QColor(Qt::red));
2013-09-23 03:53:50 +05:30
2013-09-07 07:30:58 +05:30
// Window Size
2014-01-01 19:38:40 +05:30
m_settings - > registerSetting ( { " LaunchMaximized " , " MCWindowMaximize " } , false ) ;
m_settings - > registerSetting ( { " MinecraftWinWidth " , " MCWindowWidth " } , 854 ) ;
m_settings - > registerSetting ( { " MinecraftWinHeight " , " MCWindowHeight " } , 480 ) ;
2013-09-23 03:53:50 +05:30
2014-01-07 02:32:58 +05:30
// Proxy Settings
m_settings - > registerSetting ( " ProxyType " , " Default " ) ;
m_settings - > registerSetting ( { " ProxyAddr " , " ProxyHostName " } , " 127.0.0.1 " ) ;
m_settings - > registerSetting ( " ProxyPort " , 8080 ) ;
m_settings - > registerSetting ( { " ProxyUser " , " ProxyUsername " } , " " ) ;
m_settings - > registerSetting ( { " ProxyPass " , " ProxyPassword " } , " " ) ;
2013-09-07 07:30:58 +05:30
// Memory
2014-01-01 19:38:40 +05:30
m_settings - > registerSetting ( { " MinMemAlloc " , " MinMemoryAlloc " } , 512 ) ;
m_settings - > registerSetting ( { " MaxMemAlloc " , " MaxMemoryAlloc " } , 1024 ) ;
m_settings - > registerSetting ( " PermGen " , 64 ) ;
2013-09-23 03:53:50 +05:30
2013-09-07 07:30:58 +05:30
// Java Settings
2014-01-01 19:38:40 +05:30
m_settings - > registerSetting ( " JavaPath " , " " ) ;
m_settings - > registerSetting ( " LastHostname " , " " ) ;
m_settings - > registerSetting ( " JvmArgs " , " " ) ;
2013-09-23 03:53:50 +05:30
2013-09-07 07:30:58 +05:30
// Custom Commands
2014-01-01 19:38:40 +05:30
m_settings - > registerSetting ( { " PreLaunchCommand " , " PreLaunchCmd " } , " " ) ;
2014-01-01 20:47:49 +05:30
m_settings - > registerSetting ( { " PostExitCommand " , " PostExitCmd " } , " " ) ;
2013-09-23 03:53:50 +05:30
2013-09-07 07:30:58 +05:30
// The cat
2014-01-01 19:38:40 +05:30
m_settings - > registerSetting ( " TheCat " , false ) ;
2013-09-23 03:53:50 +05:30
2014-01-01 19:38:40 +05:30
m_settings - > registerSetting ( " InstSortMode " , " Name " ) ;
m_settings - > registerSetting ( " SelectedInstance " , QString ( ) ) ;
2013-11-03 06:15:25 +05:30
// Window state and geometry
2014-01-01 19:38:40 +05:30
m_settings - > registerSetting ( " MainWindowState " , " " ) ;
m_settings - > registerSetting ( " MainWindowGeometry " , " " ) ;
2013-11-23 06:11:28 +05:30
2014-01-01 19:38:40 +05:30
m_settings - > registerSetting ( " ConsoleWindowState " , " " ) ;
m_settings - > registerSetting ( " ConsoleWindowGeometry " , " " ) ;
2013-11-23 06:11:28 +05:30
2014-01-02 07:50:34 +05:30
m_settings - > registerSetting ( " SettingsGeometry " , " " ) ;
2013-09-07 07:30:58 +05:30
}
2013-09-08 05:45:20 +05:30
void MultiMC : : initHttpMetaCache ( )
{
2013-09-22 07:51:36 +05:30
m_metacache . reset ( new HttpMetaCache ( " metacache " ) ) ;
2013-12-10 11:42:52 +05:30
m_metacache - > addBase ( " asset_indexes " , QDir ( " assets/indexes " ) . absolutePath ( ) ) ;
m_metacache - > addBase ( " asset_objects " , QDir ( " assets/objects " ) . absolutePath ( ) ) ;
2013-09-08 05:45:20 +05:30
m_metacache - > addBase ( " versions " , QDir ( " versions " ) . absolutePath ( ) ) ;
m_metacache - > addBase ( " libraries " , QDir ( " libraries " ) . absolutePath ( ) ) ;
2013-09-18 03:30:35 +05:30
m_metacache - > addBase ( " minecraftforge " , QDir ( " mods/minecraftforge " ) . absolutePath ( ) ) ;
2014-04-20 00:54:11 +05:30
m_metacache - > addBase ( " fmllibs " , QDir ( " mods/minecraftforge/libs " ) . absolutePath ( ) ) ;
2014-03-02 06:38:01 +05:30
m_metacache - > addBase ( " liteloader " , QDir ( " mods/liteloader " ) . absolutePath ( ) ) ;
2013-10-21 22:20:45 +05:30
m_metacache - > addBase ( " skins " , QDir ( " accounts/skins " ) . absolutePath ( ) ) ;
2014-01-05 04:36:55 +05:30
m_metacache - > addBase ( " root " , QDir ( root ( ) ) . absolutePath ( ) ) ;
2013-09-08 05:45:20 +05:30
m_metacache - > Load ( ) ;
}
2014-01-07 02:32:58 +05:30
void MultiMC : : updateProxySettings ( )
{
QString proxyTypeStr = settings ( ) - > get ( " ProxyType " ) . toString ( ) ;
// Get the proxy settings from the settings object.
QString addr = settings ( ) - > get ( " ProxyAddr " ) . toString ( ) ;
int port = settings ( ) - > get ( " ProxyPort " ) . value < qint16 > ( ) ;
QString user = settings ( ) - > get ( " ProxyUser " ) . toString ( ) ;
QString pass = settings ( ) - > get ( " ProxyPass " ) . toString ( ) ;
// Set the application proxy settings.
if ( proxyTypeStr = = " SOCKS5 " )
{
QNetworkProxy : : setApplicationProxy ( QNetworkProxy ( QNetworkProxy : : Socks5Proxy , addr , port , user , pass ) ) ;
}
else if ( proxyTypeStr = = " HTTP " )
{
QNetworkProxy : : setApplicationProxy ( QNetworkProxy ( QNetworkProxy : : HttpProxy , addr , port , user , pass ) ) ;
}
else if ( proxyTypeStr = = " None " )
{
// If we have no proxy set, set no proxy and return.
QNetworkProxy : : setApplicationProxy ( QNetworkProxy ( QNetworkProxy : : NoProxy ) ) ;
}
else
{
// If we have "Default" selected, set Qt to use the system proxy settings.
QNetworkProxyFactory : : setUseSystemConfiguration ( true ) ;
}
QLOG_INFO ( ) < < " Detecting proxy settings... " ;
QNetworkProxy proxy = QNetworkProxy : : applicationProxy ( ) ;
if ( m_qnam . get ( ) ) m_qnam - > setProxy ( proxy ) ;
QString proxyDesc ;
if ( proxy . type ( ) = = QNetworkProxy : : NoProxy )
{
QLOG_INFO ( ) < < " Using no proxy is an option! " ;
return ;
}
switch ( proxy . type ( ) )
{
case QNetworkProxy : : DefaultProxy :
proxyDesc = " Default proxy: " ;
break ;
case QNetworkProxy : : Socks5Proxy :
proxyDesc = " Socks5 proxy: " ;
break ;
case QNetworkProxy : : HttpProxy :
proxyDesc = " HTTP proxy: " ;
break ;
case QNetworkProxy : : HttpCachingProxy :
proxyDesc = " HTTP caching: " ;
break ;
case QNetworkProxy : : FtpCachingProxy :
proxyDesc = " FTP caching: " ;
break ;
default :
proxyDesc = " DERP proxy: " ;
break ;
}
proxyDesc + = QString ( " %3@%1:%2 pass %4 " )
. arg ( proxy . hostName ( ) )
. arg ( proxy . port ( ) )
. arg ( proxy . user ( ) )
. arg ( proxy . password ( ) ) ;
QLOG_INFO ( ) < < proxyDesc ;
}
2013-10-06 04:43:40 +05:30
std : : shared_ptr < IconList > MultiMC : : icons ( )
2013-09-07 07:30:58 +05:30
{
2013-09-23 03:53:50 +05:30
if ( ! m_icons )
2013-09-07 07:30:58 +05:30
{
2013-09-22 07:51:36 +05:30
m_icons . reset ( new IconList ) ;
2013-09-07 07:30:58 +05:30
}
return m_icons ;
}
2013-10-06 04:43:40 +05:30
std : : shared_ptr < LWJGLVersionList > MultiMC : : lwjgllist ( )
2013-09-16 04:24:39 +05:30
{
2013-09-23 03:53:50 +05:30
if ( ! m_lwjgllist )
2013-09-16 04:24:39 +05:30
{
2013-09-22 07:51:36 +05:30
m_lwjgllist . reset ( new LWJGLVersionList ( ) ) ;
2013-09-16 04:24:39 +05:30
}
return m_lwjgllist ;
}
2013-09-22 07:51:36 +05:30
2013-10-06 04:43:40 +05:30
std : : shared_ptr < ForgeVersionList > MultiMC : : forgelist ( )
2013-09-16 04:24:39 +05:30
{
2013-09-23 03:53:50 +05:30
if ( ! m_forgelist )
2013-09-16 04:24:39 +05:30
{
2013-09-22 07:51:36 +05:30
m_forgelist . reset ( new ForgeVersionList ( ) ) ;
2013-09-16 04:24:39 +05:30
}
return m_forgelist ;
}
2014-02-20 03:04:17 +05:30
std : : shared_ptr < LiteLoaderVersionList > MultiMC : : liteloaderlist ( )
{
if ( ! m_liteloaderlist )
{
m_liteloaderlist . reset ( new LiteLoaderVersionList ( ) ) ;
}
return m_liteloaderlist ;
}
2013-10-06 04:43:40 +05:30
std : : shared_ptr < MinecraftVersionList > MultiMC : : minecraftlist ( )
2013-09-16 04:24:39 +05:30
{
2013-09-23 03:53:50 +05:30
if ( ! m_minecraftlist )
2013-09-16 04:24:39 +05:30
{
2013-09-22 07:51:36 +05:30
m_minecraftlist . reset ( new MinecraftVersionList ( ) ) ;
2013-09-16 04:24:39 +05:30
}
return m_minecraftlist ;
}
2013-10-14 07:29:21 +05:30
std : : shared_ptr < JavaVersionList > MultiMC : : javalist ( )
{
if ( ! m_javalist )
{
m_javalist . reset ( new JavaVersionList ( ) ) ;
}
return m_javalist ;
}
2014-05-05 03:40:59 +05:30
std : : shared_ptr < URNResolver > MultiMC : : resolver ( )
{
if ( ! m_resolver )
{
m_resolver . reset ( new URNResolver ( ) ) ;
}
return m_resolver ;
}
2014-01-05 17:47:42 +05:30
void MultiMC : : installUpdates ( const QString updateFilesDir , UpdateFlags flags )
2013-12-07 00:29:58 +05:30
{
2014-01-05 17:47:42 +05:30
// if we are going to update on exit, save the params now
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 ( ) )
{
m_updateOnExitFlags = None ;
m_updateOnExitPath . clear ( ) ;
}
2013-12-07 00:29:58 +05:30
QLOG_INFO ( ) < < " Installing updates. " ;
2014-01-05 04:36:55 +05:30
# 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
2014-01-05 21:17:12 +05:30
2013-12-07 00:29:58 +05:30
QStringList args ;
2013-12-22 09:01:30 +05:30
// ./updater --install-dir $INSTALL_DIR --package-dir $UPDATEFILES_DIR --script
// $UPDATEFILES_DIR/file_list.xml --wait $PID --mode main
2014-01-05 04:36:55 +05:30
args < < " --install-dir " < < root ( ) ;
2013-12-07 00:29:58 +05:30
args < < " --package-dir " < < updateFilesDir ;
2013-12-22 09:01:30 +05:30
args < < " --script " < < PathCombine ( updateFilesDir , " file_list.xml " ) ;
args < < " --wait " < < QString : : number ( MMC - > applicationPid ( ) ) ;
2014-01-05 17:47:42 +05:30
if ( flags & DryRun )
args < < " --dry-run " ;
if ( flags & RestartOnFinish )
2014-01-05 21:17:12 +05:30
{
2013-12-22 09:01:30 +05:30
args < < " --finish-cmd " < < finishCmd ;
2014-01-05 21:17:12 +05:30
args < < " --finish-dir " < < data ( ) ;
}
2013-12-07 00:29:58 +05:30
QLOG_INFO ( ) < < " Running updater with command " < < updaterBinary < < args . join ( " " ) ;
2014-01-01 19:38:40 +05:30
QFile : : setPermissions ( updaterBinary , ( QFileDevice : : Permission ) 0x7755 ) ;
2013-12-07 00:29:58 +05:30
2014-01-05 17:47:42 +05:30
if ( ! QProcess : : startDetached ( updaterBinary , args /*, root()*/ ) )
2013-12-29 03:02:45 +05:30
{
QLOG_ERROR ( ) < < " Failed to start the updater process! " ;
return ;
}
2013-12-07 00:29:58 +05:30
// Now that we've started the updater, quit MultiMC.
MMC - > quit ( ) ;
}
2014-01-05 17:47:42 +05:30
void MultiMC : : onExit ( )
2013-12-07 00:29:58 +05:30
{
2014-01-05 17:47:42 +05:30
if ( m_updateOnExitPath . size ( ) )
{
installUpdates ( m_updateOnExitPath , m_updateOnExitFlags ) ;
}
2013-12-07 00:29:58 +05:30
}
2013-12-30 19:15:59 +05:30
bool MultiMC : : openJsonEditor ( const QString & filename )
2013-12-29 22:21:16 +05:30
{
const QString file = QDir : : current ( ) . absoluteFilePath ( filename ) ;
if ( m_settings - > get ( " JsonEditor " ) . toString ( ) . isEmpty ( ) )
{
2013-12-30 19:15:59 +05:30
return QDesktopServices : : openUrl ( QUrl : : fromLocalFile ( file ) ) ;
2013-12-29 22:21:16 +05:30
}
else
{
2014-01-01 19:38:40 +05:30
return QProcess : : startDetached ( m_settings - > get ( " JsonEditor " ) . toString ( ) , QStringList ( )
< < file ) ;
2013-12-29 22:21:16 +05:30
}
}
2013-09-07 07:30:58 +05:30
2013-09-22 07:51:36 +05:30
# include "MultiMC.moc"