Mercurial > dovecot > original-hg > dovecot-1.2
changeset 2250:7b70a60c0f9d HEAD
some fixes for handling pseudo headers.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Tue, 29 Jun 2004 01:03:24 +0300 |
parents | cb4dad60f6cd |
children | 648e1a50b959 |
files | src/lib-storage/index/mbox/mbox-sync-private.h src/lib-storage/index/mbox/mbox-sync-rewrite.c src/lib-storage/index/mbox/mbox-sync-update.c src/lib-storage/index/mbox/mbox-sync.c |
diffstat | 4 files changed, 32 insertions(+), 19 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-storage/index/mbox/mbox-sync-private.h Tue Jun 29 00:32:29 2004 +0300 +++ b/src/lib-storage/index/mbox/mbox-sync-private.h Tue Jun 29 01:03:24 2004 +0300 @@ -20,6 +20,7 @@ }; #define MBOX_NONRECENT MAIL_RECENT /* kludgy */ +#define MBOX_EXPUNGED 0x40 #define STATUS_FLAGS_MASK (MAIL_SEEN|MBOX_NONRECENT) #define XSTATUS_FLAGS_MASK (MAIL_ANSWERED|MAIL_FLAGGED|MAIL_DRAFT|MAIL_DELETED)
--- a/src/lib-storage/index/mbox/mbox-sync-rewrite.c Tue Jun 29 00:32:29 2004 +0300 +++ b/src/lib-storage/index/mbox/mbox-sync-rewrite.c Tue Jun 29 01:03:24 2004 +0300 @@ -80,11 +80,16 @@ i_assert(size < SSIZE_T_MAX); - /* Append at the end of X-Keywords header, - or X-UID if it doesn't exist */ - start_pos = ctx->hdr_pos[MBOX_HDR_X_KEYWORDS] != (size_t)-1 ? - ctx->hdr_pos[MBOX_HDR_X_KEYWORDS] : - ctx->hdr_pos[MBOX_HDR_X_UID]; + if (ctx->pseudo) + start_pos = ctx->hdr_pos[MBOX_HDR_X_IMAPBASE]; + else { + /* Append at the end of X-Keywords header, + or X-UID if it doesn't exist */ + start_pos = ctx->hdr_pos[MBOX_HDR_X_KEYWORDS] != (size_t)-1 ? + ctx->hdr_pos[MBOX_HDR_X_KEYWORDS] : + ctx->hdr_pos[MBOX_HDR_X_UID]; + } + i_assert(start_pos != (size_t)-1); data = str_data(ctx->header); data_size = str_len(ctx->header); @@ -298,7 +303,7 @@ /* mbox_sync_parse_next_mail() checks that UIDs are growing, so we have to fool it. */ old_prev_msg_uid = sync_ctx->prev_msg_uid; - sync_ctx->prev_msg_uid = mails[idx].uid-1; + sync_ctx->prev_msg_uid = mails[idx].uid == 0 ? 0 : mails[idx].uid-1; sync_ctx->dest_first_mail = mails[idx].from_offset == 0; mbox_sync_parse_next_mail(sync_ctx->input, &mail_ctx); @@ -380,7 +385,7 @@ /* after expunge the next mail must have been missing space, or we would have moved it backwards already */ - i_assert(mails[0].space < 0 || mails[0].uid == 0); + i_assert(mails[0].space < 0 || (mails[0].flags & MBOX_EXPUNGED) != 0); /* start moving backwards. */ do { @@ -396,14 +401,15 @@ space_diff = mails[idx].space; end_offset = mails[idx].offset + mails[idx].space; - if (mails[idx].uid != 0) { + if ((mails[idx].flags & MBOX_EXPUNGED) == 0) { space_diff -= extra_per_mail; end_offset -= extra_per_mail; mails[idx].space = extra_per_mail; } idx--; - if (mails[idx].space <= 0 && mails[idx].uid != 0) { + if (mails[idx].space <= 0 && + (mails[idx].flags & MBOX_EXPUNGED) == 0) { /* offset points to beginning of headers. read the header again, update it and give enough space to fill space_diff */
--- a/src/lib-storage/index/mbox/mbox-sync-update.c Tue Jun 29 00:32:29 2004 +0300 +++ b/src/lib-storage/index/mbox/mbox-sync-update.c Tue Jun 29 01:03:24 2004 +0300 @@ -135,7 +135,7 @@ str_append_c(ctx->header, '\n'); } - if (ctx->hdr_pos[MBOX_HDR_X_UID] == (size_t)-1) { + if (ctx->hdr_pos[MBOX_HDR_X_UID] == (size_t)-1 && !ctx->pseudo) { str_append(ctx->header, "X-UID: "); ctx->hdr_pos[MBOX_HDR_X_UID] = str_len(ctx->header); str_printfa(ctx->header, "%u\n", ctx->mail.uid);
--- a/src/lib-storage/index/mbox/mbox-sync.c Tue Jun 29 00:32:29 2004 +0300 +++ b/src/lib-storage/index/mbox/mbox-sync.c Tue Jun 29 01:03:24 2004 +0300 @@ -666,6 +666,7 @@ struct mbox_sync_mail mail; memset(&mail, 0, sizeof(mail)); + mail.flags = MBOX_EXPUNGED; mail.offset = mail_ctx->from_offset - sync_ctx->expunged_space; mail.space = sync_ctx->expunged_space; @@ -804,13 +805,15 @@ while ((ret = mbox_sync_read_next_mail(sync_ctx, mail_ctx)) > 0) { uid = mail_ctx->mail.uid; + if (mail_ctx->pseudo) + uid = 0; + /* get all sync records related to this message */ if (mbox_sync_read_index_syncs(sync_ctx, uid, &expunged) < 0) return -1; rec = NULL; - if (uid != 0 && !mail_ctx->pseudo && - sync_ctx->ibox->md5hdr_extra_idx == 0) { + if (uid != 0 && sync_ctx->ibox->md5hdr_extra_idx == 0) { ret = mbox_sync_read_index_rec(sync_ctx, uid, &rec); if (ret < 0) return -1; @@ -818,7 +821,8 @@ uid = 0; } - if (uid == 0 && sync_ctx->ibox->mbox_readonly) { + if (uid == 0 && sync_ctx->ibox->mbox_readonly && + !mail_ctx->pseudo) { /* Use MD5 sums */ if (sync_ctx->ibox->md5hdr_extra_idx == 0) { sync_ctx->ibox->md5hdr_extra_idx = @@ -836,7 +840,7 @@ uid = rec->uid; } - if (uid == 0) { + if (uid == 0 && !mail_ctx->pseudo) { /* missing/broken X-UID. all the rest of the mails need new UIDs. */ while (sync_ctx->idx_seq <= messages_count) { @@ -860,12 +864,14 @@ return ret; } - if (!expunged && !mail_ctx->pseudo) { - if (mbox_sync_update_index(sync_ctx, mail_ctx, - rec) < 0) - return -1; + if (!mail_ctx->pseudo) { + if (!expunged) { + if (mbox_sync_update_index(sync_ctx, mail_ctx, + rec) < 0) + return -1; + } + sync_ctx->idx_seq++; } - sync_ctx->idx_seq++; istream_raw_mbox_next(sync_ctx->input, mail_ctx->mail.body_size);