const gchar *text,
gint len,
Compose *compose);
-static void compose_generic_reply(MsgInfo *msginfo, gboolean quote,
+static Compose *compose_generic_reply(MsgInfo *msginfo, gboolean quote,
gboolean to_all, gboolean to_ml,
gboolean to_sender,
gboolean followup_and_reply_to,
{N_("/_Edit/Cu_t"), "<control>X", compose_cut_cb, 0, NULL},
{N_("/_Edit/_Copy"), "<control>C", compose_copy_cb, 0, NULL},
{N_("/_Edit/_Paste"), "<control>V", compose_paste_cb, 0, NULL},
+ {N_("/_Edit/Special paste"), NULL, NULL, 0, "<Branch>"},
{N_("/_Edit/Special paste/as _quotation"),
NULL, compose_paste_as_quote_cb, 0, NULL},
{N_("/_Edit/Special paste/_wrapped"),
{
gchar *privacy = NULL;
+ g_return_if_fail(compose != NULL);
+ g_return_if_fail(account != NULL);
+
if (override_pref == FALSE && account->default_encrypt_reply == FALSE)
return;
}
}
-void compose_reply_mode(ComposeMode mode, GSList *msginfo_list, gchar *body)
+Compose *compose_reply_mode(ComposeMode mode, GSList *msginfo_list, gchar *body)
{
MsgInfo *msginfo;
guint list_len;
-
- g_return_if_fail(msginfo_list != NULL);
+ Compose *compose = NULL;
+ g_return_val_if_fail(msginfo_list != NULL, NULL);
msginfo = (MsgInfo*)g_slist_nth_data(msginfo_list, 0);
- g_return_if_fail(msginfo != NULL);
+ g_return_val_if_fail(msginfo != NULL, NULL);
list_len = g_slist_length(msginfo_list);
switch (mode) {
case COMPOSE_REPLY:
- compose_reply(msginfo, prefs_common.reply_with_quote,
+ compose = compose_reply(msginfo, prefs_common.reply_with_quote,
FALSE, prefs_common.default_reply_list, FALSE, body);
break;
case COMPOSE_REPLY_WITH_QUOTE:
- compose_reply(msginfo, TRUE, FALSE, prefs_common.default_reply_list, FALSE, body);
+ compose = compose_reply(msginfo, TRUE,
+ FALSE, prefs_common.default_reply_list, FALSE, body);
break;
case COMPOSE_REPLY_WITHOUT_QUOTE:
- compose_reply(msginfo, FALSE, FALSE, prefs_common.default_reply_list, FALSE, NULL);
+ compose = compose_reply(msginfo, FALSE,
+ FALSE, prefs_common.default_reply_list, FALSE, NULL);
break;
case COMPOSE_REPLY_TO_SENDER:
- compose_reply(msginfo, prefs_common.reply_with_quote,
+ compose = compose_reply(msginfo, prefs_common.reply_with_quote,
FALSE, FALSE, TRUE, body);
break;
case COMPOSE_FOLLOWUP_AND_REPLY_TO:
- compose_followup_and_reply_to(msginfo,
+ compose = compose_followup_and_reply_to(msginfo,
prefs_common.reply_with_quote,
FALSE, FALSE, body);
break;
case COMPOSE_REPLY_TO_SENDER_WITH_QUOTE:
- compose_reply(msginfo, TRUE, FALSE, FALSE, TRUE, body);
+ compose = compose_reply(msginfo, TRUE,
+ FALSE, FALSE, TRUE, body);
break;
case COMPOSE_REPLY_TO_SENDER_WITHOUT_QUOTE:
- compose_reply(msginfo, FALSE, FALSE, FALSE, TRUE, NULL);
+ compose = compose_reply(msginfo, FALSE,
+ FALSE, FALSE, TRUE, NULL);
break;
case COMPOSE_REPLY_TO_ALL:
- compose_reply(msginfo, prefs_common.reply_with_quote,
- TRUE, FALSE, FALSE, body);
+ compose = compose_reply(msginfo, prefs_common.reply_with_quote,
+ TRUE, FALSE, FALSE, body);
break;
case COMPOSE_REPLY_TO_ALL_WITH_QUOTE:
- compose_reply(msginfo, TRUE, TRUE, FALSE, FALSE, body);
+ compose = compose_reply(msginfo, TRUE,
+ TRUE, FALSE, FALSE, body);
break;
case COMPOSE_REPLY_TO_ALL_WITHOUT_QUOTE:
- compose_reply(msginfo, FALSE, TRUE, FALSE, FALSE, NULL);
+ compose = compose_reply(msginfo, FALSE,
+ TRUE, FALSE, FALSE, NULL);
break;
case COMPOSE_REPLY_TO_LIST:
- compose_reply(msginfo, prefs_common.reply_with_quote,
- FALSE, TRUE, FALSE, body);
+ compose = compose_reply(msginfo, prefs_common.reply_with_quote,
+ FALSE, TRUE, FALSE, body);
break;
case COMPOSE_REPLY_TO_LIST_WITH_QUOTE:
- compose_reply(msginfo, TRUE, FALSE, TRUE, FALSE, body);
+ compose = compose_reply(msginfo, TRUE,
+ FALSE, TRUE, FALSE, body);
break;
case COMPOSE_REPLY_TO_LIST_WITHOUT_QUOTE:
- compose_reply(msginfo, FALSE, FALSE, TRUE, FALSE, NULL);
+ compose = compose_reply(msginfo, FALSE,
+ FALSE, TRUE, FALSE, NULL);
break;
case COMPOSE_FORWARD:
if (prefs_common.forward_as_attachment) {
- compose_reply_mode(COMPOSE_FORWARD_AS_ATTACH, msginfo_list, body);
- return;
+ compose = compose_reply_mode(COMPOSE_FORWARD_AS_ATTACH, msginfo_list, body);
+ return compose;
} else {
- compose_reply_mode(COMPOSE_FORWARD_INLINE, msginfo_list, body);
- return;
+ compose = compose_reply_mode(COMPOSE_FORWARD_INLINE, msginfo_list, body);
+ return compose;
}
break;
case COMPOSE_FORWARD_INLINE:
/* check if we reply to more than one Message */
if (list_len == 1) {
- compose_forward(NULL, msginfo, FALSE, body, FALSE);
+ compose = compose_forward(NULL, msginfo, FALSE, body, FALSE);
break;
}
/* more messages FALL THROUGH */
case COMPOSE_FORWARD_AS_ATTACH:
- compose_forward_multiple(NULL, msginfo_list);
+ compose = compose_forward_multiple(NULL, msginfo_list);
break;
case COMPOSE_REDIRECT:
- compose_redirect(NULL, msginfo);
+ compose = compose_redirect(NULL, msginfo);
break;
default:
g_warning("compose_reply(): invalid Compose Mode: %d\n", mode);
}
+ return compose;
}
-void compose_reply(MsgInfo *msginfo, gboolean quote, gboolean to_all,
+Compose *compose_reply(MsgInfo *msginfo, gboolean quote, gboolean to_all,
gboolean to_ml, gboolean to_sender,
const gchar *body)
{
- compose_generic_reply(msginfo, quote, to_all, to_ml,
+ return compose_generic_reply(msginfo, quote, to_all, to_ml,
to_sender, FALSE, body);
}
-void compose_followup_and_reply_to(MsgInfo *msginfo, gboolean quote,
+Compose *compose_followup_and_reply_to(MsgInfo *msginfo, gboolean quote,
gboolean to_all,
gboolean to_sender,
const gchar *body)
{
- compose_generic_reply(msginfo, quote, to_all, FALSE,
+ return compose_generic_reply(msginfo, quote, to_all, FALSE,
to_sender, TRUE, body);
}
}
}
-static void compose_generic_reply(MsgInfo *msginfo, gboolean quote,
+static Compose *compose_generic_reply(MsgInfo *msginfo, gboolean quote,
gboolean to_all, gboolean to_ml,
gboolean to_sender,
gboolean followup_and_reply_to,
GtkTextIter iter;
int cursor_pos;
- 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 = account_get_reply_account(msginfo, prefs_common.reply_account_autosel);
- g_return_if_fail(account != NULL);
+ g_return_val_if_fail(account != NULL, NULL);
if (to_sender && account->protocol == A_NNTP &&
!followup_and_reply_to) {
if (!reply_account)
reply_account = compose_current_mail_account();
if (!reply_account)
- return;
+ return NULL;
} else
reply_account = account;
menu_set_sensitive(ifactory, "/Options/Remove references", TRUE);
compose->replyinfo = procmsg_msginfo_get_full_info(msginfo);
+
if (!compose->replyinfo)
compose->replyinfo = procmsg_msginfo_copy(msginfo);
-
+
compose_extract_original_charset(compose);
if (msginfo->folder && msginfo->folder->ret_rcpt)
g_free(folderidentifier);
}
- if (compose_parse_header(compose, msginfo) < 0) return;
+ if (compose_parse_header(compose, msginfo) < 0) return NULL;
compose_reply_set_entry(compose, msginfo, to_all, to_ml,
to_sender, followup_and_reply_to);
compose_show_first_last_header(compose, TRUE);
compose_exec_ext_editor(compose);
compose_set_title(compose);
+ return compose;
}
#define INSERT_FW_HEADER(var, hdr) \
GtkTextIter iter;
GSList *msginfo;
gchar *msgfile;
-
+ gboolean single_mail = TRUE;
+
g_return_val_if_fail(msginfo_list != NULL, NULL);
+ if (g_slist_length(msginfo_list) > 1)
+ single_mail = FALSE;
+
for (msginfo = msginfo_list; msginfo != NULL; msginfo = msginfo->next)
if (((MsgInfo *)msginfo->data)->folder == NULL)
return NULL;
"message/rfc822");
g_free(msgfile);
}
+
+ if (single_mail) {
+ MsgInfo *info = (MsgInfo *)msginfo_list->data;
+ if (info->subject && *info->subject) {
+ gchar *buf, *buf2, *p;
+
+ buf = p = g_strdup(info->subject);
+ p += subject_get_prefix_length(p);
+ memmove(buf, p, strlen(p) + 1);
+
+ buf2 = g_strdup_printf("Fw: %s", buf);
+ gtk_entry_set_text(GTK_ENTRY(compose->subject_entry), buf2);
+
+ g_free(buf);
+ g_free(buf2);
+ }
+ } else {
+ gtk_entry_set_text(GTK_ENTRY(compose->subject_entry),
+ _("Fw: multiple emails"));
+ }
if (account->auto_sig)
compose_insert_sig(compose, FALSE);
g_return_if_fail(msginfo != NULL);
if (compose->account->protocol != A_NNTP) {
- if (!compose->replyto && to_ml && compose->ml_post
- && !(msginfo->folder && msginfo->folder->prefs->enable_default_reply_to))
+ if (to_ml && compose->ml_post
+ && !(msginfo->folder &&
+ msginfo->folder->prefs->enable_default_reply_to)) {
compose_entry_append(compose,
compose->ml_post,
COMPOSE_TO);
+ if (compose->replyto) {
+ gchar *tmp1 = NULL, *tmp2 = NULL;
+ Xstrdup_a(tmp1, compose->replyto, return);
+ if (compose->ml_post)
+ Xstrdup_a(tmp2, compose->ml_post, return);
+ extract_address(tmp1);
+ extract_address(tmp2);
+ if (tmp1 && tmp2 && strcmp(tmp1, tmp2))
+ compose_entry_append(compose,
+ compose->replyto,
+ COMPOSE_CC);
+ }
+ }
else if (!(to_all || to_sender)
&& msginfo->folder
&& msginfo->folder->prefs->enable_default_reply_to) {
return recipient_found;
}
+static gboolean compose_check_for_set_recipients(Compose *compose)
+{
+ if (compose->account->set_autocc && compose->account->auto_cc) {
+ gboolean found_other = FALSE;
+ GSList *list;
+ /* search header entries for to and newsgroup entries */
+ for (list = compose->header_list; list; list = list->next) {
+ gchar *entry;
+ gchar *header;
+ entry = gtk_editable_get_chars(GTK_EDITABLE(((ComposeHeaderEntry *)list->data)->entry), 0, -1);
+ header = gtk_editable_get_chars(GTK_EDITABLE(GTK_COMBO(((ComposeHeaderEntry *)list->data)->combo)->entry), 0, -1);
+ g_strstrip(entry);
+ if (strcmp(entry, compose->account->auto_cc)
+ || strcmp(header, (prefs_common.trans_hdr ? gettext("Cc:") : "Cc:"))) {
+ found_other = TRUE;
+ g_free(entry);
+ break;
+ }
+ g_free(entry);
+ g_free(header);
+ }
+ if (!found_other) {
+ AlertValue aval;
+ aval = alertpanel(_("Send"),
+ _("The only recipient is the default CC address. Send anyway?"),
+ GTK_STOCK_YES, GTK_STOCK_NO, NULL);
+ if (aval != G_ALERTDEFAULT)
+ return FALSE;
+ }
+ }
+ if (compose->account->set_autobcc && compose->account->auto_bcc) {
+ gboolean found_other = FALSE;
+ GSList *list;
+ /* search header entries for to and newsgroup entries */
+ for (list = compose->header_list; list; list = list->next) {
+ gchar *entry;
+ gchar *header;
+ entry = gtk_editable_get_chars(GTK_EDITABLE(((ComposeHeaderEntry *)list->data)->entry), 0, -1);
+ header = gtk_editable_get_chars(GTK_EDITABLE(GTK_COMBO(((ComposeHeaderEntry *)list->data)->combo)->entry), 0, -1);
+ g_strstrip(entry);
+ if (strcmp(entry, compose->account->auto_cc)
+ || strcmp(header, (prefs_common.trans_hdr ? gettext("Bcc:") : "Bcc:"))) {
+ found_other = TRUE;
+ g_free(entry);
+ break;
+ }
+ g_free(entry);
+ g_free(header);
+ }
+ if (!found_other) {
+ AlertValue aval;
+ aval = alertpanel(_("Send"),
+ _("The only recipient is the default BCC address. Send anyway?"),
+ GTK_STOCK_YES, GTK_STOCK_NO, NULL);
+ if (aval != G_ALERTDEFAULT)
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+
static gboolean compose_check_entries(Compose *compose, gboolean check_subject)
{
const gchar *str;
return FALSE;
}
+ if (compose_check_for_set_recipients(compose) == FALSE) {
+ return FALSE;
+ }
+
str = gtk_entry_get_text(GTK_ENTRY(compose->subject_entry));
if (*str == '\0' && check_subject == TRUE) {
AlertValue aval;
/* protect trailing spaces when signing message */
if (action == COMPOSE_WRITE_FOR_SEND && compose->use_signing &&
privacy_system_can_sign(compose->privacy_system)) {
- if (encoding == ENC_7BIT)
- encoding = ENC_QUOTED_PRINTABLE;
- else if (encoding == ENC_8BIT)
- encoding = ENC_BASE64;
+ encoding = ENC_QUOTED_PRINTABLE;
}
/* check for line length limit */
GList *alist = amenu->next;
systemid = g_object_get_data(G_OBJECT(amenu->data), "privacy_system");
- if (systemid != NULL)
+ if (systemid != NULL) {
if (strcmp(systemid, compose->privacy_system) == 0) {
menuitem = GTK_WIDGET(amenu->data);
can_encrypt = privacy_system_can_encrypt(systemid);
found = TRUE;
break;
- }
+ }
+ } else if (strlen(compose->privacy_system) == 0) {
+ menuitem = GTK_WIDGET(amenu->data);
+
+ can_sign = FALSE;
+ can_encrypt = FALSE;
+ found = TRUE;
+ break;
+ }
amenu = alist;
}
alertpanel_warning(tmp);
g_free(tmp);
}
- }
+ }
menu_set_sensitive(ifactory, "/Options/Sign", can_sign);
menu_set_sensitive(ifactory, "/Options/Encrypt", can_encrypt);
if (compose->modified) {
val = alertpanel(_("Discard message"),
_("This message has been modified. Discard it?"),
- _("Discard"), _("Save to Drafts"), GTK_STOCK_CANCEL);
+ _("_Discard"), _("_Save to Drafts"), GTK_STOCK_CANCEL);
switch (val) {
case G_ALERTDEFAULT:
static void activate_privacy_system(Compose *compose, PrefsAccount *account, gboolean warn)
{
g_free(compose->privacy_system);
+
compose->privacy_system = g_strdup(account->default_privacy_system);
compose_update_privacy_system_menu_item(compose, warn);
}
gchar *body;
GSList *new_msglist = NULL;
MsgInfo *tmp_msginfo = NULL;
-
+ gboolean originally_enc = FALSE;
+ Compose *compose = NULL;
+
g_return_if_fail(msgview != NULL);
g_return_if_fail(msginfo_list != NULL);
if (mimeinfo != NULL && mimeinfo->type == MIMETYPE_MESSAGE &&
!g_ascii_strcasecmp(mimeinfo->subtype, "rfc822")) {
-
tmp_msginfo = procmsg_msginfo_new_from_mimeinfo(
orig_msginfo, mimeinfo);
if (tmp_msginfo != NULL) {
new_msglist = g_slist_append(NULL, tmp_msginfo);
+ if (procmime_msginfo_is_encrypted(orig_msginfo)) {
+ originally_enc = TRUE;
+ }
}
}
}
body = messageview_get_selection(msgview);
if (new_msglist) {
- compose_reply_mode((ComposeMode)action, new_msglist, body);
+ compose = compose_reply_mode((ComposeMode)action, new_msglist, body);
procmsg_msginfo_free(tmp_msginfo);
g_slist_free(new_msglist);
} else
- compose_reply_mode((ComposeMode)action, msginfo_list, body);
+ compose = compose_reply_mode((ComposeMode)action, msginfo_list, body);
+
+ if (originally_enc) {
+ compose_force_encryption(compose, compose->account, FALSE);
+ }
g_free(body);
}