MythTV master
mythserialiser.cpp
Go to the documentation of this file.
1// Qt
2#include <QChar> // Fix Qt6 GCC SFINAE warning
3#include <QMetaProperty>
4// MythTV
5#include "mythlogging.h"
7#include "http/mythhttpdata.h"
13
15 : m_result(MythHTTPData::Create())
16{
17 m_buffer.setBuffer(static_cast<QByteArray*>(m_result.get()));
18 m_buffer.open(QIODevice::WriteOnly);
19}
20
22{
23 return m_result;
24}
25
28HTTPData MythSerialiser::Serialise(const QString &Name, const QVariant& Value, const QStringList &Accept)
29{
30 /*
31 auto types = MythMimeDatabase().AllTypes();
32 QStringList names;
33 for (const auto & type : types)
34 names.append(type.Name());
35 names.sort();
36 for (const auto & name : names)
37 LOG(VB_GENERAL, LOG_INFO, name);
38 */
39
40 static const MythMimeType s_xmlType = MythMimeDatabase::MimeTypeForName("application/xml");
41 static const MythMimeType s_xmlPList = MythMimeDatabase::MimeTypeForName("text/x-apple-plist+xml");
42 static const MythMimeType s_cbor = MythMimeDatabase::MimeTypeForName("application/cbor");
43
44 auto WrapData = [](HTTPData Data, const MythMimeType& Mime, const QString& Alias)
45 {
46 Data->m_fileName = "result." + Mime.Suffix();
47 Data->m_mimeType = Mime;
48 Data->m_mimeType.SetAlias(Alias);
49 return Data;
50 };
51
52 static const std::array<MythMimeType,2> s_jsonTypes =
53 {
54 MythMimeDatabase::MimeTypeForName("application/json"),
55 MythMimeDatabase::MimeTypeForName("text/javascript")
56 };
57
58 static const std::array<MythMimeType,2> s_binaryPlists =
59 {
60 MythMimeDatabase::MimeTypeForName("application/x-plist"),
61 MythMimeDatabase::MimeTypeForName("application/x-apple-binary-plist")
62 };
63
64 // Check for preformatted xml or html
65 if (Value.value<QObject*>())
66 {
67 auto * Object = Value.value<QObject*>();
68 const auto * meta = Object->metaObject();
69 int index = meta->indexOfClassInfo("preformat");
70 if (index >= 0
71 && QString("true") == meta->classInfo(index).value())
72 {
74 QBuffer buffer;
75 buffer.setBuffer(static_cast<QByteArray*>(result.get()));
76 buffer.open(QIODevice::WriteOnly);
77 QString mimetype;
78 int count = meta->propertyCount();
79 for (int ix = 0; ix < count; ++ix )
80 {
81 QMetaProperty metaproperty = meta->property(ix);
82#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
83 bool user = metaproperty.isUser(Object);
84#else
85 bool user = metaproperty.isUser();
86#endif
87 if (user)
88 {
89 const char *rawname = metaproperty.name();
90 QString name(rawname);
91 QVariant value(Object->property(rawname));
92 if (name.compare("mimetype") == 0)
93 {
94 mimetype = value.toString();
95 continue;
96 }
97 if (name.compare("buffer") == 0)
98 {
99 buffer.write(value.toString().toUtf8());
100 continue;
101 }
102 }
103 }
105 auto alias = reqType.Aliases().indexOf(mimetype);
106 return WrapData(result, reqType, reqType.Aliases().at(alias));
107 }
108 }
109
110 for (const auto & mime : Accept)
111 {
112 LOG(VB_HTTP, LOG_DEBUG, QString("Looking for serialiser for '%1'").arg(mime));
113 for (const auto & jsontype : s_jsonTypes)
114 {
115 if (const auto & alias = jsontype.Aliases().indexOf(mime); alias >= 0)
116 if (MythJSONSerialiser json(Name, Value); json.Result() != nullptr)
117 return WrapData(json.Result(), jsontype, jsontype.Aliases().at(alias));
118 }
119
120 if (const auto & alias = s_xmlType.Aliases().indexOf(mime); alias >= 0)
121 if (MythXMLSerialiser xml(Name, Value); xml.Result() != nullptr)
122 return WrapData(xml.Result(), s_xmlType, s_xmlType.Aliases().at(alias));
123
124 if (const auto & alias = s_xmlPList.Aliases().indexOf(mime); alias >= 0)
125 if (MythXMLPListSerialiser plist(Name, Value); plist.Result() != nullptr)
126 return WrapData(plist.Result(), s_xmlPList, s_xmlPList.Aliases().at(alias));
127
128 if (const auto & alias = s_cbor.Aliases().indexOf(mime); alias >= 0)
129 if (MythCBORSerialiser cbor(Name, Value); cbor.Result() != nullptr)
130 return WrapData(cbor.Result(), s_cbor, s_cbor.Aliases().at(alias));
131 }
132
133 // Default to XML
134 MythXMLSerialiser xml(Name, Value);
135 return WrapData(xml.Result(), s_xmlType, s_xmlType.Name());
136}
static HTTPData Create()
Definition: mythhttpdata.cpp:4
static MythMimeType MimeTypeForName(const QString &Name)
Return a mime type that matches the given name.
QString Name() const
QStringList Aliases() const
HTTPData Result()
HTTPData m_result
static HTTPData Serialise(const QString &Name, const QVariant &Value, const QStringList &Accept)
Serialise the given data with an encoding suggested by Accept.
std::shared_ptr< MythHTTPData > HTTPData
Definition: mythhttptypes.h:37
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
Definition: mythlogging.h:39