Changeset 1327
- Timestamp:
- 12/18/06 01:34:36
- Files:
-
- trunk/libtinymail-camel/tny-camel-mime-part-priv.h (modified) (1 diff)
- trunk/libtinymail-camel/tny-camel-mime-part.c (modified) (6 diffs)
- trunk/libtinymail-camel/tny-camel-mime-part.h (modified) (1 diff)
- trunk/libtinymail/tny-mime-part.c (modified) (1 diff)
- trunk/libtinymail/tny-mime-part.h (modified) (2 diffs)
- trunk/libtinymailui-gtk/tny-gtk-msg-view.c (modified) (11 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/libtinymail-camel/tny-camel-mime-part-priv.h
r1293 r1327 32 32 CamelMimePart *part; 33 33 gchar *cached_content_type; 34 TnyMimePart *content_object;35 34 }; 36 35 trunk/libtinymail-camel/tny-camel-mime-part.c
r1299 r1327 55 55 56 56 57 typedef gboolean (*CamelPartFunc)(CamelMimeMessage *, CamelMimePart *, void *data); 58 59 static gboolean 60 message_foreach_part_rec (CamelMimeMessage *msg, CamelMimePart *part, CamelPartFunc callback, void *data, gboolean firstpart) 61 { 57 static void 58 tny_camel_mime_part_get_parts (TnyMimePart *self, TnyList *list) 59 { 60 TNY_CAMEL_MIME_PART_GET_CLASS (self)->get_parts_func (self, list); 61 return; 62 } 63 64 static void 65 tny_camel_mime_part_get_parts_default (TnyMimePart *self, TnyList *list) 66 { 67 TnyCamelMimePartPriv *priv = TNY_CAMEL_MIME_PART_GET_PRIVATE (self); 62 68 CamelDataWrapper *containee; 63 int parts, i; 64 int go = TRUE; 65 66 /* if (!firstpart && callback (msg, part, data) == FALSE) 67 return FALSE; */ 68 69 containee = camel_medium_get_content_object (CAMEL_MEDIUM (part)); 69 70 g_assert (TNY_IS_LIST (list)); 71 72 g_mutex_lock (priv->part_lock); 73 74 containee = camel_medium_get_content_object (CAMEL_MEDIUM (priv->part)); 70 75 71 76 if (G_UNLIKELY (containee == NULL)) 72 return go; 73 74 75 if (G_LIKELY (CAMEL_IS_MULTIPART (containee))) 76 { 77 parts = camel_multipart_get_number (CAMEL_MULTIPART (containee)); 78 for (i = 0; go && i < parts; i++) 77 return; 78 79 if (CAMEL_IS_MULTIPART (containee)) 80 { 81 guint i, parts = camel_multipart_get_number (CAMEL_MULTIPART (containee)); 82 for (i = 0; i < parts; i++) 79 83 { 80 84 CamelMimePart *tpart = camel_multipart_get_part (CAMEL_MULTIPART (containee), i); 81 if (tpart) 82 callback (msg, tpart, data); 83 84 /* if (part) 85 go = message_foreach_part_rec (msg, part, callback, data, FALSE); */ 86 87 else go = FALSE; 85 TnyMimePart *newpart; 86 CamelContentType *type; 87 88 if (!tpart || !CAMEL_IS_MIME_PART (tpart)) 89 continue; 90 91 type = camel_mime_part_get_content_type (tpart); 92 if (camel_content_type_is (type, "message", "rfc822")) 93 { 94 TnyCamelHeader *nheader = TNY_CAMEL_HEADER (tny_camel_header_new ()); 95 CamelDataWrapper *c = camel_medium_get_content_object (CAMEL_MEDIUM (tpart)); 96 97 if (c) 98 { 99 newpart = TNY_MIME_PART (tny_camel_msg_new ()); 100 _tny_camel_header_set_camel_mime_message (nheader, CAMEL_MIME_MESSAGE (c)); 101 _tny_camel_msg_set_header (TNY_CAMEL_MSG (newpart), nheader); 102 _tny_camel_mime_part_set_part (TNY_CAMEL_MIME_PART (newpart), CAMEL_MIME_PART (c)); 103 g_object_unref (G_OBJECT (nheader)); 104 } 105 106 } else 107 newpart = tny_camel_mime_part_new (tpart); 108 109 tny_list_prepend (list, G_OBJECT (newpart)); 110 g_object_unref (G_OBJECT (newpart)); 88 111 } 89 90 } else if (G_LIKELY (CAMEL_IS_MIME_MESSAGE (containee))) 91 callback (msg, (CamelMimePart*) containee, data); 92 93 /* else if (G_LIKELY (CAMEL_IS_MIME_MESSAGE (containee))) 94 go = message_foreach_part_rec (msg, (CamelMimePart *)containee, callback, data, FALSE); */ 95 96 return go; 97 } 98 99 static void 100 _tny_camel_mime_part_set_content_object (TnyCamelMimePart *self, TnyMimePart *part) 101 { 102 TnyCamelMimePartPriv *priv = TNY_CAMEL_MIME_PART_GET_PRIVATE (self); 103 priv->content_object = part; 104 } 105 106 /** 107 * received_a_part 108 * 109 * If the part is a message/rfc822, then we create a TnyCamelMessage, else we 110 * create a TnyCamelMimePart. 111 **/ 112 static gboolean 113 received_a_part (CamelMimeMessage *message, CamelMimePart *part, void *data) 114 { 115 TnyList *list = data; 116 TnyMimePart *tpart; 117 CamelContentType *type; 118 119 if (!part) 120 return FALSE; 121 122 type = camel_mime_part_get_content_type (part); 123 if (camel_content_type_is (type, "message", "rfc822")) 124 { 125 CamelMimePart *mypart = part; 126 CamelDataWrapper *rfc822cont = camel_medium_get_content_object (CAMEL_MEDIUM (part)); 127 tpart = TNY_MIME_PART (tny_camel_mime_part_new (mypart)); 128 129 if (rfc822cont) 130 { 131 TnyMimePart *prt = TNY_MIME_PART (tny_camel_msg_new ()); 132 TnyCamelHeader *nheader = TNY_CAMEL_HEADER (tny_camel_header_new ()); 133 134 if (CAMEL_IS_MIME_MESSAGE (rfc822cont)) 135 _tny_camel_header_set_camel_mime_message (nheader, rfc822cont); 136 _tny_camel_msg_set_header (TNY_CAMEL_MSG (prt), nheader); 137 _tny_camel_mime_part_set_part (TNY_CAMEL_MIME_PART (prt), CAMEL_MIME_PART (rfc822cont)); 138 _tny_camel_mime_part_set_content_object (TNY_CAMEL_MIME_PART (tpart), prt); 139 g_object_unref (G_OBJECT (nheader)); 140 141 } else 142 _tny_camel_mime_part_set_content_object (TNY_CAMEL_MIME_PART (tpart), NULL); 143 144 } else 145 tpart = tny_camel_mime_part_new (part); 146 147 tny_list_prepend (list, G_OBJECT (tpart)); 148 g_object_unref (G_OBJECT (tpart)); 149 150 return TRUE; 151 } 152 153 static void 154 tny_camel_mime_part_get_parts (TnyMimePart *self, TnyList *list) 155 { 156 TNY_CAMEL_MIME_PART_GET_CLASS (self)->get_parts_func (self, list); 157 return; 158 } 159 160 static void 161 tny_camel_mime_part_get_parts_default (TnyMimePart *self, TnyList *list) 162 { 163 TnyCamelMimePartPriv *priv = TNY_CAMEL_MIME_PART_GET_PRIVATE (self); 164 gboolean go = TRUE; 165 166 g_assert (TNY_IS_LIST (list)); 167 168 g_mutex_lock (priv->part_lock); 169 170 message_foreach_part_rec ((CamelMimeMessage*)priv->part, 171 (CamelMimePart *)priv->part, received_a_part, list, TRUE); 112 } 172 113 173 114 g_mutex_unlock (priv->part_lock); … … 793 734 } 794 735 795 static TnyMimePart*796 tny_camel_mime_part_get_content_object (TnyMimePart *self)797 {798 return TNY_CAMEL_MIME_PART_GET_CLASS (self)->get_content_object_func (self);799 }800 801 static TnyMimePart*802 tny_camel_mime_part_get_content_object_default (TnyMimePart *self)803 {804 TnyCamelMimePartPriv *priv = TNY_CAMEL_MIME_PART_GET_PRIVATE (self);805 TnyMimePart *retval = NULL;806 if (priv->content_object)807 retval = TNY_MIME_PART (g_object_ref (G_OBJECT (priv->content_object)));808 return retval;809 }810 736 811 737 static void … … 847 773 if (G_LIKELY (priv->part) && CAMEL_IS_OBJECT (priv->part)) 848 774 camel_object_unref (CAMEL_OBJECT (priv->part)); 849 850 if (priv->content_object)851 g_object_unref (G_OBJECT (priv->content_object));852 775 853 776 g_mutex_unlock (priv->part_lock); … … 905 828 klass->add_part_func = tny_camel_mime_part_add_part; 906 829 klass->del_part_func = tny_camel_mime_part_del_part; 907 klass->get_content_object_func = tny_camel_mime_part_get_content_object;908 830 909 831 return; … … 938 860 class->add_part_func = tny_camel_mime_part_add_part_default; 939 861 class->del_part_func = tny_camel_mime_part_del_part_default; 940 class->get_content_object_func = tny_camel_mime_part_get_content_object_default;941 862 942 863 object_class->finalize = tny_camel_mime_part_finalize; … … 953 874 TnyCamelMimePartPriv *priv = TNY_CAMEL_MIME_PART_GET_PRIVATE (self); 954 875 955 priv->content_object = NULL;956 876 priv->part_lock = g_mutex_new (); 957 877 trunk/libtinymail-camel/tny-camel-mime-part.h
r1293 r1327 69 69 void (*del_part_func) (TnyMimePart *self, TnyMimePart *part); 70 70 gint (*add_part_func) (TnyMimePart *self, TnyMimePart *part); 71 TnyMimePart* (*get_content_object_func) (TnyMimePart *self);72 71 }; 73 72 trunk/libtinymail/tny-mime-part.c
r1293 r1327 22 22 #include <tny-mime-part.h> 23 23 24 25 /**26 * tny_mime_part_get_content_object:27 * @self: a #TnyMimePart object28 *29 * Get the content-object in case @self is a RFC822 mime part. If the mime part30 * isn't a RFC822 one, it will return NULL. Else the return value must be31 * unreferenced after use.32 *33 * Return value: a #TnyMimePart instance or NULL34 **/35 TnyMimePart*36 tny_mime_part_get_content_object (TnyMimePart *self)37 {38 #ifdef DEBUG39 if (!TNY_MIME_PART_GET_IFACE (self)->get_content_object_func)40 g_critical ("You must implement tny_mime_part_get_content_object\n");41 #endif42 43 return TNY_MIME_PART_GET_IFACE (self)->get_content_object_func (self);44 }45 24 46 25 /** trunk/libtinymail/tny-mime-part.h
r1293 r1327 62 62 void (*del_part_func) (TnyMimePart *self, TnyMimePart *part); 63 63 gint (*add_part_func) (TnyMimePart *self, TnyMimePart *part); 64 TnyMimePart* (*get_content_object_func) (TnyMimePart *self);65 64 }; 66 65 … … 86 85 gint tny_mime_part_add_part (TnyMimePart *self, TnyMimePart *part); 87 86 void tny_mime_part_del_part (TnyMimePart *self, TnyMimePart *part); 88 TnyMimePart* tny_mime_part_get_content_object (TnyMimePart *self);89 87 90 88 G_END_DECLS trunk/libtinymailui-gtk/tny-gtk-msg-view.c
r1299 r1327 84 84 85 85 86 static void tny_gtk_msg_view_display_parts (TnyMsgView *self, TnyList *parts, gboolean alternatives );86 static void tny_gtk_msg_view_display_parts (TnyMsgView *self, TnyList *parts, gboolean alternatives, const gchar *desc); 87 87 static void remove_mime_part_viewer (TnyMimePartView *mpview, GtkContainer *mpviewers); 88 static gboolean tny_gtk_msg_view_display_part (TnyMsgView *self, TnyMimePart *part );88 static gboolean tny_gtk_msg_view_display_part (TnyMsgView *self, TnyMimePart *part, const gchar *desc); 89 89 90 90 … … 381 381 382 382 383 /**384 * tny_mime_part_view_proxy_func_set_part:385 * @self: a #TnyGtkMsgView instance386 * @part: a #TnyMimePart instance387 *388 * This is non-public API documentation389 *390 * A functional wrapper that detects whether part is rfc822, and if that is the391 * case, will do something specific (like adding the header to the view). Else392 * it will simply proxy to tny_mime_part_view_set_part which in turn will call393 * tny_gtk_msg_view_display_part or tny_gtk_msg_view_set_msg which will call394 * tny_gtk_msg_view_display_parts.395 **/396 static void397 tny_mime_part_view_proxy_func_set_part (TnyMimePartView *mpview, TnyMimePart *part)398 {399 if (tny_mime_part_content_type_is (part, "message/*") && TNY_IS_GTK_MSG_VIEW (mpview))400 {401 TnyMimePart *content_part = tny_mime_part_get_content_object (part);402 403 if (!content_part)404 {405 TnyList *list = tny_simple_list_new ();406 407 tny_mime_part_get_parts (part, list);408 tny_gtk_msg_view_display_parts (TNY_MSG_VIEW (mpview), list, FALSE);409 g_object_unref (G_OBJECT (list));410 } else {411 tny_mime_part_view_set_part (mpview, content_part);412 }413 } else if (tny_mime_part_content_type_is (part, "multipart/*") && TNY_IS_GTK_MSG_VIEW (mpview))414 {415 TnyList *list = tny_simple_list_new ();416 tny_mime_part_get_parts (part, list);417 tny_gtk_msg_view_display_parts (TNY_MSG_VIEW (mpview), list,418 tny_mime_part_content_type_is (part, "multipart/alternative"));419 g_object_unref (G_OBJECT (list));420 421 } else422 tny_mime_part_view_set_part (mpview, part);423 }424 383 425 384 static void … … 428 387 RealizePriv *prv = user_data; 429 388 430 tny_mime_part_view_ proxy_func_set_part (TNY_MIME_PART_VIEW (widget), prv->part);389 tny_mime_part_view_set_part (TNY_MIME_PART_VIEW (widget), prv->part); 431 390 g_signal_handler_disconnect (widget, prv->signal); 432 391 g_object_unref (prv->part); … … 455 414 **/ 456 415 static gboolean 457 tny_gtk_msg_view_display_part (TnyMsgView *self, TnyMimePart *part )416 tny_gtk_msg_view_display_part (TnyMsgView *self, TnyMimePart *part, const gchar *desc) 458 417 { 459 418 TnyGtkMsgViewPriv *priv = TNY_GTK_MSG_VIEW_GET_PRIVATE (self); … … 472 431 { 473 432 TnyGtkMsgViewPriv *mppriv = TNY_GTK_MSG_VIEW_GET_PRIVATE (mpview); 474 const gchar *label = tny_mime_part_get_description (part);433 const gchar *label = desc; 475 434 GtkWidget *expander; 476 435 … … 501 460 "realize", G_CALLBACK (on_mpview_realize), prv); 502 461 } else 503 tny_mime_part_view_ proxy_func_set_part (mpview, part);462 tny_mime_part_view_set_part (mpview, part); 504 463 505 464 } else if (TNY_IS_GTK_ATTACHMENT_MIME_PART_VIEW (mpview)) 506 tny_mime_part_view_ proxy_func_set_part (mpview, part);465 tny_mime_part_view_set_part (mpview, part); 507 466 else if (!TNY_IS_GTK_ATTACHMENT_MIME_PART_VIEW (mpview)) 508 467 { 509 468 priv->unattached_views = g_list_prepend (priv->unattached_views, mpview); 510 tny_mime_part_view_ proxy_func_set_part (mpview, part);469 tny_mime_part_view_set_part (mpview, part); 511 470 } 512 471 } else if (!tny_mime_part_content_type_is (part, "multipart/*") && … … 527 486 * @self: a #TnyGtkMsgView instance 528 487 * @parts: a #TnyList instance containing #TnyMimePart instances 488 * @desc: description of the parent part (if any) 529 489 * 530 490 * This is non-public API documentation … … 533 493 **/ 534 494 static void 535 tny_gtk_msg_view_display_parts (TnyMsgView *self, TnyList *parts, gboolean alternatives )495 tny_gtk_msg_view_display_parts (TnyMsgView *self, TnyList *parts, gboolean alternatives, const gchar *desc) 536 496 { 537 497 TnyIterator *iterator = tny_list_create_iterator (parts); … … 540 500 { 541 501 TnyMimePart *part = (TnyMimePart*)tny_iterator_get_current (iterator); 542 gboolean displayed = tny_gtk_msg_view_display_part (self, part );502 gboolean displayed = tny_gtk_msg_view_display_part (self, part, desc); 543 503 544 504 g_object_unref (G_OBJECT (part)); … … 656 616 priv->part = g_object_ref (G_OBJECT (part)); 657 617 658 if (!tny_mime_part_content_type_is (part, "multipart/*")) 659 tny_gtk_msg_view_display_part (TNY_MSG_VIEW (self), part); 660 else 618 if (!tny_mime_part_content_type_is (part, "multipart/*") && 619 !tny_mime_part_content_type_is (part, "message/*")) 620 { 621 622 tny_gtk_msg_view_display_part (TNY_MSG_VIEW (self), part, NULL); 623 624 } else 661 625 { 662 626 TnyIterator *iterator; … … 666 630 tny_mime_part_get_parts (part, list); 667 631 tny_gtk_msg_view_display_parts (TNY_MSG_VIEW (self), list, 668 tny_mime_part_content_type_is (part, "multipart/alternative")); 632 tny_mime_part_content_type_is (part, "multipart/alternative"), 633 tny_mime_part_get_description (part)); 669 634 g_object_unref (G_OBJECT (list)); 670 635 }
