summaryrefslogtreecommitdiffstats
path: root/src/dbus
diff options
context:
space:
mode:
Diffstat (limited to 'src/dbus')
-rw-r--r--src/dbus/Qt5DBusConfigExtras.cmake.in12
-rw-r--r--src/dbus/Qt5DBusMacros.cmake153
-rw-r--r--src/dbus/qdbus_symbols.cpp15
-rw-r--r--src/dbus/qdbusabstractadaptor.cpp61
-rw-r--r--src/dbus/qdbusabstractadaptor.h2
-rw-r--r--src/dbus/qdbusabstractinterface.cpp12
-rw-r--r--src/dbus/qdbusconnection.h2
-rw-r--r--src/dbus/qdbusconnection_p.h6
-rw-r--r--src/dbus/qdbuserror.cpp24
-rw-r--r--src/dbus/qdbuserror.h9
-rw-r--r--src/dbus/qdbusextratypes.cpp12
-rw-r--r--src/dbus/qdbusextratypes.h43
-rw-r--r--src/dbus/qdbusintegrator.cpp17
-rw-r--r--src/dbus/qdbusinterface.cpp6
-rw-r--r--src/dbus/qdbusmetaobject.cpp206
-rw-r--r--src/dbus/qdbusmetaobject_p.h3
-rw-r--r--src/dbus/qdbusmetatype.cpp30
-rw-r--r--src/dbus/qdbusmisc.cpp25
-rw-r--r--src/dbus/qdbuspendingcall.cpp2
-rw-r--r--src/dbus/qdbuspendingcall.h2
-rw-r--r--src/dbus/qdbuspendingcall_p.h2
-rw-r--r--src/dbus/qdbuspendingreply.h4
-rw-r--r--src/dbus/qdbusreply.cpp2
-rw-r--r--src/dbus/qdbusreply.h2
-rw-r--r--src/dbus/qdbusutil.cpp6
-rw-r--r--src/dbus/qdbusxmlgenerator.cpp10
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> &parameters, 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> &parameterTypes, 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();