aboutsummaryrefslogtreecommitdiffstats
path: root/camel/camel-multipart.c
diff options
context:
space:
mode:
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);
+}