2006-10-17 [colin] 2.5.5cvs12
[claws.git] / src / compose.c
index 728ec990418388f133e3347002e9eadef53ee732..1f252bc62541c0daf1078a53bf08d11cf16ebc02 100644 (file)
@@ -918,9 +918,9 @@ Compose *compose_new(PrefsAccount *account, const gchar *mailto,
        return compose_generic_new(account, mailto, NULL, attach_files, NULL);
 }
 
-Compose *compose_new_with_folderitem(PrefsAccount *account, FolderItem *item)
+Compose *compose_new_with_folderitem(PrefsAccount *account, FolderItem *item, const gchar *mailto)
 {
-       return compose_generic_new(account, NULL, item, NULL, NULL);
+       return compose_generic_new(account, mailto, item, NULL, NULL);
 }
 
 Compose *compose_new_with_list( PrefsAccount *account, GList *listAddress )
@@ -982,7 +982,7 @@ Compose *compose_generic_new(PrefsAccount *account, const gchar *mailto, FolderI
        } else {
                if (mailto) {
                        compose_entry_append(compose, mailto, COMPOSE_NEWSGROUPS);
-               } else if (item) {
+               } else if (item && FOLDER_CLASS(item->folder) == news_get_class()) {
                        compose_entry_append(compose, item->path, COMPOSE_NEWSGROUPS);
                }
                /*
@@ -1642,6 +1642,7 @@ Compose *compose_reedit(MsgInfo *msginfo, gboolean batch)
        gboolean use_encryption = FALSE;
        gchar *privacy_system = NULL;
        int priority = PRIORITY_NORMAL;
+       MsgInfo *replyinfo = NULL, *fwdinfo = NULL;
 
        g_return_val_if_fail(msginfo != NULL, NULL);
        g_return_val_if_fail(msginfo->folder != NULL, NULL);
@@ -1695,6 +1696,28 @@ Compose *compose_reedit(MsgInfo *msginfo, gboolean batch)
                        param = atoi(&queueheader_buf[strlen("X-Priority: ")]); /* mind the space */
                        priority = param;
                }
+               if (!procheader_get_header_from_msginfo(msginfo, queueheader_buf, 
+                                            sizeof(queueheader_buf), "RMID:")) {
+                       gchar **tokens = g_strsplit(&queueheader_buf[strlen("RMID:")], "\t", 0);
+                       if (tokens[0] && tokens[1] && tokens[2]) {
+                               FolderItem *orig_item = folder_find_item_from_identifier(tokens[0]);
+                               if (orig_item != NULL) {
+                                       replyinfo = folder_item_get_msginfo_by_msgid(orig_item, tokens[2]);
+                               }
+                       }
+                       g_strfreev(tokens);
+               }
+               if (!procheader_get_header_from_msginfo(msginfo, queueheader_buf, 
+                                            sizeof(queueheader_buf), "FMID:")) {
+                       gchar **tokens = g_strsplit(&queueheader_buf[strlen("FMID:")], "\t", 0);
+                       if (tokens[0] && tokens[1] && tokens[2]) {
+                               FolderItem *orig_item = folder_find_item_from_identifier(tokens[0]);
+                               if (orig_item != NULL) {
+                                       fwdinfo = folder_item_get_msginfo_by_msgid(orig_item, tokens[2]);
+                               }
+                       }
+                       g_strfreev(tokens);
+               }
        } else {
                account = msginfo->folder->folder->account;
        }
@@ -1713,6 +1736,9 @@ Compose *compose_reedit(MsgInfo *msginfo, gboolean batch)
 
        compose = compose_create(account, COMPOSE_REEDIT, batch);
        
+       compose->replyinfo = replyinfo;
+       compose->fwdinfo = fwdinfo;
+
        compose->updating = TRUE;
        compose->priority = priority;
 
@@ -2345,7 +2371,7 @@ static gchar *compose_quote_fmt(Compose *compose, MsgInfo *msginfo,
                msginfo = &dummyinfo;
 
        if (qmark != NULL) {
-               quote_fmt_init(msginfo, NULL, NULL, FALSE);
+               quote_fmt_init(msginfo, NULL, NULL, FALSE, compose->account);
                quote_fmt_scan_string(qmark);
                quote_fmt_parse();
 
@@ -2361,7 +2387,7 @@ static gchar *compose_quote_fmt(Compose *compose, MsgInfo *msginfo,
                        && trimmed_body[0]=='\n')
                        *trimmed_body++;
 
-               quote_fmt_init(msginfo, quote_str, trimmed_body, FALSE);
+               quote_fmt_init(msginfo, quote_str, trimmed_body, FALSE, compose->account);
                quote_fmt_scan_string(fmt);
                quote_fmt_parse();
 
@@ -2468,7 +2494,7 @@ static gboolean same_address(const gchar *addr1, const gchar *addr2)
        extract_address(my_addr1);
        extract_address(my_addr2);
        
-       return !strcmp(my_addr1, my_addr2);
+       return !strcasecmp(my_addr1, my_addr2);
 }
 
 static void compose_reply_set_entry(Compose *compose, MsgInfo *msginfo,
@@ -2983,6 +3009,12 @@ static void compose_attach_append(Compose *compose, const gchar *file,
                g_free(name);
        }
 
+       if (ainfo->name != NULL
+       &&  !strcmp(ainfo->name, ".")) {
+               g_free(ainfo->name);
+               ainfo->name = NULL;
+       }
+
        if (!strcmp(ainfo->content_type, "unknown") || has_binary) {
                g_free(ainfo->content_type);
                ainfo->content_type = g_strdup("application/octet-stream");
@@ -3995,7 +4027,7 @@ static gboolean compose_check_for_set_recipients(Compose *compose)
                        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)
+                       if (strcmp(entry, compose->account->auto_bcc)
                        ||  strcmp(header, (prefs_common.trans_hdr ? gettext("Bcc:") : "Bcc:"))) {
                                found_other = TRUE;
                                g_free(entry);
@@ -4059,6 +4091,8 @@ gint compose_send(Compose *compose)
        gchar *msgpath = NULL;
        gboolean discard_window = FALSE;
        gchar *errstr = NULL;
+       MainWindow *mainwin = mainwindow_get_mainwindow();
+
        if (prefs_common.send_dialog_mode != SEND_DIALOG_ALWAYS
                        || compose->batch == TRUE)
                discard_window = TRUE;
@@ -4073,6 +4107,7 @@ gint compose_send(Compose *compose)
                goto bail;
        }
 
+       inc_lock();
        val = compose_queue(compose, &msgnum, &folder, &msgpath, TRUE);
 
        if (val) {
@@ -4082,6 +4117,9 @@ gint compose_send(Compose *compose)
                if (val == -4) {
                        alertpanel_error(_("Could not queue message for sending:\n\n"
                                           "Charset conversion failed."));
+               } else if (val == -5) {
+                       alertpanel_error(_("Could not queue message for sending:\n\n"
+                                          "Couldn't get recipient encryption key."));
                } else if (val == -3) {
                        if (privacy_peek_error())
                        alertpanel_error(_("Could not queue message for sending:\n\n"
@@ -4109,15 +4147,15 @@ gint compose_send(Compose *compose)
                if (!discard_window) {
                        goto bail;
                }
+               inc_unlock();
                return -1;
        }
-       
        if (msgpath == NULL) {
                msgpath = folder_item_fetch_msg(folder, msgnum);
-               val = procmsg_send_message_queue(msgpath, &errstr);
+               val = procmsg_send_message_queue(msgpath, &errstr, folder, msgnum);
                g_free(msgpath);
        } else {
-               val = procmsg_send_message_queue(msgpath, &errstr);
+               val = procmsg_send_message_queue(msgpath, &errstr, folder, msgnum);
                g_unlink(msgpath);
                g_free(msgpath);
        }
@@ -4150,17 +4188,21 @@ gint compose_send(Compose *compose)
                if (!discard_window) {
                        goto bail;              
                }
+               inc_unlock();
                return -1;
        }
-
-       toolbar_main_set_sensitive(mainwindow_get_mainwindow());
+       inc_unlock();
+       toolbar_main_set_sensitive(mainwin);
+       main_window_set_menu_sensitive(mainwin);
        return 0;
 
 bail:
+       inc_unlock();
        compose_allow_user_actions (compose, TRUE);
        compose->sending = FALSE;
        compose->modified = TRUE; 
-       toolbar_main_set_sensitive(mainwindow_get_mainwindow());
+       toolbar_main_set_sensitive(mainwin);
+       main_window_set_menu_sensitive(mainwin);
 
        return -1;
 }
@@ -4496,7 +4538,9 @@ static gint compose_write_to_file(Compose *compose, FILE *fp, gint action, gbool
        mimetext = procmime_mimeinfo_new();
        mimetext->content = MIMECONTENT_MEM;
        mimetext->tmp = TRUE; /* must free content later */
-       mimetext->data.mem = buf;
+       /* dup'ed because procmime_encode_content can turn it into a tmpfile
+        * and free the data, which we need later. */
+       mimetext->data.mem = g_strdup(buf); 
        mimetext->type = MIMETYPE_TEXT;
        mimetext->subtype = g_strdup("plain");
        g_hash_table_insert(mimetext->typeparameters, g_strdup("charset"),
@@ -4526,6 +4570,7 @@ static gint compose_write_to_file(Compose *compose, FILE *fp, gint action, gbool
                aval = alertpanel(_("Warning"), msg, GTK_STOCK_CANCEL, GTK_STOCK_OK, NULL);
                g_free(msg);
                if (aval != G_ALERTALTERNATE) {
+                       g_free(buf);
                        return -1;
                }
        }
@@ -4559,6 +4604,8 @@ static gint compose_write_to_file(Compose *compose, FILE *fp, gint action, gbool
        } else
                g_node_append(mimemsg->node, mimetext->node);
 
+       g_free(buf);
+
        /* sign message if sending */
        if (action == COMPOSE_WRITE_FOR_SEND && compose->use_signing && 
            privacy_system_can_sign(compose->privacy_system))
@@ -4804,6 +4851,11 @@ static gint compose_queue_sub(Compose *compose, gint *msgnum, FolderItem **item,
                                fprintf(fp, "X-Sylpheed-Encrypt:%d\n", compose->use_encryption);
                                /* and if encdata was null, it means there's been a problem in 
                                 * key selection */
+                               lock = FALSE;
+                               fclose(fp);
+                               g_unlink(tmp);
+                               g_free(tmp);
+                               return -5;
                        }
                        g_free(encdata);
                }
@@ -4952,11 +5004,13 @@ static void compose_add_attachments(Compose *compose, MimeInfo *parent)
                    !g_ascii_strcasecmp(mimepart->subtype, "rfc822")) {
                        mimepart->disposition = DISPOSITIONTYPE_INLINE;
                } else {
-                       g_hash_table_insert(mimepart->typeparameters,
+                       if (ainfo->name) {
+                               g_hash_table_insert(mimepart->typeparameters,
                                            g_strdup("name"), g_strdup(ainfo->name));
-                       g_hash_table_insert(mimepart->dispositionparameters,
+                               g_hash_table_insert(mimepart->dispositionparameters,
                                            g_strdup("filename"), g_strdup(ainfo->name));
-                       mimepart->disposition = DISPOSITIONTYPE_ATTACHMENT;
+                               mimepart->disposition = DISPOSITIONTYPE_ATTACHMENT;
+                       }
                }
 
                if (compose->use_signing) {
@@ -5423,7 +5477,7 @@ static void compose_create_header_entry(Compose *compose)
                         G_CALLBACK(compose_drag_drop),
                         compose);
        
-       address_completion_register_entry(GTK_ENTRY(entry));
+       address_completion_register_entry(GTK_ENTRY(entry), TRUE);
 
         headerentry->compose = compose;
         headerentry->combo = combo;
@@ -5529,7 +5583,7 @@ GtkWidget *compose_create_attach(Compose *compose)
        gtk_tree_view_append_column(GTK_TREE_VIEW(attach_clist), column);
 
        gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(attach_clist),
-                                    prefs_common.enable_rules_hint);
+                                    prefs_common.use_stripes_everywhere);
        selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(attach_clist));
        gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE);
 
@@ -6597,7 +6651,7 @@ void compose_template_apply_fields(Compose *compose, Template *tmpl)
                msginfo = &dummyinfo;
 
        if (tmpl->to && *tmpl->to != '\0') {
-               quote_fmt_init(msginfo, NULL, NULL, FALSE);
+               quote_fmt_init(msginfo, NULL, NULL, FALSE, compose->account);
                quote_fmt_scan_string(tmpl->to);
                quote_fmt_parse();
 
@@ -6610,7 +6664,7 @@ void compose_template_apply_fields(Compose *compose, Template *tmpl)
        }
 
        if (tmpl->cc && *tmpl->cc != '\0') {
-               quote_fmt_init(msginfo, NULL, NULL, FALSE);
+               quote_fmt_init(msginfo, NULL, NULL, FALSE, compose->account);
                quote_fmt_scan_string(tmpl->cc);
                quote_fmt_parse();
 
@@ -6623,7 +6677,7 @@ void compose_template_apply_fields(Compose *compose, Template *tmpl)
        }
 
        if (tmpl->bcc && *tmpl->bcc != '\0') {
-               quote_fmt_init(msginfo, NULL, NULL, FALSE);
+               quote_fmt_init(msginfo, NULL, NULL, FALSE, compose->account);
                quote_fmt_scan_string(tmpl->bcc);
                quote_fmt_parse();
 
@@ -6637,7 +6691,7 @@ void compose_template_apply_fields(Compose *compose, Template *tmpl)
 
        /* process the subject */
        if (tmpl->subject && *tmpl->subject != '\0') {
-               quote_fmt_init(msginfo, NULL, NULL, FALSE);
+               quote_fmt_init(msginfo, NULL, NULL, FALSE, compose->account);
                quote_fmt_scan_string(tmpl->subject);
                quote_fmt_parse();
 
@@ -6652,6 +6706,9 @@ void compose_template_apply_fields(Compose *compose, Template *tmpl)
 
 static void compose_destroy(Compose *compose)
 {
+       GtkTextBuffer *buffer;
+       GtkClipboard *clipboard;
+
        compose_list = g_list_remove(compose_list, compose);
 
        if (compose->updating) {
@@ -6716,6 +6773,10 @@ static void compose_destroy(Compose *compose)
                gtk_widget_destroy(compose->paned);
        gtk_widget_destroy(compose->popupmenu);
 
+       buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(compose->text));
+       clipboard = gtk_clipboard_get(GDK_SELECTION_PRIMARY);
+       gtk_text_buffer_remove_selection_clipboard(buffer, clipboard);
+
        gtk_widget_destroy(compose->window);
        toolbar_destroy(compose->toolbar);
        g_free(compose->toolbar);
@@ -7542,7 +7603,10 @@ static void compose_send_later_cb(gpointer data, guint action,
        Compose *compose = (Compose *)data;
        gint val;
 
+       inc_lock();
        val = compose_queue_sub(compose, NULL, NULL, NULL, TRUE, TRUE);
+       inc_unlock();
+
        if (!val) {
                compose_close(compose);
        } else if (val == -1) {
@@ -7556,6 +7620,9 @@ static void compose_send_later_cb(gpointer data, guint action,
        } else if (val == -4) {
                alertpanel_error(_("Could not queue message for sending:\n\n"
                                   "Charset conversion failed."));
+       } else if (val == -5) {
+               alertpanel_error(_("Could not queue message for sending:\n\n"
+                                  "Couldn't get recipient encryption key."));
        }
        toolbar_main_set_sensitive(mainwindow_get_mainwindow());
 }
@@ -8497,7 +8564,7 @@ static void compose_attach_drag_received_cb (GtkWidget            *widget,
        if (gdk_atom_name(data->type) && 
            !strcmp(gdk_atom_name(data->type), "text/uri-list")
            && gtk_drag_get_source_widget(context) != 
-               mainwindow_get_mainwindow()->summaryview->ctree) {
+               summary_get_main_widget(mainwindow_get_mainwindow()->summaryview)) {
                list = uri_list_extract_filenames((const gchar *)data->data);
                for (tmp = list; tmp != NULL; tmp = tmp->next)
                        compose_attach_append
@@ -8507,7 +8574,7 @@ static void compose_attach_drag_received_cb (GtkWidget            *widget,
                list_free_strings(list);
                g_list_free(list);
        } else if (gtk_drag_get_source_widget(context) 
-                  == mainwindow_get_mainwindow()->summaryview->ctree) {
+                  == summary_get_main_widget(mainwindow_get_mainwindow()->summaryview)) {
                /* comes from our summaryview */
                SummaryView * summaryview = NULL;
                GSList * list = NULL, *cur = NULL;