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());
folder_register_class(mbox_get_class());
}
-GSList *folder_get_class_list()
+GSList *folder_get_class_list(void)
{
return classlist;
}
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)
FolderItem *item = (FolderItem *)node->data;
folder_item_restore_persist_prefs(item, pptable);
+ folder_item_scan_full(item, FALSE);
return FALSE;
}
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);
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 */
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;
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))
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)
{
item->cache = NULL;
}
-void folder_clean_cache_memory()
+void folder_clean_cache_memory(void)
{
gint memusage = 0;
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);
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);
}
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);
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) {
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);
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);
}
}
-void folder_update_op_count() {
+void folder_update_op_count(void)
+{
GList *cur;
Folder *folder;
}
}
-void folder_item_update_freeze()
+void folder_item_update_freeze(void)
{
folder_item_update_freeze_cnt++;
}
}
}
-void folder_item_update_thaw()
+void folder_item_update_thaw(void)
{
if (folder_item_update_freeze_cnt > 0)
folder_item_update_freeze_cnt--;