* 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"
#include "mx.h"
+#include "sidebar.h"
#include "mutt_curses.h"
int mutt_parse_mailboxes (BUFFER *path, BUFFER *s, unsigned long data, BUFFER *err)
{
- BUFFY **tmp,*tmp1;
+ BUFFY **tmp,*tmp1,*last;
char buf[_POSIX_PATH_MAX];
+ int dup = 0;
#ifdef BUFFY_SIZE
struct stat sb;
#endif /* BUFFY_SIZE */
+ /*
+ * FIXME
+ * to get rid of correcting the ->prev pointers in sidebar.c,
+ * correct them right here
+ */
+
+ /*
+ * FIXME
+ * if we really want to make the sort order of the sidebar
+ * configurable, this has to go right here
+ */
+
while (MoreArgs (s))
{
mutt_extract_token (path, s, 0);
if(!*buf) continue;
/* simple check to avoid duplicates */
- for (tmp = &Incoming; *tmp; tmp = &((*tmp)->next))
+ dup = 0;
+ for (tmp = &Incoming; *tmp && dup == 0; tmp = &((*tmp)->next))
{
- if (mutt_strcmp (buf, (*tmp)->path) == 0)
- break;
+ if (mutt_strcmp (buf, (*tmp)->path) == 0) {
+ dup = 1;
+ break;
+ }
}
+ if (dup == 1)
+ continue;
+ tmp = &Incoming;
+
if(data == M_UNMAILBOXES)
{
if(*tmp)
continue;
}
- if (!*tmp)
- {
- *tmp = (BUFFY *) safe_calloc (1, sizeof (BUFFY));
- (*tmp)->path = safe_strdup (buf);
- (*tmp)->next = NULL;
- /* it is tempting to set magic right here */
- (*tmp)->magic = 0;
-
+ /* loop over list while it's sorted */
+ tmp1 = NULL;
+ last = NULL;
+ for (tmp = &Incoming; *tmp ; tmp = &((*tmp)->next)) {
+ /*
+ * FIXME
+ * change this to get whatever sorting order
+ */
+ if (mutt_strcmp (buf, (*tmp)->path) < 0) {
+ tmp1 = (*tmp);
+ break;
+ }
+ last = (*tmp);
}
+ /* we want: last -> tmp -> tmp1 */
+ *tmp = (BUFFY *) safe_calloc (1, sizeof (BUFFY));
+ (*tmp)->path = safe_strdup (buf);
+ (*tmp)->magic = 0;
+
+ /* correct pointers */
+ (*tmp)->next = tmp1;
+ if (last)
+ last->next = (*tmp);
+
+ /* left as-is */
(*tmp)->new = 0;
(*tmp)->notified = 1;
(*tmp)->newly_created = 0;
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)
for (tmp = Incoming; tmp; tmp = tmp->next)
{
+ if ( tmp->new == 1 )
+ tmp->has_new = 1;
tmp->new = 0;
#ifdef USE_IMAP
else
#endif
if (stat (tmp->path, &sb) != 0 || sb.st_size == 0 ||
- (!tmp->magic && (tmp->magic = mx_get_magic (tmp->path)) <= 0))
+ (!tmp->magic && (tmp->magic = mx_get_magic (tmp->path)) <= 0))
{
/* if the mailbox still doesn't exist, set the newly created flag to
* be ready for when it does. */
/* check to see if the folder is the currently selected folder
* before polling */
if (!Context || !Context->path ||
- (
- (0
+ (
+ (0
#ifdef USE_IMAP
- || tmp->magic == M_IMAP
+ || tmp->magic == M_IMAP
#endif
#ifdef USE_POP
- || tmp->magic == M_POP
+ || tmp->magic == M_POP
#endif
#ifdef USE_NNTP
- || tmp->magic == M_NNTP
+ || tmp->magic == M_NNTP
#endif
- ) ? mutt_strcmp (tmp->path, Context->path) :
- (sb.st_dev != contex_sb.st_dev || sb.st_ino != contex_sb.st_ino)
- )
+ ) ? mutt_strcmp (tmp->path, Context->path) :
+ (sb.st_dev != contex_sb.st_dev || sb.st_ino != contex_sb.st_ino)
+ )
)
{
switch (tmp->magic)
case M_MBOX:
case M_MMDF:
- if (STAT_CHECK)
- {
- BuffyCount++;
- tmp->new = 1;
- }
+ {
+ if (STAT_CHECK || tmp->msgcount == 0)
+ {
+ BuffyCount++;
+ /* only do complete count if sidebar visible */
+ if (SidebarWidth > 0)
+ {
+ BUFFY b = *tmp;
+ int msgcount = 0;
+ int msg_unread = 0;
+ BuffyCount++;
+ /* 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;
+ }
+ else
+ {
+ /* sidebar invisible -> done */
+ tmp->new = 1;
+ }
+ }
#ifdef BUFFY_SIZE
- else
- {
- /* some other program has deleted mail from the folder */
- tmp->size = (long) sb.st_size;
- }
+ else
+ {
+ /* some other program has deleted mail from the folder */
+ tmp->size = (long) sb.st_size;
+ }
#endif
- if (tmp->newly_created &&
- (sb.st_ctime != sb.st_mtime || sb.st_ctime != sb.st_atime))
- tmp->newly_created = 0;
-
- break;
+ if (tmp->newly_created &&
+ (sb.st_ctime != sb.st_mtime || sb.st_ctime != sb.st_atime))
+ tmp->newly_created = 0;
+ }
+ break;
case M_MAILDIR:
- snprintf (path, sizeof (path), "%s/new", tmp->path);
- if ((dirp = opendir (path)) == NULL)
- {
- tmp->magic = 0;
- break;
- }
- 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 */
- BuffyCount++;
- tmp->new = 1;
- break;
- }
- }
- closedir (dirp);
- break;
+ snprintf (path, sizeof (path), "%s/new", tmp->path);
+ if ((dirp = opendir (path)) == NULL)
+ {
+ tmp->magic = 0;
+ break;
+ }
+ tmp->msgcount = 0;
+ tmp->msg_unread = 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;
+ if (SidebarWidth == 0)
+ {
+ /* if sidebar invisible -> done */
+ break;
+ }
+ }
+ tmp->msgcount++;
+ tmp->msg_unread++;
+ }
+ }
+ closedir (dirp);
+
+ if (SidebarWidth > 0)
+ {
+ /* only count total mail if sidebar visible */
+ snprintf (path, sizeof (path), "%s/cur", tmp->path);
+ if ((dirp = opendir (path)) == NULL)
+ {
+ tmp->magic = 0;
+ break;
+ }
+ while ((de = readdir (dirp)) != NULL)
+ {
+ char *p;
+ if (*de->d_name != '.' &&
+ (!(p = strstr (de->d_name, ":2,")) || !strchr (p + 3, 'T')))
+ {
+ tmp->msgcount++;
+ }
+ }
+ closedir (dirp);
+ }
+ break;
case M_MH:
- if ((tmp->new = mh_buffy (tmp->path)) > 0)
- BuffyCount++;
- break;
-
+ if ((tmp->new = mh_buffy (tmp->path)) > 0)
+ BuffyCount++;
+ if (SidebarWidth > 0)
+ {
+ DIR *dp;
+ struct dirent *de;
+ 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)
- BuffyCount++;
- else
- tmp->new = 0;
-
- break;
+ tmp->msgcount = imap_mailbox_check(tmp->path, 0);
+ if ((tmp->new = imap_mailbox_check (tmp->path, 1)) > 0) {
+ BuffyCount++;
+ }
+ else
+ tmp->new = 0;
+ break;
#endif
#ifdef USE_POP
case M_POP:
- break;
+ break;
#endif
#ifdef USE_NNTP
case M_NNTP:
- break;
+ break;
#endif
}
}
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? */
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)
{
+ /* on new mail: redraw sidebar */
+ draw_sidebar (CurrentMenu);
mutt_message ("%s", buffylist);
return (1);
}