don't mix copy, fetch_msginfo and remove
operations in folder item copy and move
operations
+2002-07-25 [christoph] 0.8.0claws11
+
+ * src/folder.c
+ don't mix copy, fetch_msginfo and remove
+ operations in folder item copy and move
+ operations
+
2002-07-25 [christoph] 0.8.0claws10
* src/folderview.c
2002-07-25 [christoph] 0.8.0claws10
* src/folderview.c
MICRO_VERSION=0
INTERFACE_AGE=0
BINARY_AGE=0
MICRO_VERSION=0
INTERFACE_AGE=0
BINARY_AGE=0
VERSION=$MAJOR_VERSION.$MINOR_VERSION.$MICRO_VERSION$EXTRA_VERSION
dnl set $target
VERSION=$MAJOR_VERSION.$MINOR_VERSION.$MICRO_VERSION$EXTRA_VERSION
dnl set $target
gint folder_item_move_msgs_with_dest(FolderItem *dest, GSList *msglist)
{
Folder *folder;
gint folder_item_move_msgs_with_dest(FolderItem *dest, GSList *msglist)
{
Folder *folder;
- FolderItem * item;
- GSList * l;
+ FolderItem *item;
+ GSList *newmsgnums = NULL;
+ GSList *l, *l2;
gint num;
g_return_val_if_fail(dest != NULL, -1);
gint num;
g_return_val_if_fail(dest != NULL, -1);
g_return_val_if_fail(folder->copy_msg != NULL, -1);
g_return_val_if_fail(folder->remove_msg != NULL, -1);
g_return_val_if_fail(folder->copy_msg != NULL, -1);
g_return_val_if_fail(folder->remove_msg != NULL, -1);
- if (!dest->cache) folder_item_read_cache(dest);
-
+ /*
+ * Copy messages to destination folder and
+ * store new message numbers in newmsgnums
+ */
item = NULL;
for(l = msglist ; l != NULL ; l = g_slist_next(l)) {
MsgInfo * msginfo = (MsgInfo *) l->data;
if (!item && msginfo->folder != NULL)
item = msginfo->folder;
item = NULL;
for(l = msglist ; l != NULL ; l = g_slist_next(l)) {
MsgInfo * msginfo = (MsgInfo *) l->data;
if (!item && msginfo->folder != NULL)
item = msginfo->folder;
- if (!item->cache) folder_item_read_cache(dest);
num = folder->copy_msg(folder, dest, msginfo);
num = folder->copy_msg(folder, dest, msginfo);
+ newmsgnums = g_slist_append(newmsgnums, GINT_TO_POINTER(num));
+ }
+
+ /* Read cache for dest folder */
+ if (!dest->cache) folder_item_read_cache(dest);
+
+ /*
+ * Fetch new MsgInfos for new messages in dest folder,
+ * add them to the msgcache and update folder message counts
+ */
+ l2 = newmsgnums;
+ for(l = msglist; l != NULL; l = g_slist_next(l)) {
+ MsgInfo *msginfo = (MsgInfo *) l->data;
+
+ num = GPOINTER_TO_INT(l2->data);
+
if (num != -1) {
MsgInfo *newmsginfo;
if (num != -1) {
MsgInfo *newmsginfo;
MSG_NEW|MSG_UNREAD|MSG_DELETED);
msgcache_add_msg(dest->cache, newmsginfo);
MSG_NEW|MSG_UNREAD|MSG_DELETED);
msgcache_add_msg(dest->cache, newmsginfo);
- if (MSG_IS_NEW(msginfo->flags))
- msginfo->folder->new--;
if (MSG_IS_NEW(newmsginfo->flags))
dest->new++;
if (MSG_IS_NEW(newmsginfo->flags))
dest->new++;
- if (MSG_IS_UNREAD(msginfo->flags))
- msginfo->folder->unread--;
if (MSG_IS_UNREAD(newmsginfo->flags))
dest->unread++;
if (MSG_IS_UNREAD(newmsginfo->flags))
dest->unread++;
- msginfo->folder->total--;
dest->total++;
procmsg_msginfo_free(newmsginfo);
}
dest->total++;
procmsg_msginfo_free(newmsginfo);
}
+ }
+ l2 = g_slist_next(l2);
+ }
+
+ /*
+ * Remove source messages from their folders if
+ * copying was successfull and update folder
+ * message counts
+ */
+ l2 = newmsgnums;
+ for(l = msglist; l != NULL; l = g_slist_next(l)) {
+ MsgInfo *msginfo = (MsgInfo *) l->data;
+
+ num = GPOINTER_TO_INT(l2->data);
+
+ if(num != -1) {
item->folder->remove_msg(item->folder,
msginfo->folder,
msginfo->msgnum);
item->folder->remove_msg(item->folder,
msginfo->folder,
msginfo->msgnum);
+ if(!item->cache)
+ folder_item_read_cache(item);
msgcache_remove_msg(item->cache, msginfo->msgnum);
msgcache_remove_msg(item->cache, msginfo->msgnum);
+
+ if (MSG_IS_NEW(msginfo->flags))
+ msginfo->folder->new--;
+ if (MSG_IS_UNREAD(msginfo->flags))
+ msginfo->folder->unread--;
+ msginfo->folder->total--;
+
+ l2 = g_slist_next(l2);
+ }
+
if (folder->finished_copy)
folder->finished_copy(folder, dest);
if (folder->finished_copy)
folder->finished_copy(folder, dest);
+ g_slist_free(newmsgnums);
{
Folder *folder;
gint num;
{
Folder *folder;
gint num;
+ GSList *newmsgnums = NULL;
+ GSList *l, *l2;
g_return_val_if_fail(dest != NULL, -1);
g_return_val_if_fail(msglist != NULL, -1);
g_return_val_if_fail(dest != NULL, -1);
g_return_val_if_fail(msglist != NULL, -1);
g_return_val_if_fail(folder->copy_msg != NULL, -1);
g_return_val_if_fail(folder->copy_msg != NULL, -1);
- if (!dest->cache) folder_item_read_cache(dest);
-
+ /*
+ * Copy messages to destination folder and
+ * store new message numbers in newmsgnums
+ */
for(l = msglist ; l != NULL ; l = g_slist_next(l)) {
MsgInfo * msginfo = (MsgInfo *) l->data;
num = folder->copy_msg(folder, dest, msginfo);
for(l = msglist ; l != NULL ; l = g_slist_next(l)) {
MsgInfo * msginfo = (MsgInfo *) l->data;
num = folder->copy_msg(folder, dest, msginfo);
+ newmsgnums = g_slist_append(newmsgnums, GINT_TO_POINTER(num));
+ }
+
+ /* Read cache for dest folder */
+ if (!dest->cache) folder_item_read_cache(dest);
+
+ /*
+ * Fetch new MsgInfos for new messages in dest folder,
+ * add them to the msgcache and update folder message counts
+ */
+ l2 = newmsgnums;
+ for(l = msglist; l != NULL; l = g_slist_next(l)) {
+ MsgInfo *msginfo = (MsgInfo *) l->data;
+
+ num = GPOINTER_TO_INT(l2->data);
+
if (num != -1) {
MsgInfo *newmsginfo;
if (num != -1) {
MsgInfo *newmsginfo;
procmsg_msginfo_free(newmsginfo);
}
}
procmsg_msginfo_free(newmsginfo);
}
}
if (folder->finished_copy)
folder->finished_copy(folder, dest);
if (folder->finished_copy)
folder->finished_copy(folder, dest);
+ g_slist_free(newmsgnums);