- Folder *folder;
- gint num;
- Folder *src_folder;
-
- g_return_val_if_fail(dest != NULL, -1);
- g_return_val_if_fail(msginfo != NULL, -1);
-
- folder = dest->folder;
-
- g_return_val_if_fail(folder->remove_msg != NULL, -1);
- g_return_val_if_fail(folder->copy_msg != NULL, -1);
-
- if (!dest->cache) folder_item_read_cache(dest);
-
- src_folder = msginfo->folder->folder;
-
- num = folder->copy_msg(folder, dest, msginfo);
-
- if (num > 0) {
- MsgInfo *newmsginfo;
-
- /* Add new msginfo to dest folder */
- if (NULL != (newmsginfo = folder->get_msginfo(folder, dest, num))) {
- newmsginfo->flags.perm_flags = msginfo->flags.perm_flags;
-
- if (dest->stype == F_OUTBOX || dest->stype == F_QUEUE ||
- dest->stype == F_DRAFT || dest->stype == F_TRASH)
- MSG_UNSET_PERM_FLAGS(newmsginfo->flags,
- MSG_NEW|MSG_UNREAD|MSG_DELETED);
- msgcache_add_msg(dest->cache, newmsginfo);
-
- if (MSG_IS_NEW(newmsginfo->flags))
- dest->new++;
- if (MSG_IS_UNREAD(newmsginfo->flags))
- dest->unread++;
- if (MSG_IS_UNREAD(newmsginfo->flags) && procmsg_msg_has_marked_parent(newmsginfo))
- dest->unreadmarked++;
- if (procmsg_msg_has_flagged_parent(newmsginfo, MSG_IGNORE_THREAD))
- procmsg_msginfo_set_flags(newmsginfo, MSG_IGNORE_THREAD, 0);
- dest->total++;
- folder_item_update(dest, F_ITEM_UPDATE_MSGCNT | F_ITEM_UPDATE_CONTENT);
-
- procmsg_msginfo_free(newmsginfo);
- }
-
- /* remove source message from it's folder */
- if (src_folder->remove_msg) {
- src_folder->remove_msg(src_folder, msginfo->folder,
- msginfo->msgnum);
- msgcache_remove_msg(msginfo->folder->cache, msginfo->msgnum);