pollymc/main.cpp

224 lines
6.1 KiB
C++
Raw Normal View History

2013-01-09 23:52:22 +05:30
/* Copyright 2013 MultiMC Contributors
2013-02-20 04:37:52 +05:30
*
* Authors: Andrew Okin
* Orochimarufan <orochimarufan.x3@gmail.com>
2013-01-09 23:52:22 +05:30
*
* 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-20 04:37:52 +05:30
#include <iostream>
2013-01-09 23:52:22 +05:30
#include <QApplication>
2013-02-20 04:37:52 +05:30
#include <QDir>
2013-01-09 23:52:22 +05:30
2013-02-20 04:37:52 +05:30
#include "gui/mainwindow.h"
#include "gui/logindialog.h"
#include "gui/taskdialog.h"
2013-02-22 22:48:23 +05:30
#include "gui/consolewindow.h"
2013-01-09 23:52:22 +05:30
#include "AppSettings.h"
#include "lists/InstanceList.h"
#include "tasks/LoginTask.h"
#include "MinecraftProcess.h"
2013-01-09 23:52:22 +05:30
#include "pathutils.h"
#include "cmdutils.h"
2013-02-20 04:37:52 +05:30
#include "config.h"
2013-02-20 04:37:52 +05:30
using namespace Util::Commandline;
// Commandline instance launcher
class InstanceLauncher : public QObject
{
2013-02-26 01:09:07 +05:30
Q_OBJECT
private:
2013-02-26 01:09:07 +05:30
InstanceList instances;
QString instId;
InstancePtr instance;
MinecraftProcess *proc;
ConsoleWindow *console;
public:
2013-02-26 02:14:36 +05:30
InstanceLauncher(QString instId) : QObject(), instances(globalSettings->get("InstanceDir").toString())
2013-02-26 01:09:07 +05:30
{
this->instId = instId;
}
private slots:
2013-02-26 01:09:07 +05:30
void onTerminated()
{
std::cout << "Minecraft exited" << std::endl;
QApplication::instance()->quit();
}
2013-03-12 02:49:17 +05:30
void onLoginComplete(QString instId, LoginResponse response)
2013-02-26 01:09:07 +05:30
{
2013-08-04 03:28:39 +05:30
proc = instance->prepareForLaunch(response.username, response.sessionID);
2013-08-03 19:27:33 +05:30
if(!proc)
{
//FIXME: report error
return;
}
2013-02-26 01:09:07 +05:30
console = new ConsoleWindow();
console->show();
2013-08-03 19:27:33 +05:30
2013-02-26 01:09:07 +05:30
connect(proc, SIGNAL(ended()), SLOT(onTerminated()));
connect(proc, SIGNAL(log(QString,MessageLevel::Enum)), console, SLOT(write(QString,MessageLevel::Enum)));
2013-08-03 19:27:33 +05:30
2013-02-26 01:09:07 +05:30
proc->launch();
}
2013-03-12 02:49:17 +05:30
void doLogin(QString instId, const QString &errorMsg)
2013-02-26 01:09:07 +05:30
{
LoginDialog* loginDlg = new LoginDialog(nullptr, errorMsg);
if (loginDlg->exec())
{
UserInfo uInfo(loginDlg->getUsername(), loginDlg->getPassword());
TaskDialog* tDialog = new TaskDialog(nullptr);
LoginTask* loginTask = new LoginTask(uInfo, tDialog);
2013-03-12 02:49:17 +05:30
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-26 01:09:07 +05:30
tDialog->exec(loginTask);
}
//onLoginComplete(LoginResponse("Offline","Offline", 1));
}
public:
2013-02-26 01:09:07 +05:30
int launch()
{
std::cout << "Loading Instances..." << std::endl;
instances.loadList();
std::cout << "Launching Instance '" << qPrintable(instId) << "'" << std::endl;
2013-03-19 03:30:46 +05:30
instance = instances.getInstanceById(instId);
2013-02-26 01:09:07 +05:30
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-12 02:49:17 +05:30
doLogin(instance->id(),"");
2013-02-26 01:09:07 +05:30
return QApplication::instance()->exec();
}
};
2013-01-09 23:52:22 +05:30
int main(int argc, char *argv[])
{
2013-02-26 01:09:07 +05:30
// initialize Qt
2013-01-09 23:52:22 +05:30
QApplication app(argc, argv);
2013-01-29 03:05:09 +05:30
app.setOrganizationName("Forkk");
app.setApplicationName("MultiMC 5");
2013-02-26 01:09:07 +05:30
// 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-26 02:14:36 +05:30
globalSettings = new AppSettings(&app);
2013-02-26 01:09:07 +05:30
2013-02-06 06:52:19 +05:30
// Register meta types.
qRegisterMetaType<LoginResponse>("LoginResponse");
2013-02-26 01:09:07 +05:30
// launch instance.
if (!args["launch"].isNull())
return InstanceLauncher(args["launch"].toString()).launch();
// show main window
2013-01-09 23:52:22 +05:30
MainWindow mainWin;
mainWin.show();
2013-02-26 01:09:07 +05:30
// loop
2013-01-09 23:52:22 +05:30
return app.exec();
}
#include "main.moc"