bitarrayconverter.cpp 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. #include "bitarrayconverter_p.h"
  2. #include "cborserializer.h"
  3. #include <QtCore/QBitArray>
  4. using namespace QtJsonSerializer;
  5. using namespace QtJsonSerializer::TypeConverters;
  6. bool BitArrayConverter::canConvert(int metaTypeId) const
  7. {
  8. return metaTypeId == QMetaType::QBitArray;
  9. }
  10. QList<QCborTag> BitArrayConverter::allowedCborTags(int metaTypeId) const
  11. {
  12. Q_UNUSED(metaTypeId)
  13. return {static_cast<QCborTag>(CborSerializer::BitArray)};
  14. }
  15. QList<QCborValue::Type> BitArrayConverter::allowedCborTypes(int metaTypeId, QCborTag tag) const
  16. {
  17. Q_UNUSED(metaTypeId)
  18. Q_UNUSED(tag)
  19. return {QCborValue::ByteArray};
  20. }
  21. int BitArrayConverter::guessType(QCborTag tag, QCborValue::Type dataType) const
  22. {
  23. if (tag == static_cast<QCborTag>(CborSerializer::BitArray) &&
  24. dataType == QCborValue::ByteArray)
  25. return QMetaType::QBitArray;
  26. else
  27. return QMetaType::UnknownType;
  28. }
  29. QCborValue BitArrayConverter::serialize(int propertyType, const QVariant &value) const
  30. {
  31. Q_UNUSED(propertyType)
  32. const auto bitArray = value.value<QBitArray>();
  33. if (bitArray.isEmpty())
  34. return {static_cast<QCborTag>(CborSerializer::BitArray), QByteArray{}};
  35. else {
  36. const auto byteLen = bitArray.size() % 8 == 0 ?
  37. bitArray.size() / 8 :
  38. (bitArray.size() / 8) + 1;
  39. QByteArray cData(byteLen + 1, 0);
  40. cData[0] = static_cast<char>(bitArray.size() % 8);
  41. memcpy(cData.data() + 1, bitArray.bits(), static_cast<size_t>(byteLen));
  42. return {static_cast<QCborTag>(CborSerializer::BitArray), cData};
  43. }
  44. }
  45. QVariant BitArrayConverter::deserializeCbor(int propertyType, const QCborValue &value, QObject *parent) const
  46. {
  47. Q_UNUSED(propertyType)
  48. Q_UNUSED(parent)
  49. const auto cData = (value.isTag() ? value.taggedValue() : value).toByteArray();
  50. if (cData.isEmpty())
  51. return QBitArray{};
  52. else {
  53. const auto byteLen = cData.size() - 1;
  54. const auto sSize = static_cast<int>(cData[0]);
  55. if (sSize == 0)
  56. return QBitArray::fromBits(cData.data() + 1, byteLen * 8);
  57. else
  58. return QBitArray::fromBits(cData.data() + 1, (byteLen - 1) * 8 + sSize);
  59. }
  60. }
  61. QVariant BitArrayConverter::deserializeJson(int propertyType, const QCborValue &value, QObject *parent) const
  62. {
  63. return deserializeCbor(propertyType,
  64. QByteArray::fromBase64(value.toString().toUtf8(), QByteArray::Base64UrlEncoding),
  65. parent);
  66. }