diff options
author | Milan Crha <mcrha@redhat.com> | 2014-05-13 01:47:16 +0800 |
---|---|---|
committer | Milan Crha <mcrha@redhat.com> | 2014-05-13 01:47:16 +0800 |
commit | d46ad6d3cd44c3c9b730566cbd7719c2961a9bc9 (patch) | |
tree | bdc2d2362021b2da8b8b0eaab55ca28af61122ca /modules | |
parent | 4508696844c20530bdf7fe6150c432eb16a9c77b (diff) | |
download | gsoc2013-evolution-d46ad6d3cd44c3c9b730566cbd7719c2961a9bc9.tar gsoc2013-evolution-d46ad6d3cd44c3c9b730566cbd7719c2961a9bc9.tar.gz gsoc2013-evolution-d46ad6d3cd44c3c9b730566cbd7719c2961a9bc9.tar.bz2 gsoc2013-evolution-d46ad6d3cd44c3c9b730566cbd7719c2961a9bc9.tar.lz gsoc2013-evolution-d46ad6d3cd44c3c9b730566cbd7719c2961a9bc9.tar.xz gsoc2013-evolution-d46ad6d3cd44c3c9b730566cbd7719c2961a9bc9.tar.zst gsoc2013-evolution-d46ad6d3cd44c3c9b730566cbd7719c2961a9bc9.zip |
Bug #678843 - May re-prompt password on account re-enable
Diffstat (limited to 'modules')
-rw-r--r-- | modules/addressbook/e-book-shell-sidebar.c | 3 | ||||
-rw-r--r-- | modules/addressbook/e-book-shell-view-actions.c | 129 | ||||
-rw-r--r-- | modules/addressbook/e-book-shell-view-private.c | 2 | ||||
-rw-r--r-- | modules/calendar/e-cal-shell-sidebar.c | 4 | ||||
-rw-r--r-- | modules/calendar/e-cal-shell-view-actions.c | 12 | ||||
-rw-r--r-- | modules/calendar/e-cal-shell-view.c | 83 | ||||
-rw-r--r-- | modules/calendar/e-cal-shell-view.h | 5 | ||||
-rw-r--r-- | modules/calendar/e-memo-shell-sidebar.c | 4 | ||||
-rw-r--r-- | modules/calendar/e-memo-shell-view-actions.c | 12 | ||||
-rw-r--r-- | modules/calendar/e-task-shell-sidebar.c | 4 | ||||
-rw-r--r-- | modules/calendar/e-task-shell-view-actions.c | 12 | ||||
-rw-r--r-- | modules/mail/e-mail-shell-view-actions.c | 69 |
12 files changed, 283 insertions, 56 deletions
diff --git a/modules/addressbook/e-book-shell-sidebar.c b/modules/addressbook/e-book-shell-sidebar.c index 1138ce3a6c..393ddc6148 100644 --- a/modules/addressbook/e-book-shell-sidebar.c +++ b/modules/addressbook/e-book-shell-sidebar.c @@ -225,6 +225,9 @@ book_shell_sidebar_check_state (EShellSidebar *shell_sidebar) refresh_supported = e_client_check_refresh_supported (client); g_object_unref (client); + } else { + /* It's also used to allow-auth-prompt for the source */ + refresh_supported = TRUE; } g_object_unref (source); diff --git a/modules/addressbook/e-book-shell-view-actions.c b/modules/addressbook/e-book-shell-view-actions.c index ba935c3966..57fd7e9df9 100644 --- a/modules/addressbook/e-book-shell-view-actions.c +++ b/modules/addressbook/e-book-shell-view-actions.c @@ -200,34 +200,96 @@ action_address_book_properties_cb (GtkAction *action, } static void +address_book_handle_refresh_done (ESource *source, + EActivity *activity, + const GError *error) +{ + EAlertSink *alert_sink; + const gchar *display_name; + + alert_sink = e_activity_get_alert_sink (activity); + display_name = e_source_get_display_name (source); + + if (e_activity_handle_cancellation (activity, error)) { + /* nothing to do */ + + } else if (error != NULL) { + e_alert_submit ( + alert_sink, + "addressbook:refresh-error", + display_name, error->message, NULL); + + } else { + e_activity_set_state (activity, E_ACTIVITY_COMPLETED); + } +} + +static void address_book_refresh_done_cb (GObject *source_object, GAsyncResult *result, gpointer user_data) { EClient *client; - GError *error = NULL; + ESource *source; + EActivity *activity; + GError *local_error = NULL; g_return_if_fail (E_IS_CLIENT (source_object)); client = E_CLIENT (source_object); + source = e_client_get_source (client); + activity = user_data; - e_client_refresh_finish (client, result, &error); + e_util_allow_auth_prompt_and_refresh_client_finish (client, result, &local_error); - if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { - g_error_free (error); + address_book_handle_refresh_done (source, activity, local_error); - } else if (error != NULL) { - ESource *source; + g_clear_object (&activity); + g_clear_error (&local_error); +} - source = e_client_get_source (client); +typedef struct _AllowAuthPromptData { + EActivity *activity; + ESourceSelector *selector; +} AllowAuthPromptData; - g_warning ( - "%s: Failed to refresh '%s', %s", - G_STRFUNC, e_source_get_display_name (source), - error ? error->message : "Unknown error"); +static void +address_book_allow_auth_prompt_done_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + ESource *source; + ESourceSelector *selector; + EActivity *activity; + AllowAuthPromptData *data = user_data; + GError *local_error = NULL; - g_error_free (error); + g_return_if_fail (E_IS_SOURCE (source_object)); + g_return_if_fail (user_data != NULL); + + source = E_SOURCE (source_object); + activity = data->activity; + selector = data->selector; + + g_free (data); + + e_source_allow_auth_prompt_finish (source, result, &local_error); + + address_book_handle_refresh_done (source, activity, local_error); + + if (!local_error) { + ESource *primary; + + primary = e_source_selector_ref_primary_selection (selector); + if (primary == source) + e_source_selector_set_primary_selection (selector, source); + + g_clear_object (&primary); } + + g_clear_object (&activity); + g_clear_object (&selector); + g_clear_error (&local_error); } static void @@ -238,15 +300,46 @@ action_address_book_refresh_cb (GtkAction *action, ESourceSelector *selector; EClient *client = NULL; ESource *source; + EActivity *activity; + EAlertSink *alert_sink; + EShellBackend *shell_backend; + EShellContent *shell_content; + EShellView *shell_view; + GCancellable *cancellable; book_shell_sidebar = book_shell_view->priv->book_shell_sidebar; selector = e_book_shell_sidebar_get_selector (book_shell_sidebar); + shell_view = E_SHELL_VIEW (book_shell_view); + shell_backend = e_shell_view_get_shell_backend (shell_view); + shell_content = e_shell_view_get_shell_content (shell_view); + source = e_source_selector_ref_primary_selection (selector); if (source != NULL) { client = e_client_selector_ref_cached_client ( E_CLIENT_SELECTOR (selector), source); + if (!client) { + AllowAuthPromptData *data; + + alert_sink = E_ALERT_SINK (shell_content); + activity = e_activity_new (); + cancellable = g_cancellable_new (); + + e_activity_set_alert_sink (activity, alert_sink); + e_activity_set_cancellable (activity, cancellable); + + data = g_new0 (AllowAuthPromptData, 1); + data->activity = activity; + data->selector = g_object_ref (selector); + + e_source_allow_auth_prompt (source, cancellable, address_book_allow_auth_prompt_done_cb, data); + + e_shell_backend_add_activity (shell_backend, activity); + + g_object_unref (cancellable); + } + g_object_unref (source); } @@ -255,8 +348,18 @@ action_address_book_refresh_cb (GtkAction *action, g_return_if_fail (e_client_check_refresh_supported (client)); - e_client_refresh (client, NULL, address_book_refresh_done_cb, book_shell_view); + alert_sink = E_ALERT_SINK (shell_content); + activity = e_activity_new (); + cancellable = g_cancellable_new (); + + e_activity_set_alert_sink (activity, alert_sink); + e_activity_set_cancellable (activity, cancellable); + + e_util_allow_auth_prompt_and_refresh_client (client, cancellable, address_book_refresh_done_cb, activity); + + e_shell_backend_add_activity (shell_backend, activity); + g_object_unref (cancellable); g_object_unref (client); } diff --git a/modules/addressbook/e-book-shell-view-private.c b/modules/addressbook/e-book-shell-view-private.c index b931c16576..3703318c9b 100644 --- a/modules/addressbook/e-book-shell-view-private.c +++ b/modules/addressbook/e-book-shell-view-private.c @@ -339,7 +339,7 @@ book_shell_view_activate_selected_source (EBookShellView *book_shell_view, /* XXX No way to cancel this? */ e_client_selector_get_client ( E_CLIENT_SELECTOR (selector), - source, NULL, + source, TRUE, NULL, book_shell_view_client_connect_cb, g_object_ref (view)); diff --git a/modules/calendar/e-cal-shell-sidebar.c b/modules/calendar/e-cal-shell-sidebar.c index 28b8d46d4c..dbecf6d989 100644 --- a/modules/calendar/e-cal-shell-sidebar.c +++ b/modules/calendar/e-cal-shell-sidebar.c @@ -351,7 +351,7 @@ cal_shell_sidebar_set_default (ECalShellSidebar *cal_shell_sidebar, priv->connecting_default_client = g_object_ref (closure->activity); e_client_selector_get_client ( - E_CLIENT_SELECTOR (selector), source, + E_CLIENT_SELECTOR (selector), source, TRUE, e_activity_get_cancellable (closure->activity), cal_shell_sidebar_default_connect_cb, closure); } @@ -853,7 +853,7 @@ e_cal_shell_sidebar_add_source (ECalShellSidebar *cal_shell_sidebar, closure = connect_closure_new (cal_shell_sidebar, source); e_client_selector_get_client ( - E_CLIENT_SELECTOR (selector), source, + E_CLIENT_SELECTOR (selector), source, TRUE, e_activity_get_cancellable (closure->activity), cal_shell_sidebar_client_connect_cb, closure); } diff --git a/modules/calendar/e-cal-shell-view-actions.c b/modules/calendar/e-cal-shell-view-actions.c index 660be9c267..93e61aae41 100644 --- a/modules/calendar/e-cal-shell-view-actions.c +++ b/modules/calendar/e-cal-shell-view-actions.c @@ -23,6 +23,7 @@ #endif #include "e-cal-shell-view-private.h" +#include "e-cal-shell-view.h" /* This is for radio action groups whose value is persistent. We * initialize it to a bogus value to ensure a "changed" signal is @@ -374,7 +375,6 @@ action_calendar_refresh_cb (GtkAction *action, ESourceSelector *selector; EClient *client = NULL; ESource *source; - GError *error = NULL; cal_shell_sidebar = cal_shell_view->priv->cal_shell_sidebar; selector = e_cal_shell_sidebar_get_selector (cal_shell_sidebar); @@ -392,15 +392,7 @@ action_calendar_refresh_cb (GtkAction *action, g_return_if_fail (e_client_check_refresh_supported (client)); - e_client_refresh_sync (client, NULL, &error); - - if (error != NULL) { - g_warning ( - "%s: Failed to refresh '%s', %s", - G_STRFUNC, e_source_get_display_name (source), - error->message); - g_error_free (error); - } + e_cal_shell_view_allow_auth_prompt_and_refresh (E_SHELL_VIEW (cal_shell_view), client); g_object_unref (client); } diff --git a/modules/calendar/e-cal-shell-view.c b/modules/calendar/e-cal-shell-view.c index a703cbc076..41d6d54a43 100644 --- a/modules/calendar/e-cal-shell-view.c +++ b/modules/calendar/e-cal-shell-view.c @@ -629,3 +629,86 @@ e_cal_shell_view_type_register (GTypeModule *type_module) e_cal_shell_view_register_type (type_module); } +static void +cal_shell_view_allow_auth_prompt_and_refresh_done_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + EClient *client; + EActivity *activity; + EAlertSink *alert_sink; + ESource *source; + const gchar *display_name; + GError *local_error = NULL; + + g_return_if_fail (E_IS_CAL_CLIENT (source_object)); + + client = E_CLIENT (source_object); + source = e_client_get_source (client); + activity = user_data; + alert_sink = e_activity_get_alert_sink (activity); + display_name = e_source_get_display_name (source); + + e_util_allow_auth_prompt_and_refresh_client_finish (client, result, &local_error); + + if (e_activity_handle_cancellation (activity, local_error)) { + g_error_free (local_error); + + } else if (local_error != NULL) { + const gchar *error_message; + + switch (e_cal_client_get_source_type (E_CAL_CLIENT (client))) { + default: + case E_CAL_CLIENT_SOURCE_TYPE_EVENTS: + error_message = "calendar:refresh-error-events"; + break; + case E_CAL_CLIENT_SOURCE_TYPE_TASKS: + error_message = "calendar:refresh-error-tasks"; + break; + case E_CAL_CLIENT_SOURCE_TYPE_MEMOS: + error_message = "calendar:refresh-error-memos"; + break; + } + e_alert_submit ( + alert_sink, + error_message, + display_name, local_error->message, NULL); + g_error_free (local_error); + + } else { + e_activity_set_state (activity, E_ACTIVITY_COMPLETED); + } + + g_clear_object (&activity); +} + +void +e_cal_shell_view_allow_auth_prompt_and_refresh (EShellView *shell_view, + EClient *client) +{ + EShellBackend *shell_backend; + EShellContent *shell_content; + EActivity *activity; + EAlertSink *alert_sink; + GCancellable *cancellable; + + g_return_if_fail (E_IS_SHELL_VIEW (shell_view)); + g_return_if_fail (E_IS_CLIENT (client)); + + shell_backend = e_shell_view_get_shell_backend (shell_view); + shell_content = e_shell_view_get_shell_content (shell_view); + + alert_sink = E_ALERT_SINK (shell_content); + activity = e_activity_new (); + cancellable = g_cancellable_new (); + + e_activity_set_alert_sink (activity, alert_sink); + e_activity_set_cancellable (activity, cancellable); + + e_util_allow_auth_prompt_and_refresh_client (client, cancellable, + cal_shell_view_allow_auth_prompt_and_refresh_done_cb, activity); + + e_shell_backend_add_activity (shell_backend, activity); + + g_object_unref (cancellable); +} diff --git a/modules/calendar/e-cal-shell-view.h b/modules/calendar/e-cal-shell-view.h index 9057faf9d9..d01a77e731 100644 --- a/modules/calendar/e-cal-shell-view.h +++ b/modules/calendar/e-cal-shell-view.h @@ -21,6 +21,7 @@ #ifndef E_CAL_SHELL_VIEW_H #define E_CAL_SHELL_VIEW_H +#include <e-util/e-util.h> #include <shell/e-shell-view.h> /* Standard GObject macros */ @@ -60,6 +61,10 @@ struct _ECalShellViewClass { GType e_cal_shell_view_get_type (void); void e_cal_shell_view_type_register (GTypeModule *type_module); +void e_cal_shell_view_allow_auth_prompt_and_refresh + (EShellView *shell_view, + EClient *client); + G_END_DECLS #endif /* E_CAL_SHELL_VIEW_H */ diff --git a/modules/calendar/e-memo-shell-sidebar.c b/modules/calendar/e-memo-shell-sidebar.c index 8575da2745..72408dc497 100644 --- a/modules/calendar/e-memo-shell-sidebar.c +++ b/modules/calendar/e-memo-shell-sidebar.c @@ -349,7 +349,7 @@ memo_shell_sidebar_set_default (EMemoShellSidebar *memo_shell_sidebar, priv->connecting_default_client = g_object_ref (closure->activity); e_client_selector_get_client ( - E_CLIENT_SELECTOR (selector), source, + E_CLIENT_SELECTOR (selector), source, TRUE, e_activity_get_cancellable (closure->activity), memo_shell_sidebar_default_connect_cb, closure); } @@ -780,7 +780,7 @@ e_memo_shell_sidebar_add_source (EMemoShellSidebar *memo_shell_sidebar, closure = connect_closure_new (memo_shell_sidebar, source); e_client_selector_get_client ( - E_CLIENT_SELECTOR (selector), source, + E_CLIENT_SELECTOR (selector), source, TRUE, e_activity_get_cancellable (closure->activity), memo_shell_sidebar_client_connect_cb, closure); } diff --git a/modules/calendar/e-memo-shell-view-actions.c b/modules/calendar/e-memo-shell-view-actions.c index cea084e293..35ab8cc879 100644 --- a/modules/calendar/e-memo-shell-view-actions.c +++ b/modules/calendar/e-memo-shell-view-actions.c @@ -23,6 +23,7 @@ #endif #include "e-memo-shell-view-private.h" +#include "e-cal-shell-view.h" static void action_memo_delete_cb (GtkAction *action, @@ -277,7 +278,6 @@ action_memo_list_refresh_cb (GtkAction *action, ESourceSelector *selector; EClient *client = NULL; ESource *source; - GError *error = NULL; memo_shell_sidebar = memo_shell_view->priv->memo_shell_sidebar; selector = e_memo_shell_sidebar_get_selector (memo_shell_sidebar); @@ -295,15 +295,7 @@ action_memo_list_refresh_cb (GtkAction *action, g_return_if_fail (e_client_check_refresh_supported (client)); - e_client_refresh_sync (client, NULL, &error); - - if (error != NULL) { - g_warning ( - "%s: Failed to refresh '%s', %s", - G_STRFUNC, e_source_get_display_name (source), - error->message); - g_error_free (error); - } + e_cal_shell_view_allow_auth_prompt_and_refresh (E_SHELL_VIEW (memo_shell_view), client); g_object_unref (client); } diff --git a/modules/calendar/e-task-shell-sidebar.c b/modules/calendar/e-task-shell-sidebar.c index d858a9f94a..10d8bdcc2c 100644 --- a/modules/calendar/e-task-shell-sidebar.c +++ b/modules/calendar/e-task-shell-sidebar.c @@ -349,7 +349,7 @@ task_shell_sidebar_set_default (ETaskShellSidebar *task_shell_sidebar, priv->connecting_default_client = g_object_ref (closure->activity); e_client_selector_get_client ( - E_CLIENT_SELECTOR (selector), source, + E_CLIENT_SELECTOR (selector), source, TRUE, e_activity_get_cancellable (closure->activity), task_shell_sidebar_default_connect_cb, closure); } @@ -780,7 +780,7 @@ e_task_shell_sidebar_add_source (ETaskShellSidebar *task_shell_sidebar, closure = connect_closure_new (task_shell_sidebar, source); e_client_selector_get_client ( - E_CLIENT_SELECTOR (selector), source, + E_CLIENT_SELECTOR (selector), source, TRUE, e_activity_get_cancellable (closure->activity), task_shell_sidebar_client_connect_cb, closure); } diff --git a/modules/calendar/e-task-shell-view-actions.c b/modules/calendar/e-task-shell-view-actions.c index 99754570aa..39c7032492 100644 --- a/modules/calendar/e-task-shell-view-actions.c +++ b/modules/calendar/e-task-shell-view-actions.c @@ -23,6 +23,7 @@ #endif #include "e-task-shell-view-private.h" +#include "e-cal-shell-view.h" static void action_task_assign_cb (GtkAction *action, @@ -300,7 +301,6 @@ action_task_list_refresh_cb (GtkAction *action, ESourceSelector *selector; EClient *client = NULL; ESource *source; - GError *error = NULL; task_shell_sidebar = task_shell_view->priv->task_shell_sidebar; selector = e_task_shell_sidebar_get_selector (task_shell_sidebar); @@ -318,15 +318,7 @@ action_task_list_refresh_cb (GtkAction *action, g_return_if_fail (e_client_check_refresh_supported (client)); - e_client_refresh_sync (client, NULL, &error); - - if (error != NULL) { - g_warning ( - "%s: Failed to refresh '%s', %s", - G_STRFUNC, e_source_get_display_name (source), - error->message); - g_error_free (error); - } + e_cal_shell_view_allow_auth_prompt_and_refresh (E_SHELL_VIEW (task_shell_view), client); g_object_unref (client); } diff --git a/modules/mail/e-mail-shell-view-actions.c b/modules/mail/e-mail-shell-view-actions.c index 76159950a5..292aa96c48 100644 --- a/modules/mail/e-mail-shell-view-actions.c +++ b/modules/mail/e-mail-shell-view-actions.c @@ -156,6 +156,54 @@ account_refresh_folder_info_received_cb (GObject *source, g_clear_object (&activity); } +typedef struct _RefreshData +{ + EActivity *activity; + CamelStore *store; +} RefreshData; + +static void +account_refresh_allow_auth_prompt_done_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + RefreshData *data = user_data; + EActivity *activity; + CamelStore *store; + GError *local_error = NULL; + + g_return_if_fail (data != NULL); + + activity = data->activity; + store = data->store; + + g_free (data); + + e_source_allow_auth_prompt_finish (E_SOURCE (source_object), result, &local_error); + + if (e_activity_handle_cancellation (activity, local_error)) { + g_error_free (local_error); + g_clear_object (&activity); + } else { + GCancellable *cancellable; + + if (local_error) { + g_debug ("%s: Failed with: %s", G_STRFUNC, local_error->message); + g_clear_error (&local_error); + } + + cancellable = e_activity_get_cancellable (activity); + + camel_store_get_folder_info ( + store, NULL, + CAMEL_STORE_FOLDER_INFO_RECURSIVE, + G_PRIORITY_DEFAULT, cancellable, + account_refresh_folder_info_received_cb, activity); + } + + g_object_unref (store); +} + static void action_mail_account_refresh_cb (GtkAction *action, EMailShellView *mail_shell_view) @@ -165,8 +213,12 @@ action_mail_account_refresh_cb (GtkAction *action, EMFolderTree *folder_tree; EMailView *mail_view; EActivity *activity; + ESourceRegistry *registry; + ESource *source; + EShell *shell; CamelStore *store; GCancellable *cancellable; + RefreshData *data; mail_shell_content = mail_shell_view->priv->mail_shell_content; mail_shell_sidebar = mail_shell_view->priv->mail_shell_sidebar; @@ -179,13 +231,18 @@ action_mail_account_refresh_cb (GtkAction *action, activity = e_mail_reader_new_activity (E_MAIL_READER (mail_view)); cancellable = e_activity_get_cancellable (activity); - camel_store_get_folder_info ( - store, NULL, - CAMEL_STORE_FOLDER_INFO_RECURSIVE, - G_PRIORITY_DEFAULT, cancellable, - account_refresh_folder_info_received_cb, activity); + data = g_new0 (RefreshData, 1); + data->activity = activity; + data->store = store; - g_object_unref (store); + shell = e_shell_backend_get_shell (e_shell_view_get_shell_backend (E_SHELL_VIEW (mail_shell_view))); + registry = e_shell_get_registry (shell); + source = e_source_registry_ref_source (registry, camel_service_get_uid (CAMEL_SERVICE (store))); + g_return_if_fail (source != NULL); + + e_source_allow_auth_prompt (source, cancellable, account_refresh_allow_auth_prompt_done_cb, data); + + g_clear_object (&source); } static void |