smartpointerconverter.cpp 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. #include "smartpointerconverter_p.h"
  2. #include "exception.h"
  3. using namespace QtJsonSerializer;
  4. using namespace QtJsonSerializer::TypeConverters;
  5. bool SmartPointerConverter::canConvert(int metaTypeId) const
  6. {
  7. const auto extractor = helper()->extractor(metaTypeId);
  8. return extractor && (extractor->baseType() == "pointer" ||
  9. extractor->baseType() == "qpointer");
  10. }
  11. QList<QCborValue::Type> SmartPointerConverter::allowedCborTypes(int metaTypeId, QCborTag tag) const
  12. {
  13. Q_UNUSED(metaTypeId)
  14. Q_UNUSED(tag)
  15. QList<QCborValue::Type> types;
  16. const auto metaEnum = QMetaEnum::fromType<QCborValue::Type>();
  17. types.reserve(metaEnum.keyCount());
  18. for (auto i = 0; i < metaEnum.keyCount(); ++i) {
  19. if (const auto value = metaEnum.value(i); value != QCborValue::Invalid)
  20. types.append(static_cast<QCborValue::Type>(value));
  21. }
  22. return types;
  23. }
  24. QCborValue SmartPointerConverter::serialize(int propertyType, const QVariant &value) const
  25. {
  26. const auto extractor = helper()->extractor(propertyType);
  27. if (!extractor) {
  28. throw SerializationException(QByteArray("Failed to get extractor for type ") +
  29. QMetaTypeName(propertyType) +
  30. QByteArray(". Make shure to register std::optional types via QJsonSerializer::registerPointerConverters"));
  31. }
  32. return helper()->serializeSubtype(extractor->subtypes()[0],
  33. extractor->extract(value),
  34. "data");
  35. }
  36. QVariant SmartPointerConverter::deserializeCbor(int propertyType, const QCborValue &value, QObject *parent) const
  37. {
  38. const auto extractor = helper()->extractor(propertyType);
  39. if (!extractor) {
  40. throw DeserializationException(QByteArray("Failed to get extractor for type ") +
  41. QMetaTypeName(propertyType) +
  42. QByteArray(". Make shure to register std::optional types via QJsonSerializer::registerPointerConverters"));
  43. }
  44. auto result = helper()->deserializeSubtype(extractor->subtypes()[0],
  45. value,
  46. extractor->baseType() == "qpointer" ? parent : nullptr,
  47. "data");
  48. extractor->emplace(result, result);
  49. return result;
  50. }