diff --git a/src/secretagent.h b/src/secretagent.h --- a/src/secretagent.h +++ b/src/secretagent.h @@ -50,10 +50,20 @@ }; Q_DECLARE_FLAGS(GetSecretsFlags, GetSecretsFlag) + /** + * Capabilities to pass hints to secret agents + */ + enum SecretAgentCapabilities { + SecretAgentCapabilityNone, + SecretAgentCapabilityHints + }; + /** * Registers a SecretAgent with the \p id on NetworkManager + * Optionally add a capabilities argument */ explicit SecretAgent(const QString &id, QObject *parent = nullptr); + explicit SecretAgent(const QString &id, const uint capabilities, QObject *parent = nullptr); virtual ~SecretAgent(); /** @@ -119,6 +129,7 @@ Q_DECLARE_PRIVATE(SecretAgent) Q_PRIVATE_SLOT(d_func(), void registerAgent()) Q_PRIVATE_SLOT(d_func(), void dbusInterfacesAdded(const QDBusObjectPath &path, const QVariantMap &interfaces)) + Q_PRIVATE_SLOT(d_func(), void dbusInterfacesAdded(const QDBusObjectPath &path, const QVariantMap &interfaces, uint capabilities)) SecretAgentPrivate *const d_ptr; }; diff --git a/src/secretagent.cpp b/src/secretagent.cpp --- a/src/secretagent.cpp +++ b/src/secretagent.cpp @@ -43,6 +43,29 @@ registerAgent(); } +NetworkManager::SecretAgentPrivate::SecretAgentPrivate(const QString &id, const uint capabilities, NetworkManager::SecretAgent *parent) + : q_ptr(parent) + , agent(parent) +#ifdef NMQT_STATIC + , agentManager(NetworkManagerPrivate::DBUS_SERVICE, QLatin1String(NM_DBUS_PATH_AGENT_MANAGER), QDBusConnection::sessionBus(), parent) +#else + , agentManager(NetworkManagerPrivate::DBUS_SERVICE, QLatin1String(NM_DBUS_PATH_AGENT_MANAGER), QDBusConnection::systemBus(), parent) +#endif + , agentId(id) +{ + Q_Q(SecretAgent); + + qRegisterMetaType("NMVariantMapMap"); + qDBusRegisterMetaType(); + + agentManager.connection().connect(NetworkManagerPrivate::DBUS_SERVICE, "/org/freedesktop", NetworkManagerPrivate::FDO_DBUS_OBJECT_MANAGER, + QLatin1String("InterfacesAdded"), q, SLOT(dbusInterfacesAdded(QDBusObjectPath,uint,QVariantMap))); + + agentManager.connection().registerObject(QLatin1String(NM_DBUS_PATH_SECRET_AGENT), &agent, QDBusConnection::ExportAllSlots); + + registerAgent(capabilities); +} + NetworkManager::SecretAgentPrivate::~SecretAgentPrivate() { agentManager.Unregister(); @@ -57,11 +80,25 @@ registerAgent(); } +void NetworkManager::SecretAgentPrivate::dbusInterfacesAdded(const QDBusObjectPath &path, const QVariantMap &interfaces, uint capabilities) +{ + Q_UNUSED(path); + if(!interfaces.contains(QString::fromLatin1(agentManager.staticInterfaceName()))) + return; + + registerAgent(capabilities); +} + void NetworkManager::SecretAgentPrivate::registerAgent() { agentManager.Register(agentId); } +void NetworkManager::SecretAgentPrivate::registerAgent(uint capabilities) +{ + agentManager.RegisterWithCapabilities(agentId, capabilities); +} + NetworkManager::SecretAgent::SecretAgent(const QString &id, QObject *parent) : QObject(parent) , QDBusContext() @@ -69,6 +106,13 @@ { } +NetworkManager::SecretAgent::SecretAgent(const QString &id, uint capabilities, QObject *parent) + : QObject(parent) + , QDBusContext() + , d_ptr(new NetworkManager::SecretAgentPrivate(id, capabilities, this)) +{ +} + NetworkManager::SecretAgent::~SecretAgent() { Q_D(SecretAgent); diff --git a/src/secretagent_p.h b/src/secretagent_p.h --- a/src/secretagent_p.h +++ b/src/secretagent_p.h @@ -19,10 +19,13 @@ Q_DECLARE_PUBLIC(SecretAgent) public: explicit SecretAgentPrivate(const QString &, SecretAgent *parent = nullptr); + explicit SecretAgentPrivate(const QString &, const uint, SecretAgent *parent = nullptr); virtual ~SecretAgentPrivate(); private Q_SLOTS: void dbusInterfacesAdded(const QDBusObjectPath &path, const QVariantMap &interfaces); + void dbusInterfacesAdded(const QDBusObjectPath &path, const QVariantMap &interfaces, const uint capabilities); void registerAgent(); + void registerAgent(const uint capabilities); private: SecretAgent *q_ptr; SecretAgentAdaptor agent;