From 90254cf37ace4c6cfbf77051e3e3d5e1dea75781 Mon Sep 17 00:00:00 2001 From: hiro Date: Wed, 8 Jun 2011 09:19:53 +0000 Subject: remove queue headers when moving messages from a queue folder (fixes Debian BTS #493546). git-svn-id: svn://sylpheed.sraoss.jp/sylpheed/trunk@2888 ee746299-78ed-0310-b773-934348b2243d --- libsylph/folder.c | 34 ++++++++++++++++++++++++++- libsylph/procmsg.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ libsylph/procmsg.h | 6 ++++- 3 files changed, 107 insertions(+), 2 deletions(-) (limited to 'libsylph') diff --git a/libsylph/folder.c b/libsylph/folder.c index 33d0356e..3d29740f 100644 --- a/libsylph/folder.c +++ b/libsylph/folder.c @@ -1,6 +1,6 @@ /* * LibSylph -- E-Mail client library - * Copyright (C) 1999-2010 Hiroyuki Yamamoto + * Copyright (C) 1999-2011 Hiroyuki Yamamoto * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -1319,6 +1319,10 @@ gint folder_item_add_msgs_msginfo(FolderItem *dest, GSList *msglist, remove_source, first); } +#define IS_FROM_QUEUE(m, d) \ + (m->folder && m->folder->stype == F_QUEUE && \ + MSG_IS_QUEUED(m->flags) && d->stype != F_QUEUE) + gint folder_item_move_msg(FolderItem *dest, MsgInfo *msginfo) { Folder *folder; @@ -1329,12 +1333,21 @@ gint folder_item_move_msg(FolderItem *dest, MsgInfo *msginfo) folder = dest->folder; + if (IS_FROM_QUEUE(msginfo, dest)) { + GSList msglist; + + msglist.data = msginfo; + msglist.next = NULL; + return procmsg_add_messages_from_queue(dest, &msglist, TRUE); + } + return folder->klass->move_msg(folder, dest, msginfo); } gint folder_item_move_msgs(FolderItem *dest, GSList *msglist) { Folder *folder; + MsgInfo *msginfo; g_return_val_if_fail(dest != NULL, -1); g_return_val_if_fail(msglist != NULL, -1); @@ -1342,6 +1355,10 @@ gint folder_item_move_msgs(FolderItem *dest, GSList *msglist) folder = dest->folder; + msginfo = (MsgInfo *)msglist->data; + if (IS_FROM_QUEUE(msginfo, dest)) + return procmsg_add_messages_from_queue(dest, msglist, TRUE); + return folder->klass->move_msgs(folder, dest, msglist); } @@ -1355,12 +1372,21 @@ gint folder_item_copy_msg(FolderItem *dest, MsgInfo *msginfo) folder = dest->folder; + if (IS_FROM_QUEUE(msginfo, dest)) { + GSList msglist; + + msglist.data = msginfo; + msglist.next = NULL; + return procmsg_add_messages_from_queue(dest, &msglist, FALSE); + } + return folder->klass->copy_msg(folder, dest, msginfo); } gint folder_item_copy_msgs(FolderItem *dest, GSList *msglist) { Folder *folder; + MsgInfo *msginfo; g_return_val_if_fail(dest != NULL, -1); g_return_val_if_fail(msglist != NULL, -1); @@ -1368,9 +1394,15 @@ gint folder_item_copy_msgs(FolderItem *dest, GSList *msglist) folder = dest->folder; + msginfo = (MsgInfo *)msglist->data; + if (IS_FROM_QUEUE(msginfo, dest)) + return procmsg_add_messages_from_queue(dest, msglist, FALSE); + return folder->klass->copy_msgs(folder, dest, msglist); } +#undef IS_FROM_QUEUE + gint folder_item_remove_msg(FolderItem *item, MsgInfo *msginfo) { Folder *folder; diff --git a/libsylph/procmsg.c b/libsylph/procmsg.c index 112d03c5..d06157f3 100644 --- a/libsylph/procmsg.c +++ b/libsylph/procmsg.c @@ -1299,6 +1299,75 @@ gint procmsg_copy_messages(GSList *mlist) return val == -1 ? -1 : 0; } +gint procmsg_add_messages_from_queue(FolderItem *dest, GSList *mlist, + gboolean is_move) +{ + MsgInfo *msginfo; + GSList *cur; + gchar *file; + FILE *fp; + gchar buf[BUFFSIZE]; + gchar *dest_file; + gboolean is_error = FALSE; + FolderItem *src; + MsgFlags flags; + + g_return_val_if_fail(dest != NULL, -1); + g_return_val_if_fail(mlist != NULL, -1); + + msginfo = (MsgInfo *)mlist->data; + if (!msginfo || !msginfo->folder || msginfo->folder->stype != F_QUEUE || + !MSG_IS_QUEUED(msginfo->flags) || dest->stype == F_QUEUE) + return -1; + + debug_print("procmsg_add_messages_from_queue: adding messages from queue folder\n"); + + for (cur = mlist; cur != NULL; cur = cur->next) { + msginfo = (MsgInfo *)cur->data; + flags = msginfo->flags; + if (!MSG_IS_QUEUED(flags)) + return -1; + MSG_UNSET_TMP_FLAGS(flags, MSG_QUEUED); + src = msginfo->folder; + file = procmsg_get_message_file(msginfo); + if (!file) + return -1; + if ((fp = g_fopen(file, "rb")) == NULL) { + FILE_OP_ERROR(file, "folder_item_move_msgs: fopen"); + g_free(file); + return -1; + } + while (fgets(buf, sizeof(buf), fp) != NULL) { + if (buf[0] == '\r' || buf[0] == '\n') + break; + } + if (ferror(fp)) { + fclose(fp); + g_free(file); + return -1; + } + + dest_file = get_tmp_file(); + g_print("copy queued msg: %s -> %s\n", file, dest_file); + + if (copy_file_part(fp, ftell(fp), G_MAXINT, dest_file) < 0) + is_error = TRUE; + else if (folder_item_add_msg(dest, dest_file, &flags, TRUE) < 0) { + g_unlink(dest_file); + is_error = TRUE; + } else if (is_move && folder_item_remove_msg(src, msginfo) < 0) + is_error = TRUE; + + g_free(dest_file); + fclose(fp); + g_free(file); + if (is_error) + return -1; + } + + return 0; +} + gchar *procmsg_get_message_file_path(MsgInfo *msginfo) { gchar *path, *file; diff --git a/libsylph/procmsg.h b/libsylph/procmsg.h index 894e09f6..1130c7cb 100644 --- a/libsylph/procmsg.h +++ b/libsylph/procmsg.h @@ -1,6 +1,6 @@ /* * LibSylph -- E-Mail client library - * Copyright (C) 1999-2010 Hiroyuki Yamamoto + * Copyright (C) 1999-2011 Hiroyuki Yamamoto * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -295,6 +295,10 @@ guint procmsg_get_thread_date (GNode *node); gint procmsg_move_messages (GSList *mlist); gint procmsg_copy_messages (GSList *mlist); +gint procmsg_add_messages_from_queue (FolderItem *dest, + GSList *mlist, + gboolean is_move); + gchar *procmsg_get_message_file_path (MsgInfo *msginfo); gchar *procmsg_get_message_file (MsgInfo *msginfo); GSList *procmsg_get_message_file_list (GSList *mlist); -- cgit v1.2.3