21#include <QMetaClassInfo>
32 m_pXmlWriter->writeDTD(R
"(<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">)");
47 return "text/x-apple-plist+xml";
51 const QVariant &vValue,
54 if ( vValue.canConvert<QObject*>())
56 const QObject *pObject = vValue.value<QObject*>();
61#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
62 auto type =
static_cast<QMetaType::Type
>(vValue.type());
64 auto type = vValue.typeId();
68 case QMetaType::QVariantList:
74 case QMetaType::QStringList:
80 case QMetaType::QVariantMap:
86 case QMetaType::QDateTime:
88 if (vValue.toDateTime().isValid())
92 m_pXmlWriter->writeTextElement(
"date", vValue.toDateTime()
93 .toUTC().toString(
"yyyy-MM-ddThh:mm:ssZ"));
98 case QMetaType::QByteArray:
100 if (!vValue.toByteArray().isNull())
105 vValue.toByteArray().toBase64().data());
110 case QMetaType::Bool:
119 case QMetaType::UInt:
120 case QMetaType::ULongLong:
125 QString::number(vValue.toULongLong()));
130 case QMetaType::LongLong:
131 case QMetaType::Double:
136 QString(
"%1").arg(vValue.toDouble(), 0,
'f', 6));
141 case QMetaType::QString:
146 m_pXmlWriter->writeTextElement(
"string", vValue.toString());
153 const QVariantList &list)
158#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
159 auto t =
static_cast<QMetaType::Type
>(list[0].type());
160 array = std::ranges::all_of(std::as_const(list),
161 [
t](
const QVariant& v)
162 {
return t ==
static_cast<QMetaType::Type
>(v.type()); } );
164 auto t = list[0].typeId();
165 array = std::ranges::all_of(std::as_const(list),
166 [
t](
const QVariant& v) {
return t == v.typeId(); } );
172 m_pXmlWriter->writeStartElement(array ?
"array" :
"dict");
174 for (
const auto& variant : list)
181 const QStringList &list)
186 for (
const QString& str : list)
193 const QVariantMap &map)
199 for (
auto it = map.cbegin(); it != map.cend(); ++it)
206 const QObject *pObject)
208 const QMetaObject *pMeta = pObject->metaObject();
213 nIdx = pMeta->indexOfClassInfo(
"version");
218 m_pXmlWriter->writeTextElement(
"string", pMeta->classInfo(nIdx).value());
221 m_pXmlWriter->writeTextElement(
"key",
"serializerversion");
235 const QVariant &vValue,
237 const QMetaProperty *)
243 const QObject *pObject,
256 const QMetaObject *pMetaObject = pObject->metaObject();
258 int nCount = pMetaObject->propertyCount();
260 for (
int nIdx=0; nIdx < nCount; ++nIdx)
262 QMetaProperty metaProperty = pMetaObject->property(nIdx);
264 if (metaProperty.isDesignable())
266 const char *pszPropName = metaProperty.name();
267 QString sPropName(pszPropName);
269 if (sPropName.compare(
"objectName") == 0)
272 QVariant value(pObject->property(pszPropName));
274 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