#include "menu.h"
#include "send.h"
#include "news.h"
+#include "customheader.h"
#include "prefs_common.h"
#include "prefs_account.h"
#include "account.h"
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);
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,
{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;
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)
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);
- 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);
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;
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);
}
}
+#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)
+gint compose_send(Compose *compose)
{
gchar tmp[MAXPATHLEN + 1];
gchar *to, *newsgroups;
(_("Can't save the message to outbox."));
}
- if (unlink(tmp) < 0) FILE_OP_ERROR(tmp, "unlink");
+ unlink(tmp);
lock = FALSE;
return ok;
}
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 {
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 {
fprintf(fp, "\n--%s--\n", compose->boundary);
}
+#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,
gboolean is_draft)
get_rfc822_date(buf, sizeof(buf));
fprintf(fp, "Date: %s\n", buf);
}
-
+
/* 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);
- } else
- fprintf(fp, "From: %s\n", compose->account->address);
-
+ 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);
+ } 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: "));
- fprintf(fp, "To: %s\n", buf);
+ 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: "));
- fprintf(fp, "Newsgroups: %s\n", buf);
+ 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: "));
- fprintf(fp, "Cc: %s\n", buf);
+ 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));
/* Subject */
str = gtk_entry_get_text(GTK_ENTRY(compose->subject_entry));
- if (*str != '\0') {
+ if (*str != '\0' && !IS_IN_CUSTOM_HEADER("Subject")) {
Xstrdup_a(str, str, return -1);
g_strstrip(str);
if (*str != '\0') {
fprintf(fp, "References: %s\n", compose->references);
/* Followup-To */
- if (compose->use_followupto) {
+ 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);
}
/* Reply-To */
- if (compose->use_replyto) {
+ 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);
}
}
+ /* 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); */
str = gtk_entry_get_text(GTK_ENTRY(compose->to_entry));
- if (*str != '\0') {
+ 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,
/* utsbuf.sysname, utsbuf.release, utsbuf.machine); */
}
str = gtk_entry_get_text(GTK_ENTRY(compose->newsgroups_entry));
- if (*str != '\0') {
+ 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,
/* utsbuf.sysname, utsbuf.release, utsbuf.machine); */
}
- /* 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 */
fprintf(fp, "Mime-Version: 1.0\n");
if (compose->use_attach) {
procmime_get_encoding_str(encoding));
}
+ /* 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);
+ }
+ }
+
/* separator between header and body */
fputs("\n", fp);
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;
+}