All classes which work with QDataStream must provide a header.

--HG--
branch : develop
This commit is contained in:
Roman Telezhynskyi 2019-07-01 13:25:03 +03:00
parent c536c40628
commit 03b8758781
4 changed files with 92 additions and 5 deletions

View File

@ -57,6 +57,7 @@
#include "vabstractapplication.h"
#include "vdatastreamenum.h"
#include "../ifc/exception/vexception.h"
const qreal defCurveApproximationScale = 0.5;
const qreal minCurveApproximationScale = 0.2;
@ -722,26 +723,64 @@ void InitLanguages(QComboBox *combobox)
}
}
const quint32 CustomSARecord::streamHeader = 0xEBFF7586; // CRC-32Q string "CustomSARecord"
const quint16 CustomSARecord::classVersion = 1;
// Friend functions
//---------------------------------------------------------------------------------------------------------------------
QDataStream &operator<<(QDataStream &out, const CustomSARecord &record)
{
out << CustomSARecord::streamHeader << CustomSARecord::classVersion;
// Added in classVersion = 1
out << record.startPoint;
out << record.path;
out << record.endPoint;
out << record.reverse;
out << record.includeType;
// Added in classVersion = 2
return out;
}
//---------------------------------------------------------------------------------------------------------------------
QDataStream &operator>>(QDataStream &in, CustomSARecord &record)
{
quint32 actualStreamHeader = 0;
in >> actualStreamHeader;
if (actualStreamHeader != CustomSARecord::streamHeader)
{
QString message = QCoreApplication::tr("CustomSARecord prefix mismatch error: actualStreamHeader = 0x%1 "
"and streamHeader = 0x%2")
.arg(actualStreamHeader, 8, 0x10, QChar('0'))
.arg(CustomSARecord::streamHeader, 8, 0x10, QChar('0'));
throw VException(message);
}
quint16 actualClassVersion = 0;
in >> actualClassVersion;
if (actualClassVersion > CustomSARecord::classVersion)
{
QString message = QCoreApplication::tr("CustomSARecord compatibility error: actualClassVersion = %1 and "
"classVersion = %2")
.arg(actualClassVersion).arg(CustomSARecord::classVersion);
throw VException(message);
}
in >> record.startPoint;
in >> record.path;
in >> record.endPoint;
in >> record.reverse;
in >> record.includeType;
// if (actualClassVersion >= 2)
// {
// }
return in;
}

View File

@ -666,11 +666,15 @@ struct CustomSARecord
friend QDataStream& operator<<(QDataStream& out, const CustomSARecord& record);
friend QDataStream& operator>>(QDataStream& in, CustomSARecord& record);
quint32 startPoint;
quint32 path;
quint32 endPoint;
bool reverse;
PiecePathIncludeType includeType;
quint32 startPoint{0};
quint32 path{0};
quint32 endPoint{0};
bool reverse{false};
PiecePathIncludeType includeType{PiecePathIncludeType::AsCustomSA};
private:
static const quint32 streamHeader;
static const quint16 classVersion;
};
Q_DECLARE_METATYPE(CustomSARecord)

View File

@ -36,6 +36,9 @@
#include <QDataStream>
#include <QtNumeric>
const quint32 VPieceNodeData::streamHeader = 0x2198CBC8; // CRC-32Q string "VPieceNodeData"
const quint16 VPieceNodeData::classVersion = 1;
//---------------------------------------------------------------------------------------------------------------------
VPieceNode::VPieceNode()
: d(new VPieceNodeData)

View File

@ -31,7 +31,10 @@
#include <QSharedData>
#include <QDataStream>
#include <QCoreApplication>
#include "../ifc/ifcdef.h"
#include "../ifc/exception/vexception.h"
#include "../vmisc/diagnostic.h"
#include "../vmisc/vdatastreamenum.h"
@ -119,12 +122,18 @@ public:
private:
Q_DISABLE_ASSIGN(VPieceNodeData)
static const quint32 streamHeader;
static const quint16 classVersion;
};
// Friend functions
//---------------------------------------------------------------------------------------------------------------------
QDataStream &operator<<(QDataStream &out, const VPieceNodeData &p)
{
out << VPieceNodeData::streamHeader << VPieceNodeData::classVersion;
// Added in classVersion = 1
out << p.m_id
<< p.m_typeTool
<< p.m_reverse
@ -139,12 +148,38 @@ QDataStream &operator<<(QDataStream &out, const VPieceNodeData &p)
<< p.m_isShowSecondPassmark
<< p.m_checkUniqueness
<< p.m_manualPassmarkLength;
// Added in classVersion = 2
return out;
}
//---------------------------------------------------------------------------------------------------------------------
QDataStream &operator>>(QDataStream &in, VPieceNodeData &p)
{
quint32 actualStreamHeader = 0;
in >> actualStreamHeader;
if (actualStreamHeader != VPieceNodeData::streamHeader)
{
QString message = QCoreApplication::tr("VPieceNodeData prefix mismatch error: actualStreamHeader = 0x%1 "
"and streamHeader = 0x%2")
.arg(actualStreamHeader, 8, 0x10, QChar('0'))
.arg(VPieceNodeData::streamHeader, 8, 0x10, QChar('0'));
throw VException(message);
}
quint16 actualClassVersion = 0;
in >> actualClassVersion;
if (actualClassVersion > VPieceNodeData::classVersion)
{
QString message = QCoreApplication::tr("VPieceNodeData compatibility error: actualClassVersion = %1 and "
"classVersion = %2")
.arg(actualClassVersion).arg(VPieceNodeData::classVersion);
throw VException(message);
}
in >> p.m_id
>> p.m_typeTool
>> p.m_reverse
@ -159,6 +194,12 @@ QDataStream &operator>>(QDataStream &in, VPieceNodeData &p)
>> p.m_isShowSecondPassmark
>> p.m_checkUniqueness
>> p.m_manualPassmarkLength;
// if (actualClassVersion >= 2)
// {
// }
return in;
}