Parsing the version files, part II
This commit is contained in:
parent
18853ca3fa
commit
97cf08f964
@ -1,6 +1,7 @@
|
||||
#pragma once
|
||||
#include <QString>
|
||||
#include <QStringList>
|
||||
|
||||
class Library;
|
||||
|
||||
class FullVersion
|
||||
{
|
||||
@ -40,7 +41,7 @@ public:
|
||||
QString mainClass;
|
||||
|
||||
// the list of libs. just the names for now. expand to full-blown strutures!
|
||||
QStringList libraries;
|
||||
QList<QSharedPointer<Library> > libraries;
|
||||
|
||||
// is this actually a legacy version? if so, none of the other stuff here will be ever used.
|
||||
// added by FullVersionFactory
|
||||
|
@ -15,4 +15,121 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <QtCore>
|
||||
|
||||
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,
|
||||
Os_Linux,
|
||||
Os_OSX,
|
||||
Os_Other
|
||||
};
|
||||
|
||||
OpSys OpSys_fromString(QString);
|
||||
|
||||
#ifdef Q_OS_MAC
|
||||
#define currentSystem Os_OSX
|
||||
#endif
|
||||
|
||||
#ifdef Q_OS_LINUX
|
||||
#define currentSystem Os_Linux
|
||||
#endif
|
||||
|
||||
#ifdef Q_OS_WIN32
|
||||
#define currentSystem Os_Windows
|
||||
#endif
|
||||
|
||||
#ifndef currentSystem
|
||||
#define currentSystem Os_Other
|
||||
#endif
|
||||
|
||||
|
||||
class OsRule : public Rule
|
||||
{
|
||||
private:
|
||||
// the OS
|
||||
OpSys m_system;
|
||||
// the OS version regexp
|
||||
QString m_version_regexp;
|
||||
protected:
|
||||
virtual bool applies ( Library* )
|
||||
{
|
||||
return (m_system == currentSystem);
|
||||
}
|
||||
public:
|
||||
OsRule(RuleAction result, OpSys system, QString version_regexp)
|
||||
: Rule(result), m_system(system), m_version_regexp(version_regexp) {}
|
||||
};
|
||||
|
||||
class ImplicitRule : public Rule
|
||||
{
|
||||
protected:
|
||||
virtual bool applies ( Library* )
|
||||
{
|
||||
return true;
|
||||
}
|
||||
public:
|
||||
ImplicitRule(RuleAction result)
|
||||
: Rule(result) {}
|
||||
};
|
||||
|
||||
class Library
|
||||
{
|
||||
public:
|
||||
QString base_url;
|
||||
QString name;
|
||||
QList<QSharedPointer<Rule> > rules;
|
||||
QMap<OpSys, QString> natives;
|
||||
QStringList extract_excludes;
|
||||
|
||||
void AddRule(RuleAction result)
|
||||
{
|
||||
rules.append(QSharedPointer<Rule>(new ImplicitRule(result)));
|
||||
}
|
||||
void AddRule(RuleAction result, OpSys system, QString version_regexp)
|
||||
{
|
||||
rules.append(QSharedPointer<Rule>(new OsRule(result, system, version_regexp)));
|
||||
}
|
||||
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;
|
||||
}
|
||||
};
|
||||
|
@ -1,4 +1,4 @@
|
||||
#include <QtCore>
|
||||
#include "fullversion.h"
|
||||
|
||||
|
||||
// ECHO, echo, echo, ....
|
@ -1,69 +1,144 @@
|
||||
#include "fullversionfactory.h"
|
||||
#include "fullversion.h"
|
||||
#include <library.h>
|
||||
|
||||
QSharedPointer<FullVersion> FullVersionFactory::parse4(QJsonObject root, QSharedPointer<FullVersion> product)
|
||||
QSharedPointer<FullVersion> FullVersionFactory::parse4(QJsonObject root, QSharedPointer<FullVersion> fullVersion)
|
||||
{
|
||||
product->id = root.value("id").toString();
|
||||
fullVersion->id = root.value("id").toString();
|
||||
|
||||
// if it's on our legacy list, it's legacy
|
||||
if(legacyWhitelist.contains(product->id))
|
||||
product->isLegacy = true;
|
||||
if(legacyWhitelist.contains(fullVersion->id))
|
||||
fullVersion->isLegacy = true;
|
||||
|
||||
product->mainClass = root.value("mainClass").toString();
|
||||
fullVersion->mainClass = root.value("mainClass").toString();
|
||||
auto procArgsValue = root.value("processArguments");
|
||||
if(procArgsValue.isString())
|
||||
{
|
||||
product->processArguments = procArgsValue.toString();
|
||||
QString toCompare = product->processArguments.toLower();
|
||||
fullVersion->processArguments = procArgsValue.toString();
|
||||
QString toCompare = fullVersion->processArguments.toLower();
|
||||
if(toCompare == "legacy")
|
||||
{
|
||||
product->minecraftArguments = " ${auth_player_name} ${auth_session}";
|
||||
product->isLegacy = true;
|
||||
fullVersion->minecraftArguments = " ${auth_player_name} ${auth_session}";
|
||||
fullVersion->isLegacy = true;
|
||||
}
|
||||
else if(toCompare == "username_session")
|
||||
{
|
||||
product->minecraftArguments = "--username ${auth_player_name} --session ${auth_session}";
|
||||
fullVersion->minecraftArguments = "--username ${auth_player_name} --session ${auth_session}";
|
||||
}
|
||||
else if(toCompare == "username_session_version")
|
||||
{
|
||||
product->minecraftArguments = "--username ${auth_player_name} --session ${auth_session} --version ${profile_name}";
|
||||
fullVersion->minecraftArguments = "--username ${auth_player_name} --session ${auth_session} --version ${profile_name}";
|
||||
}
|
||||
}
|
||||
|
||||
auto minecraftArgsValue = root.value("minecraftArguments");
|
||||
if(minecraftArgsValue.isString())
|
||||
{
|
||||
product->minecraftArguments = minecraftArgsValue.toString();
|
||||
fullVersion->minecraftArguments = minecraftArgsValue.toString();
|
||||
}
|
||||
|
||||
product->releaseTime = root.value("releaseTime").toString();
|
||||
product->time = root.value("time").toString();
|
||||
fullVersion->releaseTime = root.value("releaseTime").toString();
|
||||
fullVersion->time = root.value("time").toString();
|
||||
|
||||
// Iterate through the list.
|
||||
// Iterate through the list, if it's a list.
|
||||
auto librariesValue = root.value("libraries");
|
||||
if(librariesValue.isArray())
|
||||
{
|
||||
if(!librariesValue.isArray())
|
||||
return fullVersion;
|
||||
|
||||
QJsonArray libList = root.value("libraries").toArray();
|
||||
for (auto lib : libList)
|
||||
for (auto libVal : libList)
|
||||
{
|
||||
if (!lib.isObject())
|
||||
QSharedPointer<Library> library(new Library());
|
||||
if (!libVal.isObject())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
QJsonObject libObj = lib.toObject();
|
||||
QJsonObject libObj = libVal.toObject();
|
||||
|
||||
QString crud = libObj.value("name").toString();
|
||||
product->libraries.append(crud);
|
||||
// Library name
|
||||
auto nameVal = libObj.value("name");
|
||||
if(!nameVal.isString())
|
||||
continue;
|
||||
library->name = nameVal.toString();
|
||||
|
||||
// TODO: improve!
|
||||
/*
|
||||
auto parts = crud.split(':');
|
||||
int zz = parts.size();
|
||||
*/
|
||||
// Extract excludes (if any)
|
||||
auto extractVal = libObj.value("extract");
|
||||
if(extractVal.isObject())
|
||||
{
|
||||
QStringList excludes;
|
||||
auto extractObj = extractVal.toObject();
|
||||
auto excludesVal = extractObj.value("exclude");
|
||||
if(!excludesVal.isArray())
|
||||
goto SKIP_EXTRACTS;
|
||||
auto excludesList = excludesVal.toArray();
|
||||
for(auto excludeVal : excludesList)
|
||||
{
|
||||
if(excludeVal.isString())
|
||||
excludes.append(excludeVal.toString());
|
||||
}
|
||||
library->extract_excludes = excludes;
|
||||
}
|
||||
SKIP_EXTRACTS:
|
||||
|
||||
auto nativesVal = libObj.value("natives");
|
||||
if(nativesVal.isObject())
|
||||
{
|
||||
auto nativesObj = nativesVal.toObject();
|
||||
auto iter = nativesObj.begin();
|
||||
while(iter != nativesObj.end())
|
||||
{
|
||||
auto osType = OpSys_fromString(iter.key());
|
||||
if(osType == Os_Other)
|
||||
continue;
|
||||
if(!iter.value().isString())
|
||||
continue;
|
||||
library->natives[osType] = iter.value().toString();
|
||||
iter++;
|
||||
}
|
||||
}
|
||||
return product;
|
||||
|
||||
// Library rules (if any)
|
||||
auto rulesVal = libObj.value("rules");
|
||||
if(rulesVal.isArray())
|
||||
{
|
||||
QList<QSharedPointer<Rule> > rules;
|
||||
|
||||
QJsonArray ruleList = rulesVal.toArray();
|
||||
for(auto ruleVal : ruleList)
|
||||
{
|
||||
QSharedPointer<Rule> 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;
|
||||
}
|
||||
}
|
||||
return fullVersion;
|
||||
}
|
||||
|
||||
QSharedPointer<FullVersion> FullVersionFactory::parse(QByteArray data)
|
||||
|
@ -15,4 +15,23 @@
|
||||
|
||||
#include "include/library.h"
|
||||
|
||||
RuleAction RuleAction_fromString(QString name)
|
||||
{
|
||||
if(name == "allow")
|
||||
return Allow;
|
||||
if(name == "disallow")
|
||||
return Disallow;
|
||||
return Defer;
|
||||
}
|
||||
|
||||
OpSys OpSys_fromString(QString name)
|
||||
{
|
||||
if(name == "linux")
|
||||
return Os_Linux;
|
||||
if(name == "windows")
|
||||
return Os_Windows;
|
||||
if(name == "osx")
|
||||
return Os_OSX;
|
||||
return Os_Other;
|
||||
}
|
||||
// default url for lib: https://s3.amazonaws.com/Minecraft.Download/libraries/
|
||||
|
Loading…
Reference in New Issue
Block a user