summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2015-01-06 12:11:21 +0100
committerThomas Haller <thaller@redhat.com>2015-01-12 12:10:03 +0100
commit3af40acf31e458d407805fcfc6ef7160b966c045 (patch)
tree026856ad9ee56f162e5637f0c7756ed78bc2b281
parentd45c1b84f433da696a1c244fb6d65a26a3e26661 (diff)
downloadNetworkManager-3af40acf31e458d407805fcfc6ef7160b966c045.tar.gz
core: declare nm_agent_manager_get() using NM_DEFINE_SINGLETON_GETTER()
Also move the initilization of the instance into the constructed() method. NMAgentManager now owns a reference to the DBUS manager and Auth manager and the dispose() function properly unregisters itself from both.
-rw-r--r--src/settings/nm-agent-manager.c84
-rw-r--r--src/settings/nm-settings-connection.c2
-rw-r--r--src/settings/nm-settings.c2
-rw-r--r--src/vpn-manager/nm-vpn-connection.c5
4 files changed, 48 insertions, 45 deletions
diff --git a/src/settings/nm-agent-manager.c b/src/settings/nm-agent-manager.c
index 8ebb690f9c..017624171d 100644
--- a/src/settings/nm-agent-manager.c
+++ b/src/settings/nm-agent-manager.c
@@ -50,9 +50,8 @@ G_DEFINE_TYPE (NMAgentManager, nm_agent_manager, G_TYPE_OBJECT)
NMAgentManagerPrivate))
typedef struct {
- gboolean disposed;
-
NMDBusManager *dbus_mgr;
+ NMAuthManager *auth_mgr;
/* Auth chains for checking agent permissions */
GSList *chains;
@@ -1537,35 +1536,7 @@ authority_changed_cb (NMAuthManager *auth_manager, NMAgentManager *self)
/*************************************************************/
-NMAgentManager *
-nm_agent_manager_get (void)
-{
- static NMAgentManager *singleton = NULL;
- NMAgentManagerPrivate *priv;
-
- if (singleton)
- return g_object_ref (singleton);
-
- singleton = (NMAgentManager *) g_object_new (NM_TYPE_AGENT_MANAGER, NULL);
- g_assert (singleton);
-
- priv = NM_AGENT_MANAGER_GET_PRIVATE (singleton);
- priv->dbus_mgr = nm_dbus_manager_get ();
-
- nm_dbus_manager_register_object (priv->dbus_mgr, NM_DBUS_PATH_AGENT_MANAGER, singleton);
-
- g_signal_connect (priv->dbus_mgr,
- NM_DBUS_MANAGER_NAME_OWNER_CHANGED,
- G_CALLBACK (name_owner_changed_cb),
- singleton);
-
- g_signal_connect (nm_auth_manager_get (),
- NM_AUTH_MANAGER_SIGNAL_CHANGED,
- G_CALLBACK (authority_changed_cb),
- singleton);
-
- return singleton;
-}
+NM_DEFINE_SINGLETON_GETTER (NMAgentManager, nm_agent_manager_get, NM_TYPE_AGENT_MANAGER);
static void
nm_agent_manager_init (NMAgentManager *self)
@@ -1580,23 +1551,57 @@ nm_agent_manager_init (NMAgentManager *self)
}
static void
-dispose (GObject *object)
+constructed (GObject *object)
{
NMAgentManagerPrivate *priv = NM_AGENT_MANAGER_GET_PRIVATE (object);
- if (!priv->disposed) {
- priv->disposed = TRUE;
+ G_OBJECT_CLASS (nm_agent_manager_parent_class)->constructed (object);
- g_signal_handlers_disconnect_by_func (nm_auth_manager_get (),
- G_CALLBACK (authority_changed_cb),
- object);
+ priv->dbus_mgr = g_object_ref (nm_dbus_manager_get ());
+ priv->auth_mgr = g_object_ref (nm_auth_manager_get ());
+
+ nm_dbus_manager_register_object (priv->dbus_mgr, NM_DBUS_PATH_AGENT_MANAGER, object);
- g_slist_free_full (priv->chains, (GDestroyNotify) nm_auth_chain_unref);
+ g_signal_connect (priv->dbus_mgr,
+ NM_DBUS_MANAGER_NAME_OWNER_CHANGED,
+ G_CALLBACK (name_owner_changed_cb),
+ object);
+
+ g_signal_connect (priv->auth_mgr,
+ NM_AUTH_MANAGER_SIGNAL_CHANGED,
+ G_CALLBACK (authority_changed_cb),
+ object);
+}
+static void
+dispose (GObject *object)
+{
+ NMAgentManagerPrivate *priv = NM_AGENT_MANAGER_GET_PRIVATE (object);
+
+ g_slist_free_full (priv->chains, (GDestroyNotify) nm_auth_chain_unref);
+ priv->chains = NULL;
+
+ if (priv->agents) {
g_hash_table_destroy (priv->agents);
+ priv->agents = NULL;
+ }
+ if (priv->requests) {
g_hash_table_destroy (priv->requests);
+ priv->requests = NULL;
+ }
- priv->dbus_mgr = NULL;
+ if (priv->auth_mgr) {
+ g_signal_handlers_disconnect_by_func (priv->auth_mgr,
+ G_CALLBACK (authority_changed_cb),
+ object);
+ g_clear_object (&priv->auth_mgr);
+ }
+ if (priv->dbus_mgr) {
+ g_signal_handlers_disconnect_by_func (priv->dbus_mgr,
+ G_CALLBACK (name_owner_changed_cb),
+ object);
+ nm_dbus_manager_unregister_object (priv->dbus_mgr, object);
+ g_clear_object (&priv->dbus_mgr);
}
G_OBJECT_CLASS (nm_agent_manager_parent_class)->dispose (object);
@@ -1610,6 +1615,7 @@ nm_agent_manager_class_init (NMAgentManagerClass *agent_manager_class)
g_type_class_add_private (agent_manager_class, sizeof (NMAgentManagerPrivate));
/* virtual methods */
+ object_class->constructed = constructed;
object_class->dispose = dispose;
/* Signals */
diff --git a/src/settings/nm-settings-connection.c b/src/settings/nm-settings-connection.c
index 66666ee4d2..44a45bb472 100644
--- a/src/settings/nm-settings-connection.c
+++ b/src/settings/nm-settings-connection.c
@@ -2200,7 +2200,7 @@ nm_settings_connection_init (NMSettingsConnection *self)
priv->session_changed_id = nm_session_monitor_connect (session_changed_cb, self);
- priv->agent_mgr = nm_agent_manager_get ();
+ priv->agent_mgr = g_object_ref (nm_agent_manager_get ());
priv->seen_bssids = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
diff --git a/src/settings/nm-settings.c b/src/settings/nm-settings.c
index b28c05f86f..9b99229150 100644
--- a/src/settings/nm-settings.c
+++ b/src/settings/nm-settings.c
@@ -1877,7 +1877,7 @@ nm_settings_init (NMSettings *self)
* transient, and we don't want the agent manager to get destroyed and
* recreated often.
*/
- priv->agent_mgr = nm_agent_manager_get ();
+ priv->agent_mgr = g_object_ref (nm_agent_manager_get ());
g_signal_connect (priv->agent_mgr, "agent-registered", G_CALLBACK (secret_agent_registered), self);
}
diff --git a/src/vpn-manager/nm-vpn-connection.c b/src/vpn-manager/nm-vpn-connection.c
index cb07c7f9ad..a3c3819264 100644
--- a/src/vpn-manager/nm-vpn-connection.c
+++ b/src/vpn-manager/nm-vpn-connection.c
@@ -1582,7 +1582,6 @@ static void
really_activate (NMVpnConnection *connection, const char *username)
{
NMVpnConnectionPrivate *priv;
- NMAgentManager *agent_mgr;
GHashTable *details;
g_return_if_fail (NM_IS_VPN_CONNECTION (connection));
@@ -1621,8 +1620,7 @@ really_activate (NMVpnConnection *connection, const char *username)
* dialog and we won't get the secrets we need. In this case fall back to
* the old Connect() call.
*/
- agent_mgr = nm_agent_manager_get ();
- if (nm_agent_manager_all_agents_have_capability (agent_mgr,
+ if (nm_agent_manager_all_agents_have_capability (nm_agent_manager_get (),
nm_active_connection_get_subject (NM_ACTIVE_CONNECTION (connection)),
NM_SECRET_AGENT_CAPABILITY_VPN_HINTS)) {
nm_log_dbg (LOGD_VPN, "Allowing interactive secrets as all agents have that capability");
@@ -1638,7 +1636,6 @@ really_activate (NMVpnConnection *connection, const char *username)
DBUS_TYPE_G_MAP_OF_MAP_OF_VARIANT, priv->connect_hash,
G_TYPE_INVALID);
}
- g_object_unref (agent_mgr);
g_hash_table_destroy (details);
_set_vpn_state (connection, STATE_CONNECT, NM_VPN_CONNECTION_STATE_REASON_NONE, FALSE);