diff options
Diffstat (limited to 'src/dbus/qdbusmetaobject.cpp')
-rw-r--r-- | src/dbus/qdbusmetaobject.cpp | 48 |
1 files changed, 29 insertions, 19 deletions
diff --git a/src/dbus/qdbusmetaobject.cpp b/src/dbus/qdbusmetaobject.cpp index 5265568f42..dcbed5a6f8 100644 --- a/src/dbus/qdbusmetaobject.cpp +++ b/src/dbus/qdbusmetaobject.cpp @@ -127,27 +127,31 @@ QDBusMetaObjectGenerator::QDBusMetaObjectGenerator(const QString &interfaceName, } } -static int registerComplexDBusType(const char *typeName) +static int registerComplexDBusType(const QByteArray &typeName) { - struct QDBusRawTypeHandler { - static void destruct(void *) - { - qFatal("Cannot destruct placeholder type QDBusRawType"); - } - - static void *construct(void *, const void *) - { - qFatal("Cannot construct placeholder type QDBusRawType"); - return nullptr; - } + struct QDBusRawTypeHandler : QtPrivate::QMetaTypeInterface + { + const QByteArray name; + QDBusRawTypeHandler(const QByteArray &name) + : QtPrivate::QMetaTypeInterface { + 0, sizeof(void *), sizeof(void *), QMetaType::MovableType, nullptr, + name.constData(), 0, QtPrivate::RefCount{0}, + [](QtPrivate::QMetaTypeInterface *self) { + delete static_cast<QDBusRawTypeHandler *>(self); + }, + nullptr, nullptr, nullptr, nullptr, nullptr + }, + name(name) + {} }; - return QMetaType::registerNormalizedType(typeName, - QDBusRawTypeHandler::destruct, - QDBusRawTypeHandler::construct, - sizeof(void *), - QMetaType::MovableType, - nullptr); + static QBasicMutex mutex; + static QHash<QByteArray, QMetaType> hash; + QMutexLocker lock(&mutex); + QMetaType &metatype = hash[typeName]; + if (!metatype.isValid()) + metatype = QMetaType(new QDBusRawTypeHandler(typeName)); + return metatype.id(); } Q_DBUS_EXPORT bool qt_dbus_metaobject_skip_annotations = false; @@ -517,6 +521,9 @@ void QDBusMetaObjectGenerator::write(QDBusMetaObject *obj) offset += methodParametersDataSize; Q_ASSERT(offset == header->propertyData); + QMetaType *metaTypes = new QMetaType[properties.count()]; + int propertyId = 0; + // add each property signatureOffset = header->propertyDBusData; for (QMap<QByteArray, Property>::ConstIterator it = properties.constBegin(); @@ -531,6 +538,8 @@ void QDBusMetaObjectGenerator::write(QDBusMetaObject *obj) idata[signatureOffset++] = strings.enter(mp.signature); idata[signatureOffset++] = mp.type; + + metaTypes[propertyId++] = QMetaType(mp.type); } Q_ASSERT(offset == header->propertyDBusData); @@ -547,8 +556,9 @@ void QDBusMetaObjectGenerator::write(QDBusMetaObject *obj) obj->d.relatedMetaObjects = nullptr; obj->d.static_metacall = nullptr; obj->d.extradata = nullptr; - obj->d.stringdata = reinterpret_cast<const QByteArrayData *>(string_data); + obj->d.stringdata = reinterpret_cast<const uint *>(string_data); obj->d.superdata = &QDBusAbstractInterface::staticMetaObject; + obj->d.metaTypes = reinterpret_cast<QtPrivate::QMetaTypeInterface *const *>(metaTypes); } #if 0 |