From: Timo Sirainen Date: Tue, 30 Jun 2009 01:54:16 +0000 (-0400) Subject: Mailbox saving: Allow setting IMAP UID, POP3 UIDL and save date. X-Git-Tag: 2.0.alpha1~498 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=0cce885512b836ce021260a58e7b4f099b36d0f1;p=thirdparty%2Fdovecot%2Fcore.git Mailbox saving: Allow setting IMAP UID, POP3 UIDL and save date. Most of them aren't yet implemented by backends. --HG-- branch : HEAD --- diff --git a/src/lib-storage/index/dbox/dbox-save.c b/src/lib-storage/index/dbox/dbox-save.c index acb5fa9fbf..cf77f17fae 100644 --- a/src/lib-storage/index/dbox/dbox-save.c +++ b/src/lib-storage/index/dbox/dbox-save.c @@ -83,7 +83,7 @@ static void dbox_save_add_to_index(struct dbox_save_context *ctx) enum mail_flags save_flags; save_flags = ctx->ctx.flags & ~MAIL_RECENT; - mail_index_append(ctx->trans, 0, &ctx->seq); + mail_index_append(ctx->trans, ctx->ctx.uid, &ctx->seq); mail_index_update_flags(ctx->trans, ctx->seq, MODIFY_REPLACE, save_flags); if (ctx->ctx.keywords != NULL) { diff --git a/src/lib-storage/index/index-storage.c b/src/lib-storage/index/index-storage.c index aafa5d1da5..20784e66b8 100644 --- a/src/lib-storage/index/index-storage.c +++ b/src/lib-storage/index/index-storage.c @@ -663,4 +663,5 @@ void index_save_context_free(struct mail_save_context *ctx) { i_free_and_null(ctx->from_envelope); i_free_and_null(ctx->guid); + i_free_and_null(ctx->pop3_uidl); } diff --git a/src/lib-storage/index/maildir/maildir-save.c b/src/lib-storage/index/maildir/maildir-save.c index 1b15b0f3a4..a489f4e81e 100644 --- a/src/lib-storage/index/maildir/maildir-save.c +++ b/src/lib-storage/index/maildir/maildir-save.c @@ -457,6 +457,14 @@ static int maildir_save_finish_real(struct mail_save_context *_ctx) ctx->failed = TRUE; } + if (_ctx->save_date != (time_t)-1) { + /* we can't change ctime, but we can add the date to cache */ + struct index_mail *mail = (struct index_mail *)_ctx->dest_mail; + uint32_t t = _ctx->save_date; + + index_mail_cache_add(mail, MAIL_CACHE_SAVE_DATE, &t, sizeof(t)); + } + if (ctx->ctx.received_date != (time_t)-1) { /* set the received_date by modifying mtime */ buf.actime = ioloop_time; diff --git a/src/lib-storage/mail-storage-private.h b/src/lib-storage/mail-storage-private.h index 12a2ba7b0a..518925fd0e 100644 --- a/src/lib-storage/mail-storage-private.h +++ b/src/lib-storage/mail-storage-private.h @@ -385,10 +385,11 @@ struct mail_save_context { enum mail_flags flags; struct mail_keywords *keywords; - time_t received_date; + time_t received_date, save_date; int received_tz_offset; - char *guid, *from_envelope; + uint32_t uid; + char *guid, *pop3_uidl, *from_envelope; struct ostream *output; }; diff --git a/src/lib-storage/mail-storage.c b/src/lib-storage/mail-storage.c index 09b5f410b4..3c09803015 100644 --- a/src/lib-storage/mail-storage.c +++ b/src/lib-storage/mail-storage.c @@ -920,6 +920,7 @@ mailbox_save_alloc(struct mailbox_transaction_context *t) ctx = t->box->v.save_alloc(t); ctx->received_date = (time_t)-1; + ctx->save_date = (time_t)-1; return ctx; } @@ -951,6 +952,12 @@ void mailbox_save_set_received_date(struct mail_save_context *ctx, ctx->received_tz_offset = timezone_offset; } +void mailbox_save_set_save_date(struct mail_save_context *ctx, + time_t save_date) +{ + ctx->save_date = save_date; +} + void mailbox_save_set_from_envelope(struct mail_save_context *ctx, const char *envelope) { @@ -958,6 +965,11 @@ void mailbox_save_set_from_envelope(struct mail_save_context *ctx, ctx->from_envelope = i_strdup(envelope); } +void mailbox_save_set_uid(struct mail_save_context *ctx, uint32_t uid) +{ + ctx->uid = uid; +} + void mailbox_save_set_guid(struct mail_save_context *ctx, const char *guid) { i_assert(guid == NULL || *guid != '\0'); @@ -966,6 +978,12 @@ void mailbox_save_set_guid(struct mail_save_context *ctx, const char *guid) ctx->guid = i_strdup(guid); } +void mailbox_save_set_pop3_uidl(struct mail_save_context *ctx, const char *uidl) +{ + i_free(ctx->pop3_uidl); + ctx->pop3_uidl = i_strdup(uidl); +} + void mailbox_save_set_dest_mail(struct mail_save_context *ctx, struct mail *mail) { diff --git a/src/lib-storage/mail-storage.h b/src/lib-storage/mail-storage.h index 6f3d6d90cc..14a5382a00 100644 --- a/src/lib-storage/mail-storage.h +++ b/src/lib-storage/mail-storage.h @@ -508,14 +508,24 @@ void mailbox_save_copy_flags(struct mail_save_context *ctx, struct mail *mail); backend doesn't support storing it. */ void mailbox_save_set_received_date(struct mail_save_context *ctx, time_t received_date, int timezone_offset); +/* Set the "message saved" date. This should be set only when you're + replicating/restoring an existing mailbox. */ +void mailbox_save_set_save_date(struct mail_save_context *ctx, + time_t save_date); /* Set the envelope sender. This is currently used only with mbox files to specify the address in From_-line. */ void mailbox_save_set_from_envelope(struct mail_save_context *ctx, const char *envelope); +/* Set message's UID. If UID is smaller than the current next_uid, it's given + a new UID anyway. */ +void mailbox_save_set_uid(struct mail_save_context *ctx, uint32_t uid); /* Set globally unique ID for the saved mail. A new GUID is generated by default. This function should usually be called only when copying an existing mail (or restoring a mail from backup). */ void mailbox_save_set_guid(struct mail_save_context *ctx, const char *guid); +/* Set message's POP3 UIDL, if the backend supports it. */ +void mailbox_save_set_pop3_uidl(struct mail_save_context *ctx, + const char *uidl); /* If dest_mail is set, the saved message can be accessed using it. Note that setting it may require mailbox syncing, so don't set it unless you need it. Also you shouldn't try to access it before mailbox_save_finish() is