Errr... I forgot.

This commit is contained in:
Petr Mrázek 2013-08-03 23:58:39 +02:00
parent 13b1b98f7c
commit 4f73091bb5
19 changed files with 269 additions and 382 deletions

View File

@ -57,42 +57,20 @@ public:
/// Path to the instance's root directory. /// Path to the instance's root directory.
QString rootDir() const; QString rootDir() const;
/*!
* \brief Gets the instance list that this instance is a part of.
* Returns NULL if this instance is not in a list
* (the parent is not an InstanceList).
* \return A pointer to the InstanceList containing this instance.
*/
InstanceList *instList() const;
//////// INSTANCE INFO ////////
/// The name of the instance that is displayed to the user.
QString name() const; QString name() const;
/// Set the name of the instance that is displayed to the user.
void setName(QString val); void setName(QString val);
/// The instance's icon key.
QString iconKey() const; QString iconKey() const;
/// Set the instance's icon key.
void setIconKey(QString val); void setIconKey(QString val);
//! The instance's notes.
QString notes() const; QString notes() const;
/// set the instance notes text
void setNotes(QString val); void setNotes(QString val);
//! The instance's group.
QString group() const; QString group() const;
/// set the instance group
void setGroup(QString val); void setGroup(QString val);
//// Timestamps //// virtual bool setIntendedVersionId(QString version) = 0;
virtual QString intendedVersionId() = 0;
/** /**
* Gets the time that the instance was last launched. * Gets the time that the instance was last launched.
@ -102,6 +80,13 @@ public:
/// Sets the last launched time to 'val' milliseconds since epoch /// Sets the last launched time to 'val' milliseconds since epoch
void setLastLaunch(qint64 val = QDateTime::currentMSecsSinceEpoch()); void setLastLaunch(qint64 val = QDateTime::currentMSecsSinceEpoch());
/*!
* \brief Gets the instance list that this instance is a part of.
* Returns NULL if this instance is not in a list
* (the parent is not an InstanceList).
* \return A pointer to the InstanceList containing this instance.
*/
InstanceList *instList() const;
/*! /*!
* \brief Gets a pointer to this instance's version list. * \brief Gets a pointer to this instance's version list.

View File

@ -26,6 +26,8 @@ LegacyInstance.h
OneSixInstance.h OneSixInstance.h
InstanceFactory.h InstanceFactory.h
OneSixAssets.h
# Versions # Versions
InstanceVersion.h InstanceVersion.h
MinecraftVersion.h MinecraftVersion.h
@ -41,9 +43,8 @@ lists/LwjglVersionList.h
# Tasks # Tasks
tasks/Task.h tasks/Task.h
tasks/LoginTask.h tasks/LoginTask.h
tasks/LoginResponse.h
tasks/UserInfo.h
tasks/GameUpdateTask.h tasks/GameUpdateTask.h
tasks/UserInfo.h
MinecraftProcess.h MinecraftProcess.h
) )
@ -55,6 +56,8 @@ LegacyInstance.cpp
OneSixInstance.cpp OneSixInstance.cpp
InstanceFactory.cpp InstanceFactory.cpp
OneSixAssets.cpp
# Versions # Versions
InstanceVersion.cpp InstanceVersion.cpp
MinecraftVersion.cpp MinecraftVersion.cpp
@ -72,7 +75,6 @@ tasks/Task.cpp
tasks/LoginTask.cpp tasks/LoginTask.cpp
tasks/GameUpdateTask.cpp tasks/GameUpdateTask.cpp
tasks/UserInfo.cpp tasks/UserInfo.cpp
tasks/LoginResponse.cpp
MinecraftProcess.cpp MinecraftProcess.cpp
) )

View File

@ -21,6 +21,7 @@
#include "BaseInstance.h" #include "BaseInstance.h"
#include "LegacyInstance.h" #include "LegacyInstance.h"
#include "OneSixInstance.h" #include "OneSixInstance.h"
#include "InstanceVersion.h"
#include "inifile.h" #include "inifile.h"
#include <inisettingsobject.h> #include <inisettingsobject.h>
@ -61,7 +62,7 @@ InstanceFactory::InstLoadError InstanceFactory::loadInstance(BaseInstance *&inst
} }
InstanceFactory::InstCreateError InstanceFactory::createInstance(BaseInstance *&inst, const QString &instDir) InstanceFactory::InstCreateError InstanceFactory::createInstance( BaseInstance*& inst, const InstVersion* version, const QString& instDir )
{ {
QDir rootDir(instDir); QDir rootDir(instDir);
@ -70,8 +71,13 @@ InstanceFactory::InstCreateError InstanceFactory::createInstance(BaseInstance *&
{ {
return InstanceFactory::CantCreateDir; return InstanceFactory::CantCreateDir;
} }
return InstanceFactory::UnknownCreateError;
//inst = new BaseInstance(instDir, this); auto m_settings = new INISettingsObject(PathCombine(instDir, "instance.cfg"));
m_settings->registerSetting(new Setting("InstanceType", "Legacy"));
m_settings->set("InstanceType", "OneSix");
inst = new OneSixInstance(instDir, m_settings, this);
inst->setIntendedVersionId(version->descriptor());
//FIXME: really, how do you even know? //FIXME: really, how do you even know?
return InstanceFactory::NoCreateError; return InstanceFactory::NoCreateError;

View File

@ -21,6 +21,7 @@
#include "libmmc_config.h" #include "libmmc_config.h"
class InstVersion;
class BaseInstance; class BaseInstance;
/*! /*!
@ -59,7 +60,7 @@ public:
* - InstExists if the given instance directory is already an instance. * - InstExists if the given instance directory is already an instance.
* - CantCreateDir if the given instance directory cannot be created. * - CantCreateDir if the given instance directory cannot be created.
*/ */
InstCreateError createInstance(BaseInstance *&inst, const QString &instDir); InstCreateError createInstance(BaseInstance *&inst, const InstVersion * version, const QString &instDir);
/*! /*!
* \brief Loads an instance from the given directory. * \brief Loads an instance from the given directory.

View File

@ -206,28 +206,36 @@ void LegacyInstance::setLWJGLVersion ( QString val )
I_D(LegacyInstance); I_D(LegacyInstance);
d->m_settings->set ( "LwjglVersion", val ); d->m_settings->set ( "LwjglVersion", val );
} }
QString LegacyInstance::intendedVersion() const QString LegacyInstance::intendedVersionId()
{ {
I_D(LegacyInstance); I_D(LegacyInstance);
return d->m_settings->get ( "IntendedJarVersion" ).toString(); return d->m_settings->get ( "IntendedJarVersion" ).toString();
} }
void LegacyInstance::setIntendedVersion ( QString val ) bool LegacyInstance::setIntendedVersionId ( QString version )
{ {
/*
I_D(LegacyInstance); I_D(LegacyInstance);
d->m_settings->set ( "IntendedJarVersion", val ); d->m_settings->set ( "IntendedJarVersion", val );
*/
return false;
} }
bool LegacyInstance::shouldUpdate() const bool LegacyInstance::shouldUpdate() const
{ {
/*
I_D(LegacyInstance); I_D(LegacyInstance);
QVariant var = d->m_settings->get ( "ShouldUpdate" ); QVariant var = d->m_settings->get ( "ShouldUpdate" );
if ( !var.isValid() || var.toBool() == false ) if ( !var.isValid() || var.toBool() == false )
{ {
return intendedVersion() != currentVersion(); return intendedVersionId() != currentVersion();
} }
return true; return true;
*/
return false;
} }
void LegacyInstance::setShouldUpdate ( bool val ) void LegacyInstance::setShouldUpdate ( bool val )
{ {
/*
I_D(LegacyInstance); I_D(LegacyInstance);
d->m_settings->set ( "ShouldUpdate", val ); d->m_settings->set ( "ShouldUpdate", val );
*/
} }

View File

@ -84,8 +84,8 @@ public:
* If this is not the same as currentVersion, the instance's game updater * If this is not the same as currentVersion, the instance's game updater
* will be run on launch. * will be run on launch.
*/ */
QString intendedVersion() const; virtual QString intendedVersionId();
void setIntendedVersion(QString val); virtual bool setIntendedVersionId ( QString version );
/*! /*!
* Whether or not Minecraft should be downloaded when the instance is launched. * Whether or not Minecraft should be downloaded when the instance is launched.

157
backend/OneSixAssets.cpp Normal file
View File

@ -0,0 +1,157 @@
#include <QString>
#include <QDebug>
#include <QtXml/QtXml>
#include "OneSixAssets.h"
#include "dlqueue.h"
inline QDomElement getDomElementByTagName(QDomElement parent, QString tagname)
{
QDomNodeList elementList = parent.elementsByTagName(tagname);
if (elementList.count())
return elementList.at(0).toElement();
else
return QDomElement();
}
class ThreadedDeleter : public QThread
{
Q_OBJECT
public:
void run()
{
QDirIterator iter(m_base, QDirIterator::Subdirectories);
QStringList nuke_list;
int base_length = m_base.length();
while (iter.hasNext())
{
QString filename = iter.next();
QFileInfo current(filename);
// we keep the dirs... whatever
if(current.isDir())
continue;
QString trimmedf = filename;
trimmedf.remove(0, base_length + 1);
if(m_whitelist.contains(trimmedf))
{
//qDebug() << trimmedf << " gets to live";
}
else
{
// DO NOT TOLERATE JUNK
//qDebug() << trimmedf << " dies";
QFile f (filename);
f.remove();
}
}
};
QString m_base;
QStringList m_whitelist;
};
class NukeAndPaveJob: public Job
{
Q_OBJECT
public:
explicit NukeAndPaveJob(QString base, QStringList whitelist)
:Job()
{
QDir dir(base);
deleterThread.m_base = dir.absolutePath();
deleterThread.m_whitelist = whitelist;
};
public slots:
virtual void start()
{
connect(&deleterThread, SIGNAL(finished()), SLOT(threadFinished()));
deleterThread.start();
};
void threadFinished()
{
emit finish();
}
private:
ThreadedDeleter deleterThread;
};
class Private
{
public:
JobListQueue dl;
JobListPtr index_job;
JobListPtr files_job;
};
OneSixAssets::OneSixAssets(QObject* parent):QObject(parent), d(new Private) {}
void OneSixAssets::fetchFinished()
{
QString prefix ( "http://s3.amazonaws.com/Minecraft.Resources/" );
QString fprefix ( "assets/" );
QStringList nuke_whitelist;
JobPtr firstJob = d->index_job->getFirstJob();
auto DlJob = firstJob.dynamicCast<DownloadJob>();
QByteArray ba = DlJob->m_data;
QString xmlErrorMsg;
QDomDocument doc;
if ( !doc.setContent ( ba, false, &xmlErrorMsg ) )
{
qDebug() << "Failed to process s3.amazonaws.com/Minecraft.Resources. XML error:" <<
xmlErrorMsg << ba;
}
//QRegExp etag_match(".*([a-f0-9]{32}).*");
QDomNodeList contents = doc.elementsByTagName ( "Contents" );
JobList *job = new JobList();
connect ( job, SIGNAL ( finished() ), SIGNAL(finished()) );
connect ( job, SIGNAL ( failed() ), SIGNAL(failed()) );
for ( int i = 0; i < contents.length(); i++ )
{
QDomElement element = contents.at ( i ).toElement();
if ( element.isNull() )
continue;
QDomElement keyElement = getDomElementByTagName ( element, "Key" );
QDomElement lastmodElement = getDomElementByTagName ( element, "LastModified" );
QDomElement etagElement = getDomElementByTagName ( element, "ETag" );
QDomElement sizeElement = getDomElementByTagName ( element, "Size" );
if ( keyElement.isNull() || lastmodElement.isNull() || etagElement.isNull() || sizeElement.isNull() )
continue;
QString keyStr = keyElement.text();
QString lastModStr = lastmodElement.text();
QString etagStr = etagElement.text();
QString sizeStr = sizeElement.text();
//Filter folder keys
if ( sizeStr == "0" )
continue;
QString trimmedEtag = etagStr.remove ( '"' );
job->add ( DownloadJob::create ( QUrl ( prefix + keyStr ),fprefix + keyStr, trimmedEtag ) );
nuke_whitelist.append ( keyStr );
}
job->add ( JobPtr ( new NukeAndPaveJob ( fprefix, nuke_whitelist ) ) );
d->files_job.reset ( job );
d->dl.enqueue ( d->files_job );
}
void OneSixAssets::fetchStarted()
{
qDebug() << "Started downloading!";
}
void OneSixAssets::start()
{
JobList *job = new JobList();
job->add ( DownloadJob::create ( QUrl ( "http://s3.amazonaws.com/Minecraft.Resources/" ) ) );
connect ( job, SIGNAL ( finished() ), SLOT ( fetchFinished() ) );
connect ( job, SIGNAL ( started() ), SLOT ( fetchStarted() ) );
d->index_job.reset ( job );
d->dl.enqueue ( d->index_job );
}
#include "OneSixAssets.moc"

21
backend/OneSixAssets.h Normal file
View File

@ -0,0 +1,21 @@
#pragma once
#include <QObject>
#include <QSharedPointer>
class Private;
class OneSixAssets : public QObject
{
Q_OBJECT
signals:
void failed();
void finished();
public slots:
void fetchFinished();
void fetchStarted();
public:
explicit OneSixAssets ( QObject* parent = 0 );
void start();
QSharedPointer<Private> d;
};

View File

@ -1,18 +1,32 @@
#include "OneSixInstance.h" #include "OneSixInstance.h"
#include "OneSixInstance_p.h" #include "OneSixInstance_p.h"
#include "tasks/GameUpdateTask.h"
#include "MinecraftProcess.h"
#include <setting.h>
OneSixInstance::OneSixInstance ( const QString& rootDir, SettingsObject* settings, QObject* parent ) OneSixInstance::OneSixInstance ( const QString& rootDir, SettingsObject* setting_obj, QObject* parent )
: BaseInstance ( new OneSixInstancePrivate(), rootDir, settings, parent ) : BaseInstance ( new OneSixInstancePrivate(), rootDir, setting_obj, parent )
{ {
I_D(OneSixInstance);
d->m_settings->registerSetting(new Setting("IntendedVersion", ""));
} }
GameUpdateTask* OneSixInstance::doUpdate() GameUpdateTask* OneSixInstance::doUpdate()
{ {
return nullptr; return new GameUpdateTask(this);
} }
MinecraftProcess* OneSixInstance::prepareForLaunch ( QString user, QString session ) MinecraftProcess* OneSixInstance::prepareForLaunch ( QString user, QString session )
{ {
return nullptr; return nullptr;
} }
bool OneSixInstance::setIntendedVersionId ( QString version )
{
settings().set("IntendedVersion", version);
}
QString OneSixInstance::intendedVersionId()
{
return settings().get("IntendedVersion").toString();
}

View File

@ -8,4 +8,8 @@ public:
explicit OneSixInstance(const QString &rootDir, SettingsObject * settings, QObject *parent = 0); explicit OneSixInstance(const QString &rootDir, SettingsObject * settings, QObject *parent = 0);
virtual GameUpdateTask* doUpdate(); virtual GameUpdateTask* doUpdate();
virtual MinecraftProcess* prepareForLaunch ( QString user, QString session ); virtual MinecraftProcess* prepareForLaunch ( QString user, QString session );
virtual bool setIntendedVersionId ( QString version );
virtual QString intendedVersionId();
}; };

View File

@ -24,6 +24,7 @@
#include <QDebug> #include <QDebug>
#include "BaseInstance.h"
#include "lists/MinecraftVersionList.h" #include "lists/MinecraftVersionList.h"
#include "VersionFactory.h" #include "VersionFactory.h"
#include "OneSixVersion.h" #include "OneSixVersion.h"
@ -31,34 +32,23 @@
#include "pathutils.h" #include "pathutils.h"
GameUpdateTask::GameUpdateTask(const LoginResponse &response, BaseInstance *inst, QObject *parent) : GameUpdateTask::GameUpdateTask(BaseInstance *inst, QObject *parent) :
Task(parent), m_response(response) Task(parent)
{ {
m_inst = inst; m_inst = inst;
m_updateState = StateInit;
} }
void GameUpdateTask::executeTask() void GameUpdateTask::executeTask()
{ {
updateStatus();
// Get a pointer to the version object that corresponds to the instance's version. // Get a pointer to the version object that corresponds to the instance's version.
//FIXME: HACKERY targetVersion = (MinecraftVersion *)MinecraftVersionList::getMainList().findVersion(m_inst->intendedVersionId());
// targetVersion = (MinecraftVersion *)MinecraftVersionList::getMainList().findVersion(m_inst->intendedVersion());
if(targetVersion == NULL) if(targetVersion == NULL)
{ {
//Q_ASSERT_X(targetVersion != NULL, "game update", "instance's intended version is not an actual version"); emit gameUpdateComplete();
setState(StateFinished);
emit gameUpdateComplete(m_response);
return; return;
} }
///////////////////////// setStatus("Getting the version files from Mojang.");
// BUILD DOWNLOAD LIST //
/////////////////////////
// Build a list of URLs that will need to be downloaded.
setState(StateDetermineURLs);
QString urlstr("http://s3.amazonaws.com/Minecraft.Download/versions/"); QString urlstr("http://s3.amazonaws.com/Minecraft.Download/versions/");
urlstr += targetVersion->descriptor() + "/" + targetVersion->descriptor() + ".json"; urlstr += targetVersion->descriptor() + "/" + targetVersion->descriptor() + ".json";
@ -121,10 +111,6 @@ void GameUpdateTask::versionFileFinished()
void GameUpdateTask::jarlibFinished() void GameUpdateTask::jarlibFinished()
{ {
//FIXME: HACKERY
// m_inst->setCurrentVersion(targetVersion->descriptor());
// m_inst->setShouldUpdate(false);
// m_inst->setIsForNewLauncher(true);
exit(1); exit(1);
} }
@ -140,70 +126,6 @@ void GameUpdateTask::versionFileFailed()
exit(0); exit(0);
} }
int GameUpdateTask::state() const
{
return m_updateState;
}
void GameUpdateTask::setState(int state, bool resetSubStatus)
{
m_updateState = state;
if (resetSubStatus)
setSubStatus("");
else // We only need to update if we're not resetting substatus becasue setSubStatus updates status for us.
updateStatus();
}
QString GameUpdateTask::subStatus() const
{
return m_subStatusMsg;
}
void GameUpdateTask::setSubStatus(const QString &msg)
{
m_subStatusMsg = msg;
updateStatus();
}
QString GameUpdateTask::getStateMessage(int state)
{
switch (state)
{
case StateInit:
return "Initializing";
case StateDetermineURLs:
return "Determining files to download";
case StateDownloadFiles:
return "Downloading files";
case StateInstall:
return "Installing";
case StateFinished:
return "Finished";
default:
return "Downloading instance files";
}
}
void GameUpdateTask::updateStatus()
{
QString newStatus;
newStatus = getStateMessage(state());
if (!subStatus().isEmpty())
newStatus += ": " + subStatus();
else
newStatus += "...";
setStatus(newStatus);
}
void GameUpdateTask::error(const QString &msg) void GameUpdateTask::error(const QString &msg)
{ {
emit gameUpdateError(msg); emit gameUpdateError(msg);

View File

@ -24,12 +24,10 @@
#include "dlqueue.h" #include "dlqueue.h"
#include "Task.h" #include "Task.h"
#include "tasks/LoginResponse.h"
#include "BaseInstance.h"
#include "libmmc_config.h" #include "libmmc_config.h"
class MinecraftVersion; class MinecraftVersion;
class BaseInstance;
/*! /*!
* The game update task is the task that handles downloading instances' files. * The game update task is the task that handles downloading instances' files.
@ -37,58 +35,14 @@ class MinecraftVersion;
class LIBMULTIMC_EXPORT GameUpdateTask : public Task class LIBMULTIMC_EXPORT GameUpdateTask : public Task
{ {
Q_OBJECT Q_OBJECT
/*!
* The task's state.
* A certain state message will be shown depending on what this is set to.
*/
Q_PROPERTY(int state READ state WRITE setState)
/*!
* The substatus message.
* This will be next to the the state message in the task's status.
*/
Q_PROPERTY(QString subStatus READ subStatus WRITE setSubStatus)
public: public:
explicit GameUpdateTask(const LoginResponse &response, BaseInstance *inst, QObject *parent = 0); explicit GameUpdateTask(BaseInstance *inst, QObject *parent = 0);
/////////////////////////
// EXECUTION FUNCTIONS //
/////////////////////////
virtual void executeTask(); virtual void executeTask();
//////////////////////
// STATE AND STATUS //
//////////////////////
virtual int state() const;
virtual void setState(int state, bool resetSubStatus = true);
virtual QString subStatus() const;
virtual void setSubStatus(const QString &msg);
/*!
* Gets the message that will be displated for the given state.
*/
virtual QString getStateMessage(int state);
private:
void getLegacyJar();
void determineNewVersion();
public slots: public slots:
/*!
* Updates the status message based on the state and substatus message.
*/
virtual void updateStatus();
virtual void error(const QString &msg); virtual void error(const QString &msg);
private slots: private slots:
void updateDownloadProgress(qint64 current, qint64 total); void updateDownloadProgress(qint64 current, qint64 total);
@ -103,7 +57,7 @@ signals:
* \brief Signal emitted when the game update is complete. * \brief Signal emitted when the game update is complete.
* \param response The login response received from login task. * \param response The login response received from login task.
*/ */
void gameUpdateComplete(const LoginResponse &response); void gameUpdateComplete();
/*! /*!
* \brief Signal emitted if an error occurrs during the update. * \brief Signal emitted if an error occurrs during the update.
@ -112,37 +66,10 @@ signals:
void gameUpdateError(const QString &errorMsg); void gameUpdateError(const QString &errorMsg);
private: private:
///////////
// STUFF //
///////////
BaseInstance *m_inst; BaseInstance *m_inst;
LoginResponse m_response;
////////////////////////////
// STATE AND STATUS STUFF //
////////////////////////////
int m_updateState;
QString m_subStatusMsg; QString m_subStatusMsg;
enum UpdateState
{
// Initializing
StateInit = 0,
// Determining files to download
StateDetermineURLs,
// Downloading files
StateDownloadFiles,
// Installing files
StateInstall,
// Finished
StateFinished
};
JobListPtr legacyDownloadJob; JobListPtr legacyDownloadJob;
JobListPtr specificVersionDownloadJob; JobListPtr specificVersionDownloadJob;
JobListPtr jarlibDownloadJob; JobListPtr jarlibDownloadJob;

View File

@ -1,69 +0,0 @@
/* Copyright 2013 MultiMC Contributors
*
* 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.
*/
#include "tasks/LoginResponse.h"
LoginResponse::LoginResponse(const QString& username, const QString& sessionID,
qint64 latestVersion, QObject *parent) :
QObject(parent)
{
this->m_username = username;
this->m_sessionID = sessionID;
this->m_latestVersion = latestVersion;
}
LoginResponse::LoginResponse()
{
this->m_username = "";
this->m_sessionID = "";
this->m_latestVersion = 0;
}
LoginResponse::LoginResponse(const LoginResponse &other)
{
this->m_username = other.username();
this->m_sessionID = other.sessionID();
this->m_latestVersion = other.latestVersion();
}
QString LoginResponse::username() const
{
return m_username;
}
void LoginResponse::setUsername(const QString& username)
{
this->m_username = username;
}
QString LoginResponse::sessionID() const
{
return m_sessionID;
}
void LoginResponse::setSessionID(const QString& sessionID)
{
this->m_sessionID = sessionID;
}
qint64 LoginResponse::latestVersion() const
{
return m_latestVersion;
}
void LoginResponse::setLatestVersion(qint64 v)
{
this->m_latestVersion = v;
}

View File

@ -1,94 +0,0 @@
/* Copyright 2013 MultiMC Contributors
*
* 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.
*/
#pragma once
#include <QObject>
#include "libmmc_config.h"
/*!
* \brief The LoginResponse class represents a response received from Minecraft's login servers.
*/
class LIBMULTIMC_EXPORT LoginResponse : public QObject
{
Q_OBJECT
public:
/*!
* \brief Creates a new instance of the LoginResponse class.
* \param username The user's username.
* \param sessionID The user's session ID.
* \param latestVersion The latest version of Minecraft.
* \param parent The parent object.
*/
explicit LoginResponse(const QString &username, const QString &sessionID,
qint64 latestVersion, QObject *parent = 0);
LoginResponse();
LoginResponse(const LoginResponse& other);
/*!
* \brief Gets the username.
* This one should go without saying.
* \return The username.
* \sa setUsername()
*/
QString username() const;
/*!
* \brief setUsername Sets the username.
* \param username The new username.
* \sa username()
*/
void setUsername(const QString& username);
/*!
* \brief Gets the session ID.
* \return The session ID.
* \sa setSessionID()
*/
QString sessionID() const;
/*!
* \brief Sets the session ID.
* \param sessionID The new session ID.
* \sa sessionID()
*/
void setSessionID(const QString& sessionID);
/*!
* \brief Gets the latest version.
* This is a value returned by the login servers when a user logs in.
* \return The latest version.
* \sa setLatestVersion()
*/
qint64 latestVersion() const;
/*!
* \brief Sets the latest version.
* \param v The new latest version.
* \sa latestVersion()
*/
void setLatestVersion(qint64 v);
private:
QString m_username;
QString m_sessionID;
qint64 m_latestVersion;
};
Q_DECLARE_METATYPE(LoginResponse)

View File

@ -77,7 +77,7 @@ void LoginTask::processNetReply(QNetworkReply *reply)
QString username = strings[2]; QString username = strings[2];
QString sessionID = strings[3]; QString sessionID = strings[3];
LoginResponse response(username, sessionID, latestVersion); LoginResponse response{username, sessionID, latestVersion};
emit loginComplete(response); emit loginComplete(response);
} }
else else

View File

@ -19,10 +19,15 @@
#include "Task.h" #include "Task.h"
#include "UserInfo.h" #include "UserInfo.h"
#include "tasks/LoginResponse.h"
#include "libmmc_config.h" #include "libmmc_config.h"
struct LoginResponse
{
QString username;
QString sessionID;
qint64 latestVersion;
};
//class QNetworkAccessManager; //class QNetworkAccessManager;
class QNetworkReply; class QNetworkReply;

View File

@ -192,15 +192,13 @@ void MainWindow::on_actionAddInstance_triggered()
QString instDir = PathCombine(globalSettings->get("InstanceDir").toString(), instDirName); QString instDir = PathCombine(globalSettings->get("InstanceDir").toString(), instDirName);
auto &loader = InstanceFactory::get(); auto &loader = InstanceFactory::get();
auto error = loader.createInstance(newInstance, instDir);
QString errorMsg = QString("Failed to create instance %1: ").arg(instDirName);
auto error = loader.createInstance(newInstance, newInstDlg->selectedVersion(), instDir);
QString errorMsg = QString("Failed to create instance %1: ").arg(instDirName);
switch (error) switch (error)
{ {
case InstanceFactory::NoCreateError: case InstanceFactory::NoCreateError:
newInstance->setName(newInstDlg->instName()); newInstance->setName(newInstDlg->instName());
// FIXME:HACKERY
// newInstance->setIntendedVersion(newInstDlg->selectedVersion()->descriptor());
instList.add(InstancePtr(newInstance)); instList.add(InstancePtr(newInstance));
return; return;
@ -417,24 +415,25 @@ void MainWindow::onLoginComplete(LoginResponse response)
{ {
if(!m_activeInst) if(!m_activeInst)
return; return;
m_activeLogin = LoginResponse(response);
GameUpdateTask *updateTask = m_activeInst->doUpdate(); GameUpdateTask *updateTask = m_activeInst->doUpdate();
if(!updateTask) if(!updateTask)
{ {
launchInstance(m_activeInst, response); launchInstance(m_activeInst, m_activeLogin);
} }
else else
{ {
TaskDialog *tDialog = new TaskDialog(this); TaskDialog *tDialog = new TaskDialog(this);
connect(updateTask, SIGNAL(gameUpdateComplete(LoginResponse)),SLOT(onGameUpdateComplete(LoginResponse))); connect(updateTask, SIGNAL(gameUpdateComplete()),SLOT(onGameUpdateComplete()));
connect(updateTask, SIGNAL(gameUpdateError(QString)), SLOT(onGameUpdateError(QString))); connect(updateTask, SIGNAL(gameUpdateError(QString)), SLOT(onGameUpdateError(QString)));
tDialog->exec(updateTask); tDialog->exec(updateTask);
} }
} }
void MainWindow::onGameUpdateComplete(LoginResponse response) void MainWindow::onGameUpdateComplete()
{ {
launchInstance(m_activeInst, response); launchInstance(m_activeInst, m_activeLogin);
} }
void MainWindow::onGameUpdateError(QString error) void MainWindow::onGameUpdateError(QString error)
@ -446,7 +445,7 @@ void MainWindow::launchInstance(BaseInstance *instance, LoginResponse response)
{ {
Q_ASSERT_X(instance != NULL, "launchInstance", "instance is NULL"); Q_ASSERT_X(instance != NULL, "launchInstance", "instance is NULL");
proc = instance->prepareForLaunch(response.username(), response.sessionID()); proc = instance->prepareForLaunch(response.username, response.sessionID);
if(!proc) if(!proc)
return; return;
@ -524,8 +523,7 @@ void MainWindow::on_actionChangeInstMCVersion_triggered()
VersionSelectDialog *vselect = new VersionSelectDialog(inst->versionList(), this); VersionSelectDialog *vselect = new VersionSelectDialog(inst->versionList(), this);
if (vselect->exec() && vselect->selectedVersion()) if (vselect->exec() && vselect->selectedVersion())
{ {
// FIXME:HACKERY inst->setIntendedVersionId(vselect->selectedVersion()->descriptor());
// inst->setIntendedVersion(vselect->selectedVersion()->descriptor());
} }
} }

View File

@ -19,7 +19,7 @@
#include <QMainWindow> #include <QMainWindow>
#include "lists/InstanceList.h" #include "lists/InstanceList.h"
#include "tasks/LoginResponse.h" #include "tasks/LoginTask.h"
#include "BaseInstance.h" #include "BaseInstance.h"
class InstanceModel; class InstanceModel;
@ -100,7 +100,7 @@ private slots:
void onLoginComplete(LoginResponse response); void onLoginComplete(LoginResponse response);
void onGameUpdateComplete(LoginResponse response); void onGameUpdateComplete();
void onGameUpdateError(QString error); void onGameUpdateError(QString error);
void taskStart(Task *task); void taskStart(Task *task);
@ -133,6 +133,7 @@ private:
// This is set when the user launches an instance and is used to refer to that // This is set when the user launches an instance and is used to refer to that
// instance throughout the launching process. // instance throughout the launching process.
BaseInstance *m_activeInst; BaseInstance *m_activeInst;
LoginResponse m_activeLogin;
Task *m_versionLoadTask; Task *m_versionLoadTask;
}; };

View File

@ -28,7 +28,6 @@
#include "AppSettings.h" #include "AppSettings.h"
#include "lists/InstanceList.h" #include "lists/InstanceList.h"
#include "tasks/LoginResponse.h"
#include "tasks/LoginTask.h" #include "tasks/LoginTask.h"
#include "MinecraftProcess.h" #include "MinecraftProcess.h"
@ -64,7 +63,7 @@ private slots:
void onLoginComplete(QString instId, LoginResponse response) void onLoginComplete(QString instId, LoginResponse response)
{ {
proc = instance->prepareForLaunch(response.username(), response.sessionID()); proc = instance->prepareForLaunch(response.username, response.sessionID);
if(!proc) if(!proc)
{ {
//FIXME: report error //FIXME: report error