Lines Matching refs:list
10 #include "mailbox-list-subscriptions.h"
12 #include "imapc-list.h"
44 static void imapc_list_send_hierarchy_sep_lookup(struct imapc_mailbox_list *list);
52 struct imapc_mailbox_list *list;
55 pool = pool_alloconly_create("imapc mailbox list", 1024);
56 list = p_new(pool, struct imapc_mailbox_list, 1);
57 list->list = imapc_mailbox_list;
58 list->list.pool = pool;
60 list->mailboxes = mailbox_tree_init('\0');
61 mailbox_tree_set_parents_nonexistent(list->mailboxes);
62 return &list->list;
67 struct imapc_mailbox_list *list = (struct imapc_mailbox_list *)_list;
69 list->set = mail_user_set_get_driver_settings(_list->ns->user->set_info,
72 if (imapc_storage_client_create(_list->ns, list->set, _list->mail_set,
73 &list->client, error_r) < 0)
75 list->client->_list = list;
77 imapc_storage_client_register_untagged(list->client, "LIST",
79 imapc_storage_client_register_untagged(list->client, "LSUB",
81 imapc_list_send_hierarchy_sep_lookup(list);
87 struct imapc_mailbox_list *list = (struct imapc_mailbox_list *)_list;
91 if (list->client != NULL) {
92 list->client->destroying = TRUE;
93 imapc_client_logout(list->client->client);
94 imapc_storage_client_unref(&list->client);
96 if (list->index_list != NULL)
97 mailbox_list_destroy(&list->index_list);
98 mailbox_tree_deinit(&list->mailboxes);
99 if (list->tmp_subscriptions != NULL)
100 mailbox_tree_deinit(&list->tmp_subscriptions);
101 pool_unref(&list->list.pool);
105 imapc_list_copy_error_from_reply(struct imapc_mailbox_list *list,
112 mailbox_list_set_error(&list->list, error,
115 mailbox_list_set_error(&list->list, default_error,
134 mailbox_list_set_internal_error(&ctx->client->_list->list);
137 mailbox_list_set_critical(&ctx->client->_list->list,
159 imapc_list_to_vname(struct imapc_mailbox_list *list, const char *imapc_name)
164 a list name. but we want to convert remote IMAP name to a list name,
166 list_name = mailbox_list_escape_name_params(imapc_name, "", list->root_sep,
167 mailbox_list_get_hierarchy_sep(&list->list),
168 list->list.set.escape_char, "");
170 return mailbox_list_get_vname(&list->list, list_name);
173 const char *imapc_list_to_remote(struct imapc_mailbox_list *list, const char *name)
175 return mailbox_list_unescape_name_params(name, "", list->root_sep,
176 mailbox_list_get_hierarchy_sep(&list->list),
177 list->list.set.escape_char);
181 imapc_list_update_tree(struct imapc_mailbox_list *list,
203 const char *vname = imapc_list_to_vname(list, name);
218 struct imapc_mailbox_list *list = client->_list;
222 if (list->root_sep == '\0') {
231 list->root_sep = sep == NULL ? '/' : sep[0];
232 mailbox_tree_set_separator(list->mailboxes, list->root_sep);
234 (void)imapc_list_update_tree(list, list->mailboxes, args);
241 struct imapc_mailbox_list *list = client->_list;
245 if (list->root_sep == '\0') {
249 node = imapc_list_update_tree(list, list->tmp_subscriptions != NULL ?
250 list->tmp_subscriptions :
251 list->list.subscriptions, args);
263 static void imapc_list_sep_verify(struct imapc_mailbox_list *list)
265 const char *imapc_list_prefix = list->set->imapc_list_prefix;
267 if (list->root_sep == '\0') {
268 mailbox_list_set_critical(&list->list,
271 imapc_list_prefix[strlen(imapc_list_prefix)-1] == list->root_sep) {
272 mailbox_list_set_critical(&list->list,
280 struct imapc_mailbox_list *list = context;
282 list->root_sep_pending = FALSE;
284 imapc_list_sep_verify(list);
286 imapc_list_copy_error_from_reply(list, MAIL_ERROR_PARAMS, reply);
287 else if (imapc_storage_client_handle_auth_failure(list->client))
290 mailbox_list_set_internal_error(&list->list);
291 else if (!list->list.ns->user->deinitializing) {
292 mailbox_list_set_critical(&list->list,
295 imapc_client_stop(list->client->client);
298 static void imapc_list_send_hierarchy_sep_lookup(struct imapc_mailbox_list *list)
302 if (list->root_sep_pending)
304 list->root_sep_pending = TRUE;
306 cmd = imapc_client_cmd(list->client->client,
307 imapc_storage_sep_callback, list);
312 int imapc_list_try_get_root_sep(struct imapc_mailbox_list *list, char *sep_r)
314 if (list->root_sep == '\0') {
315 if (imapc_storage_client_handle_auth_failure(list->client))
317 imapc_list_send_hierarchy_sep_lookup(list);
318 while (list->root_sep_pending)
319 imapc_client_run(list->client->client);
320 if (list->root_sep == '\0')
323 *sep_r = list->root_sep;
329 struct imapc_mailbox_list *list = (struct imapc_mailbox_list *)_list;
332 if (imapc_list_try_get_root_sep(list, &sep) < 0) {
334 separator and fail all the future list operations. */
343 struct imapc_mailbox_list *list = (struct imapc_mailbox_list *)_list;
344 const char *prefix = list->set->imapc_list_prefix;
360 struct imapc_mailbox_list *list = (struct imapc_mailbox_list *)_list;
361 const char *prefix = list->set->imapc_list_prefix;
381 static struct mailbox_list *imapc_list_get_fs(struct imapc_mailbox_list *list)
386 dir = list->list.set.index_dir;
388 dir = list->list.set.root_dir;
392 } else if (list->index_list == NULL && !list->index_list_failed) {
399 if (mailbox_list_create(list_set.layout, list->list.ns,
401 &list->index_list, &error) < 0) {
402 i_error("imapc: Couldn't create %s mailbox list: %s",
404 list->index_list_failed = TRUE;
407 return list->index_list;
411 imapc_list_get_fs_name(struct imapc_mailbox_list *list, const char *name)
413 struct mailbox_list *fs_list = imapc_list_get_fs(list);
414 struct mail_namespace *ns = list->list.ns;
421 vname = mailbox_list_get_vname(&list->list, name);
422 if (list->set->imapc_list_prefix[0] != '\0') {
438 list->set->imapc_list_prefix, NULL);
441 list->set->imapc_list_prefix,
452 struct imapc_mailbox_list *list = (struct imapc_mailbox_list *)_list;
453 struct mailbox_list *fs_list = imapc_list_get_fs(list);
457 fs_name = imapc_list_get_fs_name(list, name);
468 struct imapc_mailbox_list *list = (struct imapc_mailbox_list *)_list;
469 struct mailbox_list *fs_list = imapc_list_get_fs(list);
482 imapc_list_join_refpattern(struct mailbox_list *list ATTR_UNUSED,
490 struct imapc_mailbox_list *list)
492 imapc_simple_context_init(ctx, list->client);
493 return imapc_client_cmd(list->client->client,
497 static void imapc_list_delete_unused_indexes(struct imapc_mailbox_list *list)
499 struct mailbox_list *fs_list = imapc_list_get_fs(list);
502 const char *imapc_list_prefix = list->set->imapc_list_prefix;
521 /* skip over the imapc list prefix */
535 if (mailbox_tree_lookup(list->mailboxes, vname) == NULL) {
544 static int imapc_list_refresh(struct imapc_mailbox_list *list)
552 if (imapc_list_try_get_root_sep(list, &sep) < 0)
554 if (list->refreshed_mailboxes)
557 if (*list->set->imapc_list_prefix == '\0')
560 /* list "prefix*" instead of "prefix.*". this may return a bit
563 pattern = t_strdup_printf("%s*", list->set->imapc_list_prefix);
566 cmd = imapc_list_simple_context_init(&ctx, list);
569 mailbox_tree_deinit(&list->mailboxes);
570 list->mailboxes = mailbox_tree_init(mail_namespace_get_sep(list->list.ns));
571 mailbox_tree_set_parents_nonexistent(list->mailboxes);
574 if ((list->list.ns->flags & NAMESPACE_FLAG_INBOX_USER) != 0) {
579 node = mailbox_tree_get(list->mailboxes, "INBOX", &created);
580 if (*list->set->imapc_list_prefix != '\0') {
590 list->refreshed_mailboxes = TRUE;
591 list->refreshed_mailboxes_recently = TRUE;
592 list->last_refreshed_mailboxes = ioloop_time;
593 imapc_list_delete_unused_indexes(list);
601 struct imapc_mailbox_list *list =
602 (struct imapc_mailbox_list *)ctx->ctx.list;
614 iter = mailbox_tree_iterate_init(list->mailboxes, NULL, 0);
626 struct imapc_mailbox_list *list = (struct imapc_mailbox_list *)_list;
636 ret = imapc_list_refresh(list);
638 list->iter_count++;
642 subscriptions list. */
654 pool = pool_alloconly_create("mailbox list imapc iter", 1024);
657 ctx->ctx.list = _list;
669 if (list->list.ns->prefix_len > 0) {
712 struct imapc_mailbox_list *list =
713 (struct imapc_mailbox_list *)_ctx->list;
733 list->set->imapc_list_prefix[0] == '\0') {
740 if ((_ctx->list->ns->flags & NAMESPACE_FLAG_INBOX_USER) != 0) {
754 struct imapc_mailbox_list *list =
755 (struct imapc_mailbox_list *)_ctx->list;
758 i_assert(list->iter_count > 0);
760 if (--list->iter_count == 0) {
761 list->refreshed_mailboxes = FALSE;
762 list->refreshed_subscriptions = FALSE;
825 struct imapc_mailbox_list *list = (struct imapc_mailbox_list *)_list;
829 cmd = imapc_list_simple_context_init(&ctx, list);
832 imapc_list_to_remote(list, name));
840 struct imapc_mailbox_list *list = (struct imapc_mailbox_list *)_list;
841 struct mailbox_list *fs_list = imapc_list_get_fs(list);
846 if (imapc_storage_client_handle_auth_failure(list->client))
848 if (imapc_client_get_capabilities(list->client->client, &capa) < 0)
851 cmd = imapc_list_simple_context_init(&ctx, list);
864 cmd = imapc_list_simple_context_init(&ctx, list);
866 imapc_command_sendf(cmd, "DELETE %s", imapc_list_to_remote(list, name));
870 name = imapc_list_get_fs_name(list, name);
879 struct imapc_mailbox_list *list = (struct imapc_mailbox_list *)_list;
880 struct mailbox_list *fs_list = imapc_list_get_fs(list);
883 name = imapc_list_get_fs_name(list, name);
890 imapc_list_delete_symlink(struct mailbox_list *list,
893 mailbox_list_set_error(list, MAIL_ERROR_NOTPOSSIBLE, "Not supported");
901 struct imapc_mailbox_list *list = (struct imapc_mailbox_list *)oldlist;
902 struct mailbox_list *fs_list = imapc_list_get_fs(list);
912 cmd = imapc_list_simple_context_init(&ctx, list);
914 imapc_list_to_remote(list, oldname),
915 imapc_list_to_remote(list, newname));
918 oldname = imapc_list_get_fs_name(list, oldname);
919 newname = imapc_list_get_fs_name(list, newname);
929 struct imapc_mailbox_list *list = (struct imapc_mailbox_list *)_list;
934 if (!list->refreshed_mailboxes_recently) {
935 if (imapc_list_refresh(list) < 0)
937 i_assert(list->refreshed_mailboxes_recently);
940 if (list->mailboxes == NULL) {
941 /* imapc list isn't used, but e.g. LAYOUT=none */
945 node = mailbox_tree_lookup(list->mailboxes, vname);