diff --git a/src/manager.cpp b/src/manager.cpp --- a/src/manager.cpp +++ b/src/manager.cpp @@ -54,27 +54,31 @@ #include "nmdebug.h" +#define DBUS_OBJECT_MANAGER "org.freedesktop.DBus.ObjectManager" #define DBUS_PROPERTIES "org.freedesktop.DBus.Properties" #ifdef NMQT_STATIC const QString NetworkManager::NetworkManagerPrivate::DBUS_SERVICE(QString::fromLatin1("org.kde.fakenetwork")); const QString NetworkManager::NetworkManagerPrivate::DBUS_DAEMON_PATH(QString::fromLatin1("/org/kde/fakenetwork")); +const QString NetworkManager::NetworkManagerPrivate::DBUS_DAEMON_INTERFACE(QString::fromLatin1("org.kde.fakenetwork")); const QString NetworkManager::NetworkManagerPrivate::DBUS_SETTINGS_PATH(QString::fromLatin1("/org/kde/fakenetwork/Settings")); #else const QString NetworkManager::NetworkManagerPrivate::DBUS_SERVICE(QString::fromLatin1(NM_DBUS_SERVICE)); const QString NetworkManager::NetworkManagerPrivate::DBUS_DAEMON_PATH(QString::fromLatin1(NM_DBUS_PATH)); +const QString NetworkManager::NetworkManagerPrivate::DBUS_DAEMON_INTERFACE(QString::fromLatin1(NM_DBUS_INTERFACE)); const QString NetworkManager::NetworkManagerPrivate::DBUS_SETTINGS_PATH(QString::fromLatin1(NM_DBUS_PATH_SETTINGS)); #endif const QString NetworkManager::NetworkManagerPrivate::FDO_DBUS_PROPERTIES(QString::fromLatin1(DBUS_PROPERTIES)); +const QString NetworkManager::NetworkManagerPrivate::FDO_DBUS_OBJECT_MANAGER(QString::fromLatin1(DBUS_OBJECT_MANAGER)); Q_GLOBAL_STATIC(NetworkManager::NetworkManagerPrivate, globalNetworkManager) NetworkManager::NetworkManagerPrivate::NetworkManagerPrivate() #ifdef NMQT_STATIC - : watcher(DBUS_SERVICE, QDBusConnection::sessionBus(), QDBusServiceWatcher::WatchForOwnerChange, this) + : watcher(DBUS_SERVICE, QDBusConnection::sessionBus(), QDBusServiceWatcher::WatchForUnregistration, this) , iface(NetworkManager::NetworkManagerPrivate::DBUS_SERVICE, NetworkManager::NetworkManagerPrivate::DBUS_DAEMON_PATH, QDBusConnection::sessionBus()) #else - : watcher(DBUS_SERVICE, QDBusConnection::systemBus(), QDBusServiceWatcher::WatchForOwnerChange, this) + : watcher(DBUS_SERVICE, QDBusConnection::systemBus(), QDBusServiceWatcher::WatchForUnregistration, this) , iface(NetworkManager::NetworkManagerPrivate::DBUS_SERVICE, NetworkManager::NetworkManagerPrivate::DBUS_DAEMON_PATH, QDBusConnection::systemBus()) #endif , nmState(NetworkManager::Unknown) @@ -98,15 +102,14 @@ #ifndef NMQT_STATIC QDBusConnection::systemBus().connect(NetworkManagerPrivate::DBUS_SERVICE, NetworkManagerPrivate::DBUS_DAEMON_PATH, NetworkManagerPrivate::FDO_DBUS_PROPERTIES, QLatin1String("PropertiesChanged"), this, SLOT(dbusPropertiesChanged(QString,QVariantMap,QStringList))); -#endif - -#ifdef NMQT_STATIC +#else connect(&iface, &OrgFreedesktopNetworkManagerInterface::PropertiesChanged, this, &NetworkManagerPrivate::propertiesChanged); #endif - connect(&watcher, &QDBusServiceWatcher::serviceRegistered, - this, &NetworkManagerPrivate::daemonRegistered); + iface.connection().connect(NetworkManagerPrivate::DBUS_SERVICE, "/org/freedesktop", NetworkManagerPrivate::FDO_DBUS_OBJECT_MANAGER, + QLatin1String("InterfacesAdded"), this, SLOT(dbusInterfacesAdded(QDBusObjectPath,QVariantMap))); + connect(&watcher, &QDBusServiceWatcher::serviceUnregistered, this, &NetworkManagerPrivate::daemonUnregistered); @@ -878,8 +881,13 @@ return status; } -void NetworkManager::NetworkManagerPrivate::daemonRegistered() +void NetworkManager::NetworkManagerPrivate::interfacesAdded(const QDBusObjectPath &path, const QVariantMap &addedInterfaces) { + Q_UNUSED(path); + + if(!addedInterfaces.contains(NetworkManagerPrivate::DBUS_DAEMON_INTERFACE)) + return; + init(); Q_EMIT serviceAppeared(); } diff --git a/src/manager_p.h b/src/manager_p.h --- a/src/manager_p.h +++ b/src/manager_p.h @@ -42,9 +42,11 @@ Q_OBJECT public: static const QString DBUS_SERVICE; + static const QString DBUS_DAEMON_INTERFACE; static const QString DBUS_DAEMON_PATH; static const QString DBUS_SETTINGS_PATH; static const QString FDO_DBUS_PROPERTIES; + static const QString FDO_DBUS_OBJECT_MANAGER; // Functions useful also for other classes static QVariantMap retrieveInitialProperties(const QString &interfaceName, const QString &path); @@ -129,7 +131,7 @@ void onDeviceRemoved(const QDBusObjectPath &state); void dbusPropertiesChanged(const QString &interfaceName, const QVariantMap &properties, const QStringList &invalidatedProperties); void propertiesChanged(const QVariantMap &changedProperties); - void daemonRegistered(); + void interfacesAdded(const QDBusObjectPath &path, const QVariantMap &addedInterfaces); void daemonUnregistered(); private: void connectivityChanged(uint connectivity); diff --git a/src/secretagent.h b/src/secretagent.h --- a/src/secretagent.h +++ b/src/secretagent.h @@ -132,6 +132,7 @@ private: Q_DECLARE_PRIVATE(SecretAgent) Q_PRIVATE_SLOT(d_func(), void registerAgent()) + Q_PRIVATE_SLOT(d_func(), void dbusInterfacesAdded(const QDBusObjectPath &path, const QVariantMap &interfaces)) SecretAgentPrivate *const d_ptr; }; diff --git a/src/secretagent.cpp b/src/secretagent.cpp --- a/src/secretagent.cpp +++ b/src/secretagent.cpp @@ -40,19 +40,19 @@ , agent(parent) #ifdef NMQT_STATIC , agentManager(NetworkManagerPrivate::DBUS_SERVICE, QLatin1String(NM_DBUS_PATH_AGENT_MANAGER), QDBusConnection::sessionBus(), parent) - , watcher(NetworkManagerPrivate::DBUS_SERVICE, QDBusConnection::sessionBus(), QDBusServiceWatcher::WatchForRegistration, parent) #else , agentManager(NetworkManagerPrivate::DBUS_SERVICE, QLatin1String(NM_DBUS_PATH_AGENT_MANAGER), QDBusConnection::systemBus(), parent) - , watcher(NetworkManagerPrivate::DBUS_SERVICE, QDBusConnection::systemBus(), QDBusServiceWatcher::WatchForRegistration, parent) #endif , agentId(id) { Q_Q(SecretAgent); qRegisterMetaType("NMVariantMapMap"); qDBusRegisterMetaType(); - watcher.connect(&watcher, SIGNAL(serviceRegistered(QString)), q, SLOT(registerAgent())); + agentManager.connection().connect(NetworkManagerPrivate::DBUS_SERVICE, "/org/freedesktop", NetworkManagerPrivate::FDO_DBUS_OBJECT_MANAGER, + QLatin1String("InterfacesAdded"), q, SLOT(dbusInterfacesAdded(QDBusObjectPath,QVariantMap))); + agentManager.connection().registerObject(QLatin1String(NM_DBUS_PATH_SECRET_AGENT), &agent, QDBusConnection::ExportAllSlots); registerAgent(); @@ -63,6 +63,15 @@ agentManager.Unregister(); } +void NetworkManager::SecretAgentPrivate::dbusInterfacesAdded(const QDBusObjectPath &path, const QVariantMap &interfaces) +{ + Q_UNUSED(path); + if(!interfaces.contains(QString::fromLatin1(agentManager.staticInterfaceName()))) + return; + + registerAgent(); +} + void NetworkManager::SecretAgentPrivate::registerAgent() { agentManager.Register(agentId); diff --git a/src/secretagent_p.h b/src/secretagent_p.h --- a/src/secretagent_p.h +++ b/src/secretagent_p.h @@ -36,12 +36,12 @@ explicit SecretAgentPrivate(const QString &, SecretAgent *parent = nullptr); virtual ~SecretAgentPrivate(); private Q_SLOTS: + void dbusInterfacesAdded(const QDBusObjectPath &path, const QVariantMap &interfaces); void registerAgent(); private: SecretAgent *q_ptr; SecretAgentAdaptor agent; OrgFreedesktopNetworkManagerAgentManagerInterface agentManager; - QDBusServiceWatcher watcher; QString agentId; }; }