diff options
Diffstat (limited to 'src/dbus')
26 files changed, 477 insertions, 191 deletions
diff --git a/src/dbus/Qt5DBusConfigExtras.cmake.in b/src/dbus/Qt5DBusConfigExtras.cmake.in new file mode 100644 index 0000000000..e302307f72 --- /dev/null +++ b/src/dbus/Qt5DBusConfigExtras.cmake.in @@ -0,0 +1,12 @@ + +get_filename_component(_qt5_install_prefix \"${CMAKE_CURRENT_LIST_DIR}/$${CMAKE_RELATIVE_INSTALL_DIR}\" ABSOLUTE) + +!!IF isEmpty(CMAKE_BIN_DIR_IS_ABSOLUTE) +set(QT_DBUSCPP2XML_EXECUTABLE \"${_qt5_install_prefix}/$${CMAKE_BIN_DIR}qdbuscpp2xml$$CMAKE_BIN_SUFFIX\") +set(QT_DBUSXML2CPP_EXECUTABLE \"${_qt5_install_prefix}/$${CMAKE_BIN_DIR}qdbusxml2cpp$$CMAKE_BIN_SUFFIX\") +!!ELSE +set(QT_DBUSCPP2XML_EXECUTABLE \"$${CMAKE_BIN_DIR}qdbuscpp2xml$$CMAKE_BIN_SUFFIX\") +set(QT_DBUSXML2CPP_EXECUTABLE \"$${CMAKE_BIN_DIR}qdbusxml2cpp$$CMAKE_BIN_SUFFIX\") +!!ENDIF + +include(\"${CMAKE_CURRENT_LIST_DIR}/Qt5DBusMacros.cmake\") diff --git a/src/dbus/Qt5DBusMacros.cmake b/src/dbus/Qt5DBusMacros.cmake new file mode 100644 index 0000000000..6617d370a9 --- /dev/null +++ b/src/dbus/Qt5DBusMacros.cmake @@ -0,0 +1,153 @@ +#============================================================================= +# Copyright 2005-2011 Kitware, Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# * Neither the name of Kitware, Inc. nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#============================================================================= + +include(MacroAddFileDependencies) + + +function(QT5_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) + set(_moc ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.moc) + + get_source_file_property(_nonamespace ${_interface} NO_NAMESPACE) + if(_nonamespace) + set(_params -N -m) + else() + set(_params -m) + endif() + + get_source_file_property(_classname ${_interface} CLASSNAME) + if(_classname) + set(_params ${_params} -c ${_classname}) + endif() + + get_source_file_property(_include ${_interface} INCLUDE) + if(_include) + set(_params ${_params} -i ${_include}) + endif() + + add_custom_command(OUTPUT ${_impl} ${_header} + COMMAND ${QT_DBUSXML2CPP_EXECUTABLE} ${_params} -p ${_basename} ${_infile} + DEPENDS ${_infile} VERBATIM) + + set_source_files_properties(${_impl} PROPERTIES SKIP_AUTOMOC TRUE) + + qt5_generate_moc(${_header} ${_moc}) + + list(APPEND ${_sources} ${_impl} ${_header} ${_moc}) + macro_add_file_dependencies(${_impl} ${_moc}) + set(${_sources} ${${_sources}} PARENT_SCOPE) +endfunction() + + +function(QT5_ADD_DBUS_INTERFACES _sources) + foreach(_current_FILE ${ARGN}) + get_filename_component(_infile ${_current_FILE} ABSOLUTE) + # get the part before the ".xml" suffix + string(REGEX REPLACE "(.*[/\\.])?([^\\.]+)\\.xml" "\\2" _basename ${_current_FILE}) + string(TOLOWER ${_basename} _basename) + qt5_add_dbus_interface(${_sources} ${_infile} ${_basename}interface) + endforeach() + set(${_sources} ${${_sources}} PARENT_SCOPE) +endfunction() + + +function(QT5_GENERATE_DBUS_INTERFACE _header) # _customName OPTIONS -some -options ) + set(options) + set(oneValueArgs) + set(multiValueArgs OPTIONS) + + cmake_parse_arguments(_DBUS_INTERFACE "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + + set(_customName ${_DBUS_INTERFACE_UNPARSED_ARGUMENTS}) + set(_qt4_dbus_options ${_DBUS_INTERFACE_OPTIONS}) + + get_filename_component(_in_file ${_header} ABSOLUTE) + get_filename_component(_basename ${_header} NAME_WE) + + if(_customName) + if(IS_ABSOLUTE ${_customName}) + get_filename_component(_containingDir ${_customName} PATH) + if(NOT EXISTS ${_containingDir}) + file(MAKE_DIRECTORY "${_containingDir}") + endif() + set(_target ${_customName}) + else() + set(_target ${CMAKE_CURRENT_BINARY_DIR}/${_customName}) + endif() + else() + set(_target ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.xml) + endif() + + add_custom_command(OUTPUT ${_target} + COMMAND ${QT_DBUSCPP2XML_EXECUTABLE} ${_qt4_dbus_options} ${_in_file} -o ${_target} + DEPENDS ${_in_file} VERBATIM + ) +endfunction() + + +function(QT5_ADD_DBUS_ADAPTOR _sources _xml_file _include _parentClass) # _optionalBasename _optionalClassName) + get_filename_component(_infile ${_xml_file} ABSOLUTE) + + set(_optionalBasename "${ARGV4}") + if(_optionalBasename) + set(_basename ${_optionalBasename} ) + else() + string(REGEX REPLACE "(.*[/\\.])?([^\\.]+)\\.xml" "\\2adaptor" _basename ${_infile}) + string(TOLOWER ${_basename} _basename) + endif() + + set(_optionalClassName "${ARGV5}") + set(_header ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.h) + set(_impl ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.cpp) + set(_moc ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.moc) + + if(_optionalClassName) + add_custom_command(OUTPUT ${_impl} ${_header} + COMMAND ${QT_DBUSXML2CPP_EXECUTABLE} -m -a ${_basename} -c ${_optionalClassName} -i ${_include} -l ${_parentClass} ${_infile} + DEPENDS ${_infile} VERBATIM + ) + else() + add_custom_command(OUTPUT ${_impl} ${_header} + COMMAND ${QT_DBUSXML2CPP_EXECUTABLE} -m -a ${_basename} -i ${_include} -l ${_parentClass} ${_infile} + DEPENDS ${_infile} VERBATIM + ) + endif() + + qt5_generate_moc(${_header} ${_moc}) + set_source_files_properties(${_impl} PROPERTIES SKIP_AUTOMOC TRUE) + macro_add_file_dependencies(${_impl} ${_moc}) + + list(APPEND ${_sources} ${_impl} ${_header} ${_moc}) + set(${_sources} ${${_sources}} PARENT_SCOPE) +endfunction() diff --git a/src/dbus/qdbus_symbols.cpp b/src/dbus/qdbus_symbols.cpp index 7f4d8e7f33..9e3bd5c5d6 100644 --- a/src/dbus/qdbus_symbols.cpp +++ b/src/dbus/qdbus_symbols.cpp @@ -52,6 +52,7 @@ void (*qdbus_resolve_me(const char *name))(); #if !defined QT_LINKED_LIBDBUS +#ifndef QT_BOOTSTRAPPED static QLibrary *qdbus_libdbus = 0; void qdbus_unloadLibDBus() @@ -59,9 +60,11 @@ void qdbus_unloadLibDBus() delete qdbus_libdbus; qdbus_libdbus = 0; } +#endif bool qdbus_loadLibDBus() { +#ifndef QT_BOOTSTRAPPED #ifdef QT_BUILD_INTERNAL // this is to simulate a library load failure for our autotest suite. if (!qgetenv("QT_SIMULATE_DBUS_LIBFAIL").isEmpty()) @@ -93,17 +96,23 @@ bool qdbus_loadLibDBus() delete lib; lib = 0; return false; +#else + return true; +#endif } +#ifndef QT_BOOTSTRAPPED void (*qdbus_resolve_conditionally(const char *name))() { if (qdbus_loadLibDBus()) return qdbus_libdbus->resolve(name); return 0; } +#endif void (*qdbus_resolve_me(const char *name))() { +#ifndef QT_BOOTSTRAPPED if (!qdbus_loadLibDBus()) qFatal("Cannot find libdbus-1 in your system to resolve symbol '%s'.", name); @@ -112,9 +121,15 @@ void (*qdbus_resolve_me(const char *name))() qFatal("Cannot resolve '%s' in your libdbus-1.", name); return ptr; +#else + Q_UNUSED(name); + return 0; +#endif } +#ifndef QT_BOOTSTRAPPED Q_DESTRUCTOR_FUNCTION(qdbus_unloadLibDBus) +#endif #endif // QT_LINKED_LIBDBUS diff --git a/src/dbus/qdbusabstractadaptor.cpp b/src/dbus/qdbusabstractadaptor.cpp index 7bdd947a37..bacf93bac8 100644 --- a/src/dbus/qdbusabstractadaptor.cpp +++ b/src/dbus/qdbusabstractadaptor.cpp @@ -181,7 +181,7 @@ void QDBusAbstractAdaptor::setAutoRelaySignals(bool enable) continue; // try to connect/disconnect to a signal on the parent that has the same method signature - QByteArray sig = QMetaObject::normalizedSignature(mm.signature()); + QByteArray sig = QMetaObject::normalizedSignature(mm.methodSignature().constData()); if (them->indexOfSignal(sig) == -1) continue; sig.prepend(QSIGNAL_CODE + '0'); @@ -307,7 +307,7 @@ void QDBusAdaptorConnector::relay(QObject *senderObj, int lastSignalIdx, void ** // invalid signal signature // qDBusParametersForMethod has not yet complained about this one qWarning("QDBusAbstractAdaptor: Cannot relay signal %s::%s", - senderMetaObject->className(), mm.signature()); + senderMetaObject->className(), mm.methodSignature().constData()); return; } @@ -323,10 +323,38 @@ void QDBusAdaptorConnector::relay(QObject *senderObj, int lastSignalIdx, void ** // 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_REFCOUNT_INITIALIZE_STATIC, len, 0, 0, \ + 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: - 6, // revision + 7, // revision 0, // classname 0, 0, // classinfo 3, 14, // methods @@ -336,20 +364,21 @@ static const uint qt_meta_data_QDBusAdaptorConnector[] = { 0, // flags 1, // signalCount - // signals: signature, parameters, type, tag, flags - 47, 23, 22, 22, 0x05, + // signals: name, argc, parameters, tag, flags + 1, 4, 29, 2, 0x05, - // slots: signature, parameters, type, tag, flags - 105, 22, 22, 22, 0x0a, - 117, 22, 22, 22, 0x0a, + // slots: name, argc, parameters, tag, flags + 8, 0, 38, 2, 0x0a, + 9, 0, 39, 2, 0x0a, - 0 // eod -}; + // signals: parameters + QMetaType::Void, QMetaType::QObjectStar, 0x80000000 | 4, QMetaType::Int, QMetaType::QVariantList, 3, 5, 6, 7, -static const char qt_meta_stringdata_QDBusAdaptorConnector[] = { - "QDBusAdaptorConnector\0\0obj,metaObject,sid,args\0" - "relaySignal(QObject*,const QMetaObject*,int,QVariantList)\0" - "relaySlot()\0polish()\0" + // slots: parameters + QMetaType::Void, + QMetaType::Void, + + 0 // eod }; void QDBusAdaptorConnector::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) @@ -371,7 +400,7 @@ const QMetaObjectExtraData QDBusAdaptorConnector::staticMetaObjectExtraData = { }; const QMetaObject QDBusAdaptorConnector::staticMetaObject = { - { &QObject::staticMetaObject, qt_meta_stringdata_QDBusAdaptorConnector, + { &QObject::staticMetaObject, qt_meta_stringdata_QDBusAdaptorConnector.data, qt_meta_data_QDBusAdaptorConnector, &staticMetaObjectExtraData } }; @@ -383,7 +412,7 @@ const QMetaObject *QDBusAdaptorConnector::metaObject() const void *QDBusAdaptorConnector::qt_metacast(const char *_clname) { if (!_clname) return 0; - if (!strcmp(_clname, qt_meta_stringdata_QDBusAdaptorConnector)) + if (!strcmp(_clname, qt_meta_stringdata_QDBusAdaptorConnector.stringdata)) return static_cast<void*>(const_cast< QDBusAdaptorConnector*>(this)); return QObject::qt_metacast(_clname); } diff --git a/src/dbus/qdbusabstractadaptor.h b/src/dbus/qdbusabstractadaptor.h index 75a3876b1b..bb12c74823 100644 --- a/src/dbus/qdbusabstractadaptor.h +++ b/src/dbus/qdbusabstractadaptor.h @@ -57,7 +57,7 @@ class Q_DBUS_EXPORT QDBusAbstractAdaptor: public QObject { Q_OBJECT protected: - QDBusAbstractAdaptor(QObject *parent); + explicit QDBusAbstractAdaptor(QObject *parent); public: ~QDBusAbstractAdaptor(); diff --git a/src/dbus/qdbusabstractinterface.cpp b/src/dbus/qdbusabstractinterface.cpp index eeaf0b13eb..79c607e6b4 100644 --- a/src/dbus/qdbusabstractinterface.cpp +++ b/src/dbus/qdbusabstractinterface.cpp @@ -148,7 +148,7 @@ void QDBusAbstractInterfacePrivate::property(const QMetaProperty &mp, QVariant & QDBusMessage reply = connection.call(msg, QDBus::Block, timeout); if (reply.type() != QDBusMessage::ReplyMessage) { - lastError = reply; + lastError = QDBusError(reply); where.clear(); return; } @@ -214,7 +214,7 @@ bool QDBusAbstractInterfacePrivate::setProperty(const QMetaProperty &mp, const Q QDBusMessage reply = connection.call(msg, QDBus::Block, timeout); if (reply.type() != QDBusMessage::ReplyMessage) { - lastError = reply; + lastError = QDBusError(reply); return false; } return true; @@ -442,11 +442,11 @@ QDBusMessage QDBusAbstractInterface::callWithArgumentList(QDBus::CallMode mode, // determine if this a sync or async call mode = QDBus::Block; const QMetaObject *mo = metaObject(); - QByteArray match = m.toLatin1() + '('; + QByteArray match = m.toLatin1(); for (int i = staticMetaObject.methodCount(); i < mo->methodCount(); ++i) { QMetaMethod mm = mo->method(i); - if (QByteArray(mm.signature()).startsWith(match)) { + if (mm.name() == match) { // found a method with the same name as what we're looking for // hopefully, nobody is overloading asynchronous and synchronous methods with // the same name @@ -467,7 +467,7 @@ QDBusMessage QDBusAbstractInterface::callWithArgumentList(QDBus::CallMode mode, QDBusMessage reply = d->connection.call(msg, mode, d->timeout); if (thread() == QThread::currentThread()) - d->lastError = reply; // will clear if reply isn't an error + d->lastError = QDBusError(reply); // will clear if reply isn't an error // ensure that there is at least one element if (reply.arguments().isEmpty()) @@ -540,7 +540,7 @@ bool QDBusAbstractInterface::callWithCallback(const QString &method, QDBusMessagePrivate::setParametersValidated(msg, true); msg.setArguments(args); - d->lastError = 0; + d->lastError = QDBusError(); return d->connection.callWithCallback(msg, receiver, returnMethod, diff --git a/src/dbus/qdbusconnection.h b/src/dbus/qdbusconnection.h index ad620fd7a6..8dd2622f7c 100644 --- a/src/dbus/qdbusconnection.h +++ b/src/dbus/qdbusconnection.h @@ -127,7 +127,7 @@ public: }; Q_DECLARE_FLAGS(ConnectionCapabilities, ConnectionCapability) - QDBusConnection(const QString &name); + explicit QDBusConnection(const QString &name); QDBusConnection(const QDBusConnection &other); ~QDBusConnection(); diff --git a/src/dbus/qdbusconnection_p.h b/src/dbus/qdbusconnection_p.h index 41a1341e40..caeb116b31 100644 --- a/src/dbus/qdbusconnection_p.h +++ b/src/dbus/qdbusconnection_p.h @@ -88,6 +88,8 @@ class QDBusAbstractInterface; class QDBusConnectionInterface; class QDBusPendingCallPrivate; +#ifndef QT_BOOTSTRAPPED + class QDBusErrorInternal { mutable DBusError error; @@ -336,7 +338,10 @@ public: // in qdbusmisc.cpp extern int qDBusParametersForMethod(const QMetaMethod &mm, QList<int>& metaTypes); +#endif // QT_BOOTSTRAPPED +extern int qDBusParametersForMethod(const QList<QByteArray> ¶meters, QList<int>& metaTypes); extern bool qDBusCheckAsyncTag(const char *tag); +#ifndef QT_BOOTSTRAPPED extern bool qDBusInterfaceInObject(QObject *obj, const QString &interface_name); extern QString qDBusInterfaceFromMetaObject(const QMetaObject *mo); @@ -348,6 +353,7 @@ extern QDBusMessage qDBusPropertySet(const QDBusConnectionPrivate::ObjectTreeNod const QDBusMessage &msg); extern QDBusMessage qDBusPropertyGetAll(const QDBusConnectionPrivate::ObjectTreeNode &node, const QDBusMessage &msg); +#endif // QT_BOOTSTRAPPED QT_END_NAMESPACE diff --git a/src/dbus/qdbuserror.cpp b/src/dbus/qdbuserror.cpp index 9db279e005..713ef75a93 100644 --- a/src/dbus/qdbuserror.cpp +++ b/src/dbus/qdbuserror.cpp @@ -44,9 +44,11 @@ #include <qdebug.h> #include <qvarlengtharray.h> +#ifndef QT_BOOTSTRAPPED #include "qdbus_symbols_p.h" #include "qdbusmessage.h" #include "qdbusmessage_p.h" +#endif #ifndef QT_NO_DBUS @@ -239,6 +241,7 @@ static inline QDBusError::ErrorType get(const char *name) \value UnknownObject The remote object could not be found. */ +#ifndef QT_BOOTSTRAPPED /*! \internal Constructs a QDBusError from a DBusError structure. @@ -268,6 +271,7 @@ QDBusError::QDBusError(const QDBusMessage &qdmsg) nm = qdmsg.errorName(); msg = qdmsg.errorMessage(); } +#endif /*! \internal @@ -302,6 +306,26 @@ QDBusError &QDBusError::operator=(const QDBusError &other) return *this; } +#ifndef QT_BOOTSTRAPPED +/*! + \internal + Assignment operator from a QDBusMessage +*/ +QDBusError &QDBusError::operator=(const QDBusMessage &qdmsg) +{ + if (qdmsg.type() == QDBusMessage::ErrorMessage) { + code = ::get(qdmsg.errorName().toUtf8().constData()); + nm = qdmsg.errorName(); + msg = qdmsg.errorMessage(); + } else { + code =NoError; + nm.clear(); + msg.clear(); + } + return *this; +} +#endif + /*! Returns this error's ErrorType. diff --git a/src/dbus/qdbuserror.h b/src/dbus/qdbuserror.h index 0cea8e2cde..b73ad34db1 100644 --- a/src/dbus/qdbuserror.h +++ b/src/dbus/qdbuserror.h @@ -93,11 +93,16 @@ public: #endif }; - QDBusError(const DBusError *error = 0); - QDBusError(const QDBusMessage& msg); +#ifndef QT_BOOTSTRAPPED + explicit QDBusError(const DBusError *error = 0); + /*implicit*/ QDBusError(const QDBusMessage& msg); +#endif QDBusError(ErrorType error, const QString &message); QDBusError(const QDBusError &other); QDBusError &operator=(const QDBusError &other); +#ifndef QT_BOOTSTRAPPED + QDBusError &operator=(const QDBusMessage &msg); +#endif ErrorType type() const; QString name() const; diff --git a/src/dbus/qdbusextratypes.cpp b/src/dbus/qdbusextratypes.cpp index fca3a8db6e..4438e3c65f 100644 --- a/src/dbus/qdbusextratypes.cpp +++ b/src/dbus/qdbusextratypes.cpp @@ -48,17 +48,17 @@ QT_BEGIN_NAMESPACE void QDBusObjectPath::doCheck() { - if (!QDBusUtil::isValidObjectPath(*this)) { - qWarning("QDBusObjectPath: invalid path \"%s\"", qPrintable(*this)); - clear(); + if (!QDBusUtil::isValidObjectPath(m_path)) { + qWarning("QDBusObjectPath: invalid path \"%s\"", qPrintable(m_path)); + m_path.clear(); } } void QDBusSignature::doCheck() { - if (!QDBusUtil::isValidSignature(*this)) { - qWarning("QDBusSignature: invalid signature \"%s\"", qPrintable(*this)); - clear(); + if (!QDBusUtil::isValidSignature(m_signature)) { + qWarning("QDBusSignature: invalid signature \"%s\"", qPrintable(m_signature)); + m_signature.clear(); } } diff --git a/src/dbus/qdbusextratypes.h b/src/dbus/qdbusextratypes.h index c4e843422d..a905cff590 100644 --- a/src/dbus/qdbusextratypes.h +++ b/src/dbus/qdbusextratypes.h @@ -58,42 +58,39 @@ QT_BEGIN_NAMESPACE // defined in qhash.cpp Q_CORE_EXPORT uint qHash(const QString &key); -class Q_DBUS_EXPORT QDBusObjectPath : private QString +class Q_DBUS_EXPORT QDBusObjectPath { + QString m_path; public: inline QDBusObjectPath() { } inline explicit QDBusObjectPath(const char *path); inline explicit QDBusObjectPath(const QLatin1String &path); inline explicit QDBusObjectPath(const QString &path); - inline QDBusObjectPath &operator=(const QDBusObjectPath &path); inline void setPath(const QString &path); inline QString path() const - { return *this; } + { return m_path; } private: void doCheck(); }; inline QDBusObjectPath::QDBusObjectPath(const char *objectPath) - : QString(QString::fromLatin1(objectPath)) + : m_path(QString::fromLatin1(objectPath)) { doCheck(); } inline QDBusObjectPath::QDBusObjectPath(const QLatin1String &objectPath) - : QString(objectPath) + : m_path(objectPath) { doCheck(); } inline QDBusObjectPath::QDBusObjectPath(const QString &objectPath) - : QString(objectPath) + : m_path(objectPath) { doCheck(); } -inline QDBusObjectPath &QDBusObjectPath::operator=(const QDBusObjectPath &_path) -{ QString::operator=(_path); doCheck(); return *this; } - inline void QDBusObjectPath::setPath(const QString &objectPath) -{ QString::operator=(objectPath); doCheck(); } +{ m_path = objectPath; doCheck(); } inline bool operator==(const QDBusObjectPath &lhs, const QDBusObjectPath &rhs) { return lhs.path() == rhs.path(); } @@ -108,42 +105,39 @@ inline uint qHash(const QDBusObjectPath &objectPath) { return qHash(objectPath.path()); } -class Q_DBUS_EXPORT QDBusSignature : private QString +class Q_DBUS_EXPORT QDBusSignature { + QString m_signature; public: inline QDBusSignature() { } inline explicit QDBusSignature(const char *signature); inline explicit QDBusSignature(const QLatin1String &signature); inline explicit QDBusSignature(const QString &signature); - inline QDBusSignature &operator=(const QDBusSignature &signature); inline void setSignature(const QString &signature); inline QString signature() const - { return *this; } + { return m_signature; } private: void doCheck(); }; inline QDBusSignature::QDBusSignature(const char *dBusSignature) - : QString(QString::fromAscii(dBusSignature)) + : m_signature(QString::fromAscii(dBusSignature)) { doCheck(); } inline QDBusSignature::QDBusSignature(const QLatin1String &dBusSignature) - : QString(dBusSignature) + : m_signature(dBusSignature) { doCheck(); } inline QDBusSignature::QDBusSignature(const QString &dBusSignature) - : QString(dBusSignature) + : m_signature(dBusSignature) { doCheck(); } -inline QDBusSignature &QDBusSignature::operator=(const QDBusSignature &dbusSignature) -{ QString::operator=(dbusSignature); doCheck(); return *this; } - inline void QDBusSignature::setSignature(const QString &dBusSignature) -{ QString::operator=(dBusSignature); doCheck(); } +{ m_signature = dBusSignature; doCheck(); } inline bool operator==(const QDBusSignature &lhs, const QDBusSignature &rhs) { return lhs.signature() == rhs.signature(); } @@ -157,8 +151,9 @@ inline bool operator<(const QDBusSignature &lhs, const QDBusSignature &rhs) inline uint qHash(const QDBusSignature &signature) { return qHash(signature.signature()); } -class QDBusVariant : private QVariant +class QDBusVariant { + QVariant m_variant; public: inline QDBusVariant() { } inline explicit QDBusVariant(const QVariant &variant); @@ -166,14 +161,14 @@ public: inline void setVariant(const QVariant &variant); inline QVariant variant() const - { return *this; } + { return m_variant; } }; inline QDBusVariant::QDBusVariant(const QVariant &dBusVariant) - : QVariant(dBusVariant) { } + : m_variant(dBusVariant) { } inline void QDBusVariant::setVariant(const QVariant &dBusVariant) -{ QVariant::operator=(dBusVariant); } +{ m_variant = dBusVariant; } inline bool operator==(const QDBusVariant &v1, const QDBusVariant &v2) { return v1.variant() == v2.variant(); } diff --git a/src/dbus/qdbusintegrator.cpp b/src/dbus/qdbusintegrator.cpp index f0c8224be2..c36c1efb71 100644 --- a/src/dbus/qdbusintegrator.cpp +++ b/src/dbus/qdbusintegrator.cpp @@ -640,12 +640,10 @@ static int findSlot(const QMetaObject *mo, const QByteArray &name, int flags, continue; // check name: - QByteArray slotname = mm.signature(); - int paren = slotname.indexOf('('); - if (paren != name.length() || !slotname.startsWith(name)) + if (mm.name() != name) continue; - int returnType = QMetaType::type(mm.typeName()); + int returnType = mm.returnType(); bool isAsync = qDBusCheckAsyncTag(mm.tag()); bool isScriptable = mm.attributes() & QMetaMethod::Scriptable; @@ -686,7 +684,7 @@ static int findSlot(const QMetaObject *mo, const QByteArray &name, int flags, ++i; // make sure that the output parameters have signatures too - if (returnType != 0 && QDBusMetaType::typeToSignature(returnType) == 0) + if (returnType != QMetaType::UnknownType && returnType != QMetaType::Void && QDBusMetaType::typeToSignature(returnType) == 0) continue; bool ok = true; @@ -919,7 +917,7 @@ void QDBusConnectionPrivate::deliverCall(QObject *object, int /*flags*/, const Q // output arguments QVariantList outputArgs; void *null = 0; - if (metaTypes[0] != QMetaType::Void) { + if (metaTypes[0] != QMetaType::Void && metaTypes[0] != QMetaType::UnknownType) { QVariant arg(metaTypes[0], null); outputArgs.append( arg ); params[0] = const_cast<void*>(outputArgs.at( outputArgs.count() - 1 ).constData()); @@ -1188,8 +1186,7 @@ void QDBusConnectionPrivate::relaySignal(QObject *obj, const QMetaObject *mo, in QString interface = qDBusInterfaceFromMetaObject(mo); QMetaMethod mm = mo->method(signalId); - QByteArray memberName = mm.signature(); - memberName.truncate(memberName.indexOf('(')); + QByteArray memberName = mm.name(); // check if it's scriptable bool isScriptable = mm.attributes() & QMetaMethod::Scriptable; @@ -1928,7 +1925,7 @@ QDBusMessage QDBusConnectionPrivate::sendWithReply(const QDBusMessage &message, } QDBusMessage reply = pcall->replyMessage; - lastError = reply; // set or clear error + lastError = QDBusError(reply); // set or clear error delete pcall; return reply; @@ -2368,7 +2365,7 @@ QDBusConnectionPrivate::findMetaObject(const QString &service, const QString &pa // fetch the XML description xml = reply.arguments().at(0).toString(); } else { - error = reply; + error = QDBusError(reply); lastError = error; if (reply.type() != QDBusMessage::ErrorMessage || error.type() != QDBusError::UnknownMethod) return 0; // error diff --git a/src/dbus/qdbusinterface.cpp b/src/dbus/qdbusinterface.cpp index d390f395ee..f6a84b9980 100644 --- a/src/dbus/qdbusinterface.cpp +++ b/src/dbus/qdbusinterface.cpp @@ -280,7 +280,7 @@ int QDBusInterfacePrivate::metacall(QMetaObject::Call c, int id, void **argv) } else if (mm.methodType() == QMetaMethod::Slot || mm.methodType() == QMetaMethod::Method) { // method call relay from Qt world to D-Bus world // get D-Bus equivalent signature - QString methodName = QLatin1String(metaObject->dbusNameForMethod(id)); + QString methodName = QString::fromLatin1(mm.name()); const int *inputTypes = metaObject->inputTypesForMethod(id); int inputTypesCount = *inputTypes; @@ -300,7 +300,7 @@ int QDBusInterfacePrivate::metacall(QMetaObject::Call c, int id, void **argv) const int *outputTypes = metaObject->outputTypesForMethod(id); int outputTypesCount = *outputTypes++; - if (*mm.typeName()) { + if (mm.returnType() != QMetaType::UnknownType && mm.returnType() != QMetaType::Void) { // this method has a return type if (argv[0] && it != args.constEnd()) copyArgument(argv[0], *outputTypes++, *it); @@ -316,7 +316,7 @@ int QDBusInterfacePrivate::metacall(QMetaObject::Call c, int id, void **argv) } // done - lastError = reply; + lastError = QDBusError(reply); return -1; } } diff --git a/src/dbus/qdbusmetaobject.cpp b/src/dbus/qdbusmetaobject.cpp index bd7b83bf65..a6e5f96eca 100644 --- a/src/dbus/qdbusmetaobject.cpp +++ b/src/dbus/qdbusmetaobject.cpp @@ -54,6 +54,7 @@ #include "qdbusabstractinterface_p.h" #include <private/qmetaobject_p.h> +#include <private/qmetaobjectbuilder_p.h> #ifndef QT_NO_DBUS @@ -69,8 +70,7 @@ public: private: struct Method { - QByteArray parameters; - QByteArray typeName; + QList<QByteArray> parameterNames; QByteArray tag; QByteArray name; QVarLengthArray<int, 4> inputTypes; @@ -103,10 +103,12 @@ private: void parseMethods(); void parseSignals(); void parseProperties(); + + static int aggregateParameterCount(const QMap<QByteArray, Method> &map); }; static const int intsPerProperty = 2; -static const int intsPerMethod = 3; +static const int intsPerMethod = 2; struct QDBusMetaObjectPrivate : public QMetaObjectPrivate { @@ -132,6 +134,30 @@ QDBusMetaObjectGenerator::findType(const QByteArray &signature, const QDBusIntrospection::Annotations &annotations, const char *direction, int id) { + struct QDBusRawTypeHandler { + static void destroy(void *) + { + qFatal("Cannot destroy placeholder type QDBusRawType"); + } + + static void *create(const void *) + { + qFatal("Cannot create placeholder type QDBusRawType"); + return 0; + } + + static void destruct(void *) + { + qFatal("Cannot destruct placeholder type QDBusRawType"); + } + + static void *construct(void *, const void *) + { + qFatal("Cannot construct placeholder type QDBusRawType"); + return 0; + } + }; + Type result; result.id = QVariant::Invalid; @@ -157,8 +183,14 @@ QDBusMetaObjectGenerator::findType(const QByteArray &signature, if (type == QVariant::Invalid || signature != QDBusMetaType::typeToSignature(type)) { // type is still unknown or doesn't match back to the signature that it // was expected to, so synthesize a fake type - type = QMetaType::VoidStar; typeName = "QDBusRawType<0x" + signature.toHex() + ">*"; + type = QMetaType::registerType(typeName, QDBusRawTypeHandler::destroy, + QDBusRawTypeHandler::create, + QDBusRawTypeHandler::destruct, + QDBusRawTypeHandler::construct, + sizeof(void *), + QMetaType::MovableType, + 0); } result.name = typeName; @@ -215,8 +247,7 @@ void QDBusMetaObjectGenerator::parseMethods() mm.inputTypes.append(type.id); - mm.parameters.append(arg.name.toLatin1()); - mm.parameters.append(','); + mm.parameterNames.append(arg.name.toLatin1()); prototype.append(type.name); prototype.append(','); @@ -235,13 +266,9 @@ void QDBusMetaObjectGenerator::parseMethods() mm.outputTypes.append(type.id); - if (i == 0) { - // return value - mm.typeName = type.name; - } else { + if (i != 0) { // non-const ref parameter - mm.parameters.append(arg.name.toLatin1()); - mm.parameters.append(','); + mm.parameterNames.append(arg.name.toLatin1()); prototype.append(type.name); prototype.append("&,"); @@ -250,12 +277,10 @@ void QDBusMetaObjectGenerator::parseMethods() if (!ok) continue; // convert the last commas: - if (!mm.parameters.isEmpty()) { - mm.parameters.truncate(mm.parameters.length() - 1); + if (!mm.parameterNames.isEmpty()) prototype[prototype.length() - 1] = ')'; - } else { + else prototype.append(')'); - } // check the async tag if (m.annotations.value(QLatin1String(ANNOTATION_NO_WAIT)) == QLatin1String("true")) @@ -295,8 +320,7 @@ void QDBusMetaObjectGenerator::parseSignals() mm.inputTypes.append(type.id); - mm.parameters.append(arg.name.toLatin1()); - mm.parameters.append(','); + mm.parameterNames.append(arg.name.toLatin1()); prototype.append(type.name); prototype.append(','); @@ -304,12 +328,10 @@ void QDBusMetaObjectGenerator::parseSignals() if (!ok) continue; // convert the last commas: - if (!mm.parameters.isEmpty()) { - mm.parameters.truncate(mm.parameters.length() - 1); + if (!mm.parameterNames.isEmpty()) prototype[prototype.length() - 1] = ')'; - } else { + else prototype.append(')'); - } // meta method flags mm.flags = AccessProtected | MethodSignal | MethodScriptable; @@ -342,49 +364,27 @@ void QDBusMetaObjectGenerator::parseProperties() if (p.access != QDBusIntrospection::Property::Read) mp.flags |= Writable; - if (mp.typeName == "QDBusVariant") - mp.flags |= QMetaType::QVariant << 24; - else if (mp.type < 0xff) - // encode the type in the flags - mp.flags |= mp.type << 24; - // add the property: properties.insert(name, mp); } } -void QDBusMetaObjectGenerator::write(QDBusMetaObject *obj) +// Returns the sum of all parameters (including return type) for the given +// \a map of methods. This is needed for calculating the size of the methods' +// parameter type/name meta-data. +int QDBusMetaObjectGenerator::aggregateParameterCount(const QMap<QByteArray, Method> &map) { - class MetaStringTable - { - public: - typedef QHash<QByteArray, int> Entries; // string --> offset mapping - typedef Entries::const_iterator const_iterator; - Entries::const_iterator constBegin() const - { return m_entries.constBegin(); } - Entries::const_iterator constEnd() const - { return m_entries.constEnd(); } - - MetaStringTable() : m_offset(0) {} - - int enter(const QByteArray &value) - { - Entries::iterator it = m_entries.find(value); - if (it != m_entries.end()) - return it.value(); - int pos = m_offset; - m_entries.insert(value, pos); - m_offset += value.size() + 1; - return pos; - } - - int arraySize() const { return m_offset; } - - private: - Entries m_entries; - int m_offset; - }; + int sum = 0; + QMap<QByteArray, Method>::const_iterator it; + for (it = map.constBegin(); it != map.constEnd(); ++it) { + const Method &m = it.value(); + sum += m.inputTypes.size() + qMax(1, m.outputTypes.size()); + } + return sum; +} +void QDBusMetaObjectGenerator::write(QDBusMetaObject *obj) +{ // this code here is mostly copied from qaxbase.cpp // with a few modifications to make it cleaner @@ -396,8 +396,14 @@ void QDBusMetaObjectGenerator::write(QDBusMetaObject *obj) QVarLengthArray<int> idata; idata.resize(sizeof(QDBusMetaObjectPrivate) / sizeof(int)); + int methodParametersDataSize = + ((aggregateParameterCount(signals_) + + aggregateParameterCount(methods)) * 2) // types and parameter names + - signals_.count() // return "parameters" don't have names + - methods.count(); // ditto + QDBusMetaObjectPrivate *header = reinterpret_cast<QDBusMetaObjectPrivate *>(idata.data()); - Q_STATIC_ASSERT_X(QMetaObjectPrivate::OutputRevision == 6, "QtDBus meta-object generator should generate the same version as moc"); + Q_STATIC_ASSERT_X(QMetaObjectPrivate::OutputRevision == 7, "QtDBus meta-object generator should generate the same version as moc"); header->revision = QMetaObjectPrivate::OutputRevision; header->className = 0; header->classInfoCount = 0; @@ -405,7 +411,7 @@ void QDBusMetaObjectGenerator::write(QDBusMetaObject *obj) header->methodCount = signals_.count() + methods.count(); header->methodData = idata.size(); header->propertyCount = properties.count(); - header->propertyData = header->methodData + header->methodCount * 5; + header->propertyData = header->methodData + header->methodCount * 5 + methodParametersDataSize; header->enumeratorCount = 0; header->enumeratorData = 0; header->constructorCount = 0; @@ -417,7 +423,7 @@ void QDBusMetaObjectGenerator::write(QDBusMetaObject *obj) header->methodDBusData = header->propertyDBusData + header->propertyCount * intsPerProperty; int data_size = idata.size() + - (header->methodCount * (5+intsPerMethod)) + + (header->methodCount * (5+intsPerMethod)) + methodParametersDataSize + (header->propertyCount * (3+intsPerProperty)); foreach (const Method &mm, signals_) data_size += 2 + mm.inputTypes.count() + mm.outputTypes.count(); @@ -425,10 +431,11 @@ void QDBusMetaObjectGenerator::write(QDBusMetaObject *obj) data_size += 2 + mm.inputTypes.count() + mm.outputTypes.count(); idata.resize(data_size + 1); - MetaStringTable strings; + QMetaStringTable strings; strings.enter(className.toLatin1()); int offset = header->methodData; + int parametersOffset = offset + header->methodCount * 5; int signatureOffset = header->methodDBusData; int typeidOffset = header->methodDBusData + header->methodCount * intsPerMethod; idata[typeidOffset++] = 0; // eod @@ -439,16 +446,45 @@ void QDBusMetaObjectGenerator::write(QDBusMetaObject *obj) QMap<QByteArray, Method> &map = (x == 0) ? signals_ : methods; for (QMap<QByteArray, Method>::ConstIterator it = map.constBegin(); it != map.constEnd(); ++it) { - // form "prototype\0parameters\0typeName\0tag\0methodname\0" const Method &mm = it.value(); - idata[offset++] = strings.enter(it.key()); // prototype - idata[offset++] = strings.enter(mm.parameters); - idata[offset++] = strings.enter(mm.typeName); + int argc = mm.inputTypes.size() + qMax(0, mm.outputTypes.size() - 1); + + idata[offset++] = strings.enter(mm.name); + idata[offset++] = argc; + idata[offset++] = parametersOffset; idata[offset++] = strings.enter(mm.tag); idata[offset++] = mm.flags; - idata[signatureOffset++] = strings.enter(mm.name); + // Parameter types + for (int i = -1; i < argc; ++i) { + int type; + QByteArray typeName; + if (i < 0) { // Return type + if (!mm.outputTypes.isEmpty()) + type = mm.outputTypes.first(); + else + type = QMetaType::Void; + } else if (i < mm.inputTypes.size()) { + type = mm.inputTypes.at(i); + } else { + Q_ASSERT(mm.outputTypes.size() > 1); + type = mm.outputTypes.at(i - mm.inputTypes.size() + 1); + // Output parameters are references; type id not available + typeName = QMetaType::typeName(type); + typeName.append('&'); + } + Q_ASSERT(type != QMetaType::UnknownType); + int typeInfo; + if (!typeName.isEmpty()) + typeInfo = IsUnresolvedType | strings.enter(typeName); + else + typeInfo = type; + idata[parametersOffset++] = typeInfo; + } + // Parameter names + for (int i = 0; i < argc; ++i) + idata[parametersOffset++] = strings.enter(mm.parameterNames.at(i)); idata[signatureOffset++] = typeidOffset; idata[typeidOffset++] = mm.inputTypes.count(); @@ -462,9 +498,12 @@ void QDBusMetaObjectGenerator::write(QDBusMetaObject *obj) } } - Q_ASSERT(offset == header->propertyData); + Q_ASSERT(offset == header->methodData + header->methodCount * 5); + Q_ASSERT(parametersOffset = header->propertyData); Q_ASSERT(signatureOffset == header->methodDBusData + header->methodCount * intsPerMethod); Q_ASSERT(typeidOffset == idata.size()); + offset += methodParametersDataSize; + Q_ASSERT(offset == header->propertyData); // add each property signatureOffset = header->propertyDBusData; @@ -472,9 +511,10 @@ void QDBusMetaObjectGenerator::write(QDBusMetaObject *obj) it != properties.constEnd(); ++it) { const Property &mp = it.value(); - // form is "name\0typeName\0signature\0" + // form is name, typeinfo, flags idata[offset++] = strings.enter(it.key()); // name - idata[offset++] = strings.enter(mp.typeName); + Q_ASSERT(mp.type != QMetaType::UnknownType); + idata[offset++] = mp.type; idata[offset++] = mp.flags; idata[signatureOffset++] = strings.enter(mp.signature); @@ -484,14 +524,8 @@ void QDBusMetaObjectGenerator::write(QDBusMetaObject *obj) Q_ASSERT(offset == header->propertyDBusData); Q_ASSERT(signatureOffset == header->methodDBusData); - char *string_data = new char[strings.arraySize()]; - { - MetaStringTable::const_iterator it; - for (it = strings.constBegin(); it != strings.constEnd(); ++it) { - memcpy(string_data + it.value(), it.key().constData(), it.key().size()); - string_data[it.value() + it.key().size()] = '\0'; - } - } + char *string_data = new char[strings.blobSize()]; + strings.writeBlob(string_data); uint *uint_data = new uint[idata.size()]; memcpy(uint_data, idata.data(), idata.size() * sizeof(int)); @@ -499,7 +533,7 @@ void QDBusMetaObjectGenerator::write(QDBusMetaObject *obj) // put the metaobject together obj->d.data = uint_data; obj->d.extradata = 0; - obj->d.stringdata = string_data; + obj->d.stringdata = reinterpret_cast<const QByteArrayData *>(string_data); obj->d.superdata = &QDBusAbstractInterface::staticMetaObject; } @@ -613,22 +647,12 @@ static inline const QDBusMetaObjectPrivate *priv(const uint* data) return reinterpret_cast<const QDBusMetaObjectPrivate *>(data); } -const char *QDBusMetaObject::dbusNameForMethod(int id) const -{ - //id -= methodOffset(); - if (id >= 0 && id < priv(d.data)->methodCount) { - int handle = priv(d.data)->methodDBusData + id*intsPerMethod; - return d.stringdata + d.data[handle]; - } - return 0; -} - const int *QDBusMetaObject::inputTypesForMethod(int id) const { //id -= methodOffset(); if (id >= 0 && id < priv(d.data)->methodCount) { int handle = priv(d.data)->methodDBusData + id*intsPerMethod; - return reinterpret_cast<const int*>(d.data + d.data[handle + 1]); + return reinterpret_cast<const int*>(d.data + d.data[handle]); } return 0; } @@ -638,7 +662,7 @@ const int *QDBusMetaObject::outputTypesForMethod(int id) const //id -= methodOffset(); if (id >= 0 && id < priv(d.data)->methodCount) { int handle = priv(d.data)->methodDBusData + id*intsPerMethod; - return reinterpret_cast<const int*>(d.data + d.data[handle + 2]); + return reinterpret_cast<const int*>(d.data + d.data[handle + 1]); } return 0; } diff --git a/src/dbus/qdbusmetaobject_p.h b/src/dbus/qdbusmetaobject_p.h index 7a8de41fa0..98d6105c72 100644 --- a/src/dbus/qdbusmetaobject_p.h +++ b/src/dbus/qdbusmetaobject_p.h @@ -71,12 +71,11 @@ struct Q_DBUS_EXPORT QDBusMetaObject: public QMetaObject QDBusError &error); ~QDBusMetaObject() { - delete [] d.stringdata; + delete [] reinterpret_cast<const char *>(d.stringdata); delete [] d.data; } // methods (slots & signals): - const char *dbusNameForMethod(int id) const; const int *inputTypesForMethod(int id) const; const int *outputTypesForMethod(int id) const; diff --git a/src/dbus/qdbusmetatype.cpp b/src/dbus/qdbusmetatype.cpp index b0d640608a..0359b4da35 100644 --- a/src/dbus/qdbusmetatype.cpp +++ b/src/dbus/qdbusmetatype.cpp @@ -49,11 +49,13 @@ #include <qreadwritelock.h> #include <qvector.h> -#include "qdbusmessage.h" -#include "qdbusunixfiledescriptor.h" -#include "qdbusutil_p.h" #include "qdbusmetatype_p.h" #include "qdbusargument_p.h" +#include "qdbusutil_p.h" +#include "qdbusunixfiledescriptor.h" +#ifndef QT_BOOTSTRAPPED +#include "qdbusmessage.h" +#endif #ifndef QT_NO_DBUS @@ -76,7 +78,7 @@ QT_BEGIN_NAMESPACE class QDBusCustomTypeInfo { public: - QDBusCustomTypeInfo() : signature(0, '\0'), marshall(0), demarshall(0) + QDBusCustomTypeInfo() : signature(), marshall(0), demarshall(0) { } // Suggestion: @@ -111,13 +113,15 @@ void QDBusMetaTypeId::init() // reentrancy is not a problem since everything else is locked on their own // set the guard variable at the end if (!initialized) { +#ifndef QT_BOOTSTRAPPED // register our types with QtCore message = qRegisterMetaType<QDBusMessage>("QDBusMessage"); + error = qRegisterMetaType<QDBusError>("QDBusError"); +#endif argument = qRegisterMetaType<QDBusArgument>("QDBusArgument"); variant = qRegisterMetaType<QDBusVariant>("QDBusVariant"); objectpath = qRegisterMetaType<QDBusObjectPath>("QDBusObjectPath"); signature = qRegisterMetaType<QDBusSignature>("QDBusSignature"); - error = qRegisterMetaType<QDBusError>("QDBusError"); unixfd = qRegisterMetaType<QDBusUnixFileDescriptor>("QDBusUnixFileDescriptor"); #ifndef QDBUS_NO_SPECIALTYPES @@ -150,6 +154,11 @@ void QDBusMetaTypeId::init() qDBusRegisterMetaType<QList<QDBusUnixFileDescriptor> >(); #endif +#if QT_BOOTSTRAPPED + const int lastId = qDBusRegisterMetaType<QList<QDBusUnixFileDescriptor> >(); + message = lastId + 1; + error = lastId + 2; +#endif initialized = true; } } @@ -290,9 +299,14 @@ bool QDBusMetaType::demarshall(const QDBusArgument &arg, int id, void *data) } else df = info.demarshall; } - +#ifndef QT_BOOTSTRAPPED QDBusArgument copy = arg; df(copy, data); +#else + Q_UNUSED(arg); + Q_UNUSED(data); + Q_UNUSED(df); +#endif return true; } @@ -311,7 +325,7 @@ bool QDBusMetaType::demarshall(const QDBusArgument &arg, int id, void *data) int QDBusMetaType::signatureToType(const char *signature) { if (!signature) - return QVariant::Invalid; + return QMetaType::UnknownType; QDBusMetaTypeId::init(); switch (signature[0]) @@ -378,7 +392,7 @@ int QDBusMetaType::signatureToType(const char *signature) } // fall through default: - return QVariant::Invalid; + return QMetaType::UnknownType; } } diff --git a/src/dbus/qdbusmisc.cpp b/src/dbus/qdbusmisc.cpp index 7d68bf1185..fa9b74199e 100644 --- a/src/dbus/qdbusmisc.cpp +++ b/src/dbus/qdbusmisc.cpp @@ -41,14 +41,16 @@ #include <string.h> +#ifndef QT_BOOTSTRAPPED #include <QtCore/qcoreapplication.h> #include <QtCore/qvariant.h> #include <QtCore/qmetaobject.h> #include "qdbusutil_p.h" #include "qdbusconnection_p.h" -#include "qdbusmetatype_p.h" #include "qdbusabstractadaptor_p.h" // for QCLASSINFO_DBUS_* +#endif +#include "qdbusmetatype_p.h" #ifndef QT_NO_DBUS @@ -69,6 +71,8 @@ bool qDBusCheckAsyncTag(const char *tag) return false; } +#ifndef QT_BOOTSTRAPPED + QString qDBusInterfaceFromMetaObject(const QMetaObject *mo) { QString interface; @@ -128,9 +132,14 @@ bool qDBusInterfaceInObject(QObject *obj, const QString &interface_name) // sig must be the normalised signature for the method int qDBusParametersForMethod(const QMetaMethod &mm, QList<int>& metaTypes) { - QDBusMetaTypeId::init(); + return qDBusParametersForMethod(mm.parameterTypes(), metaTypes); +} + +#endif // QT_BOOTSTRAPPED - QList<QByteArray> parameterTypes = mm.parameterTypes(); +int qDBusParametersForMethod(const QList<QByteArray> ¶meterTypes, QList<int>& metaTypes) +{ + QDBusMetaTypeId::init(); metaTypes.clear(); metaTypes.append(0); // return type @@ -141,7 +150,7 @@ int qDBusParametersForMethod(const QMetaMethod &mm, QList<int>& metaTypes) for ( ; it != end; ++it) { const QByteArray &type = *it; if (type.endsWith('*')) { - //qWarning("Could not parse the method '%s'", mm.signature()); + //qWarning("Could not parse the method '%s'", mm.methodSignature().constData()); // pointer? return -1; } @@ -152,7 +161,7 @@ int qDBusParametersForMethod(const QMetaMethod &mm, QList<int>& metaTypes) int id = QMetaType::type(basictype); if (id == 0) { - //qWarning("Could not parse the method '%s'", mm.signature()); + //qWarning("Could not parse the method '%s'", mm.methodSignature().constData()); // invalid type in method parameter list return -1; } else if (QDBusMetaType::typeToSignature(id) == 0) @@ -164,14 +173,14 @@ int qDBusParametersForMethod(const QMetaMethod &mm, QList<int>& metaTypes) } if (seenMessage) { // && !type.endsWith('&') - //qWarning("Could not parse the method '%s'", mm.signature()); + //qWarning("Could not parse the method '%s'", mm.methodSignature().constData()); // non-output parameters after message or after output params return -1; // not allowed } int id = QMetaType::type(type); - if (id == 0) { - //qWarning("Could not parse the method '%s'", mm.signature()); + if (id == QMetaType::UnknownType) { + //qWarning("Could not parse the method '%s'", mm.methodSignature().constData()); // invalid type in method parameter list return -1; } diff --git a/src/dbus/qdbuspendingcall.cpp b/src/dbus/qdbuspendingcall.cpp index 65d4b5533b..bb1bb76801 100644 --- a/src/dbus/qdbuspendingcall.cpp +++ b/src/dbus/qdbuspendingcall.cpp @@ -377,7 +377,7 @@ QDBusError QDBusPendingCall::error() const { if (d) { QMutexLocker locker(&d->mutex); - return d->replyMessage; + return QDBusError(d->replyMessage); } // not connected, return an error diff --git a/src/dbus/qdbuspendingcall.h b/src/dbus/qdbuspendingcall.h index 6dfdef59d0..8655435501 100644 --- a/src/dbus/qdbuspendingcall.h +++ b/src/dbus/qdbuspendingcall.h @@ -99,7 +99,7 @@ class Q_DBUS_EXPORT QDBusPendingCallWatcher: public QObject, public QDBusPending { Q_OBJECT public: - QDBusPendingCallWatcher(const QDBusPendingCall &call, QObject *parent = 0); + explicit QDBusPendingCallWatcher(const QDBusPendingCall &call, QObject *parent = 0); ~QDBusPendingCallWatcher(); #ifdef Q_QDOC diff --git a/src/dbus/qdbuspendingcall_p.h b/src/dbus/qdbuspendingcall_p.h index 2aaae7b494..eb0d9b6a11 100644 --- a/src/dbus/qdbuspendingcall_p.h +++ b/src/dbus/qdbuspendingcall_p.h @@ -125,7 +125,7 @@ public: if (replyMessage.type() == QDBusMessage::ReplyMessage) emit reply(replyMessage); else - emit error(replyMessage, sentMessage); + emit error(QDBusError(replyMessage), sentMessage); emit finished(); } diff --git a/src/dbus/qdbuspendingreply.h b/src/dbus/qdbuspendingreply.h index ce8354deb3..0cdec7346d 100644 --- a/src/dbus/qdbuspendingreply.h +++ b/src/dbus/qdbuspendingreply.h @@ -132,9 +132,9 @@ public: inline QDBusPendingReply(const QDBusPendingReply &other) : QDBusPendingReplyData(other) { } - inline QDBusPendingReply(const QDBusPendingCall &call) + inline /*implicit*/ QDBusPendingReply(const QDBusPendingCall &call) // required by qdbusxml2cpp-generated code { *this = call; } - inline QDBusPendingReply(const QDBusMessage &message) + inline /*implicit*/ QDBusPendingReply(const QDBusMessage &message) { *this = message; } inline QDBusPendingReply &operator=(const QDBusPendingReply &other) { assign(other); return *this; } diff --git a/src/dbus/qdbusreply.cpp b/src/dbus/qdbusreply.cpp index 098fe7f4bb..c891874d98 100644 --- a/src/dbus/qdbusreply.cpp +++ b/src/dbus/qdbusreply.cpp @@ -186,7 +186,7 @@ QT_BEGIN_NAMESPACE */ void qDBusReplyFill(const QDBusMessage &reply, QDBusError &error, QVariant &data) { - error = reply; + error = QDBusError(reply); if (error.isValid()) { data = QVariant(); // clear it diff --git a/src/dbus/qdbusreply.h b/src/dbus/qdbusreply.h index a3170f7d54..8d40dd41d3 100644 --- a/src/dbus/qdbusreply.h +++ b/src/dbus/qdbusreply.h @@ -152,7 +152,7 @@ public: } inline QDBusReply& operator=(const QDBusMessage &reply) { - m_error = reply; + m_error = QDBusError(reply); return *this; } inline QDBusReply(const QDBusError &dbusError = QDBusError()) diff --git a/src/dbus/qdbusutil.cpp b/src/dbus/qdbusutil.cpp index bed07692b8..00141bb1cc 100644 --- a/src/dbus/qdbusutil.cpp +++ b/src/dbus/qdbusutil.cpp @@ -76,6 +76,7 @@ static inline bool isValidNumber(QChar c) return (u >= '0' && u <= '9'); } +#ifndef QT_BOOTSTRAPPED static bool argToString(const QDBusArgument &arg, QString &out); static bool variantToString(const QVariant &arg, QString &out) @@ -237,6 +238,7 @@ bool argToString(const QDBusArgument &busArg, QString &out) return true; } +#endif //------- D-Bus Types -------- static const char oneLetterTypes[] = "vsogybnqiuxtdh"; @@ -319,7 +321,11 @@ namespace QDBusUtil { QString out; +#ifndef QT_BOOTSTRAPPED variantToString(arg, out); +#else + Q_UNUSED(arg); +#endif return out; } diff --git a/src/dbus/qdbusxmlgenerator.cpp b/src/dbus/qdbusxmlgenerator.cpp index a6572b2c86..a158600f42 100644 --- a/src/dbus/qdbusxmlgenerator.cpp +++ b/src/dbus/qdbusxmlgenerator.cpp @@ -126,8 +126,6 @@ static QString generateInterfaceXml(const QMetaObject *mo, int flags, int method // now add methods: for (int i = methodOffset; i < mo->methodCount(); ++i) { QMetaMethod mm = mo->method(i); - QByteArray signature = mm.signature(); - int paren = signature.indexOf('('); bool isSignal; if (mm.methodType() == QMetaMethod::Signal) @@ -147,11 +145,11 @@ static QString generateInterfaceXml(const QMetaObject *mo, int flags, int method QString xml = QString::fromLatin1(" <%1 name=\"%2\">\n") .arg(isSignal ? QLatin1String("signal") : QLatin1String("method")) - .arg(QLatin1String(signature.left(paren))); + .arg(QString::fromLatin1(mm.name())); // check the return type first - int typeId = QMetaType::type(mm.typeName()); - if (typeId) { + int typeId = mm.returnType(); + if (typeId != QMetaType::UnknownType && typeId != QMetaType::Void) { const char *typeName = QDBusMetaType::typeToSignature(typeId); if (typeName) { xml += QString::fromLatin1(" <arg type=\"%1\" direction=\"out\"/>\n") @@ -164,7 +162,7 @@ static QString generateInterfaceXml(const QMetaObject *mo, int flags, int method } else continue; } - else if (*mm.typeName()) + else if (typeId == QMetaType::UnknownType) continue; // wasn't a valid type QList<QByteArray> names = mm.parameterNames(); |