]> mj.ucw.cz Git - checkmail.git/blobdiff - cm.c
Use Content-Length to determine mail length if available
[checkmail.git] / cm.c
diff --git a/cm.c b/cm.c
index 49d0f6508e40b50ac7f0dfb51de2789fcb04b7e5..9a38a1d7a0252e2444009d7a3152676ac5a62663 100644 (file)
--- a/cm.c
+++ b/cm.c
@@ -354,6 +354,27 @@ mb_check(const char *p, int len)
   return 1;
 }
 
+static void
+mb_skip(int len)
+{
+  while (len)
+    {
+      int avail = mb_end - mb_cc;
+      if (!avail)
+       {
+         if (mb_ll_get() < 0)
+           return;
+         len--;
+       }
+      else
+       {
+         int next = (avail < len) ? avail : len;
+         len -= next;
+         mb_cc += next;
+       }
+    }
+}
+
 static void
 scan_mbox(struct mbox *b, struct stat *st)
 {
@@ -454,6 +475,7 @@ scan_mbox(struct mbox *b, struct stat *st)
       while ((c = mb_get()) >= 0 && c != '\n')
        ;
 
+      int content_length = -1;
       int new = 1;
       int flagged = 0;
       sender[0] = 0;
@@ -499,6 +521,8 @@ scan_mbox(struct mbox *b, struct stat *st)
            strcpy(sender, buf+5);
          else if (!strncasecmp(buf, "Subject:", 8))
            strcpy(subject, buf+8);
+         else if (!strncasecmp(buf, "Content-Length:", 15))
+           content_length = atoi(buf + 15);
        }
 
       b->total++;
@@ -507,13 +531,16 @@ scan_mbox(struct mbox *b, struct stat *st)
       if (flagged)
        b->flagged++;
       if (debug_mode > 1)
-       debug("new=%d flagged=%d sender=<%s> subject=<%s>\n", new, flagged, sender, subject);
+       debug("new=%d flagged=%d len=%d sender=<%s> subject=<%s>\n", new, flagged, content_length, sender, subject);
       if (new || (flagged && !b->snippet_is_new))
        {
          b->snippet_is_new = new;
          prepare_snippets(b, sender, subject);
        }
 
+      if (content_length >= 0)
+       mb_skip(content_length);
+
       int ct = 1;
       while (from[ct])
        {
@@ -637,6 +664,7 @@ static Atom osd_pty;
 static unsigned osd_care;
 #define OSD_MSG_SIZE 1024
 static char osd_last_msg[OSD_MSG_SIZE];
+static time_t osd_last_time;
 
 static void
 x11_init(void)
@@ -844,7 +872,7 @@ rethink_osd(int notify)
     if (b->o.osd > 0)
       {
        p.total_new += b->new;
-       if (b->new && (!p.mbox || p.mbox->o.priority < b->o.priority))
+       if (b->new && b->last_time > osd_last_time && (!p.mbox || p.mbox->o.priority < b->o.priority))
          p.mbox = b;
       }
 
@@ -862,6 +890,7 @@ rethink_osd(int notify)
        }
       else
        debug("OSD: No changes\n");
+      osd_last_time = time(NULL);
     }
 }