From ed57f0d28a559ba462a753af57b59f80cc9f4f3d Mon Sep 17 00:00:00 2001 From: Claudio Takahasi Date: Wed, 6 Jul 2011 18:23:25 -0300 Subject: [PATCH] Add ATT disconnect callback --- src/attio.h | 4 +++- src/device.c | 36 +++++++++++++++++++++++++++++++----- 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/src/attio.h b/src/attio.h index 7935dcdcc..16e28732b 100644 --- a/src/attio.h +++ b/src/attio.h @@ -23,9 +23,11 @@ */ 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 func, + attio_connect_cb cfunc, + attio_disconnect_cb dcfunc, gpointer user_data); gboolean btd_device_remove_attio_callback(struct btd_device *device, guint id); diff --git a/src/device.c b/src/device.c index b3c7384f4..52659ac60 100644 --- a/src/device.c +++ b/src/device.c @@ -108,7 +108,8 @@ struct browse_req { struct attio_data { guint id; - attio_connect_cb func; + attio_connect_cb cfunc; + attio_disconnect_cb dcfunc; gpointer user_data; }; @@ -1582,6 +1583,23 @@ static void store_services(struct btd_device *device) g_free(str); } +static void attio_disconnected(gpointer data, gpointer user_data) +{ + struct attio_data *attio = data; + + if (attio->dcfunc) + attio->dcfunc(attio->user_data); +} + +static void attrib_destroyed(gpointer user_data) +{ + struct btd_device *device = user_data; + + device->attrib = NULL; + + g_slist_foreach(device->attios, attio_disconnected, NULL); +} + static void primary_cb(GSList *services, guint8 status, gpointer user_data) { struct browse_req *req = user_data; @@ -1610,6 +1628,12 @@ static void primary_cb(GSList *services, guint8 status, gpointer user_data) g_slist_free(uuids); + if (device->attios) { + device->attrib = g_attrib_ref(req->attrib); + g_attrib_set_destroy_function(device->attrib, attrib_destroyed, + device); + } + create_device_reply(device, req); store_services(device); @@ -2459,7 +2483,8 @@ void device_set_class(struct btd_device *device, uint32_t value) } guint btd_device_add_attio_callback(struct btd_device *device, - attio_connect_cb func, + attio_connect_cb cfunc, + attio_disconnect_cb dcfunc, gpointer user_data) { struct attio_data *attio; @@ -2469,13 +2494,14 @@ guint btd_device_add_attio_callback(struct btd_device *device, attio = g_new0(struct attio_data, 1); attio->id = ++attio_id; - attio->func = func; + attio->cfunc = cfunc; + attio->dcfunc = dcfunc; attio->user_data = user_data; device->attios = g_slist_append(device->attios, attio); - if (device->attrib && func) - func(device->attrib, user_data); + if (device->attrib && cfunc) + cfunc(device->attrib, user_data); return attio->id; } -- 2.47.3