diff options
Diffstat (limited to 'src/dbus/qdbusabstractinterface.cpp')
-rw-r--r-- | src/dbus/qdbusabstractinterface.cpp | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/src/dbus/qdbusabstractinterface.cpp b/src/dbus/qdbusabstractinterface.cpp index 2a8681d1d7..53def1beb6 100644 --- a/src/dbus/qdbusabstractinterface.cpp +++ b/src/dbus/qdbusabstractinterface.cpp @@ -513,7 +513,7 @@ QDBusPendingCall QDBusAbstractInterface::asyncCallWithArgumentList(const QString not indicate that the executed call succeeded. If it fails, the \a errorMethod is called. If the queueing failed, this function returns false and no slot will be called. - + The \a returnMethod must have as its parameters the types returned by the function call. Optionally, it may have a QDBusMessage parameter as its last or only parameter. The \a errorMethod must @@ -609,9 +609,22 @@ void QDBusAbstractInterface::disconnectNotify(const QMetaMethod &signal) return; QDBusConnectionPrivate *conn = d->connectionPrivate(); - if (conn) - conn->disconnectRelay(d->service, d->path, d->interface, - this, signal); + if (conn && signal.isValid() && !isSignalConnected(signal)) + return conn->disconnectRelay(d->service, d->path, d->interface, + this, signal); + if (!conn) + return; + + // wildcard disconnecting, we need to figure out which of our signals are + // no longer connected to anything + const QMetaObject *mo = metaObject(); + int midx = QObject::staticMetaObject.methodCount(); + const int end = mo->methodCount(); + for ( ; midx < end; ++midx) { + QMetaMethod mm = mo->method(midx); + if (mm.methodType() == QMetaMethod::Signal && !isSignalConnected(mm)) + conn->disconnectRelay(d->service, d->path, d->interface, this, mm); + } } /*! |