Rocco Rutte:
authorpdmef <pdmef@e385b8ad-14ed-0310-8656-cc95a2468c6d>
Thu, 12 May 2005 20:43:48 +0000 (20:43 +0000)
committerpdmef <pdmef@e385b8ad-14ed-0310-8656-cc95a2468c6d>
Thu, 12 May 2005 20:43:48 +0000 (20:43 +0000)
move mx_check_mailbox() out to mx modules

git-svn-id: svn://svn.berlios.de/mutt-ng/trunk@289 e385b8ad-14ed-0310-8656-cc95a2468c6d

13 files changed:
imap/mx_imap.c
mbox.c
mbox.h
mh.c
mh.h
mx.c
mx.h
nntp/mx_nntp.c
nntp/nntp.c
nntp/nntp.h
pop/mx_pop.c
pop/pop.c
pop/pop.h

index cd6d71b..b44f9e1 100644 (file)
@@ -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 (file)
--- 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 (file)
--- a/mbox.h
+++ b/mbox.h
 
 #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 (file)
--- 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 (file)
--- a/mh.h
+++ b/mh.h
 
 /* 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 (file)
--- 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 (file)
--- 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);
index 8d918e6..5229a1d 100644 (file)
@@ -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);
 }
index d21f30d..09a986a 100644 (file)
@@ -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);
 }
index 03087a3..3e40fb7 100644 (file)
@@ -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);
index 2de03d7..ae1f702 100644 (file)
@@ -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);
 }
index 1e578c7..3213e92 100644 (file)
--- 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;
index 624b5c0..38205bb 100644 (file)
--- 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);