# HG changeset patch # User Timo Sirainen # Date 1297464527 -7200 # Node ID 28f43332ba121bc2d2ad8eafba8bb93aad7b9001 # Parent 87a75628c8f512d254e867c0bc4a00dbc4fde9ee lib-storage: Changed mailbox_list.subscriptions_refresh() API to be more flexible. The new API makes it easier implement subscriptions=no to a backend that doesn't use the regular subscriptions file. diff -r 87a75628c8f5 -r 28f43332ba12 src/lib-storage/index/imapc/imapc-list.c --- a/src/lib-storage/index/imapc/imapc-list.c Sat Feb 12 00:38:09 2011 +0200 +++ b/src/lib-storage/index/imapc/imapc-list.c Sat Feb 12 00:48:47 2011 +0200 @@ -297,7 +297,8 @@ } 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; } diff -r 87a75628c8f5 -r 28f43332ba12 src/lib-storage/index/shared/shared-list.c --- a/src/lib-storage/index/shared/shared-list.c Sat Feb 12 00:38:09 2011 +0200 +++ b/src/lib-storage/index/shared/shared-list.c Sat Feb 12 00:48:47 2011 +0200 @@ -211,7 +211,8 @@ } 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; } diff -r 87a75628c8f5 -r 28f43332ba12 src/lib-storage/list/mailbox-list-none.c --- a/src/lib-storage/list/mailbox-list-none.c Sat Feb 12 00:38:09 2011 +0200 +++ b/src/lib-storage/list/mailbox-list-none.c Sat Feb 12 00:48:47 2011 +0200 @@ -72,7 +72,8 @@ } 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; } diff -r 87a75628c8f5 -r 28f43332ba12 src/lib-storage/list/mailbox-list-subscriptions.c --- a/src/lib-storage/list/mailbox-list-subscriptions.c Sat Feb 12 00:38:09 2011 +0200 +++ b/src/lib-storage/list/mailbox-list-subscriptions.c Sat Feb 12 00:48:47 2011 +0200 @@ -87,55 +87,48 @@ 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 (dest_list->subscriptions == NULL) { + sep = mail_namespace_get_sep(src_list->ns); + dest_list->subscriptions = mailbox_tree_init(sep); } - - if (list->subscriptions == NULL) { - sep = mail_namespace_get_sep(ns); - 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 @@ } 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; diff -r 87a75628c8f5 -r 28f43332ba12 src/lib-storage/list/mailbox-list-subscriptions.h --- a/src/lib-storage/list/mailbox-list-subscriptions.h Sat Feb 12 00:38:09 2011 +0200 +++ b/src/lib-storage/list/mailbox-list-subscriptions.h Sat Feb 12 00:48:47 2011 +0200 @@ -6,7 +6,8 @@ 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. */ diff -r 87a75628c8f5 -r 28f43332ba12 src/lib-storage/mailbox-list-private.h --- a/src/lib-storage/mailbox-list-private.h Sat Feb 12 00:38:09 2011 +0200 +++ b/src/lib-storage/mailbox-list-private.h Sat Feb 12 00:48:47 2011 +0200 @@ -72,7 +72,10 @@ 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, diff -r 87a75628c8f5 -r 28f43332ba12 src/lib-storage/mailbox-list.c --- a/src/lib-storage/mailbox-list.c Sat Feb 12 00:38:09 2011 +0200 +++ b/src/lib-storage/mailbox-list.c Sat Feb 12 00:48:47 2011 +0200 @@ -867,6 +867,22 @@ 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 @@ 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)