static char imapc_list_get_hierarchy_sep(struct mailbox_list *_list)
{
struct imapc_mailbox_list *list = (struct imapc_mailbox_list *)_list;
- struct imapc_simple_context ctx;
- if (list->sep == '\0') {
- imapc_simple_context_init(&ctx, list->storage);
- imapc_client_cmdf(list->storage->client,
- imapc_list_simple_callback, &ctx,
- "LIST \"\" \"\"");
- imapc_simple_run(&ctx);
-
- if (ctx.ret < 0) {
- list->broken = TRUE;
- return '/';
- }
- }
+ /* storage should have looked this up when it was created */
+ i_assert(list->sep != '\0');
+
return list->sep;
}
unsigned int iter_count;
- /* we've returned wrong separator. all mailbox list operations must
- fail from now on. */
- unsigned int broken:1;
unsigned int refreshed_subscriptions:1;
unsigned int refreshed_mailboxes:1;
unsigned int index_list_failed:1;
}
}
+static int
+imapc_storage_get_hierarchy_sep(struct imapc_storage *storage,
+ const char **error_r)
+{
+ struct imapc_simple_context sctx;
+
+ imapc_simple_context_init(&sctx, storage);
+ imapc_client_cmdf(storage->client, imapc_simple_callback, &sctx,
+ "LIST \"\" \"\"");
+ imapc_simple_run(&sctx);
+
+ if (sctx.ret < 0) {
+ *error_r = t_strdup_printf("LIST failed: %s",
+ mail_storage_get_last_error(&storage->storage, NULL));
+ return -1;
+ }
+
+ if (storage->list->sep == '\0') {
+ *error_r = "LIST didn't return hierarchy separator";
+ return -1;
+ }
+ return sctx.ret;
+}
+
static int
imapc_storage_create(struct mail_storage *_storage,
struct mail_namespace *ns,
imapc_list_register_callbacks(storage->list);
imapc_storage_register_untagged(storage, "STATUS",
imapc_untagged_status);
+ /* connect to imap server and get the hierarchy separator. */
+ if (imapc_storage_get_hierarchy_sep(storage, error_r) < 0) {
+ imapc_client_deinit(&storage->client);
+ return -1;
+ }
return 0;
}