#include "prefs_common.h"
#include "account.h"
#include "prefs_account.h"
+#include "filtering.h"
+#include "scoring.h"
#include "prefs_folder_item.h"
#include "procheader.h"
(GNode *node, GHashTable *pptable);
static gboolean persist_prefs_free (gpointer key, gpointer val, gpointer data);
void folder_item_read_cache (FolderItem *item);
-void folder_item_write_cache (FolderItem *item);
-
+void folder_item_free_cache (FolderItem *item);
Folder *folder_new(FolderType type, const gchar *name, const gchar *path)
{
{
g_return_if_fail(item != NULL);
+ debug_print(_("Destroying folder item %s\n"), item->path);
+
+ if(item->cache)
+ folder_item_free_cache(item);
g_free(item->name);
g_free(item->path);
- msgcache_destroy(item->cache);
g_free(item);
}
}
}
+gboolean folder_tree_destroy_func(GNode *node, gpointer data) {
+ FolderItem *item = (FolderItem *) node->data;
+
+ folder_item_destroy(item);
+ return FALSE;
+}
+
void folder_tree_destroy(Folder *folder)
{
- /* TODO: destroy all FolderItem before */
+ prefs_scoring_clear();
+ prefs_filtering_clear();
+
+ g_node_traverse(folder->node, G_POST_ORDER, G_TRAVERSE_ALL, -1, folder_tree_destroy_func, NULL);
g_node_destroy(folder->node);
folder->inbox = NULL;
g_warning("failed to write folder list.\n");
}
+gboolean folder_scan_tree_func(GNode *node, gpointer data)
+{
+ GHashTable *pptable = (GHashTable *)data;
+ FolderItem *item = (FolderItem *)node->data;
+
+ folder_item_restore_persist_prefs(item, pptable);
+}
+
+void folder_scan_tree(Folder *folder)
+{
+ GHashTable *pptable;
+
+ if(!folder->scan_tree)
+ return;
+
+ pptable = folder_persist_prefs_new(folder);
+ folder_tree_destroy(folder);
+
+ folder->scan_tree(folder);
+
+ g_node_traverse(folder->node, G_POST_ORDER, G_TRAVERSE_ALL, -1, folder_scan_tree_func, pptable);
+ folder_persist_prefs_free(pptable);
+
+ prefs_matcher_read_config();
+}
+
struct TotalMsgCount
{
guint new;
Folder *folder;
GSList *folder_list, *cache_list, *elem, *new_list = NULL;
gint i;
- guint min = 0xffffffff, max = 0, cache_max = 0, maxgetcount = 0;
+ guint min = 0xffffffff, max = 0, cache_max = 0;
FolderScanInfo *folderscaninfo;
guint newcnt = 0, unreadcnt = 0, totalcnt = 0;
if( (folderscaninfo[i] & IN_FOLDER) &&
!(folderscaninfo[i] & IN_CACHE) &&
(folder->type != F_NEWS ||
- ((prefs_common.max_articles == 0) || (num > (max - prefs_common.max_articles))) &&
- (num > cache_max))
+ (((prefs_common.max_articles == 0) || (num > (max - prefs_common.max_articles))) &&
+ (num > cache_max)))
) {
new_list = g_slist_prepend(new_list, GINT_TO_POINTER(num));
debug_print(_("Remembered message %d for fetching\n"), num);
}
} else if (folder->fetch_msginfo) {
for(elem = new_list; elem != NULL; elem = g_slist_next(elem)) {
- MsgFlags flags;
MsgInfo *msginfo;
guint num;
void folder_item_free_cache(FolderItem *item)
{
g_return_if_fail(item != NULL);
- g_return_if_fail(item->cache != NULL);
+
+ if(item->cache == NULL)
+ return;
folder_item_write_cache(item);
msgcache_destroy(item->cache);
if(!item->cache)
folder_item_read_cache(item);
- if(msginfo = msgcache_get_msg(item->cache, num))
+ if((msginfo = msgcache_get_msg(item->cache, num)) != NULL)
return msginfo;
g_return_val_if_fail(folder->fetch_msginfo, NULL);
- msginfo = folder->fetch_msginfo(folder, item, num);
- return msginfo;
+ if((msginfo = folder->fetch_msginfo(folder, item, num)) != NULL) {
+ msgcache_add_msg(item->cache, msginfo);
+ return msginfo;
+ }
+
+ return NULL;
+}
+
+MsgInfo *folder_item_fetch_msginfo_by_id(FolderItem *item, const gchar *msgid)
+{
+ Folder *folder;
+ MsgInfo *msginfo;
+
+ g_return_val_if_fail(item != NULL, NULL);
+
+ folder = item->folder;
+ if(!item->cache)
+ folder_item_read_cache(item);
+
+ if((msginfo = msgcache_get_msg_by_id(item->cache, msgid)) != NULL)
+ return msginfo;
+
+ return NULL;
}
GSList *folder_item_get_msg_list(FolderItem *item)
{
Folder *folder;
gint num;
- gchar * filename;
Folder * src_folder;
g_return_val_if_fail(dest != NULL, -1);
Folder *folder;
FolderItem * item;
GSList * l;
- gchar * filename;
gint num;
g_return_val_if_fail(dest != NULL, -1);
{
Folder *folder;
gint num;
- gchar * filename;
- Folder * src_folder;
g_return_val_if_fail(dest != NULL, -1);
g_return_val_if_fail(msginfo != NULL, -1);
Folder *folder;
gint num;
GSList * l;
- gchar * filename;
g_return_val_if_fail(dest != NULL, -1);
g_return_val_if_fail(msglist != NULL, -1);
if (result == 0) {
if (folder->finished_remove)
folder->finished_remove(folder, item);
+
+ folder_item_free_cache(item);
+ item->cache = msgcache_new();
+
+ item->new = 0;
+ item->unread = 0;
+ item->total = 0;
}
return result;
{
#define PROCESSING_FOLDER ".processing"
Folder *tmpparent;
- FolderItem *tmpfolder;
gchar *tmpname;
tmpparent = folder_get_default_folder();
pp->hide_read_msgs = item->hide_read_msgs;
pp->sort_key = item->sort_key;
pp->sort_type = item->sort_type;
- g_hash_table_insert(pptable, item->path, pp);
+ g_hash_table_insert(pptable, g_strdup(item->path), pp);
}
if (node->children) {
static gboolean persist_prefs_free(gpointer key, gpointer val, gpointer data)
{
+ if (key)
+ g_free(key);
if (val)
g_free(val);
return TRUE;