+2006-06-12 [colin] 2.3.0cvs5
+
+ * src/compose.c
+ * src/compose.h
+ * src/folder.c
+ * src/folder.h
+ * src/imap.c
+ * src/inc.c
+ * src/main.c
+ * src/messageview.c
+ * src/mh.c
+ * src/prefs_folder_item.c
+ * src/procheader.c
+ * src/procmime.c
+ * src/procmsg.c
+ * src/procmsg.h
+ * src/send_message.c
+ * src/summaryview.c
+ * src/toolbar.c
+ Apply bug #964's patch (Queue and drafts aren't normal)
+ The Drafts and Queue folder now contain RFC-822 files,
+ allowing to move and copy mails from and to these
+ folders. Moving from Drafts to Queue will prepare the
+ mail for sending (PGP signature, encryption, etc).
+ This patch also rework sending errors handling to try
+ to be more helpful.
+ Also, allow redefining folder types via the GUI
+ (Folder type in its Properties)
+
2006-06-12 [colin] 2.3.0cvs4
* src/summaryview.c
( cvs diff -u -r 1.8.2.6 -r 1.8.2.7 src/quote_fmt.c; cvs diff -u -r 1.8.2.2 -r 1.8.2.3 src/quote_fmt_lex.l; cvs diff -u -r 1.22.2.20 -r 1.22.2.21 src/quote_fmt_parse.y; ) > 2.3.0cvs2.patchset
( cvs diff -u -r 1.8.2.3 -r 1.8.2.4 .cvsignore; ) > 2.3.0cvs3.patchset
( cvs diff -u -r 1.395.2.218 -r 1.395.2.219 src/summaryview.c; cvs diff -u -r 1.204.2.87 -r 1.204.2.88 src/prefs_common.c; cvs diff -u -r 1.103.2.50 -r 1.103.2.51 src/prefs_common.h; cvs diff -u -r 1.1.2.5 -r 1.1.2.6 src/gedit-print.c; cvs diff -u -r 1.4.2.15 -r 1.4.2.16 src/prefs_fonts.c; cvs diff -u -r 1.1.2.20 -r 1.1.2.21 manual/advanced.xml; cvs diff -u -r 1.1.2.11 -r 1.1.2.12 manual/fr/advanced.xml; ) > 2.3.0cvs4.patchset
+( cvs diff -u -r 1.382.2.276 -r 1.382.2.277 src/compose.c; cvs diff -u -r 1.50.2.25 -r 1.50.2.26 src/compose.h; cvs diff -u -r 1.213.2.97 -r 1.213.2.98 src/folder.c; cvs diff -u -r 1.87.2.28 -r 1.87.2.29 src/folder.h; cvs diff -u -r 1.179.2.119 -r 1.179.2.120 src/imap.c; cvs diff -u -r 1.149.2.51 -r 1.149.2.52 src/inc.c; cvs diff -u -r 1.115.2.89 -r 1.115.2.90 src/main.c; cvs diff -u -r 1.94.2.85 -r 1.94.2.86 src/messageview.c; cvs diff -u -r 1.79.2.34 -r 1.79.2.35 src/mh.c; cvs diff -u -r 1.52.2.20 -r 1.52.2.21 src/prefs_folder_item.c; cvs diff -u -r 1.47.2.30 -r 1.47.2.31 src/procheader.c; cvs diff -u -r 1.49.2.76 -r 1.49.2.77 src/procmime.c; cvs diff -u -r 1.150.2.67 -r 1.150.2.68 src/procmsg.c; cvs diff -u -r 1.60.2.28 -r 1.60.2.29 src/procmsg.h; cvs diff -u -r 1.17.2.30 -r 1.17.2.31 src/send_message.c; cvs diff -u -r 1.395.2.219 -r 1.395.2.220 src/summaryview.c; cvs diff -u -r 1.43.2.46 -r 1.43.2.47 src/toolbar.c; ) > 2.3.0cvs5.patchset
MICRO_VERSION=0
INTERFACE_AGE=0
BINARY_AGE=0
-EXTRA_VERSION=4
+EXTRA_VERSION=5
EXTRA_RELEASE=
EXTRA_GTK2_VERSION=
static gint compose_remove_reedit_target (Compose *compose,
gboolean force);
void compose_remove_draft (Compose *compose);
-static gint compose_queue (Compose *compose,
- gint *msgnum,
- FolderItem **item,
- gchar **msgpath);
static gint compose_queue_sub (Compose *compose,
gint *msgnum,
FolderItem **item,
gchar **msgpath,
- gboolean check_subject);
+ gboolean check_subject,
+ gboolean remove_reedit_target);
static void compose_add_attachments (Compose *compose,
MimeInfo *parent);
static gchar *compose_get_header (Compose *compose);
static gint compose_defer_auto_save_draft (Compose *compose);
static PrefsAccount *compose_guess_forward_account_from_msginfo (MsgInfo *msginfo);
-static gboolean compose_close (Compose *compose);
-
static GtkItemFactoryEntry compose_popup_entries[] =
{
{N_("/_Add..."), NULL, compose_attach_cb, 0, NULL},
}
}
-void compose_reedit(MsgInfo *msginfo)
+Compose *compose_reedit(MsgInfo *msginfo, gboolean batch)
{
Compose *compose = NULL;
PrefsAccount *account = NULL;
gboolean use_encryption = FALSE;
gchar *privacy_system = NULL;
- g_return_if_fail(msginfo != NULL);
- g_return_if_fail(msginfo->folder != NULL);
+ g_return_val_if_fail(msginfo != NULL, NULL);
+ g_return_val_if_fail(msginfo->folder != NULL, NULL);
if (compose_put_existing_to_front(msginfo)) {
- return;
+ return NULL;
}
if (folder_has_parent_of_type(msginfo->folder, F_QUEUE) ||
if (!account) {
account = cur_account;
}
- g_return_if_fail(account != NULL);
+ g_return_val_if_fail(account != NULL, NULL);
- compose = compose_create(account, COMPOSE_REEDIT, FALSE);
+ compose = compose_create(account, COMPOSE_REEDIT, batch);
compose->updating = TRUE;
if (compose_parse_header(compose, msginfo) < 0) {
compose->updating = FALSE;
compose_destroy(compose);
- return;
+ return NULL;
}
compose_reedit_set_entry(compose, msginfo);
if (compose->deferred_destroy) {
compose_destroy(compose);
+ return NULL;
}
+ return compose;
}
Compose *compose_redirect(PrefsAccount *account, MsgInfo *msginfo,
}
if (!found_other) {
AlertValue aval;
+ if (compose->batch) {
+ gtk_widget_show_all(compose->window);
+ }
aval = alertpanel(_("Send"),
_("The only recipient is the default CC address. Send anyway?"),
GTK_STOCK_CANCEL, _("+_Send"), NULL);
}
if (!found_other) {
AlertValue aval;
+ if (compose->batch) {
+ gtk_widget_show_all(compose->window);
+ }
aval = alertpanel(_("Send"),
_("The only recipient is the default BCC address. Send anyway?"),
GTK_STOCK_CANCEL, _("+_Send"), NULL);
const gchar *str;
if (compose_check_for_valid_recipient(compose) == FALSE) {
+ if (compose->batch) {
+ gtk_widget_show_all(compose->window);
+ }
alertpanel_error(_("Recipient is not specified."));
return FALSE;
}
gint compose_send(Compose *compose)
{
gint msgnum;
- FolderItem *folder;
+ FolderItem *folder = NULL;
gint val = -1;
gchar *msgpath = NULL;
gboolean discard_window = FALSE;
-
+ gchar *errstr = NULL;
if (prefs_common.send_dialog_mode != SEND_DIALOG_ALWAYS
|| compose->batch == TRUE)
discard_window = TRUE;
goto bail;
}
- val = compose_queue(compose, &msgnum, &folder, &msgpath);
+ val = compose_queue(compose, &msgnum, &folder, &msgpath, TRUE);
if (val) {
if (compose->batch) {
if (msgpath == NULL) {
msgpath = folder_item_fetch_msg(folder, msgnum);
- val = procmsg_send_message_queue(msgpath);
+ val = procmsg_send_message_queue(msgpath, &errstr);
g_free(msgpath);
} else {
- val = procmsg_send_message_queue(msgpath);
+ val = procmsg_send_message_queue(msgpath, &errstr);
g_unlink(msgpath);
g_free(msgpath);
}
if (!discard_window)
compose_close(compose);
} else {
- alertpanel_error(_("The message was queued but could not be "
+ if (errstr) {
+ gchar *tmp = g_strdup_printf(_("%s\nUse \"Send queued messages\" from "
+ "the main window to retry."), errstr);
+ g_free(errstr);
+ alertpanel_error_log(tmp);
+ g_free(tmp);
+ } else {
+ alertpanel_error_log(_("The message was queued but could not be "
"sent.\nUse \"Send queued messages\" from "
"the main window to retry."));
+ }
if (!discard_window) {
goto bail;
}
}
-static gint compose_queue(Compose *compose, gint *msgnum, FolderItem **item, gchar **msgpath)
+gint compose_queue(Compose *compose, gint *msgnum, FolderItem **item, gchar **msgpath,
+ gboolean remove_reedit_target)
{
- return compose_queue_sub (compose, msgnum, item, msgpath, FALSE);
+ return compose_queue_sub (compose, msgnum, item, msgpath, FALSE, remove_reedit_target);
}
-static gint compose_queue_sub(Compose *compose, gint *msgnum, FolderItem **item, gchar **msgpath, gboolean check_subject)
+static gint compose_queue_sub(Compose *compose, gint *msgnum, FolderItem **item,
+ gchar **msgpath, gboolean check_subject,
+ gboolean remove_reedit_target)
{
FolderItem *queue;
gchar *tmp;
if (compose_check_entries(compose, check_subject) == FALSE) {
lock = FALSE;
+ if (compose->batch) {
+ gtk_widget_show_all(compose->window);
+ }
return -1;
}
if ((fp = g_fopen(tmp, "wb")) == NULL) {
FILE_OP_ERROR(tmp, "fopen");
g_free(tmp);
+ lock = FALSE;
return -2;
}
fprintf(fp, "FMID:%s\t%d\t%s\n", folderid, compose->fwdinfo->msgnum, compose->fwdinfo->msgid);
g_free(folderid);
}
- fprintf(fp, "\n");
+
+ /* end of headers */
+ fprintf(fp, "X-Sylpheed-End-Special-Headers: 1\n");
if (compose->redirect_filename != NULL) {
if (compose_redirect_write_to_file(compose, fp) < 0) {
FILE_OP_ERROR(tmp, "fclose");
g_unlink(tmp);
g_free(tmp);
+ lock = FALSE;
return -2;
}
- queue = account_get_special_folder(compose->account, F_QUEUE);
+ if (item && *item) {
+ queue = *item;
+ } else {
+ queue = account_get_special_folder(compose->account, F_QUEUE);
+ }
if (!queue) {
g_warning("can't find queue folder\n");
g_unlink(tmp);
g_free(tmp);
+ lock = FALSE;
return -1;
}
folder_item_scan(queue);
g_warning("can't queue the message\n");
g_unlink(tmp);
g_free(tmp);
+ lock = FALSE;
return -1;
}
} else
*msgpath = tmp;
- if (compose->mode == COMPOSE_REEDIT) {
+ if (compose->mode == COMPOSE_REEDIT && remove_reedit_target) {
compose_remove_reedit_target(compose, FALSE);
}
Compose *compose = (Compose *)data;
gint val;
- val = compose_queue_sub(compose, NULL, NULL, NULL, TRUE);
+ val = compose_queue_sub(compose, NULL, NULL, NULL, TRUE, TRUE);
if (!val)
compose_close(compose);
- else if (val == -2) {
+ else if (val == -1) {
+ alertpanel_error(_("Could not queue message."));
+ } else if (val == -2) {
alertpanel_error(_("Could not queue message:\n\n%s."), strerror(errno));
} else if (val == -3) {
alertpanel_error(_("Could not queue message for sending:\n\n"
fprintf(fp, "X-Sylpheed-Encrypt:%d\n", compose->use_encryption);
fprintf(fp, "X-Sylpheed-Privacy-System:%s\n", compose->privacy_system);
}
- fprintf(fp, "\n");
+
+ /* end of headers */
+ fprintf(fp, "X-Sylpheed-End-Special-Headers: 1\n");
if (compose_write_to_file(compose, fp, COMPOSE_WRITE_FOR_STORE) < 0) {
fclose(fp);
return account;
}
-static gboolean compose_close(Compose *compose)
+gboolean compose_close(Compose *compose)
{
gint x, y;
Compose *compose_redirect (PrefsAccount *account,
MsgInfo *msginfo,
gboolean batch);
-void compose_reedit (MsgInfo *msginfo);
+Compose *compose_reedit (MsgInfo *msginfo,
+ gboolean batch);
GList *compose_get_compose_list (void);
gboolean compose_search_string_backward (Compose *compose,
const gchar *str,
gboolean case_sens);
-
+gint compose_queue (Compose *compose,
+ gint *msgnum,
+ FolderItem **item,
+ gchar **msgpath,
+ gboolean remove_reedit_target);
+gboolean compose_close (Compose *compose);
#endif /* __COMPOSE_H__ */
#include "statusbar.h"
#include "gtkutils.h"
#include "timing.h"
+#include "compose.h"
/* Dependecies to be removed ?! */
#include "prefs_common.h"
(GNode *node, GHashTable *pptable);
static gboolean persist_prefs_free (gpointer key, gpointer val, gpointer data);
void folder_item_read_cache (FolderItem *item);
-gboolean folder_item_free_cache (FolderItem *item, gboolean force);
gint folder_item_scan_full (FolderItem *item, gboolean filtering);
static void folder_item_update_with_msg (FolderItem *item, FolderItemUpdateFlags update_flags,
MsgInfo *msg);
folder->trash = NULL;
}
+static void reset_parent_type(FolderItem *item, gpointer data) {
+ item->parent_stype = -1;
+}
+
+void folder_item_change_type(FolderItem *item, SpecialFolderItemType newtype)
+{
+ FolderItem *parent;
+ Folder *folder = NULL;
+ FolderUpdateData hookdata;
+
+ if ((parent = folder_item_parent(item)) != NULL
+ && folder_item_parent(parent) != NULL) {
+ g_warning("can't change subfolder's type");
+ return;
+ }
+ folder = item->folder;
+ /* unset previous root of newtype */
+ switch(newtype) {
+ case F_INBOX:
+ folder_item_change_type(folder->inbox, F_NORMAL);
+ folder->inbox = item;
+ break;
+ case F_OUTBOX:
+ folder_item_change_type(folder->outbox, F_NORMAL);
+ folder->outbox = item;
+ break;
+ case F_QUEUE:
+ folder_item_change_type(folder->queue, F_NORMAL);
+ folder->queue = item;
+ break;
+ case F_DRAFT:
+ folder_item_change_type(folder->draft, F_NORMAL);
+ folder->draft = item;
+ break;
+ case F_TRASH:
+ folder_item_change_type(folder->trash, F_NORMAL);
+ folder->trash = item;
+ break;
+ case F_NORMAL:
+ default:
+ break;
+ }
+ /* set new type for current folder and sons */
+ item->stype = newtype;
+ folder_func_to_all_folders(reset_parent_type, NULL);
+
+ hookdata.folder = folder;
+ hookdata.update_flags = FOLDER_TREE_CHANGED;
+ hookdata.item = NULL;
+ hooks_invoke(FOLDER_UPDATE_HOOKLIST, &hookdata);
+}
+
void folder_destroy(Folder *folder)
{
g_return_if_fail(folder != NULL);
GRelation *relation;
GSList *not_moved = NULL;
gint total = 0, curmsg = 0;
+ MsgInfo *msginfo = NULL;
g_return_val_if_fail(dest != NULL, -1);
g_return_val_if_fail(msglist != NULL, -1);
if (dest->no_select)
return -1;
+ msginfo = (MsgInfo *)msglist->data;
+
+ if (!msginfo)
+ return -1;
+
+ if (!MSG_IS_QUEUED(msginfo->flags) &&
+ MSG_IS_DRAFT(msginfo->flags) &&
+ folder_has_parent_of_type(dest, F_QUEUE)) {
+ GSList *cur = msglist;
+ gboolean queue_err = FALSE;
+ for (; cur; cur = cur->next) {
+ Compose *compose = NULL;
+ FolderItem *queue = dest;
+ int val = 0;
+
+ msginfo = (MsgInfo *)cur->data;
+ compose = compose_reedit(msginfo, TRUE);
+ if (compose == NULL) {
+ queue_err = TRUE;
+ continue;
+ }
+ val = compose_queue(compose, NULL, &queue, NULL,
+ FALSE);
+ if (val < 0) {
+ queue_err = TRUE;
+ } else if (remove_source) {
+ folder_item_remove_msg(msginfo->folder, msginfo->msgnum);
+ }
+ if (val == 0)
+ compose_close(compose);
+ }
+ return queue_err ? -1:0;
+ }
+
relation = g_relation_new(2);
g_relation_index(relation, 0, g_direct_hash, g_direct_equal);
g_relation_index(relation, 1, g_direct_hash, g_direct_equal);
gpointer data);
gboolean folder_subscribe (const gchar *uri);
gboolean folder_have_mailbox (void);
+gboolean folder_item_free_cache (FolderItem *item, gboolean force);
+void folder_item_change_type (FolderItem *item,
+ SpecialFolderItemType newtype);
#endif /* __FOLDER_H__ */
static void imap_folder_destroy(Folder *folder)
{
- gchar *dir;
-
while (imap_folder_get_refcnt(folder) > 0)
gtk_main_iteration();
IMAPFlags iflags = 0;
guint32 new_uid = 0;
gchar *real_file = NULL;
- gboolean file_is_tmp = FALSE;
fileinfo = (MsgFileInfo *)cur->data;
statusbar_progress_all(curnum, total, 1);
iflags |= IMAP_FLAG_SEEN;
}
- if (fileinfo->flags) {
- if ((MSG_IS_QUEUED(*fileinfo->flags)
- || MSG_IS_DRAFT(*fileinfo->flags))
- && !folder_has_parent_of_type(dest, F_QUEUE)
- && !folder_has_parent_of_type(dest, F_DRAFT)) {
- real_file = get_tmp_file();
- file_is_tmp = TRUE;
- if (procmsg_remove_special_headers(
- fileinfo->file,
- real_file) !=0) {
- g_free(real_file);
- g_free(destdir);
- unlock_session();
- return -1;
- }
- } else if (!(MSG_IS_QUEUED(*fileinfo->flags)
- || MSG_IS_DRAFT(*fileinfo->flags))
- && (folder_has_parent_of_type(dest, F_QUEUE)
- || folder_has_parent_of_type(dest, F_DRAFT))) {
- return -1;
- }
- }
if (real_file == NULL)
real_file = g_strdup(fileinfo->file);
if (ok != IMAP_SUCCESS) {
g_warning("can't append message %s\n", real_file);
- if (file_is_tmp)
- g_unlink(real_file);
g_free(real_file);
g_free(destdir);
unlock_session();
}
if (last_uid < new_uid)
last_uid = new_uid;
- if (file_is_tmp)
- g_unlink(real_file);
g_free(real_file);
}
return -1;
}
+ if (src->folder != dest->folder) {
+ GSList *infolist = NULL, *cur;
+ int res = -1;
+ for (cur = msglist; cur; cur = cur->next) {
+ msginfo = (MsgInfo *)cur->data;
+ MsgFileInfo *fileinfo = g_new0(MsgFileInfo, 1);
+ fileinfo->file = procmsg_get_message_file(msginfo);
+ fileinfo->flags = &(msginfo->flags);
+ infolist = g_slist_prepend(infolist, fileinfo);
+ }
+ infolist = g_slist_reverse(infolist);
+ res = folder_item_add_msgs(dest, infolist, FALSE);
+ for (cur = infolist; cur; cur = cur->next) {
+ MsgFileInfo *info = (MsgFileInfo *)cur->data;
+ g_free(info->file);
+ g_free(info);
+ }
+ g_slist_free(infolist);
+ return res;
+ }
+
ok = imap_select(session, IMAP_FOLDER(folder), msginfo->folder->path,
NULL, NULL, NULL, NULL, FALSE);
if (ok != IMAP_SUCCESS) {
MsgInfoList *msglist, GRelation *relation)
{
MsgInfo *msginfo;
- GSList *file_list;
gint ret;
g_return_val_if_fail(folder != NULL, -1);
msginfo = (MsgInfo *)msglist->data;
g_return_val_if_fail(msginfo->folder != NULL, -1);
- /* if from/to are the same "type" (with or without extra headers),
- * copy them via imap */
- if (folder == msginfo->folder->folder &&
- !folder_has_parent_of_type(msginfo->folder, F_DRAFT) &&
- !folder_has_parent_of_type(msginfo->folder, F_QUEUE) &&
- !folder_has_parent_of_type(dest, F_DRAFT) &&
- !folder_has_parent_of_type(dest, F_QUEUE)) {
- ret = imap_do_copy_msgs(folder, dest, msglist, relation);
- return ret;
- } else if (folder == msginfo->folder->folder &&
- (folder_has_parent_of_type(msginfo->folder, F_DRAFT) ||
- folder_has_parent_of_type(msginfo->folder, F_QUEUE)) &&
- (folder_has_parent_of_type(dest, F_DRAFT) ||
- folder_has_parent_of_type(dest, F_QUEUE))) {
- ret = imap_do_copy_msgs(folder, dest, msglist, relation);
- return ret;
- }
- /* else reupload them */
- file_list = procmsg_get_message_file_list(msglist);
- g_return_val_if_fail(file_list != NULL, -1);
-
- ret = imap_add_msgs(folder, dest, file_list, relation);
- procmsg_message_file_list_free(file_list);
-
+ ret = imap_do_copy_msgs(folder, dest, msglist, relation);
return ret;
}
inc_state == INC_IO_ERROR)
break;
}
- folder_item_free_cache(processing);
+ folder_item_free_cache(processing, TRUE);
inc_session_destroy(session);
inc_dialog->queue_list =
if (item->opened)
folder_item_close(item);
- folder_item_free_cache(item);
+ folder_item_free_cache(item, TRUE);
}
static void exit_sylpheed(MainWindow *mainwin)
static void send_queue(void)
{
GList *list;
-
+ gchar *errstr = NULL;
for (list = folder_get_list(); list != NULL; list = list->next) {
Folder *folder = list->data;
if (folder->queue) {
gint res = procmsg_send_queue
- (folder->queue, prefs_common.savemsg);
+ (folder->queue, prefs_common.savemsg,
+ &errstr);
- if (res < 0) {
- alertpanel_error(_("Some errors occurred while sending queued messages."));
- }
if (res) {
folder_item_scan(folder->queue);
}
}
}
+ if (errstr) {
+ gchar *tmp = g_strdup_printf(_("Some errors occurred "
+ "while sending queued messages:\n%s"), errstr);
+ g_free(errstr);
+ alertpanel_error_log(tmp);
+ g_free(tmp);
+ } else {
+ alertpanel_error_log("Some errors occurred "
+ "while sending queued messages.");
+ }
}
static void quit_signal_handler(int sig)
gchar *path;
gchar *addr;
gchar *addrp;
-
+ gchar *foo = NULL;
if ((!msginfo->returnreceiptto) &&
(!msginfo->dispositionnotificationto))
return -1;
/* send it */
path = folder_item_fetch_msg(queue, num);
- ok = procmsg_send_message_queue(path);
+ ok = procmsg_send_message_queue(path, &foo);
g_free(path);
+ g_free(foo);
folder_item_remove_msg(queue, num);
return ok;
!folder_has_parent_of_type(msginfo->folder, F_QUEUE))
return;
- compose_reedit(msginfo);
+ compose_reedit(msginfo, FALSE);
}
static void addressbook_open_cb(gpointer data, guint action, GtkWidget *widget)
gint filemode = 0;
FolderItemPrefs *prefs;
MsgInfo *msginfo = NULL;
- gboolean remove_special_headers = FALSE;
MsgInfoList *cur = NULL;
gint curnum = 0, total = 0;
gchar *srcpath = NULL;
if (dest->last_num < 0) return -1;
}
- if ((MSG_IS_QUEUED(msginfo->flags) || MSG_IS_DRAFT(msginfo->flags))
- && !folder_has_parent_of_type(dest, F_QUEUE)
- && !folder_has_parent_of_type(dest, F_DRAFT)) {
- /* as every msginfo comes from the same folder, it is supposed they
- * will either match the preceding condition either all or none.
- */
- remove_special_headers = TRUE;
- } else if (!(MSG_IS_QUEUED(msginfo->flags) || MSG_IS_DRAFT(msginfo->flags))
- && (folder_has_parent_of_type(dest, F_QUEUE)
- || folder_has_parent_of_type(dest, F_DRAFT))) {
- return -1;
- }
-
prefs = dest->prefs;
srcpath = folder_item_get_path(msginfo->folder);
statusbar_print_all(_("Copying messages..."));
}
for (cur = msglist; cur; cur = cur->next) {
- gboolean moved = FALSE;
msginfo = (MsgInfo *)cur->data;
if (!msginfo) {
goto err_reset_status;
msginfo->msgnum, dest->path);
- if (remove_special_headers) {
- if (procmsg_remove_special_headers(srcfile, destfile) !=0) {
- g_free(srcfile);
- g_free(destfile);
- goto err_reset_status;
- }
- } else if (MSG_IS_MOVE(msginfo->flags)) {
+ if (MSG_IS_MOVE(msginfo->flags)) {
if (move_file(srcfile, destfile, TRUE) < 0) {
FILE_OP_ERROR(srcfile, "move");
if (copy_file(srcfile, destfile, TRUE) < 0) {
#include "folder.h"
#include "prefs_folder_item.h"
#include "folderview.h"
+#include "folder.h"
#include "summaryview.h"
#include "menu.h"
#include "account.h"
FolderItem *item;
GtkWidget *table;
+ GtkWidget *folder_type;
GtkWidget *checkbtn_simplify_subject;
GtkWidget *entry_simplify_subject;
GtkWidget *checkbtn_folder_chmod;
gpointer data)
{
FolderItemGeneralPage *page = (FolderItemGeneralPage *) page_;
- FolderItem *item = (FolderItem *) data;
+ FolderItem *item = (FolderItem *) data, *parent;
guint rowcount;
+
GtkWidget *table;
GtkWidget *hbox;
GtkWidget *label;
+ GtkWidget *folder_type_menu;
+ GtkWidget *folder_type;
+ GtkWidget *dummy_chkbtn;
+ GtkWidget *menuitem;
+ SpecialFolderItemType type;
+ gboolean type_apply_to_sub = TRUE;
+
GtkWidget *checkbtn_simplify_subject;
GtkWidget *entry_simplify_subject;
GtkWidget *checkbtn_folder_chmod;
rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
rowcount++;
+ /* folder_type */
+ folder_type = gtk_option_menu_new ();
+ gtk_widget_show (folder_type);
+
+ parent = item;
+ type = F_NORMAL;
+ while (parent && (type = parent->stype) == F_NORMAL) {
+ parent = folder_item_parent(parent);
+ }
+
+ if (type == F_INBOX && (parent = folder_item_parent(item)) != NULL
+ && folder_item_parent(parent) != NULL) {
+ type = F_NORMAL;
+ type_apply_to_sub = FALSE;
+ }
+
+ folder_type_menu = gtk_menu_new ();
+
+ MENUITEM_ADD (folder_type_menu, menuitem, _("Normal"), F_NORMAL);
+ MENUITEM_ADD (folder_type_menu, menuitem, _("Inbox"), F_INBOX);
+ MENUITEM_ADD (folder_type_menu, menuitem, _("Outbox"), F_OUTBOX);
+ MENUITEM_ADD (folder_type_menu, menuitem, _("Drafts"), F_DRAFT);
+ MENUITEM_ADD (folder_type_menu, menuitem, _("Queue"), F_QUEUE);
+ MENUITEM_ADD (folder_type_menu, menuitem, _("Trash"), F_TRASH);
+ gtk_option_menu_set_menu (GTK_OPTION_MENU (folder_type), folder_type_menu);
+
+ gtk_option_menu_set_history(GTK_OPTION_MENU(folder_type), type);
+
+ dummy_chkbtn = gtk_check_button_new();
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dummy_chkbtn), type_apply_to_sub);
+ gtk_widget_set_sensitive(dummy_chkbtn, FALSE);
+
+ if (((parent = folder_item_parent(item)) != NULL
+ && folder_item_parent(parent) == NULL)
+ && item->stype == F_NORMAL) {
+ gtk_widget_set_sensitive(folder_type, TRUE);
+ } else {
+ gtk_widget_set_sensitive(folder_type, FALSE);
+ }
+ label = gtk_label_new(_("Folder type:"));
+ gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
+ gtk_table_attach(GTK_TABLE(table), label, 0, 1,
+ rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, GTK_FILL, 0, 0);
+ gtk_table_attach(GTK_TABLE(table), folder_type, 1, 2,
+ rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, GTK_FILL, 0, 0);
+ gtk_table_attach(GTK_TABLE(table), dummy_chkbtn, 2, 3,
+ rowcount, rowcount + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
+
+ rowcount++;
+
/* Simplify Subject */
checkbtn_simplify_subject = gtk_check_button_new_with_label(_("Simplify Subject RegExp: "));
gtk_table_attach(GTK_TABLE(table), checkbtn_simplify_subject, 0, 1,
gtk_widget_show_all(table);
page->table = table;
+ page->folder_type = folder_type;
page->checkbtn_simplify_subject = checkbtn_simplify_subject;
page->entry_simplify_subject = entry_simplify_subject;
page->checkbtn_folder_chmod = checkbtn_folder_chmod;
FolderItemPrefs *prefs = folder->prefs;
gchar *buf;
gboolean all = FALSE;
+ SpecialFolderItemType type = F_NORMAL;
+ GtkWidget *menu;
+ GtkWidget *menuitem;
if (folder->path == NULL)
return;
if (page->item == folder)
all = TRUE;
+ menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(page->folder_type));
+ menuitem = gtk_menu_get_active(GTK_MENU(menu));
+ type = GPOINTER_TO_INT
+ (g_object_get_data(G_OBJECT(menuitem), MENU_VAL_ID));
+ if (all && folder->stype != type) {
+ folder_item_change_type(folder, type);
+ }
+
if (all || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->simplify_subject_rec_checkbtn))) {
prefs->enable_simplify_subject =
gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_simplify_subject));
gchar *hp;
HeaderEntry *hentry;
gint hnum;
+ void *orig_data = data;
+
get_one_field_func get_one_field =
isstring ? (get_one_field_func)string_get_one_field
: (get_one_field_func)procheader_get_one_field;
hentry = procheader_get_headernames(full);
if (MSG_IS_QUEUED(flags) || MSG_IS_DRAFT(flags)) {
- while (get_one_field(buf, sizeof(buf), data, NULL) != -1)
- ; /* loop */
+ while (get_one_field(buf, sizeof(buf), data, NULL) != -1) {
+ if (!strncmp(buf, "X-Sylpheed-End-Special-Headers: 1",
+ strlen("X-Sylpheed-End-Special-Headers:")))
+ break;
+ /* from other mailers */
+ if (!strncmp(buf, "Date: ", 6)
+ || !strncmp(buf, "To: ", 4)
+ || !strncmp(buf, "From: ", 6)
+ || !strncmp(buf, "Subject: ", 9)) {
+ if (isstring)
+ data = orig_data;
+ else
+ rewind((FILE *)data);
+ break;
+ }
+ }
}
msginfo = procmsg_msginfo_new();
if ((fp = g_fopen(filename, "rb")) == NULL)
return NULL;
/* Skip queue header */
- while (fgets(buf, sizeof(buf), fp) != NULL)
+ while (fgets(buf, sizeof(buf), fp) != NULL) {
+ /* new way */
+ if (!strncmp(buf, "X-Sylpheed-End-Special-Headers: 1",
+ strlen("X-Sylpheed-End-Special-Headers:")))
+ break;
+ /* old way */
if (buf[0] == '\r' || buf[0] == '\n') break;
+ /* from other mailers */
+ if (!strncmp(buf, "Date: ", 6)
+ || !strncmp(buf, "To: ", 4)
+ || !strncmp(buf, "From: ", 6)
+ || !strncmp(buf, "Subject: ", 9)) {
+ rewind(fp);
+ break;
+ }
+ }
offset = ftell(fp);
fclose(fp);
#include "log.h"
#include "timing.h"
-static gint procmsg_send_message_queue_full(const gchar *file, gboolean keep_session);
+static gint procmsg_send_message_queue_full(const gchar *file, gboolean keep_session, gchar **errstr);
enum
{
Q_PRIVACY_SYSTEM = 9,
Q_ENCRYPT = 10,
Q_ENCRYPT_DATA = 11,
+ Q_SYLPHEED_HDRS = 12,
};
GHashTable *procmsg_msg_hash_table_create(GSList *mlist)
if (MSG_IS_QUEUED(msginfo->flags) || MSG_IS_DRAFT(msginfo->flags)) {
gchar buf[BUFFSIZE];
- while (fgets(buf, sizeof(buf), fp) != NULL)
+ while (fgets(buf, sizeof(buf), fp) != NULL) {
+ /* new way */
+ if (!strncmp(buf, "X-Sylpheed-End-Special-Headers: 1",
+ strlen("X-Sylpheed-End-Special-Headers:")))
+ break;
+ /* old way */
if (buf[0] == '\r' || buf[0] == '\n') break;
+ /* from other mailers */
+ if (!strncmp(buf, "Date: ", 6)
+ || !strncmp(buf, "To: ", 4)
+ || !strncmp(buf, "From: ", 6)
+ || !strncmp(buf, "Subject: ", 9)) {
+ rewind(fp);
+ break;
+ }
+ }
}
return fp;
*\return Number of messages sent, negative if an error occurred
* positive if no error occurred
*/
-gint procmsg_send_queue(FolderItem *queue, gboolean save_msgs)
+gint procmsg_send_queue(FolderItem *queue, gboolean save_msgs, gchar **errstr)
{
gint sent = 0, err = 0;
GSList *list, *elem;
if (send_queue_lock) {
log_error(_("Already trying to send\n"));
+ if (errstr) {
+ if (*errstr) g_free(*errstr);
+ *errstr = g_strdup_printf(_("Already trying to send."));
+ }
return -1;
}
send_queue_lock = TRUE;
file = folder_item_fetch_msg(queue, msginfo->msgnum);
if (file) {
if (procmsg_send_message_queue_full(file,
- !procmsg_is_last_for_account(queue, msginfo, elem)) < 0) {
+ !procmsg_is_last_for_account(queue, msginfo, elem),
+ errstr) < 0) {
g_warning("Sending queued message %d failed.\n",
msginfo->msgnum);
err++;
while (node != NULL) {
int res = 0;
next = node->next;
- res = procmsg_send_queue(FOLDER_ITEM(node->data), save_msgs);
+ res = procmsg_send_queue(FOLDER_ITEM(node->data), save_msgs, errstr);
if (res < 0)
err = -res;
else
fclose(fp);
return -1;
}
- while (fgets(buf, sizeof(buf), fp) != NULL)
+ while (fgets(buf, sizeof(buf), fp) != NULL) {
+ /* new way */
+ if (!strncmp(buf, "X-Sylpheed-End-Special-Headers: 1",
+ strlen("X-Sylpheed-End-Special-Headers:")))
+ break;
+ /* old way */
if (buf[0] == '\r' || buf[0] == '\n') break;
+ /* from other mailers */
+ if (!strncmp(buf, "Date: ", 6)
+ || !strncmp(buf, "To: ", 4)
+ || !strncmp(buf, "From: ", 6)
+ || !strncmp(buf, "Subject: ", 9)) {
+ rewind(fp);
+ break;
+ }
+ }
while (fgets(buf, sizeof(buf), fp) != NULL)
fputs(buf, outfp);
fclose(outfp);
g_warning("can't save message\n");
return -1;
}
- return -1;
+ return 0;
}
msginfo = folder_item_get_msginfo(outbox, num); /* refcnt++ */
tmp_msginfo = procmsg_msginfo_get_full_info(msginfo); /* refcnt++ */
return msginfo1->msgnum - msginfo2->msgnum;
}
-static gint procmsg_send_message_queue_full(const gchar *file, gboolean keep_session)
+static gint procmsg_send_message_queue_full(const gchar *file, gboolean keep_session, gchar **errstr)
{
static HeaderEntry qentry[] = {{"S:", NULL, FALSE},
{"SSV:", NULL, FALSE},
{"X-Sylpheed-Privacy-System:", NULL, FALSE},
{"X-Sylpheed-Encrypt:", NULL, FALSE},
{"X-Sylpheed-Encrypt-Data:", NULL, FALSE},
+ {"X-Sylpheed-End-Special-Headers:", NULL, FALSE},
{NULL, NULL, FALSE}};
FILE *fp;
gint filepos;
if ((fp = g_fopen(file, "rb")) == NULL) {
FILE_OP_ERROR(file, "fopen");
+ if (errstr) {
+ if (*errstr) g_free(*errstr);
+ *errstr = g_strdup_printf(_("Couldn't open file %s."), file);
+ }
return -1;
}
if (encrypt_data == NULL)
encrypt_data = g_strdup(p);
break;
+ case Q_SYLPHEED_HDRS:
+ /* end of special headers reached */
+ goto send_mail; /* can't "break;break;" */
}
}
+send_mail:
filepos = ftell(fp);
if (encrypt) {
g_free(fwdmessageid);
g_free(privacy_system);
g_free(encrypt_data);
+ if (errstr) {
+ if (*errstr) g_free(*errstr);
+ *errstr = g_strdup_printf(_("Couldn't encrypt the email."));
+ }
return -1;
}
if (to_list) {
debug_print("Sending message by mail\n");
if (!from) {
- g_warning("Queued message header is broken.\n");
+ if (errstr) {
+ if (*errstr) g_free(*errstr);
+ *errstr = g_strdup_printf(_("Queued message header is broken."));
+ }
mailval = -1;
} else if (mailac && mailac->use_mail_command &&
mailac->mail_command && (* mailac->mail_command)) {
}
}
- if (mailac)
+ if (mailac) {
mailval = send_message_smtp_full(mailac, to_list, fp, keep_session);
- else {
+ if (mailval == -1 && errstr) {
+ if (*errstr) g_free(*errstr);
+ *errstr = g_strdup_printf(_("An error happened during SMTP session."));
+ }
+ } else {
PrefsAccount tmp_ac;
g_warning("Account not found.\n");
tmp_ac.smtp_server = smtpserver;
tmp_ac.smtpport = SMTP_PORT;
mailval = send_message_smtp(&tmp_ac, to_list, fp);
+ if (mailval == -1 && errstr) {
+ if (*errstr) g_free(*errstr);
+ *errstr = g_strdup_printf(_("No specific account has been found to "
+ "send, and an error happened during SMTP session."));
+ }
}
}
- } else if (!to_list && !newsgroup_list)
+ } else if (!to_list && !newsgroup_list) {
+ if (errstr) {
+ if (*errstr) g_free(*errstr);
+ *errstr = g_strdup(_("Couldn't determine sending informations. "
+ "Maybe the email hasn't been generated by Sylpheed-Claws."));
+ }
mailval = -1;
-
+ }
fseek(fp, filepos, SEEK_SET);
if (newsgroup_list && (mailval == 0)) {
if (fputs(buf, tmpfp) == EOF) {
FILE_OP_ERROR(tmp, "fputs");
newsval = -1;
- alertpanel_error(_("Error when writing temporary file for news sending."));
+ if (errstr) {
+ if (*errstr) g_free(*errstr);
+ *errstr = g_strdup_printf(_("Error when writing temporary file for news sending."));
+ }
}
}
fclose(tmpfp);
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);
- }
+ if (newsval < 0 && errstr) {
+ if (*errstr) g_free(*errstr);
+ *errstr = g_strdup_printf(_("Error occurred while posting the message to %s."),
+ newsac->nntp_server);
+ }
}
g_unlink(tmp);
}
return (newsval != 0 ? newsval : mailval);
}
-gint procmsg_send_message_queue(const gchar *file)
+gint procmsg_send_message_queue(const gchar *file, gchar **errstr)
{
- return procmsg_send_message_queue_full(file, FALSE);
+ return procmsg_send_message_queue_full(file, FALSE, errstr);
}
static void update_folder_msg_counts(FolderItem *item, MsgInfo *msginfo, MsgPermFlags old_flags)
void procmsg_empty_all_trash (void);
gint procmsg_send_queue (FolderItem *queue,
- gboolean save_msgs);
+ gboolean save_msgs,
+ gchar **errstr);
gboolean procmsg_queue_is_empty (FolderItem *queue);
gint procmsg_save_to_outbox (FolderItem *outbox,
const gchar *file,
gint procmsg_cmp_msgnum_for_sort (gconstpointer a,
gconstpointer b);
-gint procmsg_send_message_queue (const gchar *file);
+gint procmsg_send_message_queue (const gchar *file,
+ gchar **errstr);
void procmsg_msginfo_set_flags (MsgInfo *msginfo,
MsgPermFlags perm_flags,
if (log_msg)
log_warning("%s\n", log_msg);
if (err_msg) {
- alertpanel_error_log("%s", err_msg);
+ log_error("%s", err_msg);
g_free(err_msg);
}
}
summaryview->selected);
if (!msginfo) return;
- compose_reedit(msginfo);
+ compose_reedit(msginfo, FALSE);
}
gboolean summary_step(SummaryView *summaryview, GtkScrollType type)
GList *list;
gboolean found;
gboolean got_error = FALSE;
+ gchar *errstr = NULL;
if (prefs_common.work_offline)
if (alertpanel(_("Offline warning"),
if (folder->queue) {
if (procmsg_send_queue(folder->queue,
- prefs_common.savemsg) < 0)
+ prefs_common.savemsg,
+ &errstr) < 0)
got_error = TRUE;
}
}
- if (got_error)
- alertpanel_error(_("Some errors occurred while "
- "sending queued messages."));
+ if (got_error) {
+ if (!errstr)
+ alertpanel_error_log(_("Some errors occurred while "
+ "sending queued messages."));
+ else {
+ gchar *tmp = g_strdup_printf(_("Some errors occurred "
+ "while sending queued messages:\n%s"), errstr);
+ g_free(errstr);
+ alertpanel_error_log(tmp);
+ g_free(tmp);
+ }
+ }
}
void compose_mail_cb(gpointer data, guint action, GtkWidget *widget)