Changeset 2402

Show
Ignore:
Timestamp:
07/05/07 19:02:00
Author:
pvanhoof
Message:

Fixes when adding a message

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/ChangeLog

    r2391 r2402  
    22 
    33        * Fixes for the new headers after a transfer of messages happened 
     4        * Fixed for new headers after adding a message happened 
    45 
    562007-07-05  Sergio Villar Senin  <svillar@igalia.com> 
  • trunk/libtinymail-camel/tny-camel-folder.c

    r2399 r2402  
    508508        CamelException ex = CAMEL_EXCEPTION_INITIALISER; 
    509509        gboolean haderr = FALSE; 
    510         gchar *new_uid = NULL; 
    511         CamelMessageInfo *minfo = NULL; 
    512510 
    513511        g_assert (TNY_IS_CAMEL_MSG (msg)); 
     
    528526 
    529527        message = _tny_camel_msg_get_camel_mime_message (TNY_CAMEL_MSG (msg)); 
    530         if (message && CAMEL_IS_MIME_MESSAGE (message)) { 
    531                 camel_folder_append_message (priv->folder, message, NULL, &new_uid, &ex); 
     528        if (message && CAMEL_IS_MIME_MESSAGE (message))  
     529        { 
     530                TnyFolderChange *change = tny_folder_change_new (self); 
     531                gboolean first = TRUE; 
     532                GPtrArray *dst_orig_uids = NULL; 
     533                gint a = 0, len = 0, nlen = 0; 
     534                CamelException ex2 = CAMEL_EXCEPTION_INITIALISER; 
     535                len = priv->folder->summary->messages->len; 
     536                dst_orig_uids = g_ptr_array_sized_new (len); 
     537                for (a = 0; a < len; a++) { 
     538                        CamelMessageInfo *om = camel_folder_summary_index (priv->folder->summary, a); 
     539                        if (om && om->uid) 
     540                                g_ptr_array_add (dst_orig_uids, g_strdup (om->uid)); 
     541                        if (om) 
     542                                camel_message_info_free (om); 
     543                } 
     544         
     545                camel_folder_append_message (priv->folder, message, NULL, NULL, &ex); 
    532546                priv->unread_length = camel_folder_get_unread_message_count (priv->folder); 
    533547                priv->cached_length = camel_folder_get_message_count (priv->folder); 
    534548 
    535                 if (new_uid) 
    536                         minfo = camel_folder_summary_uid (priv->folder->summary, new_uid); 
     549                camel_folder_refresh_info (priv->folder, &ex2); 
     550                nlen = priv->folder->summary->messages->len; 
     551 
     552                for (a = 0; a < nlen; a++)  
     553                { 
     554                        CamelMessageInfo *om = camel_folder_summary_index (priv->folder->summary, a); 
     555                        if (om && om->uid) { 
     556                                gint b = 0; 
     557                                gboolean found = FALSE; 
     558 
     559                                for (b = 0; b < dst_orig_uids->len; b++) { 
     560                                        /* Finding the needle ... */ 
     561                                        if (!strcmp (dst_orig_uids->pdata[b], om->uid)) { 
     562                                                found = TRUE; 
     563                                                break; 
     564                                        } 
     565                                } 
     566 
     567                                if (!found) {  
     568                                        /* Jeej! a new one! */ 
     569                                        TnyHeader *hdr = _tny_camel_header_new (); 
     570 
     571                                        if (first && msg)  
     572                                        { 
     573                                                TnyHeader *header = NULL; 
     574                                                _tny_camel_msg_set_folder (TNY_CAMEL_MSG (msg), self); 
     575                                                header = tny_msg_get_header (msg); 
     576                                                ((TnyCamelMsgHeader *)header)->old_uid = g_strdup (om->uid); 
     577                                                g_object_unref (header); 
     578                                                first = FALSE; 
     579                                        } 
     580 
     581                                        /* This adds a reason to live for folder_dst */ 
     582                                        _tny_camel_header_set_folder (TNY_CAMEL_HEADER (hdr),  
     583                                                TNY_CAMEL_FOLDER (self), priv); 
     584                                        /* hdr will take care of the freeup */ 
     585                                        _tny_camel_header_set_as_memory (TNY_CAMEL_HEADER (hdr), om); 
     586                                        tny_folder_change_add_added_header (change, hdr); 
     587                                        g_object_unref (hdr); 
     588                                } else /* Not-new message, freeup */ 
     589                                        camel_message_info_free (om); 
     590                        } else if (om) /* arg? */ 
     591                                camel_message_info_free (om); 
     592                } 
    537593 
    538594                update_iter_counts (priv); 
     595 
     596                tny_folder_change_set_new_all_count (change, priv->cached_length); 
     597                tny_folder_change_set_new_unread_count (change, priv->unread_length); 
     598 
     599                notify_folder_observers_about (self, change); 
     600 
     601                g_object_unref (G_OBJECT (change)); 
     602 
     603                if (dst_orig_uids) { 
     604                        g_ptr_array_foreach (dst_orig_uids, (GFunc) g_free, NULL); 
     605                        g_ptr_array_free (dst_orig_uids, TRUE); 
     606                } 
    539607 
    540608        } else { 
     
    552620                        TNY_FOLDER_ERROR_ADD_MSG, 
    553621                        camel_exception_get_description (&ex)); 
    554         } else if (!haderr) 
    555         { 
    556                 TnyHeader *header = NULL; 
    557  
    558                 _tny_camel_msg_set_folder (TNY_CAMEL_MSG (msg), self); 
    559                 header = tny_msg_get_header (msg); 
    560  
    561                 if (header && TNY_IS_HEADER (header)) 
    562                 { 
    563                         TnyHeader *hdr = NULL; 
    564                         TnyFolderChange *change = tny_folder_change_new (self); 
    565  
    566                         if (new_uid) 
    567                                 ((TnyCamelMsgHeader *)header)->old_uid = g_strdup (new_uid); 
    568  
    569                         if (minfo) 
    570                         { 
    571                                 TnyHeader *hdr = _tny_camel_header_new (); 
    572                                 /* This adds a reason to live to self */ 
    573                                 _tny_camel_header_set_folder (TNY_CAMEL_HEADER (hdr),  
    574                                         TNY_CAMEL_FOLDER (self), priv); 
    575                                 /* hdr will take care of the freeup */ 
    576                                 _tny_camel_header_set_as_memory (TNY_CAMEL_HEADER (hdr), minfo); 
    577                         } else 
    578                                 hdr = TNY_HEADER (g_object_ref (header)); 
    579  
    580                         tny_folder_change_add_added_header (change, hdr); 
    581                         tny_folder_change_set_new_all_count (change, priv->cached_length); 
    582                         tny_folder_change_set_new_unread_count (change, priv->unread_length); 
    583                         notify_folder_observers_about (self, change); 
    584  
    585                         g_object_unref (G_OBJECT (change)); 
    586                 } 
    587  
    588                 if (header && G_IS_OBJECT (header)) 
    589                         g_object_unref (G_OBJECT (header)); 
    590         } 
    591  
    592         if (new_uid) 
    593                 g_free (new_uid); 
     622        } 
    594623 
    595624        _tny_session_stop_operation (TNY_FOLDER_PRIV_GET_SESSION (priv));