/*
* Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999,2000 Hiroyuki Yamamoto
+ * Copyright (C) 1999-2001 Hiroyuki Yamamoto
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
# include "rfc2015.h"
#endif
+#include "quote_fmt.h"
+
typedef enum
{
COL_MIMETYPE = 0,
const gchar *fmt);
static void compose_reply_set_entry (Compose *compose,
MsgInfo *msginfo,
- gboolean to_all);
+ gboolean to_all,
+ gboolean to_sender,
+ gboolean
+ followup_and_reply_to);
static void compose_reedit_set_entry (Compose *compose,
MsgInfo *msginfo);
static void compose_insert_sig (Compose *compose);
static void compose_attach_append (Compose *compose,
const gchar *file,
ContentType cnttype);
+static void compose_attach_append_with_type(Compose *compose,
+ const gchar *file,
+ const gchar *type,
+ ContentType cnttype);
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);
static void toolbar_address_cb (GtkWidget *widget,
gpointer data);
+static void select_account(Compose * compose, PrefsAccount * ac);
static void account_activated (GtkMenuItem *menuitem,
gpointer data);
Compose *compose);
static void followupto_activated (GtkWidget *widget,
Compose *compose);
+static void compose_attach_parts(Compose * compose,
+ MsgInfo * msginfo);
+
+static gchar *compose_quote_fmt (Compose *compose,
+ MsgInfo *msginfo,
+ const gchar *fmt,
+ const gchar * qmark);
+
+static void compose_generic_reply(MsgInfo *msginfo, gboolean quote,
+ gboolean to_all,
+ gboolean ignore_replyto,
+ gboolean followup_and_reply_to);
static GtkItemFactoryEntry compose_popup_entries[] =
{
{"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->subject_entry);
} else
gtk_widget_grab_focus(compose->to_entry);
- } else
- gtk_widget_grab_focus(compose->newsgroups_entry);
+ } else {
+ if (to) {
+ compose_entry_append(compose, to, COMPOSE_NEWSGROUPS);
+ gtk_widget_grab_focus(compose->subject_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)
+/*
+Compose * compose_new_followup_and_replyto(PrefsAccount *account,
+ const gchar *followupto, gchar * to)
+{
+ Compose *compose;
+
+ if (!account) account = cur_account;
+ g_return_val_if_fail(account != NULL, NULL);
+ g_return_val_if_fail(account->protocol != A_NNTP, NULL);
+
+ compose = compose_create(account);
+ compose->mode = COMPOSE_NEW;
+
+ if (prefs_common.auto_sig)
+ compose_insert_sig(compose);
+ gtk_editable_set_position(GTK_EDITABLE(compose->text), 0);
+ gtk_stext_set_point(GTK_STEXT(compose->text), 0);
+
+ compose_entry_append(compose, to, COMPOSE_TO);
+ compose_entry_append(compose, followupto, COMPOSE_NEWSGROUPS);
+ gtk_widget_grab_focus(compose->subject_entry);
+
+ return compose;
+}
+*/
+
+void compose_reply(MsgInfo *msginfo, gboolean quote, gboolean to_all,
+ gboolean ignore_replyto)
+{
+ compose_generic_reply(msginfo, quote, to_all, ignore_replyto, FALSE);
+}
+
+void compose_followup_and_reply_to(MsgInfo *msginfo, gboolean quote,
+ gboolean to_all,
+ gboolean ignore_replyto)
+{
+ compose_generic_reply(msginfo, quote, to_all, ignore_replyto, TRUE);
+}
+
+static void compose_generic_reply(MsgInfo *msginfo, gboolean quote,
+ gboolean to_all,
+ gboolean ignore_replyto,
+ gboolean followup_and_reply_to)
{
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 (ignore_replyto && account->protocol == A_NNTP &&
+ !followup_and_reply_to) {
+ 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 (followup_and_reply_to) {
+ gtk_widget_show(compose->to_hbox);
+ gtk_widget_show(compose->to_entry);
+ gtk_table_set_row_spacing(GTK_TABLE(compose->table), 1, 4);
+ compose->use_to = TRUE;
+ }
+
if (compose_parse_header(compose, msginfo) < 0) return;
- compose_reply_set_entry(compose, msginfo, to_all);
+ compose_reply_set_entry(compose, msginfo, to_all, ignore_replyto,
+ followup_and_reply_to);
text = GTK_STEXT(compose->text);
gtk_stext_freeze(text);
if ((fp = procmime_get_text_part(msginfo)) == NULL)
g_warning(_("Can't get text part\n"));
else {
+ gchar * qmark;
+
+ if (prefs_common.quotemark && *prefs_common.quotemark)
+ qmark = prefs_common.quotemark;
+ else
+ qmark = "> ";
+
+ quote_str = compose_quote_fmt(compose, msginfo,
+ prefs_common.quotefmt,
+ qmark);
+
+ /*
quote_str = compose_quote_parse_fmt
(compose, msginfo, prefs_common.quotefmt);
- gtk_stext_insert(text, NULL, NULL, NULL, quote_str, -1);
- g_free(quote_str);
- compose_quote_file(compose, msginfo, fp);
+ */
+
+ if (quote_str != NULL)
+ gtk_stext_insert(text, NULL, NULL, NULL,
+ quote_str, -1);
+ /* g_free(quote_str); */
+ /* compose_quote_file(compose, msginfo, fp); */
fclose(fp);
}
}
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){
+ filename = g_strdup_printf("%s%smimetmp%i.html",
+ get_mime_tmp_dir(),
+ G_DIR_SEPARATOR_S,
+ mimeinfo);
+ return filename;
+ }
+ else {
+ base = base ? base : "";
+ base = g_basename(base);
+ if (*base == '\0') {
+ filename = g_strdup_printf("%s%smimetmp%i",
+ get_mime_tmp_dir(),
+ G_DIR_SEPARATOR_S,
+ mimeinfo);
+ return filename;
+ }
+ }
+
+ 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 (mimeinfo->mime_type == MIME_TEXT)
+ 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_with_type(compose, filename,
+ mimeinfo->content_type,
+ mimeinfo->mime_type);
+
+ g_free(filename);
+ }
+
+ if (mimeinfo->sub && mimeinfo->sub->children)
+ {
+ filename = mime_extract_file(source, mimeinfo->sub);
+
+ compose_attach_append_with_type(compose, filename,
+ mimeinfo->content_type,
+ 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_with_type(compose, filename,
+ child->content_type,
+ 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 = cur_account;
+ /*
+ 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;
g_free(msgfile);
} else {
+ FILE *fp;
+ gchar *quote_str;
+
if ((fp = procmime_get_text_part(msginfo)) == NULL)
g_warning(_("Can't get text part\n"));
else {
- /* insert header */
- gtk_stext_insert(text, NULL, NULL, NULL,
- _("\n\nBegin forwarded message:\n\n"), -1);
- INSERT_FW_HEADER(date, "Date: ");
- INSERT_FW_HEADER(from, "From: ");
- INSERT_FW_HEADER(to, "To: ");
- INSERT_FW_HEADER(newsgroups, "Newsgroups: ");
- INSERT_FW_HEADER(subject, "Subject: ");
- gtk_stext_insert(text, NULL, NULL, NULL, "\n\n", 2);
-
- /* forward body */
- while (fgets(buf, sizeof(buf), fp) != NULL)
+ gchar * qmark;
+
+ if (prefs_common.fw_quotemark &&
+ *prefs_common.fw_quotemark)
+ qmark = prefs_common.fw_quotemark;
+ else
+ qmark = "> ";
+
+ quote_str = compose_quote_fmt(compose, msginfo,
+ prefs_common.fw_quotefmt,
+ qmark);
+
+ if (quote_str != NULL)
gtk_stext_insert(text, NULL, NULL, NULL,
- buf, -1);
+ quote_str, -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
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);
return new_ref_str;
}
+/*
static void compose_quote_file(Compose *compose, MsgInfo *msginfo, FILE *fp)
{
GtkSText *text = GTK_STEXT(compose->text);
gint str_len;
gint ch_len;
- /* if (prefs_common.enable_color) qcolor = "e_color; */
+ // if (prefs_common.enable_color) qcolor = "e_color;
if (prefs_common.quotemark && *prefs_common.quotemark)
qmark = prefs_common.quotemark;
else
g_free(quote_str);
}
+*/
+/*
static gchar *compose_quote_parse_fmt(Compose *compose, MsgInfo *msginfo,
const gchar *fmt)
{
str = msginfo->from;
sp++;
break;
- case 'I': /* initial */
+ case 'I':
if (!msginfo->fromname) {sp++; break;}
p = msginfo->fromname;
tmp[0] = tmp[1] = tmp[2] = '\0';
return ext_str;
}
+*/
static void compose_reply_set_entry(Compose *compose, MsgInfo *msginfo,
- gboolean to_all)
+ gboolean to_all, gboolean ignore_replyto,
+ gboolean followup_and_reply_to)
{
GSList *cc_list;
GSList *cur;
g_return_if_fail(compose->account != NULL);
g_return_if_fail(msginfo != NULL);
- if (compose->account->protocol != A_NNTP)
+ if ((compose->account->protocol != A_NNTP) || followup_and_reply_to)
gtk_entry_set_text(GTK_ENTRY(compose->to_entry),
- compose->replyto ? compose->replyto
- : msginfo->from ? msginfo->from : "");
+ ( (compose->replyto && !ignore_replyto)
+ ? 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
fclose(fp);
}
+static void compose_attach_info(Compose * compose, AttachInfo * ainfo,
+ ContentType cnttype)
+{
+ gchar *text[N_ATTACH_COLS];
+ gint row;
+
+ text[COL_MIMETYPE] = ainfo->content_type;
+ text[COL_SIZE] = to_human_readable(ainfo->size);
+ text[COL_NAME] = ainfo->name;
+
+ row = gtk_clist_append(GTK_CLIST(compose->attach_clist), text);
+ gtk_clist_set_row_data(GTK_CLIST(compose->attach_clist), row, ainfo);
+
+ if (cnttype != MIME_MESSAGE_RFC822)
+ compose_changed_cb(NULL, compose);
+}
+
+static void compose_attach_append_with_type(Compose *compose,
+ const gchar *file,
+ const gchar *type,
+ ContentType cnttype)
+{
+ AttachInfo *ainfo;
+ off_t size;
+
+ if (!is_file_exist(file)) {
+ g_warning(_("File %s doesn't exist\n"), file);
+ return;
+ }
+ if ((size = get_file_size(file)) < 0) {
+ g_warning(_("Can't get file size of %s\n"), file);
+ return;
+ }
+ if (size == 0) {
+ alertpanel_notice(_("File %s is empty\n"), file);
+ return;
+ }
+
+ if (!compose->use_attach) {
+ GtkItemFactory *ifactory;
+ GtkWidget *menuitem;
+
+ ifactory = gtk_item_factory_from_widget(compose->menubar);
+ menuitem = gtk_item_factory_get_item(ifactory,
+ "/Message/Attach");
+ gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem),
+ TRUE);
+ }
+
+ ainfo = g_new0(AttachInfo, 1);
+ ainfo->file = g_strdup(file);
+
+ if (cnttype == MIME_MESSAGE_RFC822) {
+ ainfo->encoding = ENC_7BIT;
+ ainfo->name = g_strdup_printf(_("Message: %s"),
+ g_basename(file));
+ } else {
+ ainfo->encoding = ENC_BASE64;
+ ainfo->name = g_strdup(g_basename(file));
+ }
+
+ ainfo->content_type = g_strdup(type);
+ ainfo->size = size;
+
+ compose_attach_info(compose, ainfo, cnttype);
+}
+
static void compose_attach_append(Compose *compose, const gchar *file,
ContentType cnttype)
{
}
ainfo->size = size;
- text[COL_MIMETYPE] = ainfo->content_type;
- text[COL_SIZE] = to_human_readable(size);
- text[COL_NAME] = ainfo->name;
-
- row = gtk_clist_append(GTK_CLIST(compose->attach_clist), text);
- gtk_clist_set_row_data(GTK_CLIST(compose->attach_clist), row, ainfo);
-
- if (cnttype != MIME_MESSAGE_RFC822)
- compose_changed_cb(NULL, compose);
+ compose_attach_info(compose, ainfo, cnttype);
}
static void compose_wrap_line(Compose *compose)
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;
if (compose->to_list) {
PrefsAccount *ac;
+ /*
if (compose->account->protocol != A_NNTP)
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;
}
}
+ */
+ ac = compose->account;
+
ok = send_message(tmp, ac, compose->to_list);
statusbar_pop_all();
}
(compose, fp, out_codeset, encoding, is_draft) < 0) {
g_warning(_("can't write headers\n"));
fclose(fp);
- unlink(file);
+ /* unlink(file); */
g_free(buf);
return -1;
}
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, 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);
+ 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;
}
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 {
/* header labels and entries */
compose_add_entry_field(table, &to_hbox, &to_entry, &count,
"To:", TRUE);
+ gtk_table_set_row_spacing(GTK_TABLE(table), 0, 4);
compose_add_entry_field(table, &newsgroups_hbox, &newsgroups_entry,
&count, "Newsgroups:", FALSE);
+ gtk_table_set_row_spacing(GTK_TABLE(table), 1, 4);
compose_add_entry_field(table, &hbox, &subject_entry, &count,
"Subject:", FALSE);
+ gtk_table_set_row_spacing(GTK_TABLE(table), 2, 4);
compose_add_entry_field(table, &cc_hbox, &cc_entry, &count,
"Cc:", TRUE);
+ gtk_table_set_row_spacing(GTK_TABLE(table), 3, 4);
compose_add_entry_field(table, &bcc_hbox, &bcc_entry, &count,
"Bcc:", TRUE);
+ gtk_table_set_row_spacing(GTK_TABLE(table), 4, 4);
compose_add_entry_field(table, &reply_hbox, &reply_entry, &count,
"Reply-To:", TRUE);
+ gtk_table_set_row_spacing(GTK_TABLE(table), 5, 4);
compose_add_entry_field(table, &followup_hbox, &followup_entry, &count,
"Followup-To:", FALSE);
+ gtk_table_set_row_spacing(GTK_TABLE(table), 6, 4);
gtk_table_set_col_spacings(GTK_TABLE(table), 4);
menu_set_sensitive(ifactory, "/Edit/Undo", FALSE);
menu_set_sensitive(ifactory, "/Edit/Redo", FALSE);
- gtk_widget_hide(bcc_hbox);
- gtk_widget_hide(bcc_entry);
- gtk_widget_hide(reply_hbox);
- gtk_widget_hide(reply_entry);
- gtk_widget_hide(followup_hbox);
- gtk_widget_hide(followup_entry);
- gtk_widget_hide(ruler_hbox);
- gtk_table_set_row_spacing(GTK_TABLE(table), 4, 0);
- gtk_table_set_row_spacing(GTK_TABLE(table), 5, 0);
- gtk_table_set_row_spacing(GTK_TABLE(table), 6, 0);
-
+ /*
if (account->protocol == A_NNTP) {
gtk_widget_hide(to_hbox);
gtk_widget_hide(to_entry);
gtk_widget_hide(newsgroups_hbox);
gtk_widget_hide(newsgroups_entry);
gtk_table_set_row_spacing(GTK_TABLE(table), 2, 0);
+
menu_set_sensitive(ifactory, "/Message/Followup to", FALSE);
}
+ */
switch (prefs_common.toolbar_style) {
case TOOLBAR_NONE:
compose->msgid = NULL;
compose->boundary = NULL;
- compose->use_to = FALSE;
- compose->use_cc = FALSE;
- compose->use_bcc = FALSE;
- compose->use_replyto = FALSE;
- compose->use_followupto = FALSE;
- compose->use_attach = FALSE;
-
#if USE_GPGME
compose->use_signing = FALSE;
compose->use_encryption = FALSE;
compose_set_title(compose);
+ compose->use_bcc = FALSE;
+ compose->use_replyto = FALSE;
+ compose->use_followupto = FALSE;
+
+ /*
if (account->protocol != A_NNTP) {
menuitem = gtk_item_factory_get_item(ifactory, "/Message/To");
gtk_check_menu_item_set_active
(GTK_CHECK_MENU_ITEM(menuitem), TRUE);
gtk_widget_set_sensitive(menuitem, FALSE);
}
+ */
if (account->set_autocc && account->auto_cc) {
+ compose->use_cc = TRUE;
gtk_entry_set_text(GTK_ENTRY(cc_entry), account->auto_cc);
menuitem = gtk_item_factory_get_item(ifactory, "/Message/Cc");
gtk_check_menu_item_set_active
(GTK_CHECK_MENU_ITEM(menuitem), TRUE);
}
+
if (account->set_autobcc) {
+ compose->use_bcc = TRUE;
menuitem = gtk_item_factory_get_item(ifactory, "/Message/Bcc");
gtk_check_menu_item_set_active
(GTK_CHECK_MENU_ITEM(menuitem), TRUE);
account->auto_bcc);
}
if (account->set_autoreplyto) {
+ compose->use_replyto = TRUE;
menuitem = gtk_item_factory_get_item(ifactory,
"/Message/Reply to");
gtk_check_menu_item_set_active
compose_list = g_list_append(compose_list, compose);
+ /*
+ compose->use_to = FALSE;
+ compose->use_cc = FALSE;
+ */
+ compose->use_attach = FALSE;
+
+ if (!compose->use_bcc) {
+ gtk_widget_hide(bcc_hbox);
+ gtk_widget_hide(bcc_entry);
+ gtk_table_set_row_spacing(GTK_TABLE(table), 4, 0);
+ }
+ if (!compose->use_replyto) {
+ gtk_widget_hide(reply_hbox);
+ gtk_widget_hide(reply_entry);
+ gtk_table_set_row_spacing(GTK_TABLE(table), 5, 0);
+ }
+ if (!compose->use_followupto) {
+ gtk_widget_hide(followup_hbox);
+ gtk_widget_hide(followup_entry);
+ gtk_table_set_row_spacing(GTK_TABLE(table), 6, 0);
+ }
+ gtk_widget_hide(ruler_hbox);
+
+
+ select_account(compose, account);
+
return compose;
}
compose_address_cb(data, 0, NULL);
}
+static void select_account(Compose * compose, PrefsAccount * ac)
+{
+ compose->account = ac;
+ compose_set_title(compose);
+
+ if (ac->protocol == A_NNTP) {
+ GtkItemFactory *ifactory;
+ GtkWidget *menuitem;
+
+ ifactory = gtk_item_factory_from_widget(compose->menubar);
+ menu_set_sensitive(ifactory,
+ "/Message/Followup to", TRUE);
+
+ gtk_widget_show(compose->newsgroups_hbox);
+ gtk_widget_show(compose->newsgroups_entry);
+ gtk_table_set_row_spacing(GTK_TABLE(compose->table),
+ 1, 4);
+
+ compose->use_to = FALSE;
+ compose->use_cc = FALSE;
+
+ menuitem = gtk_item_factory_get_item(ifactory, "/Message/To");
+ gtk_check_menu_item_set_active
+ (GTK_CHECK_MENU_ITEM(menuitem), FALSE);
+ menu_set_sensitive(ifactory,
+ "/Message/To", TRUE);
+ menuitem = gtk_item_factory_get_item(ifactory, "/Message/Cc");
+ gtk_check_menu_item_set_active
+ (GTK_CHECK_MENU_ITEM(menuitem), FALSE);
+
+ gtk_widget_hide(compose->to_hbox);
+ gtk_widget_hide(compose->to_entry);
+ gtk_widget_hide(compose->cc_hbox);
+ gtk_widget_hide(compose->cc_entry);
+
+ gtk_table_set_row_spacing(GTK_TABLE(compose->table),
+ 0, 0);
+ gtk_table_set_row_spacing(GTK_TABLE(compose->table),
+ 3, 0);
+ }
+ else {
+ GtkItemFactory *ifactory;
+ GtkWidget *menuitem;
+
+ ifactory = gtk_item_factory_from_widget(compose->menubar);
+ menu_set_sensitive(ifactory,
+ "/Message/Followup to", FALSE);
+
+ gtk_entry_set_text(GTK_ENTRY(compose->newsgroups_entry), "");
+ gtk_widget_hide(compose->newsgroups_hbox);
+ gtk_widget_hide(compose->newsgroups_entry);
+ gtk_table_set_row_spacing(GTK_TABLE(compose->table),
+ 1, 0);
+
+ compose->use_to = TRUE;
+ compose->use_cc = TRUE;
+
+ menuitem = gtk_item_factory_get_item(ifactory, "/Message/To");
+ gtk_check_menu_item_set_active
+ (GTK_CHECK_MENU_ITEM(menuitem), TRUE);
+ menu_set_sensitive(ifactory,
+ "/Message/To", FALSE);
+ menuitem = gtk_item_factory_get_item(ifactory, "/Message/Cc");
+ gtk_check_menu_item_set_active
+ (GTK_CHECK_MENU_ITEM(menuitem), TRUE);
+
+ gtk_widget_show(compose->to_hbox);
+ gtk_widget_show(compose->to_entry);
+ gtk_widget_show(compose->cc_hbox);
+ gtk_widget_show(compose->cc_entry);
+
+ gtk_table_set_row_spacing(GTK_TABLE(compose->table),
+ 0, 4);
+ gtk_table_set_row_spacing(GTK_TABLE(compose->table),
+ 3, 4);
+ }
+ gtk_widget_queue_resize(compose->table_vbox);
+}
+
static void account_activated(GtkMenuItem *menuitem, gpointer data)
{
Compose *compose = (Compose *)data;
ac = (PrefsAccount *)gtk_object_get_user_data(GTK_OBJECT(menuitem));
g_return_if_fail(ac != NULL);
- if (ac != compose->account) {
- compose->account = ac;
- compose_set_title(compose);
- }
+ if (ac != compose->account)
+ select_account(compose, ac);
}
static void attach_selected(GtkCList *clist, gint row, gint column,
else
compose->return_receipt = FALSE;
}
+
+static gchar *compose_quote_fmt (Compose *compose,
+ MsgInfo *msginfo,
+ const gchar *fmt,
+ const gchar *qmark)
+{
+ gchar * quote_str = NULL;
+
+ if (qmark != NULL) {
+ gchar * p;
+
+ quote_fmt_init(msginfo, NULL);
+ quote_fmt_scan_string(qmark);
+ quote_fmtparse();
+
+ p = quote_fmt_get_buffer();
+ if (p == NULL) {
+ alertpanel_error
+ (_("Quote mark format error."));
+ }
+ else {
+ quote_str = alloca(strlen(p) + 1);
+ strcpy(quote_str, p);
+ }
+ }
+
+ quote_fmt_init(msginfo, quote_str);
+ quote_fmt_scan_string(fmt);
+ quote_fmtparse();
+
+ if (quote_fmt_get_buffer() == NULL)
+ alertpanel_error
+ (_("Message reply/forward format error."));
+
+ return quote_fmt_get_buffer();
+}