* detected, do expunge) */
void imap_cmd_finish (const char* seq, IMAP_DATA* idata)
{
- if ((idata->state == IMAP_SELECTED) &&
- !idata->selected_ctx->closing &&
- (idata->status == IMAP_NEW_MAIL ||
- idata->status == IMAP_EXPUNGE))
+ if (!(idata->state == IMAP_SELECTED) || idata->selected_ctx->closing)
+ {
+ idata->status = 0;
+ mutt_clear_error ();
+ return;
+ }
+
+ if ((idata->status == IMAP_NEW_MAIL ||
+ idata->status == IMAP_EXPUNGE ||
+ (idata->reopen & (IMAP_REOPEN_PENDING|IMAP_NEWMAIL_PENDING)))
+ && (idata->reopen & IMAP_REOPEN_ALLOW))
{
int count = idata->newMailCount;
- if (idata->status == IMAP_NEW_MAIL && count > idata->selected_ctx->msgcount)
+ if (!(idata->reopen & IMAP_REOPEN_PENDING) &&
+ ((idata->status == IMAP_NEW_MAIL) || (idata->reopen & IMAP_NEWMAIL_PENDING))
+ && count > idata->selected_ctx->msgcount)
{
/* read new mail messages */
dprint (1, (debugfile, "imap_cmd_finish: fetching new mail\n"));
count = imap_read_headers (idata->selected_ctx,
idata->selected_ctx->msgcount, count - 1) + 1;
idata->check_status = IMAP_NEW_MAIL;
+ idata->reopen &= ~IMAP_NEWMAIL_PENDING;
}
else
{
imap_reopen_mailbox (idata->selected_ctx, NULL);
idata->check_status = IMAP_REOPENED;
+ idata->reopen &= ~(IMAP_REOPEN_PENDING|IMAP_NEWMAIL_PENDING);
}
- idata->status = 0;
-
- mutt_clear_error ();
}
+ else if (!(idata->reopen & IMAP_REOPEN_ALLOW))
+ {
+ if (idata->status == IMAP_NEW_MAIL)
+ idata->reopen |= IMAP_NEWMAIL_PENDING;
+
+ if (idata->status == IMAP_EXPUNGE)
+ idata->reopen |= IMAP_REOPEN_PENDING;
+ }
+
+ idata->status = 0;
+ mutt_clear_error ();
}
/* imap_code: returns 1 if the command result was OK, or 0 if NO or BAD */
int imap_subscribe (char *path, int subscribe);
int imap_complete (char* dest, size_t dlen, char* path);
+void imap_allow_reopen (CONTEXT *ctx);
+void imap_disallow_reopen (CONTEXT *ctx);
+
/* browse.c */
int imap_init_browse (char *path, struct browser_state *state);
#define M_IMAP_PASS (1<<3)
#define M_IMAP_CRAM (1<<4)
+#define IMAP_REOPEN_ALLOW (1<<0)
+#define IMAP_REOPEN_PENDING (1<<1)
+#define IMAP_NEWMAIL_PENDING (1<<2)
+
enum
{
IMAP_FATAL = 1,
unsigned char rights[(RIGHTSMAX + 7)/8];
unsigned int newMailCount;
IMAP_CACHE cache[IMAP_CACHE_LEN];
+ short reopen;
+
/* all folder flags - system flags AND keywords */
LIST *flags;
} IMAP_DATA;
/* general IMAP utility functions */
#include "mutt.h"
+#include "mx.h" /* for M_IMAP */
#include "imap_private.h"
#include <stdlib.h>
return rc;
}
+/* Allow/disallow re-opening a folder upon expunge. */
+
+void imap_allow_reopen (CONTEXT *ctx)
+{
+ if (ctx->magic == M_IMAP)
+ CTX_DATA->reopen |= IMAP_REOPEN_ALLOW;
+}
+
+void imap_disallow_reopen (CONTEXT *ctx)
+{
+ if (ctx->magic == M_IMAP)
+ CTX_DATA->reopen &= ~IMAP_REOPEN_ALLOW;
+}