/*
 *
 *  BlueZ - Bluetooth protocol stack for Linux
 *
 *  Copyright (C) 2004-2008  Marcel Holtmann <marcel@holtmann.org>
 *
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 *
 */

int set_nonblocking(int fd);

typedef void (*bt_io_callback_t) (GIOChannel *io, int err, const bdaddr_t *src,
		const bdaddr_t *dst, gpointer user_data);
typedef void (*bt_callback_t) (sdp_list_t *recs, int err, gpointer user_data);
typedef void (*bt_destroy_t) (gpointer user_data);

int bt_discover_services(const bdaddr_t *src, const bdaddr_t *dst,
		bt_callback_t cb, void *user_data, bt_destroy_t destroy);

int bt_search_service(const bdaddr_t *src, const bdaddr_t *dst,
			uuid_t *uuid, bt_callback_t cb, void *user_data,
			bt_destroy_t destroy);
int bt_cancel_discovery(const bdaddr_t *src, const bdaddr_t *dst);

gchar *bt_uuid2string(uuid_t *uuid);
int bt_string2uuid(uuid_t *uuid, const char *string);
gchar *bt_list2string(GSList *list);
GSList *bt_string2list(const gchar *str);

GIOChannel *bt_rfcomm_listen(const bdaddr_t *src, uint8_t channel,
			uint32_t flags, bt_io_callback_t cb, void *user_data);
GIOChannel *bt_rfcomm_listen_allocate(const bdaddr_t *src, uint8_t *channel,
			uint32_t flags, bt_io_callback_t cb, void *user_data);
int bt_rfcomm_connect(const bdaddr_t *src, const bdaddr_t *dst,
			uint8_t channel, bt_io_callback_t cb, void *user_data);

GIOChannel *bt_l2cap_listen(const bdaddr_t *src, uint16_t psm, uint16_t mtu,
			uint32_t flags, bt_io_callback_t cb, void *user_data);
int bt_l2cap_connect(const bdaddr_t *src, const bdaddr_t *dst,
			uint16_t psm, uint16_t mtu, bt_io_callback_t cb,
			void *user_data);
int bt_sco_connect(const bdaddr_t *src, const bdaddr_t *dst,
			bt_io_callback_t cb, void *user_data);

/* Experiemental bt_io API */

typedef struct bt_io BtIO;

typedef enum {
	BT_IO_AUTO,
	BT_IO_L2CAP,
	BT_IO_RFCOMM,
	BT_IO_SCO,
} BtIOTransport;

typedef enum {
	BT_IO_SUCCESS,
	BT_IO_FAILED,
} BtIOError;

typedef void (*BtIOFunc) (BtIO *io, BtIOError err, GIOChannel *chan,
				gpointer user_data);

BtIO *bt_io_create(BtIOTransport type, gpointer user_data, GDestroyNotify notify);
BtIO *bt_io_ref(BtIO *io);
void bt_io_unref(BtIO *io);
gboolean bt_io_set_source(BtIO *io, const char *address);
const char *bt_io_get_source(BtIO *io);
gboolean bt_io_set_destination(BtIO *io, const char *address);
const char *bt_io_get_destination(BtIO *io);
gboolean bt_io_set_flags(BtIO *io, guint32 flags);
guint32 bt_io_get_flags(BtIO *io);
gboolean bt_io_set_channel(BtIO *io, guint8 channel);
guint8 bt_io_get_channel(BtIO *io);
gboolean bt_io_set_psm(BtIO *io, guint16 psm);
guint16 bt_io_get_psm(BtIO *io);
gboolean bt_io_set_mtu(BtIO *io, guint16 mtu);
guint16 bt_io_get_mtu(BtIO *io);
BtIOError bt_io_connect(BtIO *io, const char *uuid, BtIOFunc func);
BtIOError bt_io_listen(BtIO *io, const char *uuid, BtIOFunc func);
BtIOError bt_io_shutdown(BtIO *io);
