MythTV master
mythcborserialiser.cpp
Go to the documentation of this file.
1// Qt
2#include <QChar> // Fix Qt6 GCC SFINAE warning
3#include <QMetaProperty>
4#if QT_VERSION < QT_VERSION_CHECK(6,11,0)
5#include <QSequentialIterable>
6#else
7#include <QMetaSequence>
8#endif
9
10// MythTV
11#include "mythdate.h"
13
14#include <QCborStreamWriter>
15MythCBORSerialiser::MythCBORSerialiser(const QString& Name, const QVariant& Value)
16 : m_writer(new QCborStreamWriter(&m_buffer))
17{
18 QString name = Name;
19 if (name.startsWith("V2"))
20 name.remove(0,2);
21 AddObject(name, Value);
22}
23
24void MythCBORSerialiser::AddObject(const QString& Name, const QVariant& Value)
25{
26 m_writer->startMap();
27 auto name = Name.toUtf8();
28 m_writer->appendTextString(name.constData(), name.size());
29 AddValue(Value);
30 m_writer->endMap();
31}
32
40void MythCBORSerialiser::AddValue(const QVariant& Value)
41{
42 if (Value.isNull() || !Value.isValid())
43 {
44 m_writer->append(QCborSimpleType::Null);
45 return;
46 }
47
48 auto * object = Value.value<QObject*>();
49 if (object)
50 {
51 QVariant isNull = object->property("isNull");
52 if (isNull.toBool())
53 {
54 m_writer->append(QCborSimpleType::Null);
55 return;
56 }
57 AddQObject(object);
58 return;
59 }
60
61 bool ok = false;
62 switch (
63#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
64 static_cast<QMetaType::Type>(Value.type())
65#else
66 static_cast<QMetaType::Type>(Value.typeId())
67#endif
68 )
69 {
70 case QMetaType::Int:
71 case QMetaType::LongLong:
72 if (auto value = Value.toLongLong(&ok); ok)
73 m_writer->append(value);
74 break;
75 case QMetaType::UInt:
76 case QMetaType::ULongLong:
77 if (auto value = Value.toULongLong(&ok); ok)
78 m_writer->append(value);
79 break;
80 case QMetaType::Double: m_writer->append(Value.toDouble()); break;
81 case QMetaType::Bool: m_writer->append(Value.toBool()); break;
82 case QMetaType::QStringList: AddStringList(Value); break;
83 case QMetaType::QVariantList: AddList(Value); break;
84 case QMetaType::QVariantMap: AddMap(Value.toMap()); break;
85 // TODO This
86 case QMetaType::QDateTime:
87 {
88 QDateTime dt(Value.toDateTime());
89 if (dt.isNull())
90 {
91 m_writer->append(QCborSimpleType::Null);
92 }
93 else
94 {
95 auto name = MythDate::toString(dt, MythDate::ISODate).toUtf8();
96 m_writer->appendTextString(name.constData(), name.size());
97 }
98 }
99 break;
100 default:
101 auto name = Value.toString().toUtf8();
102 m_writer->appendTextString(name.constData(), name.size());
103 }
104}
105
106void MythCBORSerialiser::AddQObject(const QObject* Object)
107{
108 if (!Object)
109 return;
110 const auto * metaobject = Object->metaObject();
111 int count = metaobject->propertyCount();
112
113 m_writer->startMap();
114 for (int index = 0; index < count; ++index )
115 {
116 QMetaProperty metaProperty = metaobject->property(index);
117 if (
118#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
119 metaProperty.isUser(Object)
120#else
121 metaProperty.isUser()
122#endif
123 )
124 {
125 const char *rawname = metaProperty.name();
126 QString name(rawname);
127 if (name.compare("objectName") == 0)
128 continue;
129 auto utf8 = name.toUtf8();
130 m_writer->appendTextString(utf8.constData(), utf8.size());
131 AddValue(Object->property(rawname));
132 }
133 }
134 m_writer->endMap();
135}
136
137void MythCBORSerialiser::AddStringList(const QVariant &Values)
138{
139 m_writer->startArray();
140#if QT_VERSION < QT_VERSION_CHECK(6,11,0)
141 auto values = Values.value<QSequentialIterable>();
142#else
143 auto values = Values.value<QMetaSequence::Iterable>();
144#endif
145 for (const auto & value : values)
146 {
147 auto utf8 = value.toString().toUtf8();
148 m_writer->appendTextString(utf8.constData(), utf8.size());
149 }
150 m_writer->endArray();
151}
152
153void MythCBORSerialiser::AddList(const QVariant& Values)
154{
155 m_writer->startArray();
156#if QT_VERSION < QT_VERSION_CHECK(6,11,0)
157 auto values = Values.value<QSequentialIterable>();
158#else
159 auto values = Values.value<QMetaSequence::Iterable>();
160#endif
161 for (const auto & value : values)
162 AddValue(value);
163 m_writer->endArray();
164}
165
166void MythCBORSerialiser::AddMap(const QVariantMap& Map)
167{
168 m_writer->startMap();
169 for (auto it = Map.cbegin(); it != Map.cend(); ++it)
170 {
171 auto utf8 = it.key().toUtf8();
172 m_writer->appendTextString(utf8.constData(), utf8.size());
173 AddValue(it.value());
174 }
175 m_writer->endMap();
176}
void AddObject(const QString &Name, const QVariant &Value)
void AddQObject(const QObject *Object)
QCborStreamWriter * m_writer
void AddList(const QVariant &Values)
void AddMap(const QVariantMap &Map)
void AddStringList(const QVariant &Values)
MythCBORSerialiser(const QString &Name, const QVariant &Value)
void AddValue(const QVariant &Value)
MythCBORSerialiser::AddValue.
QString toString(const QDateTime &raw_dt, uint format)
Returns formatted string representing the time.
Definition: mythdate.cpp:93
@ ISODate
Default UTC.
Definition: mythdate.h:18