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() ); } }