imapc_command_callback_t *callback, void *context);
void imapc_command_set_flags(struct imapc_command *cmd,
enum imapc_command_flags flags);
+bool imapc_command_connection_is_selected(struct imapc_command *cmd);
void imapc_command_send(struct imapc_command *cmd, const char *cmd_str);
void imapc_command_sendf(struct imapc_command *cmd, const char *cmd_fmt, ...)
ATTR_FORMAT(2, 3);
void imapc_command_sendvf(struct imapc_command *cmd,
const char *cmd_fmt, va_list args) ATTR_FORMAT(2, 0);
+void imapc_command_abort(struct imapc_command **cmd);
void imapc_client_register_untagged(struct imapc_client *client,
imapc_untagged_callback_t *callback,
pool_unref(&cmd->pool);
}
+void imapc_command_abort(struct imapc_command **_cmd)
+{
+ struct imapc_command *cmd = *_cmd;
+
+ *_cmd = NULL;
+ imapc_command_free(cmd);
+}
+
static void imapc_command_timeout(struct imapc_connection *conn)
{
struct imapc_command *const *cmds;
box->pending_box_command_count++;
}
+bool imapc_command_connection_is_selected(struct imapc_command *cmd)
+{
+ return cmd->conn->selected_box != NULL ||
+ cmd->conn->selecting_box != NULL;
+}
+
void imapc_command_send(struct imapc_command *cmd, const char *cmd_str)
{
unsigned int len = strlen(cmd_str);
capa = imapc_client_get_capabilities(list->client->client);
cmd = imapc_list_simple_context_init(&ctx, list);
- imapc_command_set_flags(cmd, IMAPC_COMMAND_FLAG_SELECT);
- if ((capa & IMAPC_CAPABILITY_UNSELECT) != 0)
- imapc_command_sendf(cmd, "UNSELECT");
- else
- imapc_command_sendf(cmd, "SELECT \"~~~\"");
- imapc_simple_run(&ctx);
+ if (!imapc_command_connection_is_selected(cmd))
+ imapc_command_abort(&cmd);
+ else {
+ imapc_command_set_flags(cmd, IMAPC_COMMAND_FLAG_SELECT);
+ if ((capa & IMAPC_CAPABILITY_UNSELECT) != 0)
+ imapc_command_sendf(cmd, "UNSELECT");
+ else
+ imapc_command_sendf(cmd, "SELECT \"~~~\"");
+ imapc_simple_run(&ctx);
+ }
cmd = imapc_list_simple_context_init(&ctx, list);
imapc_command_sendf(cmd, "DELETE %s", name);