default_flags.perm_flags = MSG_NEW|MSG_UNREAD;
default_flags.tmp_flags = MSG_CACHED;
- if (type == F_MH) {
+ if (type == F_MH || type == F_IMAP) {
if (item->stype == F_QUEUE) {
MSG_SET_TMP_FLAGS(default_flags, MSG_QUEUED);
} else if (item->stype == F_DRAFT) {
MSG_SET_TMP_FLAGS(default_flags, MSG_DRAFT);
}
- } else if (type == F_IMAP) {
+ }
+ if (type == F_IMAP) {
MSG_SET_TMP_FLAGS(default_flags, MSG_IMAP);
} else if (type == F_NEWS) {
MSG_SET_TMP_FLAGS(default_flags, MSG_NEWS);
WRITE_CACHE_DATA_INT(flags, fp);
}
+void procmsg_flush_mark_queue(FolderItem *item, FILE *fp)
+{
+ MsgInfo *flaginfo;
+
+ g_return_if_fail(item != NULL);
+ g_return_if_fail(fp != NULL);
+
+ while (item->mark_queue != NULL) {
+ flaginfo = (MsgInfo *)item->mark_queue->data;
+ procmsg_write_flags(flaginfo, fp);
+ procmsg_msginfo_free(flaginfo);
+ item->mark_queue = g_slist_remove(item->mark_queue, flaginfo);
+ }
+}
+
+void procmsg_add_flags(FolderItem *item, gint num, MsgFlags flags)
+{
+ FILE *fp;
+ gchar *path;
+ MsgInfo msginfo;
+
+ g_return_if_fail(item != NULL);
+
+ if (item->opened) {
+ MsgInfo *queue_msginfo;
+
+ queue_msginfo = g_new0(MsgInfo, 1);
+ queue_msginfo->msgnum = num;
+ queue_msginfo->flags = flags;
+ item->mark_queue = g_slist_append
+ (item->mark_queue, queue_msginfo);
+ return;
+ }
+
+ path = folder_item_get_path(item);
+ g_return_if_fail(path != NULL);
+
+ if ((fp = procmsg_open_mark_file(path, TRUE)) == NULL) {
+ g_warning(_("can't open mark file\n"));
+ g_free(path);
+ return;
+ }
+ g_free(path);
+
+ msginfo.msgnum = num;
+ msginfo.flags = flags;
+
+ procmsg_write_flags(&msginfo, fp);
+ fclose(fp);
+}
+
struct MarkSum {
gint *new;
gint *unread;
flags = g_new0(MsgFlags, 1);
flags->perm_flags = perm_flags;
-
- if(!MSG_IS_REALLY_DELETED(*flags)) {
- g_hash_table_insert(mark_table, GUINT_TO_POINTER(num), flags);
- } else {
- g_hash_table_remove(mark_table, GUINT_TO_POINTER(num));
- }
+
+ g_hash_table_insert(mark_table, GUINT_TO_POINTER(num), flags);
}
fclose(fp);
parent = root;
} else {
if(MSG_IS_IGNORE_THREAD(((MsgInfo *)parent->data)->flags)) {
- procmsg_msginfo_set_flags(msginfo, MSG_IGNORE_THREAD, 0);
+ MSG_SET_PERM_FLAGS(msginfo->flags, MSG_IGNORE_THREAD);
}
}
}
(parent, parent->children, node);
/* CLAWS: ignore thread */
if(MSG_IS_IGNORE_THREAD(((MsgInfo *)parent->data)->flags)) {
- procmsg_msginfo_set_flags(msginfo, MSG_IGNORE_THREAD, 0);
+ MSG_SET_PERM_FLAGS(msginfo->flags, MSG_IGNORE_THREAD);
}
}
node = next;
g_node_append(parent, node);
/* CLAWS: ignore thread */
if(MSG_IS_IGNORE_THREAD(((MsgInfo *)parent->data)->flags)) {
- procmsg_msginfo_set_flags(msginfo, MSG_IGNORE_THREAD, 0);
+ MSG_SET_PERM_FLAGS(msginfo->flags, MSG_IGNORE_THREAD);
}
}
}
}
}
-gint procmsg_send_queue(void)
+gint procmsg_send_queue(FolderItem *queue, gboolean save_msgs)
{
- FolderItem *queue;
gint i;
gint ret = 0;
- queue = folder_get_default_queue();
+ if (!queue)
+ queue = folder_get_default_queue();
g_return_val_if_fail(queue != NULL, -1);
+
folder_item_scan(queue);
if (queue->last_num < 0) return -1;
else if (queue->last_num == 0) return 0;
if (procmsg_send_message_queue(file) < 0) {
g_warning(_("Sending queued message %d failed.\n"), i);
ret = -1;
- } else
+ } else {
+ /* CLAWS:
+ * We save in procmsg_send_message_queue because
+ * we need the destination folder from the queue
+ * header
+
+ if (save_msgs)
+ procmsg_save_to_outbox
+ (queue->folder->outbox,
+ file, TRUE);
+*/
folder_item_remove_msg(queue, i);
+ }
g_free(file);
}
}
return ret;
}
+gint procmsg_save_to_outbox(FolderItem *outbox, const gchar *file,
+ gboolean is_queued)
+{
+ gint num;
+ FILE *fp;
+ MsgFlags flag = {0, 0};
+
+ debug_print(_("saving sent message...\n"));
+
+ if (!outbox)
+ outbox = folder_get_default_outbox();
+ g_return_val_if_fail(outbox != NULL, -1);
+
+ /* remove queueing headers */
+ if (is_queued) {
+ gchar tmp[MAXPATHLEN + 1];
+ gchar buf[BUFFSIZE];
+ FILE *outfp;
+
+ g_snprintf(tmp, sizeof(tmp), "%s%ctmpmsg.out.%08x",
+ get_rc_dir(), G_DIR_SEPARATOR, (guint)random());
+ if ((fp = fopen(file, "rb")) == NULL) {
+ FILE_OP_ERROR(file, "fopen");
+ return -1;
+ }
+ if ((outfp = fopen(tmp, "wb")) == NULL) {
+ FILE_OP_ERROR(tmp, "fopen");
+ fclose(fp);
+ return -1;
+ }
+ while (fgets(buf, sizeof(buf), fp) != NULL)
+ if (buf[0] == '\r' || buf[0] == '\n') break;
+ while (fgets(buf, sizeof(buf), fp) != NULL)
+ fputs(buf, outfp);
+ fclose(outfp);
+ fclose(fp);
+ Xstrdup_a(file, tmp, return -1);
+ }
+
+ folder_item_scan(outbox);
+ if ((num = folder_item_add_msg(outbox, file, FALSE)) < 0) {
+ g_warning(_("can't save message\n"));
+ return -1;
+ }
+
+ if(is_queued) {
+ unlink(file);
+ }
+
+ procmsg_add_flags(outbox, num, flag);
+
+ return 0;
+}
+
void procmsg_print_message(MsgInfo *msginfo, const gchar *cmdline)
{
static const gchar *def_cmd = "lpr %s";
gchar buf[BUFFSIZE];
gint hnum;
PrefsAccount *mailac = NULL, *newsac = NULL;
- gchar *tmp = NULL;
int local = 0;
g_return_val_if_fail(file != NULL, -1);
}
filepos = ftell(fp);
- if(newsgroup_list || prefs_common.savemsg) {
- FILE *tmpfp;
-
- /* write to temporary file */
- tmp = g_strdup_printf("%s%ctmp%d", g_get_tmp_dir(),
- G_DIR_SEPARATOR, (gint)file);
- if ((tmpfp = fopen(tmp, "wb")) == NULL) {
- FILE_OP_ERROR(tmp, "fopen");
- newsval = -1;
- }
- if (change_file_mode_rw(tmpfp, tmp) < 0) {
- FILE_OP_ERROR(tmp, "chmod");
- g_warning(_("can't change file mode\n"));
- }
-
- while ((newsval == 0) && fgets(buf, sizeof(buf), fp) != NULL) {
- if (fputs(buf, tmpfp) == EOF) {
- FILE_OP_ERROR(tmp, "fputs");
- newsval = -1;
- }
- }
- fclose(tmpfp);
- }
-
fseek(fp, filepos, SEEK_SET);
if (to_list) {
debug_print(_("Sending message by mail\n"));
if(newsgroup_list && (newsval == 0)) {
Folder *folder;
+ gchar *tmp = NULL;
+ FILE *tmpfp;
- debug_print(_("Sending message by news\n"));
-
- folder = FOLDER(newsac->folder);
-
- newsval = news_post(folder, tmp);
- if (newsval < 0) {
- alertpanel_error(_("Error occurred while posting the message to %s ."),
- newsac->nntp_server);
- }
- }
-
- /* save message to outbox */
- if (mailval == 0 && newsval == 0 && savecopyfolder) {
- FolderItem *folder;
- gchar *path;
- gint num;
- FILE *fp;
-
- debug_print(_("saving sent message...\n"));
-
- folder = folder_find_item_from_identifier(savecopyfolder);
- if(!folder)
- folder = folder_get_default_outbox();
- path = folder_item_get_path(folder);
- if (!is_dir_exist(path))
- make_dir_hier(path);
+ /* write to temporary file */
+ tmp = g_strdup_printf("%s%ctmp%d", g_get_tmp_dir(),
+ G_DIR_SEPARATOR, (gint)file);
+ if ((tmpfp = fopen(tmp, "wb")) == NULL) {
+ FILE_OP_ERROR(tmp, "fopen");
+ newsval = -1;
+ alertpanel_error(_("Could not create temporary file for news sending."));
+ } else {
+ if (change_file_mode_rw(tmpfp, tmp) < 0) {
+ FILE_OP_ERROR(tmp, "chmod");
+ g_warning(_("can't change file mode\n"));
+ }
+
+ while ((newsval == 0) && fgets(buf, sizeof(buf), fp) != NULL) {
+ if (fputs(buf, tmpfp) == EOF) {
+ FILE_OP_ERROR(tmp, "fputs");
+ newsval = -1;
+ alertpanel_error(_("Error when writing temporary file for news sending."));
+ }
+ }
+ fclose(tmpfp);
- folder_item_scan(folder);
- if ((num = folder_item_add_msg(folder, tmp, FALSE)) < 0) {
- g_warning(_("can't save message\n"));
- }
+ if(newsval == 0) {
+ debug_print(_("Sending message by news\n"));
- if(num) {
- if ((fp = procmsg_open_mark_file(path, TRUE)) == NULL)
- g_warning(_("can't open mark file\n"));
- else {
- MsgInfo newmsginfo;
+ folder = FOLDER(newsac->folder);
- newmsginfo.msgnum = num;
- newmsginfo.flags.perm_flags = 0;
- newmsginfo.flags.tmp_flags = 0;
- procmsg_write_flags(&newmsginfo, fp);
- fclose(fp);
+ newsval = news_post(folder, tmp);
+ if (newsval < 0) {
+ alertpanel_error(_("Error occurred while posting the message to %s ."),
+ newsac->nntp_server);
+ }
}
+ unlink(tmp);
}
- g_free(path);
+ g_free(tmp);
}
slist_free_strings(to_list);
g_free(from);
g_free(smtpserver);
fclose(fp);
- if(tmp) {
- unlink(tmp);
- g_free(tmp);
- }
-
- return (newsval != 0 ? newsval : mailval);
-}
-
-#define CHANGE_FLAGS(msginfo) \
-{ \
-if (msginfo->folder->folder->change_flags != NULL) \
-msginfo->folder->folder->change_flags(msginfo->folder->folder, \
- msginfo->folder, \
- msginfo); \
-}
-
-void procmsg_msginfo_set_flags(MsgInfo *msginfo, MsgPermFlags perm_flags, MsgTmpFlags tmp_flags)
-{
- gboolean changed = FALSE;
- FolderItem *item = msginfo->folder;
-
- debug_print(_("Setting flags for message %d in folder %s\n"), msginfo->msgnum, item->path);
-
- /* if new flag is set */
- if((perm_flags & MSG_NEW) && !MSG_IS_NEW(msginfo->flags) &&
- !MSG_IS_IGNORE_THREAD(msginfo->flags)) {
- item->new++;
- changed = TRUE;
- }
-
- /* if unread flag is set */
- if((perm_flags & MSG_UNREAD) && !MSG_IS_UNREAD(msginfo->flags) &&
- !MSG_IS_IGNORE_THREAD(msginfo->flags)) {
- item->unread++;
- changed = TRUE;
- }
-
- /* if ignore thread flag is set */
- if((perm_flags & MSG_IGNORE_THREAD) && !MSG_IS_IGNORE_THREAD(msginfo->flags)) {
- if(MSG_IS_NEW(msginfo->flags) || (perm_flags & MSG_NEW)) {
- item->new--;
- changed = TRUE;
- }
- if(MSG_IS_UNREAD(msginfo->flags) || (perm_flags & MSG_UNREAD)) {
- item->unread--;
- changed = TRUE;
- }
- }
-
- if (MSG_IS_IMAP(msginfo->flags))
- imap_msg_set_perm_flags(msginfo, perm_flags);
-
- msginfo->flags.perm_flags |= perm_flags;
- msginfo->flags.tmp_flags |= tmp_flags;
-
- if(changed) {
- folderview_update_item(item, FALSE);
- }
- CHANGE_FLAGS(msginfo);
- procmsg_msginfo_write_flags(msginfo);
-}
-
-void procmsg_msginfo_unset_flags(MsgInfo *msginfo, MsgPermFlags perm_flags, MsgTmpFlags tmp_flags)
-{
- gboolean changed = FALSE;
- FolderItem *item = msginfo->folder;
-
- debug_print(_("Unsetting flags for message %d in folder %s\n"), msginfo->msgnum, item->path);
-
- /* if new flag is unset */
- if((perm_flags & MSG_NEW) && MSG_IS_NEW(msginfo->flags) &&
- !MSG_IS_IGNORE_THREAD(msginfo->flags)) {
- item->new--;
- changed = TRUE;
- }
- /* if unread flag is unset */
- if((perm_flags & MSG_UNREAD) && MSG_IS_UNREAD(msginfo->flags) &&
- !MSG_IS_IGNORE_THREAD(msginfo->flags)) {
- item->unread--;
- changed = TRUE;
- }
-
- /* if ignore thread flag is unset */
- if((perm_flags & MSG_IGNORE_THREAD) && !MSG_IS_IGNORE_THREAD(msginfo->flags)) {
- if(MSG_IS_NEW(msginfo->flags) || (perm_flags & MSG_NEW)) {
- item->new++;
- changed = TRUE;
- }
- if(MSG_IS_UNREAD(msginfo->flags) || (perm_flags & MSG_UNREAD)) {
- item->unread++;
- changed = TRUE;
- }
- }
+ /* save message to outbox */
+ if (mailval == 0 && newsval == 0 && savecopyfolder) {
+ FolderItem *outbox;
- if (MSG_IS_IMAP(msginfo->flags))
- imap_msg_unset_perm_flags(msginfo, perm_flags);
+ debug_print(_("saving sent message...\n"));
- msginfo->flags.perm_flags &= ~perm_flags;
- msginfo->flags.tmp_flags &= ~tmp_flags;
+ outbox = folder_find_item_from_identifier(savecopyfolder);
+ if(!outbox)
+ outbox = folder_get_default_outbox();
- if(changed) {
- folderview_update_item(item, FALSE);
+ procmsg_save_to_outbox(outbox, file, TRUE);
}
- CHANGE_FLAGS(msginfo);
- procmsg_msginfo_write_flags(msginfo);
-}
-void procmsg_msginfo_write_flags(MsgInfo *msginfo)
-{
- gchar *destdir;
- FILE *fp;
-
- destdir = folder_item_get_path(msginfo->folder);
- if (!is_dir_exist(destdir))
- make_dir_hier(destdir);
-
- if ((fp = procmsg_open_mark_file(destdir, TRUE))) {
- procmsg_write_flags(msginfo, fp);
- fclose(fp);
- } else {
- g_warning(_("Can't open mark file.\n"));
- }
-
- g_free(destdir);
+ return (newsval != 0 ? newsval : mailval);
}