aboutsummaryrefslogtreecommitdiff
path: root/libsylph
diff options
context:
space:
mode:
authorhiro <hiro@ee746299-78ed-0310-b773-934348b2243d>2011-06-08 09:19:53 +0000
committerhiro <hiro@ee746299-78ed-0310-b773-934348b2243d>2011-06-08 09:19:53 +0000
commit90254cf37ace4c6cfbf77051e3e3d5e1dea75781 (patch)
tree417b46d2bf85a475a5f8228128f3e42874ce0995 /libsylph
parent1795b4e93920d0ab38ecc8011c8c0756e18df8dd (diff)
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
Diffstat (limited to 'libsylph')
-rw-r--r--libsylph/folder.c34
-rw-r--r--libsylph/procmsg.c69
-rw-r--r--libsylph/procmsg.h6
3 files changed, 107 insertions, 2 deletions
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);