return destfile;
}
+#define SET_DEST_MSG_FLAGS(fp, dest, msginfo) \
+{ \
+ MsgInfo newmsginfo; \
+ \
+ newmsginfo.msgnum = dest->last_num; \
+ newmsginfo.flags = msginfo->flags; \
+ if (dest->stype == F_OUTBOX || \
+ dest->stype == F_QUEUE || \
+ dest->stype == F_DRAFT || \
+ dest->stype == F_TRASH) \
+ MSG_UNSET_PERM_FLAGS(newmsginfo.flags, \
+ MSG_NEW|MSG_UNREAD|MSG_DELETED); \
+ \
+ procmsg_write_flags(&newmsginfo, fp); \
+}
+
gint mh_add_msg(Folder *folder, FolderItem *dest, const gchar *file,
gboolean remove_source)
{
return dest->last_num;
}
-gint mh_move_msg(Folder *folder, FolderItem *dest, MsgInfo *msginfo)
+static gint mh_do_move(Folder *folder, FolderItem *dest, MsgInfo *msginfo)
{
gchar *destdir;
gchar *srcfile;
prefs = dest->prefs;
destdir = folder_item_get_path(dest);
- if ((fp = procmsg_open_mark_file(destdir, TRUE)) == NULL)
- g_warning(_("Can't open mark file.\n"));
debug_print(_("Moving message %s%c%d to %s ...\n"),
msginfo->folder->path, G_DIR_SEPARATOR,
msginfo->msgnum, dest->path);
- srcfile = procmsg_get_message_file_path(msginfo);
+ srcfile = procmsg_get_message_file(msginfo);
destfile = mh_get_newmsg_filename(dest);
if(!destfile) return -1;
- g_free(destdir);
if (move_file(srcfile, destfile) < 0) {
g_free(srcfile);
g_free(destfile);
- if (fp) fclose(fp);
+ g_free(destdir);
return -1;
}
g_free(destfile);
dest->last_num++;
- if (fp) {
- MsgInfo newmsginfo;
-
- newmsginfo.msgnum = dest->last_num;
- newmsginfo.flags = msginfo->flags;
- if (dest->stype == F_OUTBOX ||
- dest->stype == F_QUEUE ||
- dest->stype == F_DRAFT ||
- dest->stype == F_TRASH)
- MSG_UNSET_PERM_FLAGS(newmsginfo.flags,
- MSG_NEW|MSG_UNREAD|MSG_DELETED);
-
- procmsg_write_flags(&newmsginfo, fp);
-
+ if ((fp = procmsg_open_mark_file(destdir, TRUE)) == NULL)
+ g_warning(_("Can't open mark file.\n"));
+ else {
+ SET_DEST_MSG_FLAGS(fp, dest, msginfo);
if (filemode) {
#if HAVE_FCHMOD
fchmod(fileno(fp), filemode);
fclose(fp);
}
+ g_free(destdir);
return dest->last_num;
}
-gint mh_move_msgs_with_dest(Folder *folder, FolderItem *dest, GSList *msglist)
+gint mh_move_msg(Folder *folder, FolderItem *dest, MsgInfo *msginfo)
+{
+ gchar *srcfile;
+ gint ret = 0;
+
+ g_return_val_if_fail(folder != NULL, -1);
+ g_return_val_if_fail(dest != NULL, -1);
+ g_return_val_if_fail(msginfo != NULL, -1);
+ g_return_val_if_fail(msginfo->folder != NULL, -1);
+
+ if (folder == msginfo->folder->folder)
+ return mh_do_move(folder, dest, msginfo);
+
+ srcfile = procmsg_get_message_file(msginfo);
+ if (!srcfile) return -1;
+
+ ret = mh_add_msg(folder, dest, srcfile, FALSE);
+ g_free(srcfile);
+
+ if (ret != -1) {
+ gchar *destdir;
+ FILE *fp;
+
+ destdir = folder_item_get_path(dest);
+ if ((fp = procmsg_open_mark_file(destdir, TRUE)) == NULL)
+ g_warning(_("Can't open mark file.\n"));
+ else {
+ SET_DEST_MSG_FLAGS(fp, dest, msginfo);
+ fclose(fp);
+ }
+ g_free(destdir);
+
+ ret = folder_item_remove_msg(msginfo->folder, msginfo->msgnum);
+ }
+
+ return ret;
+}
+
+static gint mh_do_move_msgs_with_dest(Folder *folder, FolderItem *dest,
+ GSList *msglist)
{
gchar *destdir;
gchar *srcfile;
msginfo->folder->path, G_DIR_SEPARATOR,
msginfo->msgnum, dest->path);
- srcfile = procmsg_get_message_file_path(msginfo);
+ srcfile = procmsg_get_message_file(msginfo);
destfile = mh_get_newmsg_filename(dest);
if(!destfile) return -1;
dest->last_num++;
if (fp) {
- MsgInfo newmsginfo;
-
- newmsginfo.msgnum = dest->last_num;
- newmsginfo.flags = msginfo->flags;
- if (dest->stype == F_OUTBOX ||
- dest->stype == F_QUEUE ||
- dest->stype == F_DRAFT ||
- dest->stype == F_TRASH)
- MSG_UNSET_PERM_FLAGS
- (newmsginfo.flags,
- MSG_NEW|MSG_UNREAD|MSG_DELETED);
-
- procmsg_write_flags(&newmsginfo, fp);
+ SET_DEST_MSG_FLAGS(fp, dest, msginfo);
}
}
return dest->last_num;
}
+gint mh_move_msgs_with_dest(Folder *folder, FolderItem *dest, GSList *msglist)
+{
+ MsgInfo *msginfo;
+ GSList *cur;
+ gint ret = 0;
+
+ msginfo = (MsgInfo *)msglist->data;
+ if (folder == msginfo->folder->folder)
+ return mh_do_move_msgs_with_dest(folder, dest, msglist);
+
+ for (cur = msglist; cur != NULL; cur = cur->next) {
+ msginfo = (MsgInfo *)cur->data;
+ ret = mh_move_msg(folder, dest, msginfo);
+ if (ret == -1) break;
+ }
+
+ return ret;
+}
+
gint mh_copy_msg(Folder *folder, FolderItem *dest, MsgInfo *msginfo)
{
gchar *destdir;
if (!is_dir_exist(destdir))
make_dir_hier(destdir);
- if ((fp = procmsg_open_mark_file(destdir, TRUE)) == NULL)
- g_warning(_("Can't open mark file.\n"));
-
debug_print(_("Copying message %s%c%d to %s ...\n"),
msginfo->folder->path, G_DIR_SEPARATOR,
msginfo->msgnum, dest->path);
- srcfile = procmsg_get_message_file_path(msginfo);
+ srcfile = procmsg_get_message_file(msginfo);
destfile = mh_get_newmsg_filename(dest);
if(!destfile) {
g_free(srcfile);
return -1;
}
- g_free(destdir);
-
dest->op_count--;
if (copy_file(srcfile, destfile) < 0) {
FILE_OP_ERROR(srcfile, "copy");
g_free(srcfile);
g_free(destfile);
- if (fp) fclose(fp);
+ g_free(destdir);
return -1;
}
g_free(destfile);
dest->last_num++;
- if (fp) {
- MsgInfo newmsginfo;
-
- newmsginfo.msgnum = dest->last_num;
- newmsginfo.flags = msginfo->flags;
- if (dest->stype == F_OUTBOX ||
- dest->stype == F_QUEUE ||
- dest->stype == F_DRAFT ||
- dest->stype == F_TRASH)
- MSG_UNSET_PERM_FLAGS(newmsginfo.flags,
- MSG_NEW|MSG_UNREAD|MSG_DELETED);
- procmsg_write_flags(&newmsginfo, fp);
+ if ((fp = procmsg_open_mark_file(destdir, TRUE)) == NULL)
+ g_warning(_("Can't open mark file.\n"));
+ else {
+ SET_DEST_MSG_FLAGS(fp, dest, msginfo);
if (filemode) {
#if HAVE_FCHMOD
fclose(fp);
}
+ g_free(destdir);
return dest->last_num;
}
num = folder->add_msg(folder, dest, filename, FALSE);
destdir = folder_item_get_path(dest);
- if ((fp = procmsg_open_mark_file(destdir, TRUE)) == NULL)
- g_warning(_("Can't open mark file.\n"));
if (fp) {
MsgInfo newmsginfo;
msginfo->folder->path, G_DIR_SEPARATOR,
msginfo->msgnum, dest->path);
- srcfile = procmsg_get_message_file_path(msginfo);
+ srcfile = procmsg_get_message_file(msginfo);
destfile = mh_get_newmsg_filename(dest);
if(!destfile) {
g_free(srcfile);
dest->last_num++;
if (fp) {
- MsgInfo newmsginfo;
-
- newmsginfo.msgnum = dest->last_num;
- newmsginfo.flags = msginfo->flags;
- if (dest->stype == F_OUTBOX ||
- dest->stype == F_QUEUE ||
- dest->stype == F_DRAFT ||
- dest->stype == F_TRASH)
- MSG_UNSET_PERM_FLAGS
- (newmsginfo.flags,
- MSG_NEW|MSG_UNREAD|MSG_DELETED);
- procmsg_write_flags(&newmsginfo, fp);
+ SET_DEST_MSG_FLAGS(fp, dest, msginfo);
}
}
if (n_msg == 0)
item->new = item->unread = item->total = 0;
else {
- gint new, unread, total;
+ gint new, unread, total, min, max;
- procmsg_get_mark_sum(".", &new, &unread, &total);
+ procmsg_get_mark_sum(".", &new, &unread, &total, &min, &max, 0);
if (n_msg > total) {
new += n_msg - total;
unread += n_msg - total;
new_item = folder_item_new(d->d_name, entry);
folder_item_append(item, new_item);
if (!item->path) {
- if (!strcmp(d->d_name, "inbox")) {
+ if (!strcmp(d->d_name, INBOX_DIR)) {
new_item->stype = F_INBOX;
item->folder->inbox = new_item;
- } else if (!strcmp(d->d_name, "outbox")) {
+ } else if (!strcmp(d->d_name, OUTBOX_DIR)) {
new_item->stype = F_OUTBOX;
item->folder->outbox = new_item;
- } else if (!strcmp(d->d_name, "draft")) {
+ } else if (!strcmp(d->d_name, DRAFT_DIR)) {
new_item->stype = F_DRAFT;
item->folder->draft = new_item;
- } else if (!strcmp(d->d_name, "queue")) {
+ } else if (!strcmp(d->d_name, QUEUE_DIR)) {
new_item->stype = F_QUEUE;
item->folder->queue = new_item;
- } else if (!strcmp(d->d_name, "trash")) {
+ } else if (!strcmp(d->d_name, TRASH_DIR)) {
new_item->stype = F_TRASH;
item->folder->trash = new_item;
}
closedir(dp);
if (item->path) {
- gint new, unread, total;
+ gint new, unread, total, min, max;
- procmsg_get_mark_sum(item->path, &new, &unread, &total);
+ procmsg_get_mark_sum(item->path, &new, &unread, &total,
+ &min, &max, 0);
if (n_msg > total) {
new += n_msg - total;
unread += n_msg - total;