From 1af7571c5c475ecf3f95d56a0fe7af78c7be3180 Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Tue, 26 Apr 2011 16:23:40 -0400 Subject: Refactor CompEditor pages to isolate EAccount usage. Hide EAccount usage behind more generic APIs so EAccount can be replaced more easily in the account-mgmt branch. --- calendar/gui/dialogs/event-page.c | 216 +++++++++++++++++++++++--------------- 1 file changed, 130 insertions(+), 86 deletions(-) (limited to 'calendar/gui/dialogs/event-page.c') diff --git a/calendar/gui/dialogs/event-page.c b/calendar/gui/dialogs/event-page.c index 9560f590d2..6b9110bc86 100644 --- a/calendar/gui/dialogs/event-page.c +++ b/calendar/gui/dialogs/event-page.c @@ -109,7 +109,6 @@ struct _EventPagePrivate { GtkWidget *location; GtkWidget *location_label; - EAccountList *accounts; GList *address_strings; EMeetingAttendee *ia; gchar *user_add; @@ -206,35 +205,54 @@ static void set_subscriber_info_string (EventPage *epage, const gchar *backend_a G_DEFINE_TYPE (EventPage, event_page, TYPE_COMP_EDITOR_PAGE) -static EAccount * -get_current_account (EventPage *epage) +static gboolean +get_current_identity (EventPage *page, + gchar **name, + gchar **mailto) { - EventPagePrivate *priv; - EIterator *it; - const gchar *str; + EAccountList *account_list; + EIterator *iterator; + GtkWidget *entry; + const gchar *text; + gboolean match = FALSE; - priv = epage->priv; + entry = gtk_bin_get_child (GTK_BIN (page->priv->organizer)); + text = gtk_entry_get_text (GTK_ENTRY (entry)); - str = gtk_entry_get_text (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (priv->organizer)))); - if (!str) - return NULL; + if (text == NULL || *text == '\0') + return FALSE; - for (it = e_list_get_iterator ((EList *)priv->accounts); e_iterator_is_valid (it); e_iterator_next (it)) { - EAccount *a = (EAccount *)e_iterator_get (it); - gchar *full = g_strdup_printf("%s <%s>", a->id->name, a->id->address); + account_list = e_get_account_list (); + iterator = e_list_get_iterator (E_LIST (account_list)); - if (!g_ascii_strcasecmp (full, str)) { - g_free (full); - g_object_unref (it); + while (!match && e_iterator_is_valid (iterator)) { + EAccount *account; + const gchar *id_name; + const gchar *id_address; + gchar *identity; - return a; - } + /* XXX EIterator misuses const. */ + account = (EAccount *) e_iterator_get (iterator); + + id_name = account->id->name; + id_address = account->id->address; - g_free (full); + identity = g_strdup_printf ("%s <%s>", id_name, id_address); + match = (g_ascii_strcasecmp (text, identity) == 0); + g_free (identity); + + if (match && name != NULL) + *name = g_strdup (id_name); + + if (match && mailto != NULL) + *mailto = g_strdup_printf ("MAILTO:%s", id_address); + + e_iterator_next (iterator); } - g_object_unref (it); - return NULL; + g_object_unref (iterator); + + return match; } static void @@ -818,22 +836,21 @@ update_time (EventPage *epage, static void organizer_changed_cb (GtkEntry *entry, EventPage *epage) { - EAccount *account; + gchar *name; + gchar *mailto; - g_return_if_fail (entry != NULL); g_return_if_fail (GTK_IS_ENTRY (entry)); - g_return_if_fail (epage != NULL); g_return_if_fail (IS_EVENT_PAGE (epage)); if (!epage->priv->ia) return; - account = get_current_account (epage); - if (!account || !account->id) + if (!get_current_identity (epage, &name, &mailto)) return; - e_meeting_attendee_set_address (epage->priv->ia, g_strdup_printf ("MAILTO:%s", account->id->address)); - e_meeting_attendee_set_cn (epage->priv->ia, g_strdup (account->id->name)); + /* XXX EMeetingAttendee takes ownership of the strings. */ + e_meeting_attendee_set_cn (epage->priv->ia, name); + e_meeting_attendee_set_address (epage->priv->ia, mailto); } static void @@ -985,6 +1002,8 @@ event_page_fill_widgets (CompEditorPage *page, if (priv->is_meeting) { ECalComponentOrganizer organizer; + gchar *name = NULL; + gchar *mailto = NULL; priv->user_add = itip_get_comp_attendee (comp, client); @@ -1039,33 +1058,52 @@ event_page_fill_widgets (CompEditorPage *page, g_free (string); priv->existing = TRUE; } - } else { - EAccount *a; - - a = get_current_account (epage); - if (a != NULL) { - priv->ia = e_meeting_store_add_attendee_with_defaults (priv->meeting_store); - g_object_ref (priv->ia); - - if (!(backend_addr && *backend_addr) || !g_ascii_strcasecmp (backend_addr, a->id->address)) { - e_meeting_attendee_set_address (priv->ia, g_strdup_printf ("MAILTO:%s", a->id->address)); - e_meeting_attendee_set_cn (priv->ia, g_strdup (a->id->name)); - } else { - e_meeting_attendee_set_address (priv->ia, g_strdup_printf ("MAILTO:%s", backend_addr)); - e_meeting_attendee_set_sentby (priv->ia, g_strdup_printf ("MAILTO:%s", a->id->address)); + } else if (get_current_identity (epage, &name, &mailto)) { + EMeetingAttendee *attendee; + gchar *backend_mailto = NULL; + + if (backend_addr != NULL && *backend_addr != '\0') { + backend_mailto = g_strdup_printf ( + "MAILTO:%s", backend_addr); + if (g_ascii_strcasecmp (backend_mailto, mailto) == 0) { + g_free (backend_mailto); + backend_mailto = NULL; } + } - if (client && e_cal_get_organizer_must_accept (client)) - e_meeting_attendee_set_status (priv->ia, ICAL_PARTSTAT_NEEDSACTION); - else - e_meeting_attendee_set_status (priv->ia, ICAL_PARTSTAT_ACCEPTED); - e_meeting_list_view_add_attendee_to_name_selector (E_MEETING_LIST_VIEW (priv->list_view), priv->ia); + attendee = + e_meeting_store_add_attendee_with_defaults ( + priv->meeting_store); + priv->ia = g_object_ref (attendee); + + if (backend_mailto == NULL) { + e_meeting_attendee_set_cn (attendee, name); + e_meeting_attendee_set_address (attendee, mailto); + name = mailto = NULL; + } else { + e_meeting_attendee_set_address (attendee, backend_mailto); + e_meeting_attendee_set_sentby (attendee, mailto); + backend_mailto = mailto = NULL; } + + if (client && e_cal_get_organizer_must_accept (client)) + e_meeting_attendee_set_status ( + attendee, ICAL_PARTSTAT_NEEDSACTION); + else + e_meeting_attendee_set_status ( + attendee, ICAL_PARTSTAT_ACCEPTED); + + e_meeting_list_view_add_attendee_to_name_selector ( + E_MEETING_LIST_VIEW (priv->list_view), attendee); + + g_free (backend_mailto); } + + g_free (mailto); + g_free (name); } - if (backend_addr) - g_free (backend_addr); + g_free (backend_addr); /* Start and end times */ e_cal_component_get_dtstart (comp, &start_date); @@ -1438,44 +1476,47 @@ event_page_fill_component (CompEditorPage *page, ECalComponentOrganizer organizer = {NULL, NULL, NULL, NULL}; if (!priv->existing) { - EAccount *a; - gchar *backend_addr = NULL, *org_addr = NULL, *sentby = NULL; + gchar *backend_addr = NULL; + gchar *backend_mailto = NULL; + gchar *name; + gchar *mailto; e_cal_get_cal_address (client, &backend_addr, NULL); /* Find the identity for the organizer or sentby field */ - a = get_current_account (epage); - - /* Sanity Check */ - if (a == NULL) { - e_notice (priv->main, GTK_MESSAGE_ERROR, - _("The organizer selected no longer has an account.")); + if (!get_current_identity (epage, &name, &mailto)) { + e_notice ( + priv->main, GTK_MESSAGE_ERROR, + _("An organizer is required.")); return FALSE; } - if (a->id->address == NULL || strlen (a->id->address) == 0) { - e_notice (priv->main, GTK_MESSAGE_ERROR, - _("An organizer is required.")); - return FALSE; + /* Prefer the backend address if we have one. */ + if (backend_addr != NULL && *backend_addr != '\0') { + backend_mailto = g_strdup_printf ( + "MAILTO:%s", backend_addr); + if (g_ascii_strcasecmp (backend_mailto, mailto) == 0) { + g_free (backend_mailto); + backend_mailto = NULL; + } } - if (!(backend_addr && *backend_addr) || !g_ascii_strcasecmp (backend_addr, a->id->address)) { - org_addr = g_strdup_printf ("MAILTO:%s", a->id->address); - organizer.value = org_addr; - organizer.cn = a->id->name; + if (backend_mailto == NULL) { + organizer.cn = name; + organizer.value = mailto; + name = mailto = NULL; } else { - gchar *sentby = NULL; - org_addr = g_strdup_printf ("MAILTO:%s", backend_addr); - sentby = g_strdup_printf ("MAILTO:%s", a->id->address); - organizer.value = org_addr; - organizer.sentby = sentby; + organizer.value = backend_mailto; + organizer.sentby = mailto; + backend_mailto = mailto = NULL; } e_cal_component_set_organizer (comp, &organizer); g_free (backend_addr); - g_free (org_addr); - g_free (sentby); + g_free (backend_mailto); + g_free (name); + g_free (mailto); } if (e_meeting_store_count_actual_attendees (priv->meeting_store) < 1) { @@ -3211,8 +3252,8 @@ event_page_construct (EventPage *epage, EMeetingStore *meeting_store) { EventPagePrivate *priv; - EIterator *it; - EAccount *a; + EAccountList *account_list; + EIterator *iterator; priv = epage->priv; priv->meeting_store = g_object_ref (meeting_store); @@ -3231,24 +3272,27 @@ event_page_construct (EventPage *epage, return NULL; } - priv->accounts = e_get_account_list (); - for (it = e_list_get_iterator ((EList *)priv->accounts); - e_iterator_is_valid (it); - e_iterator_next (it)) { - gchar *full = NULL; + account_list = e_get_account_list (); + iterator = e_list_get_iterator (E_LIST (account_list)); - a = (EAccount *)e_iterator_get (it); + while (e_iterator_is_valid (iterator)) { + EAccount *account; - /* skip disabled accounts */ - if (!a->enabled) - continue; + /* XXX EIterator misuses const. */ + account = (EAccount *) e_iterator_get (iterator); - full = g_strdup_printf("%s <%s>", a->id->name, a->id->address); + if (account->enabled) + priv->address_strings = g_list_append ( + priv->address_strings, + g_strdup_printf ( + "%s <%s>", + account->id->name, + account->id->address)); - priv->address_strings = g_list_append (priv->address_strings, full); + e_iterator_next (iterator); } - g_object_unref (it); + g_object_unref (iterator); if (priv->address_strings) { GList *l; -- cgit v1.2.3