remove some mutt_mktemp
[apps/madmutt.git] / imap / message.c
index 8412c61..6c1fce7 100644 (file)
 #include <lib-lib/lib-lib.h>
 
 #include <lib-ui/curses.h>
+#include <lib-mx/mx.h>
+#include <lib-mx/hcache.h>
 
 #include "mutt.h"
 #include "imap_private.h"
 #include "message.h"
-#include "mx.h"
-#include "hcache.h"
 
 #ifdef HAVE_PGP
 #include "pgp.h"
@@ -83,13 +83,13 @@ int imap_read_headers (IMAP_DATA * idata, int msgbegin, int msgend)
 
   /* instead of downloading all headers and then parsing them, we parse them
    * as they come in. */
-  mutt_mktemp (tempfile);
-  if (!(fp = safe_fopen (tempfile, "w+"))) {
-    mutt_error (_("Could not create temporary file %s"), tempfile);
-    mutt_sleep (2);
+  fp = m_tempfile(tempfile, sizeof(tempfile), NONULL(Tempdir), NULL);
+  if (!fp) {
+    mutt_error(_("Could not create temporary file"));
+    mutt_sleep(2);
     return -1;
   }
-  unlink (tempfile);
+  unlink(tempfile);
 
   /* make sure context has room to hold the mailbox */
   while ((msgend) >= idata->ctx->hdrmax)
@@ -291,6 +291,50 @@ int imap_read_headers (IMAP_DATA * idata, int msgbegin, int msgend)
   return msgend;
 }
 
+/* move all the headers from extra not present in base into base */
+static void mutt_merge_envelopes(ENVELOPE* base, ENVELOPE** extra)
+{
+  /* copies each existing element if necessary, and sets the element
+  * to NULL in the source so that envelope_delete doesn't leave us
+  * with dangling pointers. */
+#define MOVE_ELEM(h) if (!base->h) { base->h = (*extra)->h; (*extra)->h = NULL; }
+  MOVE_ELEM(return_path);
+  MOVE_ELEM(from);
+  MOVE_ELEM(to);
+  MOVE_ELEM(cc);
+  MOVE_ELEM(bcc);
+  MOVE_ELEM(sender);
+  MOVE_ELEM(reply_to);
+  MOVE_ELEM(mail_followup_to);
+  MOVE_ELEM(list_post);
+  MOVE_ELEM(message_id);
+  MOVE_ELEM(supersedes);
+  MOVE_ELEM(date);
+  MOVE_ELEM(x_label);
+  if (!base->refs_changed) {
+    MOVE_ELEM(references);
+  }
+  if (!base->irt_changed) {
+    MOVE_ELEM(in_reply_to);
+  }
+  /* real_subj is subordinate to subject */
+  if (!base->subject) {
+    base->subject = (*extra)->subject;
+    base->real_subj = (*extra)->real_subj;
+    (*extra)->subject = NULL;
+    (*extra)->real_subj = NULL;
+  }
+  /* spam and user headers should never be hashed, and the new envelope may
+   * have better values. Use new versions regardless. */
+  mutt_buffer_free (&base->spam);
+  string_list_wipe(&base->userhdrs);
+  MOVE_ELEM(spam);
+  MOVE_ELEM(userhdrs);
+#undef MOVE_ELEM
+  
+  envelope_delete(extra);
+}
+
 int imap_fetch_message (MESSAGE * msg, CONTEXT * ctx, int msgno)
 {
   IMAP_DATA *idata;
@@ -332,12 +376,11 @@ int imap_fetch_message (MESSAGE * msg, CONTEXT * ctx, int msgno)
     mutt_message _("Fetching message...");
 
   cache->uid = HEADER_DATA (h)->uid;
-  mutt_mktemp (path);
-  cache->path = m_strdup(path);
-  if (!(msg->fp = safe_fopen (path, "w+"))) {
-    p_delete(&cache->path);
+  msg->fp = m_tempfile(path, sizeof(path), NONULL(Tempdir), NULL);
+  if (!msg->fp) {
     return -1;
   }
+  cache->path = m_strdup(path);
 
   /* mark this header as currently inactive so the command handler won't
    * also try to update it. HACK until all this code can be moved into the