From ac03cbce048724965f07c83150ee57313e723c0e Mon Sep 17 00:00:00 2001 From: Witold Sowa Date: Tue, 22 Sep 2009 23:29:02 -0700 Subject: [PATCH 1/2] libnm-glib: add service-running property to NMRemoteSettings So that users can actually tell if the remote service is running or not. It doesn't have to be when the object is created. --- libnm-glib/nm-remote-settings.c | 35 +++++++++++++++++++++++++++++++-- libnm-glib/nm-remote-settings.h | 1 + 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/libnm-glib/nm-remote-settings.c b/libnm-glib/nm-remote-settings.c index 3d335fe715..c81be430b6 100644 --- a/libnm-glib/nm-remote-settings.c +++ b/libnm-glib/nm-remote-settings.c @@ -45,6 +45,7 @@ typedef struct { DBusGProxy *proxy; GHashTable *connections; GHashTable *pending; /* Connections we don't have settings for yet */ + gboolean service_running; DBusGProxy *dbus_proxy; @@ -57,6 +58,7 @@ enum { PROP_0, PROP_BUS, PROP_SCOPE, + PROP_SERVICE_RUNNING, LAST_PROP }; @@ -283,10 +285,14 @@ name_owner_changed (DBusGProxy *proxy, if (priv->fetch_id) g_source_remove (priv->fetch_id); - if (new_owner && strlen (new_owner) > 0) + if (new_owner && strlen (new_owner) > 0) { priv->fetch_id = g_idle_add (fetch_connections, self); - else + priv->service_running = TRUE; + } else { priv->fetch_id = g_idle_add (remove_connections, self); + priv->service_running = FALSE; + } + g_object_notify (G_OBJECT (self), NM_REMOTE_SETTINGS_SERVICE_RUNNING); } } @@ -339,6 +345,7 @@ constructor (GType type, GObject *object; NMRemoteSettingsPrivate *priv; const char *service = NM_DBUS_SERVICE_USER_SETTINGS; + GError *error = NULL; object = G_OBJECT_CLASS (nm_remote_settings_parent_class)->constructor (type, n_construct_params, construct_params); if (!object) @@ -369,6 +376,19 @@ constructor (GType type, if (priv->scope == NM_CONNECTION_SCOPE_SYSTEM) service = NM_DBUS_SERVICE_SYSTEM_SETTINGS; + if (!dbus_g_proxy_call (priv->dbus_proxy, "NameHasOwner", &error, + G_TYPE_STRING, service, + G_TYPE_INVALID, + G_TYPE_BOOLEAN, &priv->service_running, + G_TYPE_INVALID)) { + g_warning ("%s (NMRemoteSettings) error getting remote settings service status: (%d) %s\n", + __func__, + error ? error->code : -1, + error && error->message ? error->message : "(unknown)"); + g_error_free (error); + priv->service_running = FALSE; + } + priv->proxy = dbus_g_proxy_new_for_name (priv->bus, service, NM_DBUS_PATH_SETTINGS, @@ -447,6 +467,9 @@ get_property (GObject *object, guint prop_id, case PROP_SCOPE: g_value_set_uint (value, priv->scope); break; + case PROP_SERVICE_RUNNING: + g_value_set_boolean (value, priv->service_running); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -484,5 +507,13 @@ nm_remote_settings_class_init (NMRemoteSettingsClass *class) NM_CONNECTION_SCOPE_USER, NM_CONNECTION_SCOPE_USER, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); + + g_object_class_install_property + (object_class, PROP_SERVICE_RUNNING, + g_param_spec_boolean (NM_REMOTE_SETTINGS_SERVICE_RUNNING, + "Service running", + "Is service running", + FALSE, + G_PARAM_READABLE)); } diff --git a/libnm-glib/nm-remote-settings.h b/libnm-glib/nm-remote-settings.h index f94aee4f2e..19397c3a8d 100644 --- a/libnm-glib/nm-remote-settings.h +++ b/libnm-glib/nm-remote-settings.h @@ -40,6 +40,7 @@ G_BEGIN_DECLS #define NM_REMOTE_SETTINGS_BUS "bus" #define NM_REMOTE_SETTINGS_SCOPE "scope" +#define NM_REMOTE_SETTINGS_SERVICE_RUNNING "service-running" typedef struct { GObject parent; From b20cef2e1beae61cb2335edb8cb0aa3932facd54 Mon Sep 17 00:00:00 2001 From: Witold Sowa Date: Tue, 22 Sep 2009 23:44:45 -0700 Subject: [PATCH 2/2] libnm-glib: add 'connections-read' signal to settings interface To let listeners know when all connections have been found. --- libnm-glib/nm-remote-settings.c | 10 ++++++++++ libnm-glib/nm-settings-interface.c | 8 ++++++++ libnm-glib/nm-settings-interface.h | 5 ++++- 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/libnm-glib/nm-remote-settings.c b/libnm-glib/nm-remote-settings.c index c81be430b6..d7be8fbb04 100644 --- a/libnm-glib/nm-remote-settings.c +++ b/libnm-glib/nm-remote-settings.c @@ -124,6 +124,10 @@ connection_init_result_cb (NMRemoteConnection *remote, } g_hash_table_remove (priv->pending, path); + + /* Let listeners know that all connections have been found */ + if (!g_hash_table_size (priv->pending)) + g_signal_emit_by_name (self, NM_SETTINGS_INTERFACE_CONNECTIONS_READ); } static void @@ -171,6 +175,12 @@ fetch_connections_done (DBusGProxy *proxy, return; } + /* Let listeners know we are done getting connections */ + if (connections->len == 0) { + g_signal_emit_by_name (self, NM_SETTINGS_INTERFACE_CONNECTIONS_READ); + return; + } + for (i = 0; connections && (i < connections->len); i++) { char *path = g_ptr_array_index (connections, i); diff --git a/libnm-glib/nm-settings-interface.c b/libnm-glib/nm-settings-interface.c index 51a9ad00d6..f320953058 100644 --- a/libnm-glib/nm-settings-interface.c +++ b/libnm-glib/nm-settings-interface.c @@ -162,6 +162,14 @@ nm_settings_interface_init (gpointer g_iface) g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, G_TYPE_OBJECT); + g_signal_new (NM_SETTINGS_INTERFACE_CONNECTIONS_READ, + iface_type, + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (NMSettingsInterface, connections_read), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + initialized = TRUE; } diff --git a/libnm-glib/nm-settings-interface.h b/libnm-glib/nm-settings-interface.h index 44c4d9dc2e..fd9e48a508 100644 --- a/libnm-glib/nm-settings-interface.h +++ b/libnm-glib/nm-settings-interface.h @@ -48,7 +48,8 @@ GType nm_settings_interface_error_get_type (void); #define NM_IS_SETTINGS_INTERFACE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_SETTINGS_INTERFACE)) #define NM_SETTINGS_INTERFACE_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), NM_TYPE_SETTINGS_INTERFACE, NMSettingsInterface)) -#define NM_SETTINGS_INTERFACE_NEW_CONNECTION "new-connection" +#define NM_SETTINGS_INTERFACE_NEW_CONNECTION "new-connection" +#define NM_SETTINGS_INTERFACE_CONNECTIONS_READ "connections-read" typedef struct _NMSettingsInterface NMSettingsInterface; @@ -74,6 +75,8 @@ struct _NMSettingsInterface { /* Signals */ void (*new_connection) (NMSettingsInterface *settings, NMSettingsConnectionInterface *connection); + + void (*connections_read) (NMSettingsInterface *settings); }; GType nm_settings_interface_get_type (void);