/* Copyright (c) 2013 The Chromium Authors. All rights reserved.
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#ifndef CRAS_BT_TRANSPORT_H_
#define CRAS_BT_TRANSPORT_H_

#include <dbus/dbus.h>
#include <stdint.h>

#include "cras_bt_device.h"

struct cras_bt_endpoint;
struct cras_bt_transport;

enum cras_bt_transport_state {
	CRAS_BT_TRANSPORT_STATE_IDLE,
	CRAS_BT_TRANSPORT_STATE_PENDING,
	CRAS_BT_TRANSPORT_STATE_ACTIVE
};


struct cras_bt_transport *cras_bt_transport_create(DBusConnection *conn,
						   const char *object_path);
void cras_bt_transport_set_endpoint(struct cras_bt_transport *transport,
				    struct cras_bt_endpoint *endpoint);
void cras_bt_transport_destroy(struct cras_bt_transport *transport);
void cras_bt_transport_reset();

struct cras_bt_transport *cras_bt_transport_get(const char *object_path);
size_t cras_bt_transport_get_list(
	struct cras_bt_transport ***transport_list_out);

const char *cras_bt_transport_object_path(
	const struct cras_bt_transport *transport);
struct cras_bt_device *cras_bt_transport_device(
	const struct cras_bt_transport *transport);
enum cras_bt_device_profile cras_bt_transport_profile(
	const struct cras_bt_transport *transport);
int cras_bt_transport_configuration(const struct cras_bt_transport *transport,
				    void *configuration, int len);
enum cras_bt_transport_state cras_bt_transport_state(
	const struct cras_bt_transport *transport);

int cras_bt_transport_fd(const struct cras_bt_transport *transport);
uint16_t cras_bt_transport_write_mtu(const struct cras_bt_transport *transport);

void cras_bt_transport_update_properties(
	struct cras_bt_transport *transport,
	DBusMessageIter *properties_array_iter,
	DBusMessageIter *invalidated_array_iter);

int cras_bt_transport_try_acquire(struct cras_bt_transport *transport);
int cras_bt_transport_acquire(struct cras_bt_transport *transport);

/* Releases the cras_bt_transport.
 * Args:
 *    transport - The transport object to release
 *    blocking - True to send release dbus message in blocking mode, otherwise
 *        in non-block mode.
 */
int cras_bt_transport_release(struct cras_bt_transport *transport,
			      unsigned int blocking);

/* Sets the volume to cras_bt_transport. Note that the volume gets applied
 * to BT headset only when the transport is in ACTIVE state.
 * Args:
 *    transport - The transport object to set volume to.
 *    volume - The desired volume value, range in [0-127].
 */
int cras_bt_transport_set_volume(struct cras_bt_transport *transport,
				 uint16_t volume);

#endif /* CRAS_BT_TRANSPORT_H_ */