From: Timo Sirainen Date: Wed, 4 May 2011 09:42:17 +0000 (+0200) Subject: lib-storage: Added MAIL_FETCH_POP3_ORDER special field and implemented for Maildir. X-Git-Tag: 2.0.13~37 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e1eeb3be29afde2830c2b7ed594c6f1fef2f69dc;p=thirdparty%2Fdovecot%2Fcore.git lib-storage: Added MAIL_FETCH_POP3_ORDER special field and implemented for Maildir. The idea is that this specifies the order of messages when accessing via POP3. This is useful when migrating both POP3 and IMAP users from servers where their message ordering differes and they still want to be preserved. --- diff --git a/src/lib-storage/index/index-mail.c b/src/lib-storage/index/index-mail.c index efb4528c9b..5bb1ef2d9a 100644 --- a/src/lib-storage/index/index-mail.c +++ b/src/lib-storage/index/index-mail.c @@ -1076,6 +1076,7 @@ int index_mail_get_special(struct mail *_mail, case MAIL_FETCH_SEARCH_SCORE: case MAIL_FETCH_GUID: case MAIL_FETCH_HEADER_MD5: + case MAIL_FETCH_POP3_ORDER: *value_r = ""; return 0; case MAIL_FETCH_MAILBOX_NAME: diff --git a/src/lib-storage/index/maildir/maildir-mail.c b/src/lib-storage/index/maildir/maildir-mail.c index 492561ab32..8837cea675 100644 --- a/src/lib-storage/index/maildir/maildir-mail.c +++ b/src/lib-storage/index/maildir/maildir-mail.c @@ -471,7 +471,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->box; - const char *path, *fname = NULL, *end, *guid, *uidl; + const char *path, *fname = NULL, *end, *guid, *uidl, *order; switch (field) { case MAIL_FETCH_GUID: @@ -536,6 +536,15 @@ maildir_mail_get_special(struct mail *_mail, enum mail_fetch_field field, *value_r = p_strdup(mail->data_pool, uidl); } return 0; + case MAIL_FETCH_POP3_ORDER: + order = maildir_uidlist_lookup_ext(mbox->uidlist, _mail->uid, + MAILDIR_UIDLIST_REC_EXT_POP3_ORDER); + if (order == NULL) { + *value_r = ""; + } else { + *value_r = p_strdup(mail->data_pool, order); + } + return 0; default: return index_mail_get_special(_mail, field, value_r); } diff --git a/src/lib-storage/index/maildir/maildir-uidlist.h b/src/lib-storage/index/maildir/maildir-uidlist.h index f81400f5a6..9eb738917f 100644 --- a/src/lib-storage/index/maildir/maildir-uidlist.h +++ b/src/lib-storage/index/maildir/maildir-uidlist.h @@ -48,6 +48,11 @@ enum maildir_uidlist_rec_ext_key { MAILDIR_UIDLIST_REC_EXT_VSIZE = 'W', /* POP3 UIDL overriding the default format */ MAILDIR_UIDLIST_REC_EXT_POP3_UIDL = 'P', + /* POP3 message ordering number. Lower numbered messages are listed + first. Messages without ordering number are listed after them. + The idea is to be able to preserve POP3 UIDL list and IMAP UIDs + perfectly when migrating from other servers. */ + MAILDIR_UIDLIST_REC_EXT_POP3_ORDER = 'O', /* Message GUID (default is the base filename) */ MAILDIR_UIDLIST_REC_EXT_GUID = 'G' }; diff --git a/src/lib-storage/mail-storage.h b/src/lib-storage/mail-storage.h index 3b383fe99a..a410c03cee 100644 --- a/src/lib-storage/mail-storage.h +++ b/src/lib-storage/mail-storage.h @@ -125,7 +125,8 @@ enum mail_fetch_field { MAIL_FETCH_UIDL_BACKEND = 0x00040000, MAIL_FETCH_MAILBOX_NAME = 0x00080000, MAIL_FETCH_SEARCH_SCORE = 0x00100000, - MAIL_FETCH_GUID = 0x00200000 + MAIL_FETCH_GUID = 0x00200000, + MAIL_FETCH_POP3_ORDER = 0x00400000 }; enum mailbox_transaction_flags {