]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
Maildir: If POP3 UIDL extra field is found from dovecot-uidlist, it's used
authorTimo Sirainen <tss@iki.fi>
Thu, 29 May 2008 15:57:56 +0000 (18:57 +0300)
committerTimo Sirainen <tss@iki.fi>
Thu, 29 May 2008 15:57:56 +0000 (18:57 +0300)
instead of the default UIDL format (or X-UIDL: header).
Patch by Nicholas Von Hollen @ Mailtrust.

--HG--
branch : HEAD

src/lib-storage/index/maildir/maildir-mail.c
src/lib-storage/mail-storage.h
src/pop3/commands.c

index e456ffd31e16a4ae7726ccb0b16e48550a1be33c..31ba4aed5fb7e39eb27f5749bb6136b19fa623d9 100644 (file)
@@ -412,7 +412,7 @@ maildir_mail_get_special(struct mail *_mail, enum mail_fetch_field field,
 {
        struct index_mail *mail = (struct index_mail *)_mail;
        struct maildir_mailbox *mbox = (struct maildir_mailbox *)mail->ibox;
-       const char *path, *fname, *end;
+       const char *path, *fname, *end, *uidl;
 
        if (field == MAIL_FETCH_UIDL_FILE_NAME) {
                if (_mail->uid != 0) {
@@ -427,6 +427,15 @@ maildir_mail_get_special(struct mail *_mail, enum mail_fetch_field field,
                end = strchr(fname, MAILDIR_INFO_SEP);
                *value_r = end == NULL ? fname : t_strdup_until(fname, end);
                return 0;
+       } else if (field == MAIL_FETCH_UIDL_BACKEND) {
+               uidl = maildir_uidlist_lookup_ext(mbox->uidlist, _mail->uid,
+                                       MAILDIR_UIDLIST_REC_EXT_POP3_UIDL);
+               if (uidl != NULL) {
+                       *value_r = uidl;
+                       return 0;
+               } else {
+                       return -1;
+               }
        }
 
        return index_mail_get_special(_mail, field, value_r);
index fe0455db4af8967dda7d763f3794bd6f8ed236ae..3508b1aab28254cf286811e130d88976676d4ecc 100644 (file)
@@ -107,7 +107,8 @@ enum mail_fetch_field {
        MAIL_FETCH_IMAP_ENVELOPE        = 0x00004000,
        MAIL_FETCH_FROM_ENVELOPE        = 0x00008000,
        MAIL_FETCH_HEADER_MD5           = 0x00010000,
-       MAIL_FETCH_UIDL_FILE_NAME       = 0x00020000
+       MAIL_FETCH_UIDL_FILE_NAME       = 0x00020000,
+       MAIL_FETCH_UIDL_BACKEND         = 0x00040000
 };
 
 enum mailbox_transaction_flags {
index f9a9e930b7ff7a2af4d7aea91f6e1ab04d08fee6..d74a70c011c1c88add26e0ef22e92b490dd1aa1e 100644 (file)
@@ -562,9 +562,12 @@ static bool list_uids_iter(struct client *client, struct cmd_uidl_context *ctx)
                str_truncate(str, 0);
                str_printfa(str, ctx->message == 0 ? "%u " : "+OK %u ",
                            ctx->mail->seq);
-
-               if (reuse_xuidl &&
-                   mail_get_first_header(ctx->mail, "X-UIDL", &uidl) > 0)
+               
+               if (mail_get_special(ctx->mail, MAIL_FETCH_UIDL_BACKEND,
+                                    &uidl) == 0)
+                       str_append(str, uidl);
+               else if (reuse_xuidl &&
+                        mail_get_first_header(ctx->mail, "X-UIDL", &uidl) > 0)
                        str_append(str, uidl);
                else
                        var_expand(str, uidl_format, tab);