summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/dbus/qdbusservicewatcher.cpp25
-rw-r--r--src/dbus/qdbusservicewatcher.h3
-rw-r--r--tests/auto/dbus/qdbusservicewatcher/tst_qdbusservicewatcher.cpp41
3 files changed, 63 insertions, 6 deletions
diff --git a/src/dbus/qdbusservicewatcher.cpp b/src/dbus/qdbusservicewatcher.cpp
index 58204831e6..bd2c4fdcc8 100644
--- a/src/dbus/qdbusservicewatcher.cpp
+++ b/src/dbus/qdbusservicewatcher.cpp
@@ -43,6 +43,7 @@
#include <QStringList>
+#include <private/qproperty_p.h>
#include <private/qobject_p.h>
#include <private/qdbusconnection_p.h>
@@ -61,7 +62,12 @@ public:
QStringList servicesWatched;
QDBusConnection connection;
- QDBusServiceWatcher::WatchMode watchMode;
+ void setWatchModeForwardToQ(QDBusServiceWatcher::WatchMode mode)
+ {
+ q_func()->setWatchMode(mode);
+ }
+ Q_OBJECT_COMPAT_PROPERTY(QDBusServiceWatcherPrivate, QDBusServiceWatcher::WatchMode, watchMode,
+ &QDBusServiceWatcherPrivate::setWatchModeForwardToQ)
void _q_serviceOwnerChanged(const QString &, const QString &, const QString &);
void setConnection(const QStringList &services, const QDBusConnection &c, QDBusServiceWatcher::WatchMode watchMode);
@@ -80,7 +86,9 @@ void QDBusServiceWatcherPrivate::_q_serviceOwnerChanged(const QString &service,
emit q->serviceUnregistered(service);
}
-void QDBusServiceWatcherPrivate::setConnection(const QStringList &s, const QDBusConnection &c, QDBusServiceWatcher::WatchMode wm)
+void QDBusServiceWatcherPrivate::setConnection(const QStringList &services,
+ const QDBusConnection &c,
+ QDBusServiceWatcher::WatchMode wm)
{
if (connection.isConnected()) {
// remove older rules
@@ -89,8 +97,8 @@ void QDBusServiceWatcherPrivate::setConnection(const QStringList &s, const QDBus
}
connection = c;
- watchMode = wm;
- servicesWatched = s;
+ watchMode.setValueBypassingBindings(wm); // caller has to call notify()
+ servicesWatched = services;
if (connection.isConnected()) {
// add new rules
@@ -318,12 +326,19 @@ QDBusServiceWatcher::WatchMode QDBusServiceWatcher::watchMode() const
return d_func()->watchMode;
}
+QBindable<QDBusServiceWatcher::WatchMode> QDBusServiceWatcher::bindableWatchMode()
+{
+ return &d_func()->watchMode;
+}
+
void QDBusServiceWatcher::setWatchMode(WatchMode mode)
{
Q_D(QDBusServiceWatcher);
- if (mode == d->watchMode)
+ d->watchMode.removeBindingUnlessInWrapper();
+ if (mode == d->watchMode.value())
return;
d->setConnection(d->servicesWatched, d->connection, mode);
+ d->watchMode.notify();
}
/*!
diff --git a/src/dbus/qdbusservicewatcher.h b/src/dbus/qdbusservicewatcher.h
index 2c45c85cb9..b9d0679c3a 100644
--- a/src/dbus/qdbusservicewatcher.h
+++ b/src/dbus/qdbusservicewatcher.h
@@ -54,7 +54,7 @@ class Q_DBUS_EXPORT QDBusServiceWatcher: public QObject
{
Q_OBJECT
Q_PROPERTY(QStringList watchedServices READ watchedServices WRITE setWatchedServices)
- Q_PROPERTY(WatchMode watchMode READ watchMode WRITE setWatchMode)
+ Q_PROPERTY(WatchMode watchMode READ watchMode WRITE setWatchMode BINDABLE bindableWatchMode)
public:
enum WatchModeFlag {
WatchForRegistration = 0x01,
@@ -76,6 +76,7 @@ public:
WatchMode watchMode() const;
void setWatchMode(WatchMode mode);
+ QBindable<WatchMode> bindableWatchMode();
QDBusConnection connection() const;
void setConnection(const QDBusConnection &connection);
diff --git a/tests/auto/dbus/qdbusservicewatcher/tst_qdbusservicewatcher.cpp b/tests/auto/dbus/qdbusservicewatcher/tst_qdbusservicewatcher.cpp
index d2c3a830ca..f19091a9a3 100644
--- a/tests/auto/dbus/qdbusservicewatcher/tst_qdbusservicewatcher.cpp
+++ b/tests/auto/dbus/qdbusservicewatcher/tst_qdbusservicewatcher.cpp
@@ -54,6 +54,7 @@ private slots:
void disconnectedConnection();
void setConnection_data();
void setConnection();
+ void bindings();
private:
QString generateServiceName();
@@ -428,5 +429,45 @@ void tst_QDBusServiceWatcher::setConnection()
QCOMPARE(spyU.at(0).at(0).toString(), watchedName);
}
+void tst_QDBusServiceWatcher::bindings()
+{
+ QString serviceName("normal");
+
+ QDBusConnection con("");
+ QVERIFY(!con.isConnected());
+
+ QDBusServiceWatcher watcher(serviceName, con, QDBusServiceWatcher::WatchForRegistration);
+ QProperty<QDBusServiceWatcher::WatchMode> follower;
+ int notificationCounter = 0;
+ auto connection = follower.subscribe([&]() { notificationCounter++; });
+ QCOMPARE(notificationCounter, 1);
+ follower.setBinding([&]() { return watcher.watchMode(); });
+ QCOMPARE(follower.value(), QDBusServiceWatcher::WatchForRegistration);
+ QCOMPARE(notificationCounter, 2);
+
+ watcher.setWatchMode(QDBusServiceWatcher::WatchForUnregistration);
+ QCOMPARE(follower.value(), QDBusServiceWatcher::WatchForUnregistration);
+ QCOMPARE(notificationCounter, 3);
+
+ QProperty<QDBusServiceWatcher::WatchMode> leader(QDBusServiceWatcher::WatchForRegistration);
+ watcher.bindableWatchMode().setBinding([&]() { return leader.value(); });
+ QCOMPARE(follower.value(), QDBusServiceWatcher::WatchForRegistration);
+ QCOMPARE(notificationCounter, 4);
+
+ leader = QDBusServiceWatcher::WatchForUnregistration;
+ QCOMPARE(follower.value(), QDBusServiceWatcher::WatchForUnregistration);
+ QCOMPARE(notificationCounter, 5);
+
+ // check that setting a value breaks the binding
+ watcher.setWatchMode(QDBusServiceWatcher::WatchForUnregistration);
+ QCOMPARE(notificationCounter, 5);
+ leader = QDBusServiceWatcher::WatchForRegistration;
+ QCOMPARE(follower.value(), QDBusServiceWatcher::WatchForUnregistration);
+
+ // check that setting the same value again does not trigger notification
+ watcher.setWatchMode(QDBusServiceWatcher::WatchForUnregistration);
+ QCOMPARE(notificationCounter, 5);
+}
+
QTEST_MAIN(tst_QDBusServiceWatcher)
#include "tst_qdbusservicewatcher.moc"