From 4ab84bce3807757d54a9fefe8372d1705d09beee Mon Sep 17 00:00:00 2001 From: Roman Telezhynskyi Date: Mon, 1 Jul 2019 12:26:08 +0300 Subject: [PATCH] Make full serialization/deserialization for class VLayoutPiece. --HG-- branch : develop --- src/libs/vlayout/vabstractpiece.cpp | 18 +++++++ src/libs/vlayout/vabstractpiece.h | 3 ++ src/libs/vlayout/vabstractpiece_p.h | 74 +++++++++++++++++++++++++++++ src/libs/vlayout/vlayoutpiece.cpp | 2 + 4 files changed, 97 insertions(+) diff --git a/src/libs/vlayout/vabstractpiece.cpp b/src/libs/vlayout/vabstractpiece.cpp index a99b55de3..2848613e2 100644 --- a/src/libs/vlayout/vabstractpiece.cpp +++ b/src/libs/vlayout/vabstractpiece.cpp @@ -42,6 +42,9 @@ #include #include +const quint32 VAbstractPieceData::streamHeader = 0x05CDD73A; // CRC-32Q string "VAbstractPieceData" +const quint16 VAbstractPieceData::classVersion = 1; + const qreal maxL = 2.5; const qreal VSAPoint::passmarkFactor = 0.5; @@ -767,6 +770,21 @@ QT_WARNING_POP #endif } +// Friend functions +//--------------------------------------------------------------------------------------------------------------------- +QDataStream &operator<<(QDataStream &dataStream, const VAbstractPiece &piece) +{ + dataStream << *piece.d; + return dataStream; +} + +//--------------------------------------------------------------------------------------------------------------------- +QDataStream &operator>>(QDataStream &dataStream, VAbstractPiece &piece) +{ + dataStream >> *piece.d; + return dataStream; +} + //--------------------------------------------------------------------------------------------------------------------- VAbstractPiece::VAbstractPiece() : d(new VAbstractPieceData) diff --git a/src/libs/vlayout/vabstractpiece.h b/src/libs/vlayout/vabstractpiece.h index eb7dee9ca..5d4caa86e 100644 --- a/src/libs/vlayout/vabstractpiece.h +++ b/src/libs/vlayout/vabstractpiece.h @@ -231,6 +231,9 @@ public: static QVector GrainlinePoints(const VGrainlineData &geom, const VContainer *pattern, const QRectF &boundingRect, qreal &dAng); + friend QDataStream& operator<< (QDataStream& dataStream, const VAbstractPiece& piece); + friend QDataStream& operator>> (QDataStream& dataStream, VAbstractPiece& piece); + protected: template static QVector RemoveDublicates(const QVector &points, bool removeFirstAndLast = true); diff --git a/src/libs/vlayout/vabstractpiece_p.h b/src/libs/vlayout/vabstractpiece_p.h index 9cdb1a171..5f1ac53aa 100644 --- a/src/libs/vlayout/vabstractpiece_p.h +++ b/src/libs/vlayout/vabstractpiece_p.h @@ -34,7 +34,9 @@ #include #include "../vmisc/diagnostic.h" +#include "../vmisc/vdatastreamenum.h" #include "../vmisc/defglobal.h" +#include "../ifc/exception/vexception.h" QT_WARNING_PUSH QT_WARNING_DISABLE_GCC("-Weffc++") @@ -71,6 +73,9 @@ public: ~VAbstractPieceData() Q_DECL_EQ_DEFAULT; + friend QDataStream& operator<<(QDataStream& dataStream, const VAbstractPieceData& piece); + friend QDataStream& operator>>(QDataStream& dataStream, VAbstractPieceData& piece); + QString m_name; /** @brief forbidFlipping forbid piece be mirrored in a layout. */ bool m_forbidFlipping; @@ -84,9 +89,78 @@ public: private: Q_DISABLE_ASSIGN(VAbstractPieceData) + + static const quint32 streamHeader; + static const quint16 classVersion; }; QT_WARNING_POP +// Friend functions +//--------------------------------------------------------------------------------------------------------------------- +inline QDataStream &operator<<(QDataStream &dataStream, const VAbstractPieceData &piece) +{ + dataStream << VAbstractPieceData::streamHeader << VAbstractPieceData::classVersion; + + // Added in classVersion = 1 + dataStream << piece.m_name; + dataStream << piece.m_forbidFlipping; + dataStream << piece.m_forceFlipping; + dataStream << piece.m_seamAllowance; + dataStream << piece.m_seamAllowanceBuiltIn; + dataStream << piece.m_hideMainPath; + dataStream << piece.m_width; + dataStream << piece.m_mx; + dataStream << piece.m_my; + + // Added in classVersion = 2 + + return dataStream; +} + +//--------------------------------------------------------------------------------------------------------------------- +inline QDataStream &operator>>(QDataStream &dataStream, VAbstractPieceData &piece) +{ + quint32 actualStreamHeader = 0; + dataStream >> actualStreamHeader; + + if (actualStreamHeader != VAbstractPieceData::streamHeader) + { + QString message = QCoreApplication::tr("VAbstractPieceData prefix mismatch error: actualStreamHeader = 0x%1 " + "and streamHeader = 0x%2") + .arg(actualStreamHeader, 8, 0x10, QChar('0')) + .arg(VAbstractPieceData::streamHeader, 8, 0x10, QChar('0')); + throw VException(message); + } + + quint16 actualClassVersion = 0; + dataStream >> actualClassVersion; + + if (actualClassVersion > VAbstractPieceData::classVersion) + { + QString message = QCoreApplication::tr("VAbstractPieceData compatibility error: actualClassVersion = %1 and " + "classVersion = %2") + .arg(actualClassVersion).arg(VAbstractPieceData::classVersion); + throw VException(message); + } + + dataStream >> piece.m_name; + dataStream >> piece.m_forbidFlipping; + dataStream >> piece.m_forceFlipping; + dataStream >> piece.m_seamAllowance; + dataStream >> piece.m_seamAllowanceBuiltIn; + dataStream >> piece.m_hideMainPath; + dataStream >> piece.m_width; + dataStream >> piece.m_mx; + dataStream >> piece.m_my; + +// if (actualClassVersion >= 2) +// { + +// } + + return dataStream; +} + #endif // VABSTRACTPIECE_P_H diff --git a/src/libs/vlayout/vlayoutpiece.cpp b/src/libs/vlayout/vlayoutpiece.cpp index 9535b786b..69fcf0cb5 100644 --- a/src/libs/vlayout/vlayoutpiece.cpp +++ b/src/libs/vlayout/vlayoutpiece.cpp @@ -363,6 +363,7 @@ QVector ConvertPassmarks(const VPiece &piece, const VContainer //--------------------------------------------------------------------------------------------------------------------- QDataStream &operator<<(QDataStream &dataStream, const VLayoutPiece &piece) { + dataStream << static_cast(piece); dataStream << *piece.d; return dataStream; } @@ -370,6 +371,7 @@ QDataStream &operator<<(QDataStream &dataStream, const VLayoutPiece &piece) //--------------------------------------------------------------------------------------------------------------------- QDataStream &operator>>(QDataStream &dataStream, VLayoutPiece &piece) { + dataStream >> static_cast(piece); dataStream >> *piece.d; return dataStream; }