diff --git a/attrib/client.c b/attrib/client.c
index c0e00c1..143c06b 100644
--- a/attrib/client.c
+++ b/attrib/client.c
struct query {
DBusMessage *msg;
- guint attioid;
GSList *list;
};
g_free(gatt);
}
+static void remove_attio(struct gatt_service *gatt)
+{
+ if (gatt->offline_chars || gatt->watchers || gatt->query)
+ return;
+
+ if (gatt->attioid) {
+ btd_device_remove_attio_callback(gatt->dev, gatt->attioid);
+ gatt->attioid = 0;
+ }
+
+ if (gatt->attrib) {
+ g_attrib_unref(gatt->attrib);
+ gatt->attrib = NULL;
+ }
+}
+
static void gatt_get_address(struct gatt_service *gatt,
bdaddr_t *sba, bdaddr_t *dba)
{
gatt->offline_chars = g_slist_remove(gatt->offline_chars, chr);
- if (gatt->offline_chars || gatt->watchers)
- return;
-
- btd_device_remove_attio_callback(gatt->dev, gatt->attioid);
- gatt->attioid = 0;
+ remove_attio(gatt);
}
static void offline_char_write(gpointer data, gpointer user_data)
gatt->watchers = g_slist_remove(gatt->watchers, watcher);
watcher_free(watcher);
- if (gatt->watchers == NULL && gatt->attioid) {
- btd_device_remove_attio_callback(gatt->dev, gatt->attioid);
- gatt->attioid = 0;
- }
+ remove_attio(gatt);
return dbus_message_new_method_return(msg);
}
if (query->list != NULL)
return;
- btd_device_remove_attio_callback(gatt->dev, query->attioid);
g_free(query);
-
gatt->query = NULL;
+
+ remove_attio(gatt);
}
static void update_char_desc(guint8 status, const guint8 *pdu, guint16 len,
qchr->gatt = gatt;
query->msg = dbus_message_ref(msg);
- query->attioid = btd_device_add_attio_callback(gatt->dev,
+
+ gatt->attioid = btd_device_add_attio_callback(gatt->dev,
send_discover,
cancel_discover,
qchr);
{
GSList *l;
- if (gatt->attioid)
- btd_device_remove_attio_callback(gatt->dev, gatt->attioid);
-
for (l = gatt->chars; l; l = l->next) {
struct characteristic *chr = l->data;
g_dbus_unregister_interface(gatt->conn, chr->path,
}
g_dbus_unregister_interface(gatt->conn, gatt->path, CHAR_INTERFACE);
+
+ remove_attio(gatt);
}
static int path_cmp(gconstpointer data, gconstpointer user_data)