bt_gatt_server_unref(device->server);
device->server = NULL;
+
+ btd_gatt_database_att_disconnected(
+ btd_adapter_get_database(device->adapter), device);
}
static void attio_cleanup(struct btd_device *device)
}
static struct device_state *
-find_device_state(struct btd_gatt_database *database, bdaddr_t *bdaddr,
+find_device_state(struct btd_gatt_database *database, const bdaddr_t *bdaddr,
uint8_t bdaddr_type)
{
struct device_info dev_info;
#else
GIOChannel *io = NULL;
GError *gerr = NULL;
+ int fd;
- io = g_io_channel_unix_new(bt_att_get_fd(att));
+ fd = bt_att_get_fd(att);
+ if (fd < 0)
+ return false;
+
+ io = g_io_channel_unix_new(fd);
if (!io)
return false;
state->pending = NULL;
}
+void btd_gatt_database_att_disconnected(struct btd_gatt_database *database,
+ struct btd_device *device)
+{
+ struct device_state *state;
+ const bdaddr_t *addr;
+ uint8_t type;
+
+ DBG("");
+
+ addr = device_get_address(device);
+ type = btd_device_get_bdaddr_type(device);
+
+ state = find_device_state(database, addr, type);
+ if (!state)
+ return;
+
+ att_disconnected(0, state);
+}
+
static void restore_ccc(struct btd_gatt_database *database,
const bdaddr_t *addr, uint8_t addr_type, uint16_t value)
{
struct gatt_db *btd_gatt_database_get_db(struct btd_gatt_database *database);
void btd_gatt_database_att_connected(struct btd_gatt_database *database,
struct bt_att *att);
+void btd_gatt_database_att_disconnected(struct btd_gatt_database *database,
+ struct btd_device *device);
void btd_gatt_database_restore_svc_chng_ccc(struct btd_gatt_database *database);