diff options
-rw-r--r-- | camel/ChangeLog | 21 | ||||
-rw-r--r-- | camel/camel-file-utils.c | 14 | ||||
-rw-r--r-- | camel/camel-folder-summary.c | 1 | ||||
-rw-r--r-- | camel/camel-mime-filter-save.c | 165 | ||||
-rw-r--r-- | camel/camel-mime-filter-save.h | 50 | ||||
-rw-r--r-- | camel/camel-mime-part-utils.c | 28 | ||||
-rw-r--r-- | camel/camel-mime-part.c | 18 | ||||
-rw-r--r-- | camel/camel-mime-part.h | 2 |
8 files changed, 173 insertions, 126 deletions
diff --git a/camel/ChangeLog b/camel/ChangeLog index aea071af4d..aa26d8451c 100644 --- a/camel/ChangeLog +++ b/camel/ChangeLog @@ -1,3 +1,24 @@ +2002-02-27 Jeffrey Stedfast <fejj@ximian.com> + + * camel-folder-summary.h: Don't #include camel-mime-filter-save.h, + we don't use it. + + * camel-file-utils.c: Fixed a few 'might be used uninitialized' + warnings which were real problems. + + * camel-mime-part-utils.c + (camel_mime_part_construct_content_from_parser): Save the raw mime + stream for any/all signed parts. + + * camel-mime-part.c (camel_mime_part_init): Initialize our raw + stream to NULL. + (camel_mime_part_finalize): Unref our raw stream, if we have one. + (write_to_stream): If we have a raw stream, write that out instead + of re-encoding. + + * camel-mime-filter-save.[c,h]: Rewritten to save to a stream + rather than a file. + 2002-02-28 Not Zed <NotZed@Ximian.com> * camel-mime-utils.c (header_fold): Use the FOLD_SIZE as a diff --git a/camel/camel-file-utils.c b/camel/camel-file-utils.c index eed36f1383..0b909f3e82 100644 --- a/camel/camel-file-utils.c +++ b/camel/camel-file-utils.c @@ -22,6 +22,10 @@ */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + #include "camel-file-utils.h" #include "camel-url.h" @@ -34,6 +38,10 @@ #include <netinet/in.h> +#ifdef HAVE_ALLOCA_H +#include <alloca.h> +#endif + /** * camel_file_util_encode_uint32: * @out: file to output to @@ -165,7 +173,8 @@ int camel_file_util_decode_time_t (FILE *in, time_t *dest) { time_t save = 0; - int v, i = sizeof (time_t) - 1; + int i = sizeof (time_t) - 1; + int v = EOF; while (i >= 0 && (v = fgetc (in)) != EOF) { save |= ((time_t)v) << (i * 8); @@ -211,7 +220,8 @@ int camel_file_util_decode_off_t (FILE *in, off_t *dest) { off_t save = 0; - int v, i = sizeof(off_t) - 1; + int i = sizeof(off_t) - 1; + int v = EOF; while (i >= 0 && (v = fgetc (in)) != EOF) { save |= ((off_t)v) << (i * 8); diff --git a/camel/camel-folder-summary.c b/camel/camel-folder-summary.c index cabbca5637..89fdc3cb23 100644 --- a/camel/camel-folder-summary.c +++ b/camel/camel-folder-summary.c @@ -36,7 +36,6 @@ #include <camel/camel-mime-filter.h> #include <camel/camel-mime-filter-index.h> #include <camel/camel-mime-filter-charset.h> -#include <camel/camel-mime-filter-save.h> #include <camel/camel-mime-filter-basic.h> #include <camel/camel-mime-filter-html.h> #include <camel/camel-mime-message.h> diff --git a/camel/camel-mime-filter-save.c b/camel/camel-mime-filter-save.c index db3ccb7ab0..1516527ded 100644 --- a/camel/camel-mime-filter-save.c +++ b/camel/camel-mime-filter-save.c @@ -1,38 +1,51 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* - * Copyright (C) 2000 Ximian Inc. + * Authors: Jeffrey Stedfast <fejj@ximian.com> * - * Authors: Michael Zucchi <notzed@ximian.com> + * Copyright 2002 Ximian, Inc. (www.ximian.com) * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. + * 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. + * 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. * - * 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 Place - Suite 330, - * Boston, MA 02111-1307, USA. */ -#include <sys/types.h> -#include <unistd.h> -#include <sys/stat.h> -#include <fcntl.h> -#include <string.h> -#include <errno.h> +#ifndef HAVE_CONFIG_H +#include <config.h> +#endif #include "camel-mime-filter-save.h" +#include "camel-stream-mem.h" -static void camel_mime_filter_save_class_init (CamelMimeFilterSaveClass *klass); -static void camel_mime_filter_save_init (CamelMimeFilterSave *obj); -static void camel_mime_filter_save_finalize (CamelObject *o); +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 CamelMimeFilterClass *camel_mime_filter_save_parent; + +static void +camel_mime_filter_save_class_init (CamelMimeFilterSaveClass *klass) +{ + CamelMimeFilterClass *mime_filter_class = + (CamelMimeFilterClass *) klass; + + mime_filter_class->filter = filter; + mime_filter_class->complete = complete; + mime_filter_class->reset = reset; +} CamelType camel_mime_filter_save_get_type (void) @@ -40,105 +53,63 @@ camel_mime_filter_save_get_type (void) static CamelType type = CAMEL_INVALID_TYPE; if (type == CAMEL_INVALID_TYPE) { - type = camel_type_register (camel_mime_filter_get_type (), "CamelMimeFilterSave", + type = camel_type_register (camel_mime_filter_get_type(), "CamelMimeFilterSave", sizeof (CamelMimeFilterSave), sizeof (CamelMimeFilterSaveClass), (CamelObjectClassInitFunc) camel_mime_filter_save_class_init, NULL, - (CamelObjectInitFunc) camel_mime_filter_save_init, - (CamelObjectFinalizeFunc) camel_mime_filter_save_finalize); + NULL, + NULL); } return type; } static void -camel_mime_filter_save_finalize(CamelObject *o) -{ - CamelMimeFilterSave *f = (CamelMimeFilterSave *)o; - - g_free(f->filename); - if (f->fd != -1) { - /* FIXME: what do we do with failed writes???? */ - close(f->fd); - } -} - -static void -reset(CamelMimeFilter *mf) -{ - CamelMimeFilterSave *f = (CamelMimeFilterSave *)mf; - - /* i dunno, how do you 'reset' a file? reopen it? do i care? */ - if (f->fd != -1){ - lseek(f->fd, 0, SEEK_SET); - } -} - -/* all this code just to support this little trivial filter! */ -static void -filter(CamelMimeFilter *mf, char *in, size_t len, size_t prespace, char **out, size_t *outlen, size_t *outprespace) +filter (CamelMimeFilter *f, char *in, size_t len, size_t prespace, + char **out, size_t *outlen, size_t *outprespace) { - CamelMimeFilterSave *f = (CamelMimeFilterSave *)mf; - - if (f->fd != -1) { - /* FIXME: check return */ - int outlen = write(f->fd, in, len); - if (outlen != len) { - g_warning("could not write to '%s': %s", f->filename?f->filename:"<descriptor>", strerror(errno)); - } - } + CamelMimeFilterSave *save = (CamelMimeFilterSave *) f; + + if (save->stream) + camel_stream_write (save->stream, in, len); + *out = in; *outlen = len; - *outprespace = prespace; + *outprespace = f->outpre; } -static void -camel_mime_filter_save_class_init (CamelMimeFilterSaveClass *klass) +static void +complete (CamelMimeFilter *f, char *in, size_t len, size_t prespace, + char **out, size_t *outlen, size_t *outprespace) { - CamelMimeFilterClass *filter_class = (CamelMimeFilterClass *) klass; - - camel_mime_filter_save_parent = CAMEL_MIME_FILTER_CLASS (camel_type_get_global_classfuncs (camel_mime_filter_get_type ())); - - filter_class->reset = reset; - filter_class->filter = filter; + if (len) + filter (f, in, len, prespace, out, outlen, outprespace); } static void -camel_mime_filter_save_init (CamelMimeFilterSave *f) +reset (CamelMimeFilter *f) { - f->fd = -1; + /* no-op */ } -/** - * camel_mime_filter_save_new: - * - * Create a new CamelMimeFilterSave object. - * - * Return value: A new CamelMimeFilterSave widget. - **/ -CamelMimeFilterSave * +CamelMimeFilter * camel_mime_filter_save_new (void) { - CamelMimeFilterSave *new = CAMEL_MIME_FILTER_SAVE ( camel_object_new (camel_mime_filter_save_get_type ())); - return new; + CamelMimeFilterSave *save = CAMEL_MIME_FILTER_SAVE (camel_object_new (CAMEL_MIME_FILTER_SAVE_TYPE)); + + save->stream = camel_stream_mem_new (); + + return (CamelMimeFilter *) save; } -CamelMimeFilterSave * -camel_mime_filter_save_new_name (const char *name, int flags, int mode) +CamelMimeFilter * +camel_mime_filter_save_new_with_stream (CamelStream *stream) { - CamelMimeFilterSave *new = NULL; - - new = camel_mime_filter_save_new(); - if (new) { - new->fd = open(name, flags, mode); - if (new->fd != -1) { - new->filename = g_strdup(name); - } else { - camel_object_unref((CamelObject *)new); - new = NULL; - } - } - return new; + CamelMimeFilterSave *save = CAMEL_MIME_FILTER_SAVE (camel_object_new (CAMEL_MIME_FILTER_SAVE_TYPE)); + + save->stream = stream; + camel_object_ref (CAMEL_OBJECT (stream)); + + return (CamelMimeFilter *) save; } - diff --git a/camel/camel-mime-filter-save.h b/camel/camel-mime-filter-save.h index 08a507a87d..f1e54eca5b 100644 --- a/camel/camel-mime-filter-save.h +++ b/camel/camel-mime-filter-save.h @@ -1,28 +1,33 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* - * Copyright (C) 2000 Ximian Inc. + * Authors: Jeffrey Stedfast <fejj@ximian.com> * - * Authors: Michael Zucchi <notzed@ximian.com> + * Copyright 2002 Ximian, Inc. (www.ximian.com) * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. + * 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. + * 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. * - * 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 Place - Suite 330, - * Boston, MA 02111-1307, USA. */ -#ifndef _CAMEL_MIME_FILTER_SAVE_H -#define _CAMEL_MIME_FILTER_SAVE_H + +#ifndef __CAMEL_MIME_FILTER_SAVE_H__ +#define __CAMEL_MIME_FILTER_SAVE_H__ #include <camel/camel-mime-filter.h> +#include <camel/camel-seekable-stream.h> +#define CAMEL_MIME_FILTER_SAVE_TYPE (camel_mime_filter_save_get_type ()) #define CAMEL_MIME_FILTER_SAVE(obj) CAMEL_CHECK_CAST (obj, camel_mime_filter_save_get_type (), CamelMimeFilterSave) #define CAMEL_MIME_FILTER_SAVE_CLASS(klass) CAMEL_CHECK_CLASS_CAST (klass, camel_mime_filter_save_get_type (), CamelMimeFilterSaveClass) #define CAMEL_IS_MIME_FILTER_SAVE(obj) CAMEL_CHECK_TYPE (obj, camel_mime_filter_save_get_type ()) @@ -31,20 +36,17 @@ typedef struct _CamelMimeFilterSaveClass CamelMimeFilterSaveClass; struct _CamelMimeFilterSave { CamelMimeFilter parent; - - struct _CamelMimeFilterSavePrivate *priv; - - char *filename; - int fd; + + CamelStream *stream; }; struct _CamelMimeFilterSaveClass { CamelMimeFilterClass parent_class; }; -guint camel_mime_filter_save_get_type (void); -CamelMimeFilterSave *camel_mime_filter_save_new (void); +CamelType camel_mime_filter_save_get_type (void); -CamelMimeFilterSave *camel_mime_filter_save_new_name (const char *name, int flags, int mode); +CamelMimeFilter *camel_mime_filter_save_new (void); +CamelMimeFilter *camel_mime_filter_save_new_with_stream (CamelStream *stream); -#endif /* ! _CAMEL_MIME_FILTER_SAVE_H */ +#endif /* __CAMEL_MIME_FILTER_SAVE_H__ */ diff --git a/camel/camel-mime-part-utils.c b/camel/camel-mime-part-utils.c index 8367cecf37..ddd71da90c 100644 --- a/camel/camel-mime-part-utils.c +++ b/camel/camel-mime-part-utils.c @@ -44,6 +44,7 @@ #include "camel-mime-filter-basic.h" #include "camel-mime-filter-charset.h" #include "camel-mime-filter-crlf.h" +#include "camel-mime-filter-save.h" #include "camel-html-parser.h" #include "camel-charset-map.h" @@ -328,8 +329,11 @@ camel_mime_part_construct_content_from_parser (CamelMimePart *dw, CamelMimeParse break; case HSCAN_MULTIPART: { struct _header_content_type *content_type; + CamelMimeFilter *save_filter = NULL; CamelDataWrapper *bodypart; - + CamelStream *raw = NULL; + int saveid = -1; + /* FIXME: we should use a came-mime-mutlipart, not jsut a camel-multipart, but who cares */ d(printf("Creating multi-part\n")); content = (CamelDataWrapper *)camel_multipart_new (); @@ -338,10 +342,32 @@ camel_mime_part_construct_content_from_parser (CamelMimePart *dw, CamelMimeParse camel_multipart_set_boundary ((CamelMultipart *)content, header_content_type_param (content_type, "boundary")); +#define SAVE_RAW_MIME_STREAM_FOR_SECURE_MIME_SIGNATURES +#ifdef SAVE_RAW_MIME_STREAM_FOR_SECURE_MIME_SIGNATURES + if (header_content_type_is (content_type, "multipart", "signed")) { + /* save the raw mime stream for the first mime part in the multipart/signed */ + raw = camel_stream_mem_new (); + save_filter = camel_mime_filter_save_new_with_stream (raw); + saveid = camel_mime_parser_filter_add (mp, save_filter); + camel_object_unref (CAMEL_OBJECT (save_filter)); + } +#endif /* SAVE_RAW_MIME_STREAM_FOR_SECURE_MIME_SIGNATURES */ + while (camel_mime_parser_step (mp, &buf, &len) != HSCAN_MULTIPART_END) { camel_mime_parser_unstep (mp); bodypart = (CamelDataWrapper *)camel_mime_part_new (); camel_mime_part_construct_from_parser ((CamelMimePart *)bodypart, mp); +#ifdef SAVE_RAW_MIME_STREAM_FOR_SECURE_MIME_SIGNATURES + if (raw) { + /* set the raw mime stream on the first part within the multipart/signed */ + camel_stream_reset (raw); + CAMEL_MIME_PART (bodypart)->stream = raw; + camel_mime_parser_filter_remove (mp, saveid); + saveid = -1; + raw = NULL; + } +#endif /* SAVE_RAW_MIME_STREAM_FOR_SECURE_MIME_SIGNATURES */ + camel_multipart_add_part ((CamelMultipart *)content, (CamelMimePart *)bodypart); camel_object_unref ((CamelObject *)bodypart); } diff --git a/camel/camel-mime-part.c b/camel/camel-mime-part.c index 5a58b79009..c7b21e460d 100644 --- a/camel/camel-mime-part.c +++ b/camel/camel-mime-part.c @@ -156,6 +156,7 @@ camel_mime_part_init (gpointer object, gpointer klass) CamelMimePart *camel_mime_part = CAMEL_MIME_PART (object); camel_mime_part->content_type = header_content_type_new ("text", "plain"); + camel_mime_part->stream = NULL; camel_mime_part->description = NULL; camel_mime_part->disposition = NULL; camel_mime_part->content_id = NULL; @@ -170,7 +171,10 @@ static void camel_mime_part_finalize (CamelObject *object) { CamelMimePart *mime_part = CAMEL_MIME_PART (object); - + + if (mime_part->stream) + camel_object_unref (CAMEL_OBJECT (mime_part->stream)); + g_free (mime_part->description); g_free (mime_part->content_id); g_free (mime_part->content_MD5); @@ -667,6 +671,18 @@ write_to_stream(CamelDataWrapper *data_wrapper, CamelStream *stream) if (count == -1) return -1; total += count; + +#define SAVE_RAW_MIME_STREAM_FOR_SECURE_MIME_SIGNATURES +#ifdef SAVE_RAW_MIME_STREAM_FOR_SECURE_MIME_SIGNATURES + if (mp->stream) { + count = camel_stream_write_to_stream (mp->stream, stream); + camel_stream_reset (mp->stream); + if (count == -1) + return -1; + + return total + count; + } +#endif /* SAVE_RAW_MIME_STREAM_FOR_SECURE_MIME_SIGNATURES */ content = camel_medium_get_content_object(medium); if (content) { diff --git a/camel/camel-mime-part.h b/camel/camel-mime-part.h index 4f05ecb71b..524371a521 100644 --- a/camel/camel-mime-part.h +++ b/camel/camel-mime-part.h @@ -65,6 +65,8 @@ struct _CamelMimePart struct _header_raw *headers; /* mime headers */ /* All fields here are -** PRIVATE **- */ + CamelStream *stream; + char *description; CamelMimeDisposition *disposition; char *content_id; |