X-Git-Url: http://git.claws-mail.org/?p=claws.git;a=blobdiff_plain;f=src%2Fcompose.c;h=c2c91ecd3b91913d6a98a35e71f75f2c7d54ac6f;hp=fa53ac9ffb54cd6994799f6118529f4821708777;hb=ae706ee0f7354bacac74c77f00862ddf3dc00a7a;hpb=6d56b06e24b86af8ff10f31996b66f2fe79efcd5 diff --git a/src/compose.c b/src/compose.c index fa53ac9ff..c2c91ecd3 100644 --- a/src/compose.c +++ b/src/compose.c @@ -79,6 +79,7 @@ #include "menu.h" #include "send.h" #include "news.h" +#include "customheader.h" #include "prefs_common.h" #include "prefs_account.h" #include "account.h" @@ -97,7 +98,6 @@ #include "gtkshruler.h" #include "folder.h" #include "addr_compl.h" -#include "headers.h" #if USE_GPGME # include "rfc2015.h" @@ -152,7 +152,7 @@ static void compose_attach_append (Compose *compose, static void compose_wrap_line (Compose *compose); static void compose_set_title (Compose *compose); -static gint compose_send (Compose *compose); +/* static gint compose_send (Compose *compose); */ static gint compose_write_to_file (Compose *compose, const gchar *file, gboolean is_draft); @@ -330,6 +330,8 @@ static void compose_toggle_encrypt_cb (gpointer data, 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, @@ -414,6 +416,8 @@ static GtkItemFactoryEntry compose_entries[] = {N_("/_Message/Si_gn"), NULL, compose_toggle_sign_cb, 0, ""}, {N_("/_Message/_Encrypt"), NULL, compose_toggle_encrypt_cb, 0, ""}, #endif /* USE_GPGME */ + {N_("/_Message/---"), NULL, NULL, 0, ""}, + {N_("/_Message/_Request Return Receipt"), NULL, compose_toggle_return_receipt_cb, 0, ""}, {N_("/_Tool"), NULL, NULL, 0, ""}, {N_("/_Tool/Show _ruler"), NULL, compose_toggle_ruler_cb, 0, ""}, {N_("/_Tool/_Address book"), "A", compose_address_cb, 0, NULL}, @@ -426,12 +430,12 @@ static GtkTargetEntry compose_mime_types[] = {"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; @@ -454,6 +458,8 @@ void compose_new_with_recipient(PrefsAccount *account, const gchar *to) gtk_widget_grab_focus(compose->to_entry); } else gtk_widget_grab_focus(compose->newsgroups_entry); + + return compose; } void compose_reply(MsgInfo *msginfo, gboolean quote, gboolean to_all) @@ -513,10 +519,11 @@ if (msginfo->var && *msginfo->var) { \ 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]; @@ -524,8 +531,10 @@ void compose_forward(MsgInfo *msginfo, gboolean as_attach) g_return_if_fail(msginfo != NULL); g_return_if_fail(msginfo->folder != NULL); - account = msginfo->folder->folder->account; - if (!account) account = cur_account; + if (account == NULL) { + account = msginfo->folder->folder->account; + if (!account) account = cur_account; + } g_return_if_fail(account != NULL); MSG_UNSET_FLAGS(msginfo->flags, MSG_REPLIED); @@ -586,8 +595,12 @@ void compose_forward(MsgInfo *msginfo, gboolean as_attach) 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; @@ -645,6 +658,9 @@ void compose_entry_append(Compose *compose, const gchar *address, 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); @@ -1164,6 +1180,8 @@ static void compose_reedit_set_entry(Compose *compose, MsgInfo *msginfo) } } +#undef SET_ENTRY + static void compose_insert_sig(Compose *compose) { gchar *sigfile; @@ -1369,7 +1387,7 @@ static void compose_set_title(Compose *compose) g_free(str); } -static gint compose_send(Compose *compose) +gint compose_send(Compose *compose) { gchar tmp[MAXPATHLEN + 1]; gchar *to, *newsgroups; @@ -1477,7 +1495,7 @@ static gint compose_send(Compose *compose) (_("Can't save the message to outbox.")); } - if (unlink(tmp) < 0) FILE_OP_ERROR(tmp, "unlink"); + unlink(tmp); lock = FALSE; return ok; } @@ -1657,12 +1675,15 @@ static gint compose_save_to_outbox(Compose *compose, const gchar *file) outbox = folder_get_default_outbox(); folder_item_scan(outbox); - if ((num = folder_item_add_msg(outbox, file)) < 0) { + if ((num = folder_item_add_msg(outbox, file, FALSE)) < 0) { g_warning(_("can't save message\n")); return -1; } path = folder_item_get_path(outbox); + if (!is_dir_exist(path)) + make_dir_hier(path); + if ((fp = procmsg_open_mark_file(path, TRUE)) == NULL) g_warning(_("can't open mark file\n")); else { @@ -1761,16 +1782,18 @@ static gint compose_queue(Compose *compose, const gchar *file) queue = folder_get_default_queue(); folder_item_scan(queue); - if ((num = folder_item_add_msg(queue, tmp)) < 0) { + if ((num = folder_item_add_msg(queue, tmp, TRUE)) < 0) { g_warning(_("can't queue the message\n")); unlink(tmp); g_free(tmp); return -1; } - unlink(tmp); g_free(tmp); queue_path = folder_item_get_path(queue); + if (!is_dir_exist(queue_path)) + make_dir_hier(queue_path); + if ((fp = procmsg_open_mark_file(queue_path, TRUE)) == NULL) g_warning(_("can't open mark file\n")); else { @@ -1858,20 +1881,9 @@ static void compose_write_attach(Compose *compose, FILE *fp) 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, @@ -1880,7 +1892,6 @@ static gint compose_write_headers(Compose *compose, FILE *fp, 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); @@ -1888,24 +1899,23 @@ static gint compose_write_headers(Compose *compose, FILE *fp, 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; @@ -1919,15 +1929,16 @@ static gint compose_write_headers(Compose *compose, FILE *fp, 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; @@ -1942,9 +1953,9 @@ static gint compose_write_headers(Compose *compose, FILE *fp, 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); } } @@ -1962,15 +1973,16 @@ static gint compose_write_headers(Compose *compose, FILE *fp, 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)); @@ -1984,150 +1996,149 @@ static gint compose_write_headers(Compose *compose, FILE *fp, 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); } } @@ -2137,6 +2148,8 @@ static gint compose_write_headers(Compose *compose, FILE *fp, return 0; } +#undef IS_IN_CUSTOM_HEADER + static void compose_convert_header(gchar *dest, gint len, gchar *src, gint header_len) { @@ -2636,6 +2649,8 @@ static Compose *compose_create(PrefsAccount *account) compose->modified = FALSE; + compose->return_receipt = FALSE; + compose->to_list = NULL; compose->newsgroup_list = NULL; @@ -2662,19 +2677,22 @@ static Compose *compose_create(PrefsAccount *account) 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"); @@ -2833,6 +2851,8 @@ static void compose_toolbar_create(Compose *compose, GtkWidget *container) gtk_widget_show_all(toolbar); } +#undef CREATE_TOOLBAR_ICON + static GtkWidget *compose_account_option_menu_create(Compose *compose) { GList *accounts; @@ -3163,6 +3183,8 @@ static void compose_attach_property_create(gboolean *cancelled) attach_prop.cancel_btn = cancel_btn; } +#undef SET_LABEL_AND_ENTRY + static void attach_property_ok(GtkWidget *widget, gboolean *cancelled) { *cancelled = FALSE; @@ -3653,13 +3675,12 @@ static void compose_draft_cb(gpointer data, guint action, GtkWidget *widget) 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); @@ -4087,3 +4108,14 @@ static void followupto_activated(GtkWidget *widget, Compose *compose) { 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; +}