diff options
author | Dan Winship <danw@redhat.com> | 2014-12-18 16:04:07 -0500 |
---|---|---|
committer | Dan Winship <danw@redhat.com> | 2015-01-14 11:35:17 -0500 |
commit | c5bca2fb90041d9c8aa977f370fc6928b89ff6dc (patch) | |
tree | 9304fbc7938fe817cda6ca462ca1d2b19c1cbb51 | |
parent | 33eda353f779b5daa1ed2897a50f6bb2210e15f4 (diff) | |
download | NetworkManager-c5bca2fb90041d9c8aa977f370fc6928b89ff6dc.tar.gz |
core: allow connections to participate in NMManager:startup-complete
Add an NMSettingsConnection:ready property, which indicates if the
connection is ready to use. Add NMSettings:startup-complete, which is
TRUE when all connections are ready. Make NMManager:startup-complete
take NMSettings:startup-complete into account.
(cherry picked from commit b067ca703404ccad68404456c83caa5983a597ab)
-rw-r--r-- | src/nm-manager.c | 15 | ||||
-rw-r--r-- | src/settings/nm-settings-connection.c | 35 | ||||
-rw-r--r-- | src/settings/nm-settings-connection.h | 5 | ||||
-rw-r--r-- | src/settings/nm-settings.c | 56 | ||||
-rw-r--r-- | src/settings/nm-settings.h | 11 |
5 files changed, 118 insertions, 4 deletions
diff --git a/src/nm-manager.c b/src/nm-manager.c index e3035c003e..65fb5682c4 100644 --- a/src/nm-manager.c +++ b/src/nm-manager.c @@ -686,6 +686,11 @@ check_if_startup_complete (NMManager *self) if (!priv->startup) return; + if (!nm_settings_get_startup_complete (priv->settings)) { + nm_log_dbg (LOGD_CORE, "check_if_startup_complete returns FALSE because of NMSettings"); + return; + } + for (iter = priv->devices; iter; iter = iter->next) { NMDevice *dev = iter->data; @@ -721,6 +726,14 @@ device_has_pending_action_changed (NMDevice *device, } static void +settings_startup_complete_changed (NMSettings *settings, + GParamSpec *pspec, + NMManager *self) +{ + check_if_startup_complete (self); +} + +static void remove_device (NMManager *manager, NMDevice *device, gboolean quitting, @@ -4720,6 +4733,8 @@ nm_manager_new (NMSettings *settings, priv->prop_filter_added = TRUE; priv->settings = g_object_ref (settings); + g_signal_connect (priv->settings, "notify::" NM_SETTINGS_STARTUP_COMPLETE, + G_CALLBACK (settings_startup_complete_changed), singleton); priv->state_file = g_strdup (state_file); diff --git a/src/settings/nm-settings-connection.c b/src/settings/nm-settings-connection.c index 529f4d8f4b..4dfa7b164a 100644 --- a/src/settings/nm-settings-connection.c +++ b/src/settings/nm-settings-connection.c @@ -82,6 +82,7 @@ enum { PROP_0 = 0, PROP_VISIBLE, PROP_UNSAVED, + PROP_READY, PROP_FLAGS, }; @@ -99,6 +100,7 @@ typedef struct { guint session_changed_id; NMSettingsConnectionFlags flags; + gboolean ready; guint updated_idle_id; @@ -2166,6 +2168,25 @@ nm_settings_connection_get_nm_generated_assumed (NMSettingsConnection *connectio return NM_FLAGS_HAS (nm_settings_connection_get_flags (connection), NM_SETTINGS_CONNECTION_FLAGS_NM_GENERATED_ASSUMED); } +gboolean +nm_settings_connection_get_ready (NMSettingsConnection *connection) +{ + return NM_SETTINGS_CONNECTION_GET_PRIVATE (connection)->ready; +} + +void +nm_settings_connection_set_ready (NMSettingsConnection *connection, + gboolean ready) +{ + NMSettingsConnectionPrivate *priv = NM_SETTINGS_CONNECTION_GET_PRIVATE (connection); + + ready = !!ready; + if (priv->ready != ready) { + priv->ready = ready; + g_object_notify (G_OBJECT (connection), NM_SETTINGS_CONNECTION_READY); + } +} + /**************************************************************/ static void @@ -2174,6 +2195,7 @@ nm_settings_connection_init (NMSettingsConnection *self) NMSettingsConnectionPrivate *priv = NM_SETTINGS_CONNECTION_GET_PRIVATE (self); priv->visible = FALSE; + priv->ready = TRUE; priv->session_monitor = nm_session_monitor_get (); priv->session_changed_id = g_signal_connect (priv->session_monitor, @@ -2252,6 +2274,9 @@ get_property (GObject *object, guint prop_id, case PROP_UNSAVED: g_value_set_boolean (value, nm_settings_connection_get_unsaved (self)); break; + case PROP_READY: + g_value_set_boolean (value, nm_settings_connection_get_ready (self)); + break; case PROP_FLAGS: g_value_set_uint (value, nm_settings_connection_get_flags (self)); break; @@ -2268,6 +2293,9 @@ set_property (GObject *object, guint prop_id, NMSettingsConnection *self = NM_SETTINGS_CONNECTION (object); switch (prop_id) { + case PROP_READY: + nm_settings_connection_set_ready (self, g_value_get_boolean (value)); + break; case PROP_FLAGS: nm_settings_connection_set_flags_all (self, g_value_get_uint (value)); break; @@ -2309,6 +2337,13 @@ nm_settings_connection_class_init (NMSettingsConnectionClass *class) G_PARAM_STATIC_STRINGS)); g_object_class_install_property + (object_class, PROP_READY, + g_param_spec_boolean (NM_SETTINGS_CONNECTION_READY, "", "", + TRUE, + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (object_class, PROP_FLAGS, g_param_spec_uint (NM_SETTINGS_CONNECTION_FLAGS, "", "", NM_SETTINGS_CONNECTION_FLAGS_NONE, diff --git a/src/settings/nm-settings-connection.h b/src/settings/nm-settings-connection.h index 254e927bfd..cd41c1d5f6 100644 --- a/src/settings/nm-settings-connection.h +++ b/src/settings/nm-settings-connection.h @@ -48,6 +48,7 @@ G_BEGIN_DECLS /* Properties */ #define NM_SETTINGS_CONNECTION_VISIBLE "visible" #define NM_SETTINGS_CONNECTION_UNSAVED "unsaved" +#define NM_SETTINGS_CONNECTION_READY "ready" #define NM_SETTINGS_CONNECTION_FLAGS "flags" @@ -196,6 +197,10 @@ gboolean nm_settings_connection_can_autoconnect (NMSettingsConnection *connectio gboolean nm_settings_connection_get_nm_generated (NMSettingsConnection *connection); gboolean nm_settings_connection_get_nm_generated_assumed (NMSettingsConnection *connection); +gboolean nm_settings_connection_get_ready (NMSettingsConnection *connection); +void nm_settings_connection_set_ready (NMSettingsConnection *connection, + gboolean ready); + G_END_DECLS #endif /* __NETWORKMANAGER_SETTINGS_CONNECTION_H__ */ diff --git a/src/settings/nm-settings.c b/src/settings/nm-settings.c index 9ed03f69b9..bc123b4686 100644 --- a/src/settings/nm-settings.c +++ b/src/settings/nm-settings.c @@ -151,6 +151,8 @@ typedef struct { GSList *unmanaged_specs; GSList *unrecognized_specs; GSList *get_connections_cache; + + gboolean startup_complete; } NMSettingsPrivate; #define NM_SETTINGS_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTINGS, NMSettingsPrivate)) @@ -175,11 +177,43 @@ enum { PROP_HOSTNAME, PROP_CAN_MODIFY, PROP_CONNECTIONS, + PROP_STARTUP_COMPLETE, LAST_PROP }; static void +check_startup_complete (NMSettings *self) +{ + NMSettingsPrivate *priv = NM_SETTINGS_GET_PRIVATE (self); + GHashTableIter iter; + NMSettingsConnection *conn; + + if (priv->startup_complete) + return; + + g_hash_table_iter_init (&iter, priv->connections); + while (g_hash_table_iter_next (&iter, NULL, (gpointer *) &conn)) { + if (!nm_settings_connection_get_ready (conn)) + return; + } + + priv->startup_complete = TRUE; + g_object_notify (G_OBJECT (self), NM_SETTINGS_STARTUP_COMPLETE); +} + +static void +connection_ready_changed (NMSettingsConnection *conn, + GParamSpec *pspec, + gpointer user_data) +{ + NMSettings *self = NM_SETTINGS (user_data); + + if (nm_settings_connection_get_ready (conn)) + check_startup_complete (self); +} + +static void plugin_connection_added (NMSystemConfigInterface *config, NMSettingsConnection *connection, gpointer user_data) @@ -772,6 +806,7 @@ connection_removed (NMSettingsConnection *connection, gpointer user_data) g_signal_handlers_disconnect_by_func (connection, G_CALLBACK (connection_updated), self); g_signal_handlers_disconnect_by_func (connection, G_CALLBACK (connection_updated_by_user), self); g_signal_handlers_disconnect_by_func (connection, G_CALLBACK (connection_visibility_changed), self); + g_signal_handlers_disconnect_by_func (connection, G_CALLBACK (connection_ready_changed), self); /* Forget about the connection internally */ g_hash_table_remove (NM_SETTINGS_GET_PRIVATE (user_data)->connections, @@ -784,6 +819,8 @@ connection_removed (NMSettingsConnection *connection, gpointer user_data) g_signal_emit_by_name (self, NM_CP_SIGNAL_CONNECTION_REMOVED, connection); g_object_notify (G_OBJECT (self), NM_SETTINGS_CONNECTIONS); + check_startup_complete (self); + g_object_unref (connection); } @@ -889,6 +926,11 @@ claim_connection (NMSettings *self, g_signal_connect (connection, "notify::" NM_SETTINGS_CONNECTION_VISIBLE, G_CALLBACK (connection_visibility_changed), self); + if (!priv->startup_complete) { + g_signal_connect (connection, "notify::" NM_SETTINGS_CONNECTION_READY, + G_CALLBACK (connection_ready_changed), + self); + } /* Export the connection over D-Bus */ g_warn_if_fail (nm_connection_get_path (NM_CONNECTION (connection)) == NULL); @@ -1780,6 +1822,16 @@ cp_get_connection_by_uuid (NMConnectionProvider *provider, const char *uuid) /***************************************************************/ +gboolean +nm_settings_get_startup_complete (NMSettings *self) +{ + NMSettingsPrivate *priv = NM_SETTINGS_GET_PRIVATE (self); + + return priv->startup_complete; +} + +/***************************************************************/ + NMSettings * nm_settings_new (GError **error) { @@ -1800,6 +1852,7 @@ nm_settings_new (GError **error) } load_connections (self); + check_startup_complete (self); nm_dbus_manager_register_object (priv->dbus_mgr, NM_DBUS_PATH_SETTINGS, self); return self; @@ -1900,6 +1953,9 @@ get_property (GObject *object, guint prop_id, g_ptr_array_add (array, g_strdup (path)); g_value_take_boxed (value, array); break; + case PROP_STARTUP_COMPLETE: + g_value_set_boolean (value, nm_settings_get_startup_complete (self)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; diff --git a/src/settings/nm-settings.h b/src/settings/nm-settings.h index 520c4ec34c..9c0a4c835e 100644 --- a/src/settings/nm-settings.h +++ b/src/settings/nm-settings.h @@ -37,10 +37,11 @@ #define NM_IS_SETTINGS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_SETTINGS)) #define NM_SETTINGS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_SETTINGS, NMSettingsClass)) -#define NM_SETTINGS_UNMANAGED_SPECS "unmanaged-specs" -#define NM_SETTINGS_HOSTNAME "hostname" -#define NM_SETTINGS_CAN_MODIFY "can-modify" -#define NM_SETTINGS_CONNECTIONS "connections" +#define NM_SETTINGS_UNMANAGED_SPECS "unmanaged-specs" +#define NM_SETTINGS_HOSTNAME "hostname" +#define NM_SETTINGS_CAN_MODIFY "can-modify" +#define NM_SETTINGS_CONNECTIONS "connections" +#define NM_SETTINGS_STARTUP_COMPLETE "connections" #define NM_SETTINGS_SIGNAL_CONNECTION_ADDED "connection-added" #define NM_SETTINGS_SIGNAL_CONNECTION_UPDATED "connection-updated" @@ -120,4 +121,6 @@ void nm_settings_device_removed (NMSettings *self, NMDevice *device, gboolean qu gint nm_settings_sort_connections (gconstpointer a, gconstpointer b); +gboolean nm_settings_get_startup_complete (NMSettings *self); + #endif /* __NM_SETTINGS_H__ */ |