diff options
-rw-r--r-- | camel/ChangeLog | 14 | ||||
-rw-r--r-- | camel/camel-mime-filter-crlf.c | 56 | ||||
-rw-r--r-- | camel/camel-mime-filter-crlf.h | 1 | ||||
-rw-r--r-- | camel/tests/mime-filter/.cvsignore | 3 | ||||
-rw-r--r-- | camel/tests/mime-filter/Makefile.am | 5 | ||||
-rw-r--r-- | camel/tests/mime-filter/crlf-1.in | 19 | ||||
-rw-r--r-- | camel/tests/mime-filter/crlf-1.out | 19 | ||||
-rw-r--r-- | camel/tests/mime-filter/test-crlf.c | 163 |
8 files changed, 255 insertions, 25 deletions
diff --git a/camel/ChangeLog b/camel/ChangeLog index a5b8f189cf..61a7327904 100644 --- a/camel/ChangeLog +++ b/camel/ChangeLog @@ -1,3 +1,13 @@ +2001-06-29 Jeffrey Stedfast <fejj@ximian.com> + + * tests/mime-filter/Makefile.am: Build the test-crlf test program. + + * tests/mime-filter/test-crlf.c: New test suite for the crlf + filter. + + * camel-mime-filter-crlf.c (filter): Fixed to correctly encode and + decode dots. + 2001-06-28 Peter Williams <peterw@ximian.com> * camel-mime-filter-stripheader.c: New file. Filter that strips a @@ -5,8 +15,8 @@ * camel-mime-filter-stripheader.h: New file. Header for the above. - * providers/smtp/camel-smtp-transport.c (smtp_data): Use the stripheader - filter to remove the "Bcc" header. + * providers/smtp/camel-smtp-transport.c (smtp_data): Use the + stripheader filter to remove the "Bcc" header. * Makefile.am: Add the stripheader files. diff --git a/camel/camel-mime-filter-crlf.c b/camel/camel-mime-filter-crlf.c index 58623f2ac7..6977b04878 100644 --- a/camel/camel-mime-filter-crlf.c +++ b/camel/camel-mime-filter-crlf.c @@ -66,25 +66,30 @@ filter (CamelMimeFilter *f, char *in, size_t len, size_t prespace, CamelMimeFilterCRLF *crlf = (CamelMimeFilterCRLF *)f; gboolean do_dots; char *p, *q; - + do_dots = crlf->mode == CAMEL_MIME_FILTER_CRLF_MODE_CRLF_DOTS; - + if (crlf->direction == CAMEL_MIME_FILTER_CRLF_ENCODE) { camel_mime_filter_set_size (f, 3 * len, FALSE); - + p = in; q = f->outbuf; while (p < in + len) { - if (*p == '\n') + if (*p == '\n') { + crlf->saw_lf = TRUE; *q++ = '\r'; - else - if (do_dots && *p == '.' && (p == in || *(p - 1) == '\n')) + } else { + if (do_dots && *p == '.' && crlf->saw_lf) *q++ = '.'; + + crlf->saw_lf = FALSE; + } + *q++ = *p++; } } else { camel_mime_filter_set_size (f, len, FALSE); - + p = in; q = f->outbuf; while (p < in + len) { @@ -92,30 +97,35 @@ filter (CamelMimeFilter *f, char *in, size_t len, size_t prespace, crlf->saw_cr = TRUE; } else { if (crlf->saw_cr) { - if (*p != '\n') - *q++ = '\r'; crlf->saw_cr = FALSE; + + if (*p == '\n') { + crlf->saw_lf = TRUE; + *q++ = *p++; + continue; + } else + *q++ = '\r'; } + *q++ = *p; } - - if (do_dots) { - if (*p == '.' && (p == in || *(p - 1) == '\n')) { + + if (do_dots && *p == '.') { + if (crlf->saw_lf) { crlf->saw_dot = TRUE; - } else { - if (crlf->saw_dot) { - if (*p == '.') - p++; - crlf->saw_dot = FALSE; - } - *q++ = *p; + crlf->saw_lf = FALSE; + p++; + } else if (crlf->saw_dot) { + crlf->saw_dot = FALSE; } } - + + crlf->saw_lf = FALSE; + p++; } } - + *out = f->outbuf; *outlen = q - f->outbuf; *outprespace = f->outpre; @@ -135,6 +145,8 @@ reset (CamelMimeFilter *f) CamelMimeFilterCRLF *crlf = (CamelMimeFilterCRLF *)f; crlf->saw_cr = FALSE; + crlf->saw_lf = TRUE; + crlf->saw_dot = FALSE; } CamelMimeFilter * @@ -145,6 +157,8 @@ camel_mime_filter_crlf_new (CamelMimeFilterCRLFDirection direction, CamelMimeFil crlf->direction = direction; crlf->mode = mode; crlf->saw_cr = FALSE; + crlf->saw_lf = TRUE; + crlf->saw_dot = FALSE; return (CamelMimeFilter *)crlf; } diff --git a/camel/camel-mime-filter-crlf.h b/camel/camel-mime-filter-crlf.h index df5c58b0a5..7b19f914bc 100644 --- a/camel/camel-mime-filter-crlf.h +++ b/camel/camel-mime-filter-crlf.h @@ -48,6 +48,7 @@ struct _CamelMimeFilterCRLF { CamelMimeFilterCRLFDirection direction; CamelMimeFilterCRLFMode mode; gboolean saw_cr; + gboolean saw_lf; gboolean saw_dot; }; diff --git a/camel/tests/mime-filter/.cvsignore b/camel/tests/mime-filter/.cvsignore index 2cee3ea3cb..c1f16ee7d4 100644 --- a/camel/tests/mime-filter/.cvsignore +++ b/camel/tests/mime-filter/.cvsignore @@ -4,4 +4,5 @@ Makefile.in .libs *.lo *.la -test-stripheader
\ No newline at end of file +test-stripheader +test-crlf diff --git a/camel/tests/mime-filter/Makefile.am b/camel/tests/mime-filter/Makefile.am index a1a3ebb832..02faad7eb5 100644 --- a/camel/tests/mime-filter/Makefile.am +++ b/camel/tests/mime-filter/Makefile.am @@ -14,6 +14,8 @@ LDADD = \ $(GNOMEUI_LIBS) $(INTLLIBS) $(EXTRA_GNOME_LIBS) EXTRA_DIST = \ + crlf-1.in \ + crlf-1.out \ stripheader-1.in \ stripheader-1.out \ stripheader-2.in \ @@ -28,9 +30,10 @@ EXTRA_DIST = \ stripheader-6.out check_PROGRAMS = \ + test-crlf \ test-stripheader -TESTS = test-stripheader +TESTS = test-crlf test-stripheader diff --git a/camel/tests/mime-filter/crlf-1.in b/camel/tests/mime-filter/crlf-1.in new file mode 100644 index 0000000000..d98703c725 --- /dev/null +++ b/camel/tests/mime-filter/crlf-1.in @@ -0,0 +1,19 @@ +This is some text to filter and stuff. Hopefully that . will not become '..' +when the filter is run on this text. It should, however, '..' the next line +. The previous . should become .. in the output file, or so I hope... + +. +.. +... +.... + +Once this text is decoded again, the above set of dots should look like: + + . + .. + ... + .... + +Only it shouldn't be indented, obviously. + +Jeff
\ No newline at end of file diff --git a/camel/tests/mime-filter/crlf-1.out b/camel/tests/mime-filter/crlf-1.out new file mode 100644 index 0000000000..c0b688f334 --- /dev/null +++ b/camel/tests/mime-filter/crlf-1.out @@ -0,0 +1,19 @@ +This is some text to filter and stuff. Hopefully that . will not become '..'
+when the filter is run on this text. It should, however, '..' the next line
+.. The previous . should become .. in the output file, or so I hope...
+
+..
+...
+....
+.....
+
+Once this text is decoded again, the above set of dots should look like:
+
+ .
+ ..
+ ...
+ ....
+
+Only it shouldn't be indented, obviously.
+
+Jeff
\ No newline at end of file diff --git a/camel/tests/mime-filter/test-crlf.c b/camel/tests/mime-filter/test-crlf.c new file mode 100644 index 0000000000..2e8a4333fa --- /dev/null +++ b/camel/tests/mime-filter/test-crlf.c @@ -0,0 +1,163 @@ +/* + test-crlf.c + + Test the CamelMimeFilterCrlf class +*/ + +#include <stdio.h> +#include <string.h> + +#include "camel-test.h" + +#include <camel/camel-stream-fs.h> +#include <camel/camel-stream-mem.h> +#include <camel/camel-stream-filter.h> +#include <camel/camel-mime-filter-crlf.h> + +#define d(x) x + +#define NUM_CASES 1 +#define CHUNK_SIZE 32 + +enum { + CRLF_ENCODE, + CRLF_DECODE, + CRLF_DONE +}; + +int +main (int argc, char **argv) +{ + CamelStream *source; + CamelStream *correct; + CamelStreamFilter *filter; + CamelMimeFilter *sh; + gchar *work; + int i; + ssize_t comp_progress, comp_correct_chunk, comp_filter_chunk; + int comp_i; + char comp_correct[CHUNK_SIZE], comp_filter[CHUNK_SIZE]; + + camel_test_init(argc, argv); + + for (i = 0; i < NUM_CASES; i++) { + int j; + + work = g_strdup_printf ("CRLF/DOT filter, test case %d", i); + camel_test_start (work); + g_free (work); + + for (j = CRLF_ENCODE; j < CRLF_DONE; j++) { + CamelMimeFilterCRLFDirection direction; + char *infile, *outfile; + + switch (j) { + case CRLF_ENCODE: + camel_test_push ("Test of the encoder"); + direction = CAMEL_MIME_FILTER_CRLF_ENCODE; + infile = g_strdup_printf ("%s/crlf-%d.in", SOURCEDIR, i + 1); + outfile = g_strdup_printf ("%s/crlf-%d.out", SOURCEDIR, i + 1); + break; + case CRLF_DECODE: + camel_test_push ("Test of the decoder"); + direction = CAMEL_MIME_FILTER_CRLF_DECODE; + infile = g_strdup_printf ("%s/crlf-%d.out", SOURCEDIR, i + 1); + outfile = g_strdup_printf ("%s/crlf-%d.in", SOURCEDIR, i + 1); + break; + default: + break; + } + + camel_test_push ("Initializing objects"); + source = camel_stream_fs_new_with_name (infile, 0, O_RDONLY); + if (!source) { + camel_test_fail ("Failed to open input case in \"%s\"", infile); + g_free (infile); + continue; + } + g_free (infile); + + correct = camel_stream_fs_new_with_name (outfile, 0, O_RDONLY); + if (!correct) { + camel_test_fail ("Failed to open correct output in \"%s\"", outfile); + g_free (outfile); + continue; + } + g_free (outfile); + + filter = camel_stream_filter_new_with_stream (CAMEL_STREAM (source)); + if (!filter) { + camel_test_fail ("Couldn't create CamelStreamFilter??"); + continue; + } + + sh = camel_mime_filter_crlf_new (direction, CAMEL_MIME_FILTER_CRLF_MODE_CRLF_DOTS); + if (!sh) { + camel_test_fail ("Couldn't create CamelMimeFilterCrlf??"); + continue; + } + + camel_stream_filter_add (filter, sh); + camel_test_pull (); + + camel_test_push ("Running filter and comparing to correct result"); + + comp_progress = 0; + + while (1) { + comp_correct_chunk = camel_stream_read (correct, comp_correct, CHUNK_SIZE); + comp_filter_chunk = 0; + + if (comp_correct_chunk == 0) + break; + + while (comp_filter_chunk < comp_correct_chunk) { + ssize_t delta; + + delta = camel_stream_read (CAMEL_STREAM (filter), + comp_filter + comp_filter_chunk, + CHUNK_SIZE - comp_filter_chunk); + + if (delta == 0) { + camel_test_fail ("Chunks are different sizes: correct is %d, " + "filter is %d, %d bytes into stream", + comp_correct_chunk, comp_filter_chunk, comp_progress); + } + + comp_filter_chunk += delta; + } + + d(printf ("\n\nCORRECT: >>%.*s<<", comp_correct_chunk, comp_correct)); + d(printf ("\nFILTER : >>%.*s<<\n", comp_filter_chunk, comp_filter)); + + for (comp_i = 0; comp_i < comp_filter_chunk; comp_i++) { + if (comp_correct[comp_i] != comp_filter[comp_i]) { + camel_test_fail ("Difference: correct is %c, filter is %c, " + "%d bytes into stream", + comp_correct[comp_i], + comp_filter[comp_i], + comp_progress + comp_i); + } + } + + comp_progress += comp_filter_chunk; + } + + camel_test_pull (); + + /* inefficient */ + camel_test_push ("Cleaning up"); + camel_object_unref (CAMEL_OBJECT (filter)); + camel_object_unref (CAMEL_OBJECT (correct)); + camel_object_unref (CAMEL_OBJECT (source)); + camel_object_unref (CAMEL_OBJECT (sh)); + camel_test_pull (); + + camel_test_pull (); + } + + camel_test_end (); + } + + return 0; +} |