0.9.0claws55
[claws.git] / src / folder.c
index 11ff790dea24a50322fb89c3dfea5ba0e34ceb49..09693e17840049de1bae041d9e27092cc1b9c17e 100644 (file)
@@ -73,10 +73,11 @@ static void folder_get_persist_prefs_recursive
 static gboolean persist_prefs_free     (gpointer key, gpointer val, gpointer data);
 void folder_item_read_cache            (FolderItem *item);
 void folder_item_free_cache            (FolderItem *item);
+gint folder_item_scan_full             (FolderItem *item, gboolean filtering);
 
 static GSList *classlist;
 
-void folder_system_init()
+void folder_system_init(void)
 {
        folder_register_class(mh_get_class());
        folder_register_class(imap_get_class());
@@ -84,7 +85,7 @@ void folder_system_init()
        folder_register_class(mbox_get_class());
 }
 
-GSList *folder_get_class_list()
+GSList *folder_get_class_list(void)
 {
        return classlist;
 }
@@ -302,8 +303,8 @@ void folder_tree_destroy(Folder *folder)
        g_return_if_fail(folder != NULL);
        g_return_if_fail(folder->node != NULL);
        
-       prefs_scoring_clear();
-       prefs_filtering_clear();
+       prefs_scoring_clear_folder(folder);
+       prefs_filtering_clear_folder(folder);
 
        g_node_traverse(folder->node, G_POST_ORDER, G_TRAVERSE_ALL, -1, folder_tree_destroy_func, NULL);
        if (folder->node)
@@ -411,6 +412,7 @@ gboolean folder_scan_tree_func(GNode *node, gpointer data)
        FolderItem *item = (FolderItem *)node->data;
        
        folder_item_restore_persist_prefs(item, pptable);
+       folder_item_scan_full(item, FALSE);
 
        return FALSE;
 }
@@ -418,15 +420,24 @@ gboolean folder_scan_tree_func(GNode *node, gpointer data)
 void folder_scan_tree(Folder *folder)
 {
        GHashTable *pptable;
+       FolderUpdateData hookdata;
        
        if (!folder->klass->scan_tree)
                return;
        
        pptable = folder_persist_prefs_new(folder);
-       folder_tree_destroy(folder);
 
+       /*
+        * should be changed and tree update should be done without 
+        * destroying the tree first
+        */
+       folder_tree_destroy(folder);
        folder->klass->scan_tree(folder);
 
+       hookdata.folder = folder;
+       hookdata.update_flags = FOLDER_TREE_CHANGED;
+       hooks_invoke(FOLDER_UPDATE_HOOKLIST, &hookdata);
+
        g_node_traverse(folder->node, G_POST_ORDER, G_TRAVERSE_ALL, -1, folder_scan_tree_func, pptable);
        folder_persist_prefs_free(pptable);
 
@@ -966,7 +977,7 @@ static gint folder_sort_folder_list(gconstpointer a, gconstpointer b)
 gint folder_item_open(FolderItem *item)
 {
        if(((FOLDER_TYPE(item->folder) == F_IMAP) && !item->no_select) || (FOLDER_TYPE(item->folder) == F_NEWS)) {
-               folder_item_scan(item);
+               folder_item_scan_full(item, TRUE);
        }
 
        /* Processing */
@@ -1011,7 +1022,7 @@ void folder_item_close(FolderItem *item)
        folder_item_update(item, F_ITEM_UPDATE_MSGCNT);
 }
 
-gint folder_item_scan(FolderItem *item)
+gint folder_item_scan_full(FolderItem *item, gboolean filtering)
 {
        Folder *folder;
        GSList *folder_list = NULL, *cache_list = NULL;
@@ -1213,7 +1224,8 @@ gint folder_item_scan(FolderItem *item)
                        MsgInfo *msginfo = (MsgInfo *) elem->data;
 
                        msgcache_add_msg(item->cache, msginfo);
-                       if ((item->stype == F_INBOX) &&
+                       if ((filtering == TRUE) &&
+                           (item->stype == F_INBOX) &&
                            (item->folder->account != NULL) && 
                            (item->folder->account->filter_on_recv) &&
                            procmsg_msginfo_filter(msginfo))
@@ -1266,6 +1278,26 @@ gint folder_item_scan(FolderItem *item)
        return 0;
 }
 
+gint folder_item_scan(FolderItem *item)
+{
+       return folder_item_scan_full(item, TRUE);
+}
+
+static gboolean folder_scan_all_items_func(GNode *node, gpointer data)
+{
+       FolderItem *item = node->data;
+
+       folder_item_scan(item);
+
+       return FALSE;
+}
+
+void folder_scan_all_items(Folder * folder)
+{
+       g_node_traverse(folder->node, G_PRE_ORDER,
+                       G_TRAVERSE_ALL, -1, folder_scan_all_items_func, NULL);
+}
+
 static void folder_item_scan_foreach_func(gpointer key, gpointer val,
                                          gpointer data)
 {
@@ -1329,7 +1361,7 @@ void folder_item_free_cache(FolderItem *item)
        item->cache = NULL;
 }
 
-void folder_clean_cache_memory()
+void folder_clean_cache_memory(void)
 {
        gint memusage = 0;
 
@@ -1366,7 +1398,7 @@ void folder_item_read_cache(FolderItem *item)
        item->cache = msgcache_read_cache(item, cache_file);
        if (!item->cache) {
                item->cache = msgcache_new();
-               folder_item_scan(item);
+               folder_item_scan_full(item, TRUE);
        }
        msgcache_read_mark(item->cache, mark_file);
        g_free(cache_file);
@@ -1605,11 +1637,12 @@ gint folder_item_add_msg(FolderItem *dest, const gchar *file,
                if (msginfo != NULL) {
                        add_msginfo_to_cache(dest, msginfo, NULL);
                        procmsg_msginfo_free(msginfo);
+                       folder_item_update(dest, F_ITEM_UPDATE_MSGCNT | F_ITEM_UPDATE_CONTENT);
                }
 
                 dest->last_num = num;
         } else if (num == 0) {
-               folder_item_scan(dest);
+               folder_item_scan_full(dest, FALSE);
                num = folder_item_get_msg_num_by_file(dest, file);
        }
 
@@ -1857,7 +1890,7 @@ gint folder_item_move_msgs_with_dest(FolderItem *dest, GSList *msglist)
                                gchar *file;
 
                                if (!folderscan) {
-                                       folder_item_scan(dest);
+                                       folder_item_scan_full(dest, FALSE);
                                        folderscan = TRUE;
                                }
                                file = folder_item_fetch_msg(msginfo->folder, msginfo->msgnum);
@@ -1873,7 +1906,6 @@ gint folder_item_move_msgs_with_dest(FolderItem *dest, GSList *msglist)
 
                        if (!folderscan && 
                            ((newmsginfo = folder->klass->get_msginfo(folder, dest, num)) != NULL)) {
-                               newmsginfo = folder->klass->get_msginfo(folder, dest, num);
                                add_msginfo_to_cache(dest, newmsginfo, msginfo);
                                procmsg_msginfo_free(newmsginfo);
                        } else if ((newmsginfo = msgcache_get_msg(dest->cache, num)) != NULL) {
@@ -2009,7 +2041,7 @@ gint folder_item_copy_msgs_with_dest(FolderItem *dest, GSList *msglist)
                                gchar *file;
 
                                if (!folderscan) {
-                                       folder_item_scan(dest);
+                                       folder_item_scan_full(dest, FALSE);
                                        folderscan = TRUE;
                                }
                                file = folder_item_fetch_msg(msginfo->folder, msginfo->msgnum);
@@ -2049,8 +2081,9 @@ gint folder_item_remove_msg(FolderItem *item, gint num)
        MsgInfo *msginfo;
 
        g_return_val_if_fail(item != NULL, -1);
-
        folder = item->folder;
+       g_return_val_if_fail(folder->klass->remove_msg != NULL, -1);
+
        if (!item->cache) folder_item_read_cache(item);
 
        ret = folder->klass->remove_msg(folder, item, num);
@@ -2550,7 +2583,8 @@ static void folder_update_op_count_rec(GNode *node)
        }
 }
 
-void folder_update_op_count() {
+void folder_update_op_count(void) 
+{
        GList *cur;
        Folder *folder;
 
@@ -2813,7 +2847,7 @@ void folder_item_update_recursive(FolderItem *item, FolderItemUpdateFlags update
        }
 }
 
-void folder_item_update_freeze()
+void folder_item_update_freeze(void)
 {
        folder_item_update_freeze_cnt++;
 }
@@ -2830,7 +2864,7 @@ static void folder_item_update_func(FolderItem *item, gpointer data)
        }
 }
 
-void folder_item_update_thaw()
+void folder_item_update_thaw(void)
 {
        if (folder_item_update_freeze_cnt > 0)
                folder_item_update_freeze_cnt--;