mirror of
https://github.com/QuasarApp/Heart.git
synced 2025-04-27 10:14:36 +00:00
fix build
This commit is contained in:
parent
bb999376ca
commit
79ffb003e4
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
||||
};
|
||||
|
||||
|
@ -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) {
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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) {
|
||||
|
@ -129,6 +129,8 @@ public:
|
||||
*/
|
||||
bool sendSupportedAPI(AbstractNodeInfo *dist) const;
|
||||
|
||||
unsigned short selectPackageVersion(const VersionData& local, const VersionData& dist);
|
||||
|
||||
signals:
|
||||
|
||||
/**
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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 *()> > ®isteredTypes() const;
|
||||
const PacksMap ®isteredTypes() 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;
|
||||
|
@ -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;
|
||||
|
@ -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:
|
||||
/**
|
||||
|
Loading…
x
Reference in New Issue
Block a user