2013-09-07 02:00:58 +00:00
# include "MultiMC.h"
# include <iostream>
# include <QDir>
2013-12-06 18:59:58 +00:00
# include <QFileInfo>
2013-09-07 02:00:58 +00:00
# include <QNetworkAccessManager>
2013-09-08 21:43:19 +00:00
# include <QTranslator>
# include <QLibraryInfo>
2013-10-14 01:59:21 +00:00
# include <QMessageBox>
2013-12-06 18:59:58 +00:00
# include <QStringList>
2013-12-29 16:51:16 +00:00
# include <QDesktopServices>
2013-09-07 02:00:58 +00:00
2013-11-04 01:53:05 +00:00
# include "gui/dialogs/VersionSelectDialog.h"
2013-09-07 02:00:58 +00:00
# include "logic/lists/InstanceList.h"
2013-12-13 01:47:59 +00:00
# include "logic/auth/MojangAccountList.h"
2013-12-31 00:24:28 +00:00
# include "logic/icons/IconList.h"
2013-09-15 22:54:39 +00:00
# include "logic/lists/LwjglVersionList.h"
# include "logic/lists/MinecraftVersionList.h"
# include "logic/lists/ForgeVersionList.h"
2014-02-19 21:34:17 +00:00
# include "logic/lists/LiteLoaderVersionList.h"
2013-09-15 22:54:39 +00:00
2013-12-15 20:48:58 +00:00
# include "logic/news/NewsChecker.h"
2014-01-12 18:28:42 +00:00
# include "logic/status/StatusChecker.h"
2013-09-07 02:00:58 +00:00
# include "logic/InstanceLauncher.h"
2013-09-08 00:15:20 +00:00
# include "logic/net/HttpMetaCache.h"
2014-01-12 18:28:42 +00:00
# include "logic/net/URLConstants.h"
2013-09-07 02:00:58 +00:00
2013-10-06 22:44:34 +00:00
# include "logic/JavaUtils.h"
2013-12-04 18:34:12 +00:00
# include "logic/updater/UpdateChecker.h"
2014-01-03 18:19:27 +00:00
# include "logic/updater/NotificationChecker.h"
2013-10-06 22:44:34 +00:00
2014-02-16 11:52:35 +00:00
# include "logic/tools/JProfiler.h"
# include "logic/tools/JVisualVM.h"
# include "logic/tools/MCEditTool.h"
2014-02-15 13:19:35 +00:00
2013-09-07 02:00:58 +00:00
# include "pathutils.h"
# include "cmdutils.h"
# include <inisettingsobject.h>
# include <setting.h>
2013-11-04 01:53:05 +00:00
# include "logger/QsLog.h"
2013-10-05 23:13:40 +00:00
# include <logger/QsLogDest.h>
2013-09-07 02:00:58 +00:00
2014-03-05 21:20:45 +00:00
# ifdef Q_OS_WIN32
2014-03-05 21:35:35 +00:00
# include <windows.h>
static const int APPDATA_BUFFER_SIZE = 1024 ;
2014-03-05 21:20:45 +00:00
# endif
2013-09-07 02:00:58 +00:00
using namespace Util : : Commandline ;
2014-01-05 15:47:12 +00:00
MultiMC : : MultiMC ( int & argc , char * * argv , bool root_override )
2014-02-15 13:19:35 +00:00
: QApplication ( argc , argv ) ,
m_version { VERSION_MAJOR , VERSION_MINOR , VERSION_HOTFIX , VERSION_BUILD ,
MultiMCVersion : : VERSION_TYPE , VERSION_CHANNEL , BUILD_PLATFORM }
2013-09-07 02:00:58 +00:00
{
2013-10-28 19:55:12 +00:00
setOrganizationName ( " MultiMC " ) ;
setApplicationName ( " MultiMC5 " ) ;
2013-09-22 22:23:50 +00:00
2014-01-01 14:42:43 +00:00
setAttribute ( Qt : : AA_UseHighDpiPixmaps ) ;
2013-10-26 07:38:21 +00:00
// Don't quit on hiding the last window
this - > setQuitOnLastWindowClosed ( false ) ;
2013-09-07 02:00:58 +00:00
// Commandline parsing
QHash < QString , QVariant > args ;
{
Parser parser ( FlagStyle : : GNU , ArgumentStyle : : SpaceAndEquals ) ;
2013-09-22 22:23:50 +00:00
2013-09-07 02:00:58 +00:00
// --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-22 22:23:50 +00:00
parser . addDocumentation ( " dir " , " use the supplied directory as MultiMC root instead of "
" the binary location (use '.' for current) " ) ;
2013-12-13 01:47:59 +00:00
// WARNING: disabled until further notice
/*
2013-09-07 02:00:58 +00:00
// --launch
parser . addOption ( " launch " ) ;
parser . addShortOpt ( " launch " , ' l ' ) ;
parser . addDocumentation ( " launch " , " tries to launch the given instance " , " <inst> " ) ;
2013-12-13 01:47:59 +00:00
*/
2013-09-07 02:00:58 +00:00
// parse the arguments
try
{
args = parser . parse ( arguments ( ) ) ;
}
2013-09-22 22:23:50 +00:00
catch ( ParsingError e )
2013-09-07 02:00:58 +00:00
{
std : : cerr < < " CommandLineError: " < < e . what ( ) < < std : : endl ;
2013-09-22 22:23:50 +00:00
std : : cerr < < " Try '%1 -h' to get help on MultiMC's command line parameters. "
< < std : : endl ;
2013-09-07 02:00:58 +00:00
m_status = MultiMC : : Failed ;
return ;
}
2013-09-22 22:23:50 +00:00
2013-09-07 02:00:58 +00:00
// display help and exit
if ( args [ " help " ] . toBool ( ) )
{
std : : cout < < qPrintable ( parser . compileHelp ( arguments ( ) [ 0 ] ) ) ;
m_status = MultiMC : : Succeeded ;
return ;
}
2013-09-22 22:23:50 +00:00
2013-09-07 02:00:58 +00:00
// display version and exit
if ( args [ " version " ] . toBool ( ) )
{
std : : cout < < " Version " < < VERSION_STR < < std : : endl ;
std : : cout < < " Git " < < GIT_COMMIT < < std : : endl ;
m_status = MultiMC : : Succeeded ;
return ;
}
}
2014-01-03 01:29:05 +00:00
origcwdPath = QDir : : currentPath ( ) ;
binPath = applicationDirPath ( ) ;
QString adjustedBy ;
2013-09-07 02:00:58 +00:00
// change directory
2014-01-03 01:29:05 +00:00
QString dirParam = args [ " dir " ] . toString ( ) ;
2014-01-05 15:47:12 +00:00
if ( ! dirParam . isEmpty ( ) )
2014-01-03 01:29:05 +00:00
{
// 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-04 23:06:55 +00:00
else
{
dataPath = applicationDirPath ( ) ;
adjustedBy + = " Fallback to binary path " + dataPath ;
}
2014-01-05 15:47:12 +00:00
2014-01-03 01:29:05 +00:00
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 15:47:12 +00:00
if ( root_override )
{
rootPath = binPath ;
}
else
2014-01-03 01:29:05 +00:00
{
# ifdef Q_OS_LINUX
QDir foo ( PathCombine ( binPath , " .. " ) ) ;
rootPath = foo . absolutePath ( ) ;
# elif defined(Q_OS_WIN32)
2014-01-04 23:06:55 +00:00
rootPath = binPath ;
2014-01-03 01:29:05 +00:00
# elif defined(Q_OS_MAC)
QDir foo ( PathCombine ( binPath , " ../.. " ) ) ;
rootPath = foo . absolutePath ( ) ;
# endif
}
2013-09-22 22:23:50 +00:00
2013-10-05 23:13:40 +00:00
// init the logger
initLogger ( ) ;
2014-01-03 01:29:05 +00:00
QLOG_INFO ( ) < < " MultiMC 5, (c) 2013 MultiMC Contributors " ;
QLOG_INFO ( ) < < " Version : " < < VERSION_STR ;
QLOG_INFO ( ) < < " Git commit : " < < GIT_COMMIT ;
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 ;
2013-09-07 02:00:58 +00:00
// load settings
initGlobalSettings ( ) ;
2013-09-22 22:23:50 +00:00
2014-01-04 15:13:28 +00:00
// load translations
initTranslations ( ) ;
2013-12-01 23:55:24 +00:00
// initialize the updater
2013-12-04 18:34:12 +00:00
m_updateChecker . reset ( new UpdateChecker ( ) ) ;
2013-12-01 23:55:24 +00:00
2014-01-03 18:19:27 +00:00
// initialize the notification checker
m_notificationChecker . reset ( new NotificationChecker ( ) ) ;
2013-12-15 20:48:58 +00:00
// initialize the news checker
m_newsChecker . reset ( new NewsChecker ( NEWS_RSS_URL ) ) ;
2014-01-12 18:28:42 +00:00
// initialize the status checker
m_statusChecker . reset ( new StatusChecker ( ) ) ;
2013-09-07 02:00:58 +00:00
// and instances
2013-10-28 19:55:12 +00:00
auto InstDirSetting = m_settings - > getSetting ( " InstanceDir " ) ;
m_instances . reset ( new InstanceList ( InstDirSetting - > get ( ) . toString ( ) , this ) ) ;
2013-10-06 01:07:57 +00:00
QLOG_INFO ( ) < < " Loading Instances... " ;
2013-09-07 02:00:58 +00:00
m_instances - > loadList ( ) ;
2014-01-01 14:08:40 +00:00
connect ( InstDirSetting . get ( ) , SIGNAL ( settingChanged ( const Setting & , QVariant ) ) ,
2013-10-28 19:55:12 +00:00
m_instances . get ( ) , SLOT ( on_InstFolderChanged ( const Setting & , QVariant ) ) ) ;
2013-09-22 22:23:50 +00:00
2013-11-18 18:58:03 +00:00
// and accounts
m_accounts . reset ( new MojangAccountList ( this ) ) ;
QLOG_INFO ( ) < < " Loading accounts... " ;
2013-11-19 18:53:30 +00:00
m_accounts - > setListFilePath ( " accounts.json " , true ) ;
2013-11-18 18:58:03 +00:00
m_accounts - > loadList ( ) ;
2013-09-08 00:15:20 +00:00
// init the http meta cache
initHttpMetaCache ( ) ;
2013-09-22 22:23:50 +00:00
2013-09-08 00:15:20 +00:00
// create the global network manager
2013-09-22 02:21:36 +00:00
m_qnam . reset ( new QNetworkAccessManager ( this ) ) ;
2013-09-22 22:23:50 +00:00
2014-01-06 21:02:58 +00:00
// init proxy settings
updateProxySettings ( ) ;
2014-02-15 13:19:35 +00:00
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 09:46:14 +00:00
m_tools . insert ( " mcedit " ,
std : : shared_ptr < BaseDetachedToolFactory > ( new MCEditFactory ( ) ) ) ;
for ( auto tool : m_tools . values ( ) )
{
tool - > registerSettings ( m_settings . get ( ) ) ;
}
2014-02-15 13:19:35 +00:00
2013-09-07 02:00:58 +00:00
// launch instance, if that's what should be done
2013-12-13 01:47:59 +00:00
// WARNING: disabled until further notice
/*
2013-09-07 02:00:58 +00:00
if ( ! args [ " launch " ] . isNull ( ) )
{
2013-09-22 22:23:50 +00:00
if ( InstanceLauncher ( args [ " launch " ] . toString ( ) ) . launch ( ) )
2013-09-07 02:00:58 +00:00
m_status = MultiMC : : Succeeded ;
else
m_status = MultiMC : : Failed ;
return ;
}
2013-12-13 01:47:59 +00:00
*/
2014-01-05 12:17:42 +00:00
connect ( this , SIGNAL ( aboutToQuit ( ) ) , SLOT ( onExit ( ) ) ) ;
2013-09-07 02:00:58 +00:00
m_status = MultiMC : : Initialized ;
}
MultiMC : : ~ MultiMC ( )
{
2013-09-22 22:23:50 +00:00
if ( m_mmc_translator )
2013-09-08 23:20:17 +00:00
{
2013-10-05 23:13:40 +00:00
removeTranslator ( m_mmc_translator . get ( ) ) ;
2013-09-08 23:20:17 +00:00
}
2013-09-22 22:23:50 +00:00
if ( m_qt_translator )
2013-09-08 23:20:17 +00:00
{
2013-10-05 23:13:40 +00:00
removeTranslator ( m_qt_translator . get ( ) ) ;
2013-09-08 23:20:17 +00:00
}
2013-09-07 02:00:58 +00:00
}
2013-09-08 23:20:17 +00:00
void MultiMC : : initTranslations ( )
{
2014-01-04 15:13:28 +00:00
QLocale locale ( m_settings - > get ( " Language " ) . toString ( ) ) ;
QLocale : : setDefault ( locale ) ;
QLOG_INFO ( ) < < " Your language is " < < locale . bcp47Name ( ) ;
2013-09-22 02:21:36 +00:00
m_qt_translator . reset ( new QTranslator ( ) ) ;
2014-01-04 15:13:28 +00:00
if ( m_qt_translator - > load ( " qt_ " + locale . bcp47Name ( ) ,
2013-09-22 22:23:50 +00:00
QLibraryInfo : : location ( QLibraryInfo : : TranslationsPath ) ) )
2013-09-08 23:20:17 +00:00
{
2014-01-04 15:13:28 +00:00
QLOG_DEBUG ( ) < < " Loading Qt Language File for "
< < locale . bcp47Name ( ) . toLocal8Bit ( ) . constData ( ) < < " ... " ;
2013-10-05 23:13:40 +00:00
if ( ! installTranslator ( m_qt_translator . get ( ) ) )
2013-09-08 23:20:17 +00:00
{
2014-01-04 15:13:28 +00:00
QLOG_ERROR ( ) < < " Loading Qt Language File failed. " ;
2013-09-22 02:21:36 +00:00
m_qt_translator . reset ( ) ;
2013-09-08 23:20:17 +00:00
}
}
else
{
2013-09-22 02:21:36 +00:00
m_qt_translator . reset ( ) ;
2013-09-08 23:20:17 +00:00
}
2013-09-22 02:21:36 +00:00
m_mmc_translator . reset ( new QTranslator ( ) ) ;
2014-01-04 15:13:28 +00:00
if ( m_mmc_translator - > load ( " mmc_ " + locale . bcp47Name ( ) , MMC - > root ( ) + " /translations " ) )
2013-09-08 23:20:17 +00:00
{
2014-01-04 15:13:28 +00:00
QLOG_DEBUG ( ) < < " Loading MMC Language File for "
< < locale . bcp47Name ( ) . toLocal8Bit ( ) . constData ( ) < < " ... " ;
2013-10-05 23:13:40 +00:00
if ( ! installTranslator ( m_mmc_translator . get ( ) ) )
2013-09-08 23:20:17 +00:00
{
2014-01-04 15:13:28 +00:00
QLOG_ERROR ( ) < < " Loading MMC Language File failed. " ;
2013-09-22 02:21:36 +00:00
m_mmc_translator . reset ( ) ;
2013-09-08 23:20:17 +00:00
}
}
else
{
2013-09-22 02:21:36 +00:00
m_mmc_translator . reset ( ) ;
2013-09-08 23:20:17 +00:00
}
}
2013-12-21 10:05:44 +00:00
void moveFile ( const QString & oldName , const QString & newName )
{
QFile : : remove ( newName ) ;
QFile : : copy ( oldName , newName ) ;
QFile : : remove ( oldName ) ;
}
2013-10-05 23:13:40 +00:00
void MultiMC : : initLogger ( )
{
2013-12-21 10:05:44 +00:00
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-05 23:13:40 +00:00
// init the logging mechanism
QsLogging : : Logger & logger = QsLogging : : Logger : : instance ( ) ;
logger . setLoggingLevel ( QsLogging : : TraceLevel ) ;
2013-12-21 10:05:44 +00:00
m_fileDestination = QsLogging : : DestinationFactory : : MakeFileDestination ( logBase . arg ( 0 ) ) ;
2014-01-04 23:06:55 +00:00
m_debugDestination = QsLogging : : DestinationFactory : : MakeQDebugDestination ( ) ;
2013-10-05 23:13:40 +00:00
logger . addDestination ( m_fileDestination . get ( ) ) ;
logger . addDestination ( m_debugDestination . get ( ) ) ;
// log all the things
logger . setLoggingLevel ( QsLogging : : TraceLevel ) ;
}
2013-09-07 02:00:58 +00:00
void MultiMC : : initGlobalSettings ( )
{
2013-09-22 02:21:36 +00:00
m_settings . reset ( new INISettingsObject ( " multimc.cfg " , this ) ) ;
2013-09-22 22:23:50 +00:00
// Updates
2014-01-05 01:46:47 +00:00
m_settings - > registerSetting ( " UpdateChannel " , version ( ) . channel ) ;
2014-01-01 14:08:40 +00:00
m_settings - > registerSetting ( " AutoUpdate " , true ) ;
2014-02-13 21:00:51 +00:00
2014-01-05 01:46:47 +00:00
// Notifications
2014-01-03 18:19:27 +00:00
m_settings - > registerSetting ( " ShownNotifications " , QString ( ) ) ;
2013-09-22 22:23:50 +00:00
2013-12-20 13:47:26 +00:00
// FTB
2014-01-01 14:08:40 +00:00
m_settings - > registerSetting ( " TrackFTBInstances " , false ) ;
2013-12-22 03:31:30 +00:00
# ifdef Q_OS_LINUX
2014-01-01 14:08:40 +00:00
QString ftbDefault = QDir : : home ( ) . absoluteFilePath ( " .ftblauncher " ) ;
2013-12-22 03:31:30 +00:00
# elif defined(Q_OS_WIN32)
2014-03-05 21:35:35 +00:00
wchar_t buf [ APPDATA_BUFFER_SIZE ] ;
2014-03-05 21:27:18 +00:00
QString ftbDefault ;
2014-03-05 21:35:35 +00:00
if ( ! GetEnvironmentVariableW ( L " APPDATA " , buf , APPDATA_BUFFER_SIZE ) )
2014-03-05 21:20:45 +00:00
{
2014-03-05 21:27:18 +00:00
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
{
ftbDefault = PathCombine ( QString : : fromWCharArray ( buf ) , " ftblauncher " ) ;
2014-03-05 21:20:45 +00:00
}
2013-12-22 03:31:30 +00:00
# elif defined(Q_OS_MAC)
2014-01-01 14:08:40 +00:00
QString ftbDefault =
PathCombine ( QDir : : homePath ( ) , " Library/Application Support/ftblauncher " ) ;
2013-12-22 03:31:30 +00:00
# endif
2014-01-01 14:08:40 +00:00
m_settings - > registerSetting ( " FTBLauncherRoot " , ftbDefault ) ;
2013-12-20 13:47:26 +00:00
2014-01-01 14:08:40 +00:00
m_settings - > registerSetting ( " FTBRoot " ) ;
2013-12-20 13:47:26 +00:00
if ( m_settings - > get ( " FTBRoot " ) . isNull ( ) )
{
QString ftbRoot ;
2013-12-22 03:31:30 +00:00
QFile f ( QDir ( m_settings - > get ( " FTBLauncherRoot " ) . toString ( ) )
. absoluteFilePath ( " ftblaunch.cfg " ) ) ;
2013-12-20 13:47:26 +00:00
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-22 22:23:50 +00:00
2013-09-07 02:00:58 +00:00
// Folders
2014-01-01 14:08:40 +00:00
m_settings - > registerSetting ( " InstanceDir " , " instances " ) ;
m_settings - > registerSetting ( { " CentralModsDir " , " ModsDir " } , " mods " ) ;
m_settings - > registerSetting ( { " LWJGLDir " , " LwjglDir " } , " lwjgl " ) ;
m_settings - > registerSetting ( " IconsDir " , " icons " ) ;
2013-09-22 22:23:50 +00:00
2013-12-29 16:51:16 +00:00
// Editors
2014-01-01 14:08:40 +00:00
m_settings - > registerSetting ( " JsonEditor " , QString ( ) ) ;
2013-09-22 22:23:50 +00:00
2014-01-04 15:13:28 +00:00
// Language
m_settings - > registerSetting ( " Language " , QLocale ( QLocale : : system ( ) . language ( ) ) . bcp47Name ( ) ) ;
2013-09-07 02:00:58 +00:00
// Console
2014-01-01 14:08:40 +00:00
m_settings - > registerSetting ( " ShowConsole " , true ) ;
m_settings - > registerSetting ( " AutoCloseConsole " , true ) ;
2014-01-17 21:55:10 +00:00
m_settings - > registerSetting ( " LogPrePostOutput " , true ) ;
2013-09-22 22:23:50 +00:00
2013-09-07 02:00:58 +00:00
// Console Colors
2014-01-01 14:08:40 +00:00
// m_settings->registerSetting("SysMessageColor", QColor(Qt::blue));
// m_settings->registerSetting("StdOutColor", QColor(Qt::black));
// m_settings->registerSetting("StdErrColor", QColor(Qt::red));
2013-09-22 22:23:50 +00:00
2013-09-07 02:00:58 +00:00
// Window Size
2014-01-01 14:08:40 +00:00
m_settings - > registerSetting ( { " LaunchMaximized " , " MCWindowMaximize " } , false ) ;
m_settings - > registerSetting ( { " MinecraftWinWidth " , " MCWindowWidth " } , 854 ) ;
m_settings - > registerSetting ( { " MinecraftWinHeight " , " MCWindowHeight " } , 480 ) ;
2013-09-22 22:23:50 +00:00
2014-01-06 21:02:58 +00:00
// 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 02:00:58 +00:00
// Memory
2014-01-01 14:08:40 +00:00
m_settings - > registerSetting ( { " MinMemAlloc " , " MinMemoryAlloc " } , 512 ) ;
m_settings - > registerSetting ( { " MaxMemAlloc " , " MaxMemoryAlloc " } , 1024 ) ;
m_settings - > registerSetting ( " PermGen " , 64 ) ;
2013-09-22 22:23:50 +00:00
2013-09-07 02:00:58 +00:00
// Java Settings
2014-01-01 14:08:40 +00:00
m_settings - > registerSetting ( " JavaPath " , " " ) ;
m_settings - > registerSetting ( " LastHostname " , " " ) ;
m_settings - > registerSetting ( " JvmArgs " , " " ) ;
2013-09-22 22:23:50 +00:00
2013-09-07 02:00:58 +00:00
// Custom Commands
2014-01-01 14:08:40 +00:00
m_settings - > registerSetting ( { " PreLaunchCommand " , " PreLaunchCmd " } , " " ) ;
2014-01-01 15:17:49 +00:00
m_settings - > registerSetting ( { " PostExitCommand " , " PostExitCmd " } , " " ) ;
2013-09-22 22:23:50 +00:00
2013-09-07 02:00:58 +00:00
// The cat
2014-01-01 14:08:40 +00:00
m_settings - > registerSetting ( " TheCat " , false ) ;
2013-09-22 22:23:50 +00:00
2014-01-01 14:08:40 +00:00
m_settings - > registerSetting ( " InstSortMode " , " Name " ) ;
m_settings - > registerSetting ( " SelectedInstance " , QString ( ) ) ;
2013-11-03 00:45:25 +00:00
// Window state and geometry
2014-01-01 14:08:40 +00:00
m_settings - > registerSetting ( " MainWindowState " , " " ) ;
m_settings - > registerSetting ( " MainWindowGeometry " , " " ) ;
2013-11-23 00:41:28 +00:00
2014-01-01 14:08:40 +00:00
m_settings - > registerSetting ( " ConsoleWindowState " , " " ) ;
m_settings - > registerSetting ( " ConsoleWindowGeometry " , " " ) ;
2013-11-23 00:41:28 +00:00
2014-01-02 02:20:34 +00:00
m_settings - > registerSetting ( " SettingsGeometry " , " " ) ;
2013-09-07 02:00:58 +00:00
}
2013-09-08 00:15:20 +00:00
void MultiMC : : initHttpMetaCache ( )
{
2013-09-22 02:21:36 +00:00
m_metacache . reset ( new HttpMetaCache ( " metacache " ) ) ;
2013-12-10 06:12:52 +00:00
m_metacache - > addBase ( " asset_indexes " , QDir ( " assets/indexes " ) . absolutePath ( ) ) ;
m_metacache - > addBase ( " asset_objects " , QDir ( " assets/objects " ) . absolutePath ( ) ) ;
2013-09-08 00:15:20 +00:00
m_metacache - > addBase ( " versions " , QDir ( " versions " ) . absolutePath ( ) ) ;
m_metacache - > addBase ( " libraries " , QDir ( " libraries " ) . absolutePath ( ) ) ;
2013-09-17 22:00:35 +00:00
m_metacache - > addBase ( " minecraftforge " , QDir ( " mods/minecraftforge " ) . absolutePath ( ) ) ;
2014-03-02 01:08:01 +00:00
m_metacache - > addBase ( " liteloader " , QDir ( " mods/liteloader " ) . absolutePath ( ) ) ;
2013-10-21 16:50:45 +00:00
m_metacache - > addBase ( " skins " , QDir ( " accounts/skins " ) . absolutePath ( ) ) ;
2014-01-04 23:06:55 +00:00
m_metacache - > addBase ( " root " , QDir ( root ( ) ) . absolutePath ( ) ) ;
2013-09-08 00:15:20 +00:00
m_metacache - > Load ( ) ;
}
2014-01-06 21:02:58 +00:00
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-05 23:13:40 +00:00
std : : shared_ptr < IconList > MultiMC : : icons ( )
2013-09-07 02:00:58 +00:00
{
2013-09-22 22:23:50 +00:00
if ( ! m_icons )
2013-09-07 02:00:58 +00:00
{
2013-09-22 02:21:36 +00:00
m_icons . reset ( new IconList ) ;
2013-09-07 02:00:58 +00:00
}
return m_icons ;
}
2013-10-05 23:13:40 +00:00
std : : shared_ptr < LWJGLVersionList > MultiMC : : lwjgllist ( )
2013-09-15 22:54:39 +00:00
{
2013-09-22 22:23:50 +00:00
if ( ! m_lwjgllist )
2013-09-15 22:54:39 +00:00
{
2013-09-22 02:21:36 +00:00
m_lwjgllist . reset ( new LWJGLVersionList ( ) ) ;
2013-09-15 22:54:39 +00:00
}
return m_lwjgllist ;
}
2013-09-22 02:21:36 +00:00
2013-10-05 23:13:40 +00:00
std : : shared_ptr < ForgeVersionList > MultiMC : : forgelist ( )
2013-09-15 22:54:39 +00:00
{
2013-09-22 22:23:50 +00:00
if ( ! m_forgelist )
2013-09-15 22:54:39 +00:00
{
2013-09-22 02:21:36 +00:00
m_forgelist . reset ( new ForgeVersionList ( ) ) ;
2013-09-15 22:54:39 +00:00
}
return m_forgelist ;
}
2014-02-19 21:34:17 +00:00
std : : shared_ptr < LiteLoaderVersionList > MultiMC : : liteloaderlist ( )
{
if ( ! m_liteloaderlist )
{
m_liteloaderlist . reset ( new LiteLoaderVersionList ( ) ) ;
}
return m_liteloaderlist ;
}
2013-10-05 23:13:40 +00:00
std : : shared_ptr < MinecraftVersionList > MultiMC : : minecraftlist ( )
2013-09-15 22:54:39 +00:00
{
2013-09-22 22:23:50 +00:00
if ( ! m_minecraftlist )
2013-09-15 22:54:39 +00:00
{
2013-09-22 02:21:36 +00:00
m_minecraftlist . reset ( new MinecraftVersionList ( ) ) ;
2013-09-15 22:54:39 +00:00
}
return m_minecraftlist ;
}
2013-10-14 01:59:21 +00:00
std : : shared_ptr < JavaVersionList > MultiMC : : javalist ( )
{
if ( ! m_javalist )
{
m_javalist . reset ( new JavaVersionList ( ) ) ;
}
return m_javalist ;
}
2014-01-05 12:17:42 +00:00
void MultiMC : : installUpdates ( const QString updateFilesDir , UpdateFlags flags )
2013-12-06 18:59:58 +00:00
{
2014-01-05 12:17:42 +00:00
// 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-06 18:59:58 +00:00
QLOG_INFO ( ) < < " Installing updates. " ;
2014-01-04 23:06:55 +00:00
# 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 15:47:12 +00:00
2013-12-06 18:59:58 +00:00
QStringList args ;
2013-12-22 03:31:30 +00:00
// ./updater --install-dir $INSTALL_DIR --package-dir $UPDATEFILES_DIR --script
// $UPDATEFILES_DIR/file_list.xml --wait $PID --mode main
2014-01-04 23:06:55 +00:00
args < < " --install-dir " < < root ( ) ;
2013-12-06 18:59:58 +00:00
args < < " --package-dir " < < updateFilesDir ;
2013-12-22 03:31:30 +00:00
args < < " --script " < < PathCombine ( updateFilesDir , " file_list.xml " ) ;
args < < " --wait " < < QString : : number ( MMC - > applicationPid ( ) ) ;
2014-01-05 12:17:42 +00:00
if ( flags & DryRun )
args < < " --dry-run " ;
if ( flags & RestartOnFinish )
2014-01-05 15:47:12 +00:00
{
2013-12-22 03:31:30 +00:00
args < < " --finish-cmd " < < finishCmd ;
2014-01-05 15:47:12 +00:00
args < < " --finish-dir " < < data ( ) ;
}
2013-12-06 18:59:58 +00:00
QLOG_INFO ( ) < < " Running updater with command " < < updaterBinary < < args . join ( " " ) ;
2014-01-01 14:08:40 +00:00
QFile : : setPermissions ( updaterBinary , ( QFileDevice : : Permission ) 0x7755 ) ;
2013-12-06 18:59:58 +00:00
2014-01-05 12:17:42 +00:00
if ( ! QProcess : : startDetached ( updaterBinary , args /*, root()*/ ) )
2013-12-28 21:32:45 +00:00
{
QLOG_ERROR ( ) < < " Failed to start the updater process! " ;
return ;
}
2013-12-06 18:59:58 +00:00
// Now that we've started the updater, quit MultiMC.
MMC - > quit ( ) ;
}
2014-01-05 12:17:42 +00:00
void MultiMC : : onExit ( )
2013-12-06 18:59:58 +00:00
{
2014-01-05 12:17:42 +00:00
if ( m_updateOnExitPath . size ( ) )
{
installUpdates ( m_updateOnExitPath , m_updateOnExitFlags ) ;
}
2013-12-06 18:59:58 +00:00
}
2013-12-30 13:45:59 +00:00
bool MultiMC : : openJsonEditor ( const QString & filename )
2013-12-29 16:51:16 +00:00
{
const QString file = QDir : : current ( ) . absoluteFilePath ( filename ) ;
if ( m_settings - > get ( " JsonEditor " ) . toString ( ) . isEmpty ( ) )
{
2013-12-30 13:45:59 +00:00
return QDesktopServices : : openUrl ( QUrl : : fromLocalFile ( file ) ) ;
2013-12-29 16:51:16 +00:00
}
else
{
2014-01-01 14:08:40 +00:00
return QProcess : : startDetached ( m_settings - > get ( " JsonEditor " ) . toString ( ) , QStringList ( )
< < file ) ;
2013-12-29 16:51:16 +00:00
}
}
2013-09-07 02:00:58 +00:00
2013-09-22 02:21:36 +00:00
# include "MultiMC.moc"