Rocco Rutte:
[apps/madmutt.git] / imap / message.c
index 1d0db54..264e65b 100644 (file)
@@ -1,20 +1,11 @@
 /*
+ * Copyright notice from original mutt:
  * Copyright (C) 1996-9 Brandon Long <blong@fiction.net>
  * Copyright (C) 1999-2002 Brendan Cully <brendan@kublai.com>
- * 
- *     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
- *     the Free Software Foundation; either version 2 of the License, or
- *     (at your option) any later version.
- * 
- *     This program is distributed in the hope that it will be useful,
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *     GNU General Public License for more details.
- * 
- *     You should have received a copy of the GNU General Public License
- *     along with this program; if not, write to the Free Software
- *     Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
+ *
+ * This file is part of mutt-ng, see http://www.muttng.org/.
+ * It's licensed under the GNU General Public License,
+ * please see the file GPL in the top level source directory.
  */
 
 /* message parsing/updating functions */
 #include "pgp.h"
 #endif
 
+#include "lib/mem.h"
+#include "lib/intl.h"
+#include "lib/str.h"
+#include "lib/debug.h"
+
 #if HAVE_STDINT_H
 #include <stdint.h>
 #elif HAVE_INTTYPES_H
@@ -76,7 +72,7 @@ int imap_read_headers (IMAP_DATA * idata, int msgbegin, int msgend)
 
 #if USE_HCACHE
   void *hc = NULL;
-  uint64_t *uid_validity = NULL;
+  unsigned long *uid_validity = NULL;
   char uid_buf[64];
 #endif /* USE_HCACHE */
 
@@ -159,16 +155,14 @@ int imap_read_headers (IMAP_DATA * idata, int msgbegin, int msgend)
 
       sprintf (uid_buf, "/%u", h.data->uid);    /* XXX --tg 21:41 04-07-11 */
       uid_validity =
-        (uint64_t *) mutt_hcache_fetch (hc, uid_buf, &imap_hcache_keylen);
+        (unsigned long *) mutt_hcache_fetch (hc, uid_buf, &imap_hcache_keylen);
 
       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)
-          dprint (1,
-                  (debugfile,
-                   "imap_read_headers: msgcount and sequence ID are inconsistent!"));
+          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;
@@ -259,9 +253,7 @@ int imap_read_headers (IMAP_DATA * idata, int msgbegin, int msgend)
 
       ctx->hdrs[msgno]->index = h.sid - 1;
       if (h.sid != ctx->msgcount + 1)
-        dprint (1,
-                (debugfile,
-                 "imap_read_headers: msgcount and sequence ID are inconsistent!"));
+        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;
@@ -562,8 +554,7 @@ int imap_append_message (CONTEXT * ctx, MESSAGE * msg)
   if (rc != IMAP_CMD_RESPOND) {
     char *pc;
 
-    dprint (1, (debugfile, "imap_append_message(): command failed: %s\n",
-                idata->cmd.buf));
+    debug_print (1, ("command failed: %s\n", idata->cmd.buf));
 
     pc = idata->cmd.buf + SEQLEN;
     SKIPWS (pc);
@@ -599,8 +590,7 @@ int imap_append_message (CONTEXT * ctx, MESSAGE * msg)
   if (!imap_code (idata->cmd.buf)) {
     char *pc;
 
-    dprint (1, (debugfile, "imap_append_message(): command failed: %s\n",
-                idata->cmd.buf));
+    debug_print (1, ("command failed: %s\n", idata->cmd.buf));
     pc = idata->cmd.buf + SEQLEN;
     SKIPWS (pc);
     pc = imap_next_word (pc);
@@ -626,37 +616,36 @@ fail:
 int imap_copy_messages (CONTEXT * ctx, HEADER * h, char *dest, int delete)
 {
   IMAP_DATA *idata;
-  BUFFER cmd;
+  BUFFER cmd, sync_cmd;
   char uid[11];
   char mbox[LONG_STRING];
   char mmbox[LONG_STRING];
   int rc;
   int n;
   IMAP_MBOX mx;
+  int err_continue = M_NO;
 
   idata = (IMAP_DATA *) ctx->data;
 
   if (imap_parse_path (dest, &mx)) {
-    dprint (1, (debugfile, "imap_copy_messages: bad destination %s\n", dest));
+    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))) {
-    dprint (3, (debugfile, "imap_copy_messages: %s not same server as %s\n",
-                dest, ctx->path));
+    debug_print (3, ("%s not same server as %s\n", dest, ctx->path));
     return 1;
   }
 
   if (h && h->attach_del) {
-    dprint (3,
-            (debugfile,
-             "imap_copy_messages: Message contains attachments to be deleted\n"));
+    debug_print (3, ("Message contains attachments to be deleted\n"));
     return 1;
   }
 
   imap_fix_path (idata, mx.mbox, mbox, sizeof (mbox));
 
+  memset (&sync_cmd, 0, sizeof (sync_cmd));
   memset (&cmd, 0, sizeof (cmd));
   mutt_buffer_addstr (&cmd, "UID COPY ");
 
@@ -667,16 +656,25 @@ int imap_copy_messages (CONTEXT * ctx, HEADER * h, char *dest, int delete)
      * remainder. */
     for (n = 0; n < ctx->msgcount; n++) {
       if (ctx->hdrs[n]->tagged && ctx->hdrs[n]->attach_del) {
-        dprint (3,
-                (debugfile,
-                 "imap_copy_messages: Message contains attachments to be deleted\n"));
+        debug_print (3, ("Message contains attachments to be deleted\n"));
         return 1;
       }
+
+      if (ctx->hdrs[n]->tagged && ctx->hdrs[n]->active &&
+         ctx->hdrs[n]->changed)
+      {
+       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) {
-      dprint (1, (debugfile, "imap_copy_messages: No messages tagged\n"));
+      debug_print (1, ("No messages tagged\n"));
       goto fail;
     }
     mutt_message (_("Copying %d messages to %s..."), rc, mbox);
@@ -685,6 +683,16 @@ int imap_copy_messages (CONTEXT * ctx, HEADER * h, char *dest, int delete)
     mutt_message (_("Copying message %d to %s..."), h->index + 1, mbox);
     snprintf (uid, sizeof (uid), "%u", HEADER_DATA (h)->uid);
     mutt_buffer_addstr (&cmd, uid);
+
+    if (h->active && h->changed)
+    {
+      rc = imap_sync_message (idata, h, &sync_cmd, &err_continue);
+      if (rc < 0)
+      {
+       debug_print (1, ("could not sync\n"));
+       goto fail;
+      }
+    }
   }
 
   /* let's get it on */
@@ -700,8 +708,7 @@ int imap_copy_messages (CONTEXT * ctx, HEADER * h, char *dest, int delete)
       imap_error ("imap_copy_messages", idata->cmd.buf);
       goto fail;
     }
-    dprint (2,
-            (debugfile, "imap_copy_messages: server suggests TRYCREATE\n"));
+    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 ();
@@ -739,12 +746,16 @@ int imap_copy_messages (CONTEXT * ctx, HEADER * h, char *dest, int delete)
 
   if (cmd.data)
     FREE (&cmd.data);
+  if (sync_cmd.data)
+    FREE (&sync_cmd.data);
   FREE (&mx.mbox);
   return 0;
 
 fail:
   if (cmd.data)
     FREE (&cmd.data);
+  if (sync_cmd.data)
+    FREE (&sync_cmd.data);
   FREE (&mx.mbox);
   return -1;
 }
@@ -790,7 +801,7 @@ char *imap_set_flags (IMAP_DATA * idata, HEADER * h, char *s)
   memset (&newh, 0, sizeof (newh));
   newh.data = safe_calloc (1, sizeof (IMAP_HEADER_DATA));
 
-  dprint (2, (debugfile, "imap_fetch_message: parsing FLAGS\n"));
+  debug_print (2, ("parsing FLAGS\n"));
   if ((s = msg_parse_flags (&newh, s)) == NULL) {
     FREE (&newh.data);
     return NULL;
@@ -887,7 +898,7 @@ static int msg_fetch_header (CONTEXT * ctx, IMAP_HEADER * h, char *buf,
 #if USE_HCACHE
 static size_t imap_hcache_keylen (const char *fn)
 {
-  return mutt_strlen (fn);
+  return safe_strlen (fn);
 }
 
 /* msg_fetch_header: import IMAP FETCH response into an IMAP_HEADER.
@@ -943,7 +954,7 @@ static int msg_has_flag (LIST * flag_list, const char *flag)
 
   flag_list = flag_list->next;
   while (flag_list) {
-    if (!ascii_strncasecmp (flag_list->data, flag, strlen (flag_list->data)))
+    if (!ascii_strncasecmp (flag_list->data, flag, safe_strlen (flag_list->data)))
       return 1;
 
     flag_list = flag_list->next;
@@ -979,9 +990,7 @@ static int msg_parse_fetch (IMAP_HEADER * h, char *s)
       s += 12;
       SKIPWS (s);
       if (*s != '\"') {
-        dprint (1,
-                (debugfile,
-                 "msg_parse_fetch(): bogus INTERNALDATE entry: %s\n", s));
+        debug_print (1, ("bogus INTERNALDATE entry: %s\n", s));
         return -1;
       }
       s++;
@@ -1027,13 +1036,13 @@ static char *msg_parse_flags (IMAP_HEADER * h, char *s)
 
   /* sanity-check string */
   if (ascii_strncasecmp ("FLAGS", s, 5) != 0) {
-    dprint (1, (debugfile, "msg_parse_flags: not a FLAGS response: %s\n", s));
+    debug_print (1, ("not a FLAGS response: %s\n", s));
     return NULL;
   }
   s += 5;
   SKIPWS (s);
   if (*s != '(') {
-    dprint (1, (debugfile, "msg_parse_flags: bogus FLAGS response: %s\n", s));
+    debug_print (1, ("bogus FLAGS response: %s\n", s));
     return NULL;
   }
   s++;
@@ -1086,8 +1095,7 @@ static char *msg_parse_flags (IMAP_HEADER * h, char *s)
     s++;
   }
   else {
-    dprint (1, (debugfile,
-                "msg_parse_flags: Unterminated FLAGS response: %s\n", s));
+    debug_print (1, ("Unterminated FLAGS response: %s\n", s));
     return NULL;
   }