Changeset 3510

Show
Ignore:
Timestamp:
03/19/08 15:19:36
Author:
pvanhoof
Message:

2008-03-19 Philip Van Hoof <pvanhoof@gnome.org>

        • Fast message moves when source and dest folder are both Maildir
Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/ChangeLog

    r3509 r3510  
     12008-03-19  Philip Van Hoof <pvanhoof@gnome.org> 
     2 
     3        * Fast message moves when source and dest folder are both Maildir 
     4 
    152008-03-19  Philip Van Hoof <pvanhoof@gnome.org> 
    26 
  • trunk/libtinymail-camel/camel-lite/camel/providers/local/camel-maildir-folder.c

    r3280 r3510  
    5959static void maildir_rewrite_cache (CamelFolder *folder, const char *uid, CamelMimeMessage *msg); 
    6060 
     61static void maildir_transfer_messages_to (CamelFolder *source, GPtrArray *uids, CamelFolder *dest, GPtrArray **transferred_uids, gboolean delete_originals, CamelException *ex); 
     62 
     63 
    6164static void maildir_finalize(CamelObject * object); 
    6265 
     
    106109        camel_folder_class->rewrite_cache = maildir_rewrite_cache; 
    107110 
     111        camel_folder_class->transfer_messages_to = maildir_transfer_messages_to; 
     112 
    108113        lclass->create_summary = maildir_create_summary; 
     114} 
     115 
     116 
     117static void  
     118maildir_transfer_messages_to (CamelFolder *source, GPtrArray *uids, CamelFolder *dest, GPtrArray **transferred_uids, gboolean delete_originals, CamelException *ex) 
     119{ 
     120        if (delete_originals && CAMEL_IS_MAILDIR_FOLDER (source) && CAMEL_IS_MAILDIR_FOLDER (dest)) { 
     121                gint i; 
     122                CamelLocalFolder *lf = (CamelLocalFolder *) source; 
     123                CamelLocalFolder *df = (CamelLocalFolder *) dest; 
     124 
     125                camel_operation_start(NULL, _("Moving messages")); 
     126 
     127                camel_folder_freeze(dest); 
     128                camel_folder_freeze(source); 
     129 
     130                for (i = 0; i < uids->len; i++) { 
     131                        char *uid = (char *) uids->pdata[i]; 
     132                        char *s_filename, *d_filename, *tmp;  
     133                        CamelMaildirMessageInfo *mdi; 
     134                        CamelMessageInfo *mi, *info; 
     135 
     136                        if ((info = camel_folder_summary_uid (source->summary, uid)) == NULL) { 
     137                                camel_exception_setv(ex, CAMEL_EXCEPTION_FOLDER_INVALID_UID, 
     138                                                     _("Cannot get message: %s from folder %s\n  %s"), 
     139                                                     uid, lf->folder_path, _("No such message")); 
     140                                return; 
     141                        } 
     142 
     143                        mdi = (CamelMaildirMessageInfo *) info; 
     144                        tmp = camel_maildir_summary_info_to_name (mdi); 
     145 
     146                        d_filename = g_strdup_printf("%s/cur/%s", df->folder_path, tmp); 
     147                        g_free (tmp); 
     148                        s_filename = camel_maildir_get_filename (lf->folder_path, mdi, uid); 
     149                        camel_message_info_free (info); 
     150 
     151                        if (rename (s_filename, d_filename) != 0) 
     152                                camel_exception_setv(ex, CAMEL_EXCEPTION_SYSTEM_IO_WRITE, 
     153                                                     _("Cannot transfer message to destination folder")); 
     154                        else { 
     155                                camel_folder_set_message_flags (source, uid,  
     156                                        CAMEL_MESSAGE_EXPUNGED|CAMEL_MESSAGE_DELETED|CAMEL_MESSAGE_SEEN, ~0); 
     157                                ((CamelMessageInfoBase *)info)->flags |= CAMEL_MESSAGE_EXPUNGED; 
     158                                camel_folder_summary_remove (source->summary, info); 
     159                        } 
     160 
     161                        g_free (s_filename); 
     162                        g_free (d_filename); 
     163                } 
     164 
     165                camel_folder_thaw(dest); 
     166                camel_folder_thaw(source); 
     167 
     168                camel_operation_end(NULL); 
     169 
     170        } else 
     171                ((CamelFolderClass *)parent_class)->transfer_messages_to (source, uids, dest, transferred_uids, delete_originals, ex); 
     172 
     173        return; 
    109174} 
    110175 
  • trunk/tests/c-demo/tny-demoui-summary-view.c

    r3485 r3510  
    16351635                tny_list_prepend (headers, (GObject *) info->header); 
    16361636                tny_folder_transfer_msgs_async (folder, headers, info->to_folder,  
    1637                         FALSE, NULL, NULL, user_data); 
     1637                        TRUE, NULL, NULL, user_data); 
    16381638                g_object_unref (headers); 
    16391639        }