2005-05-05 [thorsten] 1.9.6cvs55
[claws.git] / src / folder.c
index d45cff39a16ee1b1b8566bafe5f4a9adb9666007..c67f32fb62103349ced181258226d2458898807d 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2003 Hiroyuki Yamamoto
+ * Copyright (C) 1999-2005 Hiroyuki Yamamoto
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -24,6 +24,7 @@
 #include "defs.h"
 
 #include <glib.h>
+#include <glib/gi18n.h>
 #include <stdio.h>
 #include <string.h>
 #include <sys/types.h>
@@ -31,7 +32,6 @@
 #include <unistd.h>
 #include <stdlib.h>
 
-#include "intl.h"
 #include "folder.h"
 #include "session.h"
 #include "imap.h"
@@ -1062,9 +1062,14 @@ FolderItem *folder_find_child_item_by_name(FolderItem *item, const gchar *name)
        FolderItem *child;
 
        for (node = item->node->children; node != NULL; node = node->next) {
+               gchar *base;
                child = FOLDER_ITEM(node->data);
-               if (strcmp2(g_basename(child->path), name) == 0)
+               base = g_path_get_basename(child->path);
+               if (strcmp2(base, name) == 0) {
+                       g_free(base);
                        return child;
+               }
+               g_free(base);
        }
 
        return NULL;
@@ -1431,7 +1436,8 @@ static gint folder_sort_folder_list(gconstpointer a, gconstpointer b)
 gint folder_item_open(FolderItem *item)
 {
        gchar *buf;
-       if((item->folder->klass->scan_required != NULL) && (item->folder->klass->scan_required(item->folder, item))) {
+       if((item->folder->klass->scan_required != NULL) &&
+          (item->folder->klass->scan_required(item->folder, item))) {
                folder_item_scan_full(item, TRUE);
        }
        folder_item_syncronize_flags(item);
@@ -1526,6 +1532,50 @@ static MsgInfo *get_msginfo(FolderItem *item, guint num)
        return msginfo;
 }
 
+static gint syncronize_flags(FolderItem *item, MsgInfoList *msglist)
+{
+       GRelation *relation;
+       gint ret = 0;
+       GSList *cur;
+
+       if(msglist == NULL)
+               return 0;
+       if(item->folder->klass->get_flags == NULL)
+               return 0;
+
+       relation = g_relation_new(2);
+       g_relation_index(relation, 0, g_direct_hash, g_direct_equal);
+       if ((ret = item->folder->klass->get_flags(
+           item->folder, item, msglist, relation)) == 0) {
+               GTuples *tuples;
+               MsgInfo *msginfo;
+               MsgPermFlags permflags;
+               gboolean skip;
+
+               for (cur = msglist; cur != NULL; cur = g_slist_next(cur)) {
+                       msginfo = (MsgInfo *) cur->data;
+               
+                       tuples = g_relation_select(relation, msginfo, 0);
+                       skip = tuples->len < 1;
+                       if (!skip)
+                               permflags = GPOINTER_TO_INT(g_tuples_index(tuples, 0, 1));
+                       g_tuples_destroy(tuples);
+                       if (skip)
+                               continue;
+                       
+                       if (msginfo->flags.perm_flags != permflags) {
+                               procmsg_msginfo_set_flags(msginfo,
+                                       permflags & ~msginfo->flags.perm_flags, 0);
+                               procmsg_msginfo_unset_flags(msginfo,
+                                       ~permflags & msginfo->flags.perm_flags, 0);
+                       }
+               }
+       }
+       g_relation_destroy(relation);   
+
+       return ret;
+}
+
 gint folder_item_scan_full(FolderItem *item, gboolean filtering)
 {
        Folder *folder;
@@ -1704,6 +1754,8 @@ gint folder_item_scan_full(FolderItem *item, gboolean filtering)
                g_slist_free(new_list);
        }
 
+       syncronize_flags(item, exists_list);
+
        folder_item_update_freeze();
        if (newmsg_list != NULL) {
                GSList *elem;
@@ -1767,60 +1819,6 @@ gint folder_item_scan_full(FolderItem *item, gboolean filtering)
        return 0;
 }
 
-gint folder_item_syncronize_flags(FolderItem *item)
-{
-       MsgInfoList *msglist = NULL;
-       GSList *cur;
-       GRelation *relation;
-       gint ret = 0;
-       
-       g_return_val_if_fail(item != NULL, -1);
-       g_return_val_if_fail(item->folder != NULL, -1);
-       g_return_val_if_fail(item->folder->klass != NULL, -1);
-       if(item->folder->klass->get_flags == NULL)
-               return 0;
-       
-       if (item->cache == NULL)
-               folder_item_read_cache(item);
-       
-       msglist = msgcache_get_msg_list(item->cache);
-       
-       relation = g_relation_new(2);
-       g_relation_index(relation, 0, g_direct_hash, g_direct_equal);
-       if ((ret = item->folder->klass->get_flags(
-           item->folder, item, msglist, relation)) == 0) {
-               GTuples *tuples;
-               MsgInfo *msginfo;
-               MsgPermFlags permflags;
-               gboolean skip;
-
-               for (cur = msglist; cur != NULL; cur = g_slist_next(cur)) {
-                       msginfo = (MsgInfo *) cur->data;
-               
-                       tuples = g_relation_select(relation, msginfo, 0);
-                       skip = tuples->len < 1;
-                       if (!skip)
-                               permflags = GPOINTER_TO_INT(g_tuples_index(tuples, 0, 1));
-                       g_tuples_destroy(tuples);
-                       if (skip)
-                               continue;
-                       
-                       if (msginfo->flags.perm_flags != permflags) {
-                               procmsg_msginfo_set_flags(msginfo,
-                                       permflags & ~msginfo->flags.perm_flags, 0);
-                               procmsg_msginfo_unset_flags(msginfo,
-                                       ~permflags & msginfo->flags.perm_flags, 0);
-                       }
-               }
-       }
-       g_relation_destroy(relation);
-       
-       for (cur = msglist; cur != NULL; cur = g_slist_next(cur))
-               procmsg_msginfo_free((MsgInfo *) cur->data);
-       
-       return ret;
-}
-
 gint folder_item_scan(FolderItem *item)
 {
        return folder_item_scan_full(item, TRUE);
@@ -1862,6 +1860,29 @@ void folder_count_total_cache_memusage(FolderItem *item, gpointer data)
        *memusage += msgcache_get_memory_usage(item->cache);
 }
 
+gint folder_item_syncronize_flags(FolderItem *item)
+{
+       MsgInfoList *msglist = NULL;
+       GSList *cur;
+       gint ret = 0;
+       
+       g_return_val_if_fail(item != NULL, -1);
+       g_return_val_if_fail(item->folder != NULL, -1);
+       g_return_val_if_fail(item->folder->klass != NULL, -1);
+       
+       if (item->cache == NULL)
+               folder_item_read_cache(item);
+       
+       msglist = msgcache_get_msg_list(item->cache);
+       
+       ret = syncronize_flags(item, msglist);
+
+       for (cur = msglist; cur != NULL; cur = g_slist_next(cur))
+               procmsg_msginfo_free((MsgInfo *) cur->data);
+       
+       return ret;
+}
+
 gint folder_cache_time_compare_func(gconstpointer a, gconstpointer b)
 {
        FolderItem *fa = (FolderItem *)a;
@@ -1921,7 +1942,7 @@ void folder_clean_cache_memory(void)
                while((listitem != NULL) && (memusage > (prefs_common.cache_max_mem_usage * 1024))) {
                        FolderItem *item = (FolderItem *)(listitem->data);
 
-                       debug_print("Freeing cache memory for %s\n", item->path);
+                       debug_print("Freeing cache memory for %s\n", item->path ? item->path : item->name);
                        memusage -= msgcache_get_memory_usage(item->cache);
                        folder_item_free_cache(item);
                        listitem = listitem->next;
@@ -2509,7 +2530,10 @@ gint folder_item_move_to(FolderItem *src, FolderItem *dest, FolderItem **new_ite
        }
 
        phys_srcpath = folder_item_get_path(src);
-       phys_dstpath = g_strconcat(folder_item_get_path(dest),G_DIR_SEPARATOR_S,g_basename(phys_srcpath),NULL);
+       phys_dstpath = g_strconcat(folder_item_get_path(dest),
+                      G_DIR_SEPARATOR_S,
+                      g_path_get_basename(phys_srcpath),
+                      NULL);
 
        if (folder_item_parent(src) == dest || src == dest) {
                g_free(src_identifier);
@@ -2790,14 +2814,22 @@ gint folder_item_remove_all_msg(FolderItem *item)
 
        folder = item->folder;
 
-       g_return_val_if_fail(folder->klass->remove_all_msg != NULL, -1);
+       if (folder->klass->remove_all_msg != NULL) {
+               result = folder->klass->remove_all_msg(folder, item);
 
-       result = folder->klass->remove_all_msg(folder, item);
+               if (result == 0) {
+                       folder_item_free_cache(item);
+                       item->cache = msgcache_new();
+               }
+       } else {
+               MsgInfoList *msglist;
 
-       if (result == 0) {
-               folder_item_free_cache(item);
-               item->cache = msgcache_new();
+               msglist = folder_item_get_msg_list(item);
+               result = folder_item_remove_msgs(item, msglist);
+               procmsg_msg_list_free(msglist);
+       }
 
+       if (result == 0) {
                item->new_msgs = 0;
                item->unread_msgs = 0;
                item->unreadmarked_msgs = 0;