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