30 #include <QMetaObject>
35 #include "qtprotobuftypes.h"
36 #include "qtprotobuflogging.h"
37 #include "qtprotobufglobal.h"
39 namespace QtProtobuf {
40 class QAbstractProtobufSerializer;
41 class QProtobufSelfcheckIterator;
42 class QProtobufMetaProperty;
45 namespace QtProtobufPrivate {
47 constexpr
int NotUsedFieldIndex = -1;
65 struct SerializationHandler {
66 Serializer serializer;
67 Deserializer deserializer;
71 extern Q_PROTOBUF_EXPORT SerializationHandler findHandler(
int userType);
72 extern Q_PROTOBUF_EXPORT
void registerHandler(
int userType,
const SerializationHandler &handlers);
79 typename std::enable_if_t<std::is_base_of<QObject, T>::value,
int> = 0>
81 Q_ASSERT_X(serializer !=
nullptr,
"QAbstractProtobufSerializer",
"Serializer is null");
82 buffer.append(serializer->
serializeObject(value.value<T *>(), T::protobufMetaObject, metaProperty));
90 typename std::enable_if_t<std::is_base_of<QObject, V>::value,
int> = 0>
92 Q_ASSERT_X(serializer !=
nullptr,
"QAbstractProtobufSerializer",
"Serializer is null");
93 QList<QSharedPointer<V>> list = listValue.value<QList<QSharedPointer<V>>>();
95 qProtoDebug() << __func__ <<
"listValue.count" << list.count();
98 for (
auto &value : list) {
100 qProtoWarning() <<
"Null pointer in list";
103 buffer.append(serializer->
serializeListObject(value.data(), V::protobufMetaObject, metaProperty));
112 template<
typename K,
typename V,
113 typename std::enable_if_t<!std::is_base_of<QObject, V>::value,
int> = 0>
115 Q_ASSERT_X(serializer !=
nullptr,
"QAbstractProtobufSerializer",
"Serializer is null");
116 QMap<K,V> mapValue = value.value<QMap<K,V>>();
118 for (
auto it = mapValue.constBegin(); it != mapValue.constEnd(); it++) {
119 buffer.append(serializer->
serializeMapPair(QVariant::fromValue<K>(it.key()), QVariant::fromValue<V>(it.value()), metaProperty));
128 template<
typename K,
typename V,
129 typename std::enable_if_t<std::is_base_of<QObject, V>::value,
int> = 0>
131 Q_ASSERT_X(serializer !=
nullptr,
"QAbstractProtobufSerializer",
"Serializer is null");
132 QMap<K, QSharedPointer<V>> mapValue = value.value<QMap<K, QSharedPointer<V>>>();
134 for (
auto it = mapValue.constBegin(); it != mapValue.constEnd(); it++) {
135 if (it.value().isNull()) {
136 qProtoWarning() << __func__ <<
"Trying to serialize map value that contains nullptr";
139 buffer.append(serializer->
serializeMapPair(QVariant::fromValue<K>(it.key()), QVariant::fromValue<V *>(it.value().data()), metaProperty));
149 typename std::enable_if_t<std::is_enum<T>::value,
int> = 0>
151 Q_ASSERT_X(serializer !=
nullptr,
"QAbstractProtobufSerializer",
"Serializer is null");
152 buffer.append(serializer->
serializeEnum(QtProtobuf::int64(value.value<T>()), QMetaEnum::fromType<T>(), metaProperty));
160 typename std::enable_if_t<std::is_enum<T>::value,
int> = 0>
162 Q_ASSERT_X(serializer !=
nullptr,
"QAbstractProtobufSerializer",
"Serializer is null");
163 QList<QtProtobuf::int64> intList;
164 for (
auto enumValue : value.value<QList<T>>()) {
165 intList.append(QtProtobuf::int64(enumValue));
167 buffer.append(serializer->
serializeEnumList(intList, QMetaEnum::fromType<T>(), metaProperty));
174 template <
typename T,
175 typename std::enable_if_t<std::is_base_of<QObject, T>::value,
int> = 0>
177 Q_ASSERT_X(serializer !=
nullptr,
"QAbstractProtobufSerializer",
"Serializer is null");
180 to = QVariant::fromValue<T *>(value);
187 template <
typename V,
188 typename std::enable_if_t<std::is_base_of<QObject, V>::value,
int> = 0>
190 Q_ASSERT_X(serializer !=
nullptr,
"QAbstractProtobufSerializer",
"Serializer is null");
191 qProtoDebug() << __func__ <<
"currentByte:" << QString::number((*it), 16);
194 QList<QSharedPointer<V>> list = previous.value<QList<QSharedPointer<V>>>();
196 list.append(QSharedPointer<V>(newValue));
197 previous.setValue(list);
206 template <
typename K,
typename V,
207 typename std::enable_if_t<!std::is_base_of<QObject, V>::value,
int> = 0>
209 Q_ASSERT_X(serializer !=
nullptr,
"QAbstractProtobufSerializer",
"Serializer is null");
210 qProtoDebug() << __func__ <<
"currentByte:" << QString::number((*it), 16);
212 QMap<K, V> out = previous.value<QMap<K, V>>();
213 QVariant key = QVariant::fromValue<K>(K());
214 QVariant value = QVariant::fromValue<V>(V());
217 out[key.value<K>()] = value.value<V>();
218 previous = QVariant::fromValue<QMap<K, V>>(out);
228 template <
typename K,
typename V,
229 typename std::enable_if_t<std::is_base_of<QObject, V>::value,
int> = 0>
231 Q_ASSERT_X(serializer !=
nullptr,
"QAbstractProtobufSerializer",
"Serializer is null");
232 qProtoDebug() << __func__ <<
"currentByte:" << QString::number((*it), 16);
234 auto out = previous.value<QMap<K, QSharedPointer<V>>>();
235 QVariant key = QVariant::fromValue<K>(K());
236 QVariant value = QVariant::fromValue<V *>(
nullptr);
239 out[key.value<K>()] = QSharedPointer<V>(value.value<V *>());
240 previous = QVariant::fromValue<QMap<K, QSharedPointer<V>>>(out);
249 template <
typename T,
250 typename std::enable_if_t<std::is_enum<T>::value,
int> = 0>
252 Q_ASSERT_X(serializer !=
nullptr,
"QAbstractProtobufSerializer",
"Serializer is null");
253 QtProtobuf::int64 intValue;
255 to = QVariant::fromValue<T>(
static_cast<T
>(intValue._t));
263 template <
typename T,
264 typename std::enable_if_t<std::is_enum<T>::value,
int> = 0>
266 Q_ASSERT_X(serializer !=
nullptr,
"QAbstractProtobufSerializer",
"Serializer is null");
267 QList<QtProtobuf::int64> intList;
269 QList<T> enumList = previous.value<QList<T>>();
270 for (
auto intValue : intList) {
271 enumList.append(
static_cast<T
>(intValue._t));
273 previous = QVariant::fromValue<QList<T>>(enumList);
The QAbstractProtobufSerializer class is interface that represents basic functions for serialization/...
Definition: qabstractprotobufserializer.h:72
virtual QByteArray serializeListObject(const QObject *object, const QProtobufMetaObject &metaObject, const QProtobufMetaProperty &metaProperty) const =0
serializeListObject Method called to serialize object as a part of list property
virtual QByteArray serializeMapBegin(const QProtobufMetaProperty &metaProperty) const
serializeMapEnd Method called at the begining of map serialization
Definition: qabstractprotobufserializer.h:199
virtual QByteArray serializeEnumList(const QList< int64 > &value, const QMetaEnum &metaEnum, const QtProtobuf::QProtobufMetaProperty &metaProperty) const =0
serializeEnumList Method called to serialize list of enum values
virtual void deserializeObject(QObject *object, const QProtobufMetaObject &metaObject, QProtobufSelfcheckIterator &it) const =0
deserializeObject Deserializes buffer to an object
virtual QByteArray serializeMapEnd(QByteArray &buffer, const QProtobufMetaProperty &metaProperty) const
serializeMapEnd Method called at the end of map serialization
Definition: qabstractprotobufserializer.h:221
virtual QByteArray serializeObject(const QObject *object, const QProtobufMetaObject &metaObject, const QProtobufMetaProperty &metaProperty) const =0
serializeObject Serializes complete object according given propertyOrdering and metaObject informatio...
virtual bool deserializeListObject(QObject *object, const QProtobufMetaObject &metaObject, QProtobufSelfcheckIterator &it) const =0
deserializeListObject Deserializes an object from byte stream as part of list property
virtual QByteArray serializeEnum(int64 value, const QMetaEnum &metaEnum, const QtProtobuf::QProtobufMetaProperty &metaProperty) const =0
serializeEnum Serializes enum value represented as int64 type
virtual QByteArray serializeListEnd(QByteArray &buffer, const QProtobufMetaProperty &metaProperty) const
serializeListEnd Method called at the end of object list serialization
Definition: qabstractprotobufserializer.h:179
virtual void deserializeEnum(int64 &value, const QMetaEnum &metaEnum, QProtobufSelfcheckIterator &it) const =0
deserializeEnum Deserializes enum value from byte stream
virtual QByteArray serializeMapPair(const QVariant &key, const QVariant &value, const QProtobufMetaProperty &metaProperty) const =0
serializeMapPair Serializes QMap pair of key and value to raw data buffer
virtual void deserializeEnumList(QList< int64 > &value, const QMetaEnum &metaEnum, QProtobufSelfcheckIterator &it) const =0
deserializeEnum Deserializes list of enum values from byte stream
virtual bool deserializeMapPair(QVariant &key, QVariant &value, QProtobufSelfcheckIterator &it) const =0
deserializeMapPair Deserializes QMap pair of key and value from raw data
virtual QByteArray serializeListBegin(const QProtobufMetaProperty &metaProperty) const
serializeListBegin Method called at the begining of object list serialization
Definition: qabstractprotobufserializer.h:159
The QProtobufSelfcheckIterator class.
Definition: qprotobufselfcheckiterator.h:40