aboutsummaryrefslogtreecommitdiffstats
path: root/camel/camel-mime-filter-crlf.c
diff options
context:
space:
mode:
authorDan Winship <danw@src.gnome.org>2000-06-13 00:49:59 +0800
committerDan Winship <danw@src.gnome.org>2000-06-13 00:49:59 +0800
commit9573b501a807c22010a9ed50825db146296995eb (patch)
treee9287c0480233d69c32a9f1edae28675f54bdaaa /camel/camel-mime-filter-crlf.c
parent038f94bb30e7b0a45fbd26e5115a4d04caa1a270 (diff)
downloadgsoc2013-evolution-9573b501a807c22010a9ed50825db146296995eb.tar
gsoc2013-evolution-9573b501a807c22010a9ed50825db146296995eb.tar.gz
gsoc2013-evolution-9573b501a807c22010a9ed50825db146296995eb.tar.bz2
gsoc2013-evolution-9573b501a807c22010a9ed50825db146296995eb.tar.lz
gsoc2013-evolution-9573b501a807c22010a9ed50825db146296995eb.tar.xz
gsoc2013-evolution-9573b501a807c22010a9ed50825db146296995eb.tar.zst
gsoc2013-evolution-9573b501a807c22010a9ed50825db146296995eb.zip
New filter to do CRLF<->LF conversion. (Currently only tested in the
* 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. svn path=/trunk/; revision=3529
Diffstat (limited to 'camel/camel-mime-filter-crlf.c')
-rw-r--r--camel/camel-mime-filter-crlf.c132
1 files changed, 132 insertions, 0 deletions
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;
+}