diff options
-rw-r--r-- | mail/ChangeLog | 8 | ||||
-rw-r--r-- | mail/Makefile.am | 2 | ||||
-rw-r--r-- | mail/em-format-quote.c | 9 | ||||
-rw-r--r-- | mail/em-stripsig-filter.c | 169 | ||||
-rw-r--r-- | mail/em-stripsig-filter.h | 64 | ||||
-rw-r--r-- | mail/mail-component.c | 4 |
6 files changed, 252 insertions, 4 deletions
diff --git a/mail/ChangeLog b/mail/ChangeLog index daefa85582..0196d30f3a 100644 --- a/mail/ChangeLog +++ b/mail/ChangeLog @@ -1,3 +1,11 @@ +2004-05-13 Jeffrey Stedfast <fejj@novell.com> + + * em-format-quote.c (emfq_text_plain): Add a stripsig + filter. Fixes bug #52767. + + * em-stripsig-filter.[c,h]: New filter class to strip + signatures. Useful when generating forwards/replies. + 2004-05-13 Not Zed <NotZed@Ximian.com> * em-migrate.c (em_migrate_folder): move ignore case outside of diff --git a/mail/Makefile.am b/mail/Makefile.am index 6d9f0c7f73..6aacd80cb6 100644 --- a/mail/Makefile.am +++ b/mail/Makefile.am @@ -92,6 +92,8 @@ libevolution_mail_la_SOURCES = \ em-format-html-print.h \ em-format-html-quote.c \ em-format-html-quote.h \ + em-stripsig-filter.c \ + em-stripsig-filter.h \ em-format-quote.c \ em-format-quote.h \ em-message-browser.c \ diff --git a/mail/em-format-quote.c b/mail/em-format-quote.c index ede8f8e94a..f0f45787ae 100644 --- a/mail/em-format-quote.c +++ b/mail/em-format-quote.c @@ -36,6 +36,7 @@ #include <gal/util/e-iconv.h> +#include "em-stripsig-filter.h" #include "em-format-quote.h" struct _EMFormatQuotePrivate { @@ -422,6 +423,7 @@ emfq_text_plain(EMFormatQuote *emfq, CamelStream *stream, CamelMimePart *part, E { CamelStreamFilter *filtered_stream; CamelMimeFilter *html_filter; + CamelMimeFilter *sig_strip; CamelContentType *type; const char *format; guint32 rgb = 0x737373, flags; @@ -435,10 +437,13 @@ emfq_text_plain(EMFormatQuote *emfq, CamelStream *stream, CamelMimePart *part, E && !g_ascii_strcasecmp(format, "flowed")) flags |= CAMEL_MIME_FILTER_TOHTML_FORMAT_FLOWED; + sig_strip = em_stripsig_filter_new(); html_filter = camel_mime_filter_tohtml_new(flags, rgb); filtered_stream = camel_stream_filter_new_with_stream(stream); + camel_stream_filter_add(filtered_stream, sig_strip); camel_stream_filter_add(filtered_stream, html_filter); camel_object_unref(html_filter); + camel_object_unref(sig_strip); em_format_format_text((EMFormat *)emfq, (CamelStream *)filtered_stream, camel_medium_get_content_object((CamelMedium *)part)); camel_stream_flush((CamelStream *)filtered_stream); @@ -457,9 +462,9 @@ emfq_text_enriched(EMFormatQuote *emfq, CamelStream *stream, CamelMimePart *part if (!strcmp(info->mime_type, "text/richtext")) { flags = CAMEL_MIME_FILTER_ENRICHED_IS_RICHTEXT; - camel_stream_write_string( stream, "\n<!-- text/richtext -->\n"); + camel_stream_write_string(stream, "\n<!-- text/richtext -->\n"); } else { - camel_stream_write_string( stream, "\n<!-- text/enriched -->\n"); + camel_stream_write_string(stream, "\n<!-- text/enriched -->\n"); } enriched = camel_mime_filter_enriched_new(flags); diff --git a/mail/em-stripsig-filter.c b/mail/em-stripsig-filter.c new file mode 100644 index 0000000000..d70db037a8 --- /dev/null +++ b/mail/em-stripsig-filter.c @@ -0,0 +1,169 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Authors: Jeffrey Stedfast <fejj@ximian.com> + * + * Copyright 2001-2004 Ximian, Inc. (www.ximian.com) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * + */ + + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <stdio.h> +#include <string.h> + +#include "em-stripsig-filter.h" + + +static void em_stripsig_filter_class_init (EMStripSigFilterClass *klass); +static void em_stripsig_filter_init (EMStripSigFilter *filter, EMStripSigFilterClass *klass); + +static void filter_filter (CamelMimeFilter *filter, char *in, size_t len, size_t prespace, + char **out, size_t *outlen, size_t *outprespace); +static void filter_complete (CamelMimeFilter *filter, char *in, size_t len, size_t prespace, + char **out, size_t *outlen, size_t *outprespace); +static void filter_reset (CamelMimeFilter *filter); + + +static CamelMimeFilterClass *parent_class = NULL; + + +CamelType +em_stripsig_filter_get_type (void) +{ + static CamelType type = CAMEL_INVALID_TYPE; + + if (type == CAMEL_INVALID_TYPE) { + type = camel_type_register (camel_mime_filter_get_type (), + "EMStripSigFilter", + sizeof (EMStripSigFilter), + sizeof (EMStripSigFilterClass), + (CamelObjectClassInitFunc) em_stripsig_filter_class_init, + NULL, + (CamelObjectInitFunc) em_stripsig_filter_init, + NULL); + } + + return type; +} + + +static void +em_stripsig_filter_class_init (EMStripSigFilterClass *klass) +{ + CamelMimeFilterClass *filter_class = (CamelMimeFilterClass *) klass; + + parent_class = CAMEL_MIME_FILTER_CLASS (camel_type_get_global_classfuncs (camel_mime_filter_get_type ())); + + filter_class->reset = filter_reset; + filter_class->filter = filter_filter; + filter_class->complete = filter_complete; +} + +static void +em_stripsig_filter_init (EMStripSigFilter *filter, EMStripSigFilterClass *klass) +{ + filter->midline = FALSE; +} + +static void +strip_signature (CamelMimeFilter *filter, char *in, size_t len, size_t prespace, + char **out, size_t *outlen, size_t *outprespace, int flush) +{ + EMStripSigFilter *stripsig = (EMStripSigFilter *) filter; + register const char *inptr = in; + const char *inend = in + len; + const char *start = NULL; + + if (stripsig->midline) { + while (inptr < inend && *inptr != '\n') + inptr++; + + if (inptr < inend) { + stripsig->midline = FALSE; + inptr++; + } + } + + while (inptr < inend) { + if ((inend - inptr) >= 4 && !strncmp (inptr, "-- \n", 4)) { + start = inptr; + inptr += 4; + } else { + while (inptr < inend && *inptr != '\n') + inptr++; + + if (inptr == inend) { + stripsig->midline = TRUE; + break; + } + + inptr++; + } + } + + if (start != NULL) + inptr = start; + + if (!flush && inend > inptr) + camel_mime_filter_backup (filter, inptr, inend - inptr); + else if (!start) + inptr = inend; + + *out = in; + *outlen = inptr - in; + *outprespace = prespace; +} + +static void +filter_filter (CamelMimeFilter *filter, char *in, size_t len, size_t prespace, + char **out, size_t *outlen, size_t *outprespace) +{ + strip_signature (filter, in, len, prespace, out, outlen, outprespace, FALSE); +} + +static void +filter_complete (CamelMimeFilter *filter, char *in, size_t len, size_t prespace, + char **out, size_t *outlen, size_t *outprespace) +{ + strip_signature (filter, in, len, prespace, out, outlen, outprespace, TRUE); +} + +/* should this 'flush' outstanding state/data bytes? */ +static void +filter_reset (CamelMimeFilter *filter) +{ + EMStripSigFilter *stripsig = (EMStripSigFilter *) filter; + + stripsig->midline = FALSE; +} + + +/** + * em_stripsig_filter_new: + * + * Creates a new stripsig filter. + * + * Returns a new stripsig filter. + **/ +CamelMimeFilter * +em_stripsig_filter_new (void) +{ + return (CamelMimeFilter *) camel_object_new (EM_TYPE_STRIPSIG_FILTER); +} diff --git a/mail/em-stripsig-filter.h b/mail/em-stripsig-filter.h new file mode 100644 index 0000000000..e94b28636e --- /dev/null +++ b/mail/em-stripsig-filter.h @@ -0,0 +1,64 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Authors: Jeffrey Stedfast <fejj@ximian.com> + * + * Copyright 2001-2004 Ximian, Inc. (www.ximian.com) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * + */ + + +#ifndef __EM_STRIPSIG_FILTER_H__ +#define __EM_STRIPSIG_FILTER_H__ + +#include <camel/camel-mime-filter.h> + +#ifdef __cplusplus +extern "C" { +#pragma } +#endif /* __cplusplus */ + +#define EM_TYPE_STRIPSIG_FILTER (em_stripsig_filter_get_type ()) +#define EM_STRIPSIG_FILTER(obj) (CAMEL_CHECK_CAST ((obj), EM_TYPE_STRIPSIG_FILTER, EMStripSigFilter)) +#define EM_STRIPSIG_FILTER_CLASS(klass) (CAMEL_CHECK_CLASS_CAST ((klass), EM_TYPE_STRIPSIG_FILTER, EMStripSigFilterClass)) +#define EM_IS_STRIPSIG_FILTER(obj) (CAMEL_CHECK_TYPE ((obj), EM_TYPE_STRIPSIG_FILTER)) +#define EM_IS_STRIPSIG_FILTER_CLASS(klass) (CAMEL_CHECK_CLASS_TYPE ((klass), EM_TYPE_STRIPSIG_FILTER)) +#define EM_STRIPSIG_FILTER_GET_CLASS(obj) (CAMEL_CHECK_GET_CLASS ((obj), EM_TYPE_STRIPSIG_FILTER, EMStripSigFilterClass)) + +typedef struct _EMStripSigFilter EMStripSigFilter; +typedef struct _EMStripSigFilterClass EMStripSigFilterClass; + +struct _EMStripSigFilter { + CamelMimeFilter parent_object; + + guint32 midline:1; +}; + +struct _EMStripSigFilterClass { + CamelMimeFilterClass parent_class; + +}; + + +CamelType em_stripsig_filter_get_type (void); + +CamelMimeFilter *em_stripsig_filter_new (void); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __EM_STRIPSIG_FILTER_H__ */ diff --git a/mail/mail-component.c b/mail/mail-component.c index 7310b12a35..0f8438977e 100644 --- a/mail/mail-component.c +++ b/mail/mail-component.c @@ -294,13 +294,13 @@ setup_search_context (MailComponent *component) if (priv->search_context == NULL) { char *user = g_build_filename(component->priv->base_directory, "mail/searches.xml", NULL); char *system = g_strdup (EVOLUTION_PRIVDATADIR "/searchtypes.xml"); - + priv->search_context = rule_context_new (); /* This is a sort of hack, but saves us having to have a search context just to do it for us */ priv->search_context->flags |= RULE_CONTEXT_THREADING; g_object_set_data_full (G_OBJECT (priv->search_context), "user", user, g_free); g_object_set_data_full (G_OBJECT (priv->search_context), "system", system, g_free); - + rule_context_add_part_set (priv->search_context, "partset", filter_part_get_type (), rule_context_add_part, rule_context_next_part); |