[evolution] Bug #684447 - Check for highlight during configure.



commit 5437fa7c354b5ddf12b4e13136834d86168e3580
Author: Dan VrÃtil <dvratil redhat com>
Date:   Mon Oct 8 23:27:29 2012 +0200

    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 95f6ca9..db4a7af 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 7fd63b5..5ef5ba3 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 a7e34de..6bb19c8 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 48c6e7a..e0a892c 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;



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]