Files
pilotclient/src/blackmisc/db/artifact.h
Klaus Basan b9c233802f Ref T419, use version from IDatastoreObject in CArtifact
* add QVersion
* remove version parts from CArtifact
2019-04-11 22:11:37 +01:00

187 lines
6.6 KiB
C++

/* Copyright (C) 2017
* swift project community / contributors
*
* This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level
* directory of this distribution. No part of swift project, including this file, may be copied, modified, propagated,
* or distributed except according to the terms contained in the LICENSE file.
*/
//! \file
#ifndef BLACKMISC_DB_ARTIFACT_H
#define BLACKMISC_DB_ARTIFACT_H
#include "distributionlist.h"
#include "datastore.h"
#include "blackmisc/platform.h"
#include "blackmisc/blackmiscexport.h"
#include "blackmisc/network/remotefile.h"
#include <QString>
namespace BlackMisc
{
namespace Db
{
//! Artifacts ("our software" products)
class BLACKMISC_EXPORT CArtifact :
public CValueObject<CArtifact>,
public IDatastoreObjectWithIntegerKey
{
public:
//! Properties by index
enum ColumnIndex
{
IndexName = CPropertyIndex::GlobalIndexCArtifact,
IndexMd5,
IndexType,
IndexPlatform,
IndexVersionString,
IndexQVersion,
IndexSize,
IndexSizeHumanReadable,
IndexDistributions
};
//! Type
enum ArtifactType
{
UnknownArtifact,
PilotClientInstaller,
Symbols,
XSwiftBus
};
//! Default constructor
CArtifact();
//! Constructor
CArtifact(const QString &name, const QString &version, const QString &md5,
ArtifactType type, int size, bool existing, const CPlatform &platform);
//! Having name?
bool hasName() const { return !m_name.isEmpty(); }
//! Name (i.e. installer name, symbol name)
const QString &getName() const { return m_name; }
//! Set the name
void setName(const QString &name) { m_name = name.trimmed(); }
//! Matching name?
bool matchesName(const QString &name, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
//! Get type
ArtifactType getType() const { return static_cast<ArtifactType>(m_type); }
//! Unknown
bool isUnknown() const { return this->getType() == UnknownArtifact; }
//! Set type
void setType(ArtifactType type) { m_type = static_cast<int>(type); }
//! File size
int getFileSize() const { return m_size; }
//! \copydoc CFileUtils::humanReadableFileSize
QString getFileSizeHumanReadable() const;
//! Set file size
void setFileSize(int size) { m_size = size; }
//! MD5
const QString &getMd5() const { return m_md5; }
//! OS
const CPlatform &getPlatform() const { return m_platform; }
//! Matches any platform
bool matchesAnyPlatform(const CPlatform &platform) const;
//! Set the OS
void setPlatform(const CPlatform &platform) { m_platform = platform; }
//! Related distributions
const CDistributionList &getDistributions() const { return m_distributions; }
//! Most stable distribution if any
CDistribution getMostStableDistribution() const { return this->getDistributions().getMostStableOrDefault(); }
//! Related distributions
void setDistributions(const CDistributionList &distributions) { m_distributions = distributions; }
//! Has distributions?
bool hasDistributions() const { return !m_distributions.isEmpty(); }
//! Has unrestricted distribution
bool hasUnrestrictedDistribution() const;
//! Is distributed with given distribution?
bool isWithDistribution(const CDistribution &distribution, bool acceptMoreStableDistributions) const;
//! Turn into remote file
//! \note requires distributions
Network::CRemoteFile asRemoteFile() const;
//! Newer tahn the current build
bool isNewerThanCurrentBuild() const;
//! \copydoc BlackMisc::Mixin::String::toQString
QString convertToQString(bool i18n = false) const;
//! To string
QString convertToQString(const QString &separator, bool i18n = false) const;
//! \copydoc BlackMisc::Mixin::Index::propertyByIndex
CVariant propertyByIndex(const BlackMisc::CPropertyIndex &index) const;
//! \copydoc BlackMisc::Mixin::Index::setPropertyByIndex
void setPropertyByIndex(const BlackMisc::CPropertyIndex &index, const BlackMisc::CVariant &variant);
//! Object from database JSON format
static CArtifact fromDatabaseJson(const QJsonObject &json, const QString &prefix = {});
//! Type as string
static const QString &typeToString(ArtifactType type);
private:
QString m_name; //!< channel the files belong to
QString m_md5; //!< MD5 checksum
int m_type = static_cast<int>(UnknownArtifact); //!< artifact type
int m_size = -1; //!< size
bool m_existing = false; //!< existing artifact for download
CPlatform m_platform; //!< platform (i.e. OS)
CDistributionList m_distributions; //!< related distributions
//! Extract version number from a file name
static QString versionNumberFromFilename(const QString &filename);
//! Type from string
static ArtifactType stringToType(const QString &str);
//! Trim the 4th segment of a version string
static QString trimVersionString(const QString &version);
//! Trim a strin representing 4th segment
static QString trim4thSegment(const QString &seg);
BLACK_METACLASS(
CArtifact,
BLACK_METAMEMBER(name),
BLACK_METAMEMBER(version),
BLACK_METAMEMBER(md5),
BLACK_METAMEMBER(type),
BLACK_METAMEMBER(size),
BLACK_METAMEMBER(existing),
BLACK_METAMEMBER(platform),
BLACK_METAMEMBER(distributions),
BLACK_METAMEMBER(timestampMSecsSinceEpoch)
);
};
} // ns
} // ns
Q_DECLARE_METATYPE(BlackMisc::Db::CArtifact)
Q_DECLARE_METATYPE(BlackMisc::Db::CArtifact::ArtifactType)
#endif // guard