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>
10 MythCBORSerialiser::MythCBORSerialiser(const QString& Name, const QVariant& Value)
11 {
12  m_writer = new QCborStreamWriter(&m_buffer);
13  QString name = Name;
14  if (name.startsWith("V2"))
15  name.remove(0,2);
16  AddObject(name, Value);
17 }
18 
19 void 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 
35 void 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 
101 void 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 
132 void 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 
144 void 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 
153 void 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 }
MythDate::toString
QString toString(const QDateTime &raw_dt, uint format)
Returns formatted string representing the time.
Definition: mythdate.cpp:84
MythCBORSerialiser::AddMap
void AddMap(const QVariantMap &Map)
Definition: mythcborserialiser.cpp:153
MythCBORSerialiser::AddObject
void AddObject(const QString &Name, const QVariant &Value)
Definition: mythcborserialiser.cpp:19
mythcborserialiser.h
MythSerialiser::m_buffer
QBuffer m_buffer
Definition: mythserialiser.h:22
mythdate.h
MythCBORSerialiser::AddValue
void AddValue(const QVariant &Value)
MythCBORSerialiser::AddValue.
Definition: mythcborserialiser.cpp:35
MythCBORSerialiser::m_writer
QCborStreamWriter * m_writer
Definition: mythcborserialiser.h:24
MythCBORSerialiser::AddStringList
void AddStringList(const QVariant &Values)
Definition: mythcborserialiser.cpp:132
MythCBORSerialiser::AddList
void AddList(const QVariant &Values)
Definition: mythcborserialiser.cpp:144
MythCBORSerialiser::MythCBORSerialiser
MythCBORSerialiser(const QString &Name, const QVariant &Value)
Definition: mythcborserialiser.cpp:10
Name
Definition: channelsettings.cpp:71
MythDate::ISODate
@ ISODate
Default UTC.
Definition: mythdate.h:17
MythCBORSerialiser::AddQObject
void AddQObject(const QObject *Object)
Definition: mythcborserialiser.cpp:101