summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2020-09-09 12:30:11 +0200
committerLars Knoll <lars.knoll@qt.io>2020-09-23 19:30:15 +0200
commitd39bd9e258a5bb45f6209d892ed682809623807d (patch)
treefc75877633b97db8d54930f3826d27ce359c9db7 /src
parentabd1b7f3068e7d4a41adf440d6f6163bfa9f531a (diff)
Cleanup DBus type registration code
Modernize the code base, use QMetaType and avoid reinterpret_casts. Change-Id: I0bad2ee393a0f850cf40b248cb9439b06ed9f663 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src')
-rw-r--r--src/dbus/qdbusabstractinterface.cpp2
-rw-r--r--src/dbus/qdbusargument.cpp2
-rw-r--r--src/dbus/qdbusintegrator.cpp2
-rw-r--r--src/dbus/qdbusinterface.cpp2
-rw-r--r--src/dbus/qdbusinternalfilters.cpp2
-rw-r--r--src/dbus/qdbusmarshaller.cpp2
-rw-r--r--src/dbus/qdbusmetatype.cpp58
-rw-r--r--src/dbus/qdbusmetatype.h32
-rw-r--r--src/dbus/qdbusmetatype_p.h8
-rw-r--r--src/dbus/qdbusreply.cpp2
10 files changed, 44 insertions, 68 deletions
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<const QDBusArgument *>(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<QDBusArgument>(value), id, other.data())) {
+ if (!QDBusMetaType::demarshall(qvariant_cast<QDBusArgument>(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 <qglobal.h>
#include <qlist.h>
#include <qreadwritelock.h>
+#include <qdatetime.h>
+#include <qrect.h>
+#include <qsize.h>
+#include <qpoint.h>
+#include <qline.h>
#include "qdbusargument_p.h"
#include "qdbusutil_p.h"
@@ -77,16 +82,6 @@ public:
QDBusMetaType::DemarshallFunction demarshall;
};
-template<typename T>
-inline static void registerHelper(T * = nullptr)
-{
- void (*mf)(QDBusArgument &, const T *) = qDBusMarshallHelper<T>;
- void (*df)(const QDBusArgument &, T *) = qDBusDemarshallHelper<T>;
- QDBusMetaType::registerMarshallOperators(qMetaTypeId<T>(),
- reinterpret_cast<QDBusMetaType::MarshallFunction>(mf),
- reinterpret_cast<QDBusMetaType::DemarshallFunction>(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<QDate>();
- registerHelper<QTime>();
- registerHelper<QDateTime>();
- registerHelper<QRect>();
- registerHelper<QRectF>();
- registerHelper<QSize>();
- registerHelper<QSizeF>();
- registerHelper<QPoint>();
- registerHelper<QPointF>();
- registerHelper<QLine>();
- registerHelper<QLineF>();
- registerHelper<QVariantList>();
- registerHelper<QVariantMap>();
- registerHelper<QVariantHash>();
+ qDBusRegisterMetaType<QDate>();
+ qDBusRegisterMetaType<QTime>();
+ qDBusRegisterMetaType<QDateTime>();
+ qDBusRegisterMetaType<QRect>();
+ qDBusRegisterMetaType<QRectF>();
+ qDBusRegisterMetaType<QSize>();
+ qDBusRegisterMetaType<QSizeF>();
+ qDBusRegisterMetaType<QPoint>();
+ qDBusRegisterMetaType<QPointF>();
+ qDBusRegisterMetaType<QLine>();
+ qDBusRegisterMetaType<QLineF>();
+ qDBusRegisterMetaType<QVariantList>();
+ qDBusRegisterMetaType<QVariantMap>();
+ qDBusRegisterMetaType<QVariantHash>();
qDBusRegisterMetaType<QList<bool> >();
qDBusRegisterMetaType<QList<short> >();
@@ -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<QDBusCustomTypeInfo> *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<typename T>
-void qDBusMarshallHelper(QDBusArgument &arg, const T *t)
-{ arg << *t; }
-
-template<typename T>
-void qDBusDemarshallHelper(const QDBusArgument &arg, T *t)
-{ arg >> *t; }
-
-template<typename T>
-int qDBusRegisterMetaType(
-#ifndef Q_QDOC
- T * /* dummy */ = nullptr
-#endif
-)
+QMetaType qDBusRegisterMetaType()
{
- void (*mf)(QDBusArgument &, const T *) = qDBusMarshallHelper<T>;
- void (*df)(const QDBusArgument &, T *) = qDBusDemarshallHelper<T>;
+ auto mf = [](QDBusArgument &arg, const void *t) { arg << *static_cast<const T *>(t); };
+ auto df = [](const QDBusArgument &arg, void *t) { arg >> *static_cast<T *>(t); };
- int id = qMetaTypeId<T>(); // make sure it's registered
- QDBusMetaType::registerMarshallOperators(id,
- reinterpret_cast<QDBusMetaType::MarshallFunction>(mf),
- reinterpret_cast<QDBusMetaType::DemarshallFunction>(df));
- return id;
+ QMetaType metaType = QMetaType::fromType<T>();
+ 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<QList<QDBusUnixFileDescriptor> >() + 1; }
-#else
{ return qMetaTypeId<QDBusMessage>(); }
-#endif
inline int QDBusMetaTypeId::argument()
{ return qMetaTypeId<QDBusArgument>(); }
@@ -97,11 +93,7 @@ inline int QDBusMetaTypeId::signature()
{ return qMetaTypeId<QDBusSignature>(); }
inline int QDBusMetaTypeId::error()
-#ifdef QT_BOOTSTRAPPED
-{ return qDBusRegisterMetaType<QList<QDBusUnixFileDescriptor> >() + 2; }
-#else
{ return qMetaTypeId<QDBusError>(); }
-#endif
inline int QDBusMetaTypeId::unixfd()
{ return qMetaTypeId<QDBusUnixFileDescriptor>(); }
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 {