Don't #include camel-mime-filter-save.h, we don't use it.

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.

svn path=/trunk/; revision=15867
This commit is contained in:
Jeffrey Stedfast
2002-02-28 02:28:12 +00:00
committed by Jeffrey Stedfast
parent 7ac88d8631
commit e1fa571225
8 changed files with 176 additions and 129 deletions

View File

@ -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

View File

@ -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);

View File

@ -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>

View File

@ -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)
filter (CamelMimeFilter *f, char *in, size_t len, size_t prespace,
char **out, size_t *outlen, size_t *outprespace)
{
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)
{
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
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
camel_mime_filter_save_class_init (CamelMimeFilterSaveClass *klass)
reset (CamelMimeFilter *f)
{
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;
/* no-op */
}
static void
camel_mime_filter_save_init (CamelMimeFilterSave *f)
{
f->fd = -1;
}
/**
* 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;
}

View File

@ -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__ */

View File

@ -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);
}

View File

@ -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) {

View File

@ -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;