From: Timo Sirainen Date: Wed, 12 May 2010 17:47:26 +0000 (+0200) Subject: lib-storage: Added mail_get_real_mail() that returns physical mail in a virtual mailbox. X-Git-Tag: 2.0.beta6~242 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=9af6cc9ebc9986c1275ebdfa29c39e152af1557e;p=thirdparty%2Fdovecot%2Fcore.git lib-storage: Added mail_get_real_mail() that returns physical mail in a virtual mailbox. --HG-- branch : HEAD --- diff --git a/src/lib-storage/index/cydir/cydir-mail.c b/src/lib-storage/index/cydir/cydir-mail.c index f8ef8bb1ac..7aac08115f 100644 --- a/src/lib-storage/index/cydir/cydir-mail.c +++ b/src/lib-storage/index/cydir/cydir-mail.c @@ -142,6 +142,7 @@ struct mail_vfuncs cydir_mail_vfuncs = { index_mail_get_header_stream, cydir_mail_get_stream, index_mail_get_special, + index_mail_get_real_mail, index_mail_update_flags, index_mail_update_keywords, index_mail_update_modseq, diff --git a/src/lib-storage/index/dbox-multi/mdbox-mail.c b/src/lib-storage/index/dbox-multi/mdbox-mail.c index ab37d82332..c1e85e2592 100644 --- a/src/lib-storage/index/dbox-multi/mdbox-mail.c +++ b/src/lib-storage/index/dbox-multi/mdbox-mail.c @@ -208,6 +208,7 @@ struct mail_vfuncs mdbox_mail_vfuncs = { index_mail_get_header_stream, dbox_mail_get_stream, dbox_mail_get_special, + index_mail_get_real_mail, mdbox_mail_update_flags, index_mail_update_keywords, index_mail_update_modseq, diff --git a/src/lib-storage/index/dbox-single/sdbox-mail.c b/src/lib-storage/index/dbox-single/sdbox-mail.c index d3bfebaa07..bb2718c87f 100644 --- a/src/lib-storage/index/dbox-single/sdbox-mail.c +++ b/src/lib-storage/index/dbox-single/sdbox-mail.c @@ -98,6 +98,7 @@ struct mail_vfuncs sdbox_mail_vfuncs = { index_mail_get_header_stream, dbox_mail_get_stream, dbox_mail_get_special, + index_mail_get_real_mail, index_mail_update_flags, index_mail_update_keywords, index_mail_update_modseq, diff --git a/src/lib-storage/index/index-mail.c b/src/lib-storage/index/index-mail.c index 738fc45c23..9d5656082c 100644 --- a/src/lib-storage/index/index-mail.c +++ b/src/lib-storage/index/index-mail.c @@ -1063,6 +1063,11 @@ int index_mail_get_special(struct mail *_mail, } } +struct mail *index_mail_get_real_mail(struct mail *mail) +{ + return mail; +} + struct mail * index_mail_alloc(struct mailbox_transaction_context *t, enum mail_fetch_field wanted_fields, diff --git a/src/lib-storage/index/index-mail.h b/src/lib-storage/index/index-mail.h index cbbc59f2a2..877b8c09f4 100644 --- a/src/lib-storage/index/index-mail.h +++ b/src/lib-storage/index/index-mail.h @@ -194,6 +194,7 @@ int index_mail_init_stream(struct index_mail *mail, struct istream **stream_r); int index_mail_get_special(struct mail *_mail, enum mail_fetch_field field, const char **value_r); +struct mail *index_mail_get_real_mail(struct mail *mail); void index_mail_update_flags(struct mail *mail, enum modify_type modify_type, enum mail_flags flags); diff --git a/src/lib-storage/index/maildir/maildir-mail.c b/src/lib-storage/index/maildir/maildir-mail.c index 496984df0c..5aab1d767b 100644 --- a/src/lib-storage/index/maildir/maildir-mail.c +++ b/src/lib-storage/index/maildir/maildir-mail.c @@ -585,6 +585,7 @@ struct mail_vfuncs maildir_mail_vfuncs = { index_mail_get_header_stream, maildir_mail_get_stream, maildir_mail_get_special, + index_mail_get_real_mail, index_mail_update_flags, index_mail_update_keywords, index_mail_update_modseq, diff --git a/src/lib-storage/index/mbox/mbox-mail.c b/src/lib-storage/index/mbox/mbox-mail.c index 674b089170..c1d2a61a73 100644 --- a/src/lib-storage/index/mbox/mbox-mail.c +++ b/src/lib-storage/index/mbox/mbox-mail.c @@ -403,6 +403,7 @@ struct mail_vfuncs mbox_mail_vfuncs = { index_mail_get_header_stream, mbox_mail_get_stream, mbox_mail_get_special, + index_mail_get_real_mail, index_mail_update_flags, index_mail_update_keywords, index_mail_update_modseq, diff --git a/src/lib-storage/index/raw/raw-mail.c b/src/lib-storage/index/raw/raw-mail.c index 6cf980a8db..3d4346f96d 100644 --- a/src/lib-storage/index/raw/raw-mail.c +++ b/src/lib-storage/index/raw/raw-mail.c @@ -132,6 +132,7 @@ struct mail_vfuncs raw_mail_vfuncs = { index_mail_get_header_stream, raw_mail_get_stream, raw_mail_get_special, + index_mail_get_real_mail, index_mail_update_flags, index_mail_update_keywords, index_mail_update_modseq, diff --git a/src/lib-storage/mail-storage-private.h b/src/lib-storage/mail-storage-private.h index 4012851e65..be9f17f717 100644 --- a/src/lib-storage/mail-storage-private.h +++ b/src/lib-storage/mail-storage-private.h @@ -306,6 +306,7 @@ struct mail_vfuncs { int (*get_special)(struct mail *mail, enum mail_fetch_field field, const char **value_r); + struct mail *(*get_real_mail)(struct mail *mail); void (*update_flags)(struct mail *mail, enum modify_type modify_type, enum mail_flags flags); diff --git a/src/lib-storage/mail-storage.h b/src/lib-storage/mail-storage.h index 504eeee69e..56a7388d5e 100644 --- a/src/lib-storage/mail-storage.h +++ b/src/lib-storage/mail-storage.h @@ -660,6 +660,9 @@ int mail_get_stream(struct mail *mail, struct message_size *hdr_size, /* Get any of the "special" fields. Unhandled specials are returned as "". */ int mail_get_special(struct mail *mail, enum mail_fetch_field field, const char **value_r); +/* Returns the mail for the physical message. Normally this is the mail itself, + but in virtual mailboxes it points to the backend mailbox. */ +struct mail *mail_get_real_mail(struct mail *mail); /* Update message flags. */ void mail_update_flags(struct mail *mail, enum modify_type modify_type, diff --git a/src/lib-storage/mail.c b/src/lib-storage/mail.c index dbe9b64f31..993f6673ea 100644 --- a/src/lib-storage/mail.c +++ b/src/lib-storage/mail.c @@ -180,6 +180,13 @@ int mail_get_special(struct mail *mail, enum mail_fetch_field field, return p->v.get_special(mail, field, value_r); } +struct mail *mail_get_real_mail(struct mail *mail) +{ + struct mail_private *p = (struct mail_private *)mail; + + return p->v.get_real_mail(mail); +} + void mail_update_flags(struct mail *mail, enum modify_type modify_type, enum mail_flags flags) { diff --git a/src/plugins/virtual/virtual-mail.c b/src/plugins/virtual/virtual-mail.c index e834cfef5d..163c53f346 100644 --- a/src/plugins/virtual/virtual-mail.c +++ b/src/plugins/virtual/virtual-mail.c @@ -346,6 +346,13 @@ virtual_mail_get_special(struct mail *mail, enum mail_fetch_field field, return 0; } +static struct mail *virtual_mail_get_real_mail(struct mail *mail) +{ + struct virtual_mail *vmail = (struct virtual_mail *)mail; + + return mail_get_real_mail(vmail->backend_mail); +} + static void virtual_mail_update_pop3_uidl(struct mail *mail, const char *uidl) { struct virtual_mail *vmail = (struct virtual_mail *)mail; @@ -401,6 +408,7 @@ struct mail_vfuncs virtual_mail_vfuncs = { virtual_mail_get_header_stream, virtual_mail_get_stream, virtual_mail_get_special, + virtual_mail_get_real_mail, index_mail_update_flags, index_mail_update_keywords, index_mail_update_modseq,