Andreas Krennmair:
[apps/madmutt.git] / buffy.c
diff --git a/buffy.c b/buffy.c
index 334a164..757d583 100644 (file)
--- a/buffy.c
+++ b/buffy.c
  *     Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  */
 
+#if HAVE_CONFIG_H
+# include "config.h"
+#endif
+
 #include "mutt.h"
 #include "buffy.h"
 #include "mailbox.h"
@@ -263,7 +267,7 @@ int mutt_buffy_check (int force)
   char path[_POSIX_PATH_MAX];
   struct stat contex_sb;
   time_t t;
-
+  CONTEXT *ctx;
 #ifdef USE_IMAP
   /* update postponed count as well, on force */
   if (force)
@@ -299,6 +303,8 @@ int mutt_buffy_check (int force)
   
   for (tmp = Incoming; tmp; tmp = tmp->next)
   {
+       if ( tmp->new == 1 )
+               tmp->has_new = 1;
     tmp->new = 0;
 
 #ifdef USE_IMAP
@@ -353,10 +359,27 @@ int mutt_buffy_check (int force)
       case M_MBOX:
       case M_MMDF:
 
-       if (STAT_CHECK)
+    {
+       if (STAT_CHECK || tmp->msgcount == 0)
        {
+         BUFFY b = *tmp;
+         int msgcount = 0;
+         int msg_unread = 0;
          BuffyCount++;
-         tmp->new = 1;
+         /* parse the mailbox, to see how much mail there is */
+         ctx = mx_open_mailbox( tmp->path, M_READONLY | M_QUIET | M_NOSORT,
+           NULL);
+         if(ctx)
+         {
+             msgcount = ctx->msgcount;
+             msg_unread = ctx->unread;
+             mx_close_mailbox(ctx, 0);
+         }
+         *tmp = b;
+         tmp->msgcount = msgcount;
+         tmp->msg_unread = msg_unread;
+         if(STAT_CHECK)
+             tmp->has_new = tmp->new = 1;
        }
 #ifdef BUFFY_SIZE
        else
@@ -368,7 +391,7 @@ int mutt_buffy_check (int force)
        if (tmp->newly_created &&
            (sb.st_ctime != sb.st_mtime || sb.st_ctime != sb.st_atime))
          tmp->newly_created = 0;
-
+       }
        break;
 
       case M_MAILDIR:
@@ -379,6 +402,37 @@ int mutt_buffy_check (int force)
          tmp->magic = 0;
          break;
        }
+       tmp->msgcount = 0;
+       tmp->msg_unread = 0;
+       tmp->msg_tagged = 0;
+       while ((de = readdir (dirp)) != NULL)
+       {
+         char *p;
+         if (*de->d_name != '.' && 
+             (!(p = strstr (de->d_name, ":2,")) || !strchr (p + 3, 'T')))
+         {
+           /* one new and undeleted message is enough */
+            if (tmp->new != 1)
+           {
+               BuffyCount++;
+              tmp->has_new = tmp->new = 1;
+           }
+           tmp->msgcount++;
+           tmp->msg_unread++;
+         }
+       }
+       closedir (dirp);
+#if 1
+  /* I commented this out because it led to an infite "New mail in ..." loop,
+   * and when looking at the code, the check seems to be overly eager.
+   *   -- ak
+   */
+       snprintf (path, sizeof (path), "%s/cur", tmp->path);
+       if ((dirp = opendir (path)) == NULL)
+       {
+         tmp->magic = 0;
+         break;
+       }
        while ((de = readdir (dirp)) != NULL)
        {
          char *p;
@@ -387,22 +441,47 @@ int mutt_buffy_check (int force)
          {
            /* one new and undeleted message is enough */
            BuffyCount++;
-           tmp->new = 1;
-           break;
+#if 0
+            /* we're checking for read and not new mail; 
+             * seems like copy'n'paste error
+             */
+           tmp->has_new = tmp->new = 1;
+#endif
+            tmp->msgcount++;
          }
        }
        closedir (dirp);
+#endif
        break;
 
       case M_MH:
-       if ((tmp->new = mh_buffy (tmp->path)) > 0)
-         BuffyCount++;
+       {
+      DIR *dp;
+      struct dirent *de;
+         if ((tmp->new = mh_buffy (tmp->path)) > 0)
+           BuffyCount++;
+  
+      if ((dp = opendir (path)) == NULL)
+        break;
+         tmp->msgcount = 0;
+      while ((de = readdir (dp)))
+      {
+        if (mh_valid_message (de->d_name))
+        {
+                 tmp->msgcount++;
+                 tmp->has_new = tmp->new = 1;
+        }
+      }
+      closedir (dp);
+    }
        break;
        
 #ifdef USE_IMAP
       case M_IMAP:
-       if ((tmp->new = imap_mailbox_check (tmp->path, 1)) > 0)
+         tmp->msgcount = imap_mailbox_check(tmp->path, 0);
+       if ((tmp->new = imap_mailbox_check (tmp->path, 1)) > 0) {
          BuffyCount++;
+       }
        else
          tmp->new = 0;
 
@@ -448,7 +527,7 @@ int mutt_buffy_list (void)
   pos = 0;
   first = 1;
   buffylist[0] = 0;
-  pos += strlen (strncat (buffylist, _("New mail in "), sizeof (buffylist) - 1 - pos));
+  pos += strlen (strncat (buffylist, _("New mail in "), sizeof (buffylist) - 1 - pos)); /* __STRNCAT_CHECKED__ */
   for (tmp = Incoming; tmp; tmp = tmp->next)
   {
     /* Is there new mail in this mailbox? */
@@ -462,21 +541,21 @@ int mutt_buffy_list (void)
       break;
     
     if (!first)
-      pos += strlen (strncat(buffylist + pos, ", ", sizeof(buffylist)-1-pos));
+      pos += strlen (strncat(buffylist + pos, ", ", sizeof(buffylist)-1-pos)); /* __STRNCAT_CHECKED__ */
 
     /* Prepend an asterisk to mailboxes not already notified */
     if (!tmp->notified)
     {
-      /* pos += strlen (strncat(buffylist + pos, "*", sizeof(buffylist)-1-pos)); */
+      /* pos += strlen (strncat(buffylist + pos, "*", sizeof(buffylist)-1-pos));  __STRNCAT_CHECKED__ */
       tmp->notified = 1;
       BuffyNotify--;
     }
-    pos += strlen (strncat(buffylist + pos, path, sizeof(buffylist)-1-pos));
+    pos += strlen (strncat(buffylist + pos, path, sizeof(buffylist)-1-pos)); /* __STRNCAT_CHECKED__ */
     first = 0;
   }
   if (!first && tmp)
   {
-    strncat (buffylist + pos, ", ...", sizeof (buffylist) - 1 - pos);
+    strncat (buffylist + pos, ", ...", sizeof (buffylist) - 1 - pos); /* __STRNCAT_CHECKED__ */
   }
   if (!first)
   {