datetimeconverter.cpp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. #include "datetimeconverter_p.h"
  2. #include "exception.h"
  3. #include "cborserializer.h"
  4. #include <QtCore/QSet>
  5. using namespace QtJsonSerializer;
  6. using namespace QtJsonSerializer::TypeConverters;
  7. bool DateTimeConverter::canConvert(int metaTypeId) const
  8. {
  9. static const QSet<int> types {
  10. QMetaType::QDateTime,
  11. QMetaType::QDate,
  12. QMetaType::QTime
  13. };
  14. return types.contains(metaTypeId);
  15. }
  16. QList<QCborTag> DateTimeConverter::allowedCborTags(int metaTypeId) const
  17. {
  18. switch (metaTypeId) {
  19. case QMetaType::QDateTime:
  20. return {static_cast<QCborTag>(QCborKnownTags::DateTimeString), static_cast<QCborTag>(QCborKnownTags::UnixTime_t)};
  21. case QMetaType::QDate:
  22. return {static_cast<QCborTag>(QCborKnownTags::DateTimeString), static_cast<QCborTag>(CborSerializer::Date)};
  23. case QMetaType::QTime:
  24. return {static_cast<QCborTag>(QCborKnownTags::DateTimeString), static_cast<QCborTag>(CborSerializer::Time)};
  25. default:
  26. return {};
  27. }
  28. }
  29. QList<QCborValue::Type> DateTimeConverter::allowedCborTypes(int metaTypeId, QCborTag tag) const
  30. {
  31. switch (tag) {
  32. case static_cast<QCborTag>(QCborKnownTags::UnixTime_t):
  33. return {QCborValue::Integer};
  34. case static_cast<QCborTag>(QCborKnownTags::DateTimeString):
  35. case static_cast<QCborTag>(CborSerializer::Date):
  36. case static_cast<QCborTag>(CborSerializer::Time):
  37. return {QCborValue::String};
  38. default:
  39. if (metaTypeId == QMetaType::QDateTime)
  40. return {QCborValue::String, QCborValue::Integer};
  41. else
  42. return {QCborValue::String};
  43. }
  44. }
  45. int DateTimeConverter::guessType(QCborTag tag, QCborValue::Type dataType) const
  46. {
  47. switch (tag) {
  48. case static_cast<QCborTag>(QCborKnownTags::DateTimeString):
  49. if (dataType == QCborValue::String)
  50. return QMetaType::QDateTime;
  51. else
  52. break;
  53. case static_cast<QCborTag>(QCborKnownTags::UnixTime_t):
  54. if (dataType == QCborValue::Integer)
  55. return QMetaType::QDateTime;
  56. else
  57. break;
  58. case static_cast<QCborTag>(CborSerializer::Date):
  59. if (dataType == QCborValue::String)
  60. return QMetaType::QDate;
  61. else
  62. break;
  63. case static_cast<QCborTag>(CborSerializer::Time):
  64. if (dataType == QCborValue::String)
  65. return QMetaType::QTime;
  66. else
  67. break;
  68. default:
  69. break;
  70. }
  71. return QMetaType::UnknownType;
  72. }
  73. QCborValue DateTimeConverter::serialize(int propertyType, const QVariant &value) const
  74. {
  75. switch (propertyType) {
  76. case QMetaType::QDateTime:
  77. if (helper()->getProperty("dateAsTimeStamp").toBool())
  78. return {QCborKnownTags::UnixTime_t, value.toDateTime().toUTC().toSecsSinceEpoch()};
  79. else
  80. return QCborValue{value.toDateTime()};
  81. case QMetaType::QDate:
  82. return {static_cast<QCborTag>(CborSerializer::Date), value.toDate().toString(Qt::ISODate)};
  83. case QMetaType::QTime:
  84. return {static_cast<QCborTag>(CborSerializer::Time), value.toTime().toString(Qt::ISODateWithMs)};
  85. default:
  86. throw SerializationException{"Invalid property type"};
  87. }
  88. }
  89. QVariant DateTimeConverter::deserializeCbor(int propertyType, const QCborValue &value, QObject *parent) const
  90. {
  91. Q_UNUSED(parent)
  92. const auto cValue = (value.isTag() ? value.taggedValue() : value);
  93. switch (propertyType) {
  94. case QMetaType::QDateTime:
  95. return value.toDateTime();
  96. case QMetaType::QDate:
  97. if (value.tag() == QCborKnownTags::DateTimeString)
  98. return value.toDateTime().date();
  99. else
  100. return QDate::fromString(cValue.toString(), Qt::ISODate);
  101. case QMetaType::QTime:
  102. if (value.tag() == QCborKnownTags::DateTimeString)
  103. return value.toDateTime().time();
  104. else
  105. return QTime::fromString(cValue.toString(), Qt::ISODateWithMs);
  106. default:
  107. throw SerializationException{"Invalid property type"};
  108. }
  109. }
  110. QVariant DateTimeConverter::deserializeJson(int propertyType, const QCborValue &value, QObject *parent) const
  111. {
  112. if (propertyType == QMetaType::QDateTime &&
  113. value.type() == QCborValue::String)
  114. return deserializeCbor(propertyType, {QCborKnownTags::DateTimeString, value}, parent);
  115. else
  116. return deserializeCbor(propertyType, value, parent);
  117. }