From a7a84d4dbb58565f108cb0886da6cb786e34d10d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Sat, 27 Jul 2013 11:41:45 +0200 Subject: [PATCH] Parsing the version files, part III --- libmultimc/include/fullversionfactory.h | 2 + libmultimc/include/instance.h | 16 ++- libmultimc/include/library.h | 180 +++++++++++++++++------- libmultimc/src/fullversion.cpp | 1 + libmultimc/src/fullversionfactory.cpp | 104 ++++++++------ libmultimc/src/gameupdatetask.cpp | 2 + libmultimc/src/instance.cpp | 1 + libmultimc/src/library.cpp | 2 +- 8 files changed, 214 insertions(+), 94 deletions(-) diff --git a/libmultimc/include/fullversionfactory.h b/libmultimc/include/fullversionfactory.h index 673a6a72..60e5c983 100644 --- a/libmultimc/include/fullversionfactory.h +++ b/libmultimc/include/fullversionfactory.h @@ -2,6 +2,7 @@ #include struct FullVersion; +class Rule; class FullVersionFactory { @@ -19,5 +20,6 @@ public: QSharedPointer parse(QByteArray data); private: QSharedPointer parse4(QJsonObject root, QSharedPointer product); + QList > parse4rules(QJsonObject & baseObj); QStringList legacyWhitelist; }; \ No newline at end of file diff --git a/libmultimc/include/instance.h b/libmultimc/include/instance.h index 526025be..f6857cd8 100644 --- a/libmultimc/include/instance.h +++ b/libmultimc/include/instance.h @@ -116,8 +116,11 @@ class LIBMULTIMC_EXPORT Instance : public QObject */ Q_PROPERTY(qint64 lastCurrentVersionUpdate READ lastCurrentVersionUpdate WRITE setLastCurrentVersionUpdate) - - + /*! + * Is the instance a new launcher instance? Get/Set + */ + Q_PROPERTY(bool isForNewLauncher READ isForNewLauncher WRITE setIsForNewLauncher) + // Dirs //! Path to the instance's .minecraft folder. Q_PROPERTY(QString minecraftDir READ minecraftDir STORED false) @@ -250,6 +253,15 @@ public: virtual qint64 lastCurrentVersionUpdate() const { return settings().get("lastVersionUpdate").value(); } virtual void setLastCurrentVersionUpdate(qint64 val) { settings().set("lastVersionUpdate", val); } + virtual bool isForNewLauncher() + { + return settings().get("IsForNewLauncher").value(); + } + + virtual void setIsForNewLauncher(bool value = true) + { + settings().set("IsForNewLauncher", value); + } ////// Directories ////// QString minecraftDir() const; diff --git a/libmultimc/include/library.h b/libmultimc/include/library.h index 30270bc1..8d97b4a6 100644 --- a/libmultimc/include/library.h +++ b/libmultimc/include/library.h @@ -19,33 +19,6 @@ class Library; -enum RuleAction -{ - Allow, - Disallow, - Defer -}; - -RuleAction RuleAction_fromString(QString); - -class Rule -{ -protected: - RuleAction m_result; - virtual bool applies(Library * parent) = 0; -public: - Rule(RuleAction result) - :m_result(result) {} - virtual ~Rule(){}; - RuleAction apply(Library * parent) - { - if(applies(parent)) - return m_result; - else - return Defer; - }; -}; - enum OpSys { Os_Windows, @@ -73,6 +46,33 @@ OpSys OpSys_fromString(QString); #endif +enum RuleAction +{ + Allow, + Disallow, + Defer +}; + +RuleAction RuleAction_fromString(QString); + +class Rule +{ +protected: + RuleAction m_result; + virtual bool applies(Library * parent) = 0; +public: + Rule(RuleAction result) + :m_result(result) {} + virtual ~Rule(){}; + RuleAction apply(Library * parent) + { + if(applies(parent)) + return m_result; + else + return Defer; + }; +}; + class OsRule : public Rule { private: @@ -85,9 +85,13 @@ protected: { return (m_system == currentSystem); } -public: OsRule(RuleAction result, OpSys system, QString version_regexp) : Rule(result), m_system(system), m_version_regexp(version_regexp) {} +public: + static QSharedPointer create(RuleAction result, OpSys system, QString version_regexp) + { + return QSharedPointer (new OsRule(result, system, version_regexp)); + } }; class ImplicitRule : public Rule @@ -97,39 +101,119 @@ protected: { return true; } -public: ImplicitRule(RuleAction result) : Rule(result) {} +public: + static QSharedPointer create(RuleAction result) + { + return QSharedPointer (new ImplicitRule(result)); + } }; class Library { +private: + // basic values used internally (so far) + QString m_name; + QString m_base_url; + QList > m_rules; + + // derived values used for real things + /// where to store the lib locally + QString m_storage_path; + /// where to download the lib from + QString m_download_path; + /// is this lib actuall active on the current OS? + bool m_is_active; + + // native lib? + bool m_is_native; + QMap m_native_suffixes; public: - QString base_url; - QString name; - QList > rules; - QMap natives; QStringList extract_excludes; - void AddRule(RuleAction result) +public: + /// finalize the library, processing the input values into derived values and state + void finalize() { - rules.append(QSharedPointer(new ImplicitRule(result))); - } - void AddRule(RuleAction result, OpSys system, QString version_regexp) + QStringList parts = m_name.split(':'); + QString relative = parts[0]; + relative.replace('.','/'); + relative += '/' + parts[1] + '/' + parts[2] + '/' + parts[1] + '-' + parts[2]; + if(!m_is_native) + relative += ".jar"; + else + { + if(m_native_suffixes.contains(currentSystem)) + { + relative += "-" + m_native_suffixes[currentSystem] + ".jar"; + } + else + { + // really, bad. + relative += ".jar"; + } + } + m_storage_path = relative; + m_download_path = m_base_url + relative; + + if(m_rules.empty()) + { + m_is_active = true; + } + else + { + RuleAction result = Disallow; + for(auto rule: m_rules) + { + RuleAction temp = rule->apply( this ); + if(temp != Defer) + result = temp; + } + m_is_active = (result == Allow); + } + if(m_is_native) + { + m_is_active = m_is_active && m_native_suffixes.contains(currentSystem); + } + }; + + Library(QString name) { - rules.append(QSharedPointer(new OsRule(result, system, version_regexp))); + m_is_native = false; + m_is_native = false; + m_name = name; + m_base_url = "https://s3.amazonaws.com/Minecraft.Download/libraries/"; } + + void setName(QString name) + { + m_name = name; + } + + void setBaseUrl(QString base_url) + { + m_base_url = base_url; + } + + void setIsNative() + { + m_is_native = true; + } + + void addNative(OpSys os, QString suffix) + { + m_is_native = true; + m_native_suffixes[os] = suffix; + } + + void setRules(QList > rules) + { + m_rules = rules; + } + bool applies() { - if(rules.empty()) - return true; - RuleAction result = Disallow; - for(auto rule: rules) - { - RuleAction temp = rule->apply( this ); - if(temp != Defer) - result = temp; - } - return result == Allow; + return m_is_active; } }; diff --git a/libmultimc/src/fullversion.cpp b/libmultimc/src/fullversion.cpp index 6f4662b4..53664c2a 100644 --- a/libmultimc/src/fullversion.cpp +++ b/libmultimc/src/fullversion.cpp @@ -1,4 +1,5 @@ #include #include "fullversion.h" +#include // ECHO, echo, echo, .... \ No newline at end of file diff --git a/libmultimc/src/fullversionfactory.cpp b/libmultimc/src/fullversionfactory.cpp index 9b4ae266..bb55b4a9 100644 --- a/libmultimc/src/fullversionfactory.cpp +++ b/libmultimc/src/fullversionfactory.cpp @@ -2,6 +2,61 @@ #include "fullversion.h" #include +class LibraryFinalizer +{ +public: + LibraryFinalizer(QSharedPointer library) + { + m_library = library; + } + + QSharedPointer m_library; +}; + +// Library rules (if any) +QList > FullVersionFactory::parse4rules(QJsonObject & baseObj) +{ + QList > rules; + auto rulesVal = baseObj.value("rules"); + if(rulesVal.isArray()) + { + QJsonArray ruleList = rulesVal.toArray(); + for(auto ruleVal : ruleList) + { + QSharedPointer rule; + if(!ruleVal.isObject()) + continue; + auto ruleObj = ruleVal.toObject(); + auto actionVal = ruleObj.value("action"); + if(!actionVal.isString()) + continue; + auto action = RuleAction_fromString(actionVal.toString()); + if(action == Defer) + continue; + + auto osVal = ruleObj.value("os"); + if(!osVal.isObject()) + { + // add a new implicit action rule + rules.append(ImplicitRule::create(action)); + } + else + { + auto osObj = osVal.toObject(); + auto osNameVal = osObj.value("name"); + if(!osNameVal.isString()) + continue; + OpSys requiredOs = OpSys_fromString(osNameVal.toString()); + QString versionRegex = osObj.value("version").toString(); + // add a new OS rule + rules.append(OsRule::create(action, requiredOs, versionRegex)); + } + } + } + return rules; +} + + QSharedPointer FullVersionFactory::parse4(QJsonObject root, QSharedPointer fullVersion) { fullVersion->id = root.value("id").toString(); @@ -48,7 +103,6 @@ QSharedPointer FullVersionFactory::parse4(QJsonObject root, QShared QJsonArray libList = root.value("libraries").toArray(); for (auto libVal : libList) { - QSharedPointer library(new Library()); if (!libVal.isObject()) { continue; @@ -60,7 +114,7 @@ QSharedPointer FullVersionFactory::parse4(QJsonObject root, QShared auto nameVal = libObj.value("name"); if(!nameVal.isString()) continue; - library->name = nameVal.toString(); + QSharedPointer library(new Library(nameVal.toString())); // Extract excludes (if any) auto extractVal = libObj.value("extract"); @@ -84,6 +138,7 @@ QSharedPointer FullVersionFactory::parse4(QJsonObject root, QShared auto nativesVal = libObj.value("natives"); if(nativesVal.isObject()) { + library->setIsNative(); auto nativesObj = nativesVal.toObject(); auto iter = nativesObj.begin(); while(iter != nativesObj.end()) @@ -93,50 +148,13 @@ QSharedPointer FullVersionFactory::parse4(QJsonObject root, QShared continue; if(!iter.value().isString()) continue; - library->natives[osType] = iter.value().toString(); + library->addNative(osType, iter.value().toString()); iter++; } } - - // Library rules (if any) - auto rulesVal = libObj.value("rules"); - if(rulesVal.isArray()) - { - QList > rules; - - QJsonArray ruleList = rulesVal.toArray(); - for(auto ruleVal : ruleList) - { - QSharedPointer rule; - if(!ruleVal.isObject()) - continue; - auto ruleObj = ruleVal.toObject(); - auto actionVal = ruleObj.value("action"); - if(!actionVal.isString()) - continue; - auto action = RuleAction_fromString(actionVal.toString()); - if(action == Defer) - continue; - - auto osVal = ruleObj.value("os"); - if(!osVal.isObject()) - { - rule.reset(new ImplicitRule(action)); - } - else - { - auto osObj = osVal.toObject(); - auto osNameVal = osObj.value("name"); - if(!osNameVal.isString()) - continue; - OpSys requiredOs = OpSys_fromString(osNameVal.toString()); - QString versionRegex = osObj.value("version").toString(); - rule.reset(new OsRule(action, requiredOs, versionRegex)); - } - rules.append(rule); - } - library->rules = rules; - } + library->setRules(parse4rules(libObj)); + library->finalize(); + fullVersion->libraries.append(library); } return fullVersion; } diff --git a/libmultimc/src/gameupdatetask.cpp b/libmultimc/src/gameupdatetask.cpp index 61880118..bae85c17 100644 --- a/libmultimc/src/gameupdatetask.cpp +++ b/libmultimc/src/gameupdatetask.cpp @@ -141,6 +141,7 @@ void GameUpdateTask::jarlibFinished() { m_inst->setCurrentVersion(targetVersion->descriptor()); m_inst->setShouldUpdate(false); + m_inst->setIsForNewLauncher(true); exit(1); } @@ -195,6 +196,7 @@ void GameUpdateTask::legacyJarFinished() { setState(StateFinished); emit gameUpdateComplete(m_response); + m_inst->setIsForNewLauncher(true); exit(1); } diff --git a/libmultimc/src/instance.cpp b/libmultimc/src/instance.cpp index c1506a02..5fdb5064 100644 --- a/libmultimc/src/instance.cpp +++ b/libmultimc/src/instance.cpp @@ -34,6 +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("IsForNewLauncher", false)); settings().registerSetting(new Setting("ShouldUpdate", false)); settings().registerSetting(new Setting("JarVersion", "Unknown")); settings().registerSetting(new Setting("LwjglVersion", "2.9.0")); diff --git a/libmultimc/src/library.cpp b/libmultimc/src/library.cpp index 0fb4f9d3..9d4cc6e3 100644 --- a/libmultimc/src/library.cpp +++ b/libmultimc/src/library.cpp @@ -34,4 +34,4 @@ OpSys OpSys_fromString(QString name) return Os_OSX; return Os_Other; } -// default url for lib: https://s3.amazonaws.com/Minecraft.Download/libraries/ +// default url for lib: