2013-01-09 18:22:22 +00:00
|
|
|
/* Copyright 2013 MultiMC Contributors
|
2013-02-19 23:07:52 +00:00
|
|
|
*
|
2013-02-21 19:40:32 +00:00
|
|
|
* Authors: Andrew Okin
|
|
|
|
* Orochimarufan <orochimarufan.x3@gmail.com>
|
2013-01-09 18:22:22 +00:00
|
|
|
*
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
* you may not use this file except in compliance with the License.
|
|
|
|
* You may obtain a copy of the License at
|
|
|
|
*
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
*
|
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
* See the License for the specific language governing permissions and
|
|
|
|
* limitations under the License.
|
|
|
|
*/
|
|
|
|
|
2013-02-19 23:07:52 +00:00
|
|
|
#include <iostream>
|
|
|
|
|
2013-01-09 18:22:22 +00:00
|
|
|
#include <QApplication>
|
2013-02-19 23:07:52 +00:00
|
|
|
#include <QDir>
|
2013-01-09 18:22:22 +00:00
|
|
|
|
2013-02-19 23:07:52 +00:00
|
|
|
#include "gui/mainwindow.h"
|
2013-02-22 15:17:31 +00:00
|
|
|
#include "gui/logindialog.h"
|
|
|
|
#include "gui/taskdialog.h"
|
2013-02-22 17:18:23 +00:00
|
|
|
#include "gui/consolewindow.h"
|
2013-01-09 18:22:22 +00:00
|
|
|
|
2013-07-28 22:59:35 +00:00
|
|
|
#include "AppSettings.h"
|
|
|
|
#include "lists/InstanceList.h"
|
|
|
|
#include "tasks/LoginTask.h"
|
|
|
|
#include "MinecraftProcess.h"
|
2013-01-09 18:22:22 +00:00
|
|
|
|
2013-02-21 01:10:09 +00:00
|
|
|
#include "pathutils.h"
|
2013-02-21 19:40:32 +00:00
|
|
|
#include "cmdutils.h"
|
2013-02-19 23:07:52 +00:00
|
|
|
|
2013-02-21 18:35:52 +00:00
|
|
|
#include "config.h"
|
|
|
|
|
2013-02-19 23:07:52 +00:00
|
|
|
using namespace Util::Commandline;
|
|
|
|
|
2013-02-22 15:17:31 +00:00
|
|
|
// Commandline instance launcher
|
|
|
|
class InstanceLauncher : public QObject
|
|
|
|
{
|
2013-02-25 19:39:07 +00:00
|
|
|
Q_OBJECT
|
2013-02-22 15:17:31 +00:00
|
|
|
private:
|
2013-02-25 19:39:07 +00:00
|
|
|
InstanceList instances;
|
|
|
|
QString instId;
|
|
|
|
InstancePtr instance;
|
|
|
|
MinecraftProcess *proc;
|
|
|
|
ConsoleWindow *console;
|
2013-02-22 15:17:31 +00:00
|
|
|
public:
|
2013-02-25 20:44:36 +00:00
|
|
|
InstanceLauncher(QString instId) : QObject(), instances(globalSettings->get("InstanceDir").toString())
|
2013-02-25 19:39:07 +00:00
|
|
|
{
|
|
|
|
this->instId = instId;
|
|
|
|
}
|
|
|
|
|
2013-02-22 15:17:31 +00:00
|
|
|
private slots:
|
2013-02-25 19:39:07 +00:00
|
|
|
void onTerminated()
|
|
|
|
{
|
|
|
|
std::cout << "Minecraft exited" << std::endl;
|
|
|
|
QApplication::instance()->quit();
|
|
|
|
}
|
|
|
|
|
2013-03-11 21:19:17 +00:00
|
|
|
void onLoginComplete(QString instId, LoginResponse response)
|
2013-02-25 19:39:07 +00:00
|
|
|
{
|
2013-08-03 21:58:39 +00:00
|
|
|
proc = instance->prepareForLaunch(response.username, response.sessionID);
|
2013-08-03 13:57:33 +00:00
|
|
|
if(!proc)
|
|
|
|
{
|
|
|
|
//FIXME: report error
|
|
|
|
return;
|
|
|
|
}
|
2013-02-25 19:39:07 +00:00
|
|
|
console = new ConsoleWindow();
|
|
|
|
console->show();
|
2013-08-03 13:57:33 +00:00
|
|
|
|
2013-02-25 19:39:07 +00:00
|
|
|
connect(proc, SIGNAL(ended()), SLOT(onTerminated()));
|
2013-03-22 13:40:55 +00:00
|
|
|
connect(proc, SIGNAL(log(QString,MessageLevel::Enum)), console, SLOT(write(QString,MessageLevel::Enum)));
|
2013-08-03 13:57:33 +00:00
|
|
|
|
2013-02-25 19:39:07 +00:00
|
|
|
proc->launch();
|
|
|
|
}
|
|
|
|
|
2013-03-11 21:19:17 +00:00
|
|
|
void doLogin(QString instId, const QString &errorMsg)
|
2013-02-25 19:39:07 +00:00
|
|
|
{
|
|
|
|
LoginDialog* loginDlg = new LoginDialog(nullptr, errorMsg);
|
|
|
|
if (loginDlg->exec())
|
|
|
|
{
|
2013-08-04 12:46:33 +00:00
|
|
|
UserInfo uInfo{loginDlg->getUsername(), loginDlg->getPassword()};
|
2013-02-25 19:39:07 +00:00
|
|
|
|
|
|
|
TaskDialog* tDialog = new TaskDialog(nullptr);
|
2013-05-08 17:56:43 +00:00
|
|
|
LoginTask* loginTask = new LoginTask(uInfo, tDialog);
|
2013-03-11 21:19:17 +00:00
|
|
|
connect(loginTask, SIGNAL(loginComplete(QString, LoginResponse)),
|
|
|
|
SLOT(onLoginComplete(QString, LoginResponse)), Qt::QueuedConnection);
|
|
|
|
connect(loginTask, SIGNAL(loginFailed(QString, QString)),
|
|
|
|
SLOT(doLogin(QString, QString)), Qt::QueuedConnection);
|
2013-02-25 19:39:07 +00:00
|
|
|
tDialog->exec(loginTask);
|
|
|
|
}
|
|
|
|
//onLoginComplete(LoginResponse("Offline","Offline", 1));
|
|
|
|
}
|
|
|
|
|
2013-02-22 15:17:31 +00:00
|
|
|
public:
|
2013-02-25 19:39:07 +00:00
|
|
|
int launch()
|
|
|
|
{
|
|
|
|
std::cout << "Loading Instances..." << std::endl;
|
|
|
|
instances.loadList();
|
|
|
|
|
|
|
|
std::cout << "Launching Instance '" << qPrintable(instId) << "'" << std::endl;
|
2013-03-18 22:00:46 +00:00
|
|
|
instance = instances.getInstanceById(instId);
|
2013-02-25 19:39:07 +00:00
|
|
|
if (instance.isNull())
|
|
|
|
{
|
|
|
|
std::cout << "Could not find instance requested. note that you have to specify the ID, not the NAME" << std::endl;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
std::cout << "Logging in..." << std::endl;
|
2013-03-11 21:19:17 +00:00
|
|
|
doLogin(instance->id(),"");
|
2013-02-25 19:39:07 +00:00
|
|
|
|
|
|
|
return QApplication::instance()->exec();
|
|
|
|
}
|
2013-02-22 15:17:31 +00:00
|
|
|
};
|
2013-02-20 14:32:26 +00:00
|
|
|
|
2013-01-09 18:22:22 +00:00
|
|
|
int main(int argc, char *argv[])
|
|
|
|
{
|
2013-02-25 19:39:07 +00:00
|
|
|
// initialize Qt
|
2013-01-09 18:22:22 +00:00
|
|
|
QApplication app(argc, argv);
|
2013-01-28 21:35:09 +00:00
|
|
|
app.setOrganizationName("Forkk");
|
|
|
|
app.setApplicationName("MultiMC 5");
|
2013-02-25 19:39:07 +00:00
|
|
|
|
|
|
|
// Print app header
|
|
|
|
std::cout << "MultiMC 5" << std::endl;
|
|
|
|
std::cout << "(c) 2013 MultiMC Contributors" << std::endl << std::endl;
|
|
|
|
|
|
|
|
// Commandline parsing
|
|
|
|
Parser parser(FlagStyle::GNU, ArgumentStyle::SpaceAndEquals);
|
|
|
|
|
|
|
|
// --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", app.applicationDirPath());
|
|
|
|
parser.addShortOpt("dir", 'd');
|
|
|
|
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>");
|
|
|
|
// --quietupdate
|
|
|
|
parser.addSwitch("quietupdate");
|
|
|
|
parser.addShortOpt("quietupdate", 'U');
|
|
|
|
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
|
|
|
|
QHash<QString, QVariant> args;
|
|
|
|
try
|
|
|
|
{
|
|
|
|
args = parser.parse(app.arguments());
|
|
|
|
}
|
|
|
|
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;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
// display help and exit
|
|
|
|
if (args["help"].toBool())
|
|
|
|
{
|
|
|
|
std::cout << qPrintable(parser.compileHelp(app.arguments()[0]));
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
// 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;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
// update
|
|
|
|
// Note: cwd is always the current executable path!
|
|
|
|
if (!args["update"].isNull())
|
|
|
|
{
|
|
|
|
std::cout << "Performing MultiMC update: " << qPrintable(args["update"].toString()) << std::endl;
|
|
|
|
QString cwd = QDir::currentPath();
|
|
|
|
QDir::setCurrent(app.applicationDirPath());
|
|
|
|
QFile file(app.applicationFilePath());
|
|
|
|
file.copy(args["update"].toString());
|
|
|
|
if(args["quietupdate"].toBool())
|
|
|
|
return 0;
|
|
|
|
QDir::setCurrent(cwd);
|
|
|
|
}
|
|
|
|
|
|
|
|
// change directory
|
|
|
|
QDir::setCurrent(args["dir"].toString());
|
|
|
|
|
|
|
|
// load settings
|
2013-02-25 20:44:36 +00:00
|
|
|
globalSettings = new AppSettings(&app);
|
2013-02-25 19:39:07 +00:00
|
|
|
|
2013-02-06 01:22:19 +00:00
|
|
|
// Register meta types.
|
|
|
|
qRegisterMetaType<LoginResponse>("LoginResponse");
|
2013-02-25 19:39:07 +00:00
|
|
|
|
|
|
|
// launch instance.
|
|
|
|
if (!args["launch"].isNull())
|
|
|
|
return InstanceLauncher(args["launch"].toString()).launch();
|
|
|
|
|
|
|
|
// show main window
|
2013-01-09 18:22:22 +00:00
|
|
|
MainWindow mainWin;
|
|
|
|
mainWin.show();
|
|
|
|
|
2013-02-25 19:39:07 +00:00
|
|
|
// loop
|
2013-01-09 18:22:22 +00:00
|
|
|
return app.exec();
|
|
|
|
}
|
2013-02-22 15:17:31 +00:00
|
|
|
|
|
|
|
#include "main.moc"
|