aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--camel/ChangeLog21
-rw-r--r--camel/camel-file-utils.c14
-rw-r--r--camel/camel-folder-summary.c1
-rw-r--r--camel/camel-mime-filter-save.c165
-rw-r--r--camel/camel-mime-filter-save.h50
-rw-r--r--camel/camel-mime-part-utils.c28
-rw-r--r--camel/camel-mime-part.c18
-rw-r--r--camel/camel-mime-part.h2
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;