aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--camel/ChangeLog10
-rw-r--r--camel/Makefile.am2
-rw-r--r--camel/camel-mime-filter-crlf.c132
-rw-r--r--camel/camel-mime-filter-crlf.h53
-rw-r--r--camel/camel-mime-part.c6
-rw-r--r--camel/camel-types.h1
-rw-r--r--camel/camel.h1
7 files changed, 205 insertions, 0 deletions
diff --git a/camel/ChangeLog b/camel/ChangeLog
index 6ddf78ef27..c045edcaf7 100644
--- a/camel/ChangeLog
+++ b/camel/ChangeLog
@@ -1,3 +1,13 @@
+2000-06-12 Dan Winship <danw@helixcode.com>
+
+ * camel-mime-filter-crlf.c: New filter to do CRLF<->LF conversion.
+ (Currently only tested in the LF->CRLF direction.)
+
+ * camel-mime-part.c (write_to_stream): if content-type is text,
+ and it's QP or B64 encoded, pass through the CRLF filter before
+ the other filter to satisfy the "canonical encoding" rules in the
+ MIME spec.
+
2000-06-09 Dan Winship <danw@helixcode.com>
* camel-session.c (camel_session_query_authenticator): Add another
diff --git a/camel/Makefile.am b/camel/Makefile.am
index 13351044c2..8505bc1819 100644
--- a/camel/Makefile.am
+++ b/camel/Makefile.am
@@ -54,6 +54,7 @@ libcamel_la_SOURCES = \
camel-mime-filter-index.c \
camel-mime-filter-from.c \
camel-mime-filter-smtp.c \
+ camel-mime-filter-crlf.c \
camel-stream-filter.c \
camel-address.c \
camel-internet-address.c
@@ -100,6 +101,7 @@ libcamelinclude_HEADERS = \
camel-mime-filter-index.h \
camel-mime-filter-from.h \
camel-mime-filter-smtp.h \
+ camel-mime-filter-crlf.h \
camel-stream-filter.h \
camel-address.h \
camel-internet-address.h
diff --git a/camel/camel-mime-filter-crlf.c b/camel/camel-mime-filter-crlf.c
new file mode 100644
index 0000000000..d39d00887f
--- /dev/null
+++ b/camel/camel-mime-filter-crlf.c
@@ -0,0 +1,132 @@
+/*
+ * Copyright (C) 2000 Helix Code, Inc.
+ *
+ * Authors: Dan Winship <danw@helixcode.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library 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 Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include "camel-mime-filter-crlf.h"
+
+static void filter (CamelMimeFilter *f, char *in, size_t len, size_t prespace,
+ char **out, size_t *outlen, size_t *outprespace);
+static void complete (CamelMimeFilter *f, char *in, size_t len,
+ size_t prespace, char **out, size_t *outlen,
+ size_t *outprespace);
+static void reset (CamelMimeFilter *f);
+
+
+static void
+camel_mime_filter_crlf_class_init (CamelMimeFilterCRLFClass *klass)
+{
+ CamelMimeFilterClass *mime_filter_class =
+ (CamelMimeFilterClass *) klass;
+
+ mime_filter_class->filter = filter;
+ mime_filter_class->complete = complete;
+ mime_filter_class->reset = reset;
+}
+
+GtkType
+camel_mime_filter_crlf_get_type (void)
+{
+ static GtkType type = 0;
+
+ if (!type) {
+ GtkTypeInfo type_info = {
+ "CamelMimeFilterCRLF",
+ sizeof (CamelMimeFilterCRLF),
+ sizeof (CamelMimeFilterCRLFClass),
+ (GtkClassInitFunc) camel_mime_filter_crlf_class_init,
+ (GtkObjectInitFunc) NULL,
+ /* reserved_1 */ NULL,
+ /* reserved_2 */ NULL,
+ (GtkClassInitFunc) NULL
+ };
+
+ type = gtk_type_unique (camel_mime_filter_get_type (),
+ &type_info);
+ }
+
+ return type;
+}
+
+static void
+filter (CamelMimeFilter *f, char *in, size_t len, size_t prespace,
+ char **out, size_t *outlen, size_t *outprespace)
+{
+ CamelMimeFilterCRLF *crlf = (CamelMimeFilterCRLF *)f;
+ char *p, *q;
+
+ if (crlf->direction == CAMEL_MIME_FILTER_CRLF_ENCODE) {
+ camel_mime_filter_set_size (f, 2 * len, FALSE);
+
+ p = in;
+ q = f->outbuf;
+ while (p < in + len) {
+ if (*p == '\n')
+ *q++ = '\r';
+ *q++ = *p++;
+ }
+ } else {
+ camel_mime_filter_set_size (f, len, FALSE);
+
+ p = in;
+ q = f->outbuf;
+ while (p < in + len) {
+ if (*p == '\r')
+ crlf->saw_cr = TRUE;
+ else {
+ if (crlf->saw_cr) {
+ if (*p != '\n')
+ *q++ = '\r';
+ crlf->saw_cr = FALSE;
+ }
+ *q++ = *p++;
+ }
+ }
+ }
+
+ *out = f->outbuf;
+ *outlen = q - f->outbuf;
+ *outprespace = f->outpre;
+}
+
+static void
+complete (CamelMimeFilter *f, char *in, size_t len, size_t prespace,
+ char **out, size_t *outlen, size_t *outprespace)
+{
+ if (len)
+ filter (f, in, len, prespace, out, outlen, outprespace);
+}
+
+static void
+reset (CamelMimeFilter *f)
+{
+ CamelMimeFilterCRLF *crlf = (CamelMimeFilterCRLF *)f;
+
+ crlf->saw_cr = FALSE;
+}
+
+CamelMimeFilter *
+camel_mime_filter_crlf_new (CamelMimeFilterCRLFDirection direction)
+{
+ CamelMimeFilterCRLF *crlf = gtk_type_new (CAMEL_MIME_FILTER_CRLF_TYPE);
+
+ crlf->direction = direction;
+ crlf->saw_cr = FALSE;
+
+ return (CamelMimeFilter *)crlf;
+}
diff --git a/camel/camel-mime-filter-crlf.h b/camel/camel-mime-filter-crlf.h
new file mode 100644
index 0000000000..57b6869446
--- /dev/null
+++ b/camel/camel-mime-filter-crlf.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2000 Helix Code Inc.
+ *
+ * Authors: Dan Winship <danw@helixcode.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library 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 Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifndef _CAMEL_MIME_FILTER_CRLF_H
+#define _CAMEL_MIME_FILTER_CRLF_H
+
+#include <camel/camel-mime-filter.h>
+
+#define CAMEL_MIME_FILTER_CRLF_TYPE (camel_mime_filter_crlf_get_type ())
+#define CAMEL_MIME_FILTER_CRLF(obj) GTK_CHECK_CAST (obj, CAMEL_MIME_FILTER_CRLF_TYPE, CamelMimeFilterCRLF)
+#define CAMEL_MIME_FILTER_CRLF_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, CAMEL_MIME_FILTER_CRLF_TYPE, CamelMimeFilterCRLFClass)
+#define CAMEL_IS_MIME_FILTER_CRLF(obj) GTK_CHECK_TYPE (obj, CAMEL_MIME_FILTER_CRLF_TYPE)
+
+typedef struct _CamelMimeFilterCRLFClass CamelMimeFilterCRLFClass;
+
+typedef enum {
+ CAMEL_MIME_FILTER_CRLF_ENCODE,
+ CAMEL_MIME_FILTER_CRLF_DECODE
+} CamelMimeFilterCRLFDirection;
+
+struct _CamelMimeFilterCRLF {
+ CamelMimeFilter parent;
+
+ CamelMimeFilterCRLFDirection direction;
+ gboolean saw_cr;
+};
+
+struct _CamelMimeFilterCRLFClass {
+ CamelMimeFilterClass parent_class;
+};
+
+GtkType camel_mime_filter_crlf_get_type (void);
+
+CamelMimeFilter *camel_mime_filter_crlf_new (CamelMimeFilterCRLFDirection direction);
+
+#endif /* ! _CAMEL_MIME_FILTER_CRLF_H */
diff --git a/camel/camel-mime-part.c b/camel/camel-mime-part.c
index c5169741e5..d19cace9c0 100644
--- a/camel/camel-mime-part.c
+++ b/camel/camel-mime-part.c
@@ -36,6 +36,7 @@
#include "camel-stream-mem.h"
#include "camel-stream-filter.h"
#include "camel-mime-filter-basic.h"
+#include "camel-mime-filter-crlf.h"
#include "camel-exception.h"
#define d(x)
@@ -528,6 +529,11 @@ write_to_stream (CamelDataWrapper *data_wrapper, CamelStream *stream)
}
if (filter) {
filter_stream = camel_stream_filter_new_with_stream(stream);
+ if (!strcasecmp(mp->content_type->type, "text")) {
+ CamelMimeFilter *crlf = camel_mime_filter_crlf_new(CAMEL_MIME_FILTER_CRLF_ENCODE);
+ camel_stream_filter_add(filter_stream, crlf);
+ gtk_object_unref((GtkObject *)crlf);
+ }
camel_stream_filter_add(filter_stream, filter);
gtk_object_unref((GtkObject *)filter);
stream = (CamelStream *)filter_stream;
diff --git a/camel/camel-types.h b/camel/camel-types.h
index 3ae1626752..62567da1d6 100644
--- a/camel/camel-types.h
+++ b/camel/camel-types.h
@@ -40,6 +40,7 @@ typedef struct _CamelMimeFilterBasic CamelMimeFilterBasic;
typedef struct _CamelMimeFilterCharset CamelMimeFilterCharset;
typedef struct _CamelMimeFilterIndex CamelMimeFilterIndex;
typedef struct _CamelMimeFilterSave CamelMimeFilterSave;
+typedef struct _CamelMimeFilterCRLF CamelMimeFilterCRLF;
typedef struct _CamelMimeMessage CamelMimeMessage;
typedef struct _CamelMimeParser CamelMimeParser;
typedef struct _CamelMimePart CamelMimePart;
diff --git a/camel/camel.h b/camel/camel.h
index d3a65b1312..e9300f83cb 100644
--- a/camel/camel.h
+++ b/camel/camel.h
@@ -41,6 +41,7 @@ extern "C" {
#include <camel/camel-mime-filter-charset.h>
#include <camel/camel-mime-filter-index.h>
#include <camel/camel-mime-filter-save.h>
+#include <camel/camel-mime-filter-crlf.h>
#include <camel/camel-mime-filter.h>
#include <camel/camel-mime-message.h>
#include <camel/camel-mime-parser.h>