Ref T135, utility functions for platform guessing and channels

* using QSet
* platform guessing
* Doxygen
* word size in CBuildConfig
* renamed to BlackMisc::Db::TDistributionsInfo
This commit is contained in:
Klaus Basan
2017-09-20 02:47:47 +02:00
committed by Mathew Sutcliffe
parent 9770792a91
commit 97f687077c
7 changed files with 147 additions and 46 deletions

View File

@@ -38,7 +38,13 @@ namespace BlackMisc
return platforms;
}
QString CDistribution::guessPlatform() const
bool CDistribution::supportsPlatform(const QString &platform) const
{
QStringList platforms = m_platformFiles.keys();
return !platform.isEmpty() && platforms.contains(platform);
}
QString CDistribution::guessMyPlatform() const
{
const QStringList platforms(getPlatforms());
if (platforms.isEmpty()) { return ""; }
@@ -55,7 +61,7 @@ namespace BlackMisc
}
else if (CBuildConfig::isRunningOnMacOSXPlatform())
{
if (!p.contains("mac", Qt::CaseInsensitive) || !p.contains("osx", Qt::CaseInsensitive)) continue;
if (!(p.contains("mac", Qt::CaseInsensitive) || p.contains("osx", Qt::CaseInsensitive))) continue;
}
reduced << p;
}
@@ -78,6 +84,20 @@ namespace BlackMisc
if (!furtherReduced.isEmpty()) { reduced = furtherReduced; }
}
int wordSize = CBuildConfig::buildWordSize();
if (wordSize >= 32 && reduced.size() > 1)
{
// further reduce by word size 32/64
QStringList furtherReduced;
const QString wsString = QString::number(wordSize);
for (const QString &p : as_const(reduced))
{
if (!p.contains(wsString)) { continue; }
furtherReduced << p;
}
if (!furtherReduced.isEmpty()) { reduced = furtherReduced; }
}
if (reduced.isEmpty()) { return ""; }
return reduced.front();
}
@@ -102,12 +122,12 @@ namespace BlackMisc
void CDistribution::addDownloadUrl(const CUrl &url)
{
if (url.isEmpty()) { return; }
this->m_downloadUrls.push_back(url);
m_downloadUrls.push_back(url);
}
bool CDistribution::hasDownloadUrls() const
{
return !this->m_downloadUrls.isEmpty();
return !m_downloadUrls.isEmpty();
}
QString CDistribution::convertToQString(bool i18n) const
@@ -138,18 +158,12 @@ namespace BlackMisc
const ColumnIndex i = index.frontCasted<ColumnIndex>();
switch (i)
{
case IndexChannel:
return CVariant::fromValue(this->m_channel);
case IndexDownloadUrls:
return CVariant::fromValue(this->m_downloadUrls);
case IndexRestricted:
return CVariant::fromValue(this->m_restricted);
case IndexPlatforms:
return CVariant::fromValue(this->getPlatforms());
case IndexPlatformFiles:
return CVariant::fromValue(this->m_platformFiles);
default:
return CValueObject::propertyByIndex(index);
case IndexChannel: return CVariant::fromValue(m_channel);
case IndexDownloadUrls: return CVariant::fromValue(m_downloadUrls);
case IndexRestricted: return CVariant::fromValue(m_restricted);
case IndexPlatforms: return CVariant::fromValue(this->getPlatforms());
case IndexPlatformFiles: return CVariant::fromValue(m_platformFiles);
default: return CValueObject::propertyByIndex(index);
}
}
@@ -165,21 +179,11 @@ namespace BlackMisc
const ColumnIndex i = index.frontCasted<ColumnIndex>();
switch (i)
{
case IndexChannel:
this->setChannel(variant.value<QString>());
break;
case IndexDownloadUrls:
this->m_downloadUrls = variant.value<CUrlList>();
break;
case IndexRestricted:
this->m_restricted = variant.toBool();
break;
case IndexPlatformFiles:
this->m_platformFiles = variant.value<CPlatformDictionary>();
break;
default:
CValueObject::setPropertyByIndex(index, variant);
break;
case IndexChannel: this->setChannel(variant.value<QString>()); break;
case IndexDownloadUrls: m_downloadUrls = variant.value<CUrlList>(); break;
case IndexRestricted: m_restricted = variant.toBool(); break;
case IndexPlatformFiles: m_platformFiles = variant.value<CPlatformDictionary>(); break;
default: CValueObject::setPropertyByIndex(index, variant); break;
}
}

View File

@@ -32,7 +32,7 @@ namespace BlackMisc
//! Dictionary for files per platform
using CPlatformDictionary = BlackMisc::CDictionary<QString, QString>;
//! CDistribution for channel
//! Distributions for channel
class BLACKMISC_EXPORT CDistribution :
public BlackMisc::CValueObject<CDistribution>,
public BlackMisc::Db::IDatastoreObjectWithIntegerKey
@@ -66,8 +66,11 @@ namespace BlackMisc
//! Get platforms
QStringList getPlatforms() const;
//! Guess platform
QString guessPlatform() const;
//! Supports platform?
bool supportsPlatform(const QString &platform) const;
//! Guess platform for this distribution channel and this version of swift
QString guessMyPlatform() const;
//! Version for platform
QString getVersionString(const QString &platform) const;
@@ -106,7 +109,7 @@ namespace BlackMisc
static CDistribution fromDatabaseJson(const QJsonObject &json, const QString &prefix = {});
private:
QString m_channel; //!< for development
QString m_channel; //!< channel the files belong to
bool m_restricted = false; //!< restricted access (i.e. password for download needed)
BlackMisc::Network::CUrlList m_downloadUrls; //!< download URLs, here I get the installer
CPlatformDictionary m_platformFiles; //!< the latest file version per platform
@@ -128,7 +131,6 @@ namespace BlackMisc
BLACK_METAMEMBER(platformVersions, 0, DisabledForComparison | DisabledForHashing)
);
};
//! Distribution settings: channel/platform
struct TDistributionSetting : public BlackMisc::TSettingTrait<QStringList>
{

View File

@@ -20,9 +20,9 @@ namespace BlackMisc
CSequence<CDistribution>(other)
{ }
QStringList CDistributionList::getChannels() const
QSet<QString> CDistributionList::getChannels() const
{
QStringList channels;
QSet<QString> channels;
for (const CDistribution &distribution : *this)
{
if (distribution.getChannel().isEmpty()) { continue; }
@@ -31,6 +31,32 @@ namespace BlackMisc
return channels;
}
QSet<QString> CDistributionList::findChannelsForPlatform(const QString &platform) const
{
QSet<QString> channels;
if (platform.isEmpty()) { return channels; }
for (const CDistribution &distribution : *this)
{
if (distribution.getChannel().isEmpty()) { continue; }
if (distribution.supportsPlatform(platform))
{
channels.insert(distribution.getChannel());
}
}
return channels;
}
QSet<QString> CDistributionList::getPlatforms() const
{
QSet<QString> platforms;
for (const CDistribution &distribution : *this)
{
if (distribution.getChannel().isEmpty()) { continue; }
platforms << distribution.getChannel();
}
return platforms;
}
CDistribution CDistributionList::findByChannelOrDefault(const QString &channel) const
{
return this->findFirstByOrDefault(&CDistribution::getChannel, channel);
@@ -60,6 +86,12 @@ namespace BlackMisc
return this->getQVersionForChannelAndPlatform(channelPlatform.first(), channelPlatform.last());
}
QStringList CDistributionList::guessMyDefaultChannelAndPlatform() const
{
//! \fixme will be further improved when we have added a public server and have more channels
return QStringList({"ALPHA", BlackConfig::CBuildConfig::guessMyPlatformString()}); // guessing
}
CDistributionList CDistributionList::fromDatabaseJson(const QJsonArray &array)
{
CDistributionList distributions;

View File

@@ -19,12 +19,16 @@
#include "blackmisc/collection.h"
#include "blackmisc/sequence.h"
#include "blackmisc/variant.h"
#include <QSet>
#include <QString>
namespace BlackMisc
{
namespace Db
{
//! Value object encapsulating a list of aircraft models
//! Multiple distributions for different channels:
//! - one CDistribution objects contains all versions for a channel
//! - a distribution list normally contains all distributions for all channels
class BLACKMISC_EXPORT CDistributionList :
public BlackMisc::CSequence<CDistribution>,
public BlackMisc::Db::IDatastoreObjectList<CDistribution, CDistributionList, int>,
@@ -40,7 +44,13 @@ namespace BlackMisc
CDistributionList(const CSequence<CDistribution> &other);
//! All channels
QStringList getChannels() const;
QSet<QString> getChannels() const;
//! Find channels for platform
QSet<QString> findChannelsForPlatform(const QString &platform) const;
//! All platforms for all channels
QSet<QString> getPlatforms() const;
//! Find distribution by channels
CDistribution findByChannelOrDefault(const QString &channel) const;
@@ -57,15 +67,18 @@ namespace BlackMisc
//! Version for specific channel and platform
QVersionNumber getQVersionForChannelAndPlatform(const QStringList &channelPlatform) const;
//! From database JSON
//! Guess the best channel/platform
QStringList guessMyDefaultChannelAndPlatform() const;
//! From database JSON by array
static CDistributionList fromDatabaseJson(const QJsonArray &array);
//! From database JSON
//! From database JSON by string
static CDistributionList fromDatabaseJson(const QString &json);
};
//! Trait for global setup data
struct TDistributionInfo : public BlackMisc::TDataTrait<CDistributionList>
//! Trait for distributions
struct TDistributionsInfo : public BlackMisc::TDataTrait<CDistributionList>
{
//! Key in data cache
static const char *key() { return "distributions"; }