aboutsummaryrefslogtreecommitdiff
path: root/libsylph/folder.c
diff options
context:
space:
mode:
Diffstat (limited to 'libsylph/folder.c')
-rw-r--r--libsylph/folder.c34
1 files changed, 33 insertions, 1 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;