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:

committed by
Jeffrey Stedfast

parent
7ac88d8631
commit
e1fa571225
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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>
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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__ */
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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) {
|
||||
|
@ -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;
|
||||
|
Reference in New Issue
Block a user