From d39bd9e258a5bb45f6209d892ed682809623807d Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Wed, 9 Sep 2020 12:30:11 +0200 Subject: Cleanup DBus type registration code Modernize the code base, use QMetaType and avoid reinterpret_casts. Change-Id: I0bad2ee393a0f850cf40b248cb9439b06ed9f663 Reviewed-by: Thiago Macieira --- src/dbus/qdbusabstractinterface.cpp | 2 +- src/dbus/qdbusargument.cpp | 2 +- src/dbus/qdbusintegrator.cpp | 2 +- src/dbus/qdbusinterface.cpp | 2 +- src/dbus/qdbusinternalfilters.cpp | 2 +- src/dbus/qdbusmarshaller.cpp | 2 +- src/dbus/qdbusmetatype.cpp | 58 ++++++++++++++++++------------------- src/dbus/qdbusmetatype.h | 32 ++++++-------------- src/dbus/qdbusmetatype_p.h | 8 ----- src/dbus/qdbusreply.cpp | 2 +- 10 files changed, 44 insertions(+), 68 deletions(-) (limited to 'src') diff --git a/src/dbus/qdbusabstractinterface.cpp b/src/dbus/qdbusabstractinterface.cpp index 35770d2c4e..4c580ed676 100644 --- a/src/dbus/qdbusabstractinterface.cpp +++ b/src/dbus/qdbusabstractinterface.cpp @@ -212,7 +212,7 @@ bool QDBusAbstractInterfacePrivate::property(const QMetaProperty &mp, void *retu foundSignature = arg.currentSignature().toLatin1(); if (foundSignature == expectedSignature) { // signatures match, we can demarshall - return QDBusMetaType::demarshall(arg, type, returnValuePtr); + return QDBusMetaType::demarshall(arg, QMetaType(type), returnValuePtr); } } else { foundType = value.typeName(); diff --git a/src/dbus/qdbusargument.cpp b/src/dbus/qdbusargument.cpp index 854e5f9e29..840a6d9673 100644 --- a/src/dbus/qdbusargument.cpp +++ b/src/dbus/qdbusargument.cpp @@ -76,7 +76,7 @@ QByteArray QDBusArgumentPrivate::createSignature(int id) // run it QVariant v{QMetaType(id)}; QDBusArgument arg(marshaller); - QDBusMetaType::marshall(arg, v.userType(), v.constData()); + QDBusMetaType::marshall(arg, v.metaType(), v.constData()); arg.d = nullptr; // delete it diff --git a/src/dbus/qdbusintegrator.cpp b/src/dbus/qdbusintegrator.cpp index 24a571e227..e177583bfa 100644 --- a/src/dbus/qdbusintegrator.cpp +++ b/src/dbus/qdbusintegrator.cpp @@ -952,7 +952,7 @@ void QDBusConnectionPrivate::deliverCall(QObject *object, int /*flags*/, const Q *reinterpret_cast(arg.constData()); QVariant &out = auxParameters[auxParameters.count() - 1]; - if (Q_UNLIKELY(!QDBusMetaType::demarshall(in, out.userType(), out.data()))) + if (Q_UNLIKELY(!QDBusMetaType::demarshall(in, out.metaType(), out.data()))) qFatal("Internal error: demarshalling function for type '%s' (%d) failed!", out.typeName(), out.userType()); diff --git a/src/dbus/qdbusinterface.cpp b/src/dbus/qdbusinterface.cpp index 612ee874b3..e80dbdf0e0 100644 --- a/src/dbus/qdbusinterface.cpp +++ b/src/dbus/qdbusinterface.cpp @@ -144,7 +144,7 @@ static void copyArgument(void *to, int id, const QVariant &arg) } // we can demarshall - QDBusMetaType::demarshall(dbarg, id, to); + QDBusMetaType::demarshall(dbarg, QMetaType(id), to); } QDBusInterfacePrivate::QDBusInterfacePrivate(const QString &serv, const QString &p, diff --git a/src/dbus/qdbusinternalfilters.cpp b/src/dbus/qdbusinternalfilters.cpp index 3c210a4641..7b99cbd917 100644 --- a/src/dbus/qdbusinternalfilters.cpp +++ b/src/dbus/qdbusinternalfilters.cpp @@ -359,7 +359,7 @@ static int writeProperty(QObject *obj, const QByteArray &property_name, QVariant if (id != QMetaType::QVariant && value.userType() == QDBusMetaTypeId::argument()) { // we have to demarshall before writing QVariant other{QMetaType(id)}; - if (!QDBusMetaType::demarshall(qvariant_cast(value), id, other.data())) { + if (!QDBusMetaType::demarshall(qvariant_cast(value), other.metaType(), other.data())) { qWarning("QDBusConnection: type `%s' (%d) is not registered with QtDBus. " "Use qDBusRegisterMetaType to register it", mp.typeName(), id); diff --git a/src/dbus/qdbusmarshaller.cpp b/src/dbus/qdbusmarshaller.cpp index 4288cd75db..5e25e4913b 100644 --- a/src/dbus/qdbusmarshaller.cpp +++ b/src/dbus/qdbusmarshaller.cpp @@ -528,7 +528,7 @@ bool QDBusMarshaller::appendRegisteredType(const QVariant &arg) { ref.ref(); // reference up QDBusArgument self(QDBusArgumentPrivate::create(this)); - return QDBusMetaType::marshall(self, arg.userType(), arg.constData()); + return QDBusMetaType::marshall(self, arg.metaType(), arg.constData()); } bool QDBusMarshaller::appendCrossMarshalling(QDBusDemarshaller *demarshaller) diff --git a/src/dbus/qdbusmetatype.cpp b/src/dbus/qdbusmetatype.cpp index 94317b81a3..d196125c75 100644 --- a/src/dbus/qdbusmetatype.cpp +++ b/src/dbus/qdbusmetatype.cpp @@ -47,6 +47,11 @@ #include #include #include +#include +#include +#include +#include +#include #include "qdbusargument_p.h" #include "qdbusutil_p.h" @@ -77,16 +82,6 @@ public: QDBusMetaType::DemarshallFunction demarshall; }; -template -inline static void registerHelper(T * = nullptr) -{ - void (*mf)(QDBusArgument &, const T *) = qDBusMarshallHelper; - void (*df)(const QDBusArgument &, T *) = qDBusDemarshallHelper; - QDBusMetaType::registerMarshallOperators(qMetaTypeId(), - reinterpret_cast(mf), - reinterpret_cast(df)); -} - void QDBusMetaTypeId::init() { static QBasicAtomicInt initialized = Q_BASIC_ATOMIC_INITIALIZER(false); @@ -105,20 +100,20 @@ void QDBusMetaTypeId::init() #ifndef QDBUS_NO_SPECIALTYPES // and register Qt Core's with us - registerHelper(); - registerHelper(); - registerHelper(); - registerHelper(); - registerHelper(); - registerHelper(); - registerHelper(); - registerHelper(); - registerHelper(); - registerHelper(); - registerHelper(); - registerHelper(); - registerHelper(); - registerHelper(); + qDBusRegisterMetaType(); + qDBusRegisterMetaType(); + qDBusRegisterMetaType(); + qDBusRegisterMetaType(); + qDBusRegisterMetaType(); + qDBusRegisterMetaType(); + qDBusRegisterMetaType(); + qDBusRegisterMetaType(); + qDBusRegisterMetaType(); + qDBusRegisterMetaType(); + qDBusRegisterMetaType(); + qDBusRegisterMetaType(); + qDBusRegisterMetaType(); + qDBusRegisterMetaType(); qDBusRegisterMetaType >(); qDBusRegisterMetaType >(); @@ -213,11 +208,12 @@ Q_GLOBAL_STATIC(QReadWriteLock, customTypesLock) /*! \internal Registers the marshalling and demarshalling functions for meta - type \a id. + type \a metaType. */ -void QDBusMetaType::registerMarshallOperators(int id, MarshallFunction mf, +void QDBusMetaType::registerMarshallOperators(QMetaType metaType, MarshallFunction mf, DemarshallFunction df) { + int id = metaType.id(); QList *ct = customTypes(); if (id < 0 || !mf || !df || !ct) return; // error! @@ -232,12 +228,13 @@ void QDBusMetaType::registerMarshallOperators(int id, MarshallFunction mf, /*! \internal - Executes the marshalling of type \a id (whose data is contained in + Executes the marshalling of type \a metaType (whose data is contained in \a data) to the D-Bus marshalling argument \a arg. Returns \c true if the marshalling succeeded, or false if an error occurred. */ -bool QDBusMetaType::marshall(QDBusArgument &arg, int id, const void *data) +bool QDBusMetaType::marshall(QDBusArgument &arg, QMetaType metaType, const void *data) { + int id = metaType.id(); QDBusMetaTypeId::init(); MarshallFunction mf; @@ -261,12 +258,13 @@ bool QDBusMetaType::marshall(QDBusArgument &arg, int id, const void *data) /*! \internal - Executes the demarshalling of type \a id (whose data will be placed in + Executes the demarshalling of type \a metaType (whose data will be placed in \a data) from the D-Bus marshalling argument \a arg. Returns \c true if the demarshalling succeeded, or false if an error occurred. */ -bool QDBusMetaType::demarshall(const QDBusArgument &arg, int id, void *data) +bool QDBusMetaType::demarshall(const QDBusArgument &arg, QMetaType metaType, void *data) { + int id = metaType.id(); QDBusMetaTypeId::init(); DemarshallFunction df; diff --git a/src/dbus/qdbusmetatype.h b/src/dbus/qdbusmetatype.h index e241553bb4..2b4d056e85 100644 --- a/src/dbus/qdbusmetatype.h +++ b/src/dbus/qdbusmetatype.h @@ -55,37 +55,23 @@ public: typedef void (*MarshallFunction)(QDBusArgument &, const void *); typedef void (*DemarshallFunction)(const QDBusArgument &, void *); - static void registerMarshallOperators(int typeId, MarshallFunction, DemarshallFunction); - static bool marshall(QDBusArgument &, int id, const void *data); - static bool demarshall(const QDBusArgument &, int id, void *data); + static void registerMarshallOperators(QMetaType typeId, MarshallFunction, DemarshallFunction); + static bool marshall(QDBusArgument &, QMetaType id, const void *data); + static bool demarshall(const QDBusArgument &, QMetaType id, void *data); static int signatureToType(const char *signature); static const char *typeToSignature(int type); }; template -void qDBusMarshallHelper(QDBusArgument &arg, const T *t) -{ arg << *t; } - -template -void qDBusDemarshallHelper(const QDBusArgument &arg, T *t) -{ arg >> *t; } - -template -int qDBusRegisterMetaType( -#ifndef Q_QDOC - T * /* dummy */ = nullptr -#endif -) +QMetaType qDBusRegisterMetaType() { - void (*mf)(QDBusArgument &, const T *) = qDBusMarshallHelper; - void (*df)(const QDBusArgument &, T *) = qDBusDemarshallHelper; + auto mf = [](QDBusArgument &arg, const void *t) { arg << *static_cast(t); }; + auto df = [](const QDBusArgument &arg, void *t) { arg >> *static_cast(t); }; - int id = qMetaTypeId(); // make sure it's registered - QDBusMetaType::registerMarshallOperators(id, - reinterpret_cast(mf), - reinterpret_cast(df)); - return id; + QMetaType metaType = QMetaType::fromType(); + QDBusMetaType::registerMarshallOperators(metaType, mf, df); + return metaType; } QT_END_NAMESPACE diff --git a/src/dbus/qdbusmetatype_p.h b/src/dbus/qdbusmetatype_p.h index 1aa11552df..39deaf9f2f 100644 --- a/src/dbus/qdbusmetatype_p.h +++ b/src/dbus/qdbusmetatype_p.h @@ -78,11 +78,7 @@ struct QDBusMetaTypeId }; inline int QDBusMetaTypeId::message() -#ifdef QT_BOOTSTRAPPED -{ return qDBusRegisterMetaType >() + 1; } -#else { return qMetaTypeId(); } -#endif inline int QDBusMetaTypeId::argument() { return qMetaTypeId(); } @@ -97,11 +93,7 @@ inline int QDBusMetaTypeId::signature() { return qMetaTypeId(); } inline int QDBusMetaTypeId::error() -#ifdef QT_BOOTSTRAPPED -{ return qDBusRegisterMetaType >() + 2; } -#else { return qMetaTypeId(); } -#endif inline int QDBusMetaTypeId::unixfd() { return qMetaTypeId(); } diff --git a/src/dbus/qdbusreply.cpp b/src/dbus/qdbusreply.cpp index 3c6f1adf1a..a0556f6559 100644 --- a/src/dbus/qdbusreply.cpp +++ b/src/dbus/qdbusreply.cpp @@ -219,7 +219,7 @@ void qDBusReplyFill(const QDBusMessage &reply, QDBusError &error, QVariant &data receivedSignature = arg.currentSignature().toLatin1(); if (receivedSignature == expectedSignature) { // matched. Demarshall it - QDBusMetaType::demarshall(arg, data.userType(), data.data()); + QDBusMetaType::demarshall(arg, data.metaType(), data.data()); return; } } else { -- cgit v1.2.3