From ee5583251d92d47f96b03c3b447c115bab901c17 Mon Sep 17 00:00:00 2001 From: Petr Mrázek Date: Sun, 7 Jul 2013 23:51:26 +0200 Subject: Legacy versions downloaded from the new location are treated as legacy versions! --- libutil/include/dlqueue.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'libutil/include') diff --git a/libutil/include/dlqueue.h b/libutil/include/dlqueue.h index 9041e762..5fb9409c 100644 --- a/libutil/include/dlqueue.h +++ b/libutil/include/dlqueue.h @@ -38,7 +38,7 @@ public: /// save to file? bool m_save_to_file; /// if saving to file, use the one specified in this string - QString m_rel_target_path; + QString m_target_path; /// this is the output file, if any QFile m_output_file; /// if not saving to file, downloaded data is placed here -- cgit From dd86061f0ff6d19482e9a43af99156a55e60cf00 Mon Sep 17 00:00:00 2001 From: Petr Mrázek Date: Tue, 9 Jul 2013 00:52:03 +0200 Subject: Piddle-farting with 1.6 instances. Now with more json! --- libmultimc/src/gameupdatetask.cpp | 25 +++++++++++++++++++++++-- libutil/include/dlqueue.h | 5 ++++- libutil/include/jobqueue.h | 7 ++++--- libutil/src/dlqueue.cpp | 39 +++++++++++++++++++-------------------- 4 files changed, 50 insertions(+), 26 deletions(-) (limited to 'libutil/include') diff --git a/libmultimc/src/gameupdatetask.cpp b/libmultimc/src/gameupdatetask.cpp index fee2aa29..54e47410 100644 --- a/libmultimc/src/gameupdatetask.cpp +++ b/libmultimc/src/gameupdatetask.cpp @@ -95,7 +95,6 @@ void GameUpdateTask::versionFileFinished() exit(0); } - Q_ASSERT_X(jsonDoc.isObject(), "loadFromVList", "jsonDoc is not an object"); if(!jsonDoc.isObject()) { error("Error reading version file."); @@ -103,6 +102,10 @@ void GameUpdateTask::versionFileFinished() } QJsonObject root = jsonDoc.object(); + /* + * FIXME: this distinction is pretty weak. The only other option + * is to have a list of all the legacy versions. + */ QString args = root.value("processArguments").toString("legacy"); if(args == "legacy") { @@ -110,8 +113,26 @@ void GameUpdateTask::versionFileFinished() return; } + // save the version file in $instanceId/version.json and versions/$version/$version.json + QString version_id = targetVersion->descriptor(); + QString mc_dir = m_inst->minecraftDir(); + QString inst_dir = m_inst->rootDir(); + QString version1 = PathCombine(inst_dir, "/version.json"); + QString version2 = QString("versions/") + version_id + "/" + version_id + ".json"; + DownloadJob::ensurePathExists(version1); + DownloadJob::ensurePathExists(version2); + QFile vfile1 (version1); + QFile vfile2 (version2); + vfile1.open(QIODevice::Truncate | QIODevice::WriteOnly ); + vfile2.open(QIODevice::Truncate | QIODevice::WriteOnly ); + vfile1.write(DlJob->m_data); + vfile2.write(DlJob->m_data); + vfile1.close(); + vfile2.close(); + + // download the right jar, save it in versions/$version/$version.jar + // determine and download all the libraries, save them in libraries/whatever... - error("MC 1.6 isn't supported yet..."); exit(0); } diff --git a/libutil/include/dlqueue.h b/libutil/include/dlqueue.h index 5fb9409c..14fa6e60 100644 --- a/libutil/include/dlqueue.h +++ b/libutil/include/dlqueue.h @@ -5,13 +5,16 @@ /** * A single file for the downloader/cache to process. */ -class DownloadJob : public Job +class LIBUTIL_EXPORT DownloadJob : public Job { Q_OBJECT public: DownloadJob(QUrl url, QString rel_target_path = QString(), QString expected_md5 = QString()); static JobPtr create(QUrl url, QString rel_target_path = QString(), QString expected_md5 = QString()); + +public: + static bool ensurePathExists(QString filenamepath); public slots: virtual void start(); diff --git a/libutil/include/jobqueue.h b/libutil/include/jobqueue.h index 061686f6..26f49307 100644 --- a/libutil/include/jobqueue.h +++ b/libutil/include/jobqueue.h @@ -1,5 +1,6 @@ #pragma once #include +#include "libutil_config.h" enum JobStatus { @@ -11,7 +12,7 @@ enum JobStatus class JobList; -class Job : public QObject +class LIBUTIL_EXPORT Job : public QObject { Q_OBJECT protected: @@ -30,7 +31,7 @@ typedef QSharedPointer JobPtr; /** * A list of jobs, to be processed one by one. */ -class JobList : public QObject +class LIBUTIL_EXPORT JobList : public QObject { friend class JobListQueue; Q_OBJECT @@ -127,7 +128,7 @@ typedef QSharedPointer JobListPtr; /** * A queue of job lists! The job lists fail or finish as units. */ -class JobListQueue : public QObject +class LIBUTIL_EXPORT JobListQueue : public QObject { Q_OBJECT public: diff --git a/libutil/src/dlqueue.cpp b/libutil/src/dlqueue.cpp index 7e4d47eb..9a080c17 100644 --- a/libutil/src/dlqueue.cpp +++ b/libutil/src/dlqueue.cpp @@ -17,6 +17,13 @@ JobPtr DownloadJob::create ( QUrl url, QString target_path, QString expected_md5 return JobPtr ( new DownloadJob ( url, target_path, expected_md5 ) ); } +bool DownloadJob::ensurePathExists(QString filenamepath) +{ + QFileInfo a ( filenamepath ); + QDir dir; + return (dir.mkpath ( a.path() )); +} + void DownloadJob::start() { m_manager.reset ( new QNetworkAccessManager() ); @@ -24,34 +31,26 @@ void DownloadJob::start() { QString filename = m_target_path; m_output_file.setFileName ( filename ); - // if there already is a file and md5 checking is in effect - if ( m_output_file.exists() && m_check_md5 ) + // if there already is a file and md5 checking is in effect and it can be opened + if ( m_check_md5 && m_output_file.exists() && m_output_file.open ( QIODevice::ReadOnly ) ) { - // and it can be opened - if ( m_output_file.open ( QIODevice::ReadOnly ) ) + // check the md5 against the expected one + QString hash = QCryptographicHash::hash ( m_output_file.readAll(), QCryptographicHash::Md5 ).toHex().constData(); + m_output_file.close(); + // skip this file if they match + if ( hash == m_expected_md5 ) { - // check the md5 against the expected one - QString hash = QCryptographicHash::hash ( m_output_file.readAll(), QCryptographicHash::Md5 ).toHex().constData(); - m_output_file.close(); - // skip this file if they match - if ( hash == m_expected_md5 ) - { - qDebug() << "Skipping " << m_url.toString() << ": md5 match."; - emit finish(); - return; - } + qDebug() << "Skipping " << m_url.toString() << ": md5 match."; + emit finish(); + return; } } - QFileInfo a ( filename ); - QDir dir; - if ( !dir.mkpath ( a.path() ) ) + if(!ensurePathExists(filename)) { - /* - * error when making the folder structure - */ emit fail(); return; } + if ( !m_output_file.open ( QIODevice::WriteOnly ) ) { /* -- cgit From 33b9b25da7d3d29f949c9418295de257d437c9f8 Mon Sep 17 00:00:00 2001 From: Petr Mrázek Date: Sun, 14 Jul 2013 18:33:31 +0200 Subject: More work on the downloader and 1.6 instance creation --- gui/mainwindow.cpp | 2 +- libmultimc/include/instance.h | 30 +++++++++------------- libmultimc/src/gameupdatetask.cpp | 51 +++++++++++++++++++++++++++++++++++--- libmultimc/src/instance.cpp | 2 +- libsettings/src/settingsobject.cpp | 2 +- libutil/include/dlqueue.h | 2 ++ libutil/src/dlqueue.cpp | 34 ++++++++++++++++--------- 7 files changed, 87 insertions(+), 36 deletions(-) (limited to 'libutil/include') diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp index 5336b12c..8ba988c5 100644 --- a/gui/mainwindow.cpp +++ b/gui/mainwindow.cpp @@ -416,7 +416,7 @@ void MainWindow::onLoginComplete(LoginResponse response) { Q_ASSERT_X(m_activeInst != NULL, "onLoginComplete", "no active instance is set"); - if (!m_activeInst->shouldUpdateGame()) + if (!m_activeInst->shouldUpdate()) { launchInstance(m_activeInst, response); } diff --git a/libmultimc/include/instance.h b/libmultimc/include/instance.h index 717f8816..526025be 100644 --- a/libmultimc/include/instance.h +++ b/libmultimc/include/instance.h @@ -80,16 +80,7 @@ class LIBMULTIMC_EXPORT Instance : public QObject * This returns true if shouldForceUpdate game is true or if the intended and * current versions don't match. */ - Q_PROPERTY(bool shouldUpdateGame READ shouldUpdateGame STORED false) - - /*! - * Whether or not the game will be forced to update on the next launch. - * If this is set to true, shouldUpdateGame will be true, regardless of whether or not - * the current and intended versions match. - * It should be noted that this is set to false automatically when game updates are run. - */ - Q_PROPERTY(bool shouldForceUpdateGame READ shouldForceUpdateGame WRITE setShouldForceUpdateGame) - + Q_PROPERTY(bool shouldUpdate READ shouldUpdate WRITE setShouldUpdate) /*! * The instance's current version. @@ -236,14 +227,17 @@ public: virtual QString intendedVersion() const { return settings().get("IntendedJarVersion").toString(); } virtual void setIntendedVersion(QString val) { settings().set("IntendedJarVersion", val); } - virtual bool shouldUpdateGame() const - { return shouldForceUpdateGame() || intendedVersion() != currentVersion(); } - - virtual bool shouldForceUpdateGame() const { return settings().get("ShouldForceUpdate").toBool(); } - virtual void setShouldForceUpdateGame(bool val) { settings().set("ShouldForceUpdate", val); } - - - + virtual bool shouldUpdate() const + { + QVariant var = settings().get("ShouldUpdate"); + if(!var.isValid() || var.toBool() == false) + { + return intendedVersion() != currentVersion(); + } + return true; + } + virtual void setShouldUpdate(bool val) { settings().set("ShouldUpdate", val); } + //// Timestamps //// virtual qint64 lastLaunch() const { return settings().get("lastLaunchTime").value(); } diff --git a/libmultimc/src/gameupdatetask.cpp b/libmultimc/src/gameupdatetask.cpp index a8abb0b6..b6c1f936 100644 --- a/libmultimc/src/gameupdatetask.cpp +++ b/libmultimc/src/gameupdatetask.cpp @@ -112,6 +112,52 @@ void GameUpdateTask::versionFileFinished() getLegacyJar(); return; } + /* + // Iterate through the list. + QJsonObject groupList = root.value("libraries").toObject(); + + for (QJsonObject::iterator iter = groupList.begin(); + iter != groupList.end(); iter++) + { + QString groupName = iter.key(); + + // If not an object, complain and skip to the next one. + if (!iter.value().isObject()) + { + qWarning(QString("Group '%1' in the group list should " + "be an object.").arg(groupName).toUtf8()); + continue; + } + + QJsonObject groupObj = iter.value().toObject(); + + // Create the group object. + InstanceGroup *group = new InstanceGroup(groupName, this); + groups.push_back(group); + + // If 'hidden' isn't a bool value, just assume it's false. + if (groupObj.value("hidden").isBool() && groupObj.value("hidden").toBool()) + { + group->setHidden(groupObj.value("hidden").toBool()); + } + + if (!groupObj.value("instances").isArray()) + { + qWarning(QString("Group '%1' in the group list is invalid. " + "It should contain an array " + "called 'instances'.").arg(groupName).toUtf8()); + continue; + } + + // Iterate through the list of instances in the group. + QJsonArray instancesArray = groupObj.value("instances").toArray(); + + for (QJsonArray::iterator iter2 = instancesArray.begin(); + iter2 != instancesArray.end(); iter2++) + { + groupMap[(*iter2).toString()] = groupName; + } + }*/ // save the version file in $instanceId/version.json and versions/$version/$version.json QString version_id = targetVersion->descriptor(); @@ -148,10 +194,9 @@ void GameUpdateTask::versionFileFinished() void GameUpdateTask::jarlibFinished() { + m_inst->setCurrentVersion(targetVersion->descriptor()); + m_inst->setShouldUpdate(false); exit(1); - // YAYAYAYAYYAYAAUAYAYYAYYY!!!! - // WEE DID IT! - // YESSSSS! } void GameUpdateTask::jarlibFailed() diff --git a/libmultimc/src/instance.cpp b/libmultimc/src/instance.cpp index 08cd6605..fde31cf3 100644 --- a/libmultimc/src/instance.cpp +++ b/libmultimc/src/instance.cpp @@ -34,7 +34,7 @@ Instance::Instance(const QString &rootDir, QObject *parent) : settings().registerSetting(new Setting("iconKey", "default")); settings().registerSetting(new Setting("notes", "")); settings().registerSetting(new Setting("NeedsRebuild", true)); - settings().registerSetting(new Setting("ShouldForceUpdate", false)); + settings().registerSetting(new Setting("ShouldUpdate", false)); settings().registerSetting(new Setting("JarVersion", "Unknown")); settings().registerSetting(new Setting("LwjglVersion", "2.9.0")); settings().registerSetting(new Setting("IntendedJarVersion", "")); diff --git a/libsettings/src/settingsobject.cpp b/libsettings/src/settingsobject.cpp index 98c7b479..f94a6552 100644 --- a/libsettings/src/settingsobject.cpp +++ b/libsettings/src/settingsobject.cpp @@ -49,7 +49,7 @@ bool SettingsObject::registerSetting(Setting *setting) // Connect signals. connectSignals(*setting); - qDebug(QString("Registered setting %1.").arg(setting->id()).toUtf8()); + // qDebug(QString("Registered setting %1.").arg(setting->id()).toUtf8()); return true; } diff --git a/libutil/include/dlqueue.h b/libutil/include/dlqueue.h index 14fa6e60..69fc22a6 100644 --- a/libutil/include/dlqueue.h +++ b/libutil/include/dlqueue.h @@ -40,6 +40,8 @@ public: /// save to file? bool m_save_to_file; + /// is the saving file already open? + bool m_opened_for_saving; /// if saving to file, use the one specified in this string QString m_target_path; /// this is the output file, if any diff --git a/libutil/src/dlqueue.cpp b/libutil/src/dlqueue.cpp index 9a080c17..1ef8e212 100644 --- a/libutil/src/dlqueue.cpp +++ b/libutil/src/dlqueue.cpp @@ -10,6 +10,7 @@ DownloadJob::DownloadJob ( QUrl url, QString target_path, QString expected_md5 ) m_check_md5 = m_expected_md5.size(); m_save_to_file = m_target_path.size(); m_status = Job_NotStarted; + m_opened_for_saving = false; } JobPtr DownloadJob::create ( QUrl url, QString target_path, QString expected_md5 ) @@ -32,36 +33,32 @@ void DownloadJob::start() QString filename = m_target_path; m_output_file.setFileName ( filename ); // if there already is a file and md5 checking is in effect and it can be opened - if ( m_check_md5 && m_output_file.exists() && m_output_file.open ( QIODevice::ReadOnly ) ) + if ( m_output_file.exists() && m_output_file.open ( QIODevice::ReadOnly ) ) { // check the md5 against the expected one QString hash = QCryptographicHash::hash ( m_output_file.readAll(), QCryptographicHash::Md5 ).toHex().constData(); m_output_file.close(); // skip this file if they match - if ( hash == m_expected_md5 ) + if ( m_check_md5 && hash == m_expected_md5 ) { qDebug() << "Skipping " << m_url.toString() << ": md5 match."; emit finish(); return; } + else + { + m_expected_md5 = hash; + } } if(!ensurePathExists(filename)) { emit fail(); return; } - - if ( !m_output_file.open ( QIODevice::WriteOnly ) ) - { - /* - * Can't open the file... the job failed - */ - emit fail(); - return; - } } qDebug() << "Downloading " << m_url.toString(); QNetworkRequest request ( m_url ); + request.setRawHeader(QString("If-None-Match").toLatin1(), m_expected_md5.toLatin1()); QNetworkReply * rep = m_manager->get ( request ); m_reply = QSharedPointer ( rep, &QObject::deleteLater ); connect ( rep, SIGNAL ( downloadProgress ( qint64,qint64 ) ), SLOT ( downloadProgress ( qint64,qint64 ) ) ); @@ -120,8 +117,21 @@ void DownloadJob::downloadFinished() void DownloadJob::downloadReadyRead() { - if ( m_save_to_file ) + if( m_save_to_file ) { + if(!m_opened_for_saving) + { + if ( !m_output_file.open ( QIODevice::WriteOnly ) ) + { + /* + * Can't open the file... the job failed + */ + m_reply->abort(); + emit fail(); + return; + } + m_opened_for_saving = true; + } m_output_file.write ( m_reply->readAll() ); } } -- cgit