aboutsummaryrefslogtreecommitdiffstats
path: root/camel/camel-multipart.c
diff options
context:
space:
mode:
authorNot Zed <NotZed@Ximian.com>2002-05-31 09:05:47 +0800
committerMichael Zucci <zucchi@src.gnome.org>2002-05-31 09:05:47 +0800
commit1c309b14c41ba3305bc72404fa290769251fda4a (patch)
tree6eb6042a5fe1d8695cd1508e2b7c1c0e98b5e0ef /camel/camel-multipart.c
parent29a8c80e9323ef2406c2b237a6a6058639fd4cb2 (diff)
downloadgsoc2013-evolution-1c309b14c41ba3305bc72404fa290769251fda4a.tar
gsoc2013-evolution-1c309b14c41ba3305bc72404fa290769251fda4a.tar.gz
gsoc2013-evolution-1c309b14c41ba3305bc72404fa290769251fda4a.tar.bz2
gsoc2013-evolution-1c309b14c41ba3305bc72404fa290769251fda4a.tar.lz
gsoc2013-evolution-1c309b14c41ba3305bc72404fa290769251fda4a.tar.xz
gsoc2013-evolution-1c309b14c41ba3305bc72404fa290769251fda4a.tar.zst
gsoc2013-evolution-1c309b14c41ba3305bc72404fa290769251fda4a.zip
Added a protocol field for users to use.
2002-05-30 Not Zed <NotZed@Ximian.com> * camel-cipher-context.h: Added a protocol field for users to use. * camel-stream-filter.c (do_read): Sigh, the pre-size is READ_PAD not READ_SIZE. Big difference. (READ_PAD): Bumped upto 128 from 64, so we can fit a typical line in full. * providers/imap/camel-imap-folder.c (get_content): Changed to load multipart/signed as an opaque block into the right kind of object. * camel-multipart.h (struct _CamelMultipart): Removed the boundary field. It wans't actually used anywhere. * camel-seekable-substream.c (camel_seekable_substream_new_with_seekable_stream_and_bounds): Shortened this stupidly long name to just :new(), its the only way its ever used. Fixed all callers. * camel-multipart-signed.[ch]: new wrapper for multipart/signed types. We need to treat the entire content as a blob of data for transport purposes. This also cleans up a lot of the sign/verify handling. * camel-mime-part-utils.c (camel_mime_part_construct_content_from_parser): Just call camel_multipart_construct_from_parser for multipart parts, also use a multipart_signed for multipart/signed types. * camel-multipart.c (camel_multipart_construct_from_parser): New virtual function for multiparts to buld themselves. (construct_from_parser): Implement for normal multiparts. (toplevel): Got rid of a warning, it'll never be an abstract class. * camel-pgp-context.c (pgp_hash_to_id): (pgp_id_to_hash): Implement. (camel_pgp_context_init): Init the pgp protocol specifier. * camel-cipher-context.c (camel_cipher_id_to_hash): (camel_cipher_hash_to_id): Util virtual methods to handle the cipher id string. * camel-mime-filter-canon.[ch]: A new filter, end/start of line canonicalisation filter. Can escape "From " and strip trailing whitespace, and canonicalise the end of line to crlf or to lf. 2002-05-29 Not Zed <NotZed@Ximian.com> * camel-multipart.h (struct _CamelMultipart): Removed the 'parent', nothing used it, anywhere. Cleaned up some formatting slightly. svn path=/trunk/; revision=17057
Diffstat (limited to 'camel/camel-multipart.c')
-rw-r--r--camel/camel-multipart.c57
1 files changed, 52 insertions, 5 deletions
diff --git a/camel/camel-multipart.c b/camel/camel-multipart.c
index f82b66312a..f792dffaaa 100644
--- a/camel/camel-multipart.c
+++ b/camel/camel-multipart.c
@@ -1,9 +1,6 @@
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/* camel-multipart.c : Abstract class for a multipart */
-#ifndef NO_WARNINGS
-#warning This should be a mostly abstract class, but it is not!
-#endif
/*
*
@@ -34,6 +31,7 @@
#include <string.h> /* strlen() */
#include <unistd.h> /* for getpid */
#include <time.h> /* for time */
+#include <errno.h>
#include "camel-stream-mem.h"
#include "camel-multipart.h"
@@ -63,6 +61,8 @@ static int write_to_stream (CamelDataWrapper *data_wrapper,
CamelStream *stream);
static void unref_part (gpointer data, gpointer user_data);
+static int construct_from_parser(CamelMultipart *multipart, struct _CamelMimeParser *mp);
+
static CamelDataWrapperClass *parent_class = NULL;
@@ -91,6 +91,7 @@ camel_multipart_class_init (CamelMultipartClass *camel_multipart_class)
camel_multipart_class->get_number = get_number;
camel_multipart_class->set_boundary = set_boundary;
camel_multipart_class->get_boundary = get_boundary;
+ camel_multipart_class->construct_from_parser = construct_from_parser;
/* virtual method overload */
camel_data_wrapper_class->write_to_stream = write_to_stream;
@@ -115,8 +116,8 @@ camel_multipart_finalize (CamelObject *object)
g_list_foreach (multipart->parts, unref_part, NULL);
- if (multipart->boundary)
- g_free (multipart->boundary);
+ /*if (multipart->boundary)
+ g_free (multipart->boundary);*/
if (multipart->preface)
g_free (multipart->preface);
if (multipart->postface)
@@ -539,3 +540,49 @@ camel_multipart_set_postface(CamelMultipart *multipart, const char *postface)
multipart->postface = NULL;
}
}
+
+static int
+construct_from_parser(CamelMultipart *multipart, struct _CamelMimeParser *mp)
+{
+ int err;
+ struct _header_content_type *content_type;
+ CamelMimePart *bodypart;
+ char *buf;
+ unsigned int len;
+
+ g_assert(camel_mime_parser_state(mp) == HSCAN_MULTIPART);
+
+ /* FIXME: we should use a came-mime-mutlipart, not jsut a camel-multipart, but who cares */
+ d(printf("Creating multi-part\n"));
+
+ content_type = camel_mime_parser_content_type(mp);
+ camel_multipart_set_boundary(multipart,
+ header_content_type_param(content_type, "boundary"));
+
+ while (camel_mime_parser_step(mp, &buf, &len) != HSCAN_MULTIPART_END) {
+ camel_mime_parser_unstep(mp);
+ bodypart = camel_mime_part_new();
+ camel_mime_part_construct_from_parser(bodypart, mp);
+ camel_multipart_add_part(multipart, bodypart);
+ camel_object_unref((CamelObject *)bodypart);
+ }
+
+ /* these are only return valid data in the MULTIPART_END state */
+ camel_multipart_set_preface(multipart, camel_mime_parser_preface (mp));
+ camel_multipart_set_postface(multipart, camel_mime_parser_postface (mp));
+
+ err = camel_mime_parser_errno(mp);
+ if (err != 0) {
+ errno = err;
+ return -1;
+ } else
+ return 0;
+}
+
+int
+camel_multipart_construct_from_parser(CamelMultipart *multipart, struct _CamelMimeParser *mp)
+{
+ g_return_val_if_fail(CAMEL_IS_MULTIPART(multipart), -1);
+
+ return CMP_CLASS(multipart)->construct_from_parser(multipart, mp);
+}