From baf86ef44a449017ea20c3fcb252b66dc43fe6ce Mon Sep 17 00:00:00 2001 From: pdmef Date: Thu, 12 May 2005 20:43:48 +0000 Subject: [PATCH] Rocco Rutte: move mx_check_mailbox() out to mx modules git-svn-id: svn://svn.berlios.de/mutt-ng/trunk@289 e385b8ad-14ed-0310-8656-cc95a2468c6d --- imap/mx_imap.c | 7 +++++++ mbox.c | 25 +++++++++++++++++++++++-- mbox.h | 3 +-- mh.c | 15 ++++++++------- mh.h | 2 -- mx.c | 51 ++++---------------------------------------------- mx.h | 29 ++++++++++++++-------------- nntp/mx_nntp.c | 1 + nntp/nntp.c | 2 +- nntp/nntp.h | 2 +- pop/mx_pop.c | 1 + pop/pop.c | 2 +- pop/pop.h | 2 +- 13 files changed, 64 insertions(+), 78 deletions(-) diff --git a/imap/mx_imap.c b/imap/mx_imap.c index cd6d71b..b44f9e1 100644 --- a/imap/mx_imap.c +++ b/imap/mx_imap.c @@ -46,6 +46,12 @@ static int imap_open_new_message (MESSAGE * msg, CONTEXT * dest, HEADER * hdr) 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)); @@ -58,5 +64,6 @@ mx_t* imap_reg_mx (void) { 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); } diff --git a/mbox.c b/mbox.c index ddd144d..5c00fea 100644 --- a/mbox.c +++ b/mbox.c @@ -536,7 +536,7 @@ int mbox_strict_cmp_headers (const HEADER * h1, const HEADER * h2) * 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]; @@ -630,6 +630,26 @@ int mbox_check_mailbox (CONTEXT * ctx, int *index_hint) 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 @@ -676,7 +696,7 @@ static int _mbox_sync_mailbox (CONTEXT * ctx, int unused, int *index_hint) } /* 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; @@ -1221,6 +1241,7 @@ static mx_t* reg_mx (void) { 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); } diff --git a/mbox.h b/mbox.h index 5379c56..8c26e82 100644 --- a/mbox.h +++ b/mbox.h @@ -23,11 +23,10 @@ #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 *); diff --git a/mh.c b/mh.c index 91d584c..1bcf9c1 100644 --- a/mh.c +++ b/mh.c @@ -71,6 +71,8 @@ struct mh_sequences { /* 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) { @@ -1381,9 +1383,9 @@ static int mh_sync_mailbox (CONTEXT * ctx, int unused, int *index_hint) #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; @@ -1546,7 +1548,7 @@ static void maildir_update_flags (CONTEXT * ctx, HEADER * o, HEADER * n) * 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 */ @@ -1561,9 +1563,6 @@ int maildir_check_mailbox (CONTEXT * ctx, int *index_hint) 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; @@ -1686,7 +1685,7 @@ int maildir_check_mailbox (CONTEXT * ctx, int *index_hint) * */ -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; @@ -1984,6 +1983,7 @@ mx_t* mh_reg_mx (void) { 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); } @@ -1994,5 +1994,6 @@ mx_t* maildir_reg_mx (void) { 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); } diff --git a/mh.h b/mh.h index 9e1089e..78ad651 100644 --- a/mh.h +++ b/mh.h @@ -21,11 +21,9 @@ /* 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 *); diff --git a/mx.c b/mx.c index 8b42726..321ebcb 100644 --- a/mx.c +++ b/mx.c @@ -1156,10 +1156,7 @@ MESSAGE *mx_open_new_message (CONTEXT * dest, HEADER * hdr, int flags) } /* 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); @@ -1168,53 +1165,13 @@ int mx_check_mailbox (CONTEXT * ctx, int *index_hint, int lock) 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 */ diff --git a/mx.h b/mx.h index cf032d4..a537636 100644 --- a/mx.h +++ b/mx.h @@ -96,6 +96,8 @@ typedef struct { /* 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 */ @@ -106,28 +108,20 @@ typedef struct { 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); /* @@ -154,6 +148,13 @@ int mx_set_magic (const char *); /* 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); diff --git a/nntp/mx_nntp.c b/nntp/mx_nntp.c index 8d918e6..5229a1d 100644 --- a/nntp/mx_nntp.c +++ b/nntp/mx_nntp.c @@ -49,5 +49,6 @@ mx_t* nntp_reg_mx (void) { 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); } diff --git a/nntp/nntp.c b/nntp/nntp.c index d21f30d..09a986a 100644 --- a/nntp/nntp.c +++ b/nntp/nntp.c @@ -1198,7 +1198,7 @@ static int _nntp_check_mailbox (CONTEXT * ctx, NNTP_DATA * nntp_data) 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); } diff --git a/nntp/nntp.h b/nntp/nntp.h index 03087a3..3e40fb7 100644 --- a/nntp/nntp.h +++ b/nntp/nntp.h @@ -104,7 +104,7 @@ void nntp_clear_cacheindex (NNTP_SERVER *); 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); diff --git a/pop/mx_pop.c b/pop/mx_pop.c index 2de03d7..ae1f702 100644 --- a/pop/mx_pop.c +++ b/pop/mx_pop.c @@ -48,5 +48,6 @@ mx_t* pop_reg_mx (void) { 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); } diff --git a/pop/pop.c b/pop/pop.c index 1e578c7..3213e92 100644 --- a/pop/pop.c +++ b/pop/pop.c @@ -466,7 +466,7 @@ pop_query_status pop_sync_mailbox (CONTEXT * ctx, int unused, int *index_hint) } /* 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; diff --git a/pop/pop.h b/pop/pop.h index 624b5c0..38205bb 100644 --- a/pop/pop.h +++ b/pop/pop.h @@ -102,7 +102,7 @@ void pop_logout (CONTEXT *); 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); -- 2.20.1