/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
 *
 *  BlueZ - Bluetooth protocol stack for Linux
 *
 *  Copyright (C) 2010 GSyC/LibreSoft, Universidad Rey Juan Carlos.
 *
 */

#ifndef __HDP_TYPES_H__
#define __HDP_TYPES_H__

#define MANAGER_PATH		"/org/bluez"

#define HEALTH_MANAGER		"org.bluez.HealthManager1"
#define HEALTH_DEVICE		"org.bluez.HealthDevice1"
#define HEALTH_CHANNEL		"org.bluez.HealthChannel1"

#define HDP_VERSION		0x0100

#define HDP_SERVICE_NAME	"Bluez HDP"
#define HDP_SERVICE_DSC		"A Bluez health device profile implementation"
#define HDP_SERVICE_PROVIDER	"Bluez"

#define HDP_MDEP_ECHO		0x00
#define HDP_MDEP_INITIAL	0x01
#define HDP_MDEP_FINAL		0x7F

#define HDP_ERROR		g_quark_from_static_string("hdp-error-quark")

#define HDP_NO_PREFERENCE_DC	0x00
#define HDP_RELIABLE_DC		0x01
#define HDP_STREAMING_DC	0x02

#define HDP_SINK_ROLE_AS_STRING		"sink"
#define HDP_SOURCE_ROLE_AS_STRING	"source"

typedef enum {
	HDP_SOURCE = 0x00,
	HDP_SINK = 0x01
} HdpRole;

typedef enum {
	HDP_DIC_PARSE_ERROR,
	HDP_DIC_ENTRY_PARSE_ERROR,
	HDP_CONNECTION_ERROR,
	HDP_UNSPECIFIED_ERROR,
	HDP_UNKNOWN_ERROR
} HdpError;

enum data_specs {
	DATA_EXCHANGE_SPEC_11073 = 0x01
};

struct hdp_application {
	char			*path;		/* The path of the application */
	uint16_t		data_type;	/* Data type handled for this application */
	gboolean		data_type_set;	/* Flag for dictionary parsing */
	uint8_t			role;		/* Role of this application */
	gboolean		role_set;	/* Flag for dictionary parsing */
	uint8_t			chan_type;	/* QoS preferred by source applications */
	gboolean		chan_type_set;	/* Flag for dictionary parsing */
	char			*description;	/* Options description for SDP record */
	uint8_t			id;		/* The identification is also the mdepid */
	char			*oname;		/* Name of the owner application */
	guint			dbus_watcher;	/* Watch for clients disconnection */
	int			ref;		/* Reference counter */
};

struct hdp_adapter {
	struct btd_adapter	*btd_adapter;	/* Bluetooth adapter */
	struct mcap_instance	*mi;		/* Mcap instance in */
	uint16_t		ccpsm;		/* Control channel psm */
	uint16_t		dcpsm;		/* Data channel psm */
	uint32_t		sdp_handler;	/* SDP record handler */
	uint32_t		record_state;	/* Service record state */
};

struct hdp_device {
	struct btd_device	*dev;		/* Device reference */
	struct hdp_adapter	*hdp_adapter;	/* hdp_adapater */
	struct mcap_mcl		*mcl;		/* The mcap control channel */
	gboolean		mcl_conn;	/* Mcl status */
	gboolean		sdp_present;	/* Has an sdp record */
	GSList			*channels;	/* Data Channel list */
	struct hdp_channel	*ndc;		/* Data channel being negotiated */
	struct hdp_channel	*fr;		/* First reliable data channel */
	int			ref;		/* Reference counting */
};

struct hdp_echo_data;

struct hdp_channel {
	struct hdp_device	*dev;		/* Device where this channel belongs */
	struct hdp_application	*app;		/* Application */
	struct mcap_mdl		*mdl;		/* The data channel reference */
	char			*path;		/* The path of the channel */
	uint8_t			config;		/* Channel configuration */
	uint8_t			mdep;		/* Remote MDEP */
	uint16_t		mdlid;		/* Data channel Id */
	uint16_t		imtu;		/* Channel incoming MTU */
	uint16_t		omtu;		/* Channel outgoing MTU */
	struct hdp_echo_data	*edata;		/* private data used by echo channels */
	int			ref;		/* Reference counter */
};

#endif /* __HDP_TYPES_H__ */
