Rocco Rutte:
[apps/madmutt.git] / imap / imap.c
index 0aa906b..40489b4 100644 (file)
@@ -905,7 +905,7 @@ int imap_sync_message (IMAP_DATA *idata, HEADER *hdr, BUFFER *cmd,
   if (mutt_bit_isset (idata->rights, ACL_WRITE))
     imap_add_keywords (flags, hdr, idata->flags, sizeof (flags));
 
-  mutt_remove_trailing_ws (flags);
+  str_skip_trailws (flags);
 
   /* UW-IMAP is OK with null flags, Cyrus isn't. The only solution is to
    * explicitly revoke all system flags (if we have permission) */
@@ -916,7 +916,7 @@ int imap_sync_message (IMAP_DATA *idata, HEADER *hdr, BUFFER *cmd,
     imap_set_flag (idata, ACL_WRITE, 1, "\\Answered ", flags, sizeof (flags));
     imap_set_flag (idata, ACL_DELETE, 1, "\\Deleted ", flags, sizeof (flags));
 
-    mutt_remove_trailing_ws (flags);
+    str_skip_trailws (flags);
 
     mutt_buffer_addstr (cmd, " -FLAGS.SILENT (");
   } else
@@ -968,13 +968,6 @@ int imap_sync_mailbox (CONTEXT * ctx, int expunge, int *index_hint)
     return -1;
   }
 
-  /* CLOSE purges deleted messages. If we don't want to purge them, we must
-   * tell imap_close_mailbox not to issue the CLOSE command */
-  if (expunge)
-    idata->noclose = 0;
-  else
-    idata->noclose = 1;
-
   /* This function is only called when the calling code expects the context
    * to be changed. */
   imap_allow_reopen (ctx);
@@ -1017,7 +1010,7 @@ int imap_sync_mailbox (CONTEXT * ctx, int expunge, int *index_hint)
       /* if the message has been rethreaded or attachments have been deleted
        * we delete the message and reupload it.
        * This works better if we're expunging, of course. */
-      if (ctx->hdrs[n]->refs_changed || ctx->hdrs[n]->irt_changed ||
+      if ((ctx->hdrs[n]->env && (ctx->hdrs[n]->env->refs_changed || ctx->hdrs[n]->env->irt_changed)) ||
           ctx->hdrs[n]->attach_del) {
         debug_print (3, ("Attachments to be deleted, falling back to _mutt_save_message\n"));
         if (!appendctx)
@@ -1046,11 +1039,17 @@ int imap_sync_mailbox (CONTEXT * ctx, int expunge, int *index_hint)
     idata->reopen |= IMAP_EXPUNGE_EXPECTED;
     if (imap_exec (idata, "EXPUNGE", 0) != 0) {
       imap_error (_("imap_sync_mailbox: EXPUNGE failed"), idata->cmd.buf);
-      rc = -1;
+      rc = imap_reconnect (ctx);
       goto out;
     }
   }
 
+  if (ctx->closing) {
+    if (imap_exec (idata, "CLOSE", 0))
+      mutt_error (_("CLOSE failed"));
+    idata->state = IMAP_AUTHENTICATED;
+  }
+
   rc = 0;
 out:
   if (cmd.data)
@@ -1062,7 +1061,7 @@ out:
   return rc;
 }
 
-/* imap_close_mailbox: issue close command if neccessary, reset IMAP_DATA */
+/* imap_close_mailbox: clean up IMAP data in CONTEXT */
 void imap_close_mailbox (CONTEXT * ctx)
 {
   IMAP_DATA *idata;
@@ -1073,13 +1072,17 @@ void imap_close_mailbox (CONTEXT * ctx)
   if (!idata)
     return;
 
-  if ((idata->status != IMAP_FATAL) &&
-      (idata->state == IMAP_SELECTED) && (ctx == idata->ctx)) {
-    if (!(idata->noclose) && imap_exec (idata, "CLOSE", 0))
+  if (ctx == idata->ctx) {
+    if (idata->state = IMAP_SELECTED) {
+      /* mx_close_mailbox won't sync if there are no deleted messages
+      * and the mailbox is unchanged, so we may have to close here */
+      if (idata->status != IMAP_FATAL && !ctx->deleted && 
+          imap_exec (idata, "CLOSE", 0))
       mutt_error (_("CLOSE failed"));
+      idata->state = IMAP_AUTHENTICATED;
+    }
 
     idata->reopen &= IMAP_REOPEN_ALLOW;
-    idata->state = IMAP_AUTHENTICATED;
     FREE (&(idata->mailbox));
     mutt_free_list (&idata->flags);
     idata->ctx = NULL;
@@ -1176,7 +1179,7 @@ int imap_mailbox_check (char *path, int new)
    * command on a mailbox that you have selected 
    */
 
-  if (safe_strcmp (mbox_unquoted, idata->mailbox) == 0
+  if (mutt_strcmp (mbox_unquoted, idata->mailbox) == 0
       || (ascii_strcasecmp (mbox_unquoted, "INBOX") == 0
           && safe_strcasecmp (mbox_unquoted, idata->mailbox) == 0)) {
     strfcpy (buf, "NOOP", sizeof (buf));
@@ -1203,8 +1206,8 @@ int imap_mailbox_check (char *path, int new)
       /* The mailbox name may or may not be quoted here. We could try to 
        * munge the server response and compare with quoted (or vise versa)
        * but it is probably more efficient to just strncmp against both. */
-      if (safe_strncmp (mbox_unquoted, s, safe_strlen (mbox_unquoted)) == 0
-          || safe_strncmp (mbox, s, safe_strlen (mbox)) == 0) {
+      if (safe_strncmp (mbox_unquoted, s, mutt_strlen (mbox_unquoted)) == 0
+          || safe_strncmp (mbox, s, mutt_strlen (mbox)) == 0) {
         s = imap_next_word (s);
         s = imap_next_word (s);
         if (isdigit ((unsigned char) *s)) {
@@ -1392,14 +1395,14 @@ int imap_complete (char *dest, size_t dlen, char *path)
       /* if the folder isn't selectable, append delimiter to force browse
        * to enter it on second tab. */
       if (noselect) {
-        clen = safe_strlen (list_word);
+        clen = mutt_strlen (list_word);
         list_word[clen++] = delim;
         list_word[clen] = '\0';
       }
       /* copy in first word */
       if (!completions) {
         strfcpy (completion, list_word, sizeof (completion));
-        matchlen = safe_strlen (completion);
+        matchlen = mutt_strlen (completion);
         completions++;
         continue;
       }