From f19241d136043d5cfffbfbaf5b2d6d1affc70682 Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Wed, 23 Jan 2013 16:05:08 -0500 Subject: Use e_cal_client_connect(). Instead of e_client_utils_open_new() or e_cal_client_new(). --- modules/calendar/e-memo-shell-sidebar.c | 424 ++++++++++++++++++-------------- 1 file changed, 240 insertions(+), 184 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 5251763944..24e6f841d1 100644 --- a/modules/calendar/e-memo-shell-sidebar.c +++ b/modules/calendar/e-memo-shell-sidebar.c @@ -40,6 +40,8 @@ (G_TYPE_INSTANCE_GET_PRIVATE \ ((obj), E_TYPE_MEMO_SHELL_SIDEBAR, EMemoShellSidebarPrivate)) +typedef struct _ConnectClosure ConnectClosure; + struct _EMemoShellSidebarPrivate { GtkWidget *selector; @@ -53,14 +55,23 @@ struct _EMemoShellSidebarPrivate { * opened. So the user first highlights a source, then * sometime later we update our default-client property * which is bound by an EBinding to ECalModel. */ - ECalClient *default_client; + EClient *default_client; - ESource *loading_default_source_instance; /* not-reffed, only for comparison */ + /* Not referenced, only for pointer comparison. */ + ESource *connecting_default_source_instance; - GCancellable *loading_default_client; + GCancellable *connecting_default_client; GCancellable *loading_clients; }; +struct _ConnectClosure { + EMemoShellSidebar *memo_shell_sidebar; + + /* For error messages. */ + gchar *source_display_name; + gchar *parent_display_name; +}; + enum { PROP_0, PROP_DEFAULT_CLIENT, @@ -81,9 +92,45 @@ G_DEFINE_DYNAMIC_TYPE ( e_memo_shell_sidebar, E_TYPE_SHELL_SIDEBAR) +static ConnectClosure * +connect_closure_new (EMemoShellSidebar *memo_shell_sidebar, + ESource *source) +{ + ConnectClosure *closure; + ESourceRegistry *registry; + ESourceSelector *selector; + ESource *parent; + const gchar *parent_uid; + + selector = e_memo_shell_sidebar_get_selector (memo_shell_sidebar); + registry = e_source_selector_get_registry (selector); + parent_uid = e_source_get_parent (source); + parent = e_source_registry_ref_source (registry, parent_uid); + + closure = g_slice_new0 (ConnectClosure); + closure->memo_shell_sidebar = g_object_ref (memo_shell_sidebar); + closure->source_display_name = e_source_dup_display_name (source); + closure->parent_display_name = e_source_dup_display_name (parent); + + g_object_unref (parent); + + return closure; +} + +static void +connect_closure_free (ConnectClosure *closure) +{ + g_object_unref (closure->memo_shell_sidebar); + + g_free (closure->source_display_name); + g_free (closure->parent_display_name); + + g_slice_free (ConnectClosure, closure); +} + static void memo_shell_sidebar_emit_client_added (EMemoShellSidebar *memo_shell_sidebar, - ECalClient *client) + EClient *client) { guint signal_id = signals[CLIENT_ADDED]; @@ -185,170 +232,170 @@ memo_shell_sidebar_backend_error_cb (EMemoShellSidebar *memo_shell_sidebar, } static void -memo_shell_sidebar_retrieve_capabilies_cb (GObject *source_object, - GAsyncResult *result, - gpointer user_data) +memo_shell_sidebar_handle_connect_error (EMemoShellSidebar *memo_shell_sidebar, + const gchar *parent_display_name, + const gchar *source_display_name, + const GError *error) { - ECalClient *client = E_CAL_CLIENT (source_object); - EMemoShellSidebar *memo_shell_sidebar = user_data; - gchar *capabilities = NULL; + EShellView *shell_view; + EShellContent *shell_content; + EShellSidebar *shell_sidebar; + gboolean cancelled = FALSE; + gboolean offline_error; - g_return_if_fail (client != NULL); - g_return_if_fail (memo_shell_sidebar != NULL); + 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); - e_client_retrieve_capabilities_finish ( - E_CLIENT (client), result, &capabilities, NULL); - g_free (capabilities); + cancelled |= g_error_matches ( + error, G_IO_ERROR, G_IO_ERROR_CANCELLED); + cancelled |= g_error_matches ( + error, E_CLIENT_ERROR, E_CLIENT_ERROR_CANCELLED); - memo_shell_sidebar_emit_status_message ( - memo_shell_sidebar, _("Loading memos")); - memo_shell_sidebar_emit_client_added (memo_shell_sidebar, client); - memo_shell_sidebar_emit_status_message (memo_shell_sidebar, NULL); + offline_error = g_error_matches ( + error, E_CLIENT_ERROR, E_CLIENT_ERROR_REPOSITORY_OFFLINE); + + if (cancelled) { + /* do nothing */ + } else if (offline_error) { + e_alert_submit ( + E_ALERT_SINK (shell_content), + "calendar:prompt-no-contents-offline-calendar", + parent_display_name, + source_display_name, + NULL); + } else { + e_alert_submit ( + E_ALERT_SINK (shell_content), + "calendar:failed-open-calendar", + parent_display_name, + source_display_name, + error->message, + NULL); + } } static void -memo_shell_sidebar_client_opened_cb (GObject *source_object, - GAsyncResult *result, - gpointer user_data) +memo_shell_sidebar_client_connect_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) { - ECalClient *client = E_CAL_CLIENT (source_object); - EMemoShellSidebar *memo_shell_sidebar = user_data; - ESource *source, *parent; - EShellView *shell_view; + EClient *client; + ConnectClosure *closure = user_data; + EMemoShellContent *memo_shell_content; EShellContent *shell_content; EShellSidebar *shell_sidebar; - ESourceRegistry *registry; + EShellView *shell_view; + ECalModel *model; + icaltimezone *timezone; GError *error = NULL; - source = e_client_get_source (E_CLIENT (client)); + client = e_cal_client_connect_finish (result, &error); - e_client_open_finish (E_CLIENT (client), result, &error); + /* Sanity check. */ + g_return_if_fail ( + ((client != NULL) && (error == NULL)) || + ((client == NULL) && (error != NULL))); - if (g_error_matches (error, E_CLIENT_ERROR, E_CLIENT_ERROR_CANCELLED) || - g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { - g_clear_error (&error); - return; + if (error != NULL) { + memo_shell_sidebar_handle_connect_error ( + closure->memo_shell_sidebar, + closure->parent_display_name, + closure->source_display_name, + error); + g_error_free (error); + goto exit; } - shell_sidebar = E_SHELL_SIDEBAR (memo_shell_sidebar); + /* FIXME Sidebar should not be accessing the EShellContent. + * This probably needs to be moved to EMemoShellView. */ + shell_sidebar = E_SHELL_SIDEBAR (closure->memo_shell_sidebar); shell_view = e_shell_sidebar_get_shell_view (shell_sidebar); shell_content = e_shell_view_get_shell_content (shell_view); - registry = e_shell_get_registry (e_shell_backend_get_shell (e_shell_view_get_shell_backend (shell_view))); - parent = e_source_registry_ref_source (registry, e_source_get_parent (source)); - - /* Handle errors. */ - switch ((error && error->domain == E_CLIENT_ERROR) ? error->code : -1) { - case -1: - break; - - case E_CLIENT_ERROR_REPOSITORY_OFFLINE: - e_alert_submit ( - E_ALERT_SINK (shell_content), - "calendar:prompt-no-contents-offline-memos", - e_source_get_display_name (parent), - e_source_get_display_name (source), NULL); - /* fall through */ - - default: - if (error->code != E_CLIENT_ERROR_REPOSITORY_OFFLINE) { - e_alert_submit ( - E_ALERT_SINK (shell_content), - "calendar:failed-open-memos", - e_source_get_display_name (parent), - e_source_get_display_name (source), - error->message, NULL); - } - - e_memo_shell_sidebar_remove_source ( - memo_shell_sidebar, - e_client_get_source (E_CLIENT (client))); - g_clear_error (&error); - g_object_unref (parent); - return; - } - g_clear_error (&error); - g_object_unref (parent); + 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); - /* to have them ready for later use */ - e_client_retrieve_capabilities ( - E_CLIENT (client), NULL, - memo_shell_sidebar_retrieve_capabilies_cb, - memo_shell_sidebar); + e_cal_client_set_default_timezone (E_CAL_CLIENT (client), timezone); + + e_memo_shell_sidebar_add_client (closure->memo_shell_sidebar, client); + + g_object_unref (client); + +exit: + connect_closure_free (closure); } static void -memo_shell_sidebar_default_loaded_cb (GObject *source_object, - GAsyncResult *result, - gpointer user_data) +memo_shell_sidebar_default_connect_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) { - ESource *source = E_SOURCE (source_object); - EShellSidebar *shell_sidebar = user_data; + EClient *client; + ESource *source; + ConnectClosure *closure = user_data; EMemoShellSidebarPrivate *priv; EShellContent *shell_content; + EShellSidebar *shell_sidebar; EShellView *shell_view; EMemoShellContent *memo_shell_content; ECalModel *model; - EClient *client = NULL; + icaltimezone *timezone; GError *error = NULL; - priv = E_MEMO_SHELL_SIDEBAR_GET_PRIVATE (shell_sidebar); + priv = E_MEMO_SHELL_SIDEBAR_GET_PRIVATE (closure->memo_shell_sidebar); - shell_view = e_shell_sidebar_get_shell_view (shell_sidebar); - shell_content = e_shell_view_get_shell_content (shell_view); - memo_shell_content = E_MEMO_SHELL_CONTENT (shell_content); - model = e_memo_shell_content_get_memo_model (memo_shell_content); + client = e_cal_client_connect_finish (result, &error); - e_client_utils_open_new_finish (source, result, &client, &error); + /* Sanity check. */ + g_return_if_fail ( + ((client != NULL) && (error == NULL)) || + ((client == NULL) && (error != NULL))); - if (priv->loading_default_client) { - g_object_unref (priv->loading_default_client); - priv->loading_default_client = NULL; + if (priv->connecting_default_client) { + g_object_unref (priv->connecting_default_client); + priv->connecting_default_client = NULL; } - if (source == priv->loading_default_source_instance) - priv->loading_default_source_instance = NULL; - - /* Ignore cancellations. */ - if (g_error_matches (error, E_CLIENT_ERROR, E_CLIENT_ERROR_CANCELLED) || - g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { - g_warn_if_fail (client == NULL); + if (error != NULL) { + memo_shell_sidebar_handle_connect_error ( + closure->memo_shell_sidebar, + closure->parent_display_name, + closure->source_display_name, + error); g_error_free (error); goto exit; - - } else if (error != NULL) { - ESourceRegistry *registry; - ESource *parent; - - registry = e_shell_get_registry (e_shell_backend_get_shell (e_shell_view_get_shell_backend (shell_view))); - parent = e_source_registry_ref_source (registry, e_source_get_parent (source)); - - g_warn_if_fail (client == NULL); - e_alert_submit ( - E_ALERT_SINK (shell_content), - "calendar:failed-open-memos", - e_source_get_display_name (parent), - e_source_get_display_name (source), - error->message, NULL); - g_error_free (error); - g_object_unref (parent); - goto exit; } - g_return_if_fail (E_IS_CAL_CLIENT (client)); + source = e_client_get_source (client); + + if (source == priv->connecting_default_source_instance) + priv->connecting_default_source_instance = NULL; if (priv->default_client != NULL) g_object_unref (priv->default_client); - priv->default_client = E_CAL_CLIENT (client); + priv->default_client = g_object_ref (client); - e_cal_client_set_default_timezone ( - priv->default_client, e_cal_model_get_timezone (model)); + /* FIXME Sidebar should not be accessing the EShellContent. + * This probably needs to be moved to EMemoShellView. */ + shell_sidebar = E_SHELL_SIDEBAR (closure->memo_shell_sidebar); + shell_view = e_shell_sidebar_get_shell_view (shell_sidebar); + shell_content = e_shell_view_get_shell_content (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_client_set_default_timezone (E_CAL_CLIENT (client), timezone); g_object_notify (G_OBJECT (shell_sidebar), "default-client"); - exit: - g_object_unref (shell_sidebar); + g_object_unref (client); + +exit: + connect_closure_free (closure); } static void @@ -363,7 +410,7 @@ memo_shell_sidebar_set_default (EMemoShellSidebar *memo_shell_sidebar, priv = memo_shell_sidebar->priv; /* already loading that source as default source */ - if (source == priv->loading_default_source_instance) + if (source == priv->connecting_default_source_instance) return; /* FIXME Sidebar should not be accessing the EShellContent. @@ -371,10 +418,10 @@ memo_shell_sidebar_set_default (EMemoShellSidebar *memo_shell_sidebar, shell_sidebar = E_SHELL_SIDEBAR (memo_shell_sidebar); /* 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; + if (priv->connecting_default_client != NULL) { + g_cancellable_cancel (priv->connecting_default_client); + g_object_unref (priv->connecting_default_client); + priv->connecting_default_client = NULL; } uid = e_source_get_uid (source); @@ -391,14 +438,14 @@ memo_shell_sidebar_set_default (EMemoShellSidebar *memo_shell_sidebar, } /* it's only for pointer comparison, no need to ref it */ - priv->loading_default_source_instance = source; - priv->loading_default_client = g_cancellable_new (); - - e_client_utils_open_new ( - source, E_CLIENT_SOURCE_TYPE_MEMOS, - FALSE, priv->loading_default_client, - memo_shell_sidebar_default_loaded_cb, - g_object_ref (shell_sidebar)); + priv->connecting_default_source_instance = source; + priv->connecting_default_client = g_cancellable_new (); + + e_cal_client_connect ( + source, E_CAL_CLIENT_SOURCE_TYPE_MEMOS, + priv->connecting_default_client, + memo_shell_sidebar_default_connect_cb, + connect_closure_new (memo_shell_sidebar, source)); } static void @@ -533,10 +580,10 @@ 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; + if (priv->connecting_default_client != NULL) { + g_cancellable_cancel (priv->connecting_default_client); + g_object_unref (priv->connecting_default_client); + priv->connecting_default_client = NULL; } if (priv->loading_clients != NULL) { @@ -842,7 +889,7 @@ e_memo_shell_sidebar_get_default_client (EMemoShellSidebar *memo_shell_sidebar) g_return_val_if_fail ( E_IS_MEMO_SHELL_SIDEBAR (memo_shell_sidebar), NULL); - return memo_shell_sidebar->priv->default_client; + return (ECalClient *) memo_shell_sidebar->priv->default_client; } ESourceSelector * @@ -854,21 +901,57 @@ e_memo_shell_sidebar_get_selector (EMemoShellSidebar *memo_shell_sidebar) return E_SOURCE_SELECTOR (memo_shell_sidebar->priv->selector); } +void +e_memo_shell_sidebar_add_client (EMemoShellSidebar *memo_shell_sidebar, + EClient *client) +{ + ESource *source; + ESourceSelector *selector; + GHashTable *client_table; + const gchar *message; + const gchar *uid; + + g_return_if_fail (E_IS_MEMO_SHELL_SIDEBAR (memo_shell_sidebar)); + g_return_if_fail (E_IS_CAL_CLIENT (client)); + + client_table = memo_shell_sidebar->priv->client_table; + + source = e_client_get_source (client); + uid = e_source_get_uid (source); + + if (g_hash_table_contains (client_table, uid)) + return; + + g_hash_table_insert ( + client_table, g_strdup (uid), g_object_ref (client)); + + g_signal_connect_swapped ( + client, "backend-died", + G_CALLBACK (memo_shell_sidebar_backend_died_cb), + memo_shell_sidebar); + + g_signal_connect_swapped ( + client, "backend-error", + G_CALLBACK (memo_shell_sidebar_backend_error_cb), + memo_shell_sidebar); + + selector = e_memo_shell_sidebar_get_selector (memo_shell_sidebar); + e_source_selector_select_source (selector, source); + + message = _("Loading memo list"); + memo_shell_sidebar_emit_status_message (memo_shell_sidebar, message); + memo_shell_sidebar_emit_client_added (memo_shell_sidebar, client); + memo_shell_sidebar_emit_status_message (memo_shell_sidebar, NULL); +} + void e_memo_shell_sidebar_add_source (EMemoShellSidebar *memo_shell_sidebar, ESource *source) { - EShellView *shell_view; - EShellContent *shell_content; - EShellSidebar *shell_sidebar; - EMemoShellContent *memo_shell_content; ECalClientSourceType source_type; ESourceSelector *selector; GHashTable *client_table; - ECalModel *model; - ECalClient *default_client; - ECalClient *client; - icaltimezone *timezone; + EClient *default_client; const gchar *display_name; const gchar *uid; gchar *message; @@ -882,38 +965,22 @@ e_memo_shell_sidebar_add_source (EMemoShellSidebar *memo_shell_sidebar, selector = e_memo_shell_sidebar_get_selector (memo_shell_sidebar); uid = e_source_get_uid (source); - client = g_hash_table_lookup (client_table, uid); - if (client != NULL) + if (g_hash_table_contains (client_table, uid)) return; if (default_client != NULL) { ESource *default_source; - const gchar *default_uid; - default_source = e_client_get_source (E_CLIENT (default_client)); - default_uid = e_source_get_uid (default_source); + default_source = e_client_get_source (default_client); - if (g_strcmp0 (uid, default_uid) == 0) - client = g_object_ref (default_client); + if (e_source_equal (source, default_source)) { + e_memo_shell_sidebar_add_client ( + memo_shell_sidebar, default_client); + return; + } } - if (client == NULL) - client = e_cal_client_new (source, source_type, NULL); - - g_return_if_fail (client != NULL); - - g_signal_connect_swapped ( - client, "backend-died", - G_CALLBACK (memo_shell_sidebar_backend_died_cb), - memo_shell_sidebar); - - g_signal_connect_swapped ( - client, "backend-error", - G_CALLBACK (memo_shell_sidebar_backend_error_cb), - memo_shell_sidebar); - - g_hash_table_insert (client_table, g_strdup (uid), client); e_source_selector_select_source (selector, source); display_name = e_source_get_display_name (source); @@ -921,22 +988,11 @@ e_memo_shell_sidebar_add_source (EMemoShellSidebar *memo_shell_sidebar, memo_shell_sidebar_emit_status_message (memo_shell_sidebar, message); g_free (message); - /* 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); - - 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_client_set_default_timezone (client, timezone); - - e_client_open ( - E_CLIENT (client), FALSE, + e_cal_client_connect ( + source, source_type, memo_shell_sidebar->priv->loading_clients, - memo_shell_sidebar_client_opened_cb, memo_shell_sidebar); + memo_shell_sidebar_client_connect_cb, + connect_closure_new (memo_shell_sidebar, source)); } void -- cgit v1.2.3