aboutsummaryrefslogtreecommitdiffstats
path: root/modules/calendar
diff options
context:
space:
mode:
authorMatthew Barnes <mbarnes@redhat.com>2010-08-21 01:25:21 +0800
committerMatthew Barnes <mbarnes@redhat.com>2010-08-24 03:21:59 +0800
commit7c1ec3723ad7367449c93e8559c27158b24a51dd (patch)
tree643be187abc027398868d87a8befe88db5bc330e /modules/calendar
parentbd5e9031b9dc61669723f7ec6e0de3d7138a43d6 (diff)
downloadgsoc2013-evolution-7c1ec3723ad7367449c93e8559c27158b24a51dd.tar
gsoc2013-evolution-7c1ec3723ad7367449c93e8559c27158b24a51dd.tar.gz
gsoc2013-evolution-7c1ec3723ad7367449c93e8559c27158b24a51dd.tar.bz2
gsoc2013-evolution-7c1ec3723ad7367449c93e8559c27158b24a51dd.tar.lz
gsoc2013-evolution-7c1ec3723ad7367449c93e8559c27158b24a51dd.tar.xz
gsoc2013-evolution-7c1ec3723ad7367449c93e8559c27158b24a51dd.tar.zst
gsoc2013-evolution-7c1ec3723ad7367449c93e8559c27158b24a51dd.zip
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);
Diffstat (limited to 'modules/calendar')
-rw-r--r--modules/calendar/e-cal-shell-backend.c128
-rw-r--r--modules/calendar/e-cal-shell-sidebar.c126
-rw-r--r--modules/calendar/e-memo-shell-backend.c102
-rw-r--r--modules/calendar/e-memo-shell-sidebar.c126
-rw-r--r--modules/calendar/e-task-shell-backend.c99
-rw-r--r--modules/calendar/e-task-shell-sidebar.c126
6 files changed, 376 insertions, 331 deletions
diff --git a/modules/calendar/e-cal-shell-backend.c b/modules/calendar/e-cal-shell-backend.c
index 8861a82cf3..e72626304e 100644
--- a/modules/calendar/e-cal-shell-backend.c
+++ b/modules/calendar/e-cal-shell-backend.c
@@ -221,20 +221,19 @@ cal_shell_backend_ensure_sources (EShellBackend *shell_backend)
}
static void
-cal_shell_backend_new_event (ECal *cal,
- const GError *error,
+cal_shell_backend_new_event (ESource *source,
+ GAsyncResult *result,
EShell *shell,
CompEditorFlags flags,
gboolean all_day)
{
+ ECal *cal;
ECalComponent *comp;
CompEditor *editor;
/* XXX Handle errors better. */
- if (error)
- return;
-
- flags |= COMP_EDITOR_NEW_ITEM;
+ cal = e_load_cal_source_finish (source, result, NULL);
+ g_return_if_fail (E_IS_CAL (cal));
editor = event_editor_new (cal, shell, flags);
comp = cal_comp_event_new_with_current_time (cal, all_day);
@@ -244,68 +243,77 @@ cal_shell_backend_new_event (ECal *cal,
gtk_window_present (GTK_WINDOW (editor));
g_object_unref (comp);
+ g_object_unref (cal);
}
static void
-cal_shell_backend_event_new_cb (ECal *cal,
- const GError *error,
+cal_shell_backend_event_new_cb (ESource *source,
+ GAsyncResult *result,
EShell *shell)
{
- CompEditorFlags flags;
+ CompEditorFlags flags = 0;
+ gboolean all_day = FALSE;
- flags = COMP_EDITOR_USER_ORG;
- cal_shell_backend_new_event (cal, error, shell, flags, FALSE);
+ flags |= COMP_EDITOR_NEW_ITEM;
+ flags |= COMP_EDITOR_USER_ORG;
- g_object_unref (cal);
+ cal_shell_backend_new_event (source, result, shell, flags, all_day);
+
+ g_object_unref (shell);
}
static void
-cal_shell_backend_event_all_day_new_cb (ECal *cal,
- const GError *error,
+cal_shell_backend_event_all_day_new_cb (ESource *source,
+ GAsyncResult *result,
EShell *shell)
{
- CompEditorFlags flags;
+ CompEditorFlags flags = 0;
+ gboolean all_day = TRUE;
- flags = COMP_EDITOR_USER_ORG;
- cal_shell_backend_new_event (cal, error, shell, flags, TRUE);
+ flags |= COMP_EDITOR_NEW_ITEM;
+ flags |= COMP_EDITOR_USER_ORG;
- g_object_unref (cal);
+ cal_shell_backend_new_event (source, result, shell, flags, all_day);
+
+ g_object_unref (shell);
}
static void
-cal_shell_backend_event_meeting_new_cb (ECal *cal,
- const GError *error,
+cal_shell_backend_event_meeting_new_cb (ESource *source,
+ GAsyncResult *result,
EShell *shell)
{
- CompEditorFlags flags;
+ CompEditorFlags flags = 0;
+ gboolean all_day = FALSE;
- flags = COMP_EDITOR_USER_ORG | COMP_EDITOR_MEETING;
- cal_shell_backend_new_event (cal, error, shell, flags, FALSE);
+ flags |= COMP_EDITOR_NEW_ITEM;
+ flags |= COMP_EDITOR_USER_ORG;
+ flags |= COMP_EDITOR_MEETING;
- g_object_unref (cal);
+ cal_shell_backend_new_event (source, result, shell, flags, all_day);
+
+ g_object_unref (shell);
}
static void
action_event_new_cb (GtkAction *action,
EShellWindow *shell_window)
{
- ECal *cal = NULL;
- ECalSourceType source_type;
- ESourceList *source_list;
- EShellSettings *shell_settings;
- EShellView *shell_view;
EShell *shell;
- const gchar *view_name;
+ EShellView *shell_view;
+ EShellBackend *shell_backend;
+ EShellSettings *shell_settings;
+ ESource *source = NULL;
+ ESourceList *source_list;
+ ECalSourceType source_type;
const gchar *action_name;
gchar *uid;
/* With a 'calendar' active shell view pass the new appointment
* request to it, thus the event will inherit selected time from
* the view. */
- view_name = e_shell_window_get_active_view (shell_window);
- shell_view = e_shell_window_get_shell_view (shell_window, view_name);
-
- if (shell_view && g_ascii_strcasecmp (view_name, "calendar") == 0) {
+ shell_view = e_shell_window_peek_shell_view (shell_window, "calendar");
+ if (shell_view != NULL) {
EShellContent *shell_content;
GnomeCalendar *gcal;
GnomeCalendarViewType view_type;
@@ -338,48 +346,50 @@ action_event_new_cb (GtkAction *action,
shell = e_shell_window_get_shell (shell_window);
shell_settings = e_shell_get_shell_settings (shell);
+ shell_backend = e_shell_get_backend_by_name (shell, "calendar");
- if (!e_cal_get_sources (&source_list, source_type, NULL)) {
- g_warning ("Could not get calendar sources from GConf!");
- return;
- }
+ g_object_get (shell_backend, "source-list", &source_list, NULL);
+ g_return_if_fail (E_IS_SOURCE_LIST (source_list));
uid = e_shell_settings_get_string (
shell_settings, "cal-primary-calendar");
if (uid != NULL) {
- ESource *source;
-
source = e_source_list_peek_source_by_uid (source_list, uid);
- if (source != NULL)
- cal = e_auth_new_cal_from_source (source, source_type);
g_free (uid);
}
- if (cal == NULL)
- cal = e_auth_new_cal_from_default (source_type);
+ if (source == NULL)
+ source = e_source_list_peek_default_source (source_list);
- g_return_if_fail (cal != NULL);
+ g_return_if_fail (E_IS_SOURCE (source));
- /* Connect the appropriate signal handler. */
+ /* Use a callback function appropriate for the action.
+ * FIXME Need to obtain a better default time zone. */
action_name = gtk_action_get_name (action);
if (strcmp (action_name, "event-all-day-new") == 0)
- g_signal_connect (
- cal, "cal-opened-ex",
- G_CALLBACK (cal_shell_backend_event_all_day_new_cb),
- shell);
+ e_load_cal_source_async (
+ source, source_type, NULL,
+ GTK_WINDOW (shell_window),
+ NULL, (GAsyncReadyCallback)
+ cal_shell_backend_event_all_day_new_cb,
+ g_object_ref (shell));
else if (strcmp (action_name, "event-meeting-new") == 0)
- g_signal_connect (
- cal, "cal-opened-ex",
- G_CALLBACK (cal_shell_backend_event_meeting_new_cb),
- shell);
+ e_load_cal_source_async (
+ source, source_type, NULL,
+ GTK_WINDOW (shell_window),
+ NULL, (GAsyncReadyCallback)
+ cal_shell_backend_event_meeting_new_cb,
+ g_object_ref (shell));
else
- g_signal_connect (
- cal, "cal-opened-ex",
- G_CALLBACK (cal_shell_backend_event_new_cb),
- shell);
+ e_load_cal_source_async (
+ source, source_type, NULL,
+ GTK_WINDOW (shell_window),
+ NULL, (GAsyncReadyCallback)
+ cal_shell_backend_event_new_cb,
+ g_object_ref (shell));
- e_cal_open_async (cal, FALSE);
+ g_object_unref (source_list);
}
static void
diff --git a/modules/calendar/e-cal-shell-sidebar.c b/modules/calendar/e-cal-shell-sidebar.c
index 1cd4ba9619..a819d88473 100644
--- a/modules/calendar/e-cal-shell-sidebar.c
+++ b/modules/calendar/e-cal-shell-sidebar.c
@@ -59,6 +59,8 @@ struct _ECalShellSidebarPrivate {
* sometime later we update our default-client property
* which is bound by an EBinding to ECalModel. */
ECal *default_client;
+
+ GCancellable *loading_default_client;
};
enum {
@@ -241,104 +243,106 @@ cal_shell_sidebar_client_opened_cb (ECalShellSidebar *cal_shell_sidebar,
}
static void
-cal_shell_sidebar_default_opened_cb (ECalShellSidebar *cal_shell_sidebar,
- const GError *error,
- ECal *client)
+cal_shell_sidebar_default_loaded_cb (ESource *source,
+ GAsyncResult *result,
+ EShellSidebar *shell_sidebar)
{
+ ECalShellSidebarPrivate *priv;
+ EShellWindow *shell_window;
EShellView *shell_view;
- EShellSidebar *shell_sidebar;
+ ECal *client;
+ GError *error = NULL;
+
+ priv = E_CAL_SHELL_SIDEBAR_GET_PRIVATE (shell_sidebar);
- shell_sidebar = E_SHELL_SIDEBAR (cal_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-calendar",
+ 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-calendar",
- error->message, NULL);
+ if (priv->default_client != NULL)
+ g_object_unref (priv->default_client);
- e_cal_shell_sidebar_remove_source (
- cal_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,
- cal_shell_sidebar_default_opened_cb, NULL);
-
- g_object_notify (G_OBJECT (cal_shell_sidebar), "default-client");
+exit:
+ g_object_unref (shell_sidebar);
}
static void
cal_shell_sidebar_set_default (ECalShellSidebar *cal_shell_sidebar,
ESource *source)
{
+ ECalShellSidebarPrivate *priv;
EShellView *shell_view;
+ EShellWindow *shell_window;
EShellContent *shell_content;
EShellSidebar *shell_sidebar;
ECalShellContent *cal_shell_content;
ECalSourceType source_type;
- GHashTable *client_table;
ECalModel *model;
ECal *client;
icaltimezone *timezone;
const gchar *uid;
+ priv = cal_shell_sidebar->priv;
source_type = E_CAL_SOURCE_TYPE_EVENT;
- client_table = cal_shell_sidebar->priv->client_table;
-
- uid = e_source_peek_uid (source);
- client = g_hash_table_lookup (client_table, uid);
-
- if (cal_shell_sidebar->priv->default_client != NULL)
- g_object_unref (cal_shell_sidebar->priv->default_client);
-
- if (client != NULL)
- g_object_ref (client);
- else
- client = e_auth_new_cal_from_source (source, source_type);
-
- cal_shell_sidebar->priv->default_client = client;
- g_return_if_fail (client != NULL);
-
- g_signal_connect_swapped (
- client, "cal-opened-ex",
- G_CALLBACK (cal_shell_sidebar_default_opened_cb),
- cal_shell_sidebar);
/* FIXME Sidebar should not be accessing the EShellContent.
* This probably needs to be moved to ECalShellView. */
shell_sidebar = E_SHELL_SIDEBAR (cal_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);
cal_shell_content = E_CAL_SHELL_CONTENT (shell_content);
model = e_cal_shell_content_get_model (cal_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) cal_shell_sidebar_default_loaded_cb,
+ g_object_ref (shell_sidebar));
}
static void
@@ -572,6 +576,12 @@ cal_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. */
diff --git a/modules/calendar/e-memo-shell-backend.c b/modules/calendar/e-memo-shell-backend.c
index 8f5bf40825..d54c32f98e 100644
--- a/modules/calendar/e-memo-shell-backend.c
+++ b/modules/calendar/e-memo-shell-backend.c
@@ -153,19 +153,18 @@ memo_shell_backend_ensure_sources (EShellBackend *shell_backend)
}
static void
-memo_shell_backend_memo_new_cb (ECal *cal,
- const GError *error,
- EShell *shell)
+memo_shell_backend_new_memo (ESource *source,
+ GAsyncResult *result,
+ EShell *shell,
+ CompEditorFlags flags)
{
+ ECal *cal;
ECalComponent *comp;
CompEditor *editor;
- CompEditorFlags flags = 0;
/* XXX Handle errors better. */
- if (error)
- return;
-
- flags |= COMP_EDITOR_NEW_ITEM;
+ cal = e_load_cal_source_finish (source, result, NULL);
+ g_return_if_fail (E_IS_CAL (cal));
comp = cal_comp_memo_new_with_defaults (cal);
cal_comp_update_time_by_active_window (comp, shell);
@@ -179,42 +178,45 @@ memo_shell_backend_memo_new_cb (ECal *cal,
}
static void
-memo_shell_backend_memo_shared_new_cb (ECal *cal,
- const GError *error,
- EShell *shell)
+memo_shell_backend_memo_new_cb (ESource *source,
+ GAsyncResult *result,
+ EShell *shell)
{
- ECalComponent *comp;
- CompEditor *editor;
CompEditorFlags flags = 0;
- /* XXX Handle errors better. */
- if (error)
- return;
+ flags |= COMP_EDITOR_NEW_ITEM;
+
+ memo_shell_backend_new_memo (source, result, shell, flags);
+
+ g_object_unref (shell);
+}
+
+static void
+memo_shell_backend_memo_shared_new_cb (ESource *source,
+ GAsyncResult *result,
+ EShell *shell)
+{
+ CompEditorFlags flags = 0;
flags |= COMP_EDITOR_NEW_ITEM;
flags |= COMP_EDITOR_IS_SHARED;
flags |= COMP_EDITOR_USER_ORG;
- comp = cal_comp_memo_new_with_defaults (cal);
- cal_comp_update_time_by_active_window (comp, shell);
- editor = memo_editor_new (cal, shell, flags);
- comp_editor_edit_comp (editor, comp);
-
- gtk_window_present (GTK_WINDOW (editor));
+ memo_shell_backend_new_memo (source, result, shell, flags);
- g_object_unref (comp);
- g_object_unref (cal);
+ g_object_unref (shell);
}
static void
action_memo_new_cb (GtkAction *action,
EShellWindow *shell_window)
{
- ECal *cal = NULL;
- ECalSourceType source_type;
- ESourceList *source_list;
- EShellSettings *shell_settings;
EShell *shell;
+ EShellBackend *shell_backend;
+ EShellSettings *shell_settings;
+ ESource *source = NULL;
+ ESourceList *source_list;
+ ECalSourceType source_type;
const gchar *action_name;
gchar *uid;
@@ -224,43 +226,43 @@ action_memo_new_cb (GtkAction *action,
shell = e_shell_window_get_shell (shell_window);
shell_settings = e_shell_get_shell_settings (shell);
+ shell_backend = e_shell_get_backend_by_name (shell, "memos");
- if (!e_cal_get_sources (&source_list, source_type, NULL)) {
- g_warning ("Could not get memo sources from GConf!");
- return;
- }
+ g_object_get (shell_backend, "source-list", &source_list, NULL);
+ g_return_if_fail (E_IS_SOURCE_LIST (source_list));
uid = e_shell_settings_get_string (
shell_settings, "cal-primary-memo-list");
if (uid != NULL) {
- ESource *source;
-
source = e_source_list_peek_source_by_uid (source_list, uid);
- if (source != NULL)
- cal = e_auth_new_cal_from_source (source, source_type);
g_free (uid);
}
- if (cal == NULL)
- cal = e_auth_new_cal_from_default (source_type);
+ if (source == NULL)
+ source = e_source_list_peek_default_source (source_list);
- g_return_if_fail (cal != NULL);
+ g_return_if_fail (E_IS_SOURCE (source));
- /* Connect the appropriate signal handler. */
+ /* Use a callback function appropriate for the action.
+ * FIXME Need to obtain a better default time zone. */
action_name = gtk_action_get_name (action);
- if (strcmp (action_name, "memo-shared-new") == 0)
- g_signal_connect (
- cal, "cal-opened-ex",
- G_CALLBACK (memo_shell_backend_memo_shared_new_cb),
- shell);
+ if (g_strcmp0 (action_name, "memo-shared-new") == 0)
+ e_load_cal_source_async (
+ source, source_type, NULL,
+ GTK_WINDOW (shell_window),
+ NULL, (GAsyncReadyCallback)
+ memo_shell_backend_memo_shared_new_cb,
+ g_object_ref (shell));
else
- g_signal_connect (
- cal, "cal-opened-ex",
- G_CALLBACK (memo_shell_backend_memo_new_cb),
- shell);
+ e_load_cal_source_async (
+ source, source_type, NULL,
+ GTK_WINDOW (shell_window),
+ NULL, (GAsyncReadyCallback)
+ memo_shell_backend_memo_new_cb,
+ g_object_ref (shell));
- e_cal_open_async (cal, FALSE);
+ g_object_unref (source_list);
}
static void
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. */
diff --git a/modules/calendar/e-task-shell-backend.c b/modules/calendar/e-task-shell-backend.c
index cdd4dcc608..be085afa8d 100644
--- a/modules/calendar/e-task-shell-backend.c
+++ b/modules/calendar/e-task-shell-backend.c
@@ -153,19 +153,18 @@ task_shell_backend_ensure_sources (EShellBackend *shell_backend)
}
static void
-task_shell_backend_task_new_cb (ECal *cal,
- const GError *error,
- EShell *shell)
+task_shell_backend_new_task (ESource *source,
+ GAsyncResult *result,
+ EShell *shell,
+ CompEditorFlags flags)
{
+ ECal *cal;
ECalComponent *comp;
CompEditor *editor;
- CompEditorFlags flags = 0;
/* XXX Handle errors better. */
- if (error)
- return;
-
- flags |= COMP_EDITOR_NEW_ITEM;
+ cal = e_load_cal_source_finish (source, result, NULL);
+ g_return_if_fail (E_IS_CAL (cal));
editor = task_editor_new (cal, shell, flags);
comp = cal_comp_task_new_with_defaults (cal);
@@ -178,41 +177,45 @@ task_shell_backend_task_new_cb (ECal *cal,
}
static void
-task_shell_backend_task_assigned_new_cb (ECal *cal,
- const GError *error,
- EShell *shell)
+task_shell_backend_task_new_cb (ESource *source,
+ GAsyncResult *result,
+ EShell *shell)
{
- ECalComponent *comp;
- CompEditor *editor;
CompEditorFlags flags = 0;
- /* XXX Handle errors better. */
- if (error)
- return;
+ flags |= COMP_EDITOR_NEW_ITEM;
+
+ task_shell_backend_new_task (source, result, shell, flags);
+
+ g_object_unref (shell);
+}
+
+static void
+task_shell_backend_task_assigned_new_cb (ESource *source,
+ GAsyncResult *result,
+ EShell *shell)
+{
+ CompEditorFlags flags = 0;
flags |= COMP_EDITOR_NEW_ITEM;
flags |= COMP_EDITOR_IS_ASSIGNED;
flags |= COMP_EDITOR_USER_ORG;
- editor = task_editor_new (cal, shell, flags);
- comp = cal_comp_task_new_with_defaults (cal);
- comp_editor_edit_comp (editor, comp);
+ task_shell_backend_new_task (source, result, shell, flags);
- gtk_window_present (GTK_WINDOW (editor));
-
- g_object_unref (comp);
- g_object_unref (cal);
+ g_object_unref (shell);
}
static void
action_task_new_cb (GtkAction *action,
EShellWindow *shell_window)
{
- ECal *cal = NULL;
- ECalSourceType source_type;
- ESourceList *source_list;
- EShellSettings *shell_settings;
EShell *shell;
+ EShellBackend *shell_backend;
+ EShellSettings *shell_settings;
+ ESource *source = NULL;
+ ESourceList *source_list;
+ ECalSourceType source_type;
const gchar *action_name;
gchar *uid;
@@ -222,43 +225,43 @@ action_task_new_cb (GtkAction *action,
shell = e_shell_window_get_shell (shell_window);
shell_settings = e_shell_get_shell_settings (shell);
+ shell_backend = e_shell_get_backend_by_name (shell, "tasks");
- if (!e_cal_get_sources (&source_list, source_type, NULL)) {
- g_warning ("Could not get task sources from GConf!");
- return;
- }
+ g_object_get (shell_backend, "source-list", &source_list, NULL);
+ g_return_if_fail (E_IS_SOURCE_LIST (source_list));
uid = e_shell_settings_get_string (
shell_settings, "cal-primary-task-list");
if (uid != NULL) {
- ESource *source;
-
source = e_source_list_peek_source_by_uid (source_list, uid);
- if (source != NULL)
- cal = e_auth_new_cal_from_source (source, source_type);
g_free (uid);
}
- if (cal == NULL)
- cal = e_auth_new_cal_from_default (source_type);
+ if (source == NULL)
+ source = e_source_list_peek_default_source (source_list);
- g_return_if_fail (cal != NULL);
+ g_return_if_fail (E_IS_SOURCE (source));
- /* Connect the appropriate signal handler. */
+ /* Use a callback function appropriate for the action.
+ * FIXME Need to obtain a better default time zone. */
action_name = gtk_action_get_name (action);
if (strcmp (action_name, "task-assigned-new") == 0)
- g_signal_connect (
- cal, "cal-opened-ex",
- G_CALLBACK (task_shell_backend_task_assigned_new_cb),
- shell);
+ e_load_cal_source_async (
+ source, source_type, NULL,
+ GTK_WINDOW (shell_window),
+ NULL, (GAsyncReadyCallback)
+ task_shell_backend_task_assigned_new_cb,
+ g_object_ref (shell));
else
- g_signal_connect (
- cal, "cal-opened-ex",
- G_CALLBACK (task_shell_backend_task_new_cb),
- shell);
+ e_load_cal_source_async (
+ source, source_type, NULL,
+ GTK_WINDOW (shell_window),
+ NULL, (GAsyncReadyCallback)
+ task_shell_backend_task_new_cb,
+ g_object_ref (shell));
- e_cal_open_async (cal, FALSE);
+ g_object_unref (source_list);
}
static void
diff --git a/modules/calendar/e-task-shell-sidebar.c b/modules/calendar/e-task-shell-sidebar.c
index 8613b4eb0f..b50e463e8a 100644
--- a/modules/calendar/e-task-shell-sidebar.c
+++ b/modules/calendar/e-task-shell-sidebar.c
@@ -54,6 +54,8 @@ struct _ETaskShellSidebarPrivate {
* 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 @@ task_shell_sidebar_client_opened_cb (ETaskShellSidebar *task_shell_sidebar,
}
static void
-task_shell_sidebar_default_opened_cb (ETaskShellSidebar *task_shell_sidebar,
- const GError *error,
- ECal *client)
+task_shell_sidebar_default_loaded_cb (ESource *source,
+ GAsyncResult *result,
+ EShellSidebar *shell_sidebar)
{
+ ETaskShellSidebarPrivate *priv;
+ EShellWindow *shell_window;
EShellView *shell_view;
- EShellSidebar *shell_sidebar;
+ ECal *client;
+ GError *error = NULL;
+
+ priv = E_TASK_SHELL_SIDEBAR_GET_PRIVATE (shell_sidebar);
- shell_sidebar = E_SHELL_SIDEBAR (task_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-tasks",
+ 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-tasks",
- error->message, NULL);
+ if (priv->default_client != NULL)
+ g_object_unref (priv->default_client);
- e_task_shell_sidebar_remove_source (
- task_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,
- task_shell_sidebar_default_opened_cb, NULL);
-
- g_object_notify (G_OBJECT (task_shell_sidebar), "default-client");
+exit:
+ g_object_unref (shell_sidebar);
}
static void
task_shell_sidebar_set_default (ETaskShellSidebar *task_shell_sidebar,
ESource *source)
{
+ ETaskShellSidebarPrivate *priv;
EShellView *shell_view;
+ EShellWindow *shell_window;
EShellContent *shell_content;
EShellSidebar *shell_sidebar;
ETaskShellContent *task_shell_content;
ECalSourceType source_type;
- GHashTable *client_table;
ECalModel *model;
ECal *client;
icaltimezone *timezone;
const gchar *uid;
+ priv = task_shell_sidebar->priv;
source_type = E_CAL_SOURCE_TYPE_TODO;
- client_table = task_shell_sidebar->priv->client_table;
-
- uid = e_source_peek_uid (source);
- client = g_hash_table_lookup (client_table, uid);
-
- if (task_shell_sidebar->priv->default_client != NULL)
- g_object_unref (task_shell_sidebar->priv->default_client);
-
- if (client != NULL)
- g_object_ref (client);
- else
- client = e_auth_new_cal_from_source (source, source_type);
-
- task_shell_sidebar->priv->default_client = client;
- g_return_if_fail (client != NULL);
-
- g_signal_connect_swapped (
- client, "cal-opened-ex",
- G_CALLBACK (task_shell_sidebar_default_opened_cb),
- task_shell_sidebar);
/* FIXME Sidebar should not be accessing the EShellContent.
* This probably needs to be moved to ETaskShellView. */
shell_sidebar = E_SHELL_SIDEBAR (task_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);
task_shell_content = E_TASK_SHELL_CONTENT (shell_content);
model = e_task_shell_content_get_task_model (task_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) task_shell_sidebar_default_loaded_cb,
+ g_object_ref (shell_sidebar));
}
static void
@@ -538,6 +542,12 @@ task_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. */