fix bug 4134, ''Save message to' option not set when it should be'
[claws.git] / src / compose.c
index 1344b2b77fa7936ea5451be4001f1feb140f008c..8d8e097ba6297aaaeded967f411066745aa96d02 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Claws Mail -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2016 Hiroyuki Yamamoto and the Claws Mail team
+ * Copyright (C) 1999-2018 the Claws Mail team and 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 "autofaces.h"
 #include "spell_entry.h"
 #include "headers.h"
-#include "claws_io.h"
+#include "file-utils.h"
 
 #ifdef USE_LDAP
 #include "password.h"
@@ -1010,6 +1010,13 @@ Compose *compose_generic_new(PrefsAccount *account, const gchar *mailto, FolderI
        compose = compose_create(account, item, COMPOSE_NEW, FALSE);
        compose_apply_folder_privacy_settings(compose, item);
 
+       if (privacy_system_can_sign(compose->privacy_system) == FALSE &&
+           (account->default_encrypt || account->default_sign))
+               alertpanel_error(_("You have opted to sign and/or encrypt this "
+                                  "message but have not selected a privacy system.\n\n"
+                                  "Signing and encrypting have been disabled for this "
+                                  "message."));
+
        /* override from name if mailto asked for it */
        if (mailto_from) {
                gtk_entry_set_text(GTK_ENTRY(compose->from_name), mailto_from);
@@ -1201,7 +1208,8 @@ Compose *compose_generic_new(PrefsAccount *account, const gchar *mailto, FolderI
        if (item && item->prefs && item->prefs->save_copy_to_folder) {
                gchar *folderidentifier;
 
-               gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(compose->savemsg_checkbtn), prefs_common.savemsg);
+               gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(compose->savemsg_checkbtn), TRUE);
+               gtk_widget_set_sensitive(GTK_WIDGET(compose->savemsg_combo), TRUE);
                folderidentifier = folder_item_get_identifier(item);
                compose_set_save_to(compose, folderidentifier);
                g_free(folderidentifier);
@@ -1273,7 +1281,8 @@ static void compose_force_encryption(Compose *compose, PrefsAccount *account,
        cm_return_if_fail(compose != NULL);
        cm_return_if_fail(account != NULL);
 
-       if (override_pref == FALSE && account->default_encrypt_reply == FALSE)
+       if (privacy_system_can_encrypt(compose->privacy_system) == FALSE ||
+           (override_pref == FALSE && account->default_encrypt_reply == FALSE))
                return;
 
        if (account->default_privacy_system && strlen(account->default_privacy_system))
@@ -1310,6 +1319,8 @@ static void compose_force_encryption(Compose *compose, PrefsAccount *account,
 static void compose_force_signing(Compose *compose, PrefsAccount *account, const gchar *system)
 {
        const gchar *privacy = NULL;
+       if (privacy_system_can_sign(compose->privacy_system) == FALSE)
+               return;
 
        if (account->default_privacy_system && strlen(account->default_privacy_system))
                privacy = account->default_privacy_system;
@@ -1580,6 +1591,7 @@ static Compose *compose_generic_reply(MsgInfo *msginfo,
                gchar *folderidentifier;
 
                gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(compose->savemsg_checkbtn), TRUE);
+               gtk_widget_set_sensitive(GTK_WIDGET(compose->savemsg_combo), TRUE);
                folderidentifier = folder_item_get_identifier(msginfo->folder);
                compose_set_save_to(compose, folderidentifier);
                g_free(folderidentifier);
@@ -1679,6 +1691,14 @@ static Compose *compose_generic_reply(MsgInfo *msginfo,
        }
        g_free(s_system);
 
+       if (privacy_system_can_sign(compose->privacy_system) == FALSE &&
+           ((account->default_encrypt_reply && MSG_IS_ENCRYPTED(compose->replyinfo->flags)) ||
+            (account->default_sign_reply && MSG_IS_SIGNED(compose->replyinfo->flags))))
+               alertpanel_error(_("You have opted to sign and/or encrypt this "
+                                  "message but have not selected a privacy system.\n\n"
+                                  "Signing and encrypting have been disabled for this "
+                                  "message."));
+
        SIGNAL_BLOCK(textbuf);
        
        if (account->auto_sig)
@@ -1896,6 +1916,7 @@ Compose *compose_forward(PrefsAccount *account, MsgInfo *msginfo,
                gchar *folderidentifier;
 
                gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(compose->savemsg_checkbtn), TRUE);
+               gtk_widget_set_sensitive(GTK_WIDGET(compose->savemsg_combo), TRUE);
                folderidentifier = folder_item_get_identifier(msginfo->folder);
                compose_set_save_to(compose, folderidentifier);
                g_free(folderidentifier);
@@ -2386,6 +2407,7 @@ Compose *compose_reedit(MsgInfo *msginfo, gboolean batch)
                /* Set message save folder */
                if (!procheader_get_header_from_msginfo(msginfo, &queueheader_buf, "SCF:")) {
                        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(compose->savemsg_checkbtn), TRUE);
+                       gtk_widget_set_sensitive(GTK_WIDGET(compose->savemsg_combo), TRUE);
                        compose_set_save_to(compose, &queueheader_buf[4]);
                        g_free(queueheader_buf);
                }
@@ -2526,7 +2548,8 @@ Compose *compose_redirect(PrefsAccount *account, MsgInfo *msginfo,
        if (item && item->prefs && item->prefs->save_copy_to_folder) {
                gchar *folderidentifier;
 
-               gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(compose->savemsg_checkbtn), prefs_common.savemsg);
+               gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(compose->savemsg_checkbtn), TRUE);
+               gtk_widget_set_sensitive(GTK_WIDGET(compose->savemsg_combo), TRUE);
                folderidentifier = folder_item_get_identifier(item);
                compose_set_save_to(compose, folderidentifier);
                g_free(folderidentifier);
@@ -4308,7 +4331,7 @@ static gboolean compose_join_next_line(Compose *compose,
        next_quote_str = compose_get_quote_str(buffer, &iter_, &quote_len);
 
        if ((quote_str || next_quote_str) &&
-           strcmp2(quote_str, next_quote_str) != 0) {
+           g_strcmp0(quote_str, next_quote_str) != 0) {
                g_free(next_quote_str);
                return FALSE;
        }
@@ -4951,16 +4974,18 @@ static void compose_select_account(Compose *compose, PrefsAccount *account,
 
        compose_set_title(compose);
 
-       if (account->default_sign && compose->mode != COMPOSE_REDIRECT)
+       compose_activate_privacy_system(compose, account, FALSE);
+
+       if (account->default_sign && privacy_system_can_sign(compose->privacy_system) &&
+           compose->mode != COMPOSE_REDIRECT)
                cm_toggle_menu_set_active_full(compose->ui_manager, "Menu/Options/Sign", TRUE);
        else
                cm_toggle_menu_set_active_full(compose->ui_manager, "Menu/Options/Sign", FALSE);
-       if (account->default_encrypt && compose->mode != COMPOSE_REDIRECT)
+       if (account->default_encrypt && privacy_system_can_encrypt(compose->privacy_system) &&
+           compose->mode != COMPOSE_REDIRECT)
                cm_toggle_menu_set_active_full(compose->ui_manager, "Menu/Options/Encrypt", TRUE);
        else
                cm_toggle_menu_set_active_full(compose->ui_manager, "Menu/Options/Encrypt", FALSE);
-                                      
-       compose_activate_privacy_system(compose, account, FALSE);
 
        if (!init && compose->mode != COMPOSE_REDIRECT) {
                undo_block(compose->undostruct);
@@ -5904,7 +5929,7 @@ static gint compose_write_to_file(Compose *compose, FILE *fp, gint action, gbool
                                        rewind(fp);
                                        content = file_read_stream_to_str(fp);
 
-                                       str_write_to_file(content, tmp_enc_file);
+                                       str_write_to_file(content, tmp_enc_file, TRUE);
                                        g_free(content);
 
                                        /* Now write the unencrypted body. */
@@ -6428,7 +6453,7 @@ static int compose_add_attachments(Compose *compose, MimeInfo *parent)
                }
                if (ainfo->name && mimepart->type != MIMETYPE_MESSAGE) {
                        if (mimepart->type == MIMETYPE_APPLICATION && 
-                          !strcmp2(mimepart->subtype, "octet-stream"))
+                          !g_strcmp0(mimepart->subtype, "octet-stream"))
                                g_hash_table_insert(mimepart->typeparameters,
                                                g_strdup("name"), g_strdup(ainfo->name));
                        g_hash_table_insert(mimepart->dispositionparameters,
@@ -7470,7 +7495,6 @@ static GtkWidget *compose_create_attach(Compose *compose)
        return attach_scrwin;
 }
 
-static void compose_savemsg_checkbtn_cb(GtkWidget *widget, Compose *compose);
 static void compose_savemsg_select_cb(GtkWidget *widget, Compose *compose);
 
 static GtkWidget *compose_create_others(Compose *compose)
@@ -7497,8 +7521,6 @@ static GtkWidget *compose_create_others(Compose *compose)
        if (account_get_special_folder(compose->account, F_OUTBOX)) {
                gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(savemsg_checkbtn), prefs_common.savemsg);
        }
-       g_signal_connect(G_OBJECT(savemsg_checkbtn), "toggled",
-                        G_CALLBACK(compose_savemsg_checkbtn_cb), compose);
 
        savemsg_combo = gtk_combo_box_text_new_with_entry();
        compose->savemsg_checkbtn = savemsg_checkbtn;
@@ -7513,6 +7535,11 @@ static GtkWidget *compose_create_others(Compose *compose)
        g_signal_connect_after(G_OBJECT(savemsg_combo), "grab_focus",
                         G_CALLBACK(compose_grab_focus_cb), compose);
        if (account_get_special_folder(compose->account, F_OUTBOX)) {
+               if (compose->account->set_sent_folder || prefs_common.savemsg)
+                       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(savemsg_checkbtn), TRUE);
+               else
+                       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(savemsg_checkbtn), FALSE);
+               gtk_widget_set_sensitive(GTK_WIDGET(savemsg_combo), TRUE);
                folderidentifier = folder_item_get_identifier(account_get_special_folder
                                  (compose->account, F_OUTBOX));
                compose_set_save_to(compose, folderidentifier);
@@ -7529,12 +7556,6 @@ static GtkWidget *compose_create_others(Compose *compose)
        return table;   
 }
 
-static void compose_savemsg_checkbtn_cb(GtkWidget *widget, Compose *compose) 
-{
-       gtk_widget_set_sensitive(GTK_WIDGET(compose->savemsg_combo),
-               gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(compose->savemsg_checkbtn)));
-}
-
 static void compose_savemsg_select_cb(GtkWidget *widget, Compose *compose)
 {
        FolderItem *dest;
@@ -9160,6 +9181,7 @@ static void compose_destroy(Compose *compose)
        clipboard = gtk_clipboard_get(GDK_SELECTION_PRIMARY);
        gtk_text_buffer_remove_selection_clipboard(buffer, clipboard);
 
+       message_search_close(compose);
        gtk_widget_destroy(compose->window);
        toolbar_destroy(compose->toolbar);
        g_free(compose->toolbar);
@@ -9459,11 +9481,11 @@ static void compose_attach_property_create(gboolean *cancelled)
 
                tmp = g_strdup_printf("%s/%s", type->type, type->sub_type);
 
-               if (g_list_find_custom(strlist, tmp, (GCompareFunc)strcmp2))
+               if (g_list_find_custom(strlist, tmp, (GCompareFunc)g_strcmp0))
                        g_free(tmp);
                else
                        strlist = g_list_insert_sorted(strlist, (gpointer)tmp,
-                                       (GCompareFunc)strcmp2);
+                                       (GCompareFunc)g_strcmp0);
        }
 
        for (mime_type_list = strlist; mime_type_list != NULL; 
@@ -10115,14 +10137,19 @@ static void account_activated(GtkComboBox *optmenu, gpointer data)
        }
 
        /* Set message save folder */
-       if (account_get_special_folder(compose->account, F_OUTBOX)) {
-               gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(compose->savemsg_checkbtn), prefs_common.savemsg);
-       }
-       g_signal_connect(G_OBJECT(compose->savemsg_checkbtn), "toggled",
-                        G_CALLBACK(compose_savemsg_checkbtn_cb), compose);
-                          
        compose_set_save_to(compose, NULL);
-       if (account_get_special_folder(compose->account, F_OUTBOX)) {
+       if (compose->folder && compose->folder->prefs && compose->folder->prefs->save_copy_to_folder) {
+               gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(compose->savemsg_checkbtn), TRUE);
+               gtk_widget_set_sensitive(GTK_WIDGET(compose->savemsg_combo), TRUE);
+               folderidentifier = folder_item_get_identifier(compose->folder);
+               compose_set_save_to(compose, folderidentifier);
+               g_free(folderidentifier);
+       } else if (account_get_special_folder(compose->account, F_OUTBOX)) {
+               if (compose->account->set_sent_folder || prefs_common.savemsg)
+                       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(compose->savemsg_checkbtn), TRUE);
+               else
+                       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(compose->savemsg_checkbtn), FALSE);
+               gtk_widget_set_sensitive(GTK_WIDGET(compose->savemsg_combo), TRUE);
                folderidentifier = folder_item_get_identifier(account_get_special_folder
                                  (compose->account, F_OUTBOX));
                compose_set_save_to(compose, folderidentifier);
@@ -11539,11 +11566,13 @@ static void compose_activate_privacy_system(Compose *compose, PrefsAccount *acco
 static void compose_apply_folder_privacy_settings(Compose *compose, FolderItem *folder_item)
 {
        if (folder_item != NULL) {
-               if (folder_item->prefs->always_sign != SIGN_OR_ENCRYPT_DEFAULT) {
+               if (folder_item->prefs->always_sign != SIGN_OR_ENCRYPT_DEFAULT &&
+                   privacy_system_can_sign(compose->privacy_system)) {
                        compose_use_signing(compose,
                                (folder_item->prefs->always_sign == SIGN_OR_ENCRYPT_ALWAYS) ? TRUE : FALSE);
                }
-               if (folder_item->prefs->always_encrypt != SIGN_OR_ENCRYPT_DEFAULT) {
+               if (folder_item->prefs->always_encrypt != SIGN_OR_ENCRYPT_DEFAULT &&
+                   privacy_system_can_encrypt(compose->privacy_system)) {
                        compose_use_encryption(compose,
                                (folder_item->prefs->always_encrypt == SIGN_OR_ENCRYPT_ALWAYS) ? TRUE : FALSE);
                }
@@ -11674,7 +11703,7 @@ static void compose_insert_drag_received_cb (GtkWidget          *widget,
                        /* Assume a list of no files, and data has ://, is a remote link */
                        gchar *tmpdata = g_strstrip(g_strdup(ddata));
                        gchar *tmpfile = get_tmp_file();
-                       str_write_to_file(tmpdata, tmpfile);
+                       str_write_to_file(tmpdata, tmpfile, TRUE);
                        g_free(tmpdata);  
                        compose_insert_file(compose, tmpfile);
                        claws_unlink(tmpfile);