From 5557253687689807fbd8dbf3858b2ded03ca2c19 Mon Sep 17 00:00:00 2001 From: Milan Crha Date: Mon, 27 Jun 2022 18:18:43 +0200 Subject: [PATCH] I#1942 - Calendar: Show extra Google attendee info in component preview Closes https://gitlab.gnome.org/GNOME/evolution/-/issues/1942 --- src/calendar/gui/e-cal-component-preview.c | 61 ++++++++++++++++++++ src/calendar/importers/icalendar-importer.c | 62 +++++++++++++++++++-- 2 files changed, 118 insertions(+), 5 deletions(-) diff --git a/src/calendar/gui/e-cal-component-preview.c b/src/calendar/gui/e-cal-component-preview.c index 8987abbe74..af7e5bb12d 100644 --- a/src/calendar/gui/e-cal-component-preview.c +++ b/src/calendar/gui/e-cal-component-preview.c @@ -452,6 +452,7 @@ cal_component_preview_write_html (ECalComponentPreview *preview, for (a = attendees; a; a = a->next) { ECalComponentAttendee *attnd = a->data; + ECalComponentParameterBag *param_bag; const gchar *email = cal_comp_util_get_attendee_email (attnd); if (!attnd || !email || !*email) @@ -490,6 +491,66 @@ cal_component_preview_write_html (ECalComponentPreview *preview, g_free (str); } + param_bag = e_cal_component_attendee_get_parameter_bag (attnd); + if (param_bag) { + ICalParameter *num_guests = NULL; + ICalParameter *response_comment = NULL; + guint ii, count; + + count = e_cal_component_parameter_bag_get_count (param_bag); + for (ii = 0; ii < count && (!num_guests || !response_comment); ii++) { + ICalParameter *param = e_cal_component_parameter_bag_get (param_bag, ii); + + if (param && i_cal_parameter_isa (param) == I_CAL_X_PARAMETER) { + const gchar *xname = i_cal_parameter_get_xname (param); + + if (!xname) + continue; + + if (!num_guests && g_ascii_strcasecmp (xname, "X-NUM-GUESTS") == 0) + num_guests = param; + + if (!response_comment && g_ascii_strcasecmp (xname, "X-RESPONSE-COMMENT") == 0) + response_comment = param; + } + } + + if (num_guests && i_cal_parameter_get_xvalue (num_guests)) { + gint n_guests; + + n_guests = (gint) g_ascii_strtoll (i_cal_parameter_get_xvalue (num_guests), NULL, 10); + + if (n_guests > 0) { + gchar *str, *escaped; + + str = g_strdup_printf (g_dngettext (GETTEXT_PACKAGE, "with one guest", "with %d guests", n_guests), n_guests); + escaped = g_markup_escape_text (str, -1); + + g_string_append_c (buffer, ' '); + g_string_append (buffer, escaped); + + g_free (escaped); + g_free (str); + } + } + + if (response_comment) { + const gchar *value = i_cal_parameter_get_xvalue (response_comment); + + if (value && *value) { + gchar *escaped; + + escaped = g_markup_escape_text (value, -1); + + g_string_append (buffer, " ("); + g_string_append (buffer, escaped); + g_string_append_c (buffer, ')'); + + g_free (escaped); + } + } + } + have = TRUE; } diff --git a/src/calendar/importers/icalendar-importer.c b/src/calendar/importers/icalendar-importer.c index 68b771c67f..b674e07647 100644 --- a/src/calendar/importers/icalendar-importer.c +++ b/src/calendar/importers/icalendar-importer.c @@ -1519,6 +1519,8 @@ preview_comp (EWebViewPreview *preview, for (link = attendees; link; link = g_slist_next (link)) { ECalComponentAttendee *attnd = link->data; + ECalComponentParameterBag *param_bag; + GString *str; const gchar *value, *cn; if (!attnd) @@ -1530,15 +1532,65 @@ preview_comp (EWebViewPreview *preview, cn = e_cal_component_attendee_get_cn (attnd); + str = g_string_new (""); + if (cn && *cn) { - tmp = g_strconcat (cn, " <", strip_mailto (value), ">", NULL); - /* Translators: Appointment's attendees */ - e_web_view_preview_add_section (preview, have ? NULL : C_("iCalImp", "Attendees"), tmp); - g_free (tmp); + g_string_append_printf (str, "%s <%s>", cn, strip_mailto (value)); } else { - e_web_view_preview_add_section (preview, have ? NULL : C_("iCalImp", "Attendees"), strip_mailto (value)); + g_string_append (str, strip_mailto (value)); } + param_bag = e_cal_component_attendee_get_parameter_bag (attnd); + if (param_bag) { + ICalParameter *num_guests = NULL; + ICalParameter *response_comment = NULL; + guint ii, count; + + count = e_cal_component_parameter_bag_get_count (param_bag); + for (ii = 0; ii < count && (!num_guests || !response_comment); ii++) { + ICalParameter *param = e_cal_component_parameter_bag_get (param_bag, ii); + + if (param && i_cal_parameter_isa (param) == I_CAL_X_PARAMETER) { + const gchar *xname = i_cal_parameter_get_xname (param); + + if (!xname) + continue; + + if (!num_guests && g_ascii_strcasecmp (xname, "X-NUM-GUESTS") == 0) + num_guests = param; + + if (!response_comment && g_ascii_strcasecmp (xname, "X-RESPONSE-COMMENT") == 0) + response_comment = param; + } + } + + if (num_guests && i_cal_parameter_get_xvalue (num_guests)) { + gint n_guests; + + n_guests = (gint) g_ascii_strtoll (i_cal_parameter_get_xvalue (num_guests), NULL, 10); + + if (n_guests > 0) { + g_string_append_c (str, ' '); + g_string_append_printf (str, g_dngettext (GETTEXT_PACKAGE, "with one guest", "with %d guests", n_guests), n_guests); + } + } + + if (response_comment) { + const gchar *value = i_cal_parameter_get_xvalue (response_comment); + + if (value && *value) { + g_string_append (str, " ("); + g_string_append (str, value); + g_string_append_c (str, ')'); + } + } + } + + /* Translators: Appointment's attendees */ + e_web_view_preview_add_section (preview, have ? NULL : C_("iCalImp", "Attendees"), str->str); + + g_string_free (str, TRUE); + have = TRUE; }