// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include <stdlib.h>

#include <block-client/client.h>
#include <block-client/cpp/client.h>
#include <fbl/macros.h>
#include <lib/zx/fifo.h>
#include <zircon/assert.h>
#include <zircon/device/block.h>
#include <zircon/types.h>

namespace block_client {

Client::Client() : client_(nullptr) {}
Client::Client(fifo_client_t* client) : client_(client) {}
Client::Client(Client&& other) : client_(other.Release()) {}

Client& Client::operator=(Client&& other) {
    Reset(other.Release());
    return *this;
}

Client::~Client() {
    Reset();
}

zx_status_t Client::Create(zx::fifo fifo, Client* out) {
    fifo_client_t* client;
    zx_status_t status = block_fifo_create_client(fifo.release(), &client);
    if (status != ZX_OK) {
        return status;
    }
    *out = Client(client);
    return ZX_OK;
}

zx_status_t Client::Transaction(block_fifo_request_t* requests, size_t count) const {
    ZX_DEBUG_ASSERT(client_ != nullptr);
    return block_fifo_txn(client_, requests, count);
}

void Client::Reset(fifo_client_t* client) {
    if (client_ != nullptr) {
        block_fifo_release_client(client_);
    }
    client_ = client;
}

fifo_client_t* Client::Release() {
    fifo_client_t* client = client_;
    client_ = nullptr;
    return client;
}

}  // namespace block_client
