7 #include <QJsonDocument>
9 #include <QStringBuilder>
14 using namespace swift::config;
18 namespace swift::misc::db
21 : m_artifactsPilotClient(artifacts.findByType(
CArtifact::PilotClientInstaller)),
22 m_artifactsXSwiftBus(artifacts.findByType(
CArtifact::
XSwiftBus)), m_distributions(distributions)
69 const QVersionNumber myVersion = CBuildConfig::getVersion();
71 if (myVersion > latestVersion)
102 if (index.
isMyself()) {
return QVariant::fromValue(*
this); }
106 case IndexArtifactsPilotClient:
return QVariant::fromValue(m_artifactsPilotClient);
107 case IndexArtifactsXSwiftBus:
return QVariant::fromValue(m_artifactsXSwiftBus);
108 case IndexDistributions:
return QVariant::fromValue(m_distributions);
123 case IndexArtifactsPilotClient: m_artifactsPilotClient = variant.value<
CArtifactList>();
break;
124 case IndexArtifactsXSwiftBus: m_artifactsXSwiftBus = variant.value<
CArtifactList>();
break;
125 case IndexDistributions: m_distributions = variant.value<
CDistributionList>();
break;
133 const QJsonArray jsonDistributions = json.value(
"distributions").toArray();
134 const QJsonArray jsonArtifacts = json.value(
"artifacts").toArray();
137 Q_ASSERT_X(jsonDistributions.size() == distributions.
size(), Q_FUNC_INFO,
"size mismatch");
138 Q_ASSERT_X(artifacts.
size() == artifacts.
size(), Q_FUNC_INFO,
"size mismatch");
144 if (jsonString.isEmpty()) {
return CUpdateInfo(); }
152 const QString url = CBuildConfig::gitHubRepoUrl() + QStringLiteral(
"releases/download");
159 result.m_distributions = { alphaDistribution, betaDistribution };
161 for (
const QJsonValue release : QJsonDocument::fromJson(jsonData).array())
163 QString version = release[QLatin1String(
"tag_name")].toString();
164 if (version.isEmpty() || version[0] !=
'v') {
continue; }
165 version.remove(0, 1);
166 if (
containsChar(version, [](QChar c) {
return c !=
'.' && !
is09(c); })) {
continue; }
168 bool existing = !release[QLatin1String(
"draft")].toBool();
169 bool alpha = release[QLatin1String(
"prerelease")].toBool();
171 for (
const QJsonValue asset : release[QLatin1String(
"assets")].toArray())
173 QString name = asset[QLatin1String(
"name")].toString();
174 QString filename = QStringLiteral(
"v%1/%2").arg(version, name);
175 int size = asset[QLatin1String(
"size")].toInt();
178 if (name.startsWith(QStringLiteral(
"swiftinstaller"))) { type = CArtifact::PilotClientInstaller; }
179 else if (name.startsWith(QStringLiteral(
"swiftsymbols"))) { type = CArtifact::Symbols; }
180 else if (name.startsWith(QStringLiteral(
"xswiftbus"))) { type = CArtifact::XSwiftBus; }
187 else if (name.contains(QStringLiteral(
"allos"))) { platform =
CPlatform::allOs(); }
189 CArtifact artifact(filename, version, {}, type, size, existing, platform);
190 artifact.
setDistributions({ alpha ? alphaDistribution : betaDistribution });
192 if (type == CArtifact::PilotClientInstaller) { result.m_artifactsPilotClient.
push_back(artifact); }
193 else if (type == CArtifact::XSwiftBus) { result.m_artifactsXSwiftBus.
push_back(artifact); }
Non-owning reference to a CPropertyIndex with a subset of its features.
CastType frontCasted() const
First element casted to given type, usually the PropertIndex enum.
bool isMyself() const
Myself index, used with nesting.
size_type size() const
Returns number of elements in the sequence.
void push_back(const T &value)
Appends an element at the end of the sequence.
bool isEmpty() const
Synonym for empty.
Artifacts ("our software" products)
bool isUnknown() const
Unknown.
void setDistributions(const CDistributionList &distributions)
Related distributions.
const CDistributionList & getDistributions() const
Related distributions.
void sortByVersion(Qt::SortOrder order=Qt::AscendingOrder)
Sort by version.
CArtifact findFirstByVersionOrDefault(const QVersionNumber &version) const
Find by version.
QVersionNumber getLatestQVersion() const
Latest version.
CArtifactList findMatchingForCurrentPlatform() const
Find for my platform.
CDistributionList getDistributions() const
All distributions related to these artifacts.
static CArtifactList fromDatabaseJson(const QJsonArray &array)
From database JSON by array.
Distributions for channel.
static const CDistribution & localDeveloperBuild()
Pseudo distribution for local builds.
void setDownloadUrl(const swift::misc::network::CUrl &url)
Set URL, ignored if empty.
Multiple distributions for different channels:
CDistribution getMostStableOrDefault() const
Most stable or default.
void sortByStability(Qt::SortOrder order=Qt::AscendingOrder)
Stability.
CDistribution getLeastStableOrDefault() const
Least stable or default.
static CDistributionList fromDatabaseJson(const QJsonArray &array)
From database JSON by array.
Update info, i.e. artifacts and distributions.
QVariant propertyByIndex(swift::misc::CPropertyIndexRef index) const
Property by index.
bool isEmpty() const
Empty (no data)
const CDistributionList & getDistributions() const
Distributions (all)
CArtifactList getArtifactsXSwiftBusLatestVersionFirst() const
Artifacts (xswiftbus)
QStringList anticipateMyDefaultChannelAndPlatform() const
Default channel, OS.
CDistribution anticipateOwnDistribution() const
Own distribution.
CDistributionList getDistributionsPilotClientForCurrentPlatform() const
Distributions for current platform.
static CUpdateInfo fromDatabaseJson(const QJsonObject &json, const QString &prefix={})
Object from database JSON format.
const CArtifactList & getArtifactsXSwiftBus() const
Artifacts (xswiftbus)
QString convertToQString(bool i18n=false) const
Cast as QString.
CArtifactList getArtifactsXSwiftBusOldestVersionFirst() const
Artifacts (xswiftbus)
CUpdateInfo()
Constructor.
CArtifactList getArtifactsXSwiftBusForCurrentPlatform() const
Artifacts for current platform.
const CArtifactList & getArtifactsPilotClient() const
Artifacts (pilot client)
CArtifactList getArtifactsPilotClientForCurrentPlatform() const
Artifacts for current platform.
ColumnIndex
Properties by index.
static CUpdateInfo fromGitHubReleasesJson(const QByteArray &jsonData)
Object from GitHub Releases REST API JSON format.
void setPropertyByIndex(swift::misc::CPropertyIndexRef index, const QVariant &variant)
Set property by index.
void setPropertyByIndex(CPropertyIndexRef index, const QVariant &variant)
Set property by index.
QVariant propertyByIndex(CPropertyIndexRef index) const
Property by index.
QString toQString(bool i18n=false) const
Cast as QString.
QJsonObject jsonObjectFromString(const QString &json, bool acceptCacheFormat)
JSON Object from string.
Plugin loaded by X-Plane which publishes a DBus service.
bool is09(const QChar &c)
Is 0-9 char, isDigit allows a bunch of more characters.
bool containsChar(const QString &s, F predicate)
True if any character in the string matches the given predicate.
#define SWIFT_DEFINE_VALUEOBJECT_MIXINS(Namespace, Class)
Explicit template definition of mixins for a CValueObject subclass.