1
0
mirror of https://github.com/Llewellynvdm/conky.git synced 2024-12-27 20:44:56 +00:00

Check for deleted and not expunged emails

This should fix bug #2802529. I've also revamped the X-Mozilla-Status
header handling which was kind of fishy till now.

Disclaimer: I have no mbox folders around to test it.

Signed-off-by: Nikos Ntarmos <ntarmos@cs.uoi.gr>
Signed-off-by: Brenden Matthews <brenden@rty.ca>
This commit is contained in:
Nikos Ntarmos 2009-06-08 19:35:41 +03:00 committed by Brenden Matthews
parent 8476bb08b5
commit d934d11e48

View File

@ -74,7 +74,7 @@ void update_mail_count(struct local_mail_s *mail)
}
if (stat(mail->box, &st)) {
static int rep;
static int rep = 0;
if (!rep) {
ERR("can't stat %s: %s", mail->box, strerror(errno));
@ -210,6 +210,7 @@ void update_mail_count(struct local_mail_s *mail)
while (!feof(fp)) {
char buf[128];
int was_new = 0;
if (fgets(buf, 128, fp) == NULL) {
break;
@ -219,28 +220,53 @@ void update_mail_count(struct local_mail_s *mail)
/* ignore MAILER-DAEMON */
if (strncmp(buf + 5, "MAILER-DAEMON ", 14) != 0) {
mail->mail_count++;
was_new = 0;
if (reading_status) {
if (reading_status == 1) {
mail->new_mail_count++;
} else {
reading_status = 1;
}
}
} else {
if (reading_status
if (reading_status == 1
&& strncmp(buf, "X-Mozilla-Status:", 17) == 0) {
/* check that mail isn't already read */
if (strchr(buf + 21, '0')) {
mail->new_mail_count++;
}
int xms = strtol(buf + 17, NULL, 16);
/* check that mail isn't marked for deletion */
if (xms & 0x0008) {
mail->trashed_mail_count++;
reading_status = 0;
/* Don't check whether the trashed email is unread */
continue;
}
if (reading_status && strncmp(buf, "Status:", 7) == 0) {
/* check that mail isn't already read */
if (!(xms & 0x0001)) {
mail->new_mail_count++;
was_new = 1;
}
/* check for an additional X-Status header */
reading_status = 2;
continue;
}
if (reading_status == 1 && strncmp(buf, "Status:", 7) == 0) {
/* check that mail isn't already read */
if (strchr(buf + 7, 'R') == NULL) {
mail->new_mail_count++;
was_new = 1;
}
reading_status = 2;
continue;
}
if (reading_status >= 1 && strncmp(buf, "X-Status:", 9) == 0) {
/* check that mail isn't marked for deletion */
if (strchr(buf + 9, 'D') != NULL) {
mail->trashed_mail_count++;
/* If the mail was previously detected as new,
subtract it from the new mail count */
if (was_new)
mail->new_mail_count--;
}
reading_status = 0;