aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mail/ChangeLog8
-rw-r--r--mail/Makefile.am2
-rw-r--r--mail/em-format-quote.c9
-rw-r--r--mail/em-stripsig-filter.c169
-rw-r--r--mail/em-stripsig-filter.h64
-rw-r--r--mail/mail-component.c4
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);