talons

Fork of Claws Mail https://www.claws-mail
Log | Files | Refs | README | LICENSE

commit 42eac1e8f7624533bfff86e14ae5ac007ebbe57d
parent 15784c7a971595c53c0088c80ecde92d126b23eb
Author: Colin Leroy <colin@colino.net>
Date:   Sun, 15 Jun 2014 14:20:15 +0200

Fix creating a numeric directory when a message of the same number exists

Diffstat:
Msrc/imap.c | 46+++++++++++++++++++++++++++++++++++++++++++---
1 file changed, 43 insertions(+), 3 deletions(-)

diff --git a/src/imap.c b/src/imap.c @@ -290,6 +290,12 @@ static FolderItem *imap_create_special_folder static gint imap_do_copy_msgs (Folder *folder, FolderItem *dest, MsgInfoList *msglist, + GHashTable *relation, + gboolean same_dest_ok); + +static gint imap_do_remove_msgs (Folder *folder, + FolderItem *dest, + MsgInfoList *msglist, GHashTable *relation); static void imap_delete_all_cached_messages (FolderItem *item); @@ -1810,7 +1816,8 @@ static GSList *flatten_mailimap_set(struct mailimap_set * set) return result; } static gint imap_do_copy_msgs(Folder *folder, FolderItem *dest, - MsgInfoList *msglist, GHashTable *relation) + MsgInfoList *msglist, GHashTable *relation, + gboolean same_dest_ok) { FolderItem *src; gchar *destdir; @@ -1834,7 +1841,7 @@ static gint imap_do_copy_msgs(Folder *folder, FolderItem *dest, msginfo = (MsgInfo *)msglist->data; src = msginfo->folder; - if (src == dest) { + if (!same_dest_ok && src == dest) { g_warning("the src folder is identical to the dest.\n"); return -1; } @@ -2018,10 +2025,32 @@ static gint imap_copy_msgs(Folder *folder, FolderItem *dest, msginfo = (MsgInfo *)msglist->data; g_return_val_if_fail(msginfo->folder != NULL, -1); - ret = imap_do_copy_msgs(folder, dest, msglist, relation); + ret = imap_do_copy_msgs(folder, dest, msglist, relation, FALSE); return ret; } +static gboolean imap_renumber_msg(MsgInfo *info) +{ + GSList msglist; + int ret; + + g_return_val_if_fail(info != NULL, -1); + + msglist.data = info; + msglist.next = NULL; + + ret = imap_do_copy_msgs(info->folder->folder, info->folder, &msglist, + NULL, TRUE); + if (ret == 0) + ret = imap_do_remove_msgs(info->folder->folder, info->folder, + &msglist, NULL); + + if (ret == 0) + ret = folder_item_scan_full(info->folder, FALSE); + + return ret == 0; +} + static gboolean imap_matcher_type_is_local(gint matchertype) { switch (matchertype) { @@ -3069,6 +3098,17 @@ static FolderItem *imap_create_folder(Folder *folder, FolderItem *parent, g_return_val_if_fail(parent != NULL, NULL); g_return_val_if_fail(name != NULL, NULL); + if (to_number(name) > 0) { + MsgInfo *info = folder_item_get_msginfo(parent, to_number(name)); + if (info != NULL) { + gboolean ok = imap_renumber_msg(info); + procmsg_msginfo_free(info); + if (!ok) { + return NULL; + } + } + } + debug_print("getting session...\n"); session = imap_session_get(folder); if (!session) {