folder_set_name(folder, name);
/* Init folder data */
- folder->type = F_UNKNOWN;
folder->account = NULL;
folder->inbox = NULL;
folder->outbox = NULL;
folder->check_msgnum_validity = NULL;
/* Create root folder item */
- item = folder_item_new(name, NULL);
+ item = folder_item_new(folder, name, NULL);
item->folder = folder;
folder->node = g_node_new(item);
folder->data = NULL;
}
#endif
-FolderItem *folder_item_new(const gchar *name, const gchar *path)
+FolderItem *folder_item_new(Folder *folder, const gchar *name, const gchar *path)
{
- FolderItem *item;
+ FolderItem *item = NULL;
+
+ switch (folder->type) {
+ case F_IMAP:
+ item = imap_folder_item_new();
+ break;
+ case F_MH:
+ case F_NEWS:
+ case F_MBOX:
+ item = g_new0(FolderItem, 1);
+ break;
+ default:
+ return NULL;
+ }
- item = g_new0(FolderItem, 1);
+ g_return_val_if_fail(item != NULL, NULL);
item->stype = F_NORMAL;
item->name = g_strdup(name);
g_return_if_fail(item != NULL);
debug_print(_("Destroying folder item %s\n"), item->path);
-
+
+ switch (item->folder->type) {
+ case F_IMAP:
+ imap_folder_item_destroy(item);
+ break;
+ default:
+ break;
+ }
+
if(item->cache)
folder_item_free_cache(item);
g_free(item->name);
void folder_tree_destroy(Folder *folder)
{
+ g_return_if_fail(folder != NULL);
+ g_return_if_fail(folder->node != NULL);
+
prefs_scoring_clear();
prefs_filtering_clear();
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);
return folder->trash;
}
-#define CREATE_FOLDER_IF_NOT_EXIST(member, dir, type) \
-{ \
- if (!folder->member) { \
- item = folder_item_new(dir, dir); \
- item->stype = type; \
- folder_item_append(rootitem, item); \
- folder->member = item; \
- } \
+#define CREATE_FOLDER_IF_NOT_EXIST(member, dir, type) \
+{ \
+ if (!folder->member) { \
+ item = folder_item_new(folder, dir, dir); \
+ item->stype = type; \
+ folder_item_append(rootitem, item); \
+ folder->member = item; \
+ } \
}
void folder_set_missing_folders(void)
gint folder_item_move_msgs_with_dest(FolderItem *dest, GSList *msglist)
{
Folder *folder;
- FolderItem * item;
- GSList * l;
+ FolderItem *item;
+ GSList *newmsgnums = NULL;
+ GSList *l, *l2;
gint num;
g_return_val_if_fail(dest != NULL, -1);
g_return_val_if_fail(folder->copy_msg != NULL, -1);
g_return_val_if_fail(folder->remove_msg != NULL, -1);
- if (!dest->cache) folder_item_read_cache(dest);
-
+ /*
+ * Copy messages to destination folder and
+ * store new message numbers in newmsgnums
+ */
item = NULL;
for(l = msglist ; l != NULL ; l = g_slist_next(l)) {
MsgInfo * msginfo = (MsgInfo *) l->data;
if (!item && msginfo->folder != NULL)
item = msginfo->folder;
- if (!item->cache) folder_item_read_cache(dest);
num = folder->copy_msg(folder, dest, msginfo);
+ newmsgnums = g_slist_append(newmsgnums, GINT_TO_POINTER(num));
+ }
+
+ /* Read cache for dest folder */
+ if (!dest->cache) folder_item_read_cache(dest);
+
+ /*
+ * Fetch new MsgInfos for new messages in dest folder,
+ * add them to the msgcache and update folder message counts
+ */
+ l2 = newmsgnums;
+ for(l = msglist; l != NULL; l = g_slist_next(l)) {
+ MsgInfo *msginfo = (MsgInfo *) l->data;
+
+ num = GPOINTER_TO_INT(l2->data);
+
if (num != -1) {
MsgInfo *newmsginfo;
MSG_NEW|MSG_UNREAD|MSG_DELETED);
msgcache_add_msg(dest->cache, newmsginfo);
- if (MSG_IS_NEW(msginfo->flags))
- msginfo->folder->new--;
if (MSG_IS_NEW(newmsginfo->flags))
dest->new++;
- if (MSG_IS_UNREAD(msginfo->flags))
- msginfo->folder->unread--;
if (MSG_IS_UNREAD(newmsginfo->flags))
dest->unread++;
- msginfo->folder->total--;
dest->total++;
procmsg_msginfo_free(newmsginfo);
}
+ }
+ l2 = g_slist_next(l2);
+ }
+
+ /*
+ * Remove source messages from their folders if
+ * copying was successfull and update folder
+ * message counts
+ */
+ l2 = newmsgnums;
+ for(l = msglist; l != NULL; l = g_slist_next(l)) {
+ MsgInfo *msginfo = (MsgInfo *) l->data;
+
+ num = GPOINTER_TO_INT(l2->data);
+
+ if(num != -1) {
item->folder->remove_msg(item->folder,
msginfo->folder,
msginfo->msgnum);
+ if(!item->cache)
+ folder_item_read_cache(item);
msgcache_remove_msg(item->cache, msginfo->msgnum);
+
+ if (MSG_IS_NEW(msginfo->flags))
+ msginfo->folder->new--;
+ if (MSG_IS_UNREAD(msginfo->flags))
+ msginfo->folder->unread--;
+ msginfo->folder->total--;
}
- }
+
+ l2 = g_slist_next(l2);
+ }
+
if (folder->finished_copy)
folder->finished_copy(folder, dest);
+ g_slist_free(newmsgnums);
return dest->last_num;
}
{
Folder *folder;
gint num;
- GSList * l;
+ GSList *newmsgnums = NULL;
+ GSList *l, *l2;
g_return_val_if_fail(dest != NULL, -1);
g_return_val_if_fail(msglist != NULL, -1);
g_return_val_if_fail(folder->copy_msg != NULL, -1);
- if (!dest->cache) folder_item_read_cache(dest);
-
+ /*
+ * Copy messages to destination folder and
+ * store new message numbers in newmsgnums
+ */
for(l = msglist ; l != NULL ; l = g_slist_next(l)) {
MsgInfo * msginfo = (MsgInfo *) l->data;
num = folder->copy_msg(folder, dest, msginfo);
+ newmsgnums = g_slist_append(newmsgnums, GINT_TO_POINTER(num));
+ }
+
+ /* Read cache for dest folder */
+ if (!dest->cache) folder_item_read_cache(dest);
+
+ /*
+ * Fetch new MsgInfos for new messages in dest folder,
+ * add them to the msgcache and update folder message counts
+ */
+ l2 = newmsgnums;
+ for(l = msglist; l != NULL; l = g_slist_next(l)) {
+ MsgInfo *msginfo = (MsgInfo *) l->data;
+
+ num = GPOINTER_TO_INT(l2->data);
+
if (num != -1) {
MsgInfo *newmsginfo;
procmsg_msginfo_free(newmsginfo);
}
}
+ l2 = g_slist_next(l2);
}
-
+
if (folder->finished_copy)
folder->finished_copy(folder, dest);
+ g_slist_free(newmsgnums);
return dest->last_num;
}
}
}
- item = folder_item_new(name, path);
+ item = folder_item_new(folder, name, path);
item->stype = stype;
item->account = account;
item->mtime = mtime;
}
else {
debug_print("*TMP* already created\n");
- processing_folder_item = folder_item_new(".processing", ".processing");
+ processing_folder_item = folder_item_new(processing_folder, ".processing", ".processing");
g_assert(processing_folder_item);
folder_item_append(processing_folder->node->data, processing_folder_item);
}