diff options
author | Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im> | 2013-04-28 10:47:00 +0200 |
---|---|---|
committer | Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im> | 2013-04-28 10:47:00 +0200 |
commit | ecfe35d3deb06c2d5ef8788107e2308ff765707f (patch) | |
tree | aced3a0f030a0490b465cdffb3fdda21f46fc8fc | |
parent | 930a91e47ab7be298b39f19730e95b6608a4fa45 (diff) | |
download | pidgin-ecfe35d3deb06c2d5ef8788107e2308ff765707f.tar.gz |
keyring.c refactoring: purple_keyring_set_inuse
-rw-r--r-- | libpurple/keyring.c | 271 | ||||
-rw-r--r-- | libpurple/keyring.h | 4 | ||||
-rw-r--r-- | pidgin/gtkprefs.c | 3 |
3 files changed, 137 insertions, 141 deletions
diff --git a/libpurple/keyring.c b/libpurple/keyring.c index af09db187a..710d6b5cfc 100644 --- a/libpurple/keyring.c +++ b/libpurple/keyring.c @@ -208,85 +208,88 @@ purple_keyring_set_inuse_drop_cb(gpointer _tracker) current_change_tracker = NULL; if (tracker->cb != NULL) - tracker->cb(tracker->new, NULL, tracker->cb_data); - } else { - purple_debug_error("keyring", - "Failed to change keyring, aborting.\n"); + tracker->cb(NULL, tracker->cb_data); + purple_keyring_change_tracker_free(tracker); + return; + } - purple_keyring_close(tracker->new); + purple_debug_error("keyring", "Failed to change keyring, aborting.\n"); - purple_keyring_pref_disconnect(); - purple_prefs_set_string("/purple/keyring/active", - purple_keyring_get_id(tracker->old)); - purple_keyring_pref_connect(); + purple_keyring_close(tracker->new); - current_change_tracker = NULL; + purple_keyring_pref_disconnect(); + purple_prefs_set_string("/purple/keyring/active", + purple_keyring_get_id(tracker->old)); + purple_keyring_pref_connect(); - if (tracker->error == NULL) { - tracker->error = g_error_new(PURPLE_KEYRING_ERROR, - PURPLE_KEYRING_ERROR_UNKNOWN, - "Unknown error has occured"); - } - if (tracker->cb != NULL) - tracker->cb(tracker->old, tracker->error, tracker->cb_data); + current_change_tracker = NULL; + + if (tracker->error == NULL) { + tracker->error = g_error_new(PURPLE_KEYRING_ERROR, + PURPLE_KEYRING_ERROR_UNKNOWN, + "Unknown error has occured"); } + if (tracker->cb != NULL) + tracker->cb(tracker->error, tracker->cb_data); + purple_keyring_change_tracker_free(tracker); } static void -purple_keyring_set_inuse_save_cb(PurpleAccount *account, - GError *error, - gpointer data) +purple_keyring_set_inuse_save_cb(PurpleAccount *account, GError *error, + gpointer _tracker) { - const gchar *name; - PurpleKeyringChangeTracker *tracker; + const gchar *account_name; + PurpleKeyringChangeTracker *tracker = _tracker; - tracker = (PurpleKeyringChangeTracker *)data; + g_return_if_fail(account != NULL); + g_return_if_fail(tracker != NULL); tracker->read_outstanding--; - name = purple_account_get_username(account); - - if ((error != NULL) && (error->domain == PURPLE_KEYRING_ERROR)) { - switch(error->code) { - case PURPLE_KEYRING_ERROR_NOPASSWORD: - if (purple_debug_is_verbose()) { - purple_debug_misc("keyring", - "No password found while changing keyring for account %s: %s.\n", - name, error->message); - } - break; - - case PURPLE_KEYRING_ERROR_CANCELLED: - purple_debug_info("keyring", - "Operation cancelled while changing keyring for account %s: %s.\n", - name, error->message); - tracker->abort = TRUE; - if (tracker->error != NULL) - g_error_free(tracker->error); - tracker->error = g_error_copy(error); - break; - - case PURPLE_KEYRING_ERROR_BACKENDFAIL: - purple_debug_error("keyring", - "Failed to communicate with backend while changing keyring for account %s: %s. Aborting changes.\n", - name, error->message); - tracker->abort = TRUE; - if (tracker->error != NULL) - g_error_free(tracker->error); - tracker->error = g_error_copy(error); - break; - - default: - purple_debug_error("keyring", - "Unknown error while changing keyring for account %s: %s. Aborting changes.\n", - name, error->message); - tracker->abort = TRUE; - if (tracker->error == NULL) - tracker->error = g_error_copy(error); - break; + account_name = purple_account_get_username(account); + + if (g_error_matches(PURPLE_KEYRING_ERROR, + PURPLE_KEYRING_ERROR_NOPASSWORD)) { + if (purple_debug_is_verbose()) { + purple_debug_misc("keyring", "No password found while " + "changing keyring for account %s: %s.\n", + account_name, error->message); } + } else if (g_error_matches(PURPLE_KEYRING_ERROR, + PURPLE_KEYRING_ERROR_ACCESSDENIED)) { + purple_debug_info("keyring", "Access denied while changing " + "keyring for account %s: %s.\n", + account_name, error->message); + tracker->abort = TRUE; + if (tracker->error != NULL) + g_error_free(tracker->error); + tracker->error = g_error_copy(error); + } else if (g_error_matches(PURPLE_KEYRING_ERROR, + PURPLE_KEYRING_ERROR_CANCELLED)) { + purple_debug_info("keyring", "Operation cancelled while " + "changing keyring for account %s: %s.\n", + account_name, error->message); + tracker->abort = TRUE; + if (tracker->error == NULL) + tracker->error = g_error_copy(error); + } else if (g_error_matches(PURPLE_KEYRING_ERROR, + PURPLE_KEYRING_ERROR_BACKENDFAIL)) { + purple_debug_error("keyring", "Failed to communicate with " + "backend while changing keyring for account %s: %s. " + "Aborting changes.\n", account_name, error->message); + tracker->abort = TRUE; + if (tracker->error != NULL) + g_error_free(tracker->error); + tracker->error = g_error_copy(error); + } else if (error != NULL) { + purple_debug_error("keyring", "Unknown error while changing " + "keyring for account %s: %s. Aborting changes.\n", + account_name, error->message); + tracker->abort = TRUE; + if (tracker->error == NULL) + tracker->error = g_error_copy(error); } /** @@ -295,71 +298,68 @@ purple_keyring_set_inuse_save_cb(PurpleAccount *account, * Another way to do this would be to expose the * schedule_accounts_save() function, but other such functions * are not exposed. So these was done for consistency. + * + * TODO: put a signal here */ purple_account_set_remember_password(account, purple_account_get_remember_password(account)); - /* if this was the last one */ - if (tracker->finished && tracker->read_outstanding == 0) { - if (tracker->abort && !tracker->force) { - tracker->succeeded = FALSE; - purple_keyring_drop_passwords(tracker->new, purple_keyring_set_inuse_drop_cb, tracker); - } else { - tracker->succeeded = TRUE; - purple_keyring_drop_passwords(tracker->old, purple_keyring_set_inuse_drop_cb, tracker); - } + if (!tracker->finished || tracker->read_outstanding > 0) + return; + + /* This was the last one. */ + if (tracker->abort && !tracker->force) { + tracker->succeeded = FALSE; + purple_keyring_drop_passwords(tracker->new, + purple_keyring_set_inuse_drop_cb, tracker); + } else { + tracker->succeeded = TRUE; + purple_keyring_drop_passwords(tracker->old, + purple_keyring_set_inuse_drop_cb, tracker); } } static void -purple_keyring_set_inuse_read_cb(PurpleAccount *account, - const gchar *password, - GError *error, - gpointer data) +purple_keyring_set_inuse_read_cb(PurpleAccount *account, const gchar *password, + GError *error, gpointer _tracker) { - PurpleKeyring *new; + PurpleKeyringChangeTracker *tracker = _tracker; PurpleKeyringSave save_cb; - PurpleKeyringChangeTracker *tracker; - - tracker = (PurpleKeyringChangeTracker *)data; - new = tracker->new; + g_return_if_fail(account != NULL); g_return_if_fail(tracker != NULL); + if (tracker->abort) { purple_keyring_set_inuse_save_cb(account, NULL, data); return; } if (error != NULL) { - if (error->code == PURPLE_KEYRING_ERROR_NOPASSWORD || - tracker->force == TRUE) { - /* don't save password, and ignore it */ + if (tracker->force == TRUE || g_error_matches( + PURPLE_KEYRING_ERROR, + PURPLE_KEYRING_ERROR_NOPASSWORD)) { + /* Don't save password, and ignore it. */ } else { - /* fatal error, abort all */ tracker->abort = TRUE; } purple_keyring_set_inuse_save_cb(account, error, data); - } else { - save_cb = purple_keyring_get_save_password(new); - g_return_if_fail(save_cb != NULL); - - save_cb(account, password, purple_keyring_set_inuse_save_cb, - tracker); + return; } + + save_cb = purple_keyring_get_save_password(tracker->new); + g_assert(save_cb != NULL); + + save_cb(account, password, purple_keyring_set_inuse_save_cb, tracker); } void -purple_keyring_set_inuse(PurpleKeyring *newkeyring, - gboolean force, - PurpleKeyringSetInUseCallback cb, - gpointer data) +purple_keyring_set_inuse(PurpleKeyring *newkeyring, gboolean force, + PurpleKeyringSetInUseCallback cb, gpointer data) { - GList *cur; PurpleKeyring *oldkeyring; - PurpleKeyringRead read_cb = NULL; PurpleKeyringChangeTracker *tracker; - - oldkeyring = purple_keyring_get_inuse(); + GList *it; + PurpleKeyringRead read_cb; if (current_change_tracker != NULL) { GError *error; @@ -370,11 +370,13 @@ purple_keyring_set_inuse(PurpleKeyring *newkeyring, error = g_error_new(PURPLE_KEYRING_ERROR, PURPLE_KEYRING_ERROR_INTERNAL, "There is a password migration session already running"); - cb(oldkeyring, error, data); + cb(error, data); g_error_free(error); return; } + oldkeyring = purple_keyring_get_inuse(); + if (oldkeyring == newkeyring) { if (purple_debug_is_verbose()) { purple_debug_misc("keyring", @@ -383,57 +385,54 @@ purple_keyring_set_inuse(PurpleKeyring *newkeyring, newkeyring->id : "(null)"); } if (cb != NULL) - cb(newkeyring, NULL, data); + cb(NULL, data); return; } purple_debug_info("keyring", "Attempting to set new keyring: %s.\n", (newkeyring != NULL) ? newkeyring->id : "(null)"); - if (oldkeyring != NULL) { - read_cb = purple_keyring_get_read_password(oldkeyring); - g_return_if_fail(read_cb != NULL); + if (oldkeyring == NULL) { /* No keyring was set before. */ + if (purple_debug_is_verbose()) { + purple_debug_misc("keyring", "Setting keyring for the " + "first time: %s.\n", newkeyring->id); + } - purple_debug_misc("keyring", "Starting migration from: %s.\n", - oldkeyring->id); + purple_keyring_inuse = newkeyring; + g_assert(current_change_tracker == NULL); + if (cb != NULL) + cb(NULL, data); + return; + } - tracker = g_new(PurpleKeyringChangeTracker, 1); - current_change_tracker = tracker; + /* Starting a migration. */ - tracker->cb = cb; - tracker->cb_data = data; - tracker->new = newkeyring; - tracker->old = oldkeyring; - tracker->read_outstanding = 0; - tracker->finished = FALSE; - tracker->abort = FALSE; - tracker->force = force; - tracker->error = NULL; + read_cb = purple_keyring_get_read_password(oldkeyring); + g_assert(read_cb != NULL); - for (cur = purple_accounts_get_all(); cur != NULL; - cur = cur->next) { + purple_debug_misc("keyring", "Starting migration from: %s.\n", + oldkeyring->id); - if (tracker->abort) { - tracker->finished = TRUE; - break; - } - tracker->read_outstanding++; + tracker = g_new0(PurpleKeyringChangeTracker, 1); + current_change_tracker = tracker - if (cur->next == NULL) - tracker->finished = TRUE; + tracker->cb = cb; + tracker->cb_data = data; + tracker->new = newkeyring; + tracker->old = oldkeyring; + tracker->force = force; - read_cb(cur->data, purple_keyring_set_inuse_read_cb, tracker); - } - } else { /* no keyring was set before. */ - if (purple_debug_is_verbose()) { - purple_debug_misc("keyring", "Setting keyring for the " - "first time: %s.\n", newkeyring->id); + for (it = purple_accounts_get_all(); it != NULL; it = it->next) { + if (tracker->abort) { + tracker->finished = TRUE; + break; } + tracker->read_outstanding++; - purple_keyring_inuse = newkeyring; - g_assert(current_change_tracker == NULL); - if (cb != NULL) - cb(newkeyring, NULL, data); + if (it->next == NULL) + tracker->finished = TRUE; + + read_cb(it->data, purple_keyring_set_inuse_read_cb, tracker); } } diff --git a/libpurple/keyring.h b/libpurple/keyring.h index 661401ebac..3ca7262be4 100644 --- a/libpurple/keyring.h +++ b/libpurple/keyring.h @@ -89,12 +89,10 @@ typedef void (*PurpleKeyringChangeMasterCallback)(GError *error, gpointer data); /** * Callback for when we change the keyring. * - * @param keyring The keyring that is in use. * @param error An error that might have occurred. * @param data A pointer to user supplied data. */ -typedef void (*PurpleKeyringSetInUseCallback)(PurpleKeyring *keyring, - GError *error, gpointer data); +typedef void (*PurpleKeyringSetInUseCallback)(GError *error, gpointer data); /*@}*/ diff --git a/pidgin/gtkprefs.c b/pidgin/gtkprefs.c index dc4debd8c2..9c4bccf991 100644 --- a/pidgin/gtkprefs.c +++ b/pidgin/gtkprefs.c @@ -2593,8 +2593,7 @@ change_master_password_cb(GtkWidget *button, gpointer ptr) } static void -keyring_page_pref_set_inuse(PurpleKeyring *keyring, GError *error, - gpointer _combo_box) +keyring_page_pref_set_inuse(GError *error, gpointer _combo_box) { GtkComboBox *combo_box = _combo_box; PurpleKeyring *in_use = purple_keyring_get_inuse(); |