Mercurial > dovecot > original-hg > dovecot-1.2
changeset 2238:9cc23c29aaec HEAD
Added a framework for getting POP3 UIDL strings from mail-storage. The
default still is uidvalidity.uid. Added beginnings of overriding it from
X-UIDL header in mbox.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Wed, 23 Jun 2004 21:33:22 +0300 |
parents | 6b05e30c669a |
children | 1057a5dc0ca7 |
files | src/lib-index/mail-cache.h src/lib-storage/index/index-mail.c src/lib-storage/index/index-mail.h src/lib-storage/index/mbox/mbox-sync-parse.c src/lib-storage/index/mbox/mbox-sync-private.h src/lib-storage/index/mbox/mbox-sync.c src/lib-storage/mail-storage.h src/pop3/client.c src/pop3/client.h src/pop3/commands.c |
diffstat | 10 files changed, 68 insertions(+), 24 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-index/mail-cache.h Wed Jun 23 21:05:14 2004 +0300 +++ b/src/lib-index/mail-cache.h Wed Jun 23 21:33:22 2004 +0300 @@ -42,6 +42,7 @@ MAIL_CACHE_BODYSTRUCTURE = 0x01000000, MAIL_CACHE_ENVELOPE = 0x00800000, MAIL_CACHE_MESSAGEPART = 0x00400000, + MAIL_CACHE_UID_STRING = 0x00200000, MAIL_CACHE_FIXED_MASK = MAIL_CACHE_INDEX_FLAGS | MAIL_CACHE_SENT_DATE | @@ -55,7 +56,8 @@ MAIL_CACHE_LOCATION | MAIL_CACHE_BODY | MAIL_CACHE_BODYSTRUCTURE | - MAIL_CACHE_ENVELOPE, + MAIL_CACHE_ENVELOPE | + MAIL_CACHE_UID_STRING, MAIL_CACHE_BODYSTRUCTURE_MASK = MAIL_CACHE_BODY | MAIL_CACHE_BODYSTRUCTURE | MAIL_CACHE_MESSAGEPART
--- a/src/lib-storage/index/index-mail.c Wed Jun 23 21:05:14 2004 +0300 +++ b/src/lib-storage/index/index-mail.c Wed Jun 23 21:33:22 2004 +0300 @@ -499,6 +499,13 @@ return data->envelope; case MAIL_FETCH_FROM_ENVELOPE: return NULL; + case MAIL_FETCH_UID_STRING: + if (data->uid_string == NULL) { + data->uid_string = + p_strdup_printf(mail->pool, "%u.%u", + mail->uid_validity, _mail->uid); + } + return data->uid_string; default: i_unreached(); return NULL; @@ -510,9 +517,17 @@ enum mail_fetch_field wanted_fields, const char *const wanted_headers[]) { + const struct mail_index_header *hdr; + int ret; + mail->mail = *t->ibox->mail_interface; mail->mail.box = &t->ibox->box; + ret = mail_index_get_header(t->ibox->view, &hdr); + i_assert(ret == 0); + + mail->uid_validity = hdr->uid_validity; + mail->pool = pool_alloconly_create("index_mail", 16384); mail->ibox = t->ibox; mail->trans = t;
--- a/src/lib-storage/index/index-mail.h Wed Jun 23 21:05:14 2004 +0300 +++ b/src/lib-storage/index/index-mail.h Wed Jun 23 21:33:22 2004 +0300 @@ -23,7 +23,7 @@ int header_save_idx; struct message_part *parts; - const char *envelope, *body, *bodystructure; + const char *envelope, *body, *bodystructure, *uid_string; struct message_part_envelope_data *envelope_data; uint32_t seq; @@ -57,6 +57,7 @@ struct index_transaction_context *trans; unsigned int expunge_counter; buffer_t *header_buf; + uint32_t uid_validity; enum mail_fetch_field wanted_fields; const char *const *wanted_headers;
--- a/src/lib-storage/index/mbox/mbox-sync-parse.c Wed Jun 23 21:05:14 2004 +0300 +++ b/src/lib-storage/index/mbox/mbox-sync-parse.c Wed Jun 23 21:33:22 2004 +0300 @@ -223,6 +223,21 @@ return TRUE; } +static int parse_x_uidl(struct mbox_sync_mail_context *ctx, + struct message_header_line *hdr) +{ + size_t i; + + for (i = 0; i < hdr->full_value_len; i++) { + if (IS_LWSP_LF(hdr->full_value[i])) + break; + } + + str_truncate(ctx->uidl, 0); + str_append_n(ctx->uidl, hdr->full_value, i); + return TRUE; +} + static int parse_content_length(struct mbox_sync_mail_context *ctx, struct message_header_line *hdr) { @@ -259,6 +274,7 @@ { "X-Keywords", parse_x_keywords }, { "X-Status", parse_x_status }, { "X-UID", parse_x_uid }, + { "X-UIDL", parse_x_uidl }, { NULL, NULL } };
--- a/src/lib-storage/index/mbox/mbox-sync-private.h Wed Jun 23 21:05:14 2004 +0300 +++ b/src/lib-storage/index/mbox/mbox-sync-private.h Wed Jun 23 21:33:22 2004 +0300 @@ -54,7 +54,7 @@ uoff_t from_offset, hdr_offset, body_offset; size_t header_first_change, header_last_change; - string_t *header; + string_t *header, *uidl; uoff_t content_length; @@ -80,7 +80,7 @@ struct mail_index_transaction *t; const struct mail_index_header *hdr; - string_t *header, *from_line; + string_t *header, *uidl, *from_line; /* header state: */ uint32_t base_uid_validity, base_uid_last;
--- a/src/lib-storage/index/mbox/mbox-sync.c Wed Jun 23 21:05:14 2004 +0300 +++ b/src/lib-storage/index/mbox/mbox-sync.c Wed Jun 23 21:33:22 2004 +0300 @@ -198,6 +198,8 @@ mail_ctx->sync_ctx = sync_ctx; mail_ctx->seq = ++sync_ctx->seq; mail_ctx->header = sync_ctx->header; + mail_ctx->uidl = sync_ctx->uidl; + str_truncate(mail_ctx->uidl, 0); mail_ctx->from_offset = istream_raw_mbox_get_start_offset(sync_ctx->input); @@ -403,9 +405,10 @@ } static int mbox_sync_update_index(struct mbox_sync_context *sync_ctx, - struct mbox_sync_mail *mail, + struct mbox_sync_mail_context *mail_ctx, const struct mail_index_record *rec) { + struct mbox_sync_mail *mail = &mail_ctx->mail; keywords_mask_t idx_keywords; uint8_t idx_flags, mbox_flags; @@ -416,6 +419,12 @@ mail_index_update_flags(sync_ctx->t, sync_ctx->idx_seq, MODIFY_REPLACE, mbox_flags, mail->keywords); + if (str_len(mail_ctx->uidl) > 0) { + /*FIXME:mail_cache_add(sync_ctx->cache_trans, + MAIL_CACHE_UID_STRING, + str_data(mail_ctx->uidl), + str_len(mail_ctx->uidl));*/ + } } else { /* see if flags changed */ idx_flags = rec->flags; @@ -785,7 +794,7 @@ } if (!expunged && !mail_ctx->pseudo) { - if (mbox_sync_update_index(sync_ctx, &mail_ctx->mail, + if (mbox_sync_update_index(sync_ctx, mail_ctx, rec) < 0) return -1; } @@ -1129,6 +1138,7 @@ sync_ctx.ibox = ibox; sync_ctx.from_line = str_new(default_pool, 256); sync_ctx.header = str_new(default_pool, 4096); + sync_ctx.uidl = str_new(default_pool, 128); sync_ctx.lock_id = lock_id; sync_ctx.index_sync_ctx = index_sync_ctx; @@ -1227,6 +1237,7 @@ ret = -1; } + str_free(sync_ctx.uidl); str_free(sync_ctx.header); str_free(sync_ctx.from_line); buffer_free(sync_ctx.mails);
--- a/src/lib-storage/mail-storage.h Wed Jun 23 21:05:14 2004 +0300 +++ b/src/lib-storage/mail-storage.h Wed Jun 23 21:33:22 2004 +0300 @@ -65,21 +65,22 @@ }; enum mail_fetch_field { - MAIL_FETCH_FLAGS = 0x0001, - MAIL_FETCH_MESSAGE_PARTS = 0x0002, + MAIL_FETCH_FLAGS = 0x00000001, + MAIL_FETCH_MESSAGE_PARTS = 0x00000002, - MAIL_FETCH_RECEIVED_DATE = 0x0004, - MAIL_FETCH_DATE = 0x0008, - MAIL_FETCH_SIZE = 0x0010, + MAIL_FETCH_RECEIVED_DATE = 0x00000004, + MAIL_FETCH_DATE = 0x00000008, + MAIL_FETCH_SIZE = 0x00000010, - MAIL_FETCH_STREAM_HEADER = 0x0020, - MAIL_FETCH_STREAM_BODY = 0x0040, + MAIL_FETCH_STREAM_HEADER = 0x00000020, + MAIL_FETCH_STREAM_BODY = 0x00000040, /* specials: */ - MAIL_FETCH_IMAP_BODY = 0x1000, - MAIL_FETCH_IMAP_BODYSTRUCTURE = 0x2000, - MAIL_FETCH_IMAP_ENVELOPE = 0x4000, - MAIL_FETCH_FROM_ENVELOPE = 0x8000 + MAIL_FETCH_IMAP_BODY = 0x00001000, + MAIL_FETCH_IMAP_BODYSTRUCTURE = 0x00002000, + MAIL_FETCH_IMAP_ENVELOPE = 0x00004000, + MAIL_FETCH_FROM_ENVELOPE = 0x00008000, + MAIL_FETCH_UID_STRING = 0x00010000 }; enum mailbox_sync_flags {
--- a/src/pop3/client.c Wed Jun 23 21:05:14 2004 +0300 +++ b/src/pop3/client.c Wed Jun 23 21:33:22 2004 +0300 @@ -51,8 +51,7 @@ search_arg.type = SEARCH_ALL; for (i = 0; i < 2; i++) { - if (mailbox_get_status(client->mailbox, - STATUS_MESSAGES | STATUS_UIDVALIDITY, + if (mailbox_get_status(client->mailbox, STATUS_MESSAGES, &status) < 0) { client_send_storage_error(client); return FALSE; @@ -60,7 +59,6 @@ client->messages_count = status.messages; client->deleted_size = 0; - client->uidvalidity = status.uidvalidity; if (client->messages_count == 0) return TRUE;
--- a/src/pop3/client.h Wed Jun 23 21:05:14 2004 +0300 +++ b/src/pop3/client.h Wed Jun 23 21:33:22 2004 +0300 @@ -17,7 +17,6 @@ unsigned int messages_count; unsigned int deleted_count; - unsigned int uidvalidity; uoff_t *message_sizes; uoff_t total_size; uoff_t deleted_size;
--- a/src/pop3/commands.c Wed Jun 23 21:05:14 2004 +0300 +++ b/src/pop3/commands.c Wed Jun 23 21:33:22 2004 +0300 @@ -366,6 +366,7 @@ struct mailbox_transaction_context *t; struct mail_search_context *ctx; struct mail *mail; + const char *uid_str; int found = FALSE; if (client->messages_count == 0 && message == 0) @@ -396,9 +397,9 @@ continue; } - client_send_line(client, message == 0 ? - "%u %u.%u" : "+OK %u %u.%u", - mail->seq, client->uidvalidity, mail->uid); + uid_str = mail->get_special(mail, MAIL_FETCH_UID_STRING); + client_send_line(client, message == 0 ? "%u %s" : "+OK %u %s", + mail->seq, uid_str); found = TRUE; }