diff --git a/src/attio.h b/src/attio.h
index 7935dcd..16e2873 100644
--- a/src/attio.h
+++ b/src/attio.h
*/
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 b3c7384..52659ac 100644
--- a/src/device.c
+++ b/src/device.c
struct attio_data {
guint id;
- attio_connect_cb func;
+ attio_connect_cb cfunc;
+ attio_disconnect_cb dcfunc;
gpointer user_data;
};
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;
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);
}
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;
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;
}