gint folder_item_add_msg(FolderItem *dest, const gchar *file,
gboolean remove_source)
{
- Folder *folder;
- gint num;
- MsgInfo *msginfo;
+ GSList file_list;
g_return_val_if_fail(dest != NULL, -1);
g_return_val_if_fail(file != NULL, -1);
- folder = dest->folder;
+ file_list.data = (gpointer) file;
+ file_list.next = NULL;
- g_return_val_if_fail(folder->klass->add_msg != NULL, -1);
+ return folder_item_add_msgs(dest, &file_list, remove_source);
+}
- if (!dest->cache)
- folder_item_read_cache(dest);
+gint folder_item_add_msgs(FolderItem *dest, GSList *file_list,
+ gboolean remove_source)
+{
+ Folder *folder;
+ gint ret, num, lastnum = -1;
+ GSList *file_cur;
+ MsgNumberList *newnum_list = NULL, *newnum_cur = NULL;
+ gchar *file = NULL;
+ gboolean folderscan = FALSE;
- num = folder->klass->add_msg(folder, dest, file, FALSE);
+ g_return_val_if_fail(dest != NULL, -1);
+ g_return_val_if_fail(file_list != NULL, -1);
+ g_return_val_if_fail(dest->folder != NULL, -1);
- if (num > 0) {
- msginfo = folder->klass->get_msginfo(folder, dest, num);
+ folder = dest->folder;
- if (msginfo != NULL) {
- add_msginfo_to_cache(dest, msginfo, NULL);
- procmsg_msginfo_free(msginfo);
- folder_item_update(dest, F_ITEM_UPDATE_MSGCNT | F_ITEM_UPDATE_CONTENT);
+ if (folder->klass->add_msgs != NULL) {
+ ret = folder->klass->add_msgs(folder, dest, file_list, &newnum_list);
+ if (ret < 0) {
+ g_slist_free(newnum_list);
+ return ret;
}
+ } else {
+ for (file_cur = file_list; file_cur != NULL; file_cur = g_slist_next(file_cur)) {
+ file = (gchar *) file_cur->data;
- dest->last_num = num;
- } else if (num == 0) {
- folder_item_scan_full(dest, FALSE);
- num = folder_item_get_msg_num_by_file(dest, file);
+ ret = folder->klass->add_msg(folder, dest, file);
+ if (ret < 0) {
+ g_slist_free(newnum_list);
+ return ret;
+ }
+ newnum_list = g_slist_append(newnum_list, GINT_TO_POINTER(ret));
+ }
}
- if (num >= 0 && remove_source) {
- if (unlink(file) < 0)
- FILE_OP_ERROR(file, "unlink");
- }
+ 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)) {
- return num;
-}
+ num = GPOINTER_TO_INT(newnum_cur->data);
+ file = (gchar *) file_cur->data;
-gint folder_item_add_msgs(FolderItem *dest, GSList *file_list,
- gboolean remove_source, gint *first)
-{
- Folder *folder;
- gint num;
+ if (num >= 0) {
+ MsgInfo *newmsginfo;
- g_return_val_if_fail(dest != NULL, -1);
- g_return_val_if_fail(file_list != NULL, -1);
- g_return_val_if_fail(dest->folder != NULL, -1);
- g_return_val_if_fail(dest->folder->klass->add_msgs != NULL, -1);
+ if (num == 0) {
+ if (!folderscan) {
+ folder_item_scan_full(dest, FALSE);
+ folderscan = TRUE;
+ }
+ num = folder_item_get_msg_num_by_file(dest, file);
+ }
- folder = dest->folder;
+ if (num > lastnum)
+ lastnum = num;
- num = folder->klass->add_msgs(folder, dest, file_list, remove_source, first);
+ if (num >= 0 && remove_source) {
+ if (unlink(file) < 0)
+ FILE_OP_ERROR(file, "unlink");
+ }
- /*
- * TODO: Claws should get feedback about each message
- * remove source done here in claws, not in folder
- * function
- */
-
- return num;
+ if (num == 0)
+ continue;
+
+ if (!folderscan &&
+ ((newmsginfo = folder->klass->get_msginfo(folder, dest, num)) != NULL)) {
+ add_msginfo_to_cache(dest, newmsginfo, NULL);
+ procmsg_msginfo_free(newmsginfo);
+ } else if ((newmsginfo = msgcache_get_msg(dest->cache, num)) != NULL) {
+ /* TODO: set default flags */
+ procmsg_msginfo_free(newmsginfo);
+ }
+ }
+ }
+
+ g_slist_free(newnum_list);
+
+ return lastnum;
}
/*
* 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)) {
+ for (l = msglist, l2 = newmsgnums;
+ l != NULL && l2 != NULL;
+ l = g_slist_next(l), l2 = g_slist_next(l2)) {
MsgInfo *msginfo = (MsgInfo *) l->data;
num = GPOINTER_TO_INT(l2->data);
- l2 = g_slist_next(l2);
if (num >= 0) {
MsgInfo *newmsginfo;
* message counts
*/
l2 = newmsgnums;
- for (l = msglist; l != NULL; l = g_slist_next(l)) {
+ for (l = msglist, l2 = newmsgnums;
+ l != NULL && l2 != NULL;
+ l = g_slist_next(l), l2 = g_slist_next(l2)) {
MsgInfo *msginfo = (MsgInfo *) l->data;
FolderItem *item = msginfo->folder;
num = GPOINTER_TO_INT(l2->data);
- l2 = g_slist_next(l2);
if ((num >= 0) && (item->folder->klass->remove_msg != NULL)) {
item->folder->klass->remove_msg(item->folder,
* 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)) {
+ for (l = msglist, l2 = newmsgnums;
+ l != NULL && l2 != NULL;
+ l = g_slist_next(l), l2 = g_slist_next(l2)) {
MsgInfo *msginfo = (MsgInfo *) l->data;
num = GPOINTER_TO_INT(l2->data);
- l2 = g_slist_next(l2);
if (num >= 0) {
MsgInfo *newmsginfo;
FolderItem * item, gint num);
static gint mh_add_msg(Folder * folder,
FolderItem * dest,
- const gchar * file, gboolean remove_source);
-gint mh_add_msgs (Folder *folder,
- FolderItem *dest,
- GSList *file_list,
- gboolean remove_source,
- gint *first);
+ const gchar * file);
+static gint mh_add_msgs(Folder * folder,
+ FolderItem * dest, GSList * file_list, MsgNumberList **newnum_list);
static gint mh_copy_msg(Folder * folder,
FolderItem * dest, MsgInfo * msginfo);
static gint mh_remove_msg(Folder * folder, FolderItem * item, gint num);
procmsg_write_flags(&newmsginfo, fp); \
}
-gint mh_add_msg(Folder *folder, FolderItem *dest, const gchar *file,
- gboolean remove_source)
+gint mh_add_msg(Folder *folder, FolderItem *dest, const gchar *file)
{
GSList file_list;
+ gint ret;
+ MsgNumberList *newnum_list = NULL;
g_return_val_if_fail(file != NULL, -1);
file_list.data = (gpointer) file;
file_list.next = NULL;
- return mh_add_msgs(folder, dest, &file_list, remove_source, NULL);
+ ret = mh_add_msgs(folder, dest, &file_list, NULL);
+ g_slist_free(newnum_list);
+ return ret;
}
gint mh_add_msgs(Folder *folder, FolderItem *dest, GSList *file_list,
- gboolean remove_source, gint *first)
+ MsgNumberList **newnum_list)
{
gchar *destfile;
GSList *cur;
gchar *file;
- gint first_ = 0;
g_return_val_if_fail(dest != NULL, -1);
g_return_val_if_fail(file_list != NULL, -1);
destfile = mh_get_new_msg_filename(dest);
if (destfile == NULL) return -1;
- if (first_ == 0 || first_ > dest->last_num + 1)
- first_ = dest->last_num + 1;
if (link(file, destfile) < 0) {
if (copy_file(file, destfile, TRUE) < 0) {
return -1;
}
}
+ *newnum_list = g_slist_append(*newnum_list, GINT_TO_POINTER(dest->last_num + 1));
g_free(destfile);
dest->last_num++;
}
- if (first)
- *first = first_;
-
- if (remove_source) {
- for (cur = file_list; cur != NULL; cur = cur->next) {
- file = (gchar *)cur->data;
- if (unlink(file) < 0)
- FILE_OP_ERROR(file, "unlink");
- }
- }
-
return dest->last_num;
}