Changeset 1293

Show
Ignore:
Timestamp:
12/01/06 11:35:04
Author:
pvanhoof
Message:

Support for RFC822 messages

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/ChangeLog

    r1291 r1293  
     12006-12-01  Philip Van Hoof <pvanhoof@gnome.org> 
     2 
     3        * Support for content-objects in RFC822 messages 
     4 
     5        * This was a major API change 
     6 
    172006-11-30  Sergio Villar Senin <svillar@igalia.com> 
    28        * libtinymail-camel/tny-camel-common.c: a store query with no items 
  • trunk/libtinymail-camel/tny-camel-mime-part-priv.h

    r1240 r1293  
    3232        CamelMimePart *part; 
    3333        gchar *cached_content_type; 
     34        TnyMimePart *content_object; 
    3435}; 
    3536 
  • trunk/libtinymail-camel/tny-camel-mime-part.c

    r1276 r1293  
    9696} 
    9797 
     98static void  
     99_tny_camel_mime_part_set_content_object (TnyCamelMimePart *self, TnyMimePart *part) 
     100{ 
     101        TnyCamelMimePartPriv *priv = TNY_CAMEL_MIME_PART_GET_PRIVATE (self); 
     102        priv->content_object = part; 
     103} 
    98104 
    99105/**  
     
    116122        if (camel_content_type_is (type, "message", "rfc822")) 
    117123        { 
    118                 CamelMimePart *mypart; 
    119  
     124                CamelMimePart *mypart = part; 
    120125                CamelDataWrapper *rfc822cont = camel_medium_get_content_object (CAMEL_MEDIUM (part)); 
    121  
    122                 if (rfc822cont) 
    123                         mypart = CAMEL_MIME_PART (rfc822cont); 
    124                 else 
    125                         mypart = part; 
    126  
    127126                TnyCamelHeader *nheader = TNY_CAMEL_HEADER (tny_camel_header_new ()); 
    128127                tpart = TNY_MIME_PART (tny_camel_msg_new ()); 
    129128                _tny_camel_mime_part_set_part (TNY_CAMEL_MIME_PART (tpart), mypart); 
     129 
     130                if (rfc822cont) 
     131                { 
     132                        TnyMimePart *prt = TNY_MIME_PART (tny_camel_msg_new ()); 
     133                        _tny_camel_mime_part_set_part (TNY_CAMEL_MIME_PART (prt), CAMEL_MIME_PART (rfc822cont)); 
     134                        _tny_camel_mime_part_set_content_object (TNY_CAMEL_MIME_PART (tpart), prt); 
     135                } else  
     136                        _tny_camel_mime_part_set_content_object (TNY_CAMEL_MIME_PART (tpart), NULL); 
     137 
    130138                if (CAMEL_IS_MIME_MESSAGE (mypart)) 
    131139                        _tny_camel_header_set_camel_mime_message (nheader, mypart); 
     
    784792} 
    785793 
     794static TnyMimePart*  
     795tny_camel_mime_part_get_content_object (TnyMimePart *self) 
     796{ 
     797        return TNY_CAMEL_MIME_PART_GET_CLASS (self)->get_content_object_func (self); 
     798} 
     799 
     800static TnyMimePart*  
     801tny_camel_mime_part_get_content_object_default (TnyMimePart *self) 
     802{ 
     803        TnyCamelMimePartPriv *priv = TNY_CAMEL_MIME_PART_GET_PRIVATE (self); 
     804        TnyMimePart *retval = NULL; 
     805        if (priv->content_object) 
     806                retval = TNY_MIME_PART (g_object_ref (G_OBJECT (priv->content_object))); 
     807        return retval; 
     808} 
     809 
    786810static void  
    787811tny_camel_mime_part_set_content_type (TnyMimePart *self, const gchar *content_type) 
     
    822846        if (G_LIKELY (priv->part) && CAMEL_IS_OBJECT (priv->part)) 
    823847                camel_object_unref (CAMEL_OBJECT (priv->part)); 
     848 
     849        if (priv->content_object) 
     850                g_object_unref (G_OBJECT (priv->content_object)); 
    824851 
    825852        g_mutex_unlock (priv->part_lock); 
     
    877904        klass->add_part_func = tny_camel_mime_part_add_part; 
    878905        klass->del_part_func = tny_camel_mime_part_del_part; 
     906        klass->get_content_object_func = tny_camel_mime_part_get_content_object; 
    879907 
    880908        return; 
     
    909937        class->add_part_func = tny_camel_mime_part_add_part_default; 
    910938        class->del_part_func = tny_camel_mime_part_del_part_default; 
     939        class->get_content_object_func = tny_camel_mime_part_get_content_object_default; 
    911940 
    912941        object_class->finalize = tny_camel_mime_part_finalize; 
     
    923952        TnyCamelMimePartPriv *priv = TNY_CAMEL_MIME_PART_GET_PRIVATE (self); 
    924953 
     954        priv->content_object = NULL; 
    925955        priv->part_lock = g_mutex_new (); 
    926956 
  • trunk/libtinymail-camel/tny-camel-mime-part.h

    r1240 r1293  
    6969        void (*del_part_func) (TnyMimePart *self, TnyMimePart *part); 
    7070        gint (*add_part_func) (TnyMimePart *self, TnyMimePart *part); 
     71        TnyMimePart* (*get_content_object_func) (TnyMimePart *self); 
    7172}; 
    7273 
  • trunk/libtinymail/tny-mime-part.c

    r1199 r1293  
    2222#include <tny-mime-part.h> 
    2323 
     24 
     25/** 
     26 * tny_mime_part_get_content_object: 
     27 * @self: a #TnyMimePart object 
     28 *  
     29 * Get the content-object in case @self is a RFC822 mime part. If the mime part 
     30 * isn't a RFC822 one, it will return NULL. Else the return value must be  
     31 * unreferenced after use. 
     32 * 
     33 * Return value: a #TnyMimePart instance or NULL 
     34 **/ 
     35TnyMimePart*  
     36tny_mime_part_get_content_object (TnyMimePart *self) 
     37{ 
     38#ifdef DEBUG 
     39        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#endif 
     42 
     43        return TNY_MIME_PART_GET_IFACE (self)->get_content_object_func (self); 
     44} 
    2445 
    2546/** 
  • trunk/libtinymail/tny-mime-part.h

    r1194 r1293  
    6262        void (*del_part_func) (TnyMimePart *self, TnyMimePart *part); 
    6363        gint (*add_part_func) (TnyMimePart *self, TnyMimePart *part); 
     64        TnyMimePart* (*get_content_object_func) (TnyMimePart *self); 
    6465}; 
    6566 
     
    8586gint tny_mime_part_add_part (TnyMimePart *self, TnyMimePart *part); 
    8687void tny_mime_part_del_part (TnyMimePart *self, TnyMimePart *part); 
     88TnyMimePart* tny_mime_part_get_content_object (TnyMimePart *self); 
    8789 
    8890G_END_DECLS 
  • trunk/libtinymailui-gtk/tny-gtk-msg-view.c

    r1277 r1293  
    6161struct _TnyGtkMsgViewPriv 
    6262{ 
    63         TnyMimePart *part, *root_part
     63        TnyMimePart *part
    6464        TnyHeaderView *headerview; 
    6565        GtkIconView *attachview; 
     
    7979{ 
    8080        gulong signal; 
    81         TnyMimePart *part, *root_part
     81        TnyMimePart *part
    8282} RealizePriv; 
    8383 
     
    8888static void tny_gtk_msg_view_display_parts (TnyMsgView *self, TnyList *parts); 
    8989static void remove_mime_part_viewer (TnyMimePartView *mpview, GtkContainer *mpviewers); 
     90static void tny_gtk_msg_view_display_part (TnyMsgView *self, TnyMimePart *part); 
    9091 
    9192/** 
     
    434435 **/ 
    435436static void 
    436 tny_mime_part_view_proxy_func_set_part (TnyMimePartView *mpview, TnyMimePart *part, TnyMimePart *root_part
     437tny_mime_part_view_proxy_func_set_part (TnyMimePartView *mpview, TnyMimePart *part
    437438{ 
    438439                if (tny_mime_part_content_type_is (part, "message/rfc822") && TNY_IS_GTK_MSG_VIEW (mpview)) 
    439440                { 
     441                        TnyMimePart *content_part = tny_mime_part_get_content_object (part); 
     442 
     443                        if (!content_part) 
     444                        { 
     445                                TnyList *list = tny_simple_list_new (); 
     446 
     447                                if (TNY_IS_MSG (part) && TNY_IS_GTK_MSG_VIEW (mpview)) 
     448                                { 
     449                                        TnyGtkMsgViewPriv *mppriv = TNY_GTK_MSG_VIEW_GET_PRIVATE (mpview); 
     450                                        TnyHeader *header = TNY_HEADER (tny_msg_get_header (TNY_MSG (part))); 
     451                                        if (header && TNY_IS_HEADER (header)) 
     452                                        { 
     453                                                tny_header_view_set_header (mppriv->headerview, header); 
     454                                                g_object_unref (G_OBJECT (header)); 
     455                                                gtk_widget_show (GTK_WIDGET (mppriv->headerview)); 
     456                                        } 
     457                                } 
     458 
     459                                tny_mime_part_get_parts (part, list); 
     460                                tny_gtk_msg_view_display_parts (TNY_MSG_VIEW (mpview), list); 
     461                                g_object_unref (G_OBJECT (list)); 
     462                        } else { 
     463                                tny_mime_part_view_set_part (mpview, content_part); 
     464                        } 
     465                } else if (tny_mime_part_content_type_is (part, "multipart/*") && TNY_IS_GTK_MSG_VIEW (mpview)) 
     466                { 
    440467                        TnyList *list = tny_simple_list_new (); 
    441                         if (TNY_IS_MSG (part) && TNY_IS_GTK_MSG_VIEW (mpview)) 
    442                         { 
    443                                 TnyGtkMsgViewPriv *mppriv = TNY_GTK_MSG_VIEW_GET_PRIVATE (mpview); 
    444                                 TnyHeader *header = TNY_HEADER (tny_msg_get_header (TNY_MSG (part))); 
    445                                 if (header && TNY_IS_HEADER (header)) 
    446                                 { 
    447                                         tny_header_view_set_header (mppriv->headerview, header); 
    448                                         g_object_unref (G_OBJECT (header)); 
    449                                         gtk_widget_show (GTK_WIDGET (mppriv->headerview)); 
    450                                 } 
    451                         } 
    452  
    453468                        tny_mime_part_get_parts (part, list); 
    454469                        tny_gtk_msg_view_display_parts (TNY_MSG_VIEW (mpview), list); 
    455470                        g_object_unref (G_OBJECT (list)); 
    456                 } else if (tny_mime_part_content_type_is (part, "multipart/*") && TNY_IS_GTK_MSG_VIEW (mpview)) 
    457                 { 
    458                         if (part != root_part) 
    459                         { 
    460                                 TnyList *list = tny_simple_list_new (); 
    461                                 tny_mime_part_get_parts (part, list); 
    462                                 tny_gtk_msg_view_display_parts (TNY_MSG_VIEW (mpview), list); 
    463                                 g_object_unref (G_OBJECT (list)); 
    464                         } 
    465471 
    466472                } else 
     
    473479        RealizePriv *prv = user_data; 
    474480 
    475         tny_mime_part_view_proxy_func_set_part (TNY_MIME_PART_VIEW (widget), prv->part, prv->root_part); 
     481        tny_mime_part_view_proxy_func_set_part (TNY_MIME_PART_VIEW (widget), prv->part); 
    476482        g_signal_handler_disconnect (widget, prv->signal); 
    477483        g_object_unref (prv->part); 
    478         if (prv->root_part) 
    479                 g_object_unref (G_OBJECT (prv->root_part)); 
    480  
    481484        g_slice_free (RealizePriv, prv); 
    482485} 
     
    532535        } 
    533536 
    534  
    535537        if (!mpview) 
    536538                mpview = tny_msg_view_create_mime_part_view_for (TNY_MSG_VIEW (self), part); 
     
    544546                        if (TNY_IS_GTK_MSG_VIEW (mpview) && !GTK_IS_WINDOW (mpview)) 
    545547                        { 
    546                                 GtkWidget *expander = gtk_expander_new (_("Email message attachment")); 
     548                                const gchar *label = tny_mime_part_get_description (part); 
     549                                GtkWidget *expander; 
     550                                 
     551                                printf ("for %s\n", tny_mime_part_get_content_type (part)); 
     552                                if (label == NULL || strlen (label) <= 0) 
     553                                        label = _("Email message attachment"); 
     554                                expander = gtk_expander_new (label); 
    547555                                gtk_expander_set_expanded (GTK_EXPANDER (expander), FALSE); 
    548556                                gtk_expander_set_spacing (GTK_EXPANDER (expander), 7); 
     
    564572                                RealizePriv *prv = g_slice_new (RealizePriv); 
    565573                                prv->part = g_object_ref (part); 
    566                                 prv->root_part = priv->part?g_object_ref (G_OBJECT (priv->part)):NULL; 
    567574                                prv->signal = g_signal_connect (G_OBJECT (mpview), 
    568575                                        "realize", G_CALLBACK (on_mpview_realize), prv); 
    569576                        } else 
    570                                 tny_mime_part_view_proxy_func_set_part (mpview, part, priv->part); 
     577                                tny_mime_part_view_proxy_func_set_part (mpview, part); 
    571578 
    572579                } else if (TNY_IS_GTK_ATTACHMENT_MIME_PART_VIEW (mpview))  
    573                         tny_mime_part_view_proxy_func_set_part (mpview, part, priv->part); 
     580                        tny_mime_part_view_proxy_func_set_part (mpview, part); 
    574581                else if (!TNY_IS_GTK_ATTACHMENT_MIME_PART_VIEW (mpview))  
    575582                { 
    576583                        priv->unattached_views = g_list_prepend (priv->unattached_views, mpview); 
    577                         tny_mime_part_view_proxy_func_set_part (mpview, part, priv->root_part); 
     584                        tny_mime_part_view_proxy_func_set_part (mpview, part); 
    578585                } 
    579586        } else if (!tny_mime_part_content_type_is (part, "multipart/*") && 
     
    583590                        tny_mime_part_get_content_type (part)); 
    584591        } 
     592 
    585593} 
    586594 
     
    702710        if (part) 
    703711        { 
    704                 TnyIterator *iterator; 
    705                 TnyList *list; 
    706  
    707712                g_assert (TNY_IS_MIME_PART (part)); 
    708713 
     
    718723                } 
    719724 
    720                 list = tny_simple_list_new (); 
    721725                priv->part = g_object_ref (G_OBJECT (part)); 
    722726 
    723                 tny_gtk_msg_view_display_part (TNY_MSG_VIEW (self), part); 
    724                 tny_mime_part_get_parts (part, list); 
    725                 tny_gtk_msg_view_display_parts (TNY_MSG_VIEW (self), list); 
    726                 g_object_unref (G_OBJECT (list)); 
     727                if (!tny_mime_part_content_type_is (part, "multipart/*")) 
     728                        tny_gtk_msg_view_display_part (TNY_MSG_VIEW (self), part); 
     729                else  
     730                { 
     731                        TnyIterator *iterator; 
     732                        TnyList *list; 
     733                        list = tny_simple_list_new (); 
     734 
     735                        tny_mime_part_get_parts (part, list); 
     736                        tny_gtk_msg_view_display_parts (TNY_MSG_VIEW (self), list); 
     737                 
     738                        g_object_unref (G_OBJECT (list)); 
     739                } 
    727740        } 
    728741 
     
    785798        priv->unattached_views = NULL; 
    786799        priv->part = NULL; 
    787         priv->root_part = NULL; 
    788800 
    789801        priv->headerview = tny_gtk_header_view_new ();