return 0;
}
-void folder_item_close(FolderItem *item)
+gint folder_item_close(FolderItem *item)
{
GSList *mlist, *cur;
+ Folder *folder;
- g_return_if_fail(item != NULL);
+ g_return_val_if_fail(item != NULL, -1);
if (item->new_msgs) {
folder_item_update_freeze();
folder_item_write_cache(item);
folder_item_update(item, F_ITEM_UPDATE_MSGCNT);
+
+ item->opened = FALSE;
+ folder = item->folder;
+
+ if (folder->klass->close == NULL)
+ return 0;
+
+ return folder->klass->close(folder, item);
}
gint folder_item_scan_full(FolderItem *item, gboolean filtering)
}
gint folder_item_add_msg(FolderItem *dest, const gchar *file,
- gboolean remove_source)
+ MsgFlags *flags, gboolean remove_source)
{
- GSList file_list;
+ GSList file_list;
+ MsgFileInfo fileinfo;
g_return_val_if_fail(dest != NULL, -1);
g_return_val_if_fail(file != NULL, -1);
-
- file_list.data = (gpointer) file;
- file_list.next = NULL;
+
+ fileinfo.file = (gchar *)file;
+ fileinfo.flags = flags;
+ file_list.data = &fileinfo;
+ file_list.next = NULL;
return folder_item_add_msgs(dest, &file_list, remove_source);
}
Folder *folder;
gint ret, num, lastnum = -1;
GSList *file_cur;
- MsgNumberList *newnum_list = NULL, *newnum_cur = NULL;
- gchar *file = NULL;
+ GRelation *relation;
+ MsgFileInfo *fileinfo = NULL;
gboolean folderscan = FALSE;
g_return_val_if_fail(dest != NULL, -1);
folder = dest->folder;
+ relation = g_relation_new(2);
+ g_relation_index(relation, 0, g_direct_hash, g_direct_equal);
+
if (folder->klass->add_msgs != NULL) {
- ret = folder->klass->add_msgs(folder, dest, file_list, &newnum_list);
+ ret = folder->klass->add_msgs(folder, dest, file_list, relation);
if (ret < 0) {
- g_slist_free(newnum_list);
+ g_relation_destroy(relation);
return ret;
}
} else {
for (file_cur = file_list; file_cur != NULL; file_cur = g_slist_next(file_cur)) {
- file = (gchar *) file_cur->data;
+ fileinfo = (MsgFileInfo *) file_cur->data;
- ret = folder->klass->add_msg(folder, dest, file);
+ ret = folder->klass->add_msg(folder, dest, fileinfo->file, fileinfo->flags);
if (ret < 0) {
- g_slist_free(newnum_list);
+ g_relation_destroy(relation);
return ret;
}
- newnum_list = g_slist_append(newnum_list, GINT_TO_POINTER(ret));
+ g_relation_insert(relation, fileinfo, GINT_TO_POINTER(ret));
}
}
- for (newnum_cur = newnum_list, file_cur = file_list;
- newnum_cur != NULL && file_cur != NULL;
- newnum_cur = g_slist_next(newnum_cur), file_cur = g_slist_next(file_cur)) {
+ for (file_cur = file_list; file_cur != NULL; file_cur = g_slist_next(file_cur)) {
+ GTuples *tuples;
- num = GPOINTER_TO_INT(newnum_cur->data);
- file = (gchar *) file_cur->data;
+ fileinfo = (MsgFileInfo *) file_cur->data;
+ tuples = g_relation_select(relation, fileinfo, 0);
+ num = GPOINTER_TO_INT(g_tuples_index(tuples, 0, 1));
+ g_tuples_destroy(tuples);
if (num >= 0) {
MsgInfo *newmsginfo;
folder_item_scan_full(dest, FALSE);
folderscan = TRUE;
}
- num = folder_item_get_msg_num_by_file(dest, file);
+ num = folder_item_get_msg_num_by_file(dest, fileinfo->file);
}
if (num > lastnum)
lastnum = num;
if (num >= 0 && remove_source) {
- if (unlink(file) < 0)
- FILE_OP_ERROR(file, "unlink");
+ if (unlink(fileinfo->file) < 0)
+ FILE_OP_ERROR(fileinfo->file, "unlink");
}
if (num == 0)
}
}
- g_slist_free(newnum_list);
+ g_relation_destroy(relation);
return lastnum;
}
gint folder_item_move_msgs_with_dest(FolderItem *dest, GSList *msglist)
{
Folder *folder;
- GSList *newmsgnums = NULL;
- GSList *l, *l2;
+ GSList *l;
gint num, lastnum = -1;
gboolean folderscan = FALSE;
+ GRelation *relation;
g_return_val_if_fail(dest != NULL, -1);
g_return_val_if_fail(msglist != NULL, -1);
g_return_val_if_fail(folder->klass->copy_msg != NULL, -1);
+ relation = g_relation_new(2);
+ g_relation_index(relation, 0, g_direct_hash, g_direct_equal);
+
/*
* 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;
+ if (folder->klass->copy_msgs != NULL) {
+ if (folder->klass->copy_msgs(folder, dest, msglist, relation) < 0) {
+ g_relation_destroy(relation);
+ return -1;
+ }
+ } else {
+ for (l = msglist ; l != NULL ; l = g_slist_next(l)) {
+ MsgInfo * msginfo = (MsgInfo *) l->data;
- num = folder->klass->copy_msg(folder, dest, msginfo);
- newmsgnums = g_slist_append(newmsgnums, GINT_TO_POINTER(num));
+ num = folder->klass->copy_msg(folder, dest, msginfo);
+ g_relation_insert(relation, msginfo, GINT_TO_POINTER(num));
+ }
}
/* Read cache for dest folder */
* Fetch new MsgInfos for new messages in dest folder,
* add them to the msgcache and update folder message counts
*/
- for (l = msglist, l2 = newmsgnums;
- l != NULL && l2 != NULL;
- l = g_slist_next(l), l2 = g_slist_next(l2)) {
+ for (l = msglist; l != NULL; l = g_slist_next(l)) {
MsgInfo *msginfo = (MsgInfo *) l->data;
+ GTuples *tuples;
- num = GPOINTER_TO_INT(l2->data);
+ tuples = g_relation_select(relation, msginfo, 0);
+ num = GPOINTER_TO_INT(g_tuples_index(tuples, 0, 1));
+ g_tuples_destroy(tuples);
if (num >= 0) {
MsgInfo *newmsginfo;
* copying was successfull and update folder
* message counts
*/
- l2 = newmsgnums;
- for (l = msglist, l2 = newmsgnums;
- l != NULL && l2 != NULL;
- l = g_slist_next(l), l2 = g_slist_next(l2)) {
+ for (l = msglist; l != NULL; l = g_slist_next(l)) {
MsgInfo *msginfo = (MsgInfo *) l->data;
FolderItem *item = msginfo->folder;
+ GTuples *tuples;
- num = GPOINTER_TO_INT(l2->data);
+ tuples = g_relation_select(relation, msginfo, 0);
+ num = GPOINTER_TO_INT(g_tuples_index(tuples, 0, 1));
+ g_tuples_destroy(tuples);
if ((num >= 0) && (item->folder->klass->remove_msg != NULL)) {
item->folder->klass->remove_msg(item->folder,
}
}
-
if (folder->klass->finished_copy)
folder->klass->finished_copy(folder, dest);
- g_slist_free(newmsgnums);
+ g_relation_destroy(relation);
return lastnum;
}
gint folder_item_copy_msg(FolderItem *dest, MsgInfo *msginfo)
{
- GSList *list = NULL;
- gint ret;
+ GSList msglist;
- list = g_slist_append(list, msginfo);
- ret = folder_item_copy_msgs_with_dest(dest, list);
- g_slist_free(list);
+ g_return_val_if_fail(dest != NULL, -1);
+ g_return_val_if_fail(msginfo != NULL, -1);
+
+ msglist.data = msginfo;
+ msglist.next = NULL;
- return ret;
+ return folder_item_copy_msgs_with_dest(dest, &msglist);
}
/*
{
Folder *folder;
gint num, lastnum = -1;
- GSList *newmsgnums = NULL;
- GSList *l, *l2;
+ GSList *l;
gboolean folderscan = FALSE;
+ GRelation *relation;
g_return_val_if_fail(dest != NULL, -1);
g_return_val_if_fail(msglist != NULL, -1);
g_return_val_if_fail(folder->klass->copy_msg != NULL, -1);
- /*
+ relation = g_relation_new(2);
+ g_relation_index(relation, 0, g_direct_hash, g_direct_equal);
+
+ /*
* 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;
+ if (folder->klass->copy_msgs != NULL) {
+ if (folder->klass->copy_msgs(folder, dest, msglist, relation) < 0) {
+ g_relation_destroy(relation);
+ return -1;
+ }
+ } else {
+ for (l = msglist ; l != NULL ; l = g_slist_next(l)) {
+ MsgInfo * msginfo = (MsgInfo *) l->data;
- num = folder->klass->copy_msg(folder, dest, msginfo);
- newmsgnums = g_slist_append(newmsgnums, GINT_TO_POINTER(num));
+ num = folder->klass->copy_msg(folder, dest, msginfo);
+ g_relation_insert(relation, msginfo, GINT_TO_POINTER(num));
+ }
}
/* Read cache for dest folder */
* Fetch new MsgInfos for new messages in dest folder,
* add them to the msgcache and update folder message counts
*/
- for (l = msglist, l2 = newmsgnums;
- l != NULL && l2 != NULL;
- l = g_slist_next(l), l2 = g_slist_next(l2)) {
+ for (l = msglist; l != NULL; l = g_slist_next(l)) {
MsgInfo *msginfo = (MsgInfo *) l->data;
+ GTuples *tuples;
- num = GPOINTER_TO_INT(l2->data);
+ tuples = g_relation_select(relation, msginfo, 0);
+ num = GPOINTER_TO_INT(g_tuples_index(tuples, 0, 1));
+ g_tuples_destroy(tuples);
if (num >= 0) {
MsgInfo *newmsginfo;
if (folder->klass->finished_copy)
folder->klass->finished_copy(folder, dest);
- g_slist_free(newmsgnums);
+ g_relation_destroy(relation);
+
return lastnum;
}