return FALSE;
}
+static const char *
+imapc_list_to_vname(struct imapc_mailbox_list *list, const char *imapc_name)
+{
+ const char *list_name;
+
+ /* typically mailbox_list_escape_name() is used to escape vname into
+ a list name. but we want to convert remote IMAP name to a list name,
+ so we need to use the remote IMAP separator. */
+ list_name = mailbox_list_escape_name_params(imapc_name, "", list->root_sep,
+ mailbox_list_get_hierarchy_sep(&list->list),
+ list->list.set.escape_char, "");
+ /* list_name is now valid, so we can convert it to vname */
+ return mailbox_list_get_vname(&list->list, list_name);
+}
+
+const char *imapc_list_to_remote(struct imapc_mailbox_list *list, const char *name)
+{
+ return mailbox_list_unescape_name_params(name, "", list->root_sep,
+ mailbox_list_get_hierarchy_sep(&list->list),
+ list->list.set.escape_char);
+}
+
static struct mailbox_node *
imapc_list_update_tree(struct imapc_mailbox_list *list,
struct mailbox_tree_context *tree,
flags++;
}
- name = mailbox_list_escape_name(&list->list, name);
T_BEGIN {
- const char *vname =
- mailbox_list_get_vname(&list->list, name);
+ const char *vname = imapc_list_to_vname(list, name);
if ((info_flags & MAILBOX_NONEXISTENT) != 0)
node = mailbox_tree_lookup(tree, vname);
struct imapc_storage_client *client;
struct mailbox_list *index_list;
+ /* mailboxes are stored as vnames */
struct mailbox_tree_context *mailboxes, *tmp_subscriptions;
char root_sep;
time_t last_refreshed_mailboxes;
int imapc_list_get_mailbox_flags(struct mailbox_list *list, const char *name,
enum mailbox_info_flags *flags_r);
int imapc_list_try_get_root_sep(struct imapc_mailbox_list *list, char *sep_r);
+const char *imapc_list_to_remote(struct imapc_mailbox_list *list, const char *name);
#endif
cmd = imapc_client_cmd(ctx->mbox->storage->client->client,
imapc_save_callback, &sctx);
imapc_command_sendf(cmd, "APPEND %s%1s%1s %p",
- mailbox_list_unescape_name(ctx->mbox->box.list, ctx->mbox->box.name),
+ imapc_mailbox_get_remote_name(ctx->mbox),
flags, internaldate, input);
i_stream_unref(&input);
while (sctx.ret == -2)
return &mbox->box;
}
+const char *imapc_mailbox_get_remote_name(struct imapc_mailbox *mbox)
+{
+ if (strcmp(mbox->box.list->name, MAILBOX_LIST_NAME_IMAPC) != 0)
+ return mbox->box.name;
+ return imapc_list_to_remote((struct imapc_mailbox_list *)mbox->box.list,
+ mbox->box.name);
+}
+
static int
imapc_mailbox_exists(struct mailbox *box, bool auto_boxes ATTR_UNUSED,
enum mailbox_existence *existence_r)
imapc_command_set_flags(cmd, IMAPC_COMMAND_FLAG_SELECT);
if (imapc_mailbox_want_examine(mbox)) {
imapc_command_sendf(cmd, "EXAMINE %s",
- mailbox_list_unescape_name(mbox->box.list, mbox->box.name));
+ imapc_mailbox_get_remote_name(mbox));
} else {
imapc_command_sendf(cmd, "SELECT %s",
- mailbox_list_unescape_name(mbox->box.list, mbox->box.name));
+ imapc_mailbox_get_remote_name(mbox));
}
mbox->storage->reopen_count++;
imapc_command_set_flags(cmd, IMAPC_COMMAND_FLAG_SELECT);
if (imapc_mailbox_want_examine(mbox)) {
imapc_command_sendf(cmd, "EXAMINE %s",
- mailbox_list_unescape_name(mbox->box.list, mbox->box.name));
+ imapc_mailbox_get_remote_name(mbox));
} else {
imapc_command_sendf(cmd, "SELECT %s",
- mailbox_list_unescape_name(mbox->box.list, mbox->box.name));
+ imapc_mailbox_get_remote_name(mbox));
}
while (ctx.ret == -2)
void imapc_mailbox_noop(struct imapc_mailbox *mbox);
void imapc_mailbox_set_corrupted(struct imapc_mailbox *mbox,
const char *reason, ...) ATTR_FORMAT(2, 3);
+const char *imapc_mailbox_get_remote_name(struct imapc_mailbox *mbox);
void imapc_storage_client_register_untagged(struct imapc_storage_client *client,
const char *name,