From 0943a0e436c7510c39d86ab7a72a4ebbd3a876ac Mon Sep 17 00:00:00 2001 From: Rodrigo Moya Date: Thu, 7 Oct 2004 14:20:55 +0000 Subject: Fixes #65932 2004-10-06 Rodrigo Moya Fixes #65932 * common/authentication.c: keep a hash table of all the source lists. (auth_new_cal_from_uri): do a search in the source list for the given URI, and use that ESource if we find it. Also, keep the hash table of source lists up to date. * gui/comp-editor-factory.c (cal_opened_cb): don't assert on error cases, just display an error dialog. svn path=/trunk/; revision=27498 --- calendar/ChangeLog | 12 ++++++++ calendar/common/authentication.c | 61 +++++++++++++++++++++++++++++++------- calendar/gui/comp-editor-factory.c | 18 ++++++----- 3 files changed, 74 insertions(+), 17 deletions(-) (limited to 'calendar') diff --git a/calendar/ChangeLog b/calendar/ChangeLog index 9187fe5cf9..8497dbdb21 100644 --- a/calendar/ChangeLog +++ b/calendar/ChangeLog @@ -1,3 +1,15 @@ +2004-10-06 Rodrigo Moya + + Fixes #65932 + + * common/authentication.c: keep a hash table of all the source lists. + (auth_new_cal_from_uri): do a search in the source list for the given + URI, and use that ESource if we find it. Also, keep the hash table of + source lists up to date. + + * gui/comp-editor-factory.c (cal_opened_cb): don't assert on error + cases, just display an error dialog. + 2004-10-06 Not Zed * gui/gnome-cal.c (gnome_calendar_setup_view_popup): rename to diff --git a/calendar/common/authentication.c b/calendar/common/authentication.c index 2df97e3aca..4849169e56 100644 --- a/calendar/common/authentication.c +++ b/calendar/common/authentication.c @@ -30,6 +30,8 @@ #include "e-util/e-passwords.h" #include "authentication.h" +static GHashTable *source_lists_hash = NULL; + static char * auth_func_cb (ECal *ecal, const char *prompt, const char *key, gpointer user_data) { @@ -79,24 +81,63 @@ auth_new_cal_from_source (ESource *source, ECalSourceType type) ECal * auth_new_cal_from_uri (const char *uri, ECalSourceType type) { - ESourceGroup *group; - ESource *source; + ESourceGroup *group = NULL; + ESource *source = NULL; ECal *cal; + ESourceList *source_list = NULL; + + /* try to find the source in the source list in GConf */ + source_list = g_hash_table_lookup (source_lists_hash, &type); + if (!source_list) { + if (e_cal_get_sources (&source_list, type, NULL)) { + if (!source_lists_hash) + source_lists_hash = g_hash_table_new (g_int_hash, g_int_equal); + + g_hash_table_insert (source_lists_hash, &type, source_list); + } + } - group = e_source_group_new ("", uri); - source = e_source_new ("", ""); - e_source_set_group (source, group); + if (source_list) { + GSList *gl; + + for (gl = e_source_list_peek_groups (source_list); gl != NULL && source == NULL; gl = gl->next) { + GSList *sl; + + for (sl = e_source_group_peek_sources (gl->data); sl != NULL; sl = sl->next) { + char *source_uri; + + source_uri = e_source_get_uri (sl->data); + if (source_uri) { + if (!strcmp (source_uri, uri)) { + g_free (source_uri); + source = g_object_ref (sl->data); + break; + } + + g_free (source_uri); + } + } + } + } - /* we explicitly check for groupwise:// uris, to force authentication on them */ - if (!strncmp (uri, "groupwise://", strlen ("groupwise://"))) { - e_source_set_property (source, "auth", "yes"); - /* FIXME: need to retrieve the username */ + if (!source) { + group = e_source_group_new ("", uri); + source = e_source_new ("", ""); + e_source_set_group (source, group); + + /* we explicitly check for groupwise:// uris, to force authentication on them */ + if (!strncmp (uri, "groupwise://", strlen ("groupwise://"))) { + e_source_set_property (source, "auth", "1"); + e_source_set_property (source, "auth-domain", "Groupwise"); + /* FIXME: need to retrieve the username */ + } } cal = auth_new_cal_from_source (source, type); g_object_unref (source); - g_object_unref (group); + if (group) + g_object_unref (group); return cal; } diff --git a/calendar/gui/comp-editor-factory.c b/calendar/gui/comp-editor-factory.c index de6d45968f..71470ee648 100644 --- a/calendar/gui/comp-editor-factory.c +++ b/calendar/gui/comp-editor-factory.c @@ -404,16 +404,12 @@ cal_opened_cb (ECal *client, ECalendarStatus status, gpointer data) return; case E_CALENDAR_STATUS_OTHER_ERROR: + case E_CALENDAR_STATUS_NO_SUCH_CALENDAR: dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, _("Error while opening the calendar")); break; - case E_CALENDAR_STATUS_NO_SUCH_CALENDAR: - /* oops - we specified only_if_exists = FALSE */ - g_assert_not_reached (); - return; - case E_CALENDAR_STATUS_PROTOCOL_NOT_SUPPORTED: dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, @@ -425,9 +421,17 @@ cal_opened_cb (ECal *client, ECalendarStatus status, gpointer data) GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, _("Permission denied to open the calendar")); break; - + + case E_CALENDAR_STATUS_AUTHENTICATION_FAILED : + dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL, + GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, + _("Authentication Failed")); + break; + default: - g_assert_not_reached (); + dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL, + GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, + _("Unknown error")); return; } -- cgit v1.2.3