[balsa] Use GMimeMultipart api to traverse message



commit 369e22d23aa964df6b2295ebef69938cdd79c319
Author: Peter Bloomfield <PeterBloomfield bellsouth net>
Date:   Thu Oct 1 18:06:35 2009 -0400

    Use GMimeMultipart api to traverse message

 ChangeLog               |    6 ++++
 libbalsa/mailbox_mbox.c |   65 ++++++++++++++++++++--------------------------
 2 files changed, 34 insertions(+), 37 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index 5e7aab2..a09ce33 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2009-10-01  Peter Bloomfield
+
+	* libbalsa/mailbox_mbox.c (lbm_mbox_prepare_object,
+	lbm_mbox_armored_object): use GMimeMultipart api to traverse
+	message ourselves instead of using g_mime_multipart_foreach.
+
 2009-09-30  Peter Bloomfield
 
 	* src/toolbar-factory.c (tm_do_popup_menu): do not crash when
diff --git a/libbalsa/mailbox_mbox.c b/libbalsa/mailbox_mbox.c
index 502b5c8..e9de351 100644
--- a/libbalsa/mailbox_mbox.c
+++ b/libbalsa/mailbox_mbox.c
@@ -1847,46 +1847,39 @@ static void update_message_status_headers(GMimeMessage *message,
  * Encode text parts as quoted-printable.
  */
 static void
-lbm_mbox_prepare_object(GMimeObject * parent, GMimeObject * mime_part,
-                        gpointer data)
+lbm_mbox_prepare_object(GMimeObject * object)
 {
-    guint *skip_count = data;
-
-    g_mime_object_remove_header(mime_part, "Content-Length");
-
-    if (GMIME_IS_MESSAGE(mime_part))
-        lbm_mbox_prepare_object(NULL,
-                                ((GMimeMessage *) mime_part)->mime_part,
-                                skip_count);
-    else if (GMIME_IS_MULTIPART(mime_part)) {
-        if (*skip_count
-            || GMIME_IS_MULTIPART_SIGNED(mime_part)
-            || GMIME_IS_MULTIPART_ENCRYPTED(mime_part)) {
-            /* Do not break crypto. */
-            if (parent)
-                /* We must skip the children, which will be visited
-                 * because of the recursive descent in
-                 * g_mime_multipart_foreach. */
-                *skip_count +=
-                    g_mime_multipart_get_count(GMIME_MULTIPART(mime_part));
-        } else if (!parent)
-            g_mime_multipart_foreach((GMimeMultipart *) mime_part,
-                                     lbm_mbox_prepare_object, skip_count);
-    } else if (*skip_count)
-        -- * skip_count;
-    else if (GMIME_IS_MESSAGE_PART(mime_part))
-        lbm_mbox_prepare_object(NULL, GMIME_OBJECT(((GMimeMessagePart *)
-                                                    mime_part)->message),
-                                skip_count);
-    else if (!GMIME_IS_MESSAGE_PARTIAL(mime_part)) {
+    g_mime_object_remove_header(object, "Content-Length");
+
+    if (GMIME_IS_MULTIPART(object)) {
+        /* Do not break crypto */
+        if (!(GMIME_IS_MULTIPART_SIGNED(object) ||
+              GMIME_IS_MULTIPART_ENCRYPTED(object))) {
+            GMimeMultipart *multipart = (GMimeMultipart *) object;
+            gint i, count = g_mime_multipart_get_count(multipart);
+
+            for (i = 0; i < count; ++i)
+                lbm_mbox_prepare_object(g_mime_multipart_get_part
+                                        (multipart, i));
+        }
+    } else if (GMIME_IS_MESSAGE_PART(object))
+        lbm_mbox_prepare_object(GMIME_OBJECT
+                                (((GMimeMessagePart *) object)->message));
+    else if (GMIME_IS_MESSAGE(object))
+        lbm_mbox_prepare_object(((GMimeMessage *) object)->mime_part);
+    else if (GMIME_IS_PART(object)) {
+        GMimePart *mime_part = (GMimePart *) object;
         GMimeContentEncoding encoding;
         GMimeContentType *mime_type;
 
-        encoding = g_mime_part_get_content_encoding(GMIME_PART(mime_part));
+        if (GMIME_IS_MESSAGE_PARTIAL(mime_part))
+            return;
+
+        encoding = g_mime_part_get_content_encoding(mime_part);
         if (encoding == GMIME_CONTENT_ENCODING_BASE64)
             return;
 
-        mime_type = g_mime_object_get_content_type(mime_part);
+        mime_type = g_mime_object_get_content_type(object);
         if (g_mime_content_type_is_type(mime_type, "text", "plain")) {
             const gchar *format =
                 g_mime_content_type_get_parameter(mime_type, "format");
@@ -1896,8 +1889,7 @@ lbm_mbox_prepare_object(GMimeObject * parent, GMimeObject * mime_part,
         }
 
         g_mime_part_set_content_encoding
-            (GMIME_PART(mime_part),
-             GMIME_CONTENT_ENCODING_QUOTEDPRINTABLE);
+            (mime_part, GMIME_CONTENT_ENCODING_QUOTEDPRINTABLE);
     }
 }
 
@@ -1906,12 +1898,11 @@ lbm_mbox_armored_object(GMimeStream * stream)
 {
     GMimeParser *parser;
     GMimeObject *object;
-    guint skip_count = 0;
 
     parser = g_mime_parser_new_with_stream(stream);
     object = GMIME_OBJECT(g_mime_parser_construct_message(parser));
     g_object_unref(parser);
-    lbm_mbox_prepare_object(NULL, object, &skip_count);
+    lbm_mbox_prepare_object(object);
 
     return object;
 }



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]