From: Timo Sirainen Date: Fri, 30 Dec 2011 09:54:48 +0000 (+0200) Subject: lib-storage: Added struct mailbox.set_subscribed() virtual method. X-Git-Tag: 2.1.rc2~24 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6469cf211a57433335641725dc236ebb2b9fdd3b;p=thirdparty%2Fdovecot%2Fcore.git lib-storage: Added struct mailbox.set_subscribed() virtual method. --- diff --git a/src/lib-storage/index/cydir/cydir-storage.c b/src/lib-storage/index/cydir/cydir-storage.c index 102198934c..03333817d7 100644 --- a/src/lib-storage/index/cydir/cydir-storage.c +++ b/src/lib-storage/index/cydir/cydir-storage.c @@ -139,6 +139,7 @@ struct mailbox cydir_mailbox = { index_storage_mailbox_rename, index_storage_get_status, NULL, + index_storage_set_subscribed, index_storage_list_index_has_changed, index_storage_list_index_update_sync, cydir_storage_sync_init, diff --git a/src/lib-storage/index/dbox-multi/mdbox-storage.c b/src/lib-storage/index/dbox-multi/mdbox-storage.c index fa4b2e3116..7debd6b476 100644 --- a/src/lib-storage/index/dbox-multi/mdbox-storage.c +++ b/src/lib-storage/index/dbox-multi/mdbox-storage.c @@ -437,6 +437,7 @@ struct mailbox mdbox_mailbox = { index_storage_mailbox_rename, index_storage_get_status, mdbox_mailbox_get_metadata, + index_storage_set_subscribed, index_storage_list_index_has_changed, index_storage_list_index_update_sync, mdbox_storage_sync_init, diff --git a/src/lib-storage/index/dbox-single/sdbox-storage.c b/src/lib-storage/index/dbox-single/sdbox-storage.c index f23883bd3b..4b66b7e8a0 100644 --- a/src/lib-storage/index/dbox-single/sdbox-storage.c +++ b/src/lib-storage/index/dbox-single/sdbox-storage.c @@ -397,6 +397,7 @@ struct mailbox sdbox_mailbox = { index_storage_mailbox_rename, index_storage_get_status, sdbox_mailbox_get_metadata, + index_storage_set_subscribed, index_storage_list_index_has_changed, index_storage_list_index_update_sync, sdbox_storage_sync_init, diff --git a/src/lib-storage/index/imapc/imapc-storage.c b/src/lib-storage/index/imapc/imapc-storage.c index ce78348731..f6c0332564 100644 --- a/src/lib-storage/index/imapc/imapc-storage.c +++ b/src/lib-storage/index/imapc/imapc-storage.c @@ -772,6 +772,7 @@ struct mailbox imapc_mailbox = { index_storage_mailbox_rename, imapc_mailbox_get_status, imapc_mailbox_get_metadata, + index_storage_set_subscribed, NULL, NULL, imapc_mailbox_sync_init, diff --git a/src/lib-storage/index/index-storage.c b/src/lib-storage/index/index-storage.c index 7673f6339b..14e3a14660 100644 --- a/src/lib-storage/index/index-storage.c +++ b/src/lib-storage/index/index-storage.c @@ -664,3 +664,38 @@ void index_copy_cache_fields(struct mail_save_context *ctx, } } T_END; } + +int index_storage_set_subscribed(struct mailbox *box, bool set) +{ + struct mail_namespace *ns; + struct mailbox_list *list = box->list; + const char *subs_name; + + if ((list->ns->flags & NAMESPACE_FLAG_SUBSCRIPTIONS) != 0) + subs_name = box->name; + else { + /* subscriptions=no namespace, find another one where we can + add the subscription to */ + ns = mail_namespace_find_subscribable(list->ns->user->namespaces, + box->vname); + if (ns == NULL) { + mail_storage_set_error(box->storage, MAIL_ERROR_NOTPOSSIBLE, + "This namespace has no subscriptions"); + return -1; + } + /* use as the + subscription name */ + subs_name = t_strconcat(list->ns->prefix, box->name, NULL); + /* drop the common prefix (typically there isn't one) */ + i_assert(strncmp(ns->prefix, subs_name, strlen(ns->prefix)) == 0); + subs_name += strlen(ns->prefix); + + list = ns->list; + } + if (mailbox_list_set_subscribed(list, subs_name, set) < 0) { + mail_storage_copy_list_error(box->storage, list); + return -1; + } + return 0; +} + diff --git a/src/lib-storage/index/index-storage.h b/src/lib-storage/index/index-storage.h index eb7106fed4..e645f86066 100644 --- a/src/lib-storage/index/index-storage.h +++ b/src/lib-storage/index/index-storage.h @@ -134,6 +134,7 @@ void index_transaction_rollback(struct mailbox_transaction_context *t); void index_save_context_free(struct mail_save_context *ctx); void index_copy_cache_fields(struct mail_save_context *ctx, struct mail *src_mail, uint32_t dest_seq); +int index_storage_set_subscribed(struct mailbox *box, bool set); bool index_keyword_array_cmp(const ARRAY_TYPE(keyword_indexes) *k1, const ARRAY_TYPE(keyword_indexes) *k2); diff --git a/src/lib-storage/index/maildir/maildir-storage.c b/src/lib-storage/index/maildir/maildir-storage.c index e0b2c66784..ae09b2aa47 100644 --- a/src/lib-storage/index/maildir/maildir-storage.c +++ b/src/lib-storage/index/maildir/maildir-storage.c @@ -625,6 +625,7 @@ struct mailbox maildir_mailbox = { index_storage_mailbox_rename, index_storage_get_status, maildir_mailbox_get_metadata, + index_storage_set_subscribed, maildir_list_index_has_changed, maildir_list_index_update_sync, maildir_storage_sync_init, diff --git a/src/lib-storage/index/mbox/mbox-storage.c b/src/lib-storage/index/mbox/mbox-storage.c index 56f772a8ae..8bf34e1fe7 100644 --- a/src/lib-storage/index/mbox/mbox-storage.c +++ b/src/lib-storage/index/mbox/mbox-storage.c @@ -776,6 +776,7 @@ struct mailbox mbox_mailbox = { index_storage_mailbox_rename, index_storage_get_status, mbox_mailbox_get_metadata, + index_storage_set_subscribed, index_storage_list_index_has_changed, index_storage_list_index_update_sync, mbox_storage_sync_init, diff --git a/src/lib-storage/index/raw/raw-storage.c b/src/lib-storage/index/raw/raw-storage.c index 6ad5d715ef..a0b3e81a8b 100644 --- a/src/lib-storage/index/raw/raw-storage.c +++ b/src/lib-storage/index/raw/raw-storage.c @@ -218,6 +218,7 @@ struct mailbox raw_mailbox = { index_storage_mailbox_rename, index_storage_get_status, index_mailbox_get_metadata, + index_storage_set_subscribed, index_storage_list_index_has_changed, index_storage_list_index_update_sync, raw_storage_sync_init, diff --git a/src/lib-storage/mail-storage-private.h b/src/lib-storage/mail-storage-private.h index 5149f7d0ae..e0e2f833a6 100644 --- a/src/lib-storage/mail-storage-private.h +++ b/src/lib-storage/mail-storage-private.h @@ -126,6 +126,7 @@ struct mailbox_vfuncs { int (*get_metadata)(struct mailbox *box, enum mailbox_metadata_items items, struct mailbox_metadata *metadata_r); + int (*set_subscribed)(struct mailbox *box, bool set); /* Lookup sync extension record and figure out if it mailbox has changed since. Returns 1 = yes, 0 = no, -1 = error. */ diff --git a/src/lib-storage/mail-storage.c b/src/lib-storage/mail-storage.c index 01d1f9b504..f2ece13ad0 100644 --- a/src/lib-storage/mail-storage.c +++ b/src/lib-storage/mail-storage.c @@ -1199,42 +1199,13 @@ int mailbox_rename(struct mailbox *src, struct mailbox *dest, int mailbox_set_subscribed(struct mailbox *box, bool set) { - struct mail_namespace *ns; - struct mailbox_list *list = box->list; - const char *subs_name; - - if (!mailbox_list_is_valid_existing_name(list, box->name)) { + if (!mailbox_list_is_valid_existing_name(box->list, box->name)) { mail_storage_set_error(box->storage, MAIL_ERROR_PARAMS, "Invalid mailbox name"); return -1; } - if ((list->ns->flags & NAMESPACE_FLAG_SUBSCRIPTIONS) != 0) - subs_name = box->name; - else { - /* subscriptions=no namespace, find another one where we can - add the subscription to */ - ns = mail_namespace_find_subscribable(list->ns->user->namespaces, - box->vname); - if (ns == NULL) { - mail_storage_set_error(box->storage, MAIL_ERROR_NOTPOSSIBLE, - "This namespace has no subscriptions"); - return -1; - } - /* use as the - subscription name */ - subs_name = t_strconcat(list->ns->prefix, box->name, NULL); - /* drop the common prefix (typically there isn't one) */ - i_assert(strncmp(ns->prefix, subs_name, strlen(ns->prefix)) == 0); - subs_name += strlen(ns->prefix); - - list = ns->list; - } - if (mailbox_list_set_subscribed(list, subs_name, set) < 0) { - mail_storage_copy_list_error(box->storage, list); - return -1; - } - return 0; + return box->v.set_subscribed(box, set); } struct mail_storage *mailbox_get_storage(const struct mailbox *box) diff --git a/src/lib-storage/test-mailbox.c b/src/lib-storage/test-mailbox.c index 76ae44d4f3..d84d690d18 100644 --- a/src/lib-storage/test-mailbox.c +++ b/src/lib-storage/test-mailbox.c @@ -82,6 +82,14 @@ static int test_mailbox_get_status(struct mailbox *box ATTR_UNUSED, return 0; } +static int test_mailbox_set_subscribed(struct mailbox *box, + bool set ATTR_UNUSED) +{ + mail_storage_set_error(box->storage, MAIL_ERROR_NOTPOSSIBLE, + "Test mailbox subscribing isn't supported"); + return -1; +} + static struct mailbox_sync_context * test_mailbox_sync_init(struct mailbox *box, enum mailbox_sync_flags flags ATTR_UNUSED) @@ -244,6 +252,7 @@ struct mailbox test_mailbox = { test_mailbox_rename, test_mailbox_get_status, NULL, + test_mailbox_set_subscribed, NULL, NULL, test_mailbox_sync_init, diff --git a/src/plugins/virtual/virtual-storage.c b/src/plugins/virtual/virtual-storage.c index bdd17fbd7a..cce362ee60 100644 --- a/src/plugins/virtual/virtual-storage.c +++ b/src/plugins/virtual/virtual-storage.c @@ -528,6 +528,7 @@ struct mailbox virtual_mailbox = { index_storage_mailbox_rename, virtual_storage_get_status, virtual_mailbox_get_metadata, + index_storage_set_subscribed, NULL, NULL, virtual_storage_sync_init,