From 5437fa7c354b5ddf12b4e13136834d86168e3580 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dan=20Vr=C3=A1til?= Date: Mon, 8 Oct 2012 23:27:29 +0200 Subject: Bug #684447 - Check for highlight during configure. If the highlight program cannot be found width AC_PATH_PROGS, configure will abort with an error message. You can either a) install highlight b) specify the patch with HIGHLIGHT=/path/to/highlight c) pass --disable-text-highlight to configure to exclude the module This also makes text-highlight module to fallback to text/plain formatter when highlight program would crash or fail to ensure the content is delivered to user. --- configure.ac | 30 ++++++++ em-format/e-mail-formatter-text-plain.c | 1 + modules/Makefile.am | 8 +- .../e-mail-formatter-text-highlight.c | 85 ++++++++++++++-------- 4 files changed, 91 insertions(+), 33 deletions(-) diff --git a/configure.ac b/configure.ac index 95f6ca979b..db4a7af05f 100644 --- a/configure.ac +++ b/configure.ac @@ -1312,6 +1312,35 @@ fi AM_CONDITIONAL([ENABLE_AUDIO_INLINE], [test "x$enable_audio_inline" = "xyes"]) +dnl ************************************************** +dnl text-highlight plugins requires highlight utility +dnl ************************************************** +AC_ARG_ENABLE([text-highlight], + [AS_HELP_STRING([--enable-text-highlight], + [Enable text-highlight plugin (default=yes)])], + [enable_text_highlight="$enableval"], [enable_text_highlight=yes]) +AC_MSG_CHECKING([if source code highlighting support is enabled]) +AC_MSG_RESULT([$enable_text_highlight]) +msg_text_highlight="$enable_text_highlight" +if test "x$enable_text_highlight" = "xyes"; then + AC_ARG_VAR([HIGHLIGHT], [Source code highlighting utility]) + AC_PATH_PROG([HIGHLIGHT], [highlight]) + if test "x$HIGHLIGHT" == "x"; then + AC_MSG_ERROR([ + + Highlight utility not found. + + If you want to disable text-highlight plugin, + please append --disable-text-highlight to configure.]) + fi + AC_DEFINE_UNQUOTED( + HIGHLIGHT_COMMAND, "$HIGHLIGHT", + [Source code highlighting utility]) + + msg_text_highlight="$msg_text_highlight ($HIGHLIGHT)" +fi +AM_CONDITIONAL([ENABLE_TEXT_HIGHLIGHT], [test "x$enable_text_highlight" = "xyes"]) + dnl ************************************** dnl Weather calendars require gweather-3.0 dnl ************************************** @@ -1685,6 +1714,7 @@ echo " SMIME support: $msg_smime Bogofilter support: $msg_bogofilter SpamAssassin support: $msg_spamassassin + Highlight support: $msg_text_highlight Plugins: $msg_plugins User documentation: $with_help " diff --git a/em-format/e-mail-formatter-text-plain.c b/em-format/e-mail-formatter-text-plain.c index 7fd63b5566..5ef5ba3d1f 100644 --- a/em-format/e-mail-formatter-text-plain.c +++ b/em-format/e-mail-formatter-text-plain.c @@ -34,6 +34,7 @@ static const gchar *formatter_mime_types[] = { "text/plain", "text/*", "message/*", + "application/vnd.evolution.plaintext", NULL }; typedef struct _EMailFormatterTextPlain { diff --git a/modules/Makefile.am b/modules/Makefile.am index a7e34de52b..6bb19c8071 100644 --- a/modules/Makefile.am +++ b/modules/Makefile.am @@ -26,6 +26,10 @@ if ENABLE_AUDIO_INLINE AUDIO_INLINE_DIR = audio-inline endif +if ENABLE_TEXT_HIGHLIGHT +TEXT_HIGHLIGHT_DIR = text-highlight +endif + SUBDIRS = \ addressbook \ calendar \ @@ -52,13 +56,13 @@ SUBDIRS = \ plugin-manager \ prefer-plain \ startup-wizard \ - text-highlight \ vcard-inline \ web-inspector \ $(BOGOFILTER_DIR) \ $(ONLINE_ACCOUNTS_DIR) \ $(SPAMASSASSIN_DIR) \ $(TNEF_ATTACHMENT_DIR) \ - $(AUDIO_INLINE_DIR) + $(AUDIO_INLINE_DIR) \ + $(TEXT_HIGHLIGHT_DIR) -include $(top_srcdir)/git.mk diff --git a/modules/text-highlight/e-mail-formatter-text-highlight.c b/modules/text-highlight/e-mail-formatter-text-highlight.c index 48c6e7a742..e0a892cd20 100644 --- a/modules/text-highlight/e-mail-formatter-text-highlight.c +++ b/modules/text-highlight/e-mail-formatter-text-highlight.c @@ -258,43 +258,66 @@ emfe_text_highlight_format (EMailFormatterExtension *extension, argv[3] = g_strdup_printf ("--syntax=%s", syntax); g_free (syntax); - if (!g_spawn_async_with_pipes ( - NULL, (gchar **) argv, NULL, - G_SPAWN_SEARCH_PATH | - G_SPAWN_DO_NOT_REAP_CHILD, - NULL, NULL, &pid, &pipe_stdin, &pipe_stdout, NULL, NULL)) { - return FALSE; + if (g_spawn_async_with_pipes ( + NULL, (gchar **) argv, NULL, + G_SPAWN_SEARCH_PATH | + G_SPAWN_DO_NOT_REAP_CHILD, + NULL, NULL, &pid, &pipe_stdin, &pipe_stdout, NULL, NULL)) { + + write = camel_stream_fs_new_with_fd (pipe_stdin); + read = camel_stream_fs_new_with_fd (pipe_stdout); + + /* Decode the content of mime part to the 'utf8' stream */ + utf8 = camel_stream_mem_new (); + camel_data_wrapper_decode_to_stream_sync ( + dw, utf8, cancellable, NULL); + + /* Convert the binary data do someting displayable */ + ba = camel_stream_mem_get_byte_array (CAMEL_STREAM_MEM (utf8)); + tmp = e_util_utf8_data_make_valid ((gchar *) ba->data, ba->len); + + /* Send the sanitized data to the highlighter */ + camel_stream_write_string (write, tmp, cancellable, NULL); + g_free (tmp); + g_object_unref (utf8); + g_object_unref (write); + + g_spawn_close_pid (pid); + + g_seekable_seek (G_SEEKABLE (read), 0, G_SEEK_SET, cancellable, NULL); + camel_stream_write_to_stream (read, stream, cancellable, NULL); + g_object_unref (read); + } else { + /* We can't call e_mail_formatter_format_as on text/plain, + * because text-highlight is registered as an handler for + * text/plain, so we would end up in an endless recursion. + * + * Just return FALSE here and EMailFormatter will automatically + * fall back to the default text/plain formatter */ + if (camel_content_type_is (ct, "text", "plain")) { + g_free (font_family); + g_free (font_size); + g_free ((gchar *) argv[3]); + pango_font_description_free (fd); + + return FALSE; + } else { + /* In case of any other content, force use of + * text/plain formatter, because returning FALSE + * for text/x-patch or application/php would show + * an error, as there is no other handler registered + * for these */ + e_mail_formatter_format_as ( + formatter, context, part, stream, + "application/vnd.evolution.plaintext", + cancellable); + } } - write = camel_stream_fs_new_with_fd (pipe_stdin); - read = camel_stream_fs_new_with_fd (pipe_stdout); - - /* Decode the content of mime part to the 'utf8' stream */ - utf8 = camel_stream_mem_new (); - camel_data_wrapper_decode_to_stream_sync ( - dw, utf8, cancellable, NULL); - - /* Convert the binary data do someting displayable */ - ba = camel_stream_mem_get_byte_array (CAMEL_STREAM_MEM (utf8)); - tmp = e_util_utf8_data_make_valid ((gchar *) ba->data, ba->len); - - /* Send the sanitized data to the highlighter */ - camel_stream_write_string (write, tmp, cancellable, NULL); - g_free (tmp); - g_object_unref (utf8); - g_object_unref (write); - - g_spawn_close_pid (pid); - - g_seekable_seek (G_SEEKABLE (read), 0, G_SEEK_SET, cancellable, NULL); - camel_stream_write_to_stream (read, stream, cancellable, NULL); - g_object_unref (read); - g_free (font_family); g_free (font_size); g_free ((gchar *) argv[3]); pango_font_description_free (fd); - } else { gchar *uri, *str; gchar *syntax; -- cgit v1.2.3