From 7c1ec3723ad7367449c93e8559c27158b24a51dd Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Fri, 20 Aug 2010 13:25:21 -0400 Subject: Add e_load_cal_source_async(). Similar to e_load_book_source_async() in libedataserverui (and may wind up there eventually). This replaces e_auth_new_cal_from_source(). void e_load_cal_source_async (ESource *source, ECalSourceType source_type, icaltimezone *default_zone, GtkWindow *parent, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data); ECal * e_load_cal_source_finish (ESource *source, GAsyncResult *result, GError **error); --- modules/calendar/e-memo-shell-sidebar.c | 126 +++++++++++++++++--------------- 1 file changed, 68 insertions(+), 58 deletions(-) (limited to 'modules/calendar/e-memo-shell-sidebar.c') diff --git a/modules/calendar/e-memo-shell-sidebar.c b/modules/calendar/e-memo-shell-sidebar.c index 7b4b8f71b6..f463394fbd 100644 --- a/modules/calendar/e-memo-shell-sidebar.c +++ b/modules/calendar/e-memo-shell-sidebar.c @@ -54,6 +54,8 @@ struct _EMemoShellSidebarPrivate { * sometime later we update our default-client property * which is bound by an EBinding to ECalModel. */ ECal *default_client; + + GCancellable *loading_default_client; }; enum { @@ -235,104 +237,106 @@ memo_shell_sidebar_client_opened_cb (EMemoShellSidebar *memo_shell_sidebar, } static void -memo_shell_sidebar_default_opened_cb (EMemoShellSidebar *memo_shell_sidebar, - const GError *error, - ECal *client) +memo_shell_sidebar_default_loaded_cb (ESource *source, + GAsyncResult *result, + EShellSidebar *shell_sidebar) { + EMemoShellSidebarPrivate *priv; + EShellWindow *shell_window; EShellView *shell_view; - EShellSidebar *shell_sidebar; + ECal *client; + GError *error = NULL; + + priv = E_MEMO_SHELL_SIDEBAR_GET_PRIVATE (shell_sidebar); - shell_sidebar = E_SHELL_SIDEBAR (memo_shell_sidebar); shell_view = e_shell_sidebar_get_shell_view (shell_sidebar); + shell_window = e_shell_view_get_shell_window (shell_view); - if (g_error_matches (error, E_CALENDAR_ERROR, - E_CALENDAR_STATUS_AUTHENTICATION_FAILED) || - g_error_matches (error, E_CALENDAR_ERROR, - E_CALENDAR_STATUS_AUTHENTICATION_REQUIRED)) - e_auth_cal_forget_password (client); + client = e_load_cal_source_finish (source, result, &error); - /* Handle errors. */ - switch (error ? error->code : E_CALENDAR_STATUS_OK) { - case E_CALENDAR_STATUS_OK: - break; + if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + g_error_free (error); + goto exit; - case E_CALENDAR_STATUS_AUTHENTICATION_FAILED: - e_cal_open_async (client, FALSE); - return; + } else if (error != NULL) { + e_alert_run_dialog_for_args ( + GTK_WINDOW (shell_window), + "calendar:failed-open-memos", + error->message, NULL); + g_error_free (error); + goto exit; + } - case E_CALENDAR_STATUS_BUSY: - return; + g_return_if_fail (E_IS_CAL (client)); - default: - e_alert_run_dialog_for_args ( - GTK_WINDOW (e_shell_view_get_shell_window (shell_view)), - "calendar:failed-open-memos", - error->message, NULL); + if (priv->default_client != NULL) + g_object_unref (priv->default_client); - e_memo_shell_sidebar_remove_source ( - memo_shell_sidebar, - e_cal_get_source (client)); - return; - } + priv->default_client = client; - g_assert (error == NULL); + g_object_notify (G_OBJECT (shell_sidebar), "default-client"); - g_signal_handlers_disconnect_matched ( - client, G_SIGNAL_MATCH_FUNC, 0, 0, NULL, - memo_shell_sidebar_default_opened_cb, NULL); - - g_object_notify (G_OBJECT (memo_shell_sidebar), "default-client"); +exit: + g_object_unref (shell_sidebar); } static void memo_shell_sidebar_set_default (EMemoShellSidebar *memo_shell_sidebar, ESource *source) { + EMemoShellSidebarPrivate *priv; EShellView *shell_view; + EShellWindow *shell_window; EShellContent *shell_content; EShellSidebar *shell_sidebar; EMemoShellContent *memo_shell_content; ECalSourceType source_type; - GHashTable *client_table; ECalModel *model; ECal *client; icaltimezone *timezone; const gchar *uid; + priv = memo_shell_sidebar->priv; source_type = E_CAL_SOURCE_TYPE_JOURNAL; - client_table = memo_shell_sidebar->priv->client_table; - - uid = e_source_peek_uid (source); - client = g_hash_table_lookup (client_table, uid); - - if (memo_shell_sidebar->priv->default_client != NULL) - g_object_unref (memo_shell_sidebar->priv->default_client); - - if (client != NULL) - g_object_ref (client); - else - client = e_auth_new_cal_from_source (source, source_type); - - memo_shell_sidebar->priv->default_client = client; - g_return_if_fail (client != NULL); - - g_signal_connect_swapped ( - client, "cal-opened-ex", - G_CALLBACK (memo_shell_sidebar_default_opened_cb), - memo_shell_sidebar); /* FIXME Sidebar should not be accessing the EShellContent. * This probably needs to be moved to EMemoShellView. */ shell_sidebar = E_SHELL_SIDEBAR (memo_shell_sidebar); shell_view = e_shell_sidebar_get_shell_view (shell_sidebar); shell_content = e_shell_view_get_shell_content (shell_view); + shell_window = e_shell_view_get_shell_window (shell_view); memo_shell_content = E_MEMO_SHELL_CONTENT (shell_content); model = e_memo_shell_content_get_memo_model (memo_shell_content); timezone = e_cal_model_get_timezone (model); - e_cal_set_default_timezone (client, timezone, NULL); - e_cal_open_async (client, FALSE); + /* Cancel any unfinished previous request. */ + if (priv->loading_default_client != NULL) { + g_cancellable_cancel (priv->loading_default_client); + g_object_unref (priv->loading_default_client); + priv->loading_default_client = NULL; + } + + uid = e_source_peek_uid (source); + client = g_hash_table_lookup (priv->client_table, uid); + + /* If we already have an open connection for + * this UID, we can finish immediately. */ + if (client != NULL) { + if (priv->default_client != NULL) + g_object_unref (priv->default_client); + priv->default_client = g_object_ref (client); + g_object_notify (G_OBJECT (shell_sidebar), "default-client"); + return; + } + + priv->loading_default_client = g_cancellable_new (); + + e_load_cal_source_async ( + source, source_type, timezone, + GTK_WINDOW (shell_window), priv->loading_default_client, + (GAsyncReadyCallback) memo_shell_sidebar_default_loaded_cb, + g_object_ref (shell_sidebar)); } static void @@ -538,6 +542,12 @@ memo_shell_sidebar_dispose (GObject *object) priv->default_client = NULL; } + if (priv->loading_default_client != NULL) { + g_cancellable_cancel (priv->loading_default_client); + g_object_unref (priv->loading_default_client); + priv->loading_default_client = NULL; + } + g_hash_table_remove_all (priv->client_table); /* Chain up to parent's dispose() method. */ -- cgit v1.2.3