@@ -32,19 +32,20 @@ AbstractDBusServiceMonitor::AbstractDBusServiceMonitor(const QString &service, c
32 , m_service(service)
32 , m_service(service)
33 , m_path(path)
33 , m_path(path)
34 , m_interface(interface)
34 , m_interface(interface)
35 , m_watcher(new QDBusServiceWatcher(service,
36 , m_watcher(new QDBusServiceWatcher(service,
36 (bus == SystemBus) ? QDBusConnection::systemBus()
37 (bus == SystemBus) ? QDBusConnection::systemBus()
37 : QDBusConnection::sessionBus()))
38 : QDBusConnection::sessionBus()))
38 , m_dbusInterface(nullptr)
39 , m_dbusInterface(nullptr)
40− connect(m_watcher, &QDBusServiceWatcher::serviceRegistered, this, &AbstractDBusServiceMonitor::createInterface);
41+ connect(m_watcher, &QDBusServiceWatcher::serviceRegistered, this, &AbstractDBusServiceMonitor::onServiceRegistered);
41− connect(m_watcher, &QDBusServiceWatcher::serviceUnregistered, this, &AbstractDBusServiceMonitor::destroyInterface);
42+ connect(m_watcher, &QDBusServiceWatcher::serviceUnregistered, this, &AbstractDBusServiceMonitor::onServiceUnregistered);
43 // Connect to the service if it's up already
44 // Connect to the service if it's up already
44 QDBusConnectionInterface* sessionBus = QDBusConnection::sessionBus().interface();
45 QDBusConnectionInterface* sessionBus = QDBusConnection::sessionBus().interface();
45 QDBusReply<bool> reply = sessionBus->isServiceRegistered(m_service);
46 QDBusReply<bool> reply = sessionBus->isServiceRegistered(m_service);
46 if (reply.isValid() && reply.value()) {
47 if (reply.isValid() && reply.value()) {
47− createInterface(m_service);
48+ onServiceRegistered(m_service);
@@ -54,19 +55,31 @@ AbstractDBusServiceMonitor::~AbstractDBusServiceMonitor()
54 delete m_dbusInterface;
55 delete m_dbusInterface;
57−void AbstractDBusServiceMonitor::createInterface(const QString &)
58+void AbstractDBusServiceMonitor::onServiceRegistered(const QString &)
59 if (m_dbusInterface != nullptr) {
60 if (m_dbusInterface != nullptr) {
60 delete m_dbusInterface;
61 delete m_dbusInterface;
61 m_dbusInterface = nullptr;
62 m_dbusInterface = nullptr;
64− m_dbusInterface = new QDBusInterface(m_service, m_path, m_interface,
65+ m_dbusInterface = createInterface(m_service, m_path, m_interface,
66+ (m_bus == SystemBus) ? QDBusConnection::systemBus()
65− QDBusConnection::sessionBus());
67+ : QDBusConnection::sessionBus());
66 Q_EMIT serviceAvailableChanged(true);
68 Q_EMIT serviceAvailableChanged(true);
72+ * Default implementation creates a QDBusInterface. This performs blocking introspection of the
73+ * service at initialization, which may be undesirable if the service is slow/blocked.
75+QDBusAbstractInterface*
76+AbstractDBusServiceMonitor::createInterface(const QString &service, const QString &path,
77+ const QString &interface, const QDBusConnection &connection)
79+ return new QDBusInterface(service, path, interface, connection);
69−void AbstractDBusServiceMonitor::destroyInterface(const QString &)
82+void AbstractDBusServiceMonitor::onServiceUnregistered(const QString &)
71 if (m_dbusInterface != nullptr) {
84 if (m_dbusInterface != nullptr) {
72 delete m_dbusInterface;
85 delete m_dbusInterface;
@@ -76,7 +89,7 @@ void AbstractDBusServiceMonitor::destroyInterface(const QString &)
76 Q_EMIT serviceAvailableChanged(false);
89 Q_EMIT serviceAvailableChanged(false);
79−QDBusInterface* AbstractDBusServiceMonitor::dbusInterface() const
92+QDBusAbstractInterface* AbstractDBusServiceMonitor::dbusInterface() const
81 return m_dbusInterface;
94 return m_dbusInterface;