diff --git a/src/adapter.c b/src/adapter.c
index 25875de..b38c813 100644
--- a/src/adapter.c
+++ b/src/adapter.c
static GSList *adapter_drivers = NULL;
+static GSList *disconnect_list = NULL;
+
struct link_key_info {
bdaddr_t bdaddr;
unsigned char key[16];
return 0;
}
+static void disconnect_notify(struct btd_device *dev, uint8_t reason)
+{
+ GSList *l;
+
+ for (l = disconnect_list; l; l = g_slist_next(l)) {
+ btd_disconnect_cb disconnect_cb = l->data;
+ disconnect_cb(dev, reason);
+ }
+}
+
static void dev_disconnected(struct btd_adapter *adapter,
const struct mgmt_addr_info *addr,
uint8_t reason)
DBG("Device %s disconnected, reason %u", dst, reason);
device = btd_adapter_find_device(adapter, &addr->bdaddr, addr->type);
- if (device)
+ if (device) {
adapter_remove_connection(adapter, device, addr->type);
+ disconnect_notify(device, reason);
+ }
bonding_attempt_complete(adapter, &addr->bdaddr, addr->type,
MGMT_STATUS_DISCONNECTED);
}
+void btd_add_disconnect_cb(btd_disconnect_cb func)
+{
+ disconnect_list = g_slist_append(disconnect_list, func);
+}
+
+void btd_remove_disconnect_cb(btd_disconnect_cb func)
+{
+ disconnect_list = g_slist_remove(disconnect_list, func);
+}
+
static void disconnect_complete(uint8_t status, uint16_t length,
const void *param, void *user_data)
{
diff --git a/src/adapter.h b/src/adapter.h
index 49eca11..8895197 100644
--- a/src/adapter.h
+++ b/src/adapter.h
void adapter_cleanup(void);
void adapter_shutdown(void);
+typedef void (*btd_disconnect_cb) (struct btd_device *device, uint8_t reason);
+void btd_add_disconnect_cb(btd_disconnect_cb func);
+void btd_remove_disconnect_cb(btd_disconnect_cb func);
+
struct btd_adapter *adapter_find(const bdaddr_t *sba);
struct btd_adapter *adapter_find_by_id(int id);
void adapter_foreach(adapter_cb func, gpointer user_data);