/* message parsing/updating functions */
-#if HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include <stdlib.h>
-#include <ctype.h>
-
-#include <lib-lib/mem.h>
-#include <lib-lib/ascii.h>
-#include <lib-lib/str.h>
-#include <lib-lib/buffer.h>
-#include <lib-lib/debug.h>
+#include <lib-lib/lib-lib.h>
#include <lib-ui/curses.h>
#include "pgp.h"
#endif
-#include <lib-lib/macros.h>
-#include <lib-lib/file.h>
-
-#if HAVE_STDINT_H
-#include <stdint.h>
-#elif HAVE_INTTYPES_H
-#include <inttypes.h>
-#endif
-
static void flush_buffer (char *buf, size_t * len, CONNECTION * conn);
static int msg_fetch_header (CONTEXT * ctx, IMAP_HEADER * h, char *buf,
FILE * fp);
if (uid_validity != NULL && *uid_validity == idata->uid_validity) {
ctx->hdrs[msgno] = mutt_hcache_restore((unsigned char *) uid_validity, 0);
ctx->hdrs[msgno]->index = h.sid - 1;
- if (h.sid != ctx->msgcount + 1)
- debug_print (1, ("imap_read_headers: msgcount and sequence ID are inconsistent!"));
/* messages which have not been expunged are ACTIVE (borrowed from mh
* folders) */
ctx->hdrs[msgno]->active = 1;
ctx->hdrs[msgno] = header_new();
ctx->hdrs[msgno]->index = h.sid - 1;
- if (h.sid != ctx->msgcount + 1)
- debug_print (1, ("msgcount and sequence ID are inconsistent!\n"));
/* messages which have not been expunged are ACTIVE (borrowed from mh
* folders) */
ctx->hdrs[msgno]->active = 1;
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;
if (rc != IMAP_CMD_RESPOND) {
char *pc;
- debug_print (1, ("command failed: %s\n", idata->cmd.buf));
-
pc = vskipspaces(idata->cmd.buf + SEQLEN);
pc = imap_next_word (pc);
mutt_error ("%s", pc);
if (!imap_code (idata->cmd.buf)) {
char *pc;
- debug_print (1, ("command failed: %s\n", idata->cmd.buf));
pc = vskipspaces(idata->cmd.buf + SEQLEN);
pc = imap_next_word (pc);
mutt_error ("%s", pc);
idata = (IMAP_DATA *) ctx->data;
if (imap_parse_path (dest, &mx)) {
- debug_print (1, ("bad destination %s\n", dest));
return -1;
}
/* check that the save-to folder is in the same account */
if (!mutt_account_match (&(CTX_DATA->conn->account), &(mx.account))) {
- debug_print (3, ("%s not same server as %s\n", dest, ctx->path));
return 1;
}
if (h && h->attach_del) {
- debug_print (3, ("Message contains attachments to be deleted\n"));
return 1;
}
* remainder. */
for (n = 0; n < ctx->msgcount; n++) {
if (ctx->hdrs[n]->tagged && ctx->hdrs[n]->attach_del) {
- debug_print (3, ("Message contains attachments to be deleted\n"));
return 1;
}
rc = imap_sync_message (idata, ctx->hdrs[n], &sync_cmd, &err_continue);
if (rc < 0)
{
- debug_print (1, ("could not sync\n"));
goto fail;
}
}
rc = imap_make_msg_set (idata, &cmd, M_TAG, 0);
if (!rc) {
- debug_print (1, ("No messages tagged\n"));
goto fail;
}
mutt_message (_("Copying %d messages to %s..."), rc, mbox);
rc = imap_sync_message (idata, h, &sync_cmd, &err_continue);
if (rc < 0)
{
- debug_print (1, ("could not sync\n"));
goto fail;
}
}
imap_error ("imap_copy_messages", idata->cmd.buf);
goto fail;
}
- debug_print (2, ("server suggests TRYCREATE\n"));
snprintf (mmbox, sizeof (mmbox), _("Create %s?"), mbox);
if (option (OPTCONFIRMCREATE) && mutt_yesorno (mmbox, 1) < 1) {
mutt_clear_error ();
p_clear(&newh, 1);
newh.data = p_new(IMAP_HEADER_DATA, 1);
- debug_print (2, ("parsing FLAGS\n"));
if ((s = msg_parse_flags (&newh, s)) == NULL) {
p_delete(&newh.data);
return NULL;
else if (ascii_strncasecmp ("INTERNALDATE", s, 12) == 0) {
s = vskipspaces(s + 12);
if (*s != '\"') {
- debug_print (1, ("bogus INTERNALDATE entry: %s\n", s));
return -1;
}
s++;
/* sanity-check string */
if (ascii_strncasecmp ("FLAGS", s, 5) != 0) {
- debug_print (1, ("not a FLAGS response: %s\n", s));
return NULL;
}
s = vskipspaces(s + 5);
if (*s != '(') {
- debug_print (1, ("bogus FLAGS response: %s\n", s));
return NULL;
}
s++;
s++;
}
else {
- debug_print (1, ("Unterminated FLAGS response: %s\n", s));
return NULL;
}