21#include <QMetaClassInfo>
31 m_pXmlWriter->writeDTD(R
"(<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">)");
46 return "text/x-apple-plist+xml";
50 const QVariant &vValue,
53 if ( vValue.canConvert<QObject*>())
55 const QObject *pObject = vValue.value<QObject*>();
60#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
61 auto type =
static_cast<QMetaType::Type
>(vValue.type());
63 auto type = vValue.typeId();
67 case QMetaType::QVariantList:
73 case QMetaType::QStringList:
79 case QMetaType::QVariantMap:
85 case QMetaType::QDateTime:
87 if (vValue.toDateTime().isValid())
91 m_pXmlWriter->writeTextElement(
"date", vValue.toDateTime()
92 .toUTC().toString(
"yyyy-MM-ddThh:mm:ssZ"));
97 case QMetaType::QByteArray:
99 if (!vValue.toByteArray().isNull())
104 vValue.toByteArray().toBase64().data());
109 case QMetaType::Bool:
118 case QMetaType::UInt:
119 case QMetaType::ULongLong:
124 QString::number(vValue.toULongLong()));
129 case QMetaType::LongLong:
130 case QMetaType::Double:
135 QString(
"%1").arg(vValue.toDouble(), 0,
'f', 6));
140 case QMetaType::QString:
145 m_pXmlWriter->writeTextElement(
"string", vValue.toString());
152 const QVariantList &list)
157#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
158 auto t =
static_cast<QMetaType::Type
>(list[0].type());
159 array = std::all_of(list.cbegin(), list.cend(),
160 [
t](
const QVariant& v)
161 { return t == static_cast<QMetaType::Type>(v.type()); } );
163 auto t = list[0].typeId();
164 array = std::all_of(list.cbegin(), list.cend(),
165 [
t](
const QVariant& v) { return t == v.typeId(); } );
171 m_pXmlWriter->writeStartElement(array ?
"array" :
"dict");
173 QListIterator<QVariant> it(list);
181 const QStringList &list)
186 QListIterator<QString> it(list);
194 const QVariantMap &map)
200 QMapIterator<QString,QVariant> it(map);
211 const QObject *pObject)
213 const QMetaObject *pMeta = pObject->metaObject();
218 nIdx = pMeta->indexOfClassInfo(
"version");
223 m_pXmlWriter->writeTextElement(
"string", pMeta->classInfo(nIdx).value());
226 m_pXmlWriter->writeTextElement(
"key",
"serializerversion");
240 const QVariant &vValue,
242 const QMetaProperty *)
248 const QObject *pObject,
261 const QMetaObject *pMetaObject = pObject->metaObject();
263 int nCount = pMetaObject->propertyCount();
265 for (
int nIdx=0; nIdx < nCount; ++nIdx)
267 QMetaProperty metaProperty = pMetaObject->property(nIdx);
269 if (metaProperty.isDesignable())
271 const char *pszPropName = metaProperty.name();
272 QString sPropName(pszPropName);
274 if (sPropName.compare(
"objectName") == 0)
277 QVariant value(pObject->property(pszPropName));
279 AddProperty(sPropName, value, pMetaObject, &metaProperty);
void RenderStringList(const QString &sName, const QStringList &list)
void BeginSerialize(QString &sName) override
void RenderValue(const QString &sName, const QVariant &vValue, bool needKey=true)
void SerializePListObjectProperties(const QString &sName, const QObject *pObject, bool needKey)
void RenderMap(const QString &sName, const QVariantMap &map)
void EndSerialize() override
void EndObject(const QString &sName, const QObject *pObject) override
void BeginObject(const QString &sName, const QObject *pObject) override
void RenderList(const QString &sName, const QVariantList &list)
void AddProperty(const QString &sName, const QVariant &vValue, const QMetaObject *pMetaParent, const QMetaProperty *pMetaProp) override
QString GetContentType() override
QXmlStreamWriter * m_pXmlWriter
static QString GetItemName(const QString &sName)
static constexpr const char * XMLPLIST_SERIALIZER_VERSION