diff options
Diffstat (limited to 'src/dbus')
-rw-r--r-- | src/dbus/.prev_CMakeLists.txt | 76 | ||||
-rw-r--r-- | src/dbus/CMakeLists.txt | 79 | ||||
-rw-r--r-- | src/dbus/Qt5DBusConfigExtras.cmake.in | 44 | ||||
-rw-r--r-- | src/dbus/Qt6DBusMacros.cmake (renamed from src/dbus/Qt5DBusMacros.cmake) | 35 | ||||
-rw-r--r-- | src/dbus/doc/snippets/code/doc_src_qdbusadaptors.cpp | 1 | ||||
-rw-r--r-- | src/dbus/doc/src/dbus-adaptors.qdoc | 3 | ||||
-rw-r--r-- | src/dbus/qdbusabstractadaptor.cpp | 118 | ||||
-rw-r--r-- | src/dbus/qdbusabstractadaptor_p.h | 9 | ||||
-rw-r--r-- | src/dbus/qdbusargument.cpp | 7 | ||||
-rw-r--r-- | src/dbus/qdbusargument.h | 106 | ||||
-rw-r--r-- | src/dbus/qdbusmetaobject.cpp | 48 | ||||
-rw-r--r-- | src/dbus/qdbusmetaobject_p.h | 1 | ||||
-rw-r--r-- | src/dbus/qdbusmisc.cpp | 5 |
13 files changed, 251 insertions, 281 deletions
diff --git a/src/dbus/.prev_CMakeLists.txt b/src/dbus/.prev_CMakeLists.txt new file mode 100644 index 0000000000..1136ebe19b --- /dev/null +++ b/src/dbus/.prev_CMakeLists.txt @@ -0,0 +1,76 @@ +# Generated from dbus.pro. + +##################################################################### +## DBus Module: +##################################################################### + +qt_add_module(DBus + QMAKE_MODULE_CONFIG dbusadaptors dbusinterfaces + SOURCES + dbus_minimal_p.h + qdbus_symbols.cpp qdbus_symbols_p.h + qdbusabstractadaptor.cpp qdbusabstractadaptor.h qdbusabstractadaptor_p.h + qdbusabstractinterface.cpp qdbusabstractinterface.h qdbusabstractinterface_p.h + qdbusargument.cpp qdbusargument.h qdbusargument_p.h + qdbusconnection.cpp qdbusconnection.h qdbusconnection_p.h + qdbusconnectioninterface.cpp qdbusconnectioninterface.h + qdbusconnectionmanager_p.h + qdbuscontext.cpp qdbuscontext.h qdbuscontext_p.h + qdbuserror.cpp qdbuserror.h + qdbusextratypes.cpp qdbusextratypes.h + qdbusintegrator.cpp qdbusintegrator_p.h + qdbusinterface.cpp qdbusinterface.h qdbusinterface_p.h + qdbusinternalfilters.cpp + qdbusintrospection.cpp qdbusintrospection_p.h + qdbusmarshaller.cpp + qdbusmessage.cpp qdbusmessage.h qdbusmessage_p.h + qdbusmetaobject.cpp + qdbusmetatype.cpp qdbusmetatype.h + qdbusmisc.cpp + qdbuspendingcall.cpp qdbuspendingcall.h qdbuspendingcall_p.h + qdbuspendingreply.cpp qdbuspendingreply.h + qdbusreply.cpp qdbusreply.h + qdbusserver.cpp qdbusserver.h + qdbusservicewatcher.cpp qdbusservicewatcher.h + qdbusthreaddebug_p.h + qdbusunixfiledescriptor.cpp qdbusunixfiledescriptor.h + qdbusutil.cpp qdbusutil_p.h + qdbusvirtualobject.cpp qdbusvirtualobject.h + qdbusxmlgenerator.cpp + qdbusxmlparser.cpp qdbusxmlparser_p.h + qtdbusglobal.h qtdbusglobal_p.h + DEFINES + DBUS_API_SUBJECT_TO_CHANGE + QT_NO_FOREACH + LIBRARIES + Qt::CorePrivate + PUBLIC_LIBRARIES + Qt::Core + PRIVATE_MODULE_INTERFACE + Qt::CorePrivate +) + +#### Keys ignored in scope 1:.:.:dbus.pro:<TRUE>: +# MODULE_CONFIG = "dbusadaptors" "dbusinterfaces" + +## Scopes: +##################################################################### + +qt_extend_target(DBus CONDITION QT_FEATURE_dbus_linked + DEFINES + QT_LINKED_LIBDBUS + LIBRARIES + dbus-1 +) + +qt_extend_target(DBus CONDITION WIN32 + LIBRARIES + advapi32 + netapi32 + user32 + ws2_32 +) +qt_add_docs(DBus + doc/qtdbus.qdocconf +) + diff --git a/src/dbus/CMakeLists.txt b/src/dbus/CMakeLists.txt new file mode 100644 index 0000000000..ea1d7abaa1 --- /dev/null +++ b/src/dbus/CMakeLists.txt @@ -0,0 +1,79 @@ +# Generated from dbus.pro. + +##################################################################### +## DBus Module: +##################################################################### + +qt_add_module(DBus + QMAKE_MODULE_CONFIG dbusadaptors dbusinterfaces + SOURCES + dbus_minimal_p.h + qdbus_symbols.cpp qdbus_symbols_p.h + qdbusabstractadaptor.cpp qdbusabstractadaptor.h qdbusabstractadaptor_p.h + qdbusabstractinterface.cpp qdbusabstractinterface.h qdbusabstractinterface_p.h + qdbusargument.cpp qdbusargument.h qdbusargument_p.h + qdbusconnection.cpp qdbusconnection.h qdbusconnection_p.h + qdbusconnectioninterface.cpp qdbusconnectioninterface.h + qdbusconnectionmanager_p.h + qdbuscontext.cpp qdbuscontext.h qdbuscontext_p.h + qdbuserror.cpp qdbuserror.h + qdbusextratypes.cpp qdbusextratypes.h + qdbusintegrator.cpp qdbusintegrator_p.h + qdbusinterface.cpp qdbusinterface.h qdbusinterface_p.h + qdbusinternalfilters.cpp + qdbusintrospection.cpp qdbusintrospection_p.h + qdbusmarshaller.cpp + qdbusmessage.cpp qdbusmessage.h qdbusmessage_p.h + qdbusmetaobject.cpp + qdbusmetatype.cpp qdbusmetatype.h + qdbusmisc.cpp + qdbuspendingcall.cpp qdbuspendingcall.h qdbuspendingcall_p.h + qdbuspendingreply.cpp qdbuspendingreply.h + qdbusreply.cpp qdbusreply.h + qdbusserver.cpp qdbusserver.h + qdbusservicewatcher.cpp qdbusservicewatcher.h + qdbusthreaddebug_p.h + qdbusunixfiledescriptor.cpp qdbusunixfiledescriptor.h + qdbusutil.cpp qdbusutil_p.h + qdbusvirtualobject.cpp qdbusvirtualobject.h + qdbusxmlgenerator.cpp + qdbusxmlparser.cpp qdbusxmlparser_p.h + qtdbusglobal.h qtdbusglobal_p.h + DEFINES + DBUS_API_SUBJECT_TO_CHANGE + QT_NO_FOREACH + LIBRARIES + Qt::CorePrivate + PUBLIC_LIBRARIES + Qt::Core + PRIVATE_MODULE_INTERFACE + Qt::CorePrivate +) + +set_source_files_properties(qdbusmarshaller.cpp + PROPERTIES HEADER_FILE_ONLY ON) # special case: This file is included by qdbusargument.cpp + +#### Keys ignored in scope 1:.:.:dbus.pro:<TRUE>: +# MODULE_CONFIG = "dbusadaptors" "dbusinterfaces" + +## Scopes: +##################################################################### + +qt_extend_target(DBus CONDITION QT_FEATURE_dbus_linked + DEFINES + QT_LINKED_LIBDBUS + LIBRARIES + dbus-1 +) + +qt_extend_target(DBus CONDITION WIN32 + LIBRARIES + advapi32 + netapi32 + user32 + ws2_32 +) +qt_add_docs(DBus + doc/qtdbus.qdocconf +) + diff --git a/src/dbus/Qt5DBusConfigExtras.cmake.in b/src/dbus/Qt5DBusConfigExtras.cmake.in deleted file mode 100644 index a814678f7b..0000000000 --- a/src/dbus/Qt5DBusConfigExtras.cmake.in +++ /dev/null @@ -1,44 +0,0 @@ - -if (NOT TARGET Qt5::qdbuscpp2xml) - add_executable(Qt5::qdbuscpp2xml IMPORTED) - -!!IF isEmpty(CMAKE_BIN_DIR_IS_ABSOLUTE) - set(imported_location \"${_qt5DBus_install_prefix}/$${CMAKE_BIN_DIR}qdbuscpp2xml$$CMAKE_BIN_SUFFIX\") -!!ELSE - set(imported_location \"$${CMAKE_BIN_DIR}qdbuscpp2xml$$CMAKE_BIN_SUFFIX\") -!!ENDIF - _qt5_DBus_check_file_exists(${imported_location}) - - set_target_properties(Qt5::qdbuscpp2xml PROPERTIES - IMPORTED_LOCATION ${imported_location} - ) -endif() - -if (NOT TARGET Qt5::qdbusxml2cpp) - add_executable(Qt5::qdbusxml2cpp IMPORTED) - -!!IF isEmpty(CMAKE_BIN_DIR_IS_ABSOLUTE) - set(imported_location \"${_qt5DBus_install_prefix}/$${CMAKE_BIN_DIR}qdbusxml2cpp$$CMAKE_BIN_SUFFIX\") -!!ELSE - set(imported_location \"$${CMAKE_BIN_DIR}qdbusxml2cpp$$CMAKE_BIN_SUFFIX\") -!!ENDIF - _qt5_DBus_check_file_exists(${imported_location}) - - set_target_properties(Qt5::qdbusxml2cpp PROPERTIES - IMPORTED_LOCATION ${imported_location} - ) -endif() - -set(Qt5DBus_QDBUSCPP2XML_EXECUTABLE Qt5::qdbuscpp2xml) -set(Qt5DBus_QDBUSXML2CPP_EXECUTABLE Qt5::qdbusxml2cpp) - -# Create versionless tool targets. -foreach(__qt_tool qdbuscpp2xml qdbusxml2cpp) - if(NOT \"${QT_NO_CREATE_VERSIONLESS_TARGETS}\" AND NOT TARGET Qt::${__qt_tool} - AND TARGET Qt5::${__qt_tool}) - add_executable(Qt::${__qt_tool} IMPORTED) - get_target_property(__qt_imported_location Qt5::${__qt_tool} IMPORTED_LOCATION) - set_target_properties(Qt::${__qt_tool} - PROPERTIES IMPORTED_LOCATION \"${__qt_imported_location}\") - endif() -endforeach() diff --git a/src/dbus/Qt5DBusMacros.cmake b/src/dbus/Qt6DBusMacros.cmake index 1cacccdddd..d7bba30148 100644 --- a/src/dbus/Qt5DBusMacros.cmake +++ b/src/dbus/Qt6DBusMacros.cmake @@ -34,7 +34,7 @@ include(MacroAddFileDependencies) include(CMakeParseArguments) -function(qt5_add_dbus_interface _sources _interface _basename) +function(qt6_add_dbus_interface _sources _interface _basename) get_filename_component(_infile ${_interface} ABSOLUTE) set(_header "${CMAKE_CURRENT_BINARY_DIR}/${_basename}.h") set(_impl "${CMAKE_CURRENT_BINARY_DIR}/${_basename}.cpp") @@ -58,12 +58,14 @@ function(qt5_add_dbus_interface _sources _interface _basename) endif() add_custom_command(OUTPUT "${_impl}" "${_header}" - COMMAND ${Qt5DBus_QDBUSXML2CPP_EXECUTABLE} ${_params} -p ${_basename} ${_infile} - DEPENDS ${_infile} VERBATIM) + COMMAND ${QT_CMAKE_EXPORT_NAMESPACE}::qdbusxml2cpp ${_params} -p ${_basename} ${_infile} + DEPENDS ${_infile} ${QT_CMAKE_EXPORT_NAMESPACE}::qdbuscpp2xml + VERBATIM + ) set_source_files_properties("${_impl}" "${_header}" PROPERTIES SKIP_AUTOMOC TRUE) - qt5_generate_moc("${_header}" "${_moc}") + qt6_generate_moc("${_header}" "${_moc}") list(APPEND ${_sources} "${_impl}" "${_header}" "${_moc}") macro_add_file_dependencies("${_impl}" "${_moc}") @@ -82,14 +84,14 @@ if(NOT QT_NO_CREATE_VERSIONLESS_FUNCTIONS) endif() -function(qt5_add_dbus_interfaces _sources) +function(qt6_add_dbus_interfaces _sources) foreach(_current_FILE ${ARGN}) get_filename_component(_infile ${_current_FILE} ABSOLUTE) get_filename_component(_basename ${_current_FILE} NAME) # get the part before the ".xml" suffix string(TOLOWER ${_basename} _basename) string(REGEX REPLACE "(.*\\.)?([^\\.]+)\\.xml" "\\2" _basename ${_basename}) - qt5_add_dbus_interface(${_sources} ${_infile} ${_basename}interface) + qt6_add_dbus_interface(${_sources} ${_infile} ${_basename}interface) endforeach() set(${_sources} ${${_sources}} PARENT_SCOPE) endfunction() @@ -106,7 +108,7 @@ if(NOT QT_NO_CREATE_VERSIONLESS_FUNCTIONS) endif() -function(qt5_generate_dbus_interface _header) # _customName OPTIONS -some -options ) +function(qt6_generate_dbus_interface _header) # _customName OPTIONS -some -options ) set(options) set(oneValueArgs) set(multiValueArgs OPTIONS) @@ -133,8 +135,9 @@ function(qt5_generate_dbus_interface _header) # _customName OPTIONS -some -optio endif() add_custom_command(OUTPUT ${_target} - COMMAND ${Qt5DBus_QDBUSCPP2XML_EXECUTABLE} ${_DBUS_INTERFACE_OPTIONS} ${_in_file} -o ${_target} - DEPENDS ${_in_file} VERBATIM + COMMAND ${QT_CMAKE_EXPORT_NAMESPACE}::qdbuscpp2xml ${_DBUS_INTERFACE_OPTIONS} ${_in_file} -o ${_target} + DEPENDS ${_in_file} ${QT_CMAKE_EXPORT_NAMESPACE}::qdbuscpp2xml + VERBATIM ) endfunction() @@ -149,7 +152,7 @@ if(NOT QT_NO_CREATE_VERSIONLESS_FUNCTIONS) endif() -function(qt5_add_dbus_adaptor _sources _xml_file _include _parentClass) # _optionalBasename _optionalClassName) +function(qt6_add_dbus_adaptor _sources _xml_file _include _parentClass) # _optionalBasename _optionalClassName) get_filename_component(_infile ${_xml_file} ABSOLUTE) set(_optionalBasename "${ARGV4}") @@ -167,17 +170,19 @@ function(qt5_add_dbus_adaptor _sources _xml_file _include _parentClass) # _optio if(_optionalClassName) add_custom_command(OUTPUT "${_impl}" "${_header}" - COMMAND ${Qt5DBus_QDBUSXML2CPP_EXECUTABLE} -m -a ${_basename} -c ${_optionalClassName} -i ${_include} -l ${_parentClass} ${_infile} - DEPENDS ${_infile} VERBATIM + COMMAND ${QT_CMAKE_EXPORT_NAMESPACE}::qdbusxml2cpp -m -a ${_basename} -c ${_optionalClassName} -i ${_include} -l ${_parentClass} ${_infile} + DEPENDS ${_infile} ${QT_CMAKE_EXPORT_NAMESPACE}::qdbuscpp2xml + VERBATIM ) else() add_custom_command(OUTPUT "${_impl}" "${_header}" - COMMAND ${Qt5DBus_QDBUSXML2CPP_EXECUTABLE} -m -a ${_basename} -i ${_include} -l ${_parentClass} ${_infile} - DEPENDS ${_infile} VERBATIM + COMMAND ${QT_CMAKE_EXPORT_NAMESPACE}::qdbusxml2cpp -m -a ${_basename} -i ${_include} -l ${_parentClass} ${_infile} + DEPENDS ${_infile} ${QT_CMAKE_EXPORT_NAMESPACE}::qdbuscpp2xml + VERBATIM ) endif() - qt5_generate_moc("${_header}" "${_moc}") + qt6_generate_moc("${_header}" "${_moc}") set_source_files_properties("${_impl}" "${_header}" PROPERTIES SKIP_AUTOMOC TRUE) macro_add_file_dependencies("${_impl}" "${_moc}") diff --git a/src/dbus/doc/snippets/code/doc_src_qdbusadaptors.cpp b/src/dbus/doc/snippets/code/doc_src_qdbusadaptors.cpp index 0fc7a2b26c..f5d9fe7889 100644 --- a/src/dbus/doc/snippets/code/doc_src_qdbusadaptors.cpp +++ b/src/dbus/doc/snippets/code/doc_src_qdbusadaptors.cpp @@ -62,7 +62,6 @@ QString processRequest(const QString &request, const QDBusMessage &message) data->request = request; message.setDelayedReply(true); data->reply = message.createReply(); - QDBusConnection::sessionBus().send(data->reply); appendRequest(data); return QString(); diff --git a/src/dbus/doc/src/dbus-adaptors.qdoc b/src/dbus/doc/src/dbus-adaptors.qdoc index 9ebf0cedf2..3398a45af7 100644 --- a/src/dbus/doc/src/dbus-adaptors.qdoc +++ b/src/dbus/doc/src/dbus-adaptors.qdoc @@ -174,9 +174,6 @@ \snippet code/doc_src_qdbusadaptors.cpp 10 - The use of - \l{QDBusConnection::send()}{QDBusConnection::sessionBus().send(data->reply)} - is needed to explicitly inform the caller that the response will be delayed. In this case, the return value is unimportant; we return an arbitrary value to satisfy the compiler. diff --git a/src/dbus/qdbusabstractadaptor.cpp b/src/dbus/qdbusabstractadaptor.cpp index bf0e33e26e..671f7f25d0 100644 --- a/src/dbus/qdbusabstractadaptor.cpp +++ b/src/dbus/qdbusabstractadaptor.cpp @@ -276,11 +276,11 @@ void QDBusAdaptorConnector::polish() std::sort(adaptors.begin(), adaptors.end()); } -void QDBusAdaptorConnector::relaySlot(void **argv) +void QDBusAdaptorConnector::relaySlot(QMethodRawArguments argv) { QObject *sndr = sender(); if (Q_LIKELY(sndr)) { - relay(sndr, senderSignalIndex(), argv); + relay(sndr, senderSignalIndex(), argv.arguments); } else { qWarning("QtDBus: cannot relay signals from parent %s(%p \"%s\") unless they are emitted in the object's thread %s(%p \"%s\"). " "Current thread is %s(%p \"%s\").", @@ -333,120 +333,6 @@ void QDBusAdaptorConnector::relay(QObject *senderObj, int lastSignalIdx, void ** emit relaySignal(realObject, senderMetaObject, lastSignalIdx, args); } -// our Meta Object -// modify carefully: this has been hand-edited! -// the relaySlot slot gets called with the void** array - -struct qt_meta_stringdata_QDBusAdaptorConnector_t { - QByteArrayData data[10]; - char stringdata[96]; -}; -#define QT_MOC_LITERAL(idx, ofs, len) \ - Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ - offsetof(qt_meta_stringdata_QDBusAdaptorConnector_t, stringdata) + ofs \ - - idx * sizeof(QByteArrayData) \ - ) -static const qt_meta_stringdata_QDBusAdaptorConnector_t qt_meta_stringdata_QDBusAdaptorConnector = { - { -QT_MOC_LITERAL(0, 0, 21), -QT_MOC_LITERAL(1, 22, 11), -QT_MOC_LITERAL(2, 34, 0), -QT_MOC_LITERAL(3, 35, 3), -QT_MOC_LITERAL(4, 39, 18), -QT_MOC_LITERAL(5, 58, 10), -QT_MOC_LITERAL(6, 69, 3), -QT_MOC_LITERAL(7, 73, 4), -QT_MOC_LITERAL(8, 78, 9), -QT_MOC_LITERAL(9, 88, 6) - }, - "QDBusAdaptorConnector\0relaySignal\0\0" - "obj\0const QMetaObject*\0metaObject\0sid\0" - "args\0relaySlot\0polish\0" -}; -#undef QT_MOC_LITERAL - -static const uint qt_meta_data_QDBusAdaptorConnector[] = { - - // content: - 7, // revision - 0, // classname - 0, 0, // classinfo - 3, 14, // methods - 0, 0, // properties - 0, 0, // enums/sets - 0, 0, // constructors - 0, // flags - 1, // signalCount - - // signals: name, argc, parameters, tag, flags - 1, 4, 29, 2, 0x05, - - // slots: name, argc, parameters, tag, flags - 8, 0, 38, 2, 0x0a, - 9, 0, 39, 2, 0x0a, - - // signals: parameters - QMetaType::Void, QMetaType::QObjectStar, 0x80000000 | 4, QMetaType::Int, QMetaType::QVariantList, 3, 5, 6, 7, - - // slots: parameters - QMetaType::Void, - QMetaType::Void, - - 0 // eod -}; - -void QDBusAdaptorConnector::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) -{ - if (_c == QMetaObject::InvokeMetaMethod) { - Q_ASSERT(staticMetaObject.cast(_o)); - QDBusAdaptorConnector *_t = static_cast<QDBusAdaptorConnector *>(_o); - switch (_id) { - case 0: _t->relaySignal((*reinterpret_cast< QObject*(*)>(_a[1])),(*reinterpret_cast< const QMetaObject*(*)>(_a[2])),(*reinterpret_cast< int(*)>(_a[3])),(*reinterpret_cast< const QVariantList(*)>(_a[4]))); break; - case 1: _t->relaySlot(_a); break; // HAND EDIT: add the _a parameter - case 2: _t->polish(); break; - default: ; - } - } -} - -const QMetaObject QDBusAdaptorConnector::staticMetaObject = { - { &QObject::staticMetaObject, qt_meta_stringdata_QDBusAdaptorConnector.data, - qt_meta_data_QDBusAdaptorConnector, qt_static_metacall, nullptr, nullptr } -}; - -const QMetaObject *QDBusAdaptorConnector::metaObject() const -{ - return &staticMetaObject; -} - -void *QDBusAdaptorConnector::qt_metacast(const char *_clname) -{ - if (!_clname) return nullptr; - if (!strcmp(_clname, qt_meta_stringdata_QDBusAdaptorConnector.stringdata)) - return static_cast<void*>(const_cast< QDBusAdaptorConnector*>(this)); - return QObject::qt_metacast(_clname); -} - -int QDBusAdaptorConnector::qt_metacall(QMetaObject::Call _c, int _id, void **_a) -{ - _id = QObject::qt_metacall(_c, _id, _a); - if (_id < 0) - return _id; - if (_c == QMetaObject::InvokeMetaMethod) { - if (_id < 3) - qt_static_metacall(this, _c, _id, _a); - _id -= 3; - } - return _id; -} - -// SIGNAL 0 -void QDBusAdaptorConnector::relaySignal(QObject * _t1, const QMetaObject * _t2, int _t3, const QVariantList & _t4) -{ - void *_a[] = { nullptr, const_cast<void*>(reinterpret_cast<const void*>(&_t1)), const_cast<void*>(reinterpret_cast<const void*>(&_t2)), const_cast<void*>(reinterpret_cast<const void*>(&_t3)), const_cast<void*>(reinterpret_cast<const void*>(&_t4)) }; - QMetaObject::activate(this, &staticMetaObject, 0, _a); -} - QT_END_NAMESPACE #endif // QT_NO_DBUS diff --git a/src/dbus/qdbusabstractadaptor_p.h b/src/dbus/qdbusabstractadaptor_p.h index 023b3b1be2..404901381b 100644 --- a/src/dbus/qdbusabstractadaptor_p.h +++ b/src/dbus/qdbusabstractadaptor_p.h @@ -92,7 +92,7 @@ public: class QDBusAdaptorConnector: public QObject { - Q_OBJECT_FAKE + Q_OBJECT public: // typedefs struct AdaptorData @@ -118,12 +118,11 @@ public: // methods void disconnectAllSignals(QObject *object); void relay(QObject *sender, int id, void **); -//public slots: - void relaySlot(void **); +public Q_SLOTS: + void relaySlot(QMethodRawArguments a); void polish(); -protected: -//signals: +Q_SIGNALS: void relaySignal(QObject *obj, const QMetaObject *metaObject, int sid, const QVariantList &args); public: // member variables diff --git a/src/dbus/qdbusargument.cpp b/src/dbus/qdbusargument.cpp index 5a0f0f013b..7e1d847982 100644 --- a/src/dbus/qdbusargument.cpp +++ b/src/dbus/qdbusargument.cpp @@ -908,9 +908,10 @@ void QDBusArgument::endArray() \snippet code/src_qdbus_qdbusargument.cpp 7 - If the type you want to marshall is a QMap or QHash, you need not - declare an \c{operator<<} function for it, since Qt D-Bus provides - generic templates to do the job of marshalling the data. + You usually don't need to provide an \c{operator<<} or \c{operator>>} + function for associative containers such as QHash or std::map, + since Qt D-Bus provides generic templates to do the job of marshalling + the data. \sa endMap(), beginStructure(), beginArray(), beginMapEntry() */ diff --git a/src/dbus/qdbusargument.h b/src/dbus/qdbusargument.h index 339f8c5dc8..f388a65bed 100644 --- a/src/dbus/qdbusargument.h +++ b/src/dbus/qdbusargument.h @@ -224,7 +224,8 @@ Q_DBUS_EXPORT const QDBusArgument &operator>>(const QDBusArgument &a, QLineF &li Q_DBUS_EXPORT QDBusArgument &operator<<(QDBusArgument &a, const QLineF &line); #endif -template<template <typename> class Container, typename T> +template<template <typename> class Container, typename T, + typename = typename Container<T>::iterator> inline QDBusArgument &operator<<(QDBusArgument &arg, const Container<T> &list) { int id = qMetaTypeId<T>(); @@ -237,7 +238,8 @@ inline QDBusArgument &operator<<(QDBusArgument &arg, const Container<T> &list) return arg; } -template<template <typename> class Container, typename T> +template<template <typename> class Container, typename T, + typename = typename Container<T>::iterator> inline const QDBusArgument &operator>>(const QDBusArgument &arg, Container<T> &list) { arg.beginArray(); @@ -252,35 +254,6 @@ inline const QDBusArgument &operator>>(const QDBusArgument &arg, Container<T> &l return arg; } -// QList specializations -template<typename T> -inline QDBusArgument &operator<<(QDBusArgument &arg, const QList<T> &list) -{ - int id = qMetaTypeId<T>(); - arg.beginArray(id); - typename QList<T>::ConstIterator it = list.constBegin(); - typename QList<T>::ConstIterator end = list.constEnd(); - for ( ; it != end; ++it) - arg << *it; - arg.endArray(); - return arg; -} - -template<typename T> -inline const QDBusArgument &operator>>(const QDBusArgument &arg, QList<T> &list) -{ - arg.beginArray(); - list.clear(); - while (!arg.atEnd()) { - T item; - arg >> item; - list.push_back(item); - } - arg.endArray(); - - return arg; -} - inline QDBusArgument &operator<<(QDBusArgument &arg, const QVariantList &list) { int id = qMetaTypeId<QDBusVariant>(); @@ -293,15 +266,16 @@ inline QDBusArgument &operator<<(QDBusArgument &arg, const QVariantList &list) return arg; } -// QMap specializations -template<typename Key, typename T> -inline QDBusArgument &operator<<(QDBusArgument &arg, const QMap<Key, T> &map) +// Specializations for associative containers +template <template <typename, typename> class Container, typename Key, typename T, + QtPrivate::IfAssociativeIteratorHasKeyAndValue<typename Container<Key, T>::iterator> = true> +inline QDBusArgument &operator<<(QDBusArgument &arg, const Container<Key, T> &map) { int kid = qMetaTypeId<Key>(); int vid = qMetaTypeId<T>(); arg.beginMap(kid, vid); - typename QMap<Key, T>::ConstIterator it = map.constBegin(); - typename QMap<Key, T>::ConstIterator end = map.constEnd(); + auto it = map.begin(); + auto end = map.end(); for ( ; it != end; ++it) { arg.beginMapEntry(); arg << it.key() << it.value(); @@ -311,8 +285,27 @@ inline QDBusArgument &operator<<(QDBusArgument &arg, const QMap<Key, T> &map) return arg; } -template<typename Key, typename T> -inline const QDBusArgument &operator>>(const QDBusArgument &arg, QMap<Key, T> &map) +template <template <typename, typename> class Container, typename Key, typename T, + QtPrivate::IfAssociativeIteratorHasFirstAndSecond<typename Container<Key, T>::iterator> = true> +inline QDBusArgument &operator<<(QDBusArgument &arg, const Container<Key, T> &map) +{ + int kid = qMetaTypeId<Key>(); + int vid = qMetaTypeId<T>(); + arg.beginMap(kid, vid); + auto it = map.begin(); + auto end = map.end(); + for ( ; it != end; ++it) { + arg.beginMapEntry(); + arg << it->first << it->second; + arg.endMapEntry(); + } + arg.endMap(); + return arg; +} + +template <template <typename, typename> class Container, typename Key, typename T, + typename = typename Container<Key, T>::iterator> +inline const QDBusArgument &operator>>(const QDBusArgument &arg, Container<Key, T> &map) { arg.beginMap(); map.clear(); @@ -321,7 +314,7 @@ inline const QDBusArgument &operator>>(const QDBusArgument &arg, QMap<Key, T> &m T value; arg.beginMapEntry(); arg >> key >> value; - static_cast<QMultiMap<Key, T> &>(map).insert(key, value); + map.insert(key, value); arg.endMapEntry(); } arg.endMap(); @@ -342,41 +335,6 @@ inline QDBusArgument &operator<<(QDBusArgument &arg, const QVariantMap &map) return arg; } -// QHash specializations -template<typename Key, typename T> -inline QDBusArgument &operator<<(QDBusArgument &arg, const QHash<Key, T> &map) -{ - int kid = qMetaTypeId<Key>(); - int vid = qMetaTypeId<T>(); - arg.beginMap(kid, vid); - typename QHash<Key, T>::ConstIterator it = map.constBegin(); - typename QHash<Key, T>::ConstIterator end = map.constEnd(); - for ( ; it != end; ++it) { - arg.beginMapEntry(); - arg << it.key() << it.value(); - arg.endMapEntry(); - } - arg.endMap(); - return arg; -} - -template<typename Key, typename T> -inline const QDBusArgument &operator>>(const QDBusArgument &arg, QHash<Key, T> &map) -{ - arg.beginMap(); - map.clear(); - while (!arg.atEnd()) { - Key key; - T value; - arg.beginMapEntry(); - arg >> key >> value; - static_cast<QMultiHash<Key, T> &>(map).insert(key, value); - arg.endMapEntry(); - } - arg.endMap(); - return arg; -} - inline QDBusArgument &operator<<(QDBusArgument &arg, const QVariantHash &map) { arg.beginMap(QMetaType::QString, qMetaTypeId<QDBusVariant>()); 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 diff --git a/src/dbus/qdbusmetaobject_p.h b/src/dbus/qdbusmetaobject_p.h index 89fccf9046..a4ed3c355c 100644 --- a/src/dbus/qdbusmetaobject_p.h +++ b/src/dbus/qdbusmetaobject_p.h @@ -77,6 +77,7 @@ struct Q_DBUS_EXPORT QDBusMetaObject: public QMetaObject { delete [] reinterpret_cast<const char *>(d.stringdata); delete [] d.data; + delete [] reinterpret_cast<const QMetaType *>(d.metaTypes); } // methods (slots & signals): diff --git a/src/dbus/qdbusmisc.cpp b/src/dbus/qdbusmisc.cpp index 46cf857751..8443246e00 100644 --- a/src/dbus/qdbusmisc.cpp +++ b/src/dbus/qdbusmisc.cpp @@ -153,7 +153,7 @@ int qDBusParametersForMethod(const QList<QByteArray> ¶meterTypes, QVector<in QList<QByteArray>::ConstIterator it = parameterTypes.constBegin(); QList<QByteArray>::ConstIterator end = parameterTypes.constEnd(); for ( ; it != end; ++it) { - const QByteArray &type = *it; + QByteArray type = *it; if (type.endsWith('*')) { errorMsg = QLatin1String("Pointers are not supported: ") + QLatin1String(type); return -1; @@ -180,6 +180,9 @@ int qDBusParametersForMethod(const QList<QByteArray> ¶meterTypes, QVector<in return -1; // not allowed } + if (type.startsWith("QList<")) + type = "QVector<" + type.mid(sizeof("QList<") - 1); + int id = QMetaType::type(type); #ifdef QT_BOOTSTRAPPED // in bootstrap mode QDBusMessage isn't included, thus we need to resolve it manually here |