Mercurial > dovecot > original-hg > dovecot-1.2
view src/plugins/virtual/virtual-save.c @ 8791:93c25cfe2760 HEAD
virtual: Added support for saving/copying messages to virtual mailboxes.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Thu, 26 Feb 2009 18:30:02 -0500 |
parents | |
children | 668bb851d9a6 |
line wrap: on
line source
/* Copyright (c) 2009 Dovecot authors, see the included COPYING file */ #include "lib.h" #include "virtual-transaction.h" #include "virtual-storage.h" struct virtual_save_context { struct mail_save_context ctx; struct mail_save_context *backend_save_ctx; }; struct mail_save_context * virtual_save_alloc(struct mailbox_transaction_context *_t) { struct virtual_transaction_context *t = (struct virtual_transaction_context *)_t; struct virtual_mailbox *mbox = (struct virtual_mailbox *)_t->box; struct mailbox_transaction_context *backend_trans; struct virtual_save_context *ctx; if (t->save_ctx != NULL) return &t->save_ctx->ctx; ctx = t->save_ctx = i_new(struct virtual_save_context, 1); ctx->ctx.transaction = &t->ictx.mailbox_ctx; if (mbox->save_bbox != NULL) { backend_trans = virtual_transaction_get(_t, mbox->save_bbox->box); ctx->backend_save_ctx = mailbox_save_alloc(backend_trans); } return &ctx->ctx; } int virtual_save_begin(struct mail_save_context *_ctx, struct istream *input) { struct virtual_save_context *ctx = (struct virtual_save_context *)_ctx; struct virtual_mailbox *mbox = (struct virtual_mailbox *)_ctx->transaction->box; struct mail *mail; if (ctx->backend_save_ctx == NULL) { mail_storage_set_error(_ctx->transaction->box->storage, MAIL_ERROR_NOTPOSSIBLE, "Can't save messages to this virtual mailbox"); return -1; } mailbox_save_set_flags(ctx->backend_save_ctx, _ctx->flags, _ctx->keywords); mailbox_save_set_received_date(ctx->backend_save_ctx, _ctx->received_date, _ctx->received_tz_offset); mailbox_save_set_from_envelope(ctx->backend_save_ctx, _ctx->from_envelope); mailbox_save_set_guid(ctx->backend_save_ctx, _ctx->guid); if (_ctx->dest_mail != NULL) { mail = virtual_mail_set_backend_mail(_ctx->dest_mail, mbox->save_bbox); mailbox_save_set_dest_mail(ctx->backend_save_ctx, mail); } return mailbox_save_begin(&ctx->backend_save_ctx, input); } int virtual_save_continue(struct mail_save_context *_ctx) { struct virtual_save_context *ctx = (struct virtual_save_context *)_ctx; return mailbox_save_continue(ctx->backend_save_ctx); } int virtual_save_finish(struct mail_save_context *_ctx) { struct virtual_save_context *ctx = (struct virtual_save_context *)_ctx; return mailbox_save_finish(&ctx->backend_save_ctx); } void virtual_save_cancel(struct mail_save_context *_ctx) { struct virtual_save_context *ctx = (struct virtual_save_context *)_ctx; if (ctx->backend_save_ctx != NULL) mailbox_save_cancel(&ctx->backend_save_ctx); } void virtual_save_free(struct virtual_save_context *ctx) { if (ctx->backend_save_ctx != NULL) mailbox_save_cancel(&ctx->backend_save_ctx); i_free(ctx); }