[network-manager-applet] editor: initialize pages after all pages have been created
- From: Dan Williams <dcbw src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [network-manager-applet] editor: initialize pages after all pages have been created
- Date: Tue, 29 Mar 2011 21:00:14 +0000 (UTC)
commit f60260df9f64373c4509b5049e821c9a83c66725
Author: Dan Williams <dcbw redhat com>
Date: Mon Mar 28 11:12:32 2011 -0500
editor: initialize pages after all pages have been created
Otherwise, due to signals emitted as a result of get_secrets_for_page()
we may end up calling recheck_initialization() with
editor->initializing_pages empty, thus setting editor->init_run to
TRUE, and skipping any further calls to recheck_initialization()
when other pages initialize later. Basically, just separate the
creation step from the page initialization/setup step to make sure
we correctly track which pages are initializing at any given point.
src/connection-editor/nm-connection-editor.c | 78 +++++++++++++++-----------
1 files changed, 46 insertions(+), 32 deletions(-)
---
diff --git a/src/connection-editor/nm-connection-editor.c b/src/connection-editor/nm-connection-editor.c
index 9793eca..8445d61 100644
--- a/src/connection-editor/nm-connection-editor.c
+++ b/src/connection-editor/nm-connection-editor.c
@@ -606,25 +606,6 @@ get_secrets_for_page (NMConnectionEditor *self,
{
GetSecretsInfo *info;
- if (!setting_name) {
- /* page doesn't need any secrets */
- ce_page_complete_init (page, NULL, NULL, NULL);
- return;
- }
-
- /* Try to get secrets from ->orig_connection, because it's the one that
- * implements NMSettingsConnectionInterface and can respond to requests for
- * its secrets. ->connection is a plain NMConnection copy of ->orig_connection
- * which is the connection that's actually changed when the user clicks stuff.
- * When creating importing or creating new connections though, ->orig_connection
- * is an NMConnection because it hasn't been exported over D-Bus yet, so we
- * can't ask it for secrets, because it doesn't implement NMSettingsConnectionInterface.
- */
- if (!NM_IS_REMOTE_CONNECTION (self->orig_connection)) {
- ce_page_complete_init (page, setting_name, NULL, NULL);
- return;
- }
-
info = g_malloc0 (sizeof (GetSecretsInfo));
info->self = self;
info->page = page;
@@ -652,6 +633,8 @@ get_secrets_for_page (NMConnectionEditor *self,
}
}
+#define SECRETS_TAG "secrets-setting-name"
+
static gboolean
add_page (NMConnectionEditor *editor,
CEPageNewFunc func,
@@ -666,19 +649,17 @@ add_page (NMConnectionEditor *editor,
g_return_val_if_fail (connection != NULL, FALSE);
page = (*func) (connection, GTK_WINDOW (editor->window), &secrets_setting_name, error);
- if (!page)
- return FALSE;
-
- editor->initializing_pages = g_slist_prepend (editor->initializing_pages, page);
- g_signal_connect (page, "changed", G_CALLBACK (page_changed), editor);
- g_signal_connect (page, "initialized", G_CALLBACK (page_initialized), editor);
-
- /* Request any secrets the page might require; or if it doesn't want any,
- * let the page initialize.
- */
- get_secrets_for_page (editor, page, secrets_setting_name);
-
- return TRUE;
+ if (page) {
+ g_object_set_data_full (G_OBJECT (page),
+ SECRETS_TAG,
+ g_strdup (secrets_setting_name),
+ g_free);
+
+ editor->initializing_pages = g_slist_append (editor->initializing_pages, page);
+ g_signal_connect (page, "changed", G_CALLBACK (page_changed), editor);
+ g_signal_connect (page, "initialized", G_CALLBACK (page_initialized), editor);
+ }
+ return !!page;
}
static gboolean
@@ -689,6 +670,7 @@ nm_connection_editor_set_connection (NMConnectionEditor *editor,
NMSettingConnection *s_con;
const char *connection_type;
gboolean success = FALSE;
+ GSList *iter, *copy;
g_return_val_if_fail (NM_IS_CONNECTION_EDITOR (editor), FALSE);
g_return_val_if_fail (NM_IS_CONNECTION (orig_connection), FALSE);
@@ -750,6 +732,38 @@ nm_connection_editor_set_connection (NMConnectionEditor *editor,
g_warning ("Unhandled setting type '%s'", connection_type);
}
+ /* After all pages are created, then kick off secrets requests that any
+ * the pages may need to make; if they don't need any secrets, then let
+ * them finish initialization. The list might get modified during the loop
+ * which is why copy the list here.
+ */
+ copy = g_slist_copy (editor->initializing_pages);
+ for (iter = copy; iter; iter = g_slist_next (iter)) {
+ CEPage *page = CE_PAGE (iter->data);
+ const char *setting_name = g_object_get_data (G_OBJECT (page), SECRETS_TAG);
+
+ if (!setting_name) {
+ /* page doesn't need any secrets */
+ ce_page_complete_init (page, NULL, NULL, NULL);
+ } else if (!NM_IS_REMOTE_CONNECTION (editor->orig_connection)) {
+ /* We want to get secrets using ->orig_connection, since that's the
+ * remote connection which can actually respond to secrets requests.
+ * ->connection is a plain NMConnection copy of ->orig_connection
+ * which is what gets changed when users modify anything. But when
+ * creating or importing, ->orig_connection will be an NMConnection
+ * since the new connection hasn't been added to NetworkManager yet.
+ * So basically, skip requesting secrets if the connection can't
+ * handle a secrets request.
+ */
+ ce_page_complete_init (page, setting_name, NULL, NULL);
+ } else {
+ /* Page wants secrets, get them */
+ get_secrets_for_page (editor, page, setting_name);
+ }
+ g_object_set_data (G_OBJECT (page), SECRETS_TAG, NULL);
+ }
+ g_slist_free (copy);
+
/* set the UI */
recheck_initialization (editor);
success = TRUE;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]