Implement config_version in folderlist.xml.
[claws.git] / src / folder.c
index 902b990db42360689f4ef1160181ee10d2a046ca..3f35f5ec078c1a4c88a19e6ee9ae2f3040f98eda 100644 (file)
@@ -1,6 +1,6 @@
 /*
- * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2012 Hiroyuki Yamamoto and the Claws Mail team
+ * Claws Mail -- a GTK+ based, lightweight, and fast e-mail client
+ * Copyright (C) 1999-2016 Hiroyuki Yamamoto and the Claws Mail team
  *
  * 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
@@ -14,7 +14,6 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program. If not, see <http://www.gnu.org/licenses/>.
- * 
  */
 
 #ifdef HAVE_CONFIG_H
 #include "main.h"
 #include "msgcache.h"
 #include "privacy.h"
+#include "prefs_common.h"
+#include "prefs_migration.h"
 
 /* Dependecies to be removed ?! */
-#include "prefs_common.h"
 #include "prefs_account.h"
 
 /* Define possible missing constants for Windows. */
@@ -650,6 +650,11 @@ void folder_item_set_xml(Folder *folder, FolderItem *item, XMLTag *tag)
                                item->last_seen = 0;
                }
        }
+       /* options without meaning in drafts */
+       if (item->stype == F_DRAFT)
+               item->hide_read_msgs =
+                       item->hide_del_msgs =
+                               item->hide_read_threads = FALSE;
 }
 
 XMLTag *folder_item_get_xml(Folder *folder, FolderItem *item)
@@ -826,6 +831,8 @@ gint folder_read_list(void)
        GNode *node, *cur;
        XMLNode *xmlnode;
        gchar *path;
+       GList *list;
+       gint config_version = -1;
 
        path = folder_get_list_path();
        if (!is_file_exist(path)) return -1;
@@ -852,7 +859,23 @@ gint folder_read_list(void)
                cur = cur->next;
        }
 
+       for (list = xmlnode->tag->attr; list != NULL; list = list->next) {
+               XMLAttr *attr = list->data;
+
+               if (!attr || !attr->name || !attr->value) continue;
+               if (!strcmp(attr->name, "config_version")) {
+                       config_version = atoi(attr->value);
+                       debug_print("Found folderlist config_version %d\n", config_version);
+               }
+       }
+
        xml_free_tree(node);
+
+       if (prefs_update_config_version_folderlist(config_version) < 0) {
+               debug_print("Folderlist configuration file version upgrade failed\n");
+               return -2;
+       }
+
        if (folder_list || folder_unloaded_list)
                return 0;
        else
@@ -879,6 +902,8 @@ void folder_write_list(void)
                return;         
        }
        tag = xml_tag_new("folderlist");
+       xml_tag_add_attr(tag, xml_attr_new_int("config_version",
+                               CLAWS_CONFIG_VERSION));
 
        xmlnode = xml_node_new(tag, NULL);
 
@@ -2192,22 +2217,22 @@ gint folder_item_scan_full(FolderItem *item, gboolean filtering)
                cache_list_last = g_slist_last(cache_list);
                cache_max_num = ((MsgInfo *)cache_list_last->data)->msgnum;
        } else {
-               cache_cur_num = G_MAXINT;
+               cache_cur_num = G_MAXUINT;
                cache_max_num = 0;
        }
 
        if (folder_list_cur != NULL) {
                GSList *folder_list_last;
        
-               folder_cur_num = GPOINTER_TO_INT(folder_list_cur->data);
+               folder_cur_num = GPOINTER_TO_UINT(folder_list_cur->data);
                folder_list_last = g_slist_last(folder_list);
-               folder_max_num = GPOINTER_TO_INT(folder_list_last->data);
+               folder_max_num = GPOINTER_TO_UINT(folder_list_last->data);
        } else {
-               folder_cur_num = G_MAXINT;
+               folder_cur_num = G_MAXUINT;
                folder_max_num = 0;
        }
 
-       while ((cache_cur_num != G_MAXINT) || (folder_cur_num != G_MAXINT)) {
+       while ((cache_cur_num != G_MAXUINT) || (folder_cur_num != G_MAXUINT)) {
                /*
                 *  Message only exists in the folder
                 *  Remember message for fetching
@@ -2236,8 +2261,8 @@ gint folder_item_scan_full(FolderItem *item, gboolean filtering)
                        }
                        
                        if (add) {
-                               new_list = g_slist_prepend(new_list, GINT_TO_POINTER(folder_cur_num));
-                               debug_print("Remembered message %d for fetching\n", folder_cur_num);
+                               new_list = g_slist_prepend(new_list, GUINT_TO_POINTER(folder_cur_num));
+                               debug_print("Remembered message %u for fetching\n", folder_cur_num);
                        }
 
                        /* Move to next folder number */
@@ -2245,9 +2270,9 @@ gint folder_item_scan_full(FolderItem *item, gboolean filtering)
                                folder_list_cur = folder_list_cur->next;
 
                        if (folder_list_cur != NULL)
-                               folder_cur_num = GPOINTER_TO_INT(folder_list_cur->data);
+                               folder_cur_num = GPOINTER_TO_UINT(folder_list_cur->data);
                        else
-                               folder_cur_num = G_MAXINT;
+                               folder_cur_num = G_MAXUINT;
 
                        continue;
                }
@@ -2258,7 +2283,7 @@ gint folder_item_scan_full(FolderItem *item, gboolean filtering)
                 */
                if (cache_cur_num < folder_cur_num) {
                        msgcache_remove_msg(item->cache, cache_cur_num);
-                       debug_print("Removed message %d from cache.\n", cache_cur_num);
+                       debug_print("Removed message %u from cache.\n", cache_cur_num);
 
                        /* Move to next cache number */
                        if (cache_list_cur)
@@ -2267,7 +2292,7 @@ gint folder_item_scan_full(FolderItem *item, gboolean filtering)
                        if (cache_list_cur != NULL)
                                cache_cur_num = ((MsgInfo *)cache_list_cur->data)->msgnum;
                        else
-                               cache_cur_num = G_MAXINT;
+                               cache_cur_num = G_MAXUINT;
 
                        update_flags |= F_ITEM_UPDATE_MSGCNT | F_ITEM_UPDATE_CONTENT;
 
@@ -2287,7 +2312,7 @@ gint folder_item_scan_full(FolderItem *item, gboolean filtering)
                                new_list = g_slist_prepend(new_list, GINT_TO_POINTER(msginfo->msgnum));
                                procmsg_msginfo_free(&msginfo);
 
-                               debug_print("Remembering message %d to update...\n", folder_cur_num);
+                               debug_print("Remembering message %u to update...\n", folder_cur_num);
                        } else if (msginfo) {
                                exists_list = g_slist_prepend(exists_list, msginfo);
 
@@ -2308,12 +2333,12 @@ gint folder_item_scan_full(FolderItem *item, gboolean filtering)
                        if (cache_list_cur != NULL)
                                cache_cur_num = ((MsgInfo *)cache_list_cur->data)->msgnum;
                        else
-                               cache_cur_num = G_MAXINT;
+                               cache_cur_num = G_MAXUINT;
 
                        if (folder_list_cur != NULL)
-                               folder_cur_num = GPOINTER_TO_INT(folder_list_cur->data);
+                               folder_cur_num = GPOINTER_TO_UINT(folder_list_cur->data);
                        else
-                               folder_cur_num = G_MAXINT;
+                               folder_cur_num = G_MAXUINT;
 
                        continue;
                }
@@ -3340,14 +3365,18 @@ gint folder_item_move_to(FolderItem *src, FolderItem *dest, FolderItem **new_ite
                }
                tmp = folder_item_parent(tmp);
        }
-       
+
+       /* both dst and src can be root folders */
        src_identifier = folder_item_get_identifier(src);
+       if (src_identifier == NULL && src->folder && folder_item_parent(src) == NULL) {
+               src_identifier = folder_get_identifier(src->folder);
+       }
+
        dst_identifier = folder_item_get_identifier(dest);
-       
        if(dst_identifier == NULL && dest->folder && folder_item_parent(dest) == NULL) {
-               /* dest can be a root folder */
                dst_identifier = folder_get_identifier(dest->folder);
        }
+
        if (src_identifier == NULL || dst_identifier == NULL) {
                debug_print("Can't get identifiers\n");
                return F_MOVE_FAILED;
@@ -4558,13 +4587,13 @@ void folder_item_synchronise(FolderItem *item)
        if (!item)
                return;
        if (item->prefs->offlinesync && item->folder->klass->synchronise) {
-               statuswindow_print_all(_("Synchronising %s for offline use...\n"), item->path ? item->path : "(null)");
+               statusbar_print_all(_("Synchronising %s for offline use...\n"), item->path ? item->path : "(null)");
                item->folder->klass->synchronise(item, 
                        item->prefs->offlinesync_days);
                if (item->prefs->offlinesync_days > 0 &&
                    item->prefs->remove_old_bodies)
                        folder_item_clean_local_files(item, item->prefs->offlinesync_days);
-               statuswindow_pop_all();
+               statusbar_pop_all();
        }
 }
 
@@ -4798,6 +4827,8 @@ gint folder_item_search_msgs_local        (Folder                 *folder,
                }
                processed_count++;
 
+               procmsg_msginfo_free(&msg);
+
                if (progress_cb != NULL
                    && !progress_cb(progress_data, FALSE, processed_count,
                            matched_count, msgcount))