]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: Added struct mailbox.set_subscribed() virtual method.
authorTimo Sirainen <tss@iki.fi>
Fri, 30 Dec 2011 09:54:48 +0000 (11:54 +0200)
committerTimo Sirainen <tss@iki.fi>
Fri, 30 Dec 2011 09:54:48 +0000 (11:54 +0200)
13 files changed:
src/lib-storage/index/cydir/cydir-storage.c
src/lib-storage/index/dbox-multi/mdbox-storage.c
src/lib-storage/index/dbox-single/sdbox-storage.c
src/lib-storage/index/imapc/imapc-storage.c
src/lib-storage/index/index-storage.c
src/lib-storage/index/index-storage.h
src/lib-storage/index/maildir/maildir-storage.c
src/lib-storage/index/mbox/mbox-storage.c
src/lib-storage/index/raw/raw-storage.c
src/lib-storage/mail-storage-private.h
src/lib-storage/mail-storage.c
src/lib-storage/test-mailbox.c
src/plugins/virtual/virtual-storage.c

index 102198934cbd48902290840f5b84ebef6cda0c99..03333817d7bead0d3989385349e34f1ea0034331 100644 (file)
@@ -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,
index fa4b2e3116caf8c5662a309d7b759ba4c01fdae8..7debd6b476ac4500ddb7b5da0a142140a3328965 100644 (file)
@@ -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,
index f23883bd3b82d31deb7099a377d99af0d8b96d53..4b66b7e8a0fd9cc0f16e6c3a1b90aec4d56a6182 100644 (file)
@@ -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,
index ce78348731256fb1c7dff9eaf3215f53b4cbe3f5..f6c0332564826f5a3a1ede295b6d91d7e717d104 100644 (file)
@@ -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,
index 7673f6339bb5be6a5f70f81109407d6e2764e509..14e3a14660f5f89e04c031fce6efdd047eb76367 100644 (file)
@@ -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 <orig ns prefix><orig storage name> 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;
+}
+
index eb7106fed49a3e256da8d02ee638f30a41256152..e645f86066857e82958b4cf501ab4a65a48b62ed 100644 (file)
@@ -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);
index e0b2c66784cc633474159cacb89c21189e607030..ae09b2aa47c7c573a84e118a7fad3a3e6903f2ed 100644 (file)
@@ -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,
index 56f772a8ae917b610bf90017717137d88bf00929..8bf34e1fe7141878babf793016445ae3527db2b3 100644 (file)
@@ -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,
index 6ad5d715efa92154dd1fa22f93c17fe8ddcab7d2..a0b3e81a8b08f097170f3decb517447579d2eb0b 100644 (file)
@@ -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,
index 5149f7d0ae5772cb03cc948785370d68ad853077..e0e2f833a6c4b292d1689e983f1a1f66b9d624d9 100644 (file)
@@ -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. */
index 01d1f9b504b4f5a94848caeac263a218e390f705..f2ece13ad0d2af6b7e994282f3229f82fab24eb2 100644 (file)
@@ -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 <orig ns prefix><orig storage name> 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)
index 76ae44d4f3a96492bcb539093f22b3302e76023a..d84d690d188bde1ae22014b2d7fb1adec79fca1e 100644 (file)
@@ -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,
index bdd17fbd7a4ea089187474f2e56decd61482cff7..cce362ee6048cb2919eabbc4cca008944bc06471 100644 (file)
@@ -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,