]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: Changed mailbox_list.subscriptions_refresh() API to be more flexible.
authorTimo Sirainen <tss@iki.fi>
Fri, 11 Feb 2011 22:48:47 +0000 (00:48 +0200)
committerTimo Sirainen <tss@iki.fi>
Fri, 11 Feb 2011 22:48:47 +0000 (00:48 +0200)
The new API makes it easier implement subscriptions=no to a backend that
doesn't use the regular subscriptions file.

src/lib-storage/index/imapc/imapc-list.c
src/lib-storage/index/shared/shared-list.c
src/lib-storage/list/mailbox-list-none.c
src/lib-storage/list/mailbox-list-subscriptions.c
src/lib-storage/list/mailbox-list-subscriptions.h
src/lib-storage/mailbox-list-private.h
src/lib-storage/mailbox-list.c

index fce528fa70c6239eb8c38e4dfd508962dfeb8ece..820c3d391531614e6663bcf3c766c71cb42f7208 100644 (file)
@@ -297,7 +297,8 @@ static int imapc_list_iter_deinit(struct mailbox_list_iterate_context *_ctx)
 }
 
 static int
-imapc_list_subscriptions_refresh(struct mailbox_list *_list ATTR_UNUSED)
+imapc_list_subscriptions_refresh(struct mailbox_list *_src_list ATTR_UNUSED,
+                                struct mailbox_list *_dest_list ATTR_UNUSED)
 {
        return 0;
 }
index f0a9943e198272b86c93130be996b89705db870c..51824eb90d62005e0e555d08e8313ce56a6529a7 100644 (file)
@@ -211,7 +211,8 @@ static int shared_list_iter_deinit(struct mailbox_list_iterate_context *_ctx)
 }
 
 static int
-shared_list_subscriptions_refresh(struct mailbox_list *list ATTR_UNUSED)
+shared_list_subscriptions_refresh(struct mailbox_list *src_list ATTR_UNUSED,
+                                 struct mailbox_list *dest_list ATTR_UNUSED)
 {
        return 0;
 }
index fe8ac7082c02c5b0bb7a9da4f2e3bbc0d20d14e8..6dc35c247f69063ed706e09eac8fe851f0b3def7 100644 (file)
@@ -72,7 +72,8 @@ none_list_get_temp_prefix(struct mailbox_list *list ATTR_UNUSED,
 }
 
 static int
-none_list_subscriptions_refresh(struct mailbox_list *list ATTR_UNUSED)
+none_list_subscriptions_refresh(struct mailbox_list *src_list ATTR_UNUSED,
+                               struct mailbox_list *dest_list ATTR_UNUSED)
 {
        return 0;
 }
index 25457e2306710c2f577f8955eda5560862975a50..ad399ee86cab6e4d5905372e0ae2d90275ebeb3d 100644 (file)
@@ -87,55 +87,48 @@ mailbox_list_subscription_fill_one(struct mailbox_list *list,
        return 0;
 }
 
-int mailbox_list_subscriptions_refresh(struct mailbox_list *list)
+int mailbox_list_subscriptions_refresh(struct mailbox_list *src_list,
+                                      struct mailbox_list *dest_list)
 {
-       struct mail_namespace *ns = list->ns;
        struct subsfile_list_context *subsfile_ctx;
        struct stat st;
        const char *path, *name;
        char sep;
 
-       if ((ns->flags & NAMESPACE_FLAG_SUBSCRIPTIONS) == 0) {
-               /* no subscriptions in this namespace. find where they are. */
-               ns = mail_namespace_find_subscribable(ns->user->namespaces,
-                                                     ns->prefix);
-               if (ns == NULL) {
-                       /* no subscriptions */
-                       return 0;
-               }
-       }
+       i_assert((src_list->ns->flags & NAMESPACE_FLAG_SUBSCRIPTIONS) != 0);
 
-       if (list->subscriptions == NULL) {
-               sep = mail_namespace_get_sep(ns);
-               list->subscriptions = mailbox_tree_init(sep);
+       if (dest_list->subscriptions == NULL) {
+               sep = mail_namespace_get_sep(src_list->ns);
+               dest_list->subscriptions = mailbox_tree_init(sep);
        }
-       path = t_strconcat(ns->list->set.control_dir != NULL ?
-                          ns->list->set.control_dir : ns->list->set.root_dir,
-                          "/", ns->list->set.subscription_fname, NULL);
+       path = t_strconcat(src_list->set.control_dir != NULL ?
+                          src_list->set.control_dir : src_list->set.root_dir,
+                          "/", src_list->set.subscription_fname, NULL);
        if (stat(path, &st) < 0) {
                if (errno == ENOENT) {
                        /* no subscriptions */
-                       mailbox_tree_clear(list->subscriptions);
-                       list->subscriptions_mtime = 0;
+                       mailbox_tree_clear(dest_list->subscriptions);
+                       dest_list->subscriptions_mtime = 0;
                        return 0;
                }
-               mailbox_list_set_critical(list, "stat(%s) failed: %m", path);
+               mailbox_list_set_critical(dest_list, "stat(%s) failed: %m",
+                                         path);
                return -1;
        }
-       if (st.st_mtime == list->subscriptions_mtime &&
-           st.st_mtime < list->subscriptions_read_time-1) {
+       if (st.st_mtime == dest_list->subscriptions_mtime &&
+           st.st_mtime < dest_list->subscriptions_read_time-1) {
                /* we're up to date */
                return 0;
        }
 
-       mailbox_tree_clear(list->subscriptions);
-       list->subscriptions_read_time = ioloop_time;
+       mailbox_tree_clear(dest_list->subscriptions);
+       dest_list->subscriptions_read_time = ioloop_time;
 
-       subsfile_ctx = subsfile_list_init(list, path);
+       subsfile_ctx = subsfile_list_init(dest_list, path);
        if (subsfile_list_fstat(subsfile_ctx, &st) == 0)
-               list->subscriptions_mtime = st.st_mtime;
+               dest_list->subscriptions_mtime = st.st_mtime;
        while ((name = subsfile_list_next(subsfile_ctx)) != NULL) T_BEGIN {
-               if (mailbox_list_subscription_fill_one(list, name) < 0) {
+               if (mailbox_list_subscription_fill_one(dest_list, name) < 0) {
                        i_warning("Subscriptions file %s: "
                                  "Ignoring invalid entry: %s",
                                  path, name);
@@ -143,7 +136,7 @@ int mailbox_list_subscriptions_refresh(struct mailbox_list *list)
        } T_END;
 
        if (subsfile_list_deinit(&subsfile_ctx) < 0) {
-               list->subscriptions_mtime = (time_t)-1;
+               dest_list->subscriptions_mtime = (time_t)-1;
                return -1;
        }
        return 0;
index e0fbe013483eecd76b56c6bebf71d5b735c5ac59..c235532f98b53eea813c1a3d0775a65bc410328e 100644 (file)
@@ -6,7 +6,8 @@ enum mailbox_list_iter_flags;
 struct mailbox_tree_context;
 struct mailbox_list_iterate_context;
 
-int mailbox_list_subscriptions_refresh(struct mailbox_list *list);
+int mailbox_list_subscriptions_refresh(struct mailbox_list *src_list,
+                                      struct mailbox_list *dest_list);
 
 /* Set MAILBOX_SUBSCRIBED and MAILBOX_CHILD_SUBSCRIBED flags,
    clearing them if they already are there when they shouldn't. */
index 01f3385637a2caf8fb91e4f16d009c249ac1a0ea..c9e1c2754f49a970db71cc573229e5c296bafdea 100644 (file)
@@ -72,7 +72,10 @@ struct mailbox_list_vfuncs {
           If it does, mailbox deletion assumes it can safely delete it. */
        bool (*is_internal_name)(struct mailbox_list *list, const char *name);
 
-       int (*subscriptions_refresh)(struct mailbox_list *list);
+       /* Read subscriptions from src_list, but place them into
+          dest_list->subscriptions. Set errors to dest_list. */
+       int (*subscriptions_refresh)(struct mailbox_list *src_list,
+                                    struct mailbox_list *dest_list);
        int (*set_subscribed)(struct mailbox_list *list,
                              const char *name, bool set);
        int (*create_mailbox_dir)(struct mailbox_list *list, const char *name,
index 8ef45312fb01166af84a85bd873fb0e5a8c34492..bcbda30cfb07a3d360d58b67bf8cce065313b547 100644 (file)
@@ -867,6 +867,22 @@ mailbox_list_iter_init(struct mailbox_list *list, const char *pattern,
        return mailbox_list_iter_init_multiple(list, patterns, flags);
 }
 
+static int mailbox_list_subscriptions_refresh(struct mailbox_list *list)
+{
+       struct mail_namespace *ns = list->ns;
+
+       if ((ns->flags & NAMESPACE_FLAG_SUBSCRIPTIONS) == 0) {
+               /* no subscriptions in this namespace. find where they are. */
+               ns = mail_namespace_find_subscribable(ns->user->namespaces,
+                                                     ns->prefix);
+               if (ns == NULL) {
+                       /* no subscriptions */
+                       return 0;
+               }
+       }
+       return ns->list->v.subscriptions_refresh(ns->list, list);
+}
+
 struct mailbox_list_iterate_context *
 mailbox_list_iter_init_multiple(struct mailbox_list *list,
                                const char *const *patterns,
@@ -879,7 +895,7 @@ mailbox_list_iter_init_multiple(struct mailbox_list *list,
 
        if ((flags & (MAILBOX_LIST_ITER_SELECT_SUBSCRIBED |
                      MAILBOX_LIST_ITER_RETURN_SUBSCRIBED)) != 0)
-               ret = list->v.subscriptions_refresh(list);
+               ret = mailbox_list_subscriptions_refresh(list);
 
        ctx = list->v.iter_init(list, patterns, flags);
        if (ret < 0)