[gmime] Fixed part GMimePart iterators.



commit 16d67f07872570f8728679de04907241ee1e47ae
Author: Jeffrey Stedfast <fejj gnome org>
Date:   Fri Feb 17 00:01:34 2012 -0500

    Fixed part GMimePart iterators.
    
    2012-02-17  Jeffrey Stedfast  <fejj gnome org>
    
    	* gmime/gmime-part-iter.c: Fixed to behave the same as IMAP and
    	also to actually work.

 ChangeLog               |    5 +++++
 gmime/gmime-part-iter.c |   35 ++++++++++++++++++++++++++++-------
 tests/test-parser.c     |    9 +++++----
 3 files changed, 38 insertions(+), 11 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index e070010..d368c2e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2012-02-17  Jeffrey Stedfast  <fejj gnome org>
+
+	* gmime/gmime-part-iter.c: Fixed to behave the same as IMAP and
+	also to actually work.
+
 2012-02-16  Jeffrey Stedfast  <jeff xamarin com>
 
 	* mono/Multipart.custom: Fixed the binding for Multipart.Count.
diff --git a/gmime/gmime-part-iter.c b/gmime/gmime-part-iter.c
index eb3ff23..ac97451 100644
--- a/gmime/gmime-part-iter.c
+++ b/gmime/gmime-part-iter.c
@@ -49,6 +49,7 @@ typedef struct _GMimeObjectStack GMimeObjectStack;
 struct _GMimeObjectStack {
 	GMimeObjectStack *parent;
 	GMimeObject *object;
+	gboolean indexed;
 };
 
 struct _GMimePartIter {
@@ -68,6 +69,7 @@ g_mime_part_iter_push (GMimePartIter *iter, GMimeObject *object, int index)
 		g_array_append_val (iter->path, index);
 	
 	node = g_slice_new (GMimeObjectStack);
+	node->indexed = index != -1;
 	node->parent = iter->parent;
 	node->object = object;
 	iter->parent = node;
@@ -82,8 +84,10 @@ g_mime_part_iter_pop (GMimePartIter *iter)
 	if (!iter->parent || !iter->parent->parent)
 		return FALSE;
 	
-	iter->index = g_array_index (iter->path, int, iter->path->len - 1);
-	g_array_set_size (iter->path, iter->path->len - 1);
+	if (iter->parent->indexed) {
+		iter->index = g_array_index (iter->path, int, iter->path->len - 1);
+		g_array_set_size (iter->path, iter->path->len - 1);
+	}
 	
 	iter->current = iter->parent->object;
 	
@@ -214,24 +218,30 @@ g_mime_part_iter_jump_to (GMimePartIter *iter, const char *path)
 		index--;
 		
 		if (GMIME_IS_MESSAGE_PART (parent)) {
-			if (index != 0)
-				return FALSE;
-			
 			message_part = (GMimeMessagePart *) parent;
 			if (!(message = g_mime_message_part_get_message (message_part)))
 				return FALSE;
 			
-			if (!(current = g_mime_message_get_mime_part (message)))
+			if (!(parent = g_mime_message_get_mime_part (message)))
 				return FALSE;
 			
-			iter->index = 0;
+			if (!GMIME_IS_MULTIPART (parent))
+				return FALSE;
+			
+			goto multipart;
 		} else if (GMIME_IS_MULTIPART (parent)) {
+		multipart:
 			multipart = (GMimeMultipart *) parent;
 			if (index >= g_mime_multipart_get_count (multipart))
 				return FALSE;
 			
 			current = g_mime_multipart_get_part (multipart, index);
 			iter->index = index;
+		} else if (GMIME_IS_MESSAGE (parent)) {
+			if (!(current = g_mime_message_get_mime_part (message)))
+				return FALSE;
+			
+			iter->index = -1;
 		} else {
 			return FALSE;
 		}
@@ -302,11 +312,19 @@ g_mime_part_iter_next (GMimePartIter *iter)
 		if (mime_part != NULL) {
 			g_mime_part_iter_push (iter, iter->current, iter->index);
 			iter->current = mime_part;
+			
+			if (GMIME_IS_MULTIPART (mime_part)) {
+				iter->index = -1;
+				goto multipart;
+			}
+			
 			iter->index = 0;
+			
 			return TRUE;
 		}
 	} else if (GMIME_IS_MULTIPART (iter->current)) {
 		/* descend into our children */
+	multipart:
 		multipart = (GMimeMultipart *) iter->current;
 		if (g_mime_multipart_get_count (multipart) > 0) {
 			g_mime_part_iter_push (iter, iter->current, iter->index);
@@ -429,6 +447,9 @@ g_mime_part_iter_get_parent (GMimePartIter *iter)
 {
 	g_return_val_if_fail (iter != NULL, NULL);
 	
+	if (!g_mime_part_iter_is_valid (iter))
+		return NULL;
+	
 	return iter->parent->object;
 }
 
diff --git a/tests/test-parser.c b/tests/test-parser.c
index 7ea07d6..bda3301 100644
--- a/tests/test-parser.c
+++ b/tests/test-parser.c
@@ -118,6 +118,7 @@ print_mime_part_info (const char *path, GMimeObject *object)
 static void
 print_mime_struct_iter (GMimeMessage *message)
 {
+	const char *jump_to = "4.2.2.2";
 	GMimePartIter *iter;
 	GMimeObject *part;
 	char *path;
@@ -125,7 +126,7 @@ print_mime_struct_iter (GMimeMessage *message)
 	iter = g_mime_part_iter_new ((GMimeObject *) message);
 	
 	part = g_mime_part_iter_get_parent (iter);
-	print_mime_part_info ("", part);
+	print_mime_part_info ("TEXT", part);
 	
 	do {
 		part = g_mime_part_iter_get_current (iter);
@@ -135,14 +136,14 @@ print_mime_struct_iter (GMimeMessage *message)
 	} while (g_mime_part_iter_next (iter));
 
 #if 0
-	fprintf (stdout, "Jumping to 1.2\n");
-	if (g_mime_part_iter_jump_to (iter, "1.2")) {
+	fprintf (stdout, "Jumping to %s\n", jump_to);
+	if (g_mime_part_iter_jump_to (iter, jump_to)) {
 		part = g_mime_part_iter_get_current (iter);
 		path = g_mime_part_iter_get_path (iter);
 		print_mime_part_info (path, part);
 		g_free (path);
 	} else {
-		fprintf (stdout, "Failed to jump to 1.2\n");
+		fprintf (stdout, "Failed to jump to %s\n", jump_to);
 	}
 #endif
 	



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