Changeset 573

Show
Ignore:
Timestamp:
07/12/06 21:45:59
Author:
pvanhoof
Message:

Smaller header instances

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/libtinymail-camel/tny-msg-folder.c

    r548 r573  
    342342        TnyMsgFolderPriv *priv = ptr->priv; 
    343343        TnyListIface *headers = ptr->headers; 
     344        CamelFolder *cfol = _tny_msg_folder_get_camel_folder (self); 
    344345 
    345346        /* TODO: Proxy instantiation (happens a lot, could use a pool) */ 
    346347        header = TNY_MSG_HEADER_IFACE (tny_msg_header_new ()); 
    347348 
    348         tny_msg_header_set_use_summary (TNY_MSG_HEADER (header),  
    349                 priv->has_summary_cap); 
    350  
    351349        tny_msg_header_iface_set_folder (header, self); 
    352         tny_msg_header_iface_set_uid (header, uid); 
     350        _tny_msg_header_set_camel_message_info (header, 
     351                camel_folder_get_message_info (cfol, uid)); 
    353352 
    354353        tny_list_iface_prepend (headers, header); 
  • trunk/libtinymail-camel/tny-msg-header-priv.h

    r483 r573  
    2727void                _tny_msg_header_set_camel_mime_message (TnyMsgHeader *self, CamelMimeMessage *camel_mime_message); 
    2828CamelMimeMessage*   _tny_msg_header_get_camel_mime_message (TnyMsgHeader *self); 
    29 gboolean            _tny_msg_header_get_is_pop (TnyMsgHeader *self); 
    3029 
    3130#endif 
  • trunk/libtinymail-camel/tny-msg-header.c

    r570 r573  
    4141static GObjectClass *parent_class = NULL; 
    4242 
     43typedef struct _WriteInfo WriteInfo; 
     44struct _WriteInfo 
     45{ 
     46        CamelMimeMessage *msg; 
     47        gchar *mime_from; 
     48}; 
     49 
     50#pragma pack(1) /* Size will be 21 in stead of 24 */ 
    4351struct _TnyMsgHeader  
    4452{ 
    4553        GObject parent; 
    46  
    47         gchar *uid; 
     54        void *info; 
     55 
    4856        TnyMsgFolderIface *folder; 
    49         gboolean use_summary; 
    50         GMutex *hdr_lock; 
    51         CamelMessageInfo *message_info; 
    52         CamelMimeMessage *mime_message; 
    53         gchar *mime_from; 
    54         const gchar *invalid; 
    55         gboolean uncachable; 
     57        guchar write:1; 
    5658}; 
    5759 
     
    6163}; 
    6264 
    63 gboolean  
    64 _tny_msg_header_get_is_pop (TnyMsgHeader *self) 
    65 
    66         /* All summary types aren't pop atm ;-) */ 
    67         return (!self->use_summary); 
    68 
    69  
    70 void 
    71 _tny_msg_header_set_not_uncachable (TnyMsgHeader *self) 
    72 
    73         self->uncachable = FALSE; 
    74         return; 
    75 
    76  
    77 static void 
    78 unload_msg_header (TnyMsgHeader *self) 
    79 
    80         if (G_UNLIKELY (!self->uncachable)) 
    81                 return; 
    82  
    83         if (G_LIKELY (self->mime_from)) 
    84         { 
    85                 g_free (self->mime_from); 
    86                 self->mime_from = NULL; 
    87         } 
    88         if (G_LIKELY (self->use_summary)) 
    89         { 
    90                 if (G_LIKELY (self->message_info)) 
    91                 { 
    92                         /* It looks like this conflicts with freeing the folder  
    93                         camel_message_info_free (self->message_info);  
    94                         self->message_info = NULL; */ 
    95                 } 
    96         } else { 
    97                 if (G_LIKELY (self->mime_message) && G_LIKELY (CAMEL_IS_OBJECT (self->mime_message))) 
    98                         camel_object_unref (CAMEL_OBJECT (self->mime_message));  
    99                 self->mime_message = NULL; 
    100         } 
    101  
    102         return; 
    103 
    104  
    105 /** 
    106  * tny_msg_header_set_use_summary: 
    107  * @self: The #TnyMsgHeader instance 
    108  * @val: Whether or not to use summary capabilities 
    109  * 
    110  **/ 
    111 void  
    112 tny_msg_header_set_use_summary (TnyMsgHeader *self, gboolean val) 
    113 
    114         g_mutex_lock (self->hdr_lock); 
    115         unload_msg_header (self); 
    116         self->use_summary = val; 
    117         g_mutex_unlock (self->hdr_lock); 
    118  
    119         return; 
    120 
    121  
    122 static void 
    123 load_msg_header (TnyMsgHeader *self) 
    124 
    125  
    126         if (G_UNLIKELY (!self->uncachable)) 
    127                 return; 
    128  
    129         if (G_LIKELY (self->use_summary)) 
    130         { 
    131                 if (G_LIKELY (!self->message_info) && G_LIKELY (self->folder) && G_LIKELY (self->uid)) 
    132                 { 
    133                   CamelFolder *folder = _tny_msg_folder_get_camel_folder (self->folder); 
    134                   CamelMessageInfo *msginfo; 
    135  
    136                   if (folder) 
    137                   { 
    138                         msginfo = camel_folder_get_message_info (folder, self->uid); 
    139                         _tny_msg_header_set_camel_message_info (self, msginfo); 
    140                   } 
    141                 } 
    142         } else { 
    143                 if (G_LIKELY (!self->mime_message) && G_LIKELY (self->folder) && G_LIKELY (self->uid)) 
    144                 { 
    145                   CamelFolder *folder = _tny_msg_folder_get_camel_folder (self->folder); 
    146                   CamelException ex = CAMEL_EXCEPTION_INITIALISER; 
    147  
    148                   if (folder) 
    149                   { 
    150                         self->mime_message = camel_folder_get_message  
    151                                 (folder, self->uid, &ex); 
    152                   } 
    153                 } 
    154         } 
    155  
    156         return; 
     65static const gchar *invalid = "Invalid"; 
     66 
     67static void  
     68destroy_write (TnyMsgHeader *self) 
     69
     70        if (((WriteInfo*)self->info)->msg) 
     71                camel_object_unref (CAMEL_OBJECT (((WriteInfo*)self->info)->msg)); 
     72 
     73        if (((WriteInfo*)self->info)->mime_from) 
     74                g_free (((WriteInfo*)self->info)->mime_from); 
     75 
     76        g_free (self->info); 
    15777} 
    15878 
     
    16080prepare_for_write (TnyMsgHeader *self) 
    16181{ 
    162         unload_msg_header (self); 
    163  
    164         self->use_summary = FALSE; 
    165  
    166         if (G_LIKELY (!self->mime_message)) 
    167                 self->mime_message = camel_mime_message_new (); 
    168  
    169         _tny_msg_header_set_not_uncachable (self); 
     82        if (!self->write) 
     83        { 
     84                self->info = g_new0 (WriteInfo, 1); 
     85                ((WriteInfo*)self->info)->msg = camel_mime_message_new (); 
     86                ((WriteInfo*)self->info)->mime_from = NULL; 
     87                self->write = 1; 
     88        } 
    17089 
    17190        return; 
     
    17594_tny_msg_header_set_camel_message_info (TnyMsgHeader *self, CamelMessageInfo *camel_message_info) 
    17695{ 
    177  
    178         if (G_UNLIKELY (self->message_info)) 
     96        if (G_UNLIKELY (self->info)) 
    17997                g_warning ("Strange behaviour: Overwriting existing message info"); 
    18098 
    181         self->message_info = camel_message_info; 
     99        if (self->write) 
     100                destroy_write (self); 
     101 
     102        self->info = camel_message_info; 
     103        self->write = 0; 
    182104 
    183105        return; 
     
    187109_tny_msg_header_get_camel_mime_message (TnyMsgHeader *self) 
    188110{ 
    189         CamelMimeMessage *retval; 
    190  
    191         retval = self->mime_message; 
    192  
    193         return retval; 
     111 
     112        if (G_UNLIKELY (self->write == 0)) 
     113        { 
     114                g_warning ("Strange behaviour: the header was not written"); 
     115                return NULL; 
     116        } 
     117 
     118        return ((WriteInfo*)self->info)->msg; 
     119 
    194120} 
    195121 
     
    198124{ 
    199125 
    200         if (G_UNLIKELY (self->mime_message)) 
     126        if (G_UNLIKELY (self->info)) 
    201127                g_warning (_("Strange behaviour: Overwriting existing MIME message")); 
    202128 
    203         self->mime_message = camel_mime_message; 
    204  
    205         return; 
    206 
    207  
    208 const TnyMsgFolderIface*  
    209 tny_msg_header_get_folder (TnyMsgHeaderIface *self) 
    210 
    211         TnyMsgHeader *me = TNY_MSG_HEADER (self); 
    212         const TnyMsgFolderIface *retval; 
    213  
    214         g_mutex_lock (me->hdr_lock); 
    215         retval = me->folder; 
    216         g_mutex_unlock (me->hdr_lock); 
    217  
    218         return retval; 
    219 
    220  
    221  
    222 void 
    223 tny_msg_header_set_folder (TnyMsgHeaderIface *self, const TnyMsgFolderIface* folder) 
    224 
    225         TnyMsgHeader *me = TNY_MSG_HEADER (self); 
    226  
    227         if (G_UNLIKELY (me->folder)) 
    228                 g_warning (_("Strange behaviour: Overwriting existing folder")); 
    229  
    230         g_mutex_lock (me->hdr_lock); 
    231         me->folder = (TnyMsgFolderIface*)folder; 
    232         g_mutex_unlock (me->hdr_lock); 
    233  
    234         return; 
    235 
     129        if (self->write) 
     130                destroy_write (self); 
     131 
     132        self->info = g_new0 (WriteInfo, 1); 
     133        ((WriteInfo*)self->info)->msg = camel_mime_message; 
     134        ((WriteInfo*)self->info)->mime_from = NULL;\ 
     135        self->write = 1; 
     136 
     137        return; 
     138
     139 
    236140 
    237141 
     
    240144{ 
    241145        TnyMsgHeader *me = TNY_MSG_HEADER (self); 
    242         const gchar *retval=NULL; 
    243  
    244         g_mutex_lock (me->hdr_lock); 
    245         load_msg_header (me); 
     146        const gchar *retval = NULL; 
     147 
    246148        /* TODO get_replyto */ 
    247         g_mutex_unlock (me->hdr_lock); 
    248149 
    249150        return retval; 
     
    258159        CamelInternetAddress *addr = camel_internet_address_new (); 
    259160 
    260         g_mutex_lock (me->hdr_lock); 
    261  
    262161        _foreach_email_add_to_inet_addr (bcc, addr); 
    263162 
    264163        prepare_for_write (me); 
    265164 
    266         camel_mime_message_set_recipients (me->mime_message,  
     165        camel_mime_message_set_recipients (((WriteInfo*)me->info)->msg,  
    267166                CAMEL_RECIPIENT_TYPE_BCC, addr); 
    268167 
    269168        camel_object_unref (CAMEL_OBJECT (addr)); 
    270169 
    271         g_mutex_unlock (me->hdr_lock); 
    272  
    273170        return; 
    274171} 
     
    280177        CamelInternetAddress *addr = camel_internet_address_new (); 
    281178 
    282         g_mutex_lock (me->hdr_lock); 
    283  
    284179        _foreach_email_add_to_inet_addr (cc, addr); 
    285180 
    286181        prepare_for_write (me); 
    287182 
    288         camel_mime_message_set_recipients (me->mime_message,  
     183        camel_mime_message_set_recipients (((WriteInfo*)me->info)->msg,  
    289184                CAMEL_RECIPIENT_TYPE_CC, addr); 
    290  
    291185        camel_object_unref (CAMEL_OBJECT (addr)); 
    292  
    293         g_mutex_unlock (me->hdr_lock); 
    294186 
    295187        return; 
     
    302194        CamelInternetAddress *addr = camel_internet_address_new (); 
    303195        gchar *dup; 
    304  
    305         g_mutex_lock (me->hdr_lock); 
    306196 
    307197        dup = g_strdup (from); 
     
    311201        prepare_for_write (me); 
    312202 
    313         camel_mime_message_set_from (me->mime_message, addr); 
     203        camel_mime_message_set_from (((WriteInfo*)me->info)->msg, addr); 
    314204        camel_object_unref (CAMEL_OBJECT (addr)); 
    315205 
    316         g_mutex_unlock (me->hdr_lock); 
    317  
    318206        return; 
    319207} 
     
    324212        TnyMsgHeader *me = TNY_MSG_HEADER (self); 
    325213 
    326         g_mutex_lock (me->hdr_lock); 
    327  
    328214        prepare_for_write (me); 
    329  
    330         camel_mime_message_set_subject (me->mime_message, subject); 
    331  
    332         g_mutex_unlock (me->hdr_lock); 
     215        camel_mime_message_set_subject (((WriteInfo*)me->info)->msg, subject); 
    333216 
    334217        return; 
     
    342225        gchar *dup; 
    343226 
    344         g_mutex_lock (me->hdr_lock); 
    345  
    346227        dup = g_strdup (to); 
    347  
    348228        _foreach_email_add_to_inet_addr (dup, addr); 
    349  
    350229        g_free (dup); 
    351230 
    352231        prepare_for_write (me); 
    353232 
    354         camel_mime_message_set_recipients (me->mime_message,  
     233        camel_mime_message_set_recipients ((CamelMimeMessage*)me->info,  
    355234                CAMEL_RECIPIENT_TYPE_TO, addr); 
    356235 
    357236        camel_object_unref (CAMEL_OBJECT (addr)); 
    358237 
    359         g_mutex_unlock (me->hdr_lock); 
    360  
    361238        return; 
    362239} 
     
    368245        TnyMsgHeader *me = TNY_MSG_HEADER (self); 
    369246 
    370         g_mutex_lock (me->hdr_lock); 
    371         prepare_for_write (me); 
    372247        /* TODO set replyto */ 
    373         g_mutex_unlock (me->hdr_lock); 
    374248 
    375249        return; 
     
    381255{ 
    382256        TnyMsgHeader *me = TNY_MSG_HEADER (self); 
    383  
    384         const gchar *retval=NULL; 
    385  
    386         g_mutex_lock (me->hdr_lock); 
    387  
    388         load_msg_header (me); 
    389  
    390         if (G_LIKELY (me->use_summary) && G_LIKELY (me->message_info)) 
    391                 retval = camel_message_info_cc (me->message_info); 
    392         else if (G_LIKELY (me->mime_message)) 
    393                 retval = camel_medium_get_header (CAMEL_MEDIUM (me->mime_message), "cc"); 
    394  
    395         if (G_UNLIKELY (!retval)) 
    396                 retval = me->invalid; 
    397  
    398         g_mutex_unlock (me->hdr_lock); 
     257        const gchar *retval; 
     258 
     259        if (G_UNLIKELY (!me->info)) 
     260                return invalid; 
     261 
     262        if (G_UNLIKELY (me->write)) 
     263                retval = camel_medium_get_header (CAMEL_MEDIUM (((WriteInfo*)me->info)->msg), "cc"); 
     264        else 
     265                retval = camel_message_info_cc ((CamelMessageInfo*)me->info); 
    399266 
    400267        return retval; 
     
    405272{ 
    406273        TnyMsgHeader *me = TNY_MSG_HEADER (self); 
    407  
    408         static const gchar *retval=NULL; 
    409  
    410         g_mutex_lock (me->hdr_lock); 
    411  
    412         load_msg_header (me); 
    413  
    414         if (G_LIKELY (me->use_summary)) /* TODO get_bcc */ 
    415                 retval = me->invalid; 
    416         else if (G_LIKELY (me->mime_message)) 
    417                 retval = camel_medium_get_header (CAMEL_MEDIUM (me->mime_message), "bcc"); 
    418  
    419         if (G_UNLIKELY (!retval)) 
    420                 retval = me->invalid; 
    421  
    422         g_mutex_unlock (me->hdr_lock); 
     274        const gchar *retval; 
     275 
     276        if (G_UNLIKELY (!me->info)) 
     277                return invalid; 
     278 
     279        if (G_UNLIKELY (me->write)) 
     280                retval = camel_medium_get_header (CAMEL_MEDIUM (((WriteInfo*)me->info)->msg), "bcc"); 
     281        else 
     282                retval = invalid; 
    423283 
    424284        return retval; 
     
    429289{ 
    430290        TnyMsgHeader *me = TNY_MSG_HEADER (self); 
    431  
    432291        TnyMsgHeaderFlags retval; 
    433292 
    434         g_mutex_lock (me->hdr_lock); 
    435  
    436         load_msg_header (me); 
    437  
    438         if (G_LIKELY (me->use_summary) && G_LIKELY (me->message_info)) 
    439                 retval = camel_message_info_flags (me->message_info); 
    440  
    441         g_mutex_unlock (me->hdr_lock); 
    442  
    443         return (TnyMsgHeaderFlags)retval; 
     293        if (me->write) 
     294        { 
     295                g_warning ("tny_msg_header_get_flags: This is a header for a new message!\n"); 
     296                return retval; 
     297        } 
     298 
     299        retval = camel_message_info_flags ((CamelMessageInfo*)me->info); 
     300 
     301        return retval; 
    444302} 
    445303 
     
    449307        TnyMsgHeader *me = TNY_MSG_HEADER (self); 
    450308 
    451         g_mutex_lock (me->hdr_lock); 
    452  
    453         prepare_for_write (me); 
    454  
    455         if (G_LIKELY (me->use_summary) && G_LIKELY (me->message_info)) 
    456         camel_message_info_set_flags (me->message_info, mask, ~0); 
    457  
    458         g_mutex_unlock (me->hdr_lock); 
     309        if (me->write) 
     310        { 
     311                g_warning ("tny_msg_header_get_flags: This is a header for a new message!\n"); 
     312                return; 
     313        } 
     314 
     315        camel_message_info_set_flags ((CamelMessageInfo*)me->info, mask, ~0); 
     316 
     317        return; 
    459318} 
    460319 
     
    464323        TnyMsgHeader *me = TNY_MSG_HEADER (self); 
    465324 
    466         g_mutex_lock (me->hdr_lock); 
    467  
    468         prepare_for_write (me); 
    469  
    470         if (G_LIKELY (me->use_summary) && G_LIKELY (me->message_info)) 
    471         camel_message_info_set_flags (me->message_info, mask, 0); 
    472  
    473         g_mutex_unlock (me->hdr_lock); 
     325        if (me->write) 
     326        { 
     327                g_warning ("tny_msg_header_get_flags: This is a header for a new message!\n"); 
     328                return; 
     329        } 
     330 
     331        camel_message_info_set_flags ((CamelMessageInfo*)me->info, mask, 0); 
     332 
     333        return; 
    474334} 
    475335 
     
    481341        time_t retval; 
    482342 
    483         g_mutex_lock (me->hdr_lock); 
    484  
    485         load_msg_header (me); 
    486  
    487         if (G_LIKELY (me->use_summary) && G_LIKELY (me->message_info)) 
    488                 retval = camel_message_info_date_received (me->message_info); 
    489         else if (G_LIKELY (me->mime_message)) 
    490                 retval = camel_mime_message_get_date_received (me->mime_message, NULL); 
    491  
    492         g_mutex_unlock (me->hdr_lock); 
     343        if (G_UNLIKELY (!me->info)) 
     344                return retval; 
     345 
     346        if (G_UNLIKELY (me->write)) 
     347                retval = camel_mime_message_get_date_received (((WriteInfo*)me->info)->msg, NULL); 
     348        else 
     349                retval = camel_message_info_date_received ((CamelMessageInfo*)me->info); 
    493350 
    494351        return retval; 
     
    502359        time_t retval; 
    503360 
    504         g_mutex_lock (me->hdr_lock); 
    505  
    506         load_msg_header (me); 
    507  
    508         if (G_LIKELY (me->use_summary) && G_LIKELY (me->message_info)) 
    509                 retval = camel_message_info_date_sent (me->message_info); 
    510         else { 
    511                 /* TODO: write case get_date_sent */ 
    512         } 
    513  
    514         g_mutex_unlock (me->hdr_lock); 
     361        if (G_UNLIKELY (!me->info) || G_UNLIKELY (me->write)) 
     362                return retval; 
     363 
     364        retval = camel_message_info_date_received ((CamelMessageInfo*)me->info); 
    515365 
    516366        return retval; 
     
    522372        TnyMsgHeader *me = TNY_MSG_HEADER (self); 
    523373         
    524         const gchar *retval=NULL; 
    525  
    526         g_mutex_lock (me->hdr_lock); 
    527  
    528         load_msg_header (me); 
    529  
    530         if (G_LIKELY (me->use_summary) && G_LIKELY (me->message_info)) 
    531                 retval = camel_message_info_from (me->message_info); 
    532         else 
    533         { 
    534                 if (G_LIKELY (!me->mime_from) && G_LIKELY (me->mime_message)) 
     374        const gchar *retval; 
     375 
     376        if (G_UNLIKELY (!me->info)) 
     377                return invalid; 
     378 
     379        if (G_UNLIKELY (me->write)) 
     380        { 
     381                if (G_LIKELY (!((WriteInfo*)me->info)->mime_from)) 
    535382                { 
    536383                        CamelInternetAddress *addr = (CamelInternetAddress*) 
    537                                 camel_mime_message_get_from (me->mime_message); 
    538                         me->mime_from = camel_address_format (CAMEL_ADDRESS (addr)); 
    539                         /* camel_object_unref (CAMEL_OBJECT (addr)); */ 
     384                                camel_mime_message_get_from (((WriteInfo*)me->info)->msg); 
     385                        ((WriteInfo*)me->info)->mime_from = camel_address_format (CAMEL_ADDRESS (addr)); 
    540386                } 
    541387 
    542                 retval = (const gchar*)me->mime_from; 
    543         } 
    544  
    545         if (G_UNLIKELY (!retval)) 
    546                 retval = me->invalid; 
    547  
    548         g_mutex_unlock (me->hdr_lock); 
     388                retval = (const gchar*)((WriteInfo*)me->info)->mime_from; 
     389        } else 
     390                retval = camel_message_info_from ((CamelMimeMessage*)me->info); 
    549391 
    550392        return retval; 
     
    555397{ 
    556398        TnyMsgHeader *me = TNY_MSG_HEADER (self); 
    557         const gchar *retval=NULL; 
    558  
    559         g_mutex_lock (me->hdr_lock); 
    560  
    561         load_msg_header (me); 
    562  
    563         if (G_LIKELY (me->use_summary) && G_LIKELY (me->message_info)) 
    564                 retval = camel_message_info_subject (me->message_info); 
    565         else if (G_LIKELY (me->mime_message)) 
    566                 retval = camel_mime_message_get_subject (me->mime_message); 
    567  
    568         if (G_UNLIKELY (!retval)) 
    569                 retval = me->invalid; 
    570  
    571         g_mutex_unlock (me->hdr_lock); 
     399        const gchar *retval; 
     400 
     401        if (G_UNLIKELY (!me->info)) 
     402                return invalid; 
     403 
     404        if (G_UNLIKELY (me->write)) 
     405                retval = camel_mime_message_get_subject (((WriteInfo*)me->info)->msg); 
     406        else 
     407                retval = camel_message_info_subject ((CamelMessageInfo*)me->info); 
    572408 
    573409        return retval; 
     
    579415{ 
    580416        TnyMsgHeader *me = TNY_MSG_HEADER (self); 
    581          
    582         const gchar *retval=NULL; 
    583  
    584         g_mutex_lock (me->hdr_lock); 
    585  
    586         load_msg_header (me); 
    587  
    588         if (G_LIKELY (me->use_summary) && G_LIKELY (me->message_info)) 
    589                 retval = camel_message_info_to (me->message_info); 
    590         else if (G_LIKELY (me->mime_message)) 
    591                 retval = camel_medium_get_header (CAMEL_MEDIUM (me->mime_message), "to"); 
    592  
    593         if (G_UNLIKELY (!retval)) 
    594                 retval = me->invalid; 
    595  
    596         g_mutex_unlock (me->hdr_lock); 
    597  
    598         return retval; 
     417        gchar *retval; 
     418 
     419        if (G_UNLIKELY (!me->info)) 
     420                return invalid; 
     421 
     422        if (G_UNLIKELY (me->write)) 
     423                retval = (gchar*) camel_medium_get_header (CAMEL_MEDIUM (((WriteInfo*)me->info)->msg), "to"); 
     424        else 
     425                retval = (gchar*) camel_message_info_to ((CamelMessageInfo*)me->info); 
     426 
     427        return (const gchar*)retval; 
    599428} 
    600429 
     
    603432{ 
    604433        TnyMsgHeader *me = TNY_MSG_HEADER (self); 
    605  
    606         const gchar *retval=NULL; 
    607  
    608         g_mutex_lock (me->hdr_lock); 
    609  
    610         load_msg_header (me); 
    611  
    612         if (G_LIKELY (me->use_summary) && G_LIKELY (me->message_info)) 
    613                 retval = (const gchar*)camel_message_info_message_id (me->message_info); 
    614         else if (G_LIKELY (me->mime_message)) 
    615                 retval = camel_mime_message_get_message_id (me->mime_message); 
    616  
    617         if (G_UNLIKELY (!retval)) 
    618                 retval = me->invalid; 
    619  
    620         g_mutex_unlock (me->hdr_lock); 
    621  
    622         return retval; 
     434        gchar *retval; 
     435 
     436        if (G_UNLIKELY (!me->info)) 
     437                return invalid; 
     438 
     439        if (G_UNLIKELY (me->write)) 
     440                retval = (gchar*) camel_mime_message_get_message_id (((WriteInfo*)me->info)->msg); 
     441        else 
     442                retval = (gchar*) camel_message_info_message_id ((CamelMessageInfo*)me->info); 
     443 
     444        return (const gchar*)retval; 
     445 
    623446 
    624447} 
     
    629452{ 
    630453        TnyMsgHeader *me = TNY_MSG_HEADER (self); 
    631  
    632454        const gchar *retval; 
    633455 
    634         g_mutex_lock (me->hdr_lock); 
    635  
    636         load_msg_header (me); 
    637  
    638         if (G_LIKELY (me->use_summary) && G_LIKELY (me->message_info)) 
    639                 retval = camel_message_info_uid (me->message_info); 
    640         else /* Bleh solution ... */ 
    641                 retval = me->uid; 
    642  
    643         g_mutex_unlock (me->hdr_lock); 
    644  
    645         return retval; 
    646 
    647  
    648 static void 
    649 tny_msg_header_set_uid (TnyMsgHeaderIface *self, const gchar *uid) 
    650 
    651         TnyMsgHeader *me = TNY_MSG_HEADER (self); 
    652  
    653         g_mutex_lock (me->hdr_lock); 
    654  
    655         unload_msg_header (me); 
    656  
    657         /* Speedup trick, also check tny-msg-folder.c */ 
    658         /* if (priv->uid) 
    659                 g_free (priv->uid); 
    660         priv->uid = g_strdup (uid); */ 
    661  
    662         /* Yes I know what I'm doing, also check tny-msg-folder.c */ 
    663  
    664         if (G_LIKELY (me->use_summary)) 
    665                 me->uid = (gchar*)uid; 
    666         else { 
    667                 /* NEED TO INVESTIGATE THIS 
    668                 For some reason the trick doesn't work if you don't  
    669                 have support for summaries */ 
    670                 if (me->uid) 
    671                         g_free (me->uid); 
    672                 me->uid = g_strdup (uid); 
    673                 /* TODO: And if I AM going to do it this way, I need to lock  
    674                  priv->uid */ 
    675         } 
    676  
    677         g_mutex_unlock (me->hdr_lock); 
    678  
    679         return; 
     456        if (G_UNLIKELY (!me->info) || G_UNLIKELY (me->write)) 
     457                return invalid; 
     458 
     459        retval = camel_message_info_uid ((CamelMessageInfo*)me->info); 
    680460} 
    681461 
     
    685465{ 
    686466        TnyMsgHeader *me = TNY_MSG_HEADER (self); 
    687  
    688         gboolean retval; 
    689  
    690         g_mutex_lock (me->hdr_lock); 
    691  
    692         if (G_LIKELY (me->use_summary)) 
    693                 retval = (me->message_info != NULL); 
    694         else 
    695                 retval = (me->mime_message != NULL); 
    696  
    697         g_mutex_unlock (me->hdr_lock); 
    698  
    699         return retval; 
     467        return (me->info != NULL); 
    700468} 
    701469 
     
    703471tny_msg_header_uncache (TnyMsgHeaderIface *self) 
    704472{ 
    705         TnyMsgHeader *me = TNY_MSG_HEADER (self); 
    706  
    707         g_mutex_lock (me->hdr_lock); 
    708  
    709         if (G_LIKELY (me->use_summary) && G_LIKELY (me->message_info)) 
    710                 unload_msg_header (me); 
    711  
    712         if (G_UNLIKELY (!me->use_summary) && G_LIKELY (me->mime_message)) 
    713                 unload_msg_header (me); 
    714  
    715         g_mutex_unlock (me->hdr_lock); 
    716  
    717473        return; 
    718474} 
     
    723479        TnyMsgHeader *self = (TnyMsgHeader*) object; 
    724480 
    725         g_mutex_lock (self->hdr_lock); 
    726  
    727         /* Instance is going to dissapear, set uncachable as we  
    728            reuse the functionality */ 
    729         self->uncachable = TRUE; 
    730  
    731         if (G_LIKELY (self->use_summary) && G_LIKELY (self->message_info)) 
    732                 unload_msg_header (self); 
    733  
    734         if (G_UNLIKELY (!self->use_summary) && G_LIKELY (self->mime_message)) 
    735                 unload_msg_header (self); 
    736  
    737         /* Indeed, check the speedup trick above */ 
    738         if (G_LIKELY (self->uid) && G_UNLIKELY (!self->use_summary)) 
    739                 g_free (self->uid); /* Also check above */ 
    740  
    741         g_mutex_unlock (self->hdr_lock); 
    742  
    743         g_mutex_free (self->hdr_lock); 
     481        if (G_UNLIKELY (self->write)) 
     482        { 
     483                destroy_write (self); 
     484        } 
    744485 
    745486        (*parent_class->finalize) (object); 
     
    758499{ 
    759500        TnyMsgHeader *self = g_object_new (TNY_TYPE_MSG_HEADER, NULL); 
    760         static const gchar *inv = "Invalid"; 
    761  
    762         self->uncachable = TRUE;         
    763         self->invalid = inv; 
    764         self->mime_message = NULL; 
    765         self->message_info = NULL; 
    766         self->mime_from = NULL; 
    767  
    768         /* Second allocation :-( */ 
    769         self->hdr_lock = g_mutex_new (); 
     501         
     502        self->info = NULL; 
     503        self->write = 0; 
    770504 
    771505        return self; 
    772506} 
    773507 
     508static void 
     509tny_msg_header_set_folder (TnyMsgHeaderIface *self, const TnyMsgFolderIface *folder) 
     510{ 
     511        TnyMsgHeader *me = TNY_MSG_HEADER (self); 
     512        me->folder = (TnyMsgFolderIface*)folder; 
     513        return; 
     514} 
     515 
     516static const TnyMsgFolderIface* 
     517tny_msg_header_get_folder (TnyMsgHeaderIface *self) 
     518{ 
     519        TnyMsgHeader *me = TNY_MSG_HEADER (self); 
     520        return (const TnyMsgFolderIface*)me->folder; 
     521} 
    774522 
    775523static void 
     
    788536        klass->get_replyto_func = tny_msg_header_get_replyto; 
    789537        klass->get_uid_func = tny_msg_header_get_uid; 
    790         klass->set_uid_func = tny_msg_header_set_uid; 
    791538        klass->set_folder_func = tny_msg_header_set_folder; 
    792539        klass->get_folder_func = tny_msg_header_get_folder; 
  • trunk/libtinymail-camel/tny-msg-header.h

    r376 r573  
    4444 
    4545 
    46 void            tny_msg_header_set_use_summary (TnyMsgHeader *self, gboolean val); 
    47  
    4846G_END_DECLS 
    4947 
  • trunk/libtinymail-camel/tny-msg.c

    r552 r573  
    332332        message = _tny_msg_header_get_camel_mime_message (TNY_MSG_HEADER (priv->header)); 
    333333 
    334         if (G_UNLIKELY (message)) 
    335                 _tny_msg_set_camel_mime_message (TNY_MSG (self), message,  
    336                         _tny_msg_header_get_is_pop (TNY_MSG_HEADER (priv->header))); 
    337  
    338334        g_mutex_unlock (priv->header_lock); 
    339335 
  • trunk/libtinymail/tny-msg-header-iface.c

    r570 r573  
    436436} 
    437437 
    438 /** 
    439  * tny_msg_header_iface_set_message_id: 
    440  * @self: a #TnyMsgHeaderIface object 
    441  * @id: an unique follow-up uid 
    442  *  
    443  * 
    444  **/ 
    445 void 
    446 tny_msg_header_iface_set_uid (TnyMsgHeaderIface *self, const gchar *id) 
    447 { 
    448 #ifdef DEBUG 
    449         if (!TNY_MSG_HEADER_IFACE_GET_CLASS (self)->set_uid_func) 
    450                 g_critical ("You must implement tny_msg_header_iface_set_uid\n"); 
    451 #endif 
    452  
    453         TNY_MSG_HEADER_IFACE_GET_CLASS (self)->set_uid_func (self, id); 
    454         return; 
    455 } 
    456  
    457438 
    458439/** 
  • trunk/libtinymail/tny-msg-header-iface.h

    r570 r573  
    7979        time_t         (*get_date_sent_func)      (TnyMsgHeaderIface *self); 
    8080 
    81         void           (*set_uid_func)            (TnyMsgHeaderIface *self, const gchar *uid); 
    8281        void           (*set_bcc_func)            (TnyMsgHeaderIface *self, const gchar *bcc); 
    8382        void           (*set_cc_func)             (TnyMsgHeaderIface *self, const gchar *cc); 
     
    102101GType          tny_msg_header_iface_get_type      (void); 
    103102 
    104 void           tny_msg_header_iface_set_uid             (TnyMsgHeaderIface *self, const gchar *uid); 
    105103const gchar*   tny_msg_header_iface_get_uid             (TnyMsgHeaderIface *self); 
    106104