[gmime] Fixed part GMimePart iterators.
- From: Jeffrey Stedfast <fejj src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gmime] Fixed part GMimePart iterators.
- Date: Fri, 17 Feb 2012 05:02:37 +0000 (UTC)
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]