2006-08-28 [paul] 2.4.0cvs106
[claws.git] / src / mh.c
index e0b7edd61a0917a1f86e90d59af7878addc454b8..93df162e6621386a8a64d72778fe0f58d2dcc1ab 100644 (file)
--- a/src/mh.c
+++ b/src/mh.c
@@ -467,6 +467,7 @@ static gint mh_copy_msgs(Folder *folder, FolderItem *dest, MsgInfoList *msglist,
        gint curnum = 0, total = 0;
        gchar *srcpath = NULL;
        gboolean full_fetch = FALSE;
+       time_t last_mtime = (time_t)0;
 
        g_return_val_if_fail(dest != NULL, -1);
        g_return_val_if_fail(msglist != NULL, -1);
@@ -493,6 +494,7 @@ static gint mh_copy_msgs(Folder *folder, FolderItem *dest, MsgInfoList *msglist,
        srcpath = folder_item_get_path(msginfo->folder);
 
        dest_need_scan = mh_scan_required(dest->folder, dest);
+       last_mtime = dest->mtime;
 
        total = g_slist_length(msglist);
        if (total > 100) {
@@ -535,6 +537,7 @@ static gint mh_copy_msgs(Folder *folder, FolderItem *dest, MsgInfoList *msglist,
 
 
                if (MSG_IS_MOVE(msginfo->flags)) {
+                       msginfo->flags.tmp_flags &= ~MSG_MOVE_DONE;
                        if (move_file(srcfile, destfile, TRUE) < 0) {
                                FILE_OP_ERROR(srcfile, "move");
                                if (copy_file(srcfile, destfile, TRUE) < 0) {
@@ -543,6 +546,9 @@ static gint mh_copy_msgs(Folder *folder, FolderItem *dest, MsgInfoList *msglist,
                                        g_free(destfile);
                                        goto err_reset_status;
                                }
+                       } else {
+                               /* say unlinking's not necessary */
+                               msginfo->flags.tmp_flags |= MSG_MOVE_DONE;
                        }
                } else if (copy_file(srcfile, destfile, TRUE) < 0) {
                        FILE_OP_ERROR(srcfile, "copy");
@@ -569,7 +575,7 @@ static gint mh_copy_msgs(Folder *folder, FolderItem *dest, MsgInfoList *msglist,
        g_free(srcpath);
        mh_write_sequences(dest, TRUE);
 
-       if (!dest_need_scan)
+       if (dest->mtime == last_mtime && !dest_need_scan)
                dest->mtime = time(NULL);
        
        if (total > 100) {
@@ -591,6 +597,7 @@ err_reset_status:
 static gint mh_remove_msg(Folder *folder, FolderItem *item, gint num)
 {
        gboolean need_scan = FALSE;
+       time_t last_mtime = (time_t)0;
        gchar *file;
 
        g_return_val_if_fail(item != NULL, -1);
@@ -599,6 +606,7 @@ static gint mh_remove_msg(Folder *folder, FolderItem *item, gint num)
        g_return_val_if_fail(file != NULL, -1);
 
        need_scan = mh_scan_required(folder, item);
+       last_mtime = item->mtime;
 
        if (g_unlink(file) < 0) {
                FILE_OP_ERROR(file, "unlink");
@@ -606,7 +614,7 @@ static gint mh_remove_msg(Folder *folder, FolderItem *item, gint num)
                return -1;
        }
 
-       if (!need_scan)
+       if (item->mtime == last_mtime && !need_scan)
                item->mtime = time(NULL);
 
        g_free(file);
@@ -618,18 +626,37 @@ static gint mh_remove_msgs(Folder *folder, FolderItem *item,
 {
        gboolean need_scan = FALSE;
        gchar *path, *file;
+       time_t last_mtime = (time_t)0;
        MsgInfoList *cur;
+       gint total = 0, curnum = 0;
 
        g_return_val_if_fail(item != NULL, -1);
 
        path = folder_item_get_path(item);
        
        need_scan = mh_scan_required(folder, item);
+       last_mtime = item->mtime;
+
+       total = g_slist_length(msglist);
+       if (total > 100) {
+               statusbar_print_all(_("Deleting messages..."));
+       }
 
        for (cur = msglist; cur; cur = cur->next) {
                MsgInfo *msginfo = (MsgInfo *)cur->data;
                if (msginfo == NULL)
                        continue;
+               if (MSG_IS_MOVE(msginfo->flags) && MSG_IS_MOVE_DONE(msginfo->flags)) {
+                       msginfo->flags.tmp_flags &= ~MSG_MOVE_DONE;
+                       continue;
+               }
+               if (total > 100) {
+                       statusbar_progress_all(curnum, total, 100);
+                       if (curnum % 100 == 0)
+                               GTK_EVENTS_FLUSH();
+                       curnum++;
+               }
+
                file = g_strconcat(path, G_DIR_SEPARATOR_S, itos(msginfo->msgnum), NULL);
                if (file == NULL)
                        continue;
@@ -642,7 +669,11 @@ static gint mh_remove_msgs(Folder *folder, FolderItem *item,
                g_free(file);
        }
 
-       if (!need_scan)
+       if (total > 100) {
+               statusbar_progress_all(0,0,0);
+               statusbar_pop_all();
+       }
+       if (item->mtime == last_mtime && !need_scan)
                item->mtime = time(NULL);
 
        g_free(path);