fix build
Some checks failed
buildbot/LinuxCMakeBuilder Build finished.
buildbot/WindowsCMakeBuilder Build finished.

This commit is contained in:
Andrei Yankovich 2023-05-14 18:41:54 +02:00
parent bb999376ca
commit 79ffb003e4
13 changed files with 171 additions and 34 deletions

View File

@ -17,28 +17,45 @@ APIVersion::APIVersion() {
QDataStream &APIVersion::fromStream(QDataStream &stream) {
stream >> _version;
stream >> _apisVersions;
stream >> _packagesVersions;
return stream;
}
QDataStream &APIVersion::toStream(QDataStream &stream) const {
stream << _version;
stream << _apisVersions;
stream << _packagesVersions;
return stream;
}
const VersionData &APIVersion::nodeVersion() const {
return _version;
VersionData APIVersion::apisVersions() const {
return _apisVersions;
}
void APIVersion::setNodeVersion(const VersionData &newVersion) {
_version = newVersion;
void APIVersion::setApisVersions(const VersionData &newApisVersions) {
_apisVersions = newApisVersions;
}
PackagesVersionData APIVersion::packagesVersions() const {
return _packagesVersions;
}
void APIVersion::setPackagesVersions(const PackagesVersionData &newPackagesVersions) {
_packagesVersions = newPackagesVersions;
}
bool APIVersion::isValid() const {
if (_version.isEmpty())
if (_apisVersions.isEmpty())
return false;
for (const auto & version: _version) {
for (const auto & version: _apisVersions) {
if (version.max() < version.min()) {
return false;
}
}
for (const auto & version: _packagesVersions) {
if (version.max() < version.min()) {
return false;
}

View File

@ -35,18 +35,26 @@ public:
QString cmdString() const override {return APIVersion::commandText();}
const VersionData &nodeVersion() const;
void setNodeVersion(const VersionData &newVersion);
bool isValid() const override;
/**
* @brief packagesVersions This method return list of available multi-version packages on the node.
* @return
*/
PackagesVersionData packagesVersions() const;
void setPackagesVersions(const PackagesVersionData &newPackagesVersions);
VersionData apisVersions() const;
void setApisVersions(const VersionData &newApisVersions);
protected:
unsigned int localCode() const override {return typeid(APIVersion).hash_code();}
QDataStream &fromStream(QDataStream &stream) override;
QDataStream &toStream(QDataStream &stream) const override;
private:
VersionData _version;
VersionData _apisVersions;
PackagesVersionData _packagesVersions;
};

View File

@ -756,12 +756,18 @@ unsigned int AbstractNode::sendData(const PKG::AbstractData *resp,
return 0;
}
int version = node->multiVersionPackages().value(resp->cmd()).
getMaxСompatible(_apiVersionParser->multiVersionPackages().value(resp->cmd()));
if (version < 0) {
return 0;
}
Package pkg;
bool convert = false;
if (req && req->isValid()) {
convert = resp->toPackage(pkg, req->hash);
convert = resp->toPackage(pkg, version,req->hash);
} else {
convert = resp->toPackage(pkg);
convert = resp->toPackage(pkg, version);
}
if (!convert) {

View File

@ -131,6 +131,14 @@ bool AbstractNodeInfo::confirmData() const {
return _status != NodeCoonectionStatus::NotConnected && fVersionDelivered() && fVersionReceived();
}
const PackagesVersionData& AbstractNodeInfo::multiVersionPackages() const {
return _multiVersionPackages;
}
void AbstractNodeInfo::setMultiVersionPackages(const PackagesVersionData &newMultiVersionPackages) {
_multiVersionPackages = newMultiVersionPackages;
}
bool AbstractNodeInfo::fVersionDelivered() const {
return _fVersionDelivered;
}

View File

@ -259,6 +259,18 @@ public:
*/
void addParser(QSharedPointer<QH::iParser> parser);
/**
* @brief multiVersionPackages This is list of packages of one api package tah support multiple versions.
* @return list of packages of one api package tah support multiple versions.
*/
const PackagesVersionData &multiVersionPackages() const;
/**
* @brief setMultiVersionPackages This method sets new list of multi-version packages.
* @param newMultiVersionPackages This is new value of multi-version packages.
*/
void setMultiVersionPackages(const PackagesVersionData &newMultiVersionPackages);
public slots:
/**
* @brief removeSocket This method use for remove socket.
@ -335,6 +347,10 @@ private:
QHash<QString, QSharedPointer<iParser>> _parsersKeysMap;
QMutex _parsersListMutex;
/**
* @brief _multiVersionPackages contains packages list that has multiple versions on one api rest of this is universal packages with version 0.
*/
PackagesVersionData _multiVersionPackages;
VersionData _version;
bool _fVersionReceived = false;
bool _fVersionDelivered = false;

View File

@ -232,7 +232,7 @@ QSharedPointer<iParser> APIVersionParser::selectParser(const QString &parserKey,
}
QSharedPointer<iParser> APIVersionParser::selectParserImpl(unsigned short cmd,
AbstractNodeInfo *sender) const{
AbstractNodeInfo *sender) const {
auto version = sender->version();
const auto availableParser = selectParser(version);
for (const auto& parser: availableParser) {
@ -275,10 +275,18 @@ unsigned short APIVersionParser::minimumApiVersion(const QString &apiKey) const
bool APIVersionParser::sendSupportedAPI(AbstractNodeInfo *dist) const {
VersionData supportedAPIs;
PackagesVersionData multiVersionPackages;
for (auto it = _apiParsers.begin(); it != _apiParsers.end(); ++it) {
DistVersion supportVersions;
for (auto api = it->begin(); api != it->end(); ++api) {
const auto packages = api.value()->multiVersionPackages();
for (auto pkg = packages.begin(); pkg != packages.end(); ++pkg) {
multiVersionPackages[pkg.key()] = pkg.value();
}
}
supportVersions.setMax(it->lastKey());
supportVersions.setMin(it->firstKey());
@ -290,7 +298,8 @@ bool APIVersionParser::sendSupportedAPI(AbstractNodeInfo *dist) const {
return false;
PKG::APIVersion versionInformationPkg;
versionInformationPkg.setNodeVersion(supportedAPIs);
versionInformationPkg.setApisVersions(supportedAPIs);
versionInformationPkg.setPackagesVersions(multiVersionPackages);
return sendData(&versionInformationPkg, dist);
}
@ -299,8 +308,10 @@ bool APIVersionParser::processAppVersion(const QSharedPointer<PKG::APIVersion> &
QH::AbstractNodeInfo *sender,
const QH::Header &) {
auto distVersion = message->nodeVersion();
auto distVersion = message->apisVersions();
sender->setVersion(distVersion);
sender->setMultiVersionPackages(message->packagesVersions());
auto parser = selectParser(distVersion);
for (auto parserKey = distVersion.keyBegin(); parserKey != distVersion.keyEnd(); ++parserKey) {

View File

@ -129,6 +129,8 @@ public:
*/
bool sendSupportedAPI(AbstractNodeInfo *dist) const;
unsigned short selectPackageVersion(const VersionData& local, const VersionData& dist);
signals:
/**

View File

@ -16,6 +16,26 @@ void DistVersion::setMax(unsigned short newMax) {
_max = newMax;
}
int DistVersion::getMaxСompatible(const DistVersion &distVersion) const {
unsigned short midMax = std::min(distVersion.max(), _max);
unsigned short midMin = std::max(distVersion.min(), _min);
if (midMax < midMin)
return -1;
return midMax;
}
int DistVersion::getMinСompatible(const DistVersion &distVersion) const {
unsigned short midMax = std::min(distVersion.max(), _max);
unsigned short midMin = std::max(distVersion.min(), _min);
if (midMax < midMin)
return -1;
return midMin;
}
QDataStream &DistVersion::fromStream(QDataStream &stream) {
stream >> _min;
stream >> _max;

View File

@ -26,6 +26,21 @@ public:
unsigned short max() const;
void setMax(unsigned short newMax);
/**
* @brief getMaxСompatible return maximum available on booth nodes version.
* @param distVersion this is dis version.
* @return return maximum version. if this version is not found retun -1
*/
int getMaxСompatible(const DistVersion& distVersion) const;
/**
* @brief getMinСompatible return maximum available on booth nodes version.
* @param distVersion this is dis version.
* @return return minimum version. if this version is not found retun -1
*/
int getMinСompatible(const DistVersion& distVersion) const;
protected:
QDataStream &fromStream(QDataStream &stream) override;
@ -47,5 +62,10 @@ private:
*/
typedef QHash<QString, DistVersion> VersionData;
/**
* @brief PackagesVersionData This is some as VersionData but for int commands.
*/
typedef QHash<unsigned short, DistVersion> PackagesVersionData;
}
#endif // DISTVERSION_H

View File

@ -31,17 +31,17 @@ QString iParser::pareseResultToString(const ParserResult &parseResult) {
}
}
const QHash<unsigned short, std::function<PKG::AbstractData *()> > &
iParser::registeredTypes() const {
const PacksMap &iParser::registeredTypes() const {
return _registeredTypes;
}
QSharedPointer<PKG::AbstractData> iParser::genPackage(unsigned short cmd) const {
return QSharedPointer<PKG::AbstractData>(_registeredTypes.value(cmd, [](){return nullptr;})());
QSharedPointer<PKG::AbstractData> iParser::genPackage(unsigned short cmd, unsigned short ver) const {
return QSharedPointer<PKG::AbstractData>(_registeredTypes.value(cmd, {}).value(ver, [](){return nullptr;})());
}
bool iParser::checkCommand(unsigned short cmd) const {
return _registeredTypes.contains(cmd);
bool iParser::checkCommand(unsigned short cmd, unsigned short ver) const {
auto versions = _registeredTypes.value(cmd, {});
return versions.contains(ver);
}
AbstractNode *iParser::node() const {
@ -58,7 +58,10 @@ unsigned int iParser::sendData(const PKG::AbstractData *resp,
const AbstractNodeInfo *dist,
const Header *req) const {
return node()->sendData(resp, dist, req);
}
const PackagesVersionData &iParser::multiVersionPackages() const {
return _multiVersionPackages;
}
void iParser::initSupportedCommands() {}
@ -66,8 +69,11 @@ void iParser::initSupportedCommands() {}
QString iParser::toString() const {
QString message = parserId() + " supports next commands:\n";
for (auto it = _registeredTypes.keyBegin(); it != _registeredTypes.keyEnd(); ++it) {
message += genPackage(*it)->cmdString() + " - " + QString::number(*it) + "\n";
for (const auto& versionsMap: _registeredTypes) {
for (auto it = versionsMap.keyBegin(); it != versionsMap.keyEnd(); ++it) {
auto pkg = genPackage(*it);
message += pkg->cmdString() + ":v" + pkg->ver() + " - " + QString::number(*it) + "\n";
}
}
return message;

View File

@ -9,6 +9,7 @@
#ifndef IPARSER_H
#define IPARSER_H
#include "distversion.h"
#include "hostaddress.h"
#include <QSharedPointer>
#include <abstractdata.h>
@ -22,6 +23,11 @@ namespace PKG {
class AbstractData;
}
/**
* @brief PacksMap This is hash map with the package id - version of package and package factory function.
*/
using PacksMap = QHash<unsigned short, QMap<unsigned short, std::function<PKG::AbstractData *()>>>;
/**
* @brief The ParserResult enum.
@ -57,9 +63,15 @@ public:
* @see initSupportedCommands
*/
void registerPackageType() {
_registeredTypes[T::command()] = [](){
_registeredTypes[T::command()][T::version()] = [](){
return new T();
};
auto multiVersionsList = _registeredTypes.value(T::command());
if (multiVersionsList.size() > 1) {
_multiVersionPackages[T::command()].setMax(multiVersionsList.lastKey());
_multiVersionPackages[T::command()].setMin(multiVersionsList.firstKey());
}
};
/**
@ -181,24 +193,25 @@ public:
* @return list of registered command.
* @see iParser::registerPackageType
*/
const QHash<unsigned short, std::function<PKG::AbstractData *()> > &registeredTypes() const;
const PacksMap &registeredTypes() const;
/**
* @brief genPackage This is factory method that generate data pacakge objects by command.
* All object should be registered before using this method.
* @param cmd This is command of pacakge see Header::command.
* @param ver - This is version of the package - by default is 0
* @return shared pointer to new data object.
* @see AbstractNode::registerPackageType
* @see Header::command
*/
QSharedPointer<PKG::AbstractData> genPackage(unsigned short cmd) const;
QSharedPointer<PKG::AbstractData> genPackage(unsigned short cmd, unsigned short ver = 0) const;
/**
* @brief checkCommand This method check command are if registered type or not.
* @brief cmd This is command of a verifiable package.
* @return True if the package is registered in a node.
*/
bool checkCommand(unsigned short cmd) const;
bool checkCommand(unsigned short cmd, unsigned short ver = 0) const;
/**
* @brief parserId This is id of the parsers. All parser will be synced betwin nodes by ids.
@ -213,6 +226,13 @@ public:
virtual void initSupportedCommands();
QString toString() const override;
/**
* @brief multiVersionPackages return list of the supported multiversions packages.
* @return list of the supported multiversions packages.
*/
const PackagesVersionData& multiVersionPackages() const;
protected:
AbstractNode *node() const;
@ -239,7 +259,10 @@ protected:
const Header *req = nullptr) const;
private:
QHash<unsigned short, std::function<PKG::AbstractData*()>> _registeredTypes;
// command - {version - factory}
PacksMap _registeredTypes;
PackagesVersionData _multiVersionPackages;
AbstractNode *_node;
friend class BigDataParserOld;

View File

@ -34,7 +34,7 @@ bool AbstractData::toPackage(Package &package,
return false;
}
if (!toVersion(package.data, reqVersion)) {
if (!toBytesAdaptiveWithVersion(package.data, reqVersion)) {
QuasarAppUtils::Params::log("You try send not supported version of packge on the distanation node.",
QuasarAppUtils::Error);
return false;
@ -72,7 +72,7 @@ void AbstractData::fromPakcage(const Package &pkg) {
fromBytes(pkg.data);
}
bool AbstractData::toVersion(QByteArray& out, unsigned short reqVersion) const {
bool AbstractData::toBytesAdaptiveWithVersion(QByteArray& out, unsigned short reqVersion) const {
if (reqVersion == ver()) {
out = toBytes();
return true;

View File

@ -177,12 +177,12 @@ public:
static QString commandText(){return "NULL";};
/**
* @brief toVersion This method should be convert package to rquired version.
* @brief toBytesAdaptiveWithVersion This method should be convert package to rquired version.
* @param outputArray This is output byte array after convertation.
* @param version This is required version pacakge.
* @return true if convertation finished successful.
*/
virtual bool toVersion(QByteArray& outputArray, unsigned short version) const;
virtual bool toBytesAdaptiveWithVersion(QByteArray& outputArray, unsigned short version) const;
protected:
/**