19#include <QMetaClassInfo>
33 : m_pXmlWriter(new QXmlStreamWriter( pDevice )),
34 m_sRequestName(std::move(sRequestName))
89 m_pXmlWriter->writeAttribute(
"xmlns:xsi",
"http://www.w3.org/2001/XMLSchema-instance" );
94 const QMetaObject *pMeta = pObject->metaObject();
99 nIdx = pMeta->indexOfClassInfo(
"version" );
102 m_pXmlWriter->writeAttribute(
"version", pMeta->classInfo( nIdx ).value() );
122 const QVariant &vValue,
123 const QMetaObject *pMetaParent,
124 const QMetaProperty *pMetaProp )
128 if ((pMetaProp !=
nullptr) &&
129 (pMetaProp->isEnumType() || pMetaProp->isFlagType()))
146 const QVariant &vValue,
147 const QMetaProperty *pMetaProp )
150 QMetaEnum metaEnum = pMetaProp->enumerator();
152 if (pMetaProp->isFlagType())
153 sValue = metaEnum.valueToKeys( vValue.toInt() );
155 sValue = metaEnum.valueToKey ( vValue.toInt() );
159 if (sValue.isEmpty())
160 sValue = vValue.toString();
177 if ( vValue.canConvert< QObject* >())
179 const QObject *pObject = vValue.value< QObject* >();
189#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
190 auto type =
static_cast<QMetaType::Type
>(vValue.type());
192 auto type = vValue.typeId();
196 case QMetaType::QVariantList:
202 case QMetaType::QStringList:
208 case QMetaType::QVariantMap:
214 case QMetaType::QDateTime:
216 QDateTime dt( vValue.toDateTime() );
244 for (
const auto& vValue : list)
261 for (
const QString& str : list)
278 for (
auto it = map.cbegin(); it != map.cend(); ++it)
306 QString sTypeName( sName );
308 if ((sName.length() > 0) && (sName.at(0) ==
'Q'))
309 sTypeName = sName.mid( 1 );
311 sTypeName.remove(
"DTC::" );
312 sTypeName.remove( QChar(
'*') );
322 const QMetaObject *pMetaObject,
323 const QMetaProperty * )
330 nClassIdx = pMetaObject->indexOfClassInfo( sName.toLatin1().constData() );
334 QString sOptionData = pMetaObject->classInfo( nClassIdx ).value();
335 QStringList sOptions = sOptionData.split(
';' );
339 if (sNameOption.isEmpty())
342 if (!sNameOption.isEmpty())
348 QString sTypeName( sName );
350 if ((sName.length() > 0) && (sName.at(0) ==
'Q'))
351 sTypeName = sName.mid( 1 );
353 sTypeName.remove(
"DTC::" );
354 sTypeName.remove( QChar(
'*') );
365 QString sKey = sName +
"=";
367 auto hasKey = [&sKey](
const QString& o) {
return o.startsWith( sKey ); };
368 auto it = std::ranges::find_if(std::as_const(sOptions), hasKey);
369 if (it != sOptions.cend())
370 return (*it).mid( sKey.length() );
void SerializeObjectProperties(const QObject *pObject)
void AddProperty(const QString &sName, const QVariant &vValue, const QMetaObject *pMetaParent, const QMetaProperty *pMetaProp) override
static QString GetContentName(const QString &sName, const QMetaObject *pMetaObject, const QMetaProperty *pMetaProp)
QXmlStreamWriter * m_pXmlWriter
void RenderEnum(const QString &sName, const QVariant &vValue, const QMetaProperty *pMetaProp)
void RenderMap(const QString &sName, const QVariantMap &map)
void EndObject(const QString &sName, const QObject *pObject) override
QString GetContentType() override
static QString FindOptionValue(const QStringList &sOptions, const QString &sName)
void RenderValue(const QString &sName, const QVariant &vValue)
static QString GetItemName(const QString &sName)
void BeginSerialize(QString &sName) override
void EndSerialize() override
XmlSerializer(QIODevice *pDevice, QString sRequestName)
void RenderStringList(const QString &sName, const QStringList &list)
void RenderList(const QString &sName, const QVariantList &list)
void BeginObject(const QString &sName, const QObject *pObject) override
QString toString(const QDateTime &raw_dt, uint format)
Returns formatted string representing the time.
static constexpr const char * XML_SERIALIZER_VERSION