Heart 1.3.842.34c2ab5
Heart is base back end library for your c++ Qt projects.
multiversiondata.cpp
Go to the documentation of this file.
1/*
2 * Copyright (C) 2023-2024 QuasarApp.
3 * Distributed under the lgplv3 software license, see the accompanying
4 * Everyone is permitted to copy and distribute verbatim copies
5 * of this license document, but changing it is not allowed.
6*/
7
8#include "multiversiondata.h"
9#include "qaglobalutils.h"
10
11#include <QIODevice>
12
13namespace QH {
14namespace PKG {
15
16#define MAGIC "mver"
17
18MultiversionData::MultiversionData(const QMap<unsigned short /*version*/, SerializationBox>& serializers):
19 _serializers(serializers) {
20
21 if (serializers.size()) {
22 _packageVersion.setMax(serializers.lastKey());
23 _packageVersion.setMin(serializers.firstKey());
24 }
25}
26
27QDataStream &MultiversionData::fromStream(QDataStream &stream) {
28
29 if (!_serializers.size()) {
30 debug_assert(false,
31 "Your MultiversionData not support any serialized functions. "
32 "Please initialize it in constructor of the MultiversionData class.");
33 return stream;
34 }
35
36 QByteArray magic;
37 stream >> magic;
38
39 unsigned short version = 0;
40 if (magic == MAGIC) {
41 stream >> version;
42 } else {
43 stream.device()->seek(0);
44 }
45
46 return _serializers.value(version).from(stream);
47}
48
49QDataStream &MultiversionData::toStream(QDataStream &stream) const {
50
51 if (!_serializers.size()) {
52 debug_assert(false,
53 "Your MultiversionData not support any serialized functions. "
54 "Please initialize it in constructor of the MultiversionData class.");
55 return stream;
56 }
57
58 stream << QByteArray{MAGIC};
59 stream << _serializers.lastKey();
60
61 return _serializers.last().to(stream);
62}
63
64QByteArray MultiversionData::toBytesOf(const DistVersion& version) const {
65 QByteArray res;
66 QDataStream stream(&res, QIODevice::WriteOnly);
67
68 if (parsingVersion()) {
69 stream.setVersion(parsingVersion());
70 }
71
72 toStreamOf(stream, version);
73 return res;
74}
75
76QDataStream &MultiversionData::toStreamOf(QDataStream &stream, const DistVersion& version) const {
77
78 unsigned short ver = _packageVersion.getMaxCompatible(version);
79 auto serializer = _serializers.value(ver, {});
80 if (!serializer.to) {
81 debug_assert(false,
82 "Your MultiversionData not support the required version serialized functions. "
83 "Please initialize it in constructor of the MultiversionData class.");
84 return stream;
85 }
86
87 if (ver) {
88 stream << QByteArray{MAGIC};
89 stream << ver;
90 }
91
92 return serializer.to(stream);
93}
94
96 const DistVersion& reqVersion,
97 unsigned int triggerHash) const {
98 if (!isValid()) {
99 return false;
100 }
101
102 package.data = toBytesOf(reqVersion);
103 package.hdr.command = cmd();
104 package.hdr.triggerHash = triggerHash;
105 package.hdr.size = package.data.size();
106
107 package.hdr.hash = package.calcHash();
108
109
110 return package.isValid();
111}
112
114 return _packageVersion;
115}
116
117}
118}
The DistVersion class This is information of supported versions of the destinations api.
Definition distversion.h:21
void setMax(unsigned short newMax)
void setMin(unsigned short newMin)
int getMaxCompatible(const DistVersion &distVersion) const
getMaxСompatible return maximum available on booth nodes version.
virtual bool isValid() const
isValid This method check current object to valid.
virtual unsigned short cmd() const =0
cmd - This is command of this object, (for generate cmd use macross QH_PACKAGE)
QDataStream & toStreamOf(QDataStream &stream, const DistVersion &version) const
toStreamOf This overrload of the base toStream method for support the multi version packages.
QDataStream & fromStream(QDataStream &stream) override final
fromStream This method should be read all bytes from the stream object and full the current object.
QByteArray toBytesOf(const DistVersion &version) const
toBytesOf This is overload method of StreamBase::toBytes for support multi versions of packages.
MultiversionData(const QMap< unsigned short, SerializationBox > &serializers)
MultiversionData main constructor.
bool toPackage(Package &package, const DistVersion &reqVersion, unsigned int triggerHash=0) const override final
toPackage This method convert this class object to the package. For more info see Package class.
const DistVersion & packageVersion() const
packageVersion This method should be return number of the pacakge version.
QDataStream & toStream(QDataStream &stream) const override final
fromStream This method should be write all members of the current object to the stream object.
The Package struct. This is base structure for transporting data by network between QH nodes....
Definition package.h:23
unsigned int calcHash() const
calcHash This method recalc hash sum for this pacakge.
Definition package.cpp:44
QByteArray data
data This is source data of package.
Definition package.h:33
virtual bool isValid() const
isValid This method validation a current package. Default implementation is checked a header and comp...
Definition package.cpp:18
Header hdr
hdr This is header of package. For more information see the Header struct.
Definition package.h:29
virtual int parsingVersion() const
parsingVersion this method return parsing version of Qt. By Default is 0 (last available parsing)....
#define MAGIC
The QH namespace - QuasarApp Heart namespace. This namespace contains all classes of the Heart librar...
Definition heart.cpp:13
unsigned int hash
hash This is unique id of a package. id calc with CRC32 function for Qt implementation.
Definition header.h:38
unsigned int triggerHash
triggerHash This is hash of request package that package has been responded. The server should write ...
Definition header.h:44
unsigned int size
size This is size of package data (exclude header size).
Definition header.h:33
unsigned short command
command of package for more information see the AbstractData::toPackage method.
Definition header.h:23