#include "menu.h"
#include "send.h"
#include "news.h"
+#include "customheader.h"
#include "prefs_common.h"
#include "prefs_account.h"
#include "account.h"
#include "gtkshruler.h"
#include "folder.h"
#include "addr_compl.h"
-#include "headers.h"
#if USE_GPGME
# include "rfc2015.h"
const gchar *fmt);
static void compose_reply_set_entry (Compose *compose,
MsgInfo *msginfo,
- gboolean to_all);
+ gboolean to_all,
+ gboolean to_author);
static void compose_reedit_set_entry (Compose *compose,
MsgInfo *msginfo);
static void compose_insert_sig (Compose *compose);
static void compose_wrap_line (Compose *compose);
static void compose_set_title (Compose *compose);
-static gint compose_send (Compose *compose);
+static PrefsAccount *compose_current_mail_account(void);
+/* static gint compose_send (Compose *compose); */
static gint compose_write_to_file (Compose *compose,
const gchar *file,
gboolean is_draft);
guint action,
GtkWidget *widget);
#endif
+static void compose_toggle_return_receipt_cb(gpointer data, guint action,
+ GtkWidget *widget);
static void compose_attach_drag_received_cb (GtkWidget *widget,
GdkDragContext *drag_context,
Compose *compose);
static void followupto_activated (GtkWidget *widget,
Compose *compose);
+static void compose_attach_parts(Compose * compose,
+ MsgInfo * msginfo);
static GtkItemFactoryEntry compose_popup_entries[] =
{
{N_("/_Message/Si_gn"), NULL, compose_toggle_sign_cb, 0, "<ToggleItem>"},
{N_("/_Message/_Encrypt"), NULL, compose_toggle_encrypt_cb, 0, "<ToggleItem>"},
#endif /* USE_GPGME */
+ {N_("/_Message/---"), NULL, NULL, 0, "<Separator>"},
+ {N_("/_Message/_Request Return Receipt"), NULL, compose_toggle_return_receipt_cb, 0, "<ToggleItem>"},
{N_("/_Tool"), NULL, NULL, 0, "<Branch>"},
{N_("/_Tool/Show _ruler"), NULL, compose_toggle_ruler_cb, 0, "<ToggleItem>"},
{N_("/_Tool/_Address book"), "<alt>A", compose_address_cb, 0, NULL},
{"text/uri-list", 0, 0}
};
-void compose_new(PrefsAccount *account)
+Compose * compose_new(PrefsAccount *account)
{
- compose_new_with_recipient(account, NULL);
+ return compose_new_with_recipient(account, NULL);
}
-void compose_new_with_recipient(PrefsAccount *account, const gchar *to)
+Compose * compose_new_with_recipient(PrefsAccount *account, const gchar *to)
{
Compose *compose;
if (!account) account = cur_account;
- g_return_if_fail(account != NULL);
+ g_return_val_if_fail(account != NULL, NULL);
compose = compose_create(account);
compose->mode = COMPOSE_NEW;
gtk_widget_grab_focus(compose->to_entry);
} else
gtk_widget_grab_focus(compose->newsgroups_entry);
+
+ return compose;
+}
+
+#define CHANGE_FLAGS(msginfo) \
+{ \
+if (msginfo->folder->folder->change_flags != NULL) \
+msginfo->folder->folder->change_flags(msginfo->folder->folder, \
+ msginfo->folder, \
+ msginfo); \
}
-void compose_reply(MsgInfo *msginfo, gboolean quote, gboolean to_all)
+void compose_reply(MsgInfo *msginfo, gboolean quote, gboolean to_all,
+ gboolean to_author)
{
Compose *compose;
PrefsAccount *account;
+ PrefsAccount *reply_account;
GtkSText *text;
g_return_if_fail(msginfo != NULL);
if (!account) account = cur_account;
g_return_if_fail(account != NULL);
+ if (to_author && account->protocol == A_NNTP) {
+ reply_account =
+ account_find_mail_from_address(account->address);
+ if (!reply_account)
+ reply_account = compose_current_mail_account();
+ if (!reply_account)
+ return;
+ } else
+ reply_account = account;
+
MSG_UNSET_FLAGS(msginfo->flags, MSG_FORWARDED);
MSG_SET_FLAGS(msginfo->flags, MSG_REPLIED);
- compose = compose_create(account);
+ CHANGE_FLAGS(msginfo);
+
+ compose = compose_create(reply_account);
compose->mode = COMPOSE_REPLY;
if (compose_parse_header(compose, msginfo) < 0) return;
- compose_reply_set_entry(compose, msginfo, to_all);
+ compose_reply_set_entry(compose, msginfo, to_all, to_author);
text = GTK_STEXT(compose->text);
gtk_stext_freeze(text);
gtk_widget_grab_focus(compose->text);
}
+
+static gchar *procmime_get_file_name(MimeInfo *mimeinfo)
+{
+ gchar *base;
+ gchar *filename;
+
+ g_return_val_if_fail(mimeinfo != NULL, NULL);
+
+ base = mimeinfo->filename ? mimeinfo->filename
+ : mimeinfo->name ? mimeinfo->name : NULL;
+
+ if (MIME_TEXT_HTML == mimeinfo->mime_type && base == NULL)
+ base = "mimetmp.html";
+ else {
+ base = base ? base : "mimetmp";
+ base = g_basename(base);
+ if (*base == '\0') base = "mimetmp";
+ }
+
+ filename = g_strconcat(get_mime_tmp_dir(), G_DIR_SEPARATOR_S,
+ base, NULL);
+
+ return filename;
+}
+
+static gchar * mime_extract_file(gchar * source, MimeInfo *partinfo)
+{
+ gchar *filename;
+
+ if (!partinfo) return;
+
+ filename = procmime_get_file_name(partinfo);
+
+ if (procmime_get_part(filename, source, partinfo) < 0)
+ alertpanel_error
+ (_("Can't get the part of multipart message."));
+
+ return filename;
+}
+
+static void compose_attach_parts(Compose * compose,
+ MsgInfo * msginfo)
+{
+
+ FILE *fp;
+ gchar *file;
+ MimeInfo *mimeinfo;
+ MsgInfo *tmpmsginfo;
+ gchar *p;
+ gchar *boundary;
+ gint boundary_len = 0;
+ gchar buf[BUFFSIZE];
+ glong fpos, prev_fpos;
+ gint npart;
+ gchar * source;
+ gchar * filename;
+
+ g_return_if_fail(msginfo != NULL);
+
+#if USE_GPGME
+ for (;;) {
+ if ((fp = procmsg_open_message(msginfo)) == NULL) return;
+ mimeinfo = procmime_scan_mime_header(fp);
+ if (!mimeinfo) break;
+
+ if (!MSG_IS_ENCRYPTED(msginfo->flags) &&
+ rfc2015_is_encrypted(mimeinfo)) {
+ MSG_SET_FLAGS(msginfo->flags, MSG_ENCRYPTED);
+ }
+ if (MSG_IS_ENCRYPTED(msginfo->flags) &&
+ !msginfo->plaintext_file &&
+ !msginfo->decryption_failed) {
+ rfc2015_decrypt_message(msginfo, mimeinfo, fp);
+ if (msginfo->plaintext_file &&
+ !msginfo->decryption_failed) {
+ fclose(fp);
+ continue;
+ }
+ }
+
+ break;
+ }
+#else /* !USE_GPGME */
+ if ((fp = procmsg_open_message(msginfo)) == NULL) return;
+ mimeinfo = procmime_scan_mime_header(fp);
+#endif /* USE_GPGME */
+
+ fclose(fp);
+ if (!mimeinfo) return;
+
+ if ((fp = procmsg_open_message(msginfo)) == NULL) return;
+
+ g_return_if_fail(mimeinfo != NULL);
+ g_return_if_fail(mimeinfo->mime_type != MIME_TEXT);
+
+ if (mimeinfo->mime_type == MIME_MULTIPART) {
+ g_return_if_fail(mimeinfo->boundary != NULL);
+ g_return_if_fail(mimeinfo->sub == NULL);
+ }
+ g_return_if_fail(fp != NULL);
+
+ boundary = mimeinfo->boundary;
+
+ if (boundary) {
+ boundary_len = strlen(boundary);
+
+ /* look for first boundary */
+ while ((p = fgets(buf, sizeof(buf), fp)) != NULL)
+ if (IS_BOUNDARY(buf, boundary, boundary_len)) break;
+ if (!p) {
+ fclose(fp);
+ return;
+ }
+ }
+
+ if ((fpos = ftell(fp)) < 0) {
+ perror("ftell");
+ fclose(fp);
+ return;
+ }
+
+ for (npart = 0;; npart++) {
+ MimeInfo *partinfo;
+ gboolean eom = FALSE;
+
+ prev_fpos = fpos;
+
+ partinfo = procmime_scan_mime_header(fp);
+ if (!partinfo) break;
+
+ if (npart != 0)
+ procmime_mimeinfo_insert(mimeinfo, partinfo);
+ else
+ procmime_mimeinfo_free(partinfo);
+
+ /* look for next boundary */
+ buf[0] = '\0';
+ while ((p = fgets(buf, sizeof(buf), fp)) != NULL) {
+ if (IS_BOUNDARY(buf, boundary, boundary_len)) {
+ if (buf[2 + boundary_len] == '-' &&
+ buf[2 + boundary_len + 1] == '-')
+ eom = TRUE;
+ break;
+ }
+ }
+ if (p == NULL)
+ eom = TRUE; /* broken MIME message */
+ fpos = ftell(fp);
+
+ partinfo->size = fpos - prev_fpos - strlen(buf);
+
+ if (eom) break;
+ }
+
+ source = procmsg_get_message_file_path(msginfo);
+
+ g_return_if_fail(mimeinfo != NULL);
+
+ if (!mimeinfo->main && mimeinfo->parent)
+ {
+ filename = mime_extract_file(source, mimeinfo);
+
+ compose_attach_append(compose, filename,
+ mimeinfo->mime_type);
+
+ g_free(filename);
+ }
+
+ if (mimeinfo->sub && mimeinfo->sub->children)
+ {
+ filename = mime_extract_file(source, mimeinfo->sub);
+
+ compose_attach_append(compose, filename,
+ mimeinfo->sub->mime_type);
+
+ g_free(filename);
+ }
+
+ if (mimeinfo->children) {
+ MimeInfo *child;
+
+ child = mimeinfo->children;
+ while (child) {
+ filename = mime_extract_file(source, child);
+
+ compose_attach_append(compose, filename,
+ child->mime_type);
+
+ g_free(filename);
+
+ child = child->next;
+ }
+ }
+
+ fclose(fp);
+
+ procmime_mimeinfo_free_all(mimeinfo);
+}
+
+
#define INSERT_FW_HEADER(var, hdr) \
if (msginfo->var && *msginfo->var) { \
gtk_stext_insert(text, NULL, NULL, NULL, hdr, -1); \
gtk_stext_insert(text, NULL, NULL, NULL, "\n", 1); \
}
-void compose_forward(MsgInfo *msginfo, gboolean as_attach)
+Compose * compose_forward(PrefsAccount * account, MsgInfo *msginfo,
+ gboolean as_attach)
{
Compose *compose;
- PrefsAccount *account;
+ /* PrefsAccount *account; */
GtkSText *text;
FILE *fp;
gchar buf[BUFFSIZE];
- 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);
- account = msginfo->folder->folder->account;
- if (!account) account = cur_account;
- g_return_if_fail(account != NULL);
+ if (account == NULL) {
+ account = msginfo->folder->folder->account;
+ if (!account) account = cur_account;
+ }
+ g_return_val_if_fail(account != NULL, NULL);
MSG_UNSET_FLAGS(msginfo->flags, MSG_REPLIED);
MSG_SET_FLAGS(msginfo->flags, MSG_FORWARDED);
+ CHANGE_FLAGS(msginfo);
+
compose = compose_create(account);
compose->mode = COMPOSE_FORWARD;
buf, -1);
fclose(fp);
}
+ compose_attach_parts(compose, msginfo);
}
if (prefs_common.auto_sig)
gtk_widget_grab_focus(compose->to_entry);
else
gtk_widget_grab_focus(compose->newsgroups_entry);
+
+ return compose;
}
+#undef INSERT_FW_HEADER
+
void compose_reedit(MsgInfo *msginfo)
{
Compose *compose;
gtk_stext_insert(text, NULL, NULL, NULL, buf, -1);
fclose(fp);
}
+ compose_attach_parts(compose, msginfo);
gtk_stext_thaw(text);
gtk_widget_grab_focus(compose->text);
case COMPOSE_BCC:
entry = GTK_ENTRY(compose->bcc_entry);
break;
+ case COMPOSE_NEWSGROUPS:
+ entry = GTK_ENTRY(compose->newsgroups_entry);
+ break;
case COMPOSE_TO:
default:
entry = GTK_ENTRY(compose->to_entry);
}
static void compose_reply_set_entry(Compose *compose, MsgInfo *msginfo,
- gboolean to_all)
+ gboolean to_all, gboolean to_author)
{
GSList *cc_list;
GSList *cur;
if (compose->account->protocol != A_NNTP)
gtk_entry_set_text(GTK_ENTRY(compose->to_entry),
- compose->replyto ? compose->replyto
- : msginfo->from ? msginfo->from : "");
+ ( (compose->replyto && !to_author)
+ ? compose->replyto
+ : msginfo->from ? msginfo->from : ""));
if (compose->account->protocol == A_NNTP)
gtk_entry_set_text(GTK_ENTRY(compose->newsgroups_entry),
compose->followup_to ? compose->followup_to
}
}
+#undef SET_ENTRY
+
static void compose_insert_sig(Compose *compose)
{
gchar *sigfile;
if (compose->account && compose->account->sig_path)
sigfile = g_strdup(compose->account->sig_path);
else {
- sigfile = g_strconcat(g_get_home_dir(), G_DIR_SEPARATOR_S,
+ sigfile = g_strconcat(get_home_dir(), G_DIR_SEPARATOR_S,
DEFAULT_SIGNATURE, NULL);
}
g_free(str);
}
-static gint compose_send(Compose *compose)
+/**
+ * compose_current_mail_account:
+ *
+ * Find a current mail account (the currently selected account, or the
+ * default account, if a news account is currently selected). If a
+ * mail account cannot be found, display an error message.
+ *
+ * Return value: Mail account, or NULL if not found.
+ **/
+static PrefsAccount *
+compose_current_mail_account(void)
+{
+ PrefsAccount *ac;
+
+ if (cur_account && cur_account->protocol != A_NNTP)
+ ac = cur_account;
+ else {
+ ac = account_get_default();
+ if (!ac || ac->protocol == A_NNTP) {
+ alertpanel_error(_("Account for sending mail is not specified.\n"
+ "Please select a mail account before sending."));
+ return NULL;
+ }
+ }
+ return ac;
+}
+
+gint compose_send(Compose *compose)
{
gchar tmp[MAXPATHLEN + 1];
gchar *to, *newsgroups;
ac = compose->account;
else if (compose->orig_account->protocol != A_NNTP)
ac = compose->orig_account;
- else if (cur_account && cur_account->protocol != A_NNTP)
- ac = cur_account;
else {
- ac = account_get_default();
- if (!ac || ac->protocol == A_NNTP) {
- alertpanel_error(_("Account for sending mail is not specified.\n"
- "Please select a mail account before sending."));
+ ac = compose_current_mail_account();
+ if (!ac) {
unlink(tmp);
lock = FALSE;
return -1;
(_("Can't save the message to outbox."));
}
- if (unlink(tmp) < 0) FILE_OP_ERROR(tmp, "unlink");
+ unlink(tmp);
lock = FALSE;
return ok;
}
debug_print(_("saving sent message...\n"));
outbox = folder_get_default_outbox();
+ path = folder_item_get_path(outbox);
+ if (!is_dir_exist(path))
+ make_dir_hier(path);
+
folder_item_scan(outbox);
- if ((num = folder_item_add_msg(outbox, file)) < 0) {
+ if ((num = folder_item_add_msg(outbox, file, FALSE)) < 0) {
+ g_free(path);
g_warning(_("can't save message\n"));
return -1;
}
- path = folder_item_get_path(outbox);
if ((fp = procmsg_open_mark_file(path, TRUE)) == NULL)
g_warning(_("can't open mark file\n"));
else {
queue = folder_get_default_queue();
folder_item_scan(queue);
- if ((num = folder_item_add_msg(queue, tmp)) < 0) {
+ queue_path = folder_item_get_path(queue);
+ if (!is_dir_exist(queue_path))
+ make_dir_hier(queue_path);
+ if ((num = folder_item_add_msg(queue, tmp, TRUE)) < 0) {
g_warning(_("can't queue the message\n"));
unlink(tmp);
g_free(tmp);
+ g_free(queue_path);
return -1;
}
- unlink(tmp);
g_free(tmp);
- queue_path = folder_item_get_path(queue);
if ((fp = procmsg_open_mark_file(queue_path, TRUE)) == NULL)
g_warning(_("can't open mark file\n"));
else {
fprintf(fp, "\n--%s--\n", compose->boundary);
}
-static gint is_in_custom_headers(Compose *compose, gchar * header)
-{
- GSList * cur;
-
- if (compose->account->add_customhdr) {
- for (cur = compose->account->customhdr_list;
- cur != NULL; cur = cur->next) {
- CustomHeader * ch = (CustomHeader *) cur->data;
- if (strcasecmp(ch->name, header) == 0)
- return 1;
- }
- }
- return 0;
-}
+#define IS_IN_CUSTOM_HEADER(header) \
+ (compose->account->add_customhdr && \
+ custom_header_find(compose->account->customhdr_list, header) != NULL)
static gint compose_write_headers(Compose *compose, FILE *fp,
const gchar *charset, EncodingType encoding,
gchar buf[BUFFSIZE];
gchar *str;
/* struct utsname utsbuf; */
- GSList * cur;
g_return_val_if_fail(fp != NULL, -1);
g_return_val_if_fail(charset != NULL, -1);
g_return_val_if_fail(compose->account->address != NULL, -1);
/* Date */
- if (!is_in_custom_headers(compose, "Date")) {
- if (compose->account->add_date) {
- get_rfc822_date(buf, sizeof(buf));
- fprintf(fp, "Date: %s\n", buf);
- }
+ if (compose->account->add_date) {
+ get_rfc822_date(buf, sizeof(buf));
+ fprintf(fp, "Date: %s\n", buf);
}
-
+
/* From */
- if (!is_in_custom_headers(compose, "From")) {
+ if (!IS_IN_CUSTOM_HEADER("From")) {
if (compose->account->name && *compose->account->name) {
compose_convert_header
(buf, sizeof(buf), compose->account->name,
strlen("From: "));
- fprintf(fp, "From: %s <%s>\n", buf, compose->account->address);
+ fprintf(fp, "From: %s <%s>\n",
+ buf, compose->account->address);
} else
fprintf(fp, "From: %s\n", compose->account->address);
}
-
+
slist_free_strings(compose->to_list);
g_slist_free(compose->to_list);
compose->to_list = NULL;
if (*str != '\0') {
compose->to_list = address_list_append
(compose->to_list, str);
- compose_convert_header(buf, sizeof(buf), str,
- strlen("To: "));
- if (!is_in_custom_headers(compose, "To")) {
+ if (!IS_IN_CUSTOM_HEADER("To")) {
+ compose_convert_header
+ (buf, sizeof(buf), str,
+ strlen("To: "));
fprintf(fp, "To: %s\n", buf);
}
}
}
}
-
+
slist_free_strings(compose->newsgroup_list);
g_slist_free(compose->newsgroup_list);
compose->newsgroup_list = NULL;
compose->newsgroup_list =
newsgroup_list_append(compose->newsgroup_list,
str);
- compose_convert_header(buf, sizeof(buf), str,
- strlen("Newsgroups: "));
- if (!is_in_custom_headers(compose, "Newsgroups")) {
+ if (!IS_IN_CUSTOM_HEADER("Newsgroups")) {
+ compose_convert_header(buf, sizeof(buf), str,
+ strlen("Newsgroups: "));
fprintf(fp, "Newsgroups: %s\n", buf);
}
}
if (*str != '\0') {
compose->to_list = address_list_append
(compose->to_list, str);
- compose_convert_header(buf, sizeof(buf), str,
- strlen("Cc: "));
- if (!is_in_custom_headers(compose, "Cc")) {
+ if (!IS_IN_CUSTOM_HEADER("Cc")) {
+ compose_convert_header
+ (buf, sizeof(buf), str,
+ strlen("Cc: "));
fprintf(fp, "Cc: %s\n", buf);
}
}
}
}
-
+
/* Bcc */
if (compose->use_bcc) {
str = gtk_entry_get_text(GTK_ENTRY(compose->bcc_entry));
compose_convert_header
(buf, sizeof(buf), str,
strlen("Bcc: "));
- if (!is_in_custom_headers(compose,
- "Bcc")) {
- fprintf(fp, "Bcc: %s\n", buf);
- }
+ fprintf(fp, "Bcc: %s\n", buf);
}
}
}
}
/* Subject */
- if (!is_in_custom_headers(compose, "Subject")) {
- str = gtk_entry_get_text(GTK_ENTRY(compose->subject_entry));
+ str = gtk_entry_get_text(GTK_ENTRY(compose->subject_entry));
+ if (*str != '\0' && !IS_IN_CUSTOM_HEADER("Subject")) {
+ Xstrdup_a(str, str, return -1);
+ g_strstrip(str);
if (*str != '\0') {
- Xstrdup_a(str, str, return -1);
- g_strstrip(str);
- if (*str != '\0') {
- compose_convert_header(buf, sizeof(buf), str,
- strlen("Subject: "));
- fprintf(fp, "Subject: %s\n", buf);
- }
+ compose_convert_header(buf, sizeof(buf), str,
+ strlen("Subject: "));
+ fprintf(fp, "Subject: %s\n", buf);
}
}
/* Message-ID */
- if (!is_in_custom_headers(compose, "Message-Id")) {
- if (compose->account->gen_msgid) {
- compose_generate_msgid(compose, buf, sizeof(buf));
- fprintf(fp, "Message-Id: <%s>\n", buf);
- compose->msgid = g_strdup(buf);
- }
+ if (compose->account->gen_msgid) {
+ compose_generate_msgid(compose, buf, sizeof(buf));
+ fprintf(fp, "Message-Id: <%s>\n", buf);
+ compose->msgid = g_strdup(buf);
}
/* In-Reply-To */
- if (!is_in_custom_headers(compose, "In-Reply-To")) {
- if (compose->inreplyto && compose->to_list)
- fprintf(fp, "In-Reply-To: <%s>\n", compose->inreplyto);
- }
+ if (compose->inreplyto && compose->to_list)
+ fprintf(fp, "In-Reply-To: <%s>\n", compose->inreplyto);
/* References */
- if (!is_in_custom_headers(compose, "References")) {
- if (compose->references)
- fprintf(fp, "References: %s\n", compose->references);
- }
+ if (compose->references)
+ fprintf(fp, "References: %s\n", compose->references);
/* Followup-To */
- if (!is_in_custom_headers(compose, "Followup-To")) {
- if (compose->use_followupto) {
- str = gtk_entry_get_text(GTK_ENTRY(compose->followup_entry));
+ if (compose->use_followupto && !IS_IN_CUSTOM_HEADER("Followup-To")) {
+ str = gtk_entry_get_text(GTK_ENTRY(compose->followup_entry));
+ if (*str != '\0') {
+ Xstrdup_a(str, str, return -1);
+ g_strstrip(str);
+ remove_space(str);
if (*str != '\0') {
- Xstrdup_a(str, str, return -1);
- g_strstrip(str);
- remove_space(str);
- if (*str != '\0') {
- compose_convert_header(buf, sizeof(buf), str,
- strlen("Followup-To: "));
- fprintf(fp, "Followup-To: %s\n", buf);
- }
+ compose_convert_header(buf, sizeof(buf), str,
+ strlen("Followup-To: "));
+ fprintf(fp, "Followup-To: %s\n", buf);
}
}
}
/* Reply-To */
- if (!is_in_custom_headers(compose, "Reply-To")) {
- if (compose->use_replyto) {
- str = gtk_entry_get_text(GTK_ENTRY(compose->reply_entry));
+ if (compose->use_replyto && !IS_IN_CUSTOM_HEADER("Reply-To")) {
+ str = gtk_entry_get_text(GTK_ENTRY(compose->reply_entry));
+ if (*str != '\0') {
+ Xstrdup_a(str, str, return -1);
+ g_strstrip(str);
if (*str != '\0') {
- Xstrdup_a(str, str, return -1);
- g_strstrip(str);
- if (*str != '\0') {
- compose_convert_header(buf, sizeof(buf), str,
- strlen("Reply-To: "));
- fprintf(fp, "Reply-To: %s\n", buf);
- }
+ compose_convert_header(buf, sizeof(buf), str,
+ strlen("Reply-To: "));
+ fprintf(fp, "Reply-To: %s\n", buf);
}
}
}
+ /* Organization */
+ if (compose->account->organization &&
+ !IS_IN_CUSTOM_HEADER("Organization")) {
+ compose_convert_header(buf, sizeof(buf),
+ compose->account->organization,
+ strlen("Organization: "));
+ fprintf(fp, "Organization: %s\n", buf);
+ }
+
/* Program version and system info */
/* uname(&utsbuf); */
- if (!is_in_custom_headers(compose, "X-Mailer")) {
- str = gtk_entry_get_text(GTK_ENTRY(compose->to_entry));
- if (*str != '\0') {
- fprintf(fp, "X-Mailer: %s (GTK+ %d.%d.%d; %s)\n",
- prog_version,
- gtk_major_version, gtk_minor_version, gtk_micro_version,
- HOST_ALIAS);
+ str = gtk_entry_get_text(GTK_ENTRY(compose->to_entry));
+ if (*str != '\0' && !IS_IN_CUSTOM_HEADER("X-Mailer")) {
+ fprintf(fp, "X-Mailer: %s (GTK+ %d.%d.%d; %s)\n",
+ prog_version,
+ gtk_major_version, gtk_minor_version, gtk_micro_version,
+ HOST_ALIAS);
/* utsbuf.sysname, utsbuf.release, utsbuf.machine); */
- }
}
-
- if (!is_in_custom_headers(compose, "X-Newsreader")) {
- str = gtk_entry_get_text(GTK_ENTRY(compose->newsgroups_entry));
- if (*str != '\0') {
+ str = gtk_entry_get_text(GTK_ENTRY(compose->newsgroups_entry));
+ if (*str != '\0' && !IS_IN_CUSTOM_HEADER("X-Newsreader")) {
fprintf(fp, "X-Newsreader: %s (GTK+ %d.%d.%d; %s)\n",
prog_version,
gtk_major_version, gtk_minor_version, gtk_micro_version,
HOST_ALIAS);
/* utsbuf.sysname, utsbuf.release, utsbuf.machine); */
- }
}
- /* Organization */
- if (!is_in_custom_headers(compose, "Organization")) {
- if (compose->account->organization) {
- compose_convert_header(buf, sizeof(buf),
- compose->account->organization,
- strlen("Organization: "));
- fprintf(fp, "Organization: %s\n", buf);
+ /* custom headers */
+ if (compose->account->add_customhdr) {
+ GSList *cur;
+
+ for (cur = compose->account->customhdr_list; cur != NULL;
+ cur = cur->next) {
+ CustomHeader *chdr = (CustomHeader *)cur->data;
+
+ if (strcasecmp(chdr->name, "Date") != 0 &&
+ strcasecmp(chdr->name, "From") != 0 &&
+ strcasecmp(chdr->name, "To") != 0 &&
+ strcasecmp(chdr->name, "Sender") != 0 &&
+ strcasecmp(chdr->name, "Message-Id") != 0 &&
+ strcasecmp(chdr->name, "In-Reply-To") != 0 &&
+ strcasecmp(chdr->name, "References") != 0 &&
+ strcasecmp(chdr->name, "Mime-Version") != 0 &&
+ strcasecmp(chdr->name, "Content-Type") != 0 &&
+ strcasecmp(chdr->name, "Content-Transfer-Encoding")
+ != 0)
+ compose_convert_header
+ (buf, sizeof(buf),
+ chdr->value ? chdr->value : "",
+ strlen(chdr->name) + 2);
+ fprintf(fp, "%s: %s\n", chdr->name, buf);
}
}
-
+
/* MIME */
- if (!is_in_custom_headers(compose, "Mime-Version")) {
- fprintf(fp, "Mime-Version: 1.0\n");
- }
-
+ fprintf(fp, "Mime-Version: 1.0\n");
if (compose->use_attach) {
get_rfc822_date(buf, sizeof(buf));
subst_char(buf, ' ', '_');
subst_char(buf, ',', '_');
compose->boundary = g_strdup_printf("Multipart_%s_%08x",
buf, (guint)compose);
- if (!is_in_custom_headers(compose, "Content-Type")) {
- fprintf(fp,
- "Content-Type: multipart/mixed;\n"
- " boundary=\"%s\"\n", compose->boundary);
- }
+ fprintf(fp,
+ "Content-Type: multipart/mixed;\n"
+ " boundary=\"%s\"\n", compose->boundary);
} else {
- if (!is_in_custom_headers(compose, "Content-Type")) {
- fprintf(fp, "Content-Type: text/plain; charset=%s\n", charset);
- }
- if (!is_in_custom_headers(compose,
- "Content-Transfer-Encoding")) {
- fprintf(fp, "Content-Transfer-Encoding: %s\n",
- procmime_get_encoding_str(encoding));
- }
+ fprintf(fp, "Content-Type: text/plain; charset=%s\n", charset);
+ fprintf(fp, "Content-Transfer-Encoding: %s\n",
+ procmime_get_encoding_str(encoding));
}
- /* Custom Headers */
- if (compose->account->add_customhdr) {
- for (cur = compose->account->customhdr_list; cur != NULL;
- cur = cur->next) {
- CustomHeader * ch = (CustomHeader *) cur->data;
- fprintf(fp, "%s: %s\n", ch->name, ch->value);
+ /* Request Return Receipt */
+ if (!IS_IN_CUSTOM_HEADER("Disposition-Notification-To")) {
+ if (compose->return_receipt) {
+ if (compose->account->name
+ && *compose->account->name) {
+ compose_convert_header(buf, sizeof(buf), compose->account->name, strlen("Disposition-Notification-To: "));
+ fprintf(fp, "Disposition-Notification-To: %s <%s>\n", buf, compose->account->address);
+ } else
+ fprintf(fp, "Disposition-Notification-To: %s\n", compose->account->address);
}
}
return 0;
}
+#undef IS_IN_CUSTOM_HEADER
+
static void compose_convert_header(gchar *dest, gint len, gchar *src,
gint header_len)
{
compose->modified = FALSE;
+ compose->return_receipt = FALSE;
+
compose->to_list = NULL;
compose->newsgroup_list = NULL;
gtk_check_menu_item_set_active
(GTK_CHECK_MENU_ITEM(menuitem), TRUE);
}
- if (account->set_autobcc && account->auto_bcc) {
- gtk_entry_set_text(GTK_ENTRY(bcc_entry), account->auto_bcc);
+ if (account->set_autobcc) {
menuitem = gtk_item_factory_get_item(ifactory, "/Message/Bcc");
gtk_check_menu_item_set_active
(GTK_CHECK_MENU_ITEM(menuitem), TRUE);
+ if (account->auto_bcc)
+ gtk_entry_set_text(GTK_ENTRY(bcc_entry),
+ account->auto_bcc);
}
- if (account->set_autoreplyto && account->auto_replyto) {
- gtk_entry_set_text(GTK_ENTRY(reply_entry),
- account->auto_replyto);
+ if (account->set_autoreplyto) {
menuitem = gtk_item_factory_get_item(ifactory,
"/Message/Reply to");
gtk_check_menu_item_set_active
(GTK_CHECK_MENU_ITEM(menuitem), TRUE);
+ if (account->auto_replyto)
+ gtk_entry_set_text(GTK_ENTRY(reply_entry),
+ account->auto_replyto);
}
menuitem = gtk_item_factory_get_item(ifactory, "/Tool/Show ruler");
gtk_widget_show_all(toolbar);
}
+#undef CREATE_TOOLBAR_ICON
+
static GtkWidget *compose_account_option_menu_create(Compose *compose)
{
GList *accounts;
attach_prop.cancel_btn = cancel_btn;
}
+#undef SET_LABEL_AND_ENTRY
+
static void attach_property_ok(GtkWidget *widget, gboolean *cancelled)
{
*cancelled = FALSE;
close(pipe_fds[0]);
if (compose_write_body_to_file(compose, tmp) < 0) {
- sock_write(pipe_fds[1], "2\n", 2);
+ fd_write(pipe_fds[1], "2\n", 2);
_exit(1);
}
pid_ed = compose_exec_ext_editor_real(tmp);
if (pid_ed < 0) {
- sock_write(pipe_fds[1], "1\n", 2);
+ fd_write(pipe_fds[1], "1\n", 2);
_exit(1);
}
/* wait until editor is terminated */
waitpid(pid_ed, NULL, 0);
- sock_write(pipe_fds[1], "0\n", 2);
+ fd_write(pipe_fds[1], "0\n", 2);
close(pipe_fds[1]);
_exit(0);
return;
}
- if (folder_item_add_msg(draft, tmp) < 0) {
+ if (folder_item_add_msg(draft, tmp, TRUE) < 0) {
unlink(tmp);
g_free(tmp);
return;
}
- unlink(tmp);
g_free(tmp);
//folderview_scan_folder_a(DRAFT_DIR, TRUE);
{
gtk_widget_grab_focus(compose->text);
}
+
+static void compose_toggle_return_receipt_cb(gpointer data, guint action,
+ GtkWidget *widget)
+{
+ Compose *compose = (Compose *)data;
+
+ if (GTK_CHECK_MENU_ITEM(widget)->active)
+ compose->return_receipt = TRUE;
+ else
+ compose->return_receipt = FALSE;
+}