mirror of
https://git.kernel.org/pub/scm/bluetooth/bluez.git
synced 2024-11-27 14:14:32 +08:00
core: Remove attio callbacks
This commit is contained in:
parent
7d9718cfcc
commit
82666b345e
@ -185,7 +185,7 @@ src_bluetoothd_SOURCES = $(builtin_sources) \
|
||||
src/profile.h src/profile.c \
|
||||
src/service.h src/service.c \
|
||||
src/gatt-client.h src/gatt-client.c \
|
||||
src/device.h src/device.c src/attio.h \
|
||||
src/device.h src/device.c \
|
||||
src/dbus-common.c src/dbus-common.h \
|
||||
src/eir.h src/eir.c
|
||||
src_bluetoothd_LDADD = lib/libbluetooth-internal.la \
|
||||
|
@ -54,7 +54,6 @@
|
||||
#include "suspend.h"
|
||||
#include "attrib/att.h"
|
||||
#include "attrib/gattrib.h"
|
||||
#include "src/attio.h"
|
||||
#include "attrib/gatt.h"
|
||||
#include "hog-lib.h"
|
||||
|
||||
|
33
src/attio.h
33
src/attio.h
@ -1,33 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* BlueZ - Bluetooth protocol stack for Linux
|
||||
*
|
||||
* Copyright (C) 2011 Nokia Corporation
|
||||
* Copyright (C) 2011 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
|
||||
*
|
||||
*/
|
||||
|
||||
typedef void (*attio_connect_cb) (GAttrib *attrib, gpointer user_data);
|
||||
typedef void (*attio_disconnect_cb) (gpointer user_data);
|
||||
|
||||
guint btd_device_add_attio_callback(struct btd_device *device,
|
||||
attio_connect_cb cfunc,
|
||||
attio_disconnect_cb dcfunc,
|
||||
gpointer user_data);
|
||||
|
||||
gboolean btd_device_remove_attio_callback(struct btd_device *device, guint id);
|
201
src/device.c
201
src/device.c
@ -60,7 +60,6 @@
|
||||
#include "adapter.h"
|
||||
#include "gatt-database.h"
|
||||
#include "attrib/gattrib.h"
|
||||
#include "attio.h"
|
||||
#include "device.h"
|
||||
#include "gatt-client.h"
|
||||
#include "profile.h"
|
||||
@ -150,13 +149,6 @@ struct included_search {
|
||||
GSList *current;
|
||||
};
|
||||
|
||||
struct attio_data {
|
||||
guint id;
|
||||
attio_connect_cb cfunc;
|
||||
attio_disconnect_cb dcfunc;
|
||||
gpointer user_data;
|
||||
};
|
||||
|
||||
struct svc_callback {
|
||||
unsigned int id;
|
||||
guint idle_id;
|
||||
@ -165,15 +157,6 @@ struct svc_callback {
|
||||
void *user_data;
|
||||
};
|
||||
|
||||
typedef void (*attio_error_cb) (const GError *gerr, gpointer user_data);
|
||||
typedef void (*attio_success_cb) (gpointer user_data);
|
||||
|
||||
struct att_callbacks {
|
||||
attio_error_cb err; /* Callback for error */
|
||||
attio_success_cb success; /* Callback for success */
|
||||
gpointer user_data;
|
||||
};
|
||||
|
||||
/* Per-bearer (LE or BR/EDR) device state */
|
||||
struct bearer_state {
|
||||
bool paired;
|
||||
@ -225,8 +208,6 @@ struct btd_device {
|
||||
DBusMessage *connect; /* connect message */
|
||||
DBusMessage *disconnect; /* disconnect message */
|
||||
GAttrib *attrib;
|
||||
GSList *attios;
|
||||
GSList *attios_offline;
|
||||
|
||||
struct bt_att *att; /* The new ATT transport */
|
||||
uint16_t att_mtu; /* The ATT MTU */
|
||||
@ -621,8 +602,6 @@ static void device_free(gpointer user_data)
|
||||
|
||||
g_slist_free_full(device->uuids, g_free);
|
||||
g_slist_free_full(device->primaries, g_free);
|
||||
g_slist_free_full(device->attios, g_free);
|
||||
g_slist_free_full(device->attios_offline, g_free);
|
||||
g_slist_free_full(device->svc_callbacks, svc_dev_remove);
|
||||
|
||||
/* Reset callbacks since the device is going to be freed */
|
||||
@ -4543,27 +4522,6 @@ static bool device_get_auto_connect(struct btd_device *device)
|
||||
return device->auto_connect;
|
||||
}
|
||||
|
||||
static void attio_connected(gpointer data, gpointer user_data)
|
||||
{
|
||||
struct attio_data *attio = data;
|
||||
GAttrib *attrib = user_data;
|
||||
|
||||
DBG("");
|
||||
|
||||
if (attio->cfunc)
|
||||
attio->cfunc(attrib, attio->user_data);
|
||||
}
|
||||
|
||||
static void attio_disconnected(gpointer data, gpointer user_data)
|
||||
{
|
||||
struct attio_data *attio = data;
|
||||
|
||||
DBG("");
|
||||
|
||||
if (attio->dcfunc)
|
||||
attio->dcfunc(attio->user_data);
|
||||
}
|
||||
|
||||
static void disconnect_gatt_service(gpointer data, gpointer user_data)
|
||||
{
|
||||
struct btd_service *service = data;
|
||||
@ -4587,7 +4545,6 @@ static void att_disconnected_cb(int err, void *user_data)
|
||||
|
||||
DBG("%s (%d)", strerror(err), err);
|
||||
|
||||
g_slist_foreach(device->attios, attio_disconnected, NULL);
|
||||
g_slist_foreach(device->services, disconnect_gatt_service, NULL);
|
||||
|
||||
btd_gatt_client_disconnected(device->client_dbus);
|
||||
@ -4684,9 +4641,6 @@ static void gatt_client_init(struct btd_device *device)
|
||||
|
||||
bt_gatt_client_set_debug(device->client, gatt_debug, NULL, NULL);
|
||||
|
||||
/* Notify attio so it can react to notifications */
|
||||
g_slist_foreach(device->attios, attio_connected, device->attrib);
|
||||
|
||||
/*
|
||||
* Notify notify existing service about the new connection so they can
|
||||
* react to notifications while discovering services
|
||||
@ -4841,8 +4795,7 @@ bool device_attach_att(struct btd_device *dev, GIOChannel *io)
|
||||
|
||||
static void att_connect_cb(GIOChannel *io, GError *gerr, gpointer user_data)
|
||||
{
|
||||
struct att_callbacks *attcb = user_data;
|
||||
struct btd_device *device = attcb->user_data;
|
||||
struct btd_device *device = user_data;
|
||||
DBusMessage *reply;
|
||||
uint8_t io_cap;
|
||||
int err = 0;
|
||||
@ -4853,8 +4806,20 @@ static void att_connect_cb(GIOChannel *io, GError *gerr, gpointer user_data)
|
||||
if (gerr) {
|
||||
DBG("%s", gerr->message);
|
||||
|
||||
if (attcb->err)
|
||||
attcb->err(gerr, user_data);
|
||||
if (g_error_matches(gerr, BT_IO_ERROR, ECONNABORTED))
|
||||
goto done;
|
||||
|
||||
if (device_get_auto_connect(device)) {
|
||||
DBG("Enabling automatic connections");
|
||||
adapter_connect_list_add(device->adapter, device);
|
||||
}
|
||||
|
||||
if (device->browse) {
|
||||
browse_request_complete(device->browse,
|
||||
device->bdaddr_type,
|
||||
-ECONNABORTED);
|
||||
device->browse = NULL;
|
||||
}
|
||||
|
||||
err = -ECONNABORTED;
|
||||
goto done;
|
||||
@ -4863,9 +4828,6 @@ static void att_connect_cb(GIOChannel *io, GError *gerr, gpointer user_data)
|
||||
if (!device_attach_att(device, io))
|
||||
goto done;
|
||||
|
||||
if (attcb->success)
|
||||
attcb->success(user_data);
|
||||
|
||||
if (!device->bonding)
|
||||
goto done;
|
||||
|
||||
@ -4898,28 +4860,11 @@ done:
|
||||
dbus_message_unref(device->connect);
|
||||
device->connect = NULL;
|
||||
}
|
||||
|
||||
g_free(attcb);
|
||||
}
|
||||
|
||||
static void att_error_cb(const GError *gerr, gpointer user_data)
|
||||
{
|
||||
struct att_callbacks *attcb = user_data;
|
||||
struct btd_device *device = attcb->user_data;
|
||||
|
||||
if (g_error_matches(gerr, BT_IO_ERROR, ECONNABORTED))
|
||||
return;
|
||||
|
||||
if (device_get_auto_connect(device)) {
|
||||
DBG("Enabling automatic connections");
|
||||
adapter_connect_list_add(device->adapter, device);
|
||||
}
|
||||
}
|
||||
|
||||
int device_connect_le(struct btd_device *dev)
|
||||
{
|
||||
struct btd_adapter *adapter = dev->adapter;
|
||||
struct att_callbacks *attcb;
|
||||
BtIOSecLevel sec_level;
|
||||
GIOChannel *io;
|
||||
GError *gerr = NULL;
|
||||
@ -4933,10 +4878,6 @@ int device_connect_le(struct btd_device *dev)
|
||||
|
||||
DBG("Connection attempt to: %s", addr);
|
||||
|
||||
attcb = g_new0(struct att_callbacks, 1);
|
||||
attcb->err = att_error_cb;
|
||||
attcb->user_data = dev;
|
||||
|
||||
if (dev->le_state.paired)
|
||||
sec_level = BT_IO_SEC_MEDIUM;
|
||||
else
|
||||
@ -4946,7 +4887,7 @@ int device_connect_le(struct btd_device *dev)
|
||||
* This connection will help us catch any PDUs that comes before
|
||||
* pairing finishes
|
||||
*/
|
||||
io = bt_io_connect(att_connect_cb, attcb, NULL, &gerr,
|
||||
io = bt_io_connect(att_connect_cb, dev, NULL, &gerr,
|
||||
BT_IO_OPT_SOURCE_BDADDR,
|
||||
btd_adapter_get_address(adapter),
|
||||
BT_IO_OPT_SOURCE_TYPE, BDADDR_LE_PUBLIC,
|
||||
@ -4968,7 +4909,6 @@ int device_connect_le(struct btd_device *dev)
|
||||
|
||||
error("ATT bt_io_connect(%s): %s", addr, gerr->message);
|
||||
g_error_free(gerr);
|
||||
g_free(attcb);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
@ -4978,21 +4918,6 @@ int device_connect_le(struct btd_device *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void att_browse_error_cb(const GError *gerr, gpointer user_data)
|
||||
{
|
||||
struct att_callbacks *attcb = user_data;
|
||||
struct btd_device *device = attcb->user_data;
|
||||
struct browse_req *req = device->browse;
|
||||
|
||||
device->browse = NULL;
|
||||
browse_request_complete(req, device->bdaddr_type, -ECONNABORTED);
|
||||
}
|
||||
|
||||
static void att_browse_cb(gpointer user_data)
|
||||
{
|
||||
DBG("ATT connection successful");
|
||||
}
|
||||
|
||||
static struct browse_req *browse_request_new(struct btd_device *device,
|
||||
DBusMessage *msg)
|
||||
{
|
||||
@ -5026,7 +4951,6 @@ static struct browse_req *browse_request_new(struct btd_device *device,
|
||||
static int device_browse_gatt(struct btd_device *device, DBusMessage *msg)
|
||||
{
|
||||
struct btd_adapter *adapter = device->adapter;
|
||||
struct att_callbacks *attcb;
|
||||
struct browse_req *req;
|
||||
|
||||
req = browse_request_new(device, msg);
|
||||
@ -5049,13 +4973,8 @@ static int device_browse_gatt(struct btd_device *device, DBusMessage *msg)
|
||||
return 0;
|
||||
}
|
||||
|
||||
attcb = g_new0(struct att_callbacks, 1);
|
||||
attcb->err = att_browse_error_cb;
|
||||
attcb->success = att_browse_cb;
|
||||
attcb->user_data = device;
|
||||
|
||||
device->att_io = bt_io_connect(att_connect_cb,
|
||||
attcb, NULL, NULL,
|
||||
device, NULL, NULL,
|
||||
BT_IO_OPT_SOURCE_BDADDR,
|
||||
btd_adapter_get_address(adapter),
|
||||
BT_IO_OPT_SOURCE_TYPE, BDADDR_LE_PUBLIC,
|
||||
@ -5068,7 +4987,6 @@ static int device_browse_gatt(struct btd_device *device, DBusMessage *msg)
|
||||
if (device->att_io == NULL) {
|
||||
device->browse = NULL;
|
||||
browse_request_free(req);
|
||||
g_free(attcb);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
@ -6082,91 +6000,6 @@ void device_set_appearance(struct btd_device *device, uint16_t value)
|
||||
store_device_info(device);
|
||||
}
|
||||
|
||||
static gboolean notify_attios(gpointer user_data)
|
||||
{
|
||||
struct btd_device *device = user_data;
|
||||
|
||||
DBG("");
|
||||
|
||||
if (device->attrib == NULL)
|
||||
return FALSE;
|
||||
|
||||
g_slist_foreach(device->attios_offline, attio_connected, device->attrib);
|
||||
device->attios = g_slist_concat(device->attios, device->attios_offline);
|
||||
device->attios_offline = NULL;
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
guint btd_device_add_attio_callback(struct btd_device *device,
|
||||
attio_connect_cb cfunc,
|
||||
attio_disconnect_cb dcfunc,
|
||||
gpointer user_data)
|
||||
{
|
||||
struct attio_data *attio;
|
||||
static guint attio_id = 0;
|
||||
|
||||
DBG("%p registered ATT connection callback", device);
|
||||
|
||||
attio = g_new0(struct attio_data, 1);
|
||||
attio->id = ++attio_id;
|
||||
attio->cfunc = cfunc;
|
||||
attio->dcfunc = dcfunc;
|
||||
attio->user_data = user_data;
|
||||
|
||||
device_set_auto_connect(device, TRUE);
|
||||
|
||||
/* Check if there is no GAttrib associated to the device created by a
|
||||
* incoming connection */
|
||||
if (!device->attrib)
|
||||
device->attrib = attrib_from_device(device);
|
||||
|
||||
if (device->attrib && cfunc) {
|
||||
device->attios_offline = g_slist_append(device->attios_offline,
|
||||
attio);
|
||||
g_idle_add(notify_attios, device);
|
||||
return attio->id;
|
||||
}
|
||||
|
||||
device->attios = g_slist_append(device->attios, attio);
|
||||
|
||||
return attio->id;
|
||||
}
|
||||
|
||||
static int attio_id_cmp(gconstpointer a, gconstpointer b)
|
||||
{
|
||||
const struct attio_data *attio = a;
|
||||
guint id = GPOINTER_TO_UINT(b);
|
||||
|
||||
return attio->id - id;
|
||||
}
|
||||
|
||||
gboolean btd_device_remove_attio_callback(struct btd_device *device, guint id)
|
||||
{
|
||||
struct attio_data *attio;
|
||||
GSList *l;
|
||||
|
||||
l = g_slist_find_custom(device->attios, GUINT_TO_POINTER(id),
|
||||
attio_id_cmp);
|
||||
if (l) {
|
||||
attio = l->data;
|
||||
device->attios = g_slist_remove(device->attios, attio);
|
||||
} else {
|
||||
l = g_slist_find_custom(device->attios_offline,
|
||||
GUINT_TO_POINTER(id), attio_id_cmp);
|
||||
if (!l)
|
||||
return FALSE;
|
||||
|
||||
attio = l->data;
|
||||
device->attios_offline = g_slist_remove(device->attios_offline,
|
||||
attio);
|
||||
}
|
||||
|
||||
g_free(attio);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void btd_device_set_pnpid(struct btd_device *device, uint16_t source,
|
||||
uint16_t vendor, uint16_t product, uint16_t version)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user