[evolution/wip-webkit2] EMailDisplay - Process correctly mail URI scheme
- From: Tomas Popela <tpopela src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution/wip-webkit2] EMailDisplay - Process correctly mail URI scheme
- Date: Fri, 8 Nov 2013 13:51:49 +0000 (UTC)
commit 3f360c933a1a78790d5c194cf3ace7e1cf175094
Author: Tomas Popela <tpopela redhat com>
Date: Fri Nov 8 14:37:10 2013 +0100
EMailDisplay - Process correctly mail URI scheme
mail/e-mail-display.c | 162 +++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 162 insertions(+), 0 deletions(-)
---
diff --git a/mail/e-mail-display.c b/mail/e-mail-display.c
index ef0343e..42466a3 100644
--- a/mail/e-mail-display.c
+++ b/mail/e-mail-display.c
@@ -1447,10 +1447,172 @@ mail_gtk_stock_uri_scheme_appeared_cb (WebKitURISchemeRequest *request,
{
}
+static gchar *
+get_value_from_uri (const gchar *uri,
+ const gchar *key)
+{
+ const gchar *key_position;
+ const gchar *value_start;
+ const gchar *value_end;
+ gchar *value;
+
+ key_position = strstr (uri, key);
+ if (!key_position)
+ return NULL;
+
+ value_start = strstr (key_position, "=");
+ if (!value_start)
+ return NULL;
+
+ value_end = strstr (value_start, "&");
+
+ if (value_end)
+ value = g_utf8_substring (value_start, 1, g_utf8_pointer_to_offset (value_start, value_end));
+ else
+ value = g_utf8_substring (value_start, 1, g_utf8_strlen (value_start, -1));
+
+ return value;
+}
+
static void
mail_mail_uri_scheme_appeared_cb (WebKitURISchemeRequest *request,
EMailDisplay *display)
{
+ GInputStream *stream;
+ EMailFormatter *formatter;
+ EMailPartList *part_list;
+ CamelStream *output_stream;
+ GByteArray *byte_array;
+ gchar *val;
+ const gchar *uri;
+ gchar *default_charset, *charset, *mode;
+
+ GCancellable *cancellable = NULL;
+
+ EMailFormatterContext context = { 0 };
+
+ uri = webkit_uri_scheme_request_get_uri (request);
+
+ part_list = display->priv->part_list;
+
+ if (camel_debug_start ("emformat:requests")) {
+ printf ("%s: found part-list %p for full_uri '%s'\n", G_STRFUNC, part_list, uri);
+ camel_debug_end ();
+ }
+
+ if (!part_list)
+ return;
+
+ if (display->priv->headers_collapsed)
+ context.flags |= E_MAIL_FORMATTER_HEADER_FLAG_COLLAPSED;
+
+ if (display->priv->headers_collapsable)
+ context.flags |= E_MAIL_FORMATTER_HEADER_FLAG_COLLAPSABLE;
+
+ mode = get_value_from_uri (uri, "mode");
+ if (mode)
+ context.mode = atoi (mode);
+
+ default_charset = get_value_from_uri (uri, "formatter_default_charset");
+ charset = get_value_from_uri (uri, "formatter_charset");
+
+ context.part_list = g_object_ref (part_list);
+ context.uri = g_strdup (uri);
+
+ formatter = display->priv->formatter;
+
+ if (default_charset != NULL && *default_charset != '\0') {
+ e_mail_formatter_set_default_charset (formatter, default_charset);
+ g_free (default_charset);
+ }
+ if (charset != NULL && *charset != '\0') {
+ e_mail_formatter_set_charset (formatter, charset);
+ g_free (charset);
+ }
+
+ byte_array = g_byte_array_new ();
+ output_stream = camel_stream_mem_new ();
+
+ /* We retain ownership of the byte array. */
+ camel_stream_mem_set_byte_array (
+ CAMEL_STREAM_MEM (output_stream), byte_array);
+
+ val = get_value_from_uri (uri, "part_id");
+ if (val != NULL) {
+ EMailPart *part;
+ gchar *mime_type;
+
+ part = e_mail_part_list_ref_part (part_list, val);
+ if (!part) {
+ if (camel_debug_start ("emformat:requests")) {
+ printf ("%s: part with id '%s' not found\n", G_STRFUNC, val);
+ camel_debug_end ();
+ }
+
+ g_free (val);
+ goto no_part;
+ }
+ g_free (val);
+
+ mime_type = get_value_from_uri (uri, "mime_type");
+
+ if (context.mode == E_MAIL_FORMATTER_MODE_SOURCE) {
+ g_free (mime_type);
+ mime_type = g_strdup ("application/vnd.evolution.source");
+ }
+
+ if (context.mode == E_MAIL_FORMATTER_MODE_CID) {
+ CamelDataWrapper *dw;
+ CamelMimePart *mime_part;
+
+ mime_part = e_mail_part_ref_mime_part (part);
+ dw = camel_medium_get_content (CAMEL_MEDIUM (mime_part));
+ g_return_if_fail (dw);
+
+ camel_data_wrapper_decode_to_stream_sync (
+ dw, output_stream, cancellable, NULL);
+
+ g_object_unref (mime_part);
+ } else {
+ if (!mime_type)
+ mime_type = g_strdup (e_mail_part_get_mime_type (part));
+
+ e_mail_formatter_format_as (
+ formatter, &context, part,
+ output_stream, mime_type,
+ cancellable);
+
+ g_free (mime_type);
+ }
+
+ g_object_unref (part);
+ } else {
+ e_mail_formatter_format_sync (
+ formatter, part_list, output_stream,
+ context.flags, context.mode, cancellable);
+ }
+
+ no_part:
+ g_clear_object (&output_stream);
+ g_clear_object (&context.part_list);
+
+ if (byte_array->data == NULL) {
+ gchar *data;
+
+ data = g_strdup_printf (
+ "<p align='center'>%s</p>",
+ _("The message has no text content."));
+ g_byte_array_append (
+ byte_array, (guint8 *) data, strlen (data));
+ g_free (data);
+ }
+
+ stream = g_memory_input_stream_new_from_bytes (
+ g_byte_array_free_to_bytes (byte_array));
+
+ /* FIXME This can be done async */
+ webkit_uri_scheme_request_finish (request, stream, -1, "text/html");
+ g_object_unref (stream);
}
static void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]