Move a good chunk of the singleton objects into a new QApplication subclass.

This commit is contained in:
Petr Mrázek
2013-09-07 04:00:58 +02:00
parent 3f30055afe
commit 6892c11e9f
32 changed files with 491 additions and 631 deletions

View File

@ -18,6 +18,7 @@
#include <QFileInfo>
#include <QDir>
#include <MultiMC.h>
#include "inisettingsobject.h"
#include "setting.h"
@ -52,6 +53,8 @@ BaseInstance::BaseInstance( BaseInstancePrivate* d_in,
settings().registerSetting(new Setting("UseCustomBaseJar", true));
settings().registerSetting(new Setting("CustomBaseJar", ""));
auto globalSettings = MMC->settings();
// Java Settings
settings().registerSetting(new Setting("OverrideJava", false));
settings().registerSetting(new OverrideSetting("JavaPath", globalSettings->getSetting("JavaPath")));

View File

@ -0,0 +1,74 @@
#include "InstanceLauncher.h"
#include "MultiMC.h"
#include <iostream>
#include "gui/logindialog.h"
#include "gui/taskdialog.h"
#include "gui/consolewindow.h"
#include "logic/tasks/LoginTask.h"
#include "logic/MinecraftProcess.h"
#include "lists/InstanceList.h"
InstanceLauncher::InstanceLauncher ( QString instId )
:QObject(), instId ( instId )
{}
void InstanceLauncher::onTerminated()
{
std::cout << "Minecraft exited" << std::endl;
MMC->quit();
}
void InstanceLauncher::onLoginComplete()
{
LoginTask * task = ( LoginTask * ) QObject::sender();
auto result = task->getResult();
auto instance = MMC->instances()->getInstanceById(instId);
proc = instance->prepareForLaunch ( result.username, result.sessionID );
if ( !proc )
{
//FIXME: report error
return;
}
console = new ConsoleWindow();
console->show();
connect ( proc, SIGNAL ( ended() ), SLOT ( onTerminated() ) );
connect ( proc, SIGNAL ( log ( QString,MessageLevel::Enum ) ), console, SLOT ( write ( QString,MessageLevel::Enum ) ) );
proc->launch();
}
void InstanceLauncher::doLogin ( const QString& errorMsg )
{
LoginDialog* loginDlg = new LoginDialog ( nullptr, errorMsg );
loginDlg->exec();
if ( loginDlg->result() == QDialog::Accepted )
{
UserInfo uInfo {loginDlg->getUsername(), loginDlg->getPassword() };
TaskDialog* tDialog = new TaskDialog ( nullptr );
LoginTask* loginTask = new LoginTask ( uInfo, tDialog );
connect ( loginTask, SIGNAL ( succeeded() ),SLOT ( onLoginComplete() ), Qt::QueuedConnection );
connect ( loginTask, SIGNAL ( failed ( QString ) ),SLOT ( doLogin ( QString ) ), Qt::QueuedConnection );
tDialog->exec ( loginTask );
}
//onLoginComplete(LoginResponse("Offline","Offline", 1));
}
int InstanceLauncher::launch()
{
std::cout << "Launching Instance '" << qPrintable ( instId ) << "'" << std::endl;
auto instance = MMC->instances()->getInstanceById(instId);
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;
doLogin ( "" );
return MMC->exec();
}

28
logic/InstanceLauncher.h Normal file
View File

@ -0,0 +1,28 @@
#pragma once
#include <QObject>
class MinecraftProcess;
class ConsoleWindow;
// Commandline instance launcher
class InstanceLauncher : public QObject
{
Q_OBJECT
private:
QString instId;
MinecraftProcess *proc;
ConsoleWindow *console;
public:
InstanceLauncher(QString instId);
private slots:
void onTerminated();
void onLoginComplete();
void doLogin(const QString &errorMsg);
public:
int launch();
};

View File

@ -2,7 +2,7 @@
#include "LegacyInstance_p.h"
#include "MinecraftProcess.h"
#include "LegacyUpdate.h"
#include "IconListModel.h"
#include "lists/IconList.h"
#include <setting.h>
#include <pathutils.h>
#include <cmdutils.h>
@ -10,6 +10,7 @@
#include <QFileInfo>
#include <QDir>
#include <QImage>
#include <MultiMC.h>
#define LAUNCHER_FILE "MultiMCLauncher.jar"
@ -32,8 +33,7 @@ MinecraftProcess* LegacyInstance::prepareForLaunch(QString user, QString session
{
MinecraftProcess * proc = new MinecraftProcess(this);
IconList * list = IconList::instance();
QIcon icon = list->getIcon(iconKey());
QIcon icon = MMC->icons()->getIcon(iconKey());
auto pixmap = icon.pixmap(128,128);
pixmap.save(PathCombine(minecraftRoot(), "icon.png"),"PNG");
@ -66,7 +66,7 @@ MinecraftProcess* LegacyInstance::prepareForLaunch(QString user, QString session
args << QString("-Xdock:name=\"%1\"").arg(windowTitle);
#endif
QString lwjgl = QDir(globalSettings->get("LWJGLDir").toString() + "/" + lwjglVersion()).absolutePath();
QString lwjgl = QDir(MMC->settings()->get("LWJGLDir").toString() + "/" + lwjglVersion()).absolutePath();
// launcher arguments
args << QString("-Xms%1m").arg(settings().get("MinMemAlloc").toInt());

View File

@ -3,7 +3,7 @@
#include "lists/MinecraftVersionList.h"
#include "BaseInstance.h"
#include "LegacyInstance.h"
#include "net/NetWorker.h"
#include "MultiMC.h"
#include "ModList.h"
#include <pathutils.h>
#include <quazip.h>
@ -52,15 +52,15 @@ void LegacyUpdate::lwjglStart()
QString url = version->url();
QUrl realUrl(url);
QString hostname = realUrl.host();
auto &worker = NetWorker::qnam();
auto worker = MMC->qnam();
QNetworkRequest req(realUrl);
req.setRawHeader("Host", hostname.toLatin1());
req.setHeader(QNetworkRequest::UserAgentHeader, "Wget/1.14 (linux-gnu)");
QNetworkReply * rep = worker.get ( req );
QNetworkReply * rep = worker->get ( req );
m_reply = QSharedPointer<QNetworkReply> (rep, &QObject::deleteLater);
connect(rep, SIGNAL(downloadProgress(qint64,qint64)), SLOT(updateDownloadProgress(qint64,qint64)));
connect(&worker, SIGNAL(finished(QNetworkReply*)), SLOT(lwjglFinished(QNetworkReply*)));
connect(worker, SIGNAL(finished(QNetworkReply*)), SLOT(lwjglFinished(QNetworkReply*)));
//connect(rep, SIGNAL(error(QNetworkReply::NetworkError)), SLOT(downloadError(QNetworkReply::NetworkError)));
}
@ -77,13 +77,13 @@ void LegacyUpdate::lwjglFinished(QNetworkReply* reply)
"\nSometimes you have to wait a bit if you download many LWJGL versions in a row. YMMV");
return;
}
auto &worker = NetWorker::qnam();
auto *worker = MMC->qnam();
//Here i check if there is a cookie for me in the reply and extract it
QList<QNetworkCookie> cookies = qvariant_cast<QList<QNetworkCookie>>(reply->header(QNetworkRequest::SetCookieHeader));
if(cookies.count() != 0)
{
//you must tell which cookie goes with which url
worker.cookieJar()->setCookiesFromUrl(cookies, QUrl("sourceforge.net"));
worker->cookieJar()->setCookiesFromUrl(cookies, QUrl("sourceforge.net"));
}
//here you can check for the 302 or whatever other header i need
@ -96,7 +96,7 @@ void LegacyUpdate::lwjglFinished(QNetworkReply* reply)
QNetworkRequest req(redirectedTo);
req.setRawHeader("Host", hostname.toLatin1());
req.setHeader(QNetworkRequest::UserAgentHeader, "Wget/1.14 (linux-gnu)");
QNetworkReply * rep = worker.get(req);
QNetworkReply * rep = worker->get(req);
connect(rep, SIGNAL(downloadProgress(qint64,qint64)), SLOT(updateDownloadProgress(qint64,qint64)));
m_reply = QSharedPointer<QNetworkReply> (rep, &QObject::deleteLater);
return;

View File

@ -1,4 +1,4 @@
#include "IconListModel.h"
#include "IconList.h"
#include <pathutils.h>
#include <QMap>
#include <QEventLoop>
@ -6,8 +6,6 @@
#include <QMimeData>
#include <QUrl>
#define MAX_SIZE 1024
IconList* IconList::m_Instance = 0;
QMutex IconList::mutex;
struct entry
{
@ -256,25 +254,4 @@ int IconList::getIconIndex ( QString key )
return -1;
}
void IconList::drop()
{
mutex.lock();
delete m_Instance;
m_Instance = 0;
mutex.unlock();
}
IconList* IconList::instance()
{
if ( !m_Instance )
{
mutex.lock();
if ( !m_Instance )
m_Instance = new IconList;
mutex.unlock();
}
return m_Instance;
}
#include "IconListModel.moc"
#include "IconList.moc"

View File

@ -9,8 +9,9 @@ class Private;
class IconList : public QAbstractListModel
{
public:
static IconList* instance();
static void drop();
IconList();
virtual ~IconList();
QIcon getIcon ( QString key );
int getIconIndex ( QString key );
@ -28,14 +29,10 @@ public:
void installIcons ( QStringList iconFiles );
private:
virtual ~IconList();
IconList();
// hide copy constructor
IconList ( const IconList & ) = delete;
// hide assign op
IconList& operator= ( const IconList & ) = delete;
void reindex();
static IconList* m_Instance;
static QMutex mutex;
Private* d;
};

View File

@ -22,13 +22,13 @@
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <pathutils.h>
#include "MultiMC.h"
#include "logic/lists/InstanceList.h"
#include "logic/lists/IconList.h"
#include "logic/BaseInstance.h"
#include "logic/InstanceFactory.h"
#include <logic/IconListModel.h>
#include "pathutils.h"
const static int GROUP_FILE_FORMAT_VERSION = 1;
@ -81,9 +81,8 @@ QVariant InstanceList::data ( const QModelIndex& index, int role ) const
}
case Qt::DecorationRole:
{
IconList * ic = IconList::instance();
QString key = pdata->iconKey();
return ic->getIcon(key);
return MMC->icons()->getIcon(key);
}
// for now.
case KCategorizedSortFilterProxyModel::CategorySortRole:
@ -413,5 +412,3 @@ bool InstanceProxyModel::subSortLessThan (const QModelIndex& left, const QModelI
return QString::localeAwareCompare(pdataLeft->name(), pdataRight->name()) < 0;
//return pdataLeft->name() < pdataRight->name();
}
#include "InstanceList.moc"

View File

@ -14,7 +14,7 @@
*/
#include "LwjglVersionList.h"
#include "logic/net/NetWorker.h"
#include "MultiMC.h"
#include <QtNetwork>
@ -91,8 +91,8 @@ void LWJGLVersionList::loadList()
Q_ASSERT_X(!m_loading, "loadList", "list is already loading (m_loading is true)");
setLoading(true);
auto & worker = NetWorker::qnam();
reply = worker.get(QNetworkRequest(QUrl(RSS_URL)));
auto worker = MMC->qnam();
reply = worker->get(QNetworkRequest(QUrl(RSS_URL)));
connect(reply, SIGNAL(finished()), SLOT(netRequestComplete()));
}

View File

@ -14,7 +14,7 @@
*/
#include "MinecraftVersionList.h"
#include <logic/net/NetWorker.h>
#include <MultiMC.h>
#include <QDebug>
@ -151,8 +151,8 @@ MCVListLoadTask::~MCVListLoadTask()
void MCVListLoadTask::executeTask()
{
setStatus("Loading instance version list...");
auto & worker = NetWorker::qnam();
vlistReply = worker.get(QNetworkRequest(QUrl(QString(MCVLIST_URLBASE) + "versions.json")));
auto worker = MMC->qnam();
vlistReply = worker->get(QNetworkRequest(QUrl(QString(MCVLIST_URLBASE) + "versions.json")));
connect(vlistReply, SIGNAL(finished()), this, SLOT(list_downloaded()));
}

View File

@ -1,6 +1,6 @@
#include "DownloadJob.h"
#include "pathutils.h"
#include "NetWorker.h"
#include "MultiMC.h"
Download::Download (QUrl url, QString target_path, QString expected_md5 )
:Job()
@ -49,8 +49,8 @@ void Download::start()
QNetworkRequest request ( m_url );
request.setRawHeader(QString("If-None-Match").toLatin1(), m_expected_md5.toLatin1());
auto &worker = NetWorker::qnam();
QNetworkReply * rep = worker.get ( request );
auto worker = MMC->qnam();
QNetworkReply * rep = worker->get ( request );
m_reply = QSharedPointer<QNetworkReply> ( rep, &QObject::deleteLater );
connect ( rep, SIGNAL ( downloadProgress ( qint64,qint64 ) ), SLOT ( downloadProgress ( qint64,qint64 ) ) );

View File

@ -1,30 +0,0 @@
#include "NetWorker.h"
#include <QThreadStorage>
class NetWorker::Private
{
public:
QNetworkAccessManager manager;
};
NetWorker::NetWorker ( QObject* parent ) : QObject ( parent )
{
d = new Private();
}
QNetworkAccessManager& NetWorker::qnam()
{
auto & w = worker();
return w.d->manager;
}
NetWorker& NetWorker::worker()
{
static QThreadStorage<NetWorker *> storage;
if (!storage.hasLocalData())
{
storage.setLocalData(new NetWorker());
}
return *storage.localData();
}

View File

@ -1,31 +0,0 @@
/*
_.ooo-._
.OOOP _ '.
dOOOO (_) \
OOOOOb |
OOOOOOb. |
OOOOOOOOb |
YOO(_)OOO /
'OOOOOY _.'
'""""''
*/
#pragma once
#include <QNetworkAccessManager>
#include <QUrl>
class NetWorker : public QObject
{
Q_OBJECT
public:
// for high level access to the sevices (preferred)
static NetWorker &worker();
// for low-level access to the network manager object
static QNetworkAccessManager &qnam();
public:
private:
explicit NetWorker ( QObject* parent = 0 );
class Private;
Private * d;
};

View File

@ -14,7 +14,7 @@
*/
#include "LoginTask.h"
#include "logic/net/NetWorker.h"
#include "MultiMC.h"
#include <QStringList>
@ -29,8 +29,8 @@ LoginTask::LoginTask( const UserInfo& uInfo, QObject* parent ) : Task(parent), u
void LoginTask::executeTask()
{
setStatus("Logging in...");
auto & worker = NetWorker::qnam();
connect(&worker, SIGNAL(finished(QNetworkReply*)), this, SLOT(processNetReply(QNetworkReply*)));
auto worker = MMC->qnam();
connect(worker, SIGNAL(finished(QNetworkReply*)), this, SLOT(processNetReply(QNetworkReply*)));
QUrl loginURL("https://login.minecraft.net/");
QNetworkRequest netRequest(loginURL);
@ -41,7 +41,7 @@ void LoginTask::executeTask()
params.addQueryItem("password", uInfo.password);
params.addQueryItem("version", "13");
netReply = worker.post(netRequest, params.query(QUrl::EncodeSpaces).toUtf8());
netReply = worker->post(netRequest, params.query(QUrl::EncodeSpaces).toUtf8());
}
void LoginTask::processNetReply(QNetworkReply *reply)