// Copyright (C) 2022 The Qt Company Ltd. // Copyright (C) 2019 Alexey Edelev // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only #include #include #include #include QT_BEGIN_NAMESPACE /*! \class QAbstractProtobufSerializer \inmodule QtProtobuf \since 6.5 \brief The QAbstractProtobufSerializer class is interface that represents basic functions for serialization/deserialization. \reentrant The QProtobufSerializer class registers serializers/deserializers for classes implementing a protobuf message, inheriting \l QProtobufMessage. These classes are generated automatically, based on a \c{.proto} file, using the CMake function \l qt_add_protobuf or by running \l {The qtprotobufgen Tool} {qtprotobufgen} directly. This class should be used as a base for specific serializers. The handlers property contains all message-specific serializers and should be used while serialization/deserialization. Inherited classes should reimplement scope of virtual methods that used by registered message serialization/deserialization functions. */ /*! \enum QAbstractProtobufSerializer::Error \since 6.8 This enum contains possible errors that can occur during deserialization. When an error occurs, call lastErrorString() to get a human-readable error message. \value None No error occurred. \value InvalidHeader Something went wrong while attempting to decode a header in the message. \value UnknownType While serializing or deserializing a message, no deserializer was found for a message field. \value UnexpectedEndOfStream While deserializing a message, the stream ended unexpectedly. \value InvalidFormat The data has invalid format. For example the JSON value doesn't match the field type. */ /*! \fn QAbstractProtobufSerializer::Error QAbstractProtobufSerializer::lastError() const \since 6.8 Returns the last error for the serializer instance. \sa lastErrorString() */ /*! \fn QString QAbstractProtobufSerializer::lastErrorString() const \since 6.8 Returns the last error string for the serializer instance. \sa lastError() */ /*! Destroys this QAbstractProtobufSerializer. */ QAbstractProtobufSerializer::~QAbstractProtobufSerializer() = default; /*! \fn QByteArray QAbstractProtobufSerializer::serializeMessage(const QProtobufMessage *message) const This is called by serialize() to serialize a registered Protobuf \a message. \a message must not be \nullptr. Returns a QByteArray containing the serialized message. */ /*! \fn bool QAbstractProtobufSerializer::deserializeMessage(QProtobufMessage *message, QByteArrayView data) const This is called by deserialize() to deserialize a registered Protobuf \a message from a QByteArrayView \a data. \a message can be assumed to not be \nullptr. Returns \c true if deserialization was successful, otherwise \c false. */ /*! Serializes a registered Protobuf message \a message into a QByteArray. \a message must not be \nullptr. \sa deserialize() */ QByteArray QAbstractProtobufSerializer::serialize(const QProtobufMessage *message) const { Q_ASSERT(message != nullptr && message->propertyOrdering() != nullptr && message->propertyOrdering()->data != nullptr); return serializeMessage(message); } /*! Deserializes a registered Protobuf message \a message from a QByteArray \a data. \a message must not be \nullptr. Returns \c true if deserialization was successful, otherwise \c false. Unexpected/unknown properties in the \a data are skipped. \sa serialize() */ bool QAbstractProtobufSerializer::deserialize(QProtobufMessage *message, QByteArrayView data) const { Q_ASSERT(message != nullptr && message->propertyOrdering() != nullptr && message->propertyOrdering()->data != nullptr); // Wipe the message by reconstructing it in place. const auto mtype = QtProtobufSerializerHelpers::messageMetaObject(message)->metaType(); mtype.destruct(message); mtype.construct(message); return deserializeMessage(message, data); } QT_END_NAMESPACE