0.9.3claws64
[claws.git] / src / folder.c
index 5c3b42634f853bf01efb8d273c2f8b4e57776d72..8b5eb74c3d6258cba243ade3fd2f21cb7c25f2eb 100644 (file)
@@ -1034,11 +1034,12 @@ gint folder_item_open(FolderItem *item)
        return 0;
 }
 
-void folder_item_close(FolderItem *item)
+gint folder_item_close(FolderItem *item)
 {
        GSList *mlist, *cur;
+       Folder *folder;
        
-       g_return_if_fail(item != NULL);
+       g_return_val_if_fail(item != NULL, -1);
 
        if (item->new_msgs) {
                folder_item_update_freeze();
@@ -1058,6 +1059,14 @@ void folder_item_close(FolderItem *item)
        folder_item_write_cache(item);
        
        folder_item_update(item, F_ITEM_UPDATE_MSGCNT);
+
+       item->opened = FALSE;
+       folder = item->folder;
+
+       if (folder->klass->close == NULL)
+               return 0;
+
+       return folder->klass->close(folder, item);
 }
 
 gint folder_item_scan_full(FolderItem *item, gboolean filtering)
@@ -1653,15 +1662,18 @@ static void remove_msginfo_from_cache(FolderItem *item, MsgInfo *msginfo)
 }
 
 gint folder_item_add_msg(FolderItem *dest, const gchar *file,
-                        gboolean remove_source)
+                        MsgFlags *flags, gboolean remove_source)
 {
-       GSList file_list;
+        GSList file_list;
+        MsgFileInfo fileinfo;
 
        g_return_val_if_fail(dest != NULL, -1);
        g_return_val_if_fail(file != NULL, -1);
-
-       file_list.data = (gpointer) file;
-       file_list.next = NULL;
+        fileinfo.file = (gchar *)file;
+        fileinfo.flags = flags;
+        file_list.data = &fileinfo;
+        file_list.next = NULL;
 
        return folder_item_add_msgs(dest, &file_list, remove_source);
 }
@@ -1672,8 +1684,8 @@ gint folder_item_add_msgs(FolderItem *dest, GSList *file_list,
         Folder *folder;
         gint ret, num, lastnum = -1;
        GSList *file_cur;
-       MsgNumberList *newnum_list = NULL, *newnum_cur = NULL;
-       gchar *file = NULL;
+       GRelation *relation;
+       MsgFileInfo *fileinfo = NULL;
        gboolean folderscan = FALSE;
 
         g_return_val_if_fail(dest != NULL, -1);
@@ -1682,31 +1694,35 @@ gint folder_item_add_msgs(FolderItem *dest, GSList *file_list,
 
         folder = dest->folder;
 
+       relation = g_relation_new(2);
+       g_relation_index(relation, 0, g_direct_hash, g_direct_equal);
+
        if (folder->klass->add_msgs != NULL) {
-               ret = folder->klass->add_msgs(folder, dest, file_list, &newnum_list);
+               ret = folder->klass->add_msgs(folder, dest, file_list, relation);
                if (ret < 0) {
-                       g_slist_free(newnum_list);
+                       g_relation_destroy(relation);
                        return ret;
                }
        } else {
                for (file_cur = file_list; file_cur != NULL; file_cur = g_slist_next(file_cur)) {
-                       file = (gchar *) file_cur->data;
+                       fileinfo = (MsgFileInfo *) file_cur->data;
 
-                       ret = folder->klass->add_msg(folder, dest, file);
+                       ret = folder->klass->add_msg(folder, dest, fileinfo->file, fileinfo->flags);
                        if (ret < 0) {
-                               g_slist_free(newnum_list);
+                               g_relation_destroy(relation);
                                return ret;
                        }
-                       newnum_list = g_slist_append(newnum_list, GINT_TO_POINTER(ret));
+                       g_relation_insert(relation, fileinfo, GINT_TO_POINTER(ret));
                }
        }
 
-       for (newnum_cur = newnum_list, file_cur = file_list;
-            newnum_cur != NULL && file_cur != NULL;
-            newnum_cur = g_slist_next(newnum_cur), file_cur = g_slist_next(file_cur)) {
+       for (file_cur = file_list; file_cur != NULL; file_cur = g_slist_next(file_cur)) {
+               GTuples *tuples;
 
-               num = GPOINTER_TO_INT(newnum_cur->data);
-               file = (gchar *) file_cur->data;
+               fileinfo = (MsgFileInfo *) file_cur->data;
+               tuples = g_relation_select(relation, fileinfo, 0);
+               num = GPOINTER_TO_INT(g_tuples_index(tuples, 0, 1));
+               g_tuples_destroy(tuples);
 
                if (num >= 0) {
                        MsgInfo *newmsginfo;
@@ -1716,15 +1732,15 @@ gint folder_item_add_msgs(FolderItem *dest, GSList *file_list,
                                        folder_item_scan_full(dest, FALSE);
                                        folderscan = TRUE;
                                }
-                               num = folder_item_get_msg_num_by_file(dest, file);
+                               num = folder_item_get_msg_num_by_file(dest, fileinfo->file);
                        }
 
                        if (num > lastnum)
                                lastnum = num;
 
                        if (num >= 0 && remove_source) {
-                               if (unlink(file) < 0)
-                                       FILE_OP_ERROR(file, "unlink");
+                               if (unlink(fileinfo->file) < 0)
+                                       FILE_OP_ERROR(fileinfo->file, "unlink");
                        }
 
                        if (num == 0)
@@ -1741,7 +1757,7 @@ gint folder_item_add_msgs(FolderItem *dest, GSList *file_list,
                }
        }
 
-       g_slist_free(newnum_list);
+       g_relation_destroy(relation);
 
         return lastnum;
 }
@@ -1936,10 +1952,10 @@ gint folder_item_move_msgs_with_dest(FolderItem *dest, GSList *msglist)
 gint folder_item_move_msgs_with_dest(FolderItem *dest, GSList *msglist)
 {
        Folder *folder;
-       GSList *newmsgnums = NULL;
-       GSList *l, *l2;
+       GSList *l;
        gint num, lastnum = -1;
        gboolean folderscan = FALSE;
+       GRelation *relation;
 
        g_return_val_if_fail(dest != NULL, -1);
        g_return_val_if_fail(msglist != NULL, -1);
@@ -1948,15 +1964,25 @@ gint folder_item_move_msgs_with_dest(FolderItem *dest, GSList *msglist)
 
        g_return_val_if_fail(folder->klass->copy_msg != NULL, -1);
 
+       relation = g_relation_new(2);
+       g_relation_index(relation, 0, g_direct_hash, g_direct_equal);
+
        /* 
         * Copy messages to destination folder and 
         * store new message numbers in newmsgnums
         */
-       for (l = msglist ; l != NULL ; l = g_slist_next(l)) {
-               MsgInfo * msginfo = (MsgInfo *) l->data;
+       if (folder->klass->copy_msgs != NULL) {
+               if (folder->klass->copy_msgs(folder, dest, msglist, relation) < 0) {
+                       g_relation_destroy(relation);
+                       return -1;
+               }
+       } else {
+               for (l = msglist ; l != NULL ; l = g_slist_next(l)) {
+                       MsgInfo * msginfo = (MsgInfo *) l->data;
 
-               num = folder->klass->copy_msg(folder, dest, msginfo);
-               newmsgnums = g_slist_append(newmsgnums, GINT_TO_POINTER(num));
+                       num = folder->klass->copy_msg(folder, dest, msginfo);
+                       g_relation_insert(relation, msginfo, GINT_TO_POINTER(num));
+               }
        }
 
        /* Read cache for dest folder */
@@ -1966,12 +1992,13 @@ gint folder_item_move_msgs_with_dest(FolderItem *dest, GSList *msglist)
         * Fetch new MsgInfos for new messages in dest folder,
         * add them to the msgcache and update folder message counts
         */
-       for (l = msglist, l2 = newmsgnums; 
-            l != NULL && l2 != NULL;
-            l = g_slist_next(l), l2 = g_slist_next(l2)) {
+       for (l = msglist; l != NULL; l = g_slist_next(l)) {
                MsgInfo *msginfo = (MsgInfo *) l->data;
+                GTuples *tuples;
 
-               num = GPOINTER_TO_INT(l2->data);
+                tuples = g_relation_select(relation, msginfo, 0);
+                num = GPOINTER_TO_INT(g_tuples_index(tuples, 0, 1));
+                g_tuples_destroy(tuples);
 
                if (num >= 0) {
                        MsgInfo *newmsginfo;
@@ -2010,14 +2037,14 @@ gint folder_item_move_msgs_with_dest(FolderItem *dest, GSList *msglist)
         * copying was successfull and update folder
         * message counts
         */
-       l2 = newmsgnums;
-       for (l = msglist, l2 = newmsgnums;
-            l != NULL && l2 != NULL;
-            l = g_slist_next(l), l2 = g_slist_next(l2)) {
+       for (l = msglist; l != NULL; l = g_slist_next(l)) {
                MsgInfo *msginfo = (MsgInfo *) l->data;
                FolderItem *item = msginfo->folder;
+                GTuples *tuples;
 
-               num = GPOINTER_TO_INT(l2->data);
+                tuples = g_relation_select(relation, msginfo, 0);
+                num = GPOINTER_TO_INT(g_tuples_index(tuples, 0, 1));
+                g_tuples_destroy(tuples);
 
                if ((num >= 0) && (item->folder->klass->remove_msg != NULL)) {
                        item->folder->klass->remove_msg(item->folder,
@@ -2027,11 +2054,10 @@ gint folder_item_move_msgs_with_dest(FolderItem *dest, GSList *msglist)
                }
        }
 
-
        if (folder->klass->finished_copy)
                folder->klass->finished_copy(folder, dest);
 
-       g_slist_free(newmsgnums);
+       g_relation_destroy(relation);
        return lastnum;
 }
 
@@ -2056,14 +2082,15 @@ gint folder_item_copy_msg(FolderItem *dest, MsgInfo *msginfo)
 
 gint folder_item_copy_msg(FolderItem *dest, MsgInfo *msginfo)
 {
-       GSList *list = NULL;
-       gint ret;
+       GSList msglist;
 
-       list = g_slist_append(list, msginfo);
-       ret = folder_item_copy_msgs_with_dest(dest, list);
-       g_slist_free(list);
+       g_return_val_if_fail(dest != NULL, -1);
+       g_return_val_if_fail(msginfo != NULL, -1);
+    
+       msglist.data = msginfo;
+       msglist.next = NULL;
        
-       return ret;
+       return folder_item_copy_msgs_with_dest(dest, &msglist);
 }
 
 /*
@@ -2090,9 +2117,9 @@ gint folder_item_copy_msgs_with_dest(FolderItem *dest, GSList *msglist)
 {
        Folder *folder;
        gint num, lastnum = -1;
-       GSList *newmsgnums = NULL;
-       GSList *l, *l2;
+       GSList *l;
        gboolean folderscan = FALSE;
+       GRelation *relation;
 
        g_return_val_if_fail(dest != NULL, -1);
        g_return_val_if_fail(msglist != NULL, -1);
@@ -2101,15 +2128,25 @@ gint folder_item_copy_msgs_with_dest(FolderItem *dest, GSList *msglist)
  
        g_return_val_if_fail(folder->klass->copy_msg != NULL, -1);
 
-       /* 
+        relation = g_relation_new(2);
+        g_relation_index(relation, 0, g_direct_hash, g_direct_equal);
+
+       /*
         * Copy messages to destination folder and 
         * store new message numbers in newmsgnums
         */
-       for (l = msglist ; l != NULL ; l = g_slist_next(l)) {
-               MsgInfo * msginfo = (MsgInfo *) l->data;
+       if (folder->klass->copy_msgs != NULL) {
+               if (folder->klass->copy_msgs(folder, dest, msglist, relation) < 0) {
+                       g_relation_destroy(relation);
+                       return -1;
+               }
+       } else {
+               for (l = msglist ; l != NULL ; l = g_slist_next(l)) {
+                       MsgInfo * msginfo = (MsgInfo *) l->data;
 
-               num = folder->klass->copy_msg(folder, dest, msginfo);
-               newmsgnums = g_slist_append(newmsgnums, GINT_TO_POINTER(num));
+                       num = folder->klass->copy_msg(folder, dest, msginfo);
+                       g_relation_insert(relation, msginfo, GINT_TO_POINTER(num));
+               }
        }
 
        /* Read cache for dest folder */
@@ -2119,12 +2156,13 @@ gint folder_item_copy_msgs_with_dest(FolderItem *dest, GSList *msglist)
         * Fetch new MsgInfos for new messages in dest folder,
         * add them to the msgcache and update folder message counts
         */
-       for (l = msglist, l2 = newmsgnums;
-            l != NULL && l2 != NULL;
-            l = g_slist_next(l), l2 = g_slist_next(l2)) {
+       for (l = msglist; l != NULL; l = g_slist_next(l)) {
                MsgInfo *msginfo = (MsgInfo *) l->data;
+                GTuples *tuples;
 
-               num = GPOINTER_TO_INT(l2->data);
+                tuples = g_relation_select(relation, msginfo, 0);
+                num = GPOINTER_TO_INT(g_tuples_index(tuples, 0, 1));
+                g_tuples_destroy(tuples);
 
                if (num >= 0) {
                        MsgInfo *newmsginfo;
@@ -2162,7 +2200,8 @@ gint folder_item_copy_msgs_with_dest(FolderItem *dest, GSList *msglist)
        if (folder->klass->finished_copy)
                folder->klass->finished_copy(folder, dest);
 
-       g_slist_free(newmsgnums);
+       g_relation_destroy(relation);
+
        return lastnum;
 }