Changeset 1327

Show
Ignore:
Timestamp:
12/18/06 01:34:36
Author:
pvanhoof
Message:

Fixes for RFC822 support

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/libtinymail-camel/tny-camel-mime-part-priv.h

    r1293 r1327  
    3232        CamelMimePart *part; 
    3333        gchar *cached_content_type; 
    34         TnyMimePart *content_object; 
    3534}; 
    3635 
  • trunk/libtinymail-camel/tny-camel-mime-part.c

    r1299 r1327  
    5555 
    5656 
    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 
     57static void 
     58tny_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 
     64static void 
     65tny_camel_mime_part_get_parts_default (TnyMimePart *self, TnyList *list) 
     66
     67        TnyCamelMimePartPriv *priv = TNY_CAMEL_MIME_PART_GET_PRIVATE (self); 
    6268        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)); 
    7075         
    7176        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++)  
    7983                { 
    8084                        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)); 
    88111                } 
    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        } 
    172113 
    173114        g_mutex_unlock (priv->part_lock); 
     
    793734} 
    794735 
    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 } 
    810736 
    811737static void  
     
    847773        if (G_LIKELY (priv->part) && CAMEL_IS_OBJECT (priv->part)) 
    848774                camel_object_unref (CAMEL_OBJECT (priv->part)); 
    849  
    850         if (priv->content_object) 
    851                 g_object_unref (G_OBJECT (priv->content_object)); 
    852775 
    853776        g_mutex_unlock (priv->part_lock); 
     
    905828        klass->add_part_func = tny_camel_mime_part_add_part; 
    906829        klass->del_part_func = tny_camel_mime_part_del_part; 
    907         klass->get_content_object_func = tny_camel_mime_part_get_content_object; 
    908830 
    909831        return; 
     
    938860        class->add_part_func = tny_camel_mime_part_add_part_default; 
    939861        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; 
    941862 
    942863        object_class->finalize = tny_camel_mime_part_finalize; 
     
    953874        TnyCamelMimePartPriv *priv = TNY_CAMEL_MIME_PART_GET_PRIVATE (self); 
    954875 
    955         priv->content_object = NULL; 
    956876        priv->part_lock = g_mutex_new (); 
    957877 
  • trunk/libtinymail-camel/tny-camel-mime-part.h

    r1293 r1327  
    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); 
    7271}; 
    7372 
  • trunk/libtinymail/tny-mime-part.c

    r1293 r1327  
    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  **/ 
    35 TnyMimePart*  
    36 tny_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 } 
    4524 
    4625/** 
  • trunk/libtinymail/tny-mime-part.h

    r1293 r1327  
    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); 
    6564}; 
    6665 
     
    8685gint tny_mime_part_add_part (TnyMimePart *self, TnyMimePart *part); 
    8786void tny_mime_part_del_part (TnyMimePart *self, TnyMimePart *part); 
    88 TnyMimePart* tny_mime_part_get_content_object (TnyMimePart *self); 
    8987 
    9088G_END_DECLS 
  • trunk/libtinymailui-gtk/tny-gtk-msg-view.c

    r1299 r1327  
    8484 
    8585 
    86 static void tny_gtk_msg_view_display_parts (TnyMsgView *self, TnyList *parts, gboolean alternatives); 
     86static void tny_gtk_msg_view_display_parts (TnyMsgView *self, TnyList *parts, gboolean alternatives, const gchar *desc); 
    8787static void remove_mime_part_viewer (TnyMimePartView *mpview, GtkContainer *mpviewers); 
    88 static gboolean tny_gtk_msg_view_display_part (TnyMsgView *self, TnyMimePart *part); 
     88static gboolean tny_gtk_msg_view_display_part (TnyMsgView *self, TnyMimePart *part, const gchar *desc); 
    8989 
    9090 
     
    381381 
    382382 
    383 /** 
    384  * tny_mime_part_view_proxy_func_set_part: 
    385  * @self: a #TnyGtkMsgView instance 
    386  * @part: a #TnyMimePart instance 
    387  * 
    388  * This is non-public API documentation 
    389  * 
    390  * A functional wrapper that detects whether part is rfc822, and if that is the 
    391  * case, will do something specific (like adding the header to the view). Else 
    392  * it will simply proxy to tny_mime_part_view_set_part which in turn will call  
    393  * tny_gtk_msg_view_display_part or tny_gtk_msg_view_set_msg which will call 
    394  * tny_gtk_msg_view_display_parts. 
    395  **/ 
    396 static void 
    397 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                 } else 
    422                         tny_mime_part_view_set_part (mpview, part); 
    423 } 
    424383 
    425384static void 
     
    428387        RealizePriv *prv = user_data; 
    429388 
    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); 
    431390        g_signal_handler_disconnect (widget, prv->signal); 
    432391        g_object_unref (prv->part); 
     
    455414 **/ 
    456415static gboolean 
    457 tny_gtk_msg_view_display_part (TnyMsgView *self, TnyMimePart *part
     416tny_gtk_msg_view_display_part (TnyMsgView *self, TnyMimePart *part, const gchar *desc
    458417{ 
    459418        TnyGtkMsgViewPriv *priv = TNY_GTK_MSG_VIEW_GET_PRIVATE (self); 
     
    472431                        { 
    473432                                TnyGtkMsgViewPriv *mppriv = TNY_GTK_MSG_VIEW_GET_PRIVATE (mpview); 
    474                                 const gchar *label = tny_mime_part_get_description (part)
     433                                const gchar *label = desc
    475434                                GtkWidget *expander; 
    476435 
     
    501460                                        "realize", G_CALLBACK (on_mpview_realize), prv); 
    502461                        } else 
    503                                 tny_mime_part_view_proxy_func_set_part (mpview, part); 
     462                                tny_mime_part_view_set_part (mpview, part); 
    504463 
    505464                } 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); 
    507466                else if (!TNY_IS_GTK_ATTACHMENT_MIME_PART_VIEW (mpview))  
    508467                { 
    509468                        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); 
    511470                } 
    512471        } else if (!tny_mime_part_content_type_is (part, "multipart/*") && 
     
    527486 * @self: a #TnyGtkMsgView instance 
    528487 * @parts: a #TnyList instance containing #TnyMimePart instances 
     488 * @desc: description of the parent part (if any) 
    529489 * 
    530490 * This is non-public API documentation 
     
    533493 **/ 
    534494static void 
    535 tny_gtk_msg_view_display_parts (TnyMsgView *self, TnyList *parts, gboolean alternatives
     495tny_gtk_msg_view_display_parts (TnyMsgView *self, TnyList *parts, gboolean alternatives, const gchar *desc
    536496{ 
    537497        TnyIterator *iterator = tny_list_create_iterator (parts); 
     
    540500        { 
    541501                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); 
    543503 
    544504                g_object_unref (G_OBJECT (part)); 
     
    656616                priv->part = g_object_ref (G_OBJECT (part)); 
    657617 
    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 
    661625                { 
    662626                        TnyIterator *iterator; 
     
    666630                        tny_mime_part_get_parts (part, list); 
    667631                        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)); 
    669634                        g_object_unref (G_OBJECT (list)); 
    670635                }