list = p_new(pool, struct imapc_mailbox_list, 1);
list->list = imapc_mailbox_list;
list->list.pool = pool;
+ /* separator is set when storage is created */
+ list->mailboxes = mailbox_tree_init('\0');
return &list->list;
}
{
struct imapc_mailbox_list *list = (struct imapc_mailbox_list *)_list;
- if (list->mailboxes != NULL)
- mailbox_tree_deinit(&list->mailboxes);
+ mailbox_tree_deinit(&list->mailboxes);
if (list->tmp_subscriptions != NULL)
mailbox_tree_deinit(&list->tmp_subscriptions);
pool_unref(&list->list.pool);
/* we can't handle NIL separator yet */
list->sep = sep == NULL ? '/' : sep[0];
- if (list->mailboxes != NULL)
- mailbox_tree_set_separator(list->mailboxes, list->sep);
+ mailbox_tree_set_separator(list->mailboxes, list->sep);
} else {
(void)imapc_list_update_tree(list, list->mailboxes, args);
}
{
struct imapc_simple_context ctx;
+ i_assert(list->sep != '\0');
+
if (list->refreshed_mailboxes)
return 0;
- if (list->sep == '\0')
- (void)mailbox_list_get_hierarchy_sep(&list->list);
-
imapc_simple_context_init(&ctx, list->storage);
imapc_client_cmdf(list->storage->client,
imapc_list_simple_callback, &ctx, "LIST \"\" *");
- if (list->mailboxes != NULL)
- mailbox_tree_deinit(&list->mailboxes);
+ mailbox_tree_deinit(&list->mailboxes);
list->mailboxes = mailbox_tree_init(list->sep);
imapc_simple_run(&ctx);
return ctx.ret;
}
+int imapc_list_get_mailbox_flags(struct mailbox_list *_list, const char *name,
+ enum mailbox_info_flags *flags_r)
+{
+ struct imapc_mailbox_list *list = (struct imapc_mailbox_list *)_list;
+ struct imapc_simple_context sctx;
+ struct mailbox_node *node;
+ const char *vname;
+
+ i_assert(list->sep != '\0');
+
+ vname = mailbox_list_default_get_vname(_list, name);
+ node = mailbox_tree_lookup(list->mailboxes, vname);
+ if (node != NULL)
+ node->flags |= MAILBOX_NONEXISTENT;
+
+ /* refresh the mailbox flags */
+ imapc_simple_context_init(&sctx, list->storage);
+ imapc_client_cmdf(list->storage->client, imapc_simple_callback,
+ &sctx, "LIST \"\" %s", name);
+ imapc_simple_run(&sctx);
+ if (sctx.ret < 0)
+ return -1;
+
+ node = mailbox_tree_lookup(list->mailboxes, vname);
+ if (node == NULL)
+ *flags_r = MAILBOX_NONEXISTENT;
+ else
+ *flags_r = node->flags;
+ return 0;
+}
+
struct mailbox_list imapc_mailbox_list = {
.name = MAILBOX_LIST_NAME_IMAPC,
.props = MAILBOX_LIST_PROP_NO_ROOT,
#include "str.h"
#include "imap-arg.h"
#include "imap-resp-code.h"
+#include "mailbox-tree.h"
#include "imapc-mail.h"
#include "imapc-client-private.h"
#include "imapc-connection.h"
return &mbox->box;
}
+static int
+imapc_mailbox_exists(struct mailbox *box, bool auto_boxes ATTR_UNUSED,
+ enum mailbox_existence *existence_r)
+{
+ enum mailbox_info_flags flags;
+
+ if (imapc_list_get_mailbox_flags(box->list, box->name, &flags) < 0)
+ return -1;
+ if ((flags & MAILBOX_NONEXISTENT) != 0)
+ *existence_r = MAILBOX_EXISTENCE_NONE;
+ else if ((flags & MAILBOX_NOSELECT) != 0)
+ *existence_r = MAILBOX_EXISTENCE_NOSELECT;
+ else
+ *existence_r = MAILBOX_EXISTENCE_SELECT;
+ return 0;
+}
+
static void
imapc_mailbox_open_callback(const struct imapc_command_reply *reply,
void *context)
.v = {
index_storage_is_readonly,
index_storage_mailbox_enable,
- index_storage_mailbox_exists,
+ imapc_mailbox_exists,
imapc_mailbox_open,
imapc_mailbox_close,
index_storage_mailbox_free,