return 0;
}
+/* this ugly kludge is required since the last int to
+ * imap_check_mailbox() doesn't mean 'lock' but 'force'... */
+static int _imap_check_mailbox (CONTEXT* ctx, int* index_hint, int lock) {
+ return (imap_check_mailbox (ctx, index_hint, 0));
+}
+
mx_t* imap_reg_mx (void) {
mx_t* fmt = safe_calloc (1, sizeof (mx_t));
fmt->mx_acl_check = acl_check_imap;
fmt->mx_fastclose_mailbox = imap_close_mailbox;
fmt->mx_sync_mailbox = imap_sync_mailbox;
+ fmt->mx_check_mailbox = _imap_check_mailbox;
return (fmt);
}
* 0 no change
* -1 error
*/
-int mbox_check_mailbox (CONTEXT * ctx, int *index_hint)
+static int _mbox_check_mailbox (CONTEXT * ctx, int *index_hint)
{
struct stat st;
char buffer[LONG_STRING];
return (-1);
}
+static int mbox_check_mailbox (CONTEXT* ctx, int* index_hint, int lock) {
+ int rc = 0;
+
+ if (lock) {
+ mutt_block_signals ();
+ if (mbox_lock_mailbox (ctx, 0, 0) == -1) {
+ mutt_unblock_signals ();
+ return M_LOCKED;
+ }
+ }
+
+ rc = _mbox_check_mailbox (ctx, index_hint);
+
+ if (lock) {
+ mutt_unblock_signals ();
+ mbox_unlock_mailbox (ctx);
+ }
+ return rc;
+}
+
/* return values:
* 0 success
* -1 failure
}
/* Check to make sure that the file hasn't changed on disk */
- if ((i = mbox_check_mailbox (ctx, index_hint)) == M_NEW_MAIL
+ if ((i = _mbox_check_mailbox (ctx, index_hint)) == M_NEW_MAIL
|| i == M_REOPENED) {
/* new mail arrived, or mailbox reopened */
need_sort = i;
fmt->mx_open_mailbox = mbox_open_mailbox;
fmt->mx_open_new_message = mbox_open_new_message;
fmt->mx_sync_mailbox = mbox_sync_mailbox;
+ fmt->mx_check_mailbox = mbox_check_mailbox;
return (fmt);
}
#define MMDF_SEP "\001\001\001\001\n"
-int mbox_check_mailbox (CONTEXT *, int *);
int mbox_close_mailbox (CONTEXT *);
int mbox_lock_mailbox (CONTEXT *, int, int);
void mbox_unlock_mailbox (CONTEXT *);
-int mbox_check_empty (const char *);
+int mbox_check_empty (const char*);
int mbox_is_magic (const char*, struct stat*);
int mbox_strict_cmp_headers (const HEADER *, const HEADER *);
/* prototypes */
static int maildir_check_empty (const char*);
+static int maildir_check_mailbox (CONTEXT*, int*, int);
+static int mh_check_mailbox (CONTEXT*, int*, int);
static void mhs_alloc (struct mh_sequences *mhs, int i)
{
#endif /* USE_HCACHE */
if (ctx->magic == M_MH)
- i = mh_check_mailbox (ctx, index_hint);
+ i = mh_check_mailbox (ctx, index_hint, 0);
else
- i = maildir_check_mailbox (ctx, index_hint);
+ i = maildir_check_mailbox (ctx, index_hint, 0);
if (i != 0)
return i;
* either subdirectory differently, as mail could be copied directly into
* the cur directory from another agent.
*/
-int maildir_check_mailbox (CONTEXT * ctx, int *index_hint)
+static int maildir_check_mailbox (CONTEXT * ctx, int *index_hint, int unused)
{
struct stat st_new; /* status of the "new" subdirectory */
struct stat st_cur; /* status of the "cur" subdirectory */
HASH *fnames; /* hash table for quickly looking up the base filename
for a maildir message */
- /* XXX seems like this check belongs in mx_check_mailbox()
- * rather than here.
- */
if (!option (OPTCHECKNEW))
return 0;
*
*/
-int mh_check_mailbox (CONTEXT * ctx, int *index_hint)
+static int mh_check_mailbox (CONTEXT * ctx, int *index_hint, int unused)
{
char buf[_POSIX_PATH_MAX];
struct stat st, st_cur;
fmt->mx_is_magic = mh_is_magic;
fmt->mx_open_mailbox = mh_read_dir;
fmt->mx_open_new_message = mh_open_new_message;
+ fmt->mx_check_mailbox = mh_check_mailbox;
return (fmt);
}
fmt->mx_is_magic = maildir_is_magic;
fmt->mx_open_mailbox = maildir_read_dir;
fmt->mx_open_new_message = maildir_open_new_message;
+ fmt->mx_check_mailbox = maildir_check_mailbox;
return (fmt);
}
/* TODO all of these must disappear to achieve good information hiding */
-int mh_check_mailbox (CONTEXT *, int *);
int mh_buffy (const char *);
int mh_commit_message (CONTEXT *, MESSAGE *, HEADER *);
-int maildir_check_mailbox (CONTEXT *, int *);
int maildir_commit_message (CONTEXT *, MESSAGE *, HEADER *);
FILE *maildir_open_find_message (const char *, const char *);
}
/* check for new mail */
-int mx_check_mailbox (CONTEXT * ctx, int *index_hint, int lock)
-{
- int rc;
-
+int mx_check_mailbox (CONTEXT * ctx, int *index_hint, int lock) {
#ifdef USE_COMPRESSED
if (ctx->compressinfo)
return mutt_check_mailbox_compressed (ctx);
if (ctx) {
if (ctx->locked)
lock = 0;
-
- switch (ctx->magic) {
- case M_MBOX:
- case M_MMDF:
-
- if (lock) {
- mutt_block_signals ();
- if (mbox_lock_mailbox (ctx, 0, 0) == -1) {
- mutt_unblock_signals ();
- return M_LOCKED;
- }
- }
-
- rc = mbox_check_mailbox (ctx, index_hint);
-
- if (lock) {
- mutt_unblock_signals ();
- mbox_unlock_mailbox (ctx);
- }
-
- return rc;
-
-
- case M_MH:
- return (mh_check_mailbox (ctx, index_hint));
- case M_MAILDIR:
- return (maildir_check_mailbox (ctx, index_hint));
-
-#ifdef USE_IMAP
- case M_IMAP:
- return (imap_check_mailbox (ctx, index_hint, 0));
-#endif /* USE_IMAP */
-
-#ifdef USE_POP
- case M_POP:
- return (pop_check_mailbox (ctx, index_hint));
-#endif /* USE_POP */
-
-#ifdef USE_NNTP
- case M_NNTP:
- return (nntp_check_mailbox (ctx));
-#endif /* USE_NNTP */
- }
+ if (MX_COMMAND(ctx->magic-1,mx_check_mailbox))
+ return (MX_COMMAND(ctx->magic-1,mx_check_mailbox)(ctx, index_hint, lock));
}
debug_print (1, ("null or invalid context.\n"));
return (-1);
+
}
/* return a stream pointer for a message */
/* check ACL flags; if not implemented, always assume granted
* permissions */
int (*mx_acl_check) (CONTEXT*, int);
+ /* check for new mail; see mx_check_mailbox() below for return vals */
+ int (*mx_check_mailbox) (CONTEXT*, int*, int);
/* fast closing */
void (*mx_fastclose_mailbox) (CONTEXT*);
/* write out changes */
void mx_init (void);
/* flags for mx_open_mailbox() */
-#define M_NOSORT (1<<0) /* do not sort the mailbox after opening it */
-#define M_APPEND (1<<1) /* open mailbox for appending messages */
-#define M_READONLY (1<<2) /* open in read-only mode */
-#define M_QUIET (1<<3) /* do not print any messages */
-#define M_NEWFOLDER (1<<4) /* create a new folder - same as M_APPEND, but uses
+#define M_NOSORT (1<<0) /* do not sort the mailbox after opening it */
+#define M_APPEND (1<<1) /* open mailbox for appending messages */
+#define M_READONLY (1<<2) /* open in read-only mode */
+#define M_QUIET (1<<3) /* do not print any messages */
+#define M_NEWFOLDER (1<<4) /* create a new folder - same as M_APPEND, but uses
* safe_fopen() for mbox-style folders. */
#define M_COUNT (1<<5) /* just do counting? needed to do speed optimizations
for sidebar */
/* mx_open_new_message() */
-#define M_ADD_FROM 1 /* add a From_ line */
+#define M_ADD_FROM 1 /* add a From_ line */
#define MAXLOCKATTEMPT 5
-/* return values from mx_check_mailbox() */
-enum {
- M_NEW_MAIL = 1, /* new mail received in mailbox */
- M_LOCKED, /* couldn't lock the mailbox */
- M_REOPENED, /* mailbox was reopened */
- M_FLAGS /* nondestructive flags change (IMAP) */
-};
-
WHERE short DefaultMagic INITVAL (M_MBOX);
/*
/* tests whether given folder magic is (valid and) local */
int mx_is_local (int);
+/* return values from mx_check_mailbox() */
+enum {
+ M_NEW_MAIL = 1, /* new mail received in mailbox */
+ M_LOCKED, /* couldn't lock the mailbox */
+ M_REOPENED, /* mailbox was reopened */
+ M_FLAGS /* nondestructive flags change (IMAP) */
+};
int mx_check_mailbox (CONTEXT *, int *, int);
int mx_access (const char *, int);
fmt->mx_acl_check = acl_check_nntp;
fmt->mx_fastclose_mailbox = nntp_fastclose_mailbox;
fmt->mx_sync_mailbox = nntp_sync_mailbox;
+ fmt->mx_check_mailbox = nntp_check_mailbox;
return (fmt);
}
return 0;
}
-int nntp_check_mailbox (CONTEXT * ctx)
+int nntp_check_mailbox (CONTEXT * ctx, int* unused1, int unused2)
{
return _nntp_check_mailbox (ctx, (NNTP_DATA *) ctx->data);
}
int mutt_newsrc_update (NNTP_SERVER *);
int nntp_open_mailbox (CONTEXT *);
int nntp_sync_mailbox (CONTEXT *, int, int*);
-int nntp_check_mailbox (CONTEXT *);
+int nntp_check_mailbox (CONTEXT *, int*, int);
int nntp_close_mailbox (CONTEXT *);
void nntp_fastclose_mailbox (CONTEXT *);
int nntp_fetch_message (MESSAGE *, CONTEXT *, int);
fmt->mx_acl_check = acl_check_pop;
fmt->mx_fastclose_mailbox = pop_close_mailbox;
fmt->mx_sync_mailbox = pop_sync_mailbox;
+ fmt->mx_check_mailbox = pop_check_mailbox;
return (fmt);
}
}
/* Check for new messages and fetch headers */
-int pop_check_mailbox (CONTEXT * ctx, int *index_hint)
+int pop_check_mailbox (CONTEXT * ctx, int *index_hint, int unused)
{
int ret;
POP_DATA *pop_data = (POP_DATA *) ctx->data;
void pop_error (POP_DATA *, char *);
/* pop.c */
-int pop_check_mailbox (CONTEXT *, int *);
+int pop_check_mailbox (CONTEXT *, int *, int);
int pop_open_mailbox (CONTEXT *);
pop_query_status pop_sync_mailbox (CONTEXT *, int, int *);
int pop_fetch_message (MESSAGE *, CONTEXT *, int);