2006-02-06 [colin] 2.0.0cvs25
[claws.git] / src / folder.c
index 3f9b80c6c55b75989c7c7907fef4724a7a827d3e..613135fd28227c35779caa60db98dd0dd52e8deb 100644 (file)
@@ -1841,7 +1841,7 @@ gint folder_item_scan_full(FolderItem *item, gboolean filtering)
 
        folder_item_update_freeze();
        if (newmsg_list != NULL) {
-               GSList *elem;
+               GSList *elem, *to_filter = NULL;
                int total = g_slist_length(newmsg_list), cur = 0;
                
                if ((filtering == TRUE) &&
@@ -1861,10 +1861,17 @@ gint folder_item_scan_full(FolderItem *item, gboolean filtering)
                            (item->folder->account != NULL) && 
                            (item->folder->account->filter_on_recv) &&
                            procmsg_msginfo_filter(msginfo))
-                               procmsg_msginfo_free(msginfo);
+                               to_filter = g_slist_append(to_filter, msginfo);
                        else
                                exists_list = g_slist_prepend(exists_list, msginfo);
                }
+               filtering_move_and_copy_msgs(to_filter);
+               for (elem = to_filter; elem; elem = g_slist_next(elem)) {
+                       MsgInfo *msginfo = (MsgInfo *)elem->data;
+                       procmsg_msginfo_free(msginfo);
+               }
+
+               g_slist_free(to_filter);
                g_slist_free(newmsg_list);
 
                statusbar_progress_all(0,0,0);
@@ -2661,8 +2668,10 @@ FolderItem *folder_item_move_recursive(FolderItem *src, FolderItem *dest)
                src->folder->klass->remove_folder(src->folder, src);
        folder_write_list();
 
-       if (old_id != NULL && new_id != NULL)
+       if (old_id != NULL && new_id != NULL) {
                prefs_filtering_rename_path(old_id, new_id);
+               account_rename_path(old_id, new_id);
+       }
        g_free(old_id);
        g_free(new_id);
        
@@ -3519,6 +3528,10 @@ void folder_item_apply_processing(FolderItem *item)
        g_return_if_fail(item->no_select == FALSE);     
        processing_list = item->prefs->processing;
 
+       if (!pre_global_processing && !processing_list
+       &&  !post_global_processing)
+               return;
+
        folder_item_update_freeze();
 
        mlist = folder_item_get_msg_list(item);
@@ -3537,13 +3550,19 @@ void folder_item_apply_processing(FolderItem *item)
 
                 /* apply pre global rules */
                filter_message_by_msginfo(pre_global_processing, msginfo);
-                
+               
                 /* apply rules of the folder */
                filter_message_by_msginfo(processing_list, msginfo);
 
                 /* apply post global rules */
                filter_message_by_msginfo(post_global_processing, msginfo);
                 
+       }
+       if (pre_global_processing || processing_list
+           || post_global_processing)
+               filtering_move_and_copy_msgs(mlist);
+       for (cur = mlist ; cur != NULL ; cur = cur->next) {
+               MsgInfo * msginfo;
                procmsg_msginfo_free(msginfo);
        }
        g_slist_free(mlist);
@@ -3657,10 +3676,8 @@ static void folder_item_want_synchronise_func(FolderItem *item, gpointer data)
        WantSyncData *want_sync_data = (WantSyncData *)data;
        
        if (want_sync_data->folder == NULL || item->folder == want_sync_data->folder) {
-               if(item->prefs->offlinesync && item->folder->klass->synchronise)
-                       want_sync_data->want_sync = TRUE;
-               else
-                       want_sync_data->want_sync = FALSE;
+               if (item->prefs->offlinesync && item->folder->klass->synchronise)
+                       want_sync_data->want_sync |= TRUE;
        }
 }
 
@@ -3669,6 +3686,7 @@ gboolean folder_want_synchronise(Folder *folder)
        WantSyncData *want_sync_data = g_new0(WantSyncData, 1);
        gboolean result;
        want_sync_data->folder = folder;
+       want_sync_data->want_sync = FALSE;
        
        folder_func_to_all_folders(folder_item_want_synchronise_func, want_sync_data);
        result = want_sync_data->want_sync;