/*
* Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2006 Hiroyuki Yamamoto and the Sylpheed-Claws team
+ * Copyright (C) 1999-2007 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
folder_write_list();
}
+gboolean folder_restore_prefs_func(GNode *node, gpointer data)
+{
+ GHashTable *pptable = (GHashTable *)data;
+ FolderItem *item = (FolderItem *)node->data;
+
+ folder_item_restore_persist_prefs(item, pptable);
+
+ return FALSE;
+}
+
+void folder_fast_scan_tree(Folder *folder)
+{
+ GHashTable *pptable;
+ FolderUpdateData hookdata;
+ Folder *old_folder = folder;
+
+ if (!folder->klass->scan_tree)
+ return;
+
+ pptable = folder_persist_prefs_new(folder);
+
+ if (folder->klass->scan_tree(folder) < 0) {
+ return;
+ }
+
+ hookdata.folder = folder;
+ hookdata.update_flags = FOLDER_TREE_CHANGED;
+ hookdata.item = NULL;
+ hooks_invoke(FOLDER_UPDATE_HOOKLIST, &hookdata);
+
+ g_node_traverse(folder->node, G_POST_ORDER, G_TRAVERSE_ALL, -1, folder_restore_prefs_func, pptable);
+ folder_persist_prefs_free(pptable);
+
+ prefs_matcher_read_config();
+
+ folder_write_list();
+}
+
FolderItem *folder_create_folder(FolderItem *parent, const gchar *name)
{
FolderItem *new_item;
{
Folder *folder;
gpointer d[2];
-
- folder = folder_get_default_folder();
+ GList *list = folder_get_list();
+
+ folder = list ? list->data:NULL;
+
g_return_val_if_fail(folder != NULL, NULL);
d[0] = (gpointer)path;
d[1] = NULL;
- g_node_traverse(folder->node, G_PRE_ORDER, G_TRAVERSE_ALL, -1,
+ while (d[1] == NULL && list) {
+ folder = FOLDER(list->data);
+ g_node_traverse(folder->node, G_PRE_ORDER, G_TRAVERSE_ALL, -1,
folder_item_find_func, d);
+ list = list->next;
+ }
return d[1];
}
return lastnum;
}
-
-FolderItem *folder_item_move_recursive(FolderItem *src, FolderItem *dest)
+
+static FolderItem *folder_item_move_recursive(FolderItem *src, FolderItem *dest, gboolean copy)
{
GSList *mlist;
FolderItem *new_item;
gchar *old_id, *new_id;
/* move messages */
- debug_print("Moving %s to %s\n", src->path, dest->path);
+ debug_print("%s %s to %s\n", copy?"Copying":"Moving", src->path, dest->path);
new_item = folder_create_folder(dest, src->name);
if (new_item == NULL) {
printf("Can't create folder\n");
new_item->folder = dest->folder;
/* move messages */
- log_message(_("Moving %s to %s...\n"),
+ log_message(copy ?_("Copying %s to %s...\n"):_("Moving %s to %s...\n"),
src->name, new_item->path);
mlist = folder_item_get_msg_list(src);
if (mlist != NULL) {
- folder_item_move_msgs(new_item, mlist);
+ if (copy)
+ folder_item_copy_msgs(new_item, mlist);
+ else
+ folder_item_move_msgs(new_item, mlist);
procmsg_msg_list_free(mlist);
}
/*copy prefs*/
folder_item_prefs_copy_prefs(src, new_item);
+
+ /* copy internal data */
+ if (src->folder->klass == new_item->folder->klass &&
+ src->folder->klass->copy_private_data != NULL)
+ src->folder->klass->copy_private_data(src->folder,
+ src, new_item);
new_item->collapsed = src->collapsed;
new_item->thread_collapsed = src->thread_collapsed;
new_item->threaded = src->threaded;
if (srcnode && srcnode->data) {
next_item = (FolderItem*) srcnode->data;
srcnode = srcnode->next;
- if (folder_item_move_recursive(next_item, new_item) == NULL) {
+ if (folder_item_move_recursive(next_item, new_item, copy) == NULL) {
return NULL;
}
}
}
old_id = folder_item_get_identifier(src);
new_id = folder_item_get_identifier(new_item);
- debug_print("updating rules : %s => %s\n", old_id, new_id);
/* if src supports removing, otherwise only copy folder */
- if (src->folder->klass->remove_folder != NULL)
+ if (src->folder->klass->remove_folder != NULL && !copy)
src->folder->klass->remove_folder(src->folder, src);
folder_write_list();
- if (old_id != NULL && new_id != NULL) {
- prefs_filtering_rename_path(old_id, new_id);
- account_rename_path(old_id, new_id);
+ if (!copy) {
+ debug_print("updating rules : %s => %s\n", old_id, new_id);
+ if (old_id != NULL && new_id != NULL) {
+ prefs_filtering_rename_path(old_id, new_id);
+ account_rename_path(old_id, new_id);
+ }
}
g_free(old_id);
g_free(new_id);
return new_item;
}
-gint folder_item_move_to(FolderItem *src, FolderItem *dest, FolderItem **new_item)
+gint folder_item_move_to(FolderItem *src, FolderItem *dest, FolderItem **new_item, gboolean copy)
{
FolderItem *tmp = folder_item_parent(dest);
gchar * src_identifier, * dst_identifier;
gchar * phys_srcpath, * phys_dstpath, *tmppath;
-
+
while (tmp) {
if (tmp == src) {
return F_MOVE_FAILED_DEST_IS_CHILD;
return F_MOVE_FAILED;
}
- if (src->folder != dest->folder) {
+ if (src->folder != dest->folder && !copy) {
return F_MOVE_FAILED_DEST_OUTSIDE_MAILBOX;
}
return F_MOVE_FAILED_DEST_IS_PARENT;
}
debug_print("moving \"%s\" to \"%s\"\n", phys_srcpath, phys_dstpath);
- if ((tmp = folder_item_move_recursive(src, dest)) == NULL) {
+ if ((tmp = folder_item_move_recursive(src, dest, copy)) == NULL) {
return F_MOVE_FAILED;
}
item = msginfo->folder;
tuples = g_relation_select(relation, msginfo, 0);
- num = GPOINTER_TO_INT(g_tuples_index(tuples, 0, 1));
- g_tuples_destroy(tuples);
+ if (tuples) {
+ if (tuples->len)
+ num = GPOINTER_TO_INT(g_tuples_index(tuples, 0, 1));
+ else
+ num = 0;
+ g_tuples_destroy(tuples);
+ } else {
+ num = -1;
+ }
if (g_slist_find(not_moved, msginfo))
continue;
GTuples *tuples;
tuples = g_relation_select(relation, msginfo, 0);
- num = GPOINTER_TO_INT(g_tuples_index(tuples, 0, 1));
- g_tuples_destroy(tuples);
-
+ if (tuples->len > 0) {
+ num = GPOINTER_TO_INT(g_tuples_index(tuples, 0, 1));
+ g_tuples_destroy(tuples);
+ } else {
+ num = 0;
+ if (tuples)
+ g_tuples_destroy(tuples);
+ }
statusbar_progress_all(curmsg++,total, 100);
if (curmsg % 100 == 0)
GTK_EVENTS_FLUSH();