+static gboolean
+all_parts_retrieved (TnyMimePart *part)
+{
+ if (!TNY_IS_CAMEL_BS_MIME_PART (part)) {
+ return TRUE;
+ } else {
+ TnyList *pending_parts;
+ TnyIterator *iterator;
+ gboolean all_retrieved = TRUE;
+
+ pending_parts = TNY_LIST (tny_simple_list_new ());
+ tny_mime_part_get_parts (part, pending_parts);
+ iterator = tny_list_create_iterator (pending_parts);
+ while (all_retrieved && !tny_iterator_is_done (iterator)) {
+ TnyMimePart *child;
+
+ child = TNY_MIME_PART (tny_iterator_get_current (iterator));
+
+ if (tny_camel_bs_mime_part_is_fetched (TNY_CAMEL_BS_MIME_PART (child))) {
+ all_retrieved = all_parts_retrieved (TNY_MIME_PART (child));
+ } else {
+ all_retrieved = FALSE;
+ }
+
+ g_object_unref (child);
+ tny_iterator_next (iterator);
+ }
+ g_object_unref (iterator);
+ g_object_unref (pending_parts);
+ return all_retrieved;
+ }
+}
+
+static void
+forward_pending_parts_helper (TnyMimePart *part, TnyList *list)
+{
+ TnyList *parts;
+ TnyIterator *iterator;
+
+ if (!tny_camel_bs_mime_part_is_fetched (TNY_CAMEL_BS_MIME_PART (part))) {
+ tny_list_append (list, G_OBJECT (part));
+ }
+ parts = TNY_LIST (tny_simple_list_new ());
+ tny_mime_part_get_parts (part, parts);
+ for (iterator = tny_list_create_iterator (parts);
+ !tny_iterator_is_done (iterator);
+ tny_iterator_next (iterator)) {
+ TnyMimePart *child;
+
+ child = TNY_MIME_PART (tny_iterator_get_current (iterator));
+ forward_pending_parts_helper (child, list);
+ g_object_unref (child);
+ }
+ g_object_unref (iterator);
+ g_object_unref (parts);
+}
+
+static TnyList *
+forward_pending_parts (TnyMsg *msg)
+{
+ TnyList *result = TNY_LIST (tny_simple_list_new ());
+ if (TNY_IS_CAMEL_BS_MIME_PART (msg)) {
+ forward_pending_parts_helper (TNY_MIME_PART (msg), result);
+ }
+
+ return result;
+}
+