MH class now should not change working directory anymore.
[claws.git] / src / procmsg.c
index d5d7bc48ef316a2801abe792a0ce4931c25f75c4..153da630d2e1fe8c2fb786f911bac6d3b9c3a7a5 100644 (file)
@@ -84,11 +84,24 @@ void procmsg_msg_list_free(GSList *mlist)
 
        for (cur = mlist; cur != NULL; cur = cur->next) {
                msginfo = (MsgInfo *)cur->data;
-               procmsg_msginfo_free(msginfo);
+               procmsg_msginfo_free(&msginfo);
        }
        g_slist_free(mlist);
 }
 
+MsgNumberList *procmsg_get_number_list_for_msgs(MsgInfoList *msglist)
+{
+       GSList *cur = NULL;
+       GSList *nums = NULL;
+
+       for (cur = msglist; cur; cur = cur->next) {
+               MsgInfo *msg = (MsgInfo *)cur->data;
+               nums = g_slist_prepend(nums, GUINT_TO_POINTER(msg->msgnum));
+       }
+
+       return g_slist_reverse(nums);
+}
+
 struct MarkSum {
        gint *new_msgs;
        gint *unread_msgs;
@@ -389,17 +402,9 @@ next_folder:
 
 gchar *procmsg_get_message_file_path(MsgInfo *msginfo)
 {
-       gchar *file;
-
        cm_return_val_if_fail(msginfo != NULL, NULL);
 
-       if (msginfo->plaintext_file)
-               file = g_strdup(msginfo->plaintext_file);
-       else {
-               file = folder_item_fetch_msg(msginfo->folder, msginfo->msgnum);
-       }
-
-       return file;
+       return folder_item_fetch_msg(msginfo->folder, msginfo->msgnum);
 }
 
 gchar *procmsg_get_message_file(MsgInfo *msginfo)
@@ -464,7 +469,7 @@ void procmsg_message_file_list_free(MsgInfoList *file_list)
 
        for (cur = file_list; cur != NULL; cur = cur->next) {
                fileinfo = (MsgFileInfo *)cur->data;
-               procmsg_msginfo_free(fileinfo->msginfo);
+               procmsg_msginfo_free(&(fileinfo->msginfo));
                g_free(fileinfo->file);
                g_free(fileinfo->flags);
                g_free(fileinfo);
@@ -532,7 +537,6 @@ gboolean procmsg_msg_exist(MsgInfo *msginfo)
        if (!msginfo) return FALSE;
 
        path = folder_item_get_path(msginfo->folder);
-       change_dir(path);
        ret = !folder_item_is_msg_changed(msginfo->folder, msginfo);
        g_free(path);
 
@@ -675,14 +679,14 @@ static void procmsg_empty_trash(FolderItem *trash)
                for (cur = mlist ; cur != NULL ; cur = cur->next) {
                        MsgInfo * msginfo = (MsgInfo *) cur->data;
                        if (MSG_IS_LOCKED(msginfo->flags)) {
-                               procmsg_msginfo_free(msginfo);
+                               procmsg_msginfo_free(&msginfo);
                                continue;
                        }
                        if (msginfo->total_size != 0 && 
                            msginfo->size != (off_t)msginfo->total_size)
                                partial_mark_for_delete(msginfo);
 
-                       procmsg_msginfo_free(msginfo);
+                       procmsg_msginfo_free(&msginfo);
                }
                g_slist_free(mlist);
                folder_item_remove_all_msg(trash);
@@ -759,6 +763,36 @@ static PrefsAccount *procmsg_get_account_from_file(const gchar *file)
        return mailac;
 }
 
+gchar *procmsg_msginfo_get_avatar(MsgInfo *msginfo, gint type)
+{
+       GSList *mia;
+
+       if (!msginfo || !msginfo->extradata || !msginfo->extradata->avatars)
+               return NULL;
+
+       for (mia = msginfo->extradata->avatars; mia; mia = mia->next) {
+               MsgInfoAvatar *avatar = (MsgInfoAvatar *)mia->data;
+               if (avatar->avatar_id == type)
+                       return avatar->avatar_src;
+       }
+
+       return NULL;
+}
+
+void procmsg_msginfo_add_avatar(MsgInfo *msginfo, gint type, const gchar *data)
+{
+       MsgInfoAvatar *av;
+
+       if (!msginfo->extradata)
+               msginfo->extradata = g_new0(MsgInfoExtraData, 1);
+
+       av = g_new0(MsgInfoAvatar, 1);
+       av->avatar_id = type;
+       av->avatar_src = g_strdup(data);
+
+       msginfo->extradata->avatars = g_slist_append(msginfo->extradata->avatars, av);
+}
+
 gchar *procmsg_msginfo_get_identifier(MsgInfo *msginfo)
 {
        gchar *folder_id;
@@ -847,7 +881,7 @@ parse_again:
                cur = cur->next;
        }
        
-       if (orig || g_slist_length(orig)) {
+       if (orig && g_slist_length(orig)) {
                if (!last_account && nothing_to_sort) {
                        /* can't find an account for the rest of the list */
                        cur = orig;
@@ -875,7 +909,7 @@ static gboolean procmsg_is_last_for_account(FolderItem *queue, MsgInfo *msginfo,
 {
        gchar *file = folder_item_fetch_msg(queue, msginfo->msgnum);
        PrefsAccount *ac = procmsg_get_account_from_file(file);
-       GSList *cur = elem;
+       GSList *cur;
        g_free(file);
        for (cur = elem; cur; cur = cur->next) {
                MsgInfo *cur_msginfo = (MsgInfo *)cur->data;
@@ -930,6 +964,7 @@ gint procmsg_send_queue(FolderItem *queue, gboolean save_msgs, gchar **errstr)
        GNode *node, *next;
        
        if (!procmsg_queue_lock(errstr)) {
+               main_window_set_menu_sensitive(mainwindow_get_mainwindow());
                toolbar_main_set_sensitive(mainwindow_get_mainwindow());
                return -1;
        }
@@ -943,6 +978,7 @@ gint procmsg_send_queue(FolderItem *queue, gboolean save_msgs, gchar **errstr)
                return -1;
        }
 
+       main_window_set_menu_sensitive(mainwindow_get_mainwindow());
        toolbar_main_set_sensitive(mainwindow_get_mainwindow());
 
        folder_item_scan(queue);
@@ -963,7 +999,7 @@ gint procmsg_send_queue(FolderItem *queue, gboolean save_msgs, gchar **errstr)
                                if (procmsg_send_message_queue_full(file, 
                                                !procmsg_is_last_for_account(queue, msginfo, elem),
                                                errstr, queue, msginfo->msgnum, &queued_removed) < 0) {
-                                       g_warning("Sending queued message %d failed.\n", 
+                                       g_warning("Sending queued message %d failed.",
                                                  msginfo->msgnum);
                                        err++;
                                } else {
@@ -977,7 +1013,7 @@ gint procmsg_send_queue(FolderItem *queue, gboolean save_msgs, gchar **errstr)
                /* FIXME: supposedly if only one message is locked, and queue
                 * is being flushed, the following free says something like 
                 * "freeing msg ## in folder (nil)". */
-               procmsg_msginfo_free(msginfo);
+               procmsg_msginfo_free(&msginfo);
        }
 
        g_slist_free(sorted_list);
@@ -1000,6 +1036,7 @@ gint procmsg_send_queue(FolderItem *queue, gboolean save_msgs, gchar **errstr)
        }
        procmsg_queue_unlock();
        inc_unlock();
+       main_window_set_menu_sensitive(mainwindow_get_mainwindow());
        toolbar_main_set_sensitive(mainwindow_get_mainwindow());
 
        return (err != 0 ? -err : sent);
@@ -1077,14 +1114,20 @@ gint procmsg_remove_special_headers(const gchar *in, const gchar *out)
                        break;
                }
        }
-       while (fgets(buf, sizeof(buf), fp) != NULL)
-               fputs(buf, outfp);
+       while (fgets(buf, sizeof(buf), fp) != NULL) {
+               if (fputs(buf, outfp) == EOF) {
+                       FILE_OP_ERROR(out, "fputs");
+                       fclose(outfp);
+                       fclose(fp);
+                       return -1;
+               }
+       }
        fclose(outfp);
        fclose(fp);
        return 0;
 }
 
-static gint procmsg_save_to_outbox(FolderItem *outbox, const gchar *file,
+gint procmsg_save_to_outbox(FolderItem *outbox, const gchar *file,
                            gboolean is_queued)
 {
        gint num;
@@ -1109,7 +1152,7 @@ static gint procmsg_save_to_outbox(FolderItem *outbox, const gchar *file,
 
                folder_item_scan(outbox);
                if ((num = folder_item_add_msg(outbox, tmp, &flag, TRUE)) < 0) {
-                       g_warning("can't save message\n");
+                       g_warning("can't save message");
                        claws_unlink(tmp);
                        return -1;
                }
@@ -1117,7 +1160,7 @@ static gint procmsg_save_to_outbox(FolderItem *outbox, const gchar *file,
                folder_item_scan(outbox);
                if ((num = folder_item_add_msg
                        (outbox, file, &flag, FALSE)) < 0) {
-                       g_warning("can't save message\n");
+                       g_warning("can't save message");
                        return -1;
                }
        }
@@ -1125,82 +1168,19 @@ static gint procmsg_save_to_outbox(FolderItem *outbox, const gchar *file,
        tmp_msginfo = procmsg_msginfo_get_full_info(msginfo);   /* refcnt++ */ 
        if (msginfo != NULL) {
                procmsg_msginfo_unset_flags(msginfo, ~0, 0);
-               procmsg_msginfo_free(msginfo);                  /* refcnt-- */
+               procmsg_msginfo_free(&msginfo);                 /* refcnt-- */
                /* tmp_msginfo == msginfo */
                if (tmp_msginfo && msginfo->extradata && 
                    (msginfo->extradata->dispositionnotificationto || 
                     msginfo->extradata->returnreceiptto)) {
                        procmsg_msginfo_set_flags(msginfo, MSG_RETRCPT_SENT, 0); 
                }       
-               procmsg_msginfo_free(tmp_msginfo);              /* refcnt-- */
+               procmsg_msginfo_free(&tmp_msginfo);             /* refcnt-- */
        }
 
        return 0;
 }
 
-void procmsg_print_message(MsgInfo *msginfo, const gchar *cmdline)
-{
-       static const gchar *def_cmd = "lpr %s";
-       static guint id = 0;
-       gchar *prtmp;
-       FILE *tmpfp, *prfp;
-       gchar buf[1024];
-       gchar *p;
-       int r;
-       cm_return_if_fail(msginfo);
-
-       if (procmime_msginfo_is_encrypted(msginfo))
-               tmpfp = procmime_get_first_encrypted_text_content(msginfo);
-       else
-               tmpfp = procmime_get_first_text_content(msginfo);
-       if (tmpfp == NULL) {
-               g_warning("Can't get text part\n");
-               return;
-       }
-
-       prtmp = g_strdup_printf("%s%cprinttmp.%08x",
-                               get_mime_tmp_dir(), G_DIR_SEPARATOR, id++);
-
-       if ((prfp = g_fopen(prtmp, "wb")) == NULL) {
-               FILE_OP_ERROR(prtmp, "fopen");
-               g_free(prtmp);
-               fclose(tmpfp);
-               return;
-       }
-
-       if (msginfo->date) r = fprintf(prfp, "Date: %s\n", msginfo->date);
-       if (msginfo->from) r = fprintf(prfp, "From: %s\n", msginfo->from);
-       if (msginfo->to)   r = fprintf(prfp, "To: %s\n", msginfo->to);
-       if (msginfo->cc)   r = fprintf(prfp, "Cc: %s\n", msginfo->cc);
-       if (msginfo->newsgroups)
-               r = fprintf(prfp, "Newsgroups: %s\n", msginfo->newsgroups);
-       if (msginfo->subject) r = fprintf(prfp, "Subject: %s\n", msginfo->subject);
-       fputc('\n', prfp);
-
-       while (fgets(buf, sizeof(buf), tmpfp) != NULL)
-               r = fputs(buf, prfp);
-
-       fclose(prfp);
-       fclose(tmpfp);
-
-       if (cmdline && (p = strchr(cmdline, '%')) && *(p + 1) == 's' &&
-           !strchr(p + 2, '%'))
-               g_snprintf(buf, sizeof(buf) - 1, cmdline, prtmp);
-       else {
-               if (cmdline)
-                       g_warning("Print command-line is invalid: '%s'\n",
-                                 cmdline);
-               g_snprintf(buf, sizeof(buf) - 1, def_cmd, prtmp);
-       }
-
-       g_free(prtmp);
-
-       g_strchomp(buf);
-       if (buf[strlen(buf) - 1] != '&')
-               strncat(buf, "&", sizeof(buf) - strlen(buf) - 1);
-       if (system(buf) == -1)
-               g_warning("system(%s) failed.", buf);
-}
 
 MsgInfo *procmsg_msginfo_new_ref(MsgInfo *msginfo)
 {
@@ -1219,6 +1199,28 @@ MsgInfo *procmsg_msginfo_new(void)
        return newmsginfo;
 }
 
+static MsgInfoAvatar *procmsg_msginfoavatar_copy(MsgInfoAvatar *avatar)
+{
+       MsgInfoAvatar *newavatar;
+
+       if (avatar == NULL) return NULL;
+
+       newavatar = g_new0(MsgInfoAvatar, 1);
+       newavatar->avatar_id = avatar->avatar_id;
+       newavatar->avatar_src = g_strdup(avatar->avatar_src);
+
+       return newavatar;
+}
+
+static void procmsg_msginfoavatar_free(MsgInfoAvatar *avatar)
+{
+       if (avatar != NULL) {
+               if (avatar->avatar_src != NULL)
+                       g_free(avatar->avatar_src);
+               g_free(avatar);
+       }
+}
+
 MsgInfo *procmsg_msginfo_copy(MsgInfo *msginfo)
 {
        MsgInfo *newmsginfo;
@@ -1258,8 +1260,10 @@ MsgInfo *procmsg_msginfo_copy(MsgInfo *msginfo)
 
        if (msginfo->extradata) {
                newmsginfo->extradata = g_new0(MsgInfoExtraData, 1);
-               MEMBDUP(extradata->face);
-               MEMBDUP(extradata->xface);
+               if (msginfo->extradata->avatars) {
+                       newmsginfo->extradata->avatars = slist_copy_deep(msginfo->extradata->avatars,
+                                                               (GCopyFunc) procmsg_msginfoavatar_copy);
+               }
                MEMBDUP(extradata->dispositionnotificationto);
                MEMBDUP(extradata->returnreceiptto);
                MEMBDUP(extradata->partial_recv);
@@ -1271,6 +1275,7 @@ MsgInfo *procmsg_msginfo_copy(MsgInfo *msginfo)
                MEMBDUP(extradata->list_help);
                MEMBDUP(extradata->list_archive);
                MEMBDUP(extradata->list_owner);
+               MEMBDUP(extradata->resent_from);
        }
 
         refs = msginfo->references;
@@ -1293,7 +1298,7 @@ MsgInfo *procmsg_msginfo_get_full_info_from_file(MsgInfo *msginfo, const gchar *
        if (msginfo == NULL) return NULL;
 
        if (!file || !is_file_exist(file)) {
-               g_warning("procmsg_msginfo_get_full_info_from_file(): can't get message file.\n");
+               g_warning("procmsg_msginfo_get_full_info_from_file(): can't get message file.");
                return NULL;
        }
 
@@ -1318,10 +1323,9 @@ MsgInfo *procmsg_msginfo_get_full_info_from_file(MsgInfo *msginfo, const gchar *
                        msginfo->extradata->list_archive= g_strdup(full_msginfo->extradata->list_archive);
                if (!msginfo->extradata->list_owner)
                        msginfo->extradata->list_owner = g_strdup(full_msginfo->extradata->list_owner);
-               if (!msginfo->extradata->xface)
-                       msginfo->extradata->xface = g_strdup(full_msginfo->extradata->xface);
-               if (!msginfo->extradata->face)
-                       msginfo->extradata->face = g_strdup(full_msginfo->extradata->face);
+               if (!msginfo->extradata->avatars)
+                       msginfo->extradata->avatars = slist_copy_deep(full_msginfo->extradata->avatars,
+                                                                       (GCopyFunc) procmsg_msginfoavatar_copy);
                if (!msginfo->extradata->dispositionnotificationto)
                        msginfo->extradata->dispositionnotificationto = 
                                g_strdup(full_msginfo->extradata->dispositionnotificationto);
@@ -1337,8 +1341,11 @@ MsgInfo *procmsg_msginfo_get_full_info_from_file(MsgInfo *msginfo, const gchar *
                if (!msginfo->extradata->account_login && full_msginfo->extradata->account_login)
                        msginfo->extradata->account_login = g_strdup
                                (full_msginfo->extradata->account_login);
+               if (!msginfo->extradata->resent_from && full_msginfo->extradata->resent_from)
+                       msginfo->extradata->resent_from = g_strdup
+                               (full_msginfo->extradata->resent_from);
        }
-       procmsg_msginfo_free(full_msginfo);
+       procmsg_msginfo_free(&full_msginfo);
 
        return procmsg_msginfo_new_ref(msginfo);
 }
@@ -1356,7 +1363,7 @@ MsgInfo *procmsg_msginfo_get_full_info(MsgInfo *msginfo)
                file = procmsg_get_message_file(msginfo);
        }
        if (!file || !is_file_exist(file)) {
-               g_warning("procmsg_msginfo_get_full_info(): can't get message file.\n");
+               g_warning("procmsg_msginfo_get_full_info(): can't get message file.");
                return NULL;
        }
 
@@ -1365,8 +1372,11 @@ MsgInfo *procmsg_msginfo_get_full_info(MsgInfo *msginfo)
        return full_msginfo;
 }
 
-void procmsg_msginfo_free(MsgInfo *msginfo)
+#define FREENULL(n) { g_free(n); n = NULL; }
+void procmsg_msginfo_free(MsgInfo **msginfo_ptr)
 {
+       MsgInfo *msginfo = *msginfo_ptr;
+
        if (msginfo == NULL) return;
 
        msginfo->refcnt--;
@@ -1378,44 +1388,52 @@ void procmsg_msginfo_free(MsgInfo *msginfo)
                folder_item_update(msginfo->to_folder, F_ITEM_UPDATE_MSGCNT);
        }
 
-       g_free(msginfo->fromspace);
+       FREENULL(msginfo->fromspace);
 
-       g_free(msginfo->fromname);
+       FREENULL(msginfo->fromname);
 
-       g_free(msginfo->date);
-       g_free(msginfo->from);
-       g_free(msginfo->to);
-       g_free(msginfo->cc);
-       g_free(msginfo->newsgroups);
-       g_free(msginfo->subject);
-       g_free(msginfo->msgid);
-       g_free(msginfo->inreplyto);
-       g_free(msginfo->xref);
+       FREENULL(msginfo->date);
+       FREENULL(msginfo->from);
+       FREENULL(msginfo->to);
+       FREENULL(msginfo->cc);
+       FREENULL(msginfo->newsgroups);
+       FREENULL(msginfo->subject);
+       FREENULL(msginfo->msgid);
+       FREENULL(msginfo->inreplyto);
+       FREENULL(msginfo->xref);
 
        if (msginfo->extradata) {
-               g_free(msginfo->extradata->returnreceiptto);
-               g_free(msginfo->extradata->dispositionnotificationto);
-               g_free(msginfo->extradata->xface);
-               g_free(msginfo->extradata->face);
-               g_free(msginfo->extradata->list_post);
-               g_free(msginfo->extradata->list_subscribe);
-               g_free(msginfo->extradata->list_unsubscribe);
-               g_free(msginfo->extradata->list_help);
-               g_free(msginfo->extradata->list_archive);
-               g_free(msginfo->extradata->list_owner);
-               g_free(msginfo->extradata->partial_recv);
-               g_free(msginfo->extradata->account_server);
-               g_free(msginfo->extradata->account_login);
-               g_free(msginfo->extradata);
-       }
-       slist_free_strings(msginfo->references);
-       g_slist_free(msginfo->references);
+               if (msginfo->extradata->avatars) {
+                       g_slist_foreach(msginfo->extradata->avatars,
+                                       (GFunc)procmsg_msginfoavatar_free,
+                                       NULL);
+                       g_slist_free(msginfo->extradata->avatars);
+                       msginfo->extradata->avatars = NULL;
+               }
+               FREENULL(msginfo->extradata->returnreceiptto);
+               FREENULL(msginfo->extradata->dispositionnotificationto);
+               FREENULL(msginfo->extradata->list_post);
+               FREENULL(msginfo->extradata->list_subscribe);
+               FREENULL(msginfo->extradata->list_unsubscribe);
+               FREENULL(msginfo->extradata->list_help);
+               FREENULL(msginfo->extradata->list_archive);
+               FREENULL(msginfo->extradata->list_owner);
+               FREENULL(msginfo->extradata->partial_recv);
+               FREENULL(msginfo->extradata->account_server);
+               FREENULL(msginfo->extradata->account_login);
+               FREENULL(msginfo->extradata->resent_from);
+               FREENULL(msginfo->extradata);
+       }
+       slist_free_strings_full(msginfo->references);
+       msginfo->references = NULL;
        g_slist_free(msginfo->tags);
+       msginfo->tags = NULL;
 
-       g_free(msginfo->plaintext_file);
+       FREENULL(msginfo->plaintext_file);
 
-       g_free(msginfo);
+       FREENULL(msginfo);
 }
+#undef FREENULL
 
 guint procmsg_msginfo_memusage(MsgInfo *msginfo)
 {
@@ -1454,10 +1472,13 @@ guint procmsg_msginfo_memusage(MsgInfo *msginfo)
        }
        if (msginfo->extradata) {
                memusage += sizeof(MsgInfoExtraData);
-               if (msginfo->extradata->xface)
-                       memusage += strlen(msginfo->extradata->xface);
-               if (msginfo->extradata->face)
-                       memusage += strlen(msginfo->extradata->face);
+               if (msginfo->extradata->avatars) {
+                       for (tmp = msginfo->extradata->avatars; tmp; tmp = tmp->next) {
+                               MsgInfoAvatar *avt = (MsgInfoAvatar *)tmp->data;
+                               memusage += (avt->avatar_src)? strlen(avt->avatar_src): 0;
+                               memusage += sizeof(MsgInfoAvatar) + sizeof(GSList);
+                       }
+               }
                if (msginfo->extradata->dispositionnotificationto)
                        memusage += strlen(msginfo->extradata->dispositionnotificationto);
                if (msginfo->extradata->returnreceiptto)
@@ -1469,6 +1490,8 @@ guint procmsg_msginfo_memusage(MsgInfo *msginfo)
                        memusage += strlen(msginfo->extradata->account_server);
                if (msginfo->extradata->account_login)
                        memusage += strlen(msginfo->extradata->account_login);
+               if (msginfo->extradata->resent_from)
+                       memusage += strlen(msginfo->extradata->resent_from);
 
                if (msginfo->extradata->list_post)
                        memusage += strlen(msginfo->extradata->list_post);
@@ -1489,22 +1512,23 @@ guint procmsg_msginfo_memusage(MsgInfo *msginfo)
 static gint procmsg_send_message_queue_full(const gchar *file, gboolean keep_session, gchar **errstr,
                                            FolderItem *queue, gint msgnum, gboolean *queued_removed)
 {
-       static HeaderEntry qentry[] = {{"S:",    NULL, FALSE},
+       static HeaderEntry qentry[] = {
+                                      {"S:",    NULL, FALSE}, /* 0 */
                                       {"SSV:",  NULL, FALSE},
                                       {"R:",    NULL, FALSE},
                                       {"NG:",   NULL, FALSE},
                                       {"MAID:", NULL, FALSE},
-                                      {"NAID:", NULL, FALSE},
+                                      {"NAID:", NULL, FALSE}, /* 5 */
                                       {"SCF:",  NULL, FALSE},
                                       {"RMID:", NULL, FALSE},
                                       {"FMID:", NULL, FALSE},
                                       {"X-Claws-Privacy-System:", NULL, FALSE},
-                                      {"X-Claws-Encrypt:", NULL, FALSE},
+                                      {"X-Claws-Encrypt:", NULL, FALSE}, /* 10 */
                                       {"X-Claws-Encrypt-Data:", NULL, FALSE},
                                       {"X-Claws-End-Special-Headers:", NULL, FALSE},
                                       {"X-Sylpheed-Privacy-System:", NULL, FALSE},
                                       {"X-Sylpheed-Encrypt:", NULL, FALSE},
-                                      {"X-Sylpheed-Encrypt-Data:", NULL, FALSE},
+                                      {"X-Sylpheed-Encrypt-Data:", NULL, FALSE}, /* 15 */
                                       {"X-Sylpheed-End-Special-Headers:", NULL, FALSE},
                                       {NULL,    NULL, FALSE}};
        FILE *fp;
@@ -1517,16 +1541,11 @@ static gint procmsg_send_message_queue_full(const gchar *file, gboolean keep_ses
        gchar *savecopyfolder = NULL;
        gchar *replymessageid = NULL;
        gchar *fwdmessageid = NULL;
-       gchar *privacy_system = NULL;
-       gboolean encrypt = FALSE;
-       gchar *encrypt_data = NULL;
        gchar buf[BUFFSIZE];
        gint hnum;
        PrefsAccount *mailac = NULL, *newsac = NULL;
-       gboolean save_clear_text = TRUE;
-       gchar *tmp_enc_file = NULL;
-
-       int local = 0;
+       gboolean encrypt = FALSE;
+       FolderItem *outbox;
 
        cm_return_val_if_fail(file != NULL, -1);
 
@@ -1576,21 +1595,11 @@ static gint procmsg_send_message_queue_full(const gchar *file, gboolean keep_ses
                        if (fwdmessageid == NULL) 
                                fwdmessageid = g_strdup(p);
                        break;
-               case Q_PRIVACY_SYSTEM:
-               case Q_PRIVACY_SYSTEM_OLD:
-                       if (privacy_system == NULL) 
-                               privacy_system = g_strdup(p);
-                       break;
                case Q_ENCRYPT:
                case Q_ENCRYPT_OLD:
                        if (p[0] == '1') 
                                encrypt = TRUE;
                        break;
-               case Q_ENCRYPT_DATA:
-               case Q_ENCRYPT_DATA_OLD:
-                       if (encrypt_data == NULL) 
-                               encrypt_data = g_strdup(p);
-                       break;
                case Q_CLAWS_HDRS:
                case Q_CLAWS_HDRS_OLD:
                        /* end of special headers reached */
@@ -1599,66 +1608,14 @@ static gint procmsg_send_message_queue_full(const gchar *file, gboolean keep_ses
        }
 send_mail:
        filepos = ftell(fp);
-
-       if (encrypt) {
-               MimeInfo *mimeinfo;
-
-               if (mailac && mailac->save_encrypted_as_clear_text 
-               &&  !mailac->encrypt_to_self)
-                       save_clear_text = TRUE;
-               else
-                       save_clear_text = FALSE;
-
-               fclose(fp);
-               fp = NULL;
-
-               mimeinfo = procmime_scan_queue_file(file);
-               if (!privacy_encrypt(privacy_system, mimeinfo, encrypt_data)
-               || (fp = my_tmpfile()) == NULL
-               ||  procmime_write_mimeinfo(mimeinfo, fp) < 0) {
-                       if (fp)
-                               fclose(fp);
-                       procmime_mimeinfo_free_all(mimeinfo);
-                       g_free(from);
-                       g_free(smtpserver);
-                       slist_free_strings(to_list);
-                       g_slist_free(to_list);
-                       slist_free_strings(newsgroup_list);
-                       g_slist_free(newsgroup_list);
-                       g_free(savecopyfolder);
-                       g_free(replymessageid);
-                       g_free(fwdmessageid);
-                       g_free(privacy_system);
-                       g_free(encrypt_data);
-                       if (errstr) {
-                               if (*errstr) g_free(*errstr);
-                               *errstr = g_strdup_printf(_("Couldn't encrypt the email: %s"),
-                                               privacy_get_error());
-                       }
-                       return -1;
+       if (filepos < 0) {
+               FILE_OP_ERROR(file, "ftell");
+               if (errstr) {
+                       if (*errstr) g_free(*errstr);
+                       *errstr = g_strdup_printf(_("Couldn't open file %s."), file);
                }
-               
-               rewind(fp);
-               if (!save_clear_text) {
-                       gchar *content = NULL;
-                       FILE *tmpfp = get_tmpfile_in_dir(get_mime_tmp_dir(), &tmp_enc_file);
-                       if (tmpfp) {
-                               fclose(tmpfp);
-
-                               content = file_read_stream_to_str(fp);
-                               rewind(fp);
-
-                               str_write_to_file(content, tmp_enc_file);
-                               g_free(content);
-                       } else {
-                               g_warning("couldn't get tempfile\n");
-                       }
-               } 
-               
-               procmime_mimeinfo_free_all(mimeinfo);
-               
-               filepos = 0;
-       }
+               return -1;
+       }
 
        if (to_list) {
                debug_print("Sending message by mail\n");
@@ -1671,13 +1628,12 @@ send_mail:
                } else if (mailac && mailac->use_mail_command &&
                           mailac->mail_command && (* mailac->mail_command)) {
                        mailval = send_message_local(mailac->mail_command, fp);
-                       local = 1;
                } else {
                        if (!mailac) {
                                mailac = account_find_from_smtp_server(from, smtpserver);
                                if (!mailac) {
                                        g_warning("Account not found. "
-                                                   "Using current account...\n");
+                                                   "Using current account...");
                                        mailac = cur_account;
                                }
                        }
@@ -1691,7 +1647,7 @@ send_mail:
                        } else {
                                PrefsAccount tmp_ac;
 
-                               g_warning("Account not found.\n");
+                               g_warning("Account not found.");
 
                                memset(&tmp_ac, 0, sizeof(PrefsAccount));
                                tmp_ac.address = from;
@@ -1708,13 +1664,17 @@ send_mail:
        } else if (!to_list && !newsgroup_list) {
                if (errstr) {
                        if (*errstr) g_free(*errstr);
-                       *errstr = g_strdup(_("Couldn't determine sending informations. "
+                       *errstr = g_strdup(_("Couldn't determine sending information. "
                                "Maybe the email hasn't been generated by Claws Mail."));
                }
                mailval = -1;
        }
 
-       fseek(fp, filepos, SEEK_SET);
+       if (fseek(fp, filepos, SEEK_SET) < 0) {
+               FILE_OP_ERROR(file, "fseek");
+               mailval = -1;
+       }
+
        if (newsgroup_list && newsac && (mailval == 0)) {
                Folder *folder;
                gchar *tmp = NULL;
@@ -1730,7 +1690,7 @@ send_mail:
                } else {
                        if (change_file_mode_rw(tmpfp, tmp) < 0) {
                                FILE_OP_ERROR(tmp, "chmod");
-                               g_warning("can't change file mode\n");
+                               g_warning("can't change file mode");
                        }
 
                        while ((newsval == 0) && fgets(buf, sizeof(buf), fp) != NULL) {
@@ -1777,15 +1737,14 @@ send_mail:
 
        /* save message to outbox */
        if (mailval == 0 && newsval == 0 && savecopyfolder) {
-               FolderItem *outbox;
-
                debug_print("saving sent message...\n");
 
-               outbox = folder_find_item_from_identifier(savecopyfolder);
-               if (!outbox)
-                       outbox = folder_get_default_outbox();
-                       
-               if (save_clear_text || tmp_enc_file == NULL) {
+               if (!encrypt || !mailac->save_encrypted_as_clear_text) {
+                       outbox = folder_find_item_from_identifier(savecopyfolder);
+                       if (!outbox)
+                               outbox = folder_get_default_outbox();
+
+                       /* Mail was not saved to outbox before encrypting, save it now. */
                        gboolean saved = FALSE;
                        *queued_removed = FALSE;
                        if (queue && msgnum > 0) {
@@ -1798,24 +1757,15 @@ send_mail:
                                        debug_print("copied queued mail %d to sent folder\n", msgnum);
                                        saved = TRUE;
                                }
-                               procmsg_msginfo_free(queued_mail);
+                               procmsg_msginfo_free(&queued_mail);
                        }
                        if (!saved) {
-                               debug_print("resaving clear text queued mail to sent folder\n");
+                               debug_print("resaving queued mail to sent folder\n");
                                procmsg_save_to_outbox(outbox, file, TRUE);
                        }
-               } else {
-                       debug_print("saving encrpyted queued mail to sent folder\n");
-                       procmsg_save_to_outbox(outbox, tmp_enc_file, FALSE);
                }
        }
 
-       if (tmp_enc_file != NULL) {
-               claws_unlink(tmp_enc_file);
-               free(tmp_enc_file);
-               tmp_enc_file = NULL;
-       }
-
        if (replymessageid != NULL || fwdmessageid != NULL) {
                gchar **tokens;
                FolderItem *item;
@@ -1836,7 +1786,7 @@ send_mail:
                        if ((msginfo != NULL) && 
                            (msginfo->msgid != NULL) &&
                            (strcmp(msginfo->msgid, tokens[2]) != 0)) {
-                               procmsg_msginfo_free(msginfo);
+                               procmsg_msginfo_free(&msginfo);
                                msginfo = NULL;
                        }
                        
@@ -1856,7 +1806,7 @@ send_mail:
                                }  else {
                                        procmsg_msginfo_set_flags(msginfo, MSG_FORWARDED, 0);
                                }
-                               procmsg_msginfo_free(msginfo);
+                               procmsg_msginfo_free(&msginfo);
                        }
                }
                g_strfreev(tokens);
@@ -1864,15 +1814,11 @@ send_mail:
 
        g_free(from);
        g_free(smtpserver);
-       slist_free_strings(to_list);
-       g_slist_free(to_list);
-       slist_free_strings(newsgroup_list);
-       g_slist_free(newsgroup_list);
+       slist_free_strings_full(to_list);
+       slist_free_strings_full(newsgroup_list);
        g_free(savecopyfolder);
        g_free(replymessageid);
        g_free(fwdmessageid);
-       g_free(privacy_system);
-       g_free(encrypt_data);
 
        return (newsval != 0 ? newsval : mailval);
 }
@@ -1880,6 +1826,7 @@ send_mail:
 gint procmsg_send_message_queue(const gchar *file, gchar **errstr, FolderItem *queue, gint msgnum, gboolean *queued_removed)
 {
        gint result = procmsg_send_message_queue_full(file, FALSE, errstr, queue, msgnum, queued_removed);
+       main_window_set_menu_sensitive(mainwindow_get_mainwindow());
        toolbar_main_set_sensitive(mainwindow_get_mainwindow());
        return result;
 }
@@ -2118,7 +2065,7 @@ static gboolean procmsg_msg_has_flagged_parent_real(MsgInfo *info,
                tmp = folder_item_get_msginfo_by_msgid(info->folder,
                                info->inreplyto);
                if (tmp && (tmp->flags.perm_flags & perm_flags)) {
-                       procmsg_msginfo_free(tmp);
+                       procmsg_msginfo_free(&tmp);
                        return TRUE;
                } else if (tmp != NULL) {
                        gboolean result;
@@ -2132,7 +2079,7 @@ static gboolean procmsg_msg_has_flagged_parent_real(MsgInfo *info,
                                result = procmsg_msg_has_flagged_parent_real(
                                    tmp, perm_flags, parentmsgs);
                        }
-                       procmsg_msginfo_free(tmp);
+                       procmsg_msginfo_free(&tmp);
                        return result;
                } else {
                        return FALSE;
@@ -2217,7 +2164,7 @@ static GSList *procmsg_find_children (MsgInfo *info)
                for (cur = all; cur != NULL; cur = g_slist_next(cur)) {
                        /* this will not free the used pointers
                           created with procmsg_msginfo_new_ref */
-                       procmsg_msginfo_free((MsgInfo *)cur->data);
+                       procmsg_msginfo_free((MsgInfo **)&(cur->data));
                }
        }
        g_slist_free(all);
@@ -2238,7 +2185,7 @@ static void procmsg_update_unread_children(MsgInfo *info, gboolean newly_marked)
                                info->folder->unreadmarked_msgs--;
                        folder_item_update(info->folder, F_ITEM_UPDATE_MSGCNT);
                }
-               procmsg_msginfo_free(tmp);
+               procmsg_msginfo_free(&tmp);
        }
        g_slist_free(children);
 }