I#1089 - Extend the iTIP formatter to show ATTACH and URL
Closes https://gitlab.gnome.org/GNOME/evolution/-/issues/1089
This commit is contained in:
@ -86,7 +86,6 @@ emfe_itip_format (EMailFormatterExtension *extension,
|
||||
buffer = g_string_sized_new (2048);
|
||||
|
||||
itip_view_write (itip_part, formatter, buffer);
|
||||
|
||||
} else {
|
||||
CamelFolder *folder, *old_folder;
|
||||
CamelMimeMessage *message, *old_message;
|
||||
|
@ -57,6 +57,130 @@ static const gchar *parser_mime_types[] = {
|
||||
NULL
|
||||
};
|
||||
|
||||
static void
|
||||
empe_itip_wrap_attachment (EMailParser *parser,
|
||||
GString *part_id,
|
||||
ICalProperty *prop,
|
||||
const gchar *content,
|
||||
GQueue *queue)
|
||||
{
|
||||
CamelMimePart *opart;
|
||||
CamelDataWrapper *dw;
|
||||
ICalParameter *param;
|
||||
const gchar *mime_type = NULL, *tmp;
|
||||
|
||||
opart = camel_mime_part_new ();
|
||||
|
||||
param = i_cal_property_get_first_parameter (prop, I_CAL_FILENAME_PARAMETER);
|
||||
|
||||
if (param) {
|
||||
tmp = i_cal_parameter_get_filename (param);
|
||||
|
||||
if (tmp && *tmp)
|
||||
camel_mime_part_set_filename (opart, tmp);
|
||||
|
||||
g_object_unref (param);
|
||||
}
|
||||
|
||||
param = i_cal_property_get_first_parameter (prop, I_CAL_FMTTYPE_PARAMETER);
|
||||
|
||||
if (param)
|
||||
mime_type = i_cal_parameter_get_fmttype (param);
|
||||
|
||||
if (!mime_type || !*mime_type)
|
||||
mime_type = "application/octet-stream";
|
||||
|
||||
camel_mime_part_set_content (opart, content, strlen (content), mime_type);
|
||||
camel_mime_part_set_encoding (opart, CAMEL_TRANSFER_ENCODING_BASE64);
|
||||
|
||||
dw = camel_medium_get_content (CAMEL_MEDIUM (opart));
|
||||
camel_data_wrapper_set_encoding (dw, CAMEL_TRANSFER_ENCODING_BASE64);
|
||||
|
||||
e_mail_parser_wrap_as_attachment (parser, opart, part_id, queue);
|
||||
|
||||
g_clear_object (¶m);
|
||||
g_object_unref (opart);
|
||||
}
|
||||
|
||||
static void
|
||||
empe_itip_extract_attachments (EMailParser *parser,
|
||||
const gchar *vcalendar_str,
|
||||
GString *part_id,
|
||||
GQueue *queue)
|
||||
{
|
||||
ICalComponent *vcalendar, *ical_comp;
|
||||
ICalCompIter *iter;
|
||||
|
||||
if (!vcalendar_str)
|
||||
return;
|
||||
|
||||
vcalendar = i_cal_parser_parse_string (vcalendar_str);
|
||||
|
||||
if (!vcalendar)
|
||||
return;
|
||||
|
||||
iter = i_cal_component_begin_component (vcalendar, I_CAL_ANY_COMPONENT);
|
||||
ical_comp = i_cal_comp_iter_deref (iter);
|
||||
if (ical_comp) {
|
||||
ICalComponentKind kind;
|
||||
|
||||
kind = i_cal_component_isa (ical_comp);
|
||||
if (kind != I_CAL_VEVENT_COMPONENT &&
|
||||
kind != I_CAL_VTODO_COMPONENT &&
|
||||
kind != I_CAL_VFREEBUSY_COMPONENT &&
|
||||
kind != I_CAL_VJOURNAL_COMPONENT) {
|
||||
do {
|
||||
g_clear_object (&ical_comp);
|
||||
ical_comp = i_cal_comp_iter_next (iter);
|
||||
if (!ical_comp)
|
||||
break;
|
||||
kind = i_cal_component_isa (ical_comp);
|
||||
} while (ical_comp &&
|
||||
kind != I_CAL_VEVENT_COMPONENT &&
|
||||
kind != I_CAL_VTODO_COMPONENT &&
|
||||
kind != I_CAL_VFREEBUSY_COMPONENT &&
|
||||
kind != I_CAL_VJOURNAL_COMPONENT);
|
||||
}
|
||||
}
|
||||
|
||||
g_clear_object (&iter);
|
||||
|
||||
if (ical_comp) {
|
||||
ICalProperty *prop;
|
||||
gint len, index = 0;
|
||||
|
||||
len = part_id->len;
|
||||
|
||||
for (prop = i_cal_component_get_first_property (ical_comp, I_CAL_ATTACH_PROPERTY);
|
||||
prop;
|
||||
g_object_unref (prop), prop = i_cal_component_get_next_property (ical_comp, I_CAL_ATTACH_PROPERTY)) {
|
||||
ICalAttach *attach;
|
||||
|
||||
attach = i_cal_property_get_attach (prop);
|
||||
|
||||
if (attach && !i_cal_attach_get_is_url (attach)) {
|
||||
const gchar *content;
|
||||
|
||||
content = (const gchar *) i_cal_attach_get_data (attach);
|
||||
|
||||
if (content) {
|
||||
g_string_append_printf (part_id, ".attachment.%d", index);
|
||||
|
||||
empe_itip_wrap_attachment (parser, part_id, prop, content, queue);
|
||||
|
||||
g_string_truncate (part_id, len);
|
||||
index++;
|
||||
}
|
||||
}
|
||||
|
||||
g_clear_object (&attach);
|
||||
}
|
||||
}
|
||||
|
||||
g_clear_object (&ical_comp);
|
||||
g_clear_object (&vcalendar);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
empe_itip_parse (EMailParserExtension *extension,
|
||||
EMailParser *parser,
|
||||
@ -105,6 +229,9 @@ empe_itip_parse (EMailParserExtension *extension,
|
||||
|
||||
e_queue_transfer (&work_queue, out_mail_parts);
|
||||
|
||||
empe_itip_extract_attachments (parser, itip_part->vcalendar, part_id, &work_queue);
|
||||
e_queue_transfer (&work_queue, out_mail_parts);
|
||||
|
||||
g_string_truncate (part_id, len);
|
||||
|
||||
return TRUE;
|
||||
|
@ -22,6 +22,7 @@
|
||||
#define TEXT_ROW_SENDER "text_row_sender"
|
||||
#define TABLE_ROW_SUMMARY "table_row_summary"
|
||||
#define TABLE_ROW_LOCATION "table_row_location"
|
||||
#define TABLE_ROW_URL "table_row_url"
|
||||
#define TABLE_ROW_START_DATE "table_row_start_time"
|
||||
#define TABLE_ROW_END_DATE "table_row_end_time"
|
||||
#define TABLE_ROW_STATUS "table_row_status"
|
||||
|
@ -82,6 +82,7 @@ struct _ItipViewPrivate {
|
||||
gchar *location;
|
||||
gchar *status;
|
||||
gchar *comment;
|
||||
gchar *url;
|
||||
|
||||
struct tm *start_tm;
|
||||
guint start_tm_is_date : 1;
|
||||
@ -686,7 +687,8 @@ htmlize_text (const gchar *id,
|
||||
gchar **out_tmp)
|
||||
{
|
||||
if (text && *text) {
|
||||
if (g_strcmp0 (id, TABLE_ROW_LOCATION) == 0) {
|
||||
if (g_strcmp0 (id, TABLE_ROW_LOCATION) == 0 ||
|
||||
g_strcmp0 (id, TABLE_ROW_URL) == 0) {
|
||||
*out_tmp = camel_text_to_html (text, CAMEL_MIME_FILTER_TOHTML_CONVERT_URLS | CAMEL_MIME_FILTER_TOHTML_CONVERT_ADDRESSES, 0);
|
||||
} else {
|
||||
*out_tmp = g_markup_escape_text (text, -1);
|
||||
@ -1485,6 +1487,7 @@ itip_view_finalize (GObject *object)
|
||||
g_free (priv->location);
|
||||
g_free (priv->status);
|
||||
g_free (priv->comment);
|
||||
g_free (priv->url);
|
||||
g_free (priv->start_tm);
|
||||
g_free (priv->start_label);
|
||||
g_free (priv->end_tm);
|
||||
@ -1698,6 +1701,7 @@ itip_view_write (gpointer itip_part_ptr,
|
||||
|
||||
append_text_table_row (buffer, TABLE_ROW_SUMMARY, NULL, NULL);
|
||||
append_text_table_row (buffer, TABLE_ROW_LOCATION, _("Location:"), NULL);
|
||||
append_text_table_row (buffer, TABLE_ROW_URL, _("URL:"), NULL);
|
||||
append_text_table_row (buffer, TABLE_ROW_START_DATE, _("Start time:"), NULL);
|
||||
append_text_table_row (buffer, TABLE_ROW_END_DATE, _("End time:"), NULL);
|
||||
append_text_table_row (buffer, TABLE_ROW_STATUS, _("Status:"), NULL);
|
||||
@ -1809,6 +1813,9 @@ itip_view_write_for_printing (ItipView *view,
|
||||
append_text_table_row_nonempty (
|
||||
buffer, TABLE_ROW_LOCATION,
|
||||
_("Location:"), view->priv->location);
|
||||
append_text_table_row_nonempty (
|
||||
buffer, TABLE_ROW_URL,
|
||||
_("URL:"), view->priv->url);
|
||||
append_text_table_row_nonempty (
|
||||
buffer, TABLE_ROW_START_DATE,
|
||||
view->priv->start_header, view->priv->start_label);
|
||||
@ -2191,6 +2198,30 @@ itip_view_get_location (ItipView *view)
|
||||
return view->priv->location;
|
||||
}
|
||||
|
||||
void
|
||||
itip_view_set_url (ItipView *view,
|
||||
const gchar *url)
|
||||
{
|
||||
g_return_if_fail (ITIP_IS_VIEW (view));
|
||||
|
||||
if (view->priv->url == url)
|
||||
return;
|
||||
|
||||
g_free (view->priv->url);
|
||||
|
||||
view->priv->url = url ? g_strstrip (e_utf8_ensure_valid (url)) : NULL;
|
||||
|
||||
set_area_text (view, TABLE_ROW_URL, view->priv->url);
|
||||
}
|
||||
|
||||
const gchar *
|
||||
itip_view_get_url (ItipView *view)
|
||||
{
|
||||
g_return_val_if_fail (ITIP_IS_VIEW (view), NULL);
|
||||
|
||||
return view->priv->url;
|
||||
}
|
||||
|
||||
void
|
||||
itip_view_set_status (ItipView *view,
|
||||
const gchar *status)
|
||||
@ -6483,6 +6514,10 @@ itip_view_init_view (ItipView *view)
|
||||
itip_view_set_location (view, string);
|
||||
g_free (string);
|
||||
|
||||
string = e_cal_component_get_url (view->priv->comp);
|
||||
itip_view_set_url (view, string);
|
||||
g_free (string);
|
||||
|
||||
/* Status really only applies for REPLY */
|
||||
if (response_enabled && view->priv->method == I_CAL_METHOD_REPLY) {
|
||||
list = e_cal_component_get_attendees (view->priv->comp);
|
||||
|
@ -158,6 +158,9 @@ void itip_view_set_summary (ItipView *view,
|
||||
const gchar * itip_view_get_location (ItipView *view);
|
||||
void itip_view_set_location (ItipView *view,
|
||||
const gchar *location);
|
||||
const gchar * itip_view_get_url (ItipView *view);
|
||||
void itip_view_set_url (ItipView *view,
|
||||
const gchar *url);
|
||||
const gchar * itip_view_get_status (ItipView *view);
|
||||
void itip_view_set_status (ItipView *view,
|
||||
const gchar *status);
|
||||
|
Reference in New Issue
Block a user