pool_unref(&client->pool);
}
+void imapc_client_disconnect(struct imapc_client *client)
+{
+ struct imapc_client_connection *const *conns, *conn;
+ unsigned int i, count;
+
+ conns = array_get(&client->conns, &count);
+ for (i = count; i > 0; i--) {
+ conn = conns[i-1];
+ array_delete(&client->conns, i-1, 1);
+
+ i_assert(imapc_connection_get_mailbox(conn->conn) == NULL);
+ imapc_connection_deinit(&conn->conn);
+ i_free(conn);
+ }
+}
+
void imapc_client_deinit(struct imapc_client **_client)
{
struct imapc_client *client = *_client;
- struct imapc_client_connection **connp;
- array_foreach_modifiable(&client->conns, connp) {
- i_assert(imapc_connection_get_mailbox((*connp)->conn) == NULL);
- imapc_connection_deinit(&(*connp)->conn);
- i_free(*connp);
- }
- array_clear(&client->conns);
+ imapc_client_disconnect(client);
imapc_client_unref(_client);
}
struct imapc_client *
imapc_client_init(const struct imapc_client_settings *set);
+void imapc_client_disconnect(struct imapc_client *client);
void imapc_client_deinit(struct imapc_client **client);
/* Explicitly login to server (also done automatically). */
{
struct imapc_mailbox_list *list = (struct imapc_mailbox_list *)_list;
+ /* make sure all pending commands are aborted before anything is
+ deinitialized */
+ imapc_client_disconnect(list->client->client);
+
+ imapc_storage_client_unref(&list->client);
if (list->index_list != NULL)
mailbox_list_destroy(&list->index_list);
mailbox_tree_deinit(&list->mailboxes);
if (list->tmp_subscriptions != NULL)
mailbox_tree_deinit(&list->tmp_subscriptions);
- imapc_storage_client_unref(&list->client);
pool_unref(&list->list.pool);
}
{
struct imapc_storage *storage = (struct imapc_storage *)_storage;
+ /* make sure all pending commands are aborted before anything is
+ deinitialized */
+ imapc_client_disconnect(storage->client->client);
+
imapc_storage_client_unref(&storage->client);
index_storage_destroy(_storage);
}