static void cancel_desc_ops(void *data, void *user_data) { struct descriptor *desc = data; struct bt_gatt_client *gatt = user_data; if (desc->read_id) { bt_gatt_client_cancel(gatt, desc->read_id); desc->read_id = 0; } if (desc->write_id) { bt_gatt_client_cancel(gatt, desc->write_id); desc->write_id = 0; } }
static void cancel_chrc_ops(void *data, void *user_data) { struct characteristic *chrc = data; struct bt_gatt_client *gatt = user_data; if (chrc->read_id) { bt_gatt_client_cancel(gatt, chrc->read_id); chrc->read_id = 0; } if (chrc->write_id) { bt_gatt_client_cancel(gatt, chrc->write_id); chrc->write_id = 0; } queue_foreach(chrc->descs, cancel_desc_ops, user_data); }
static void unregister_descriptor(void *data) { struct descriptor *desc = data; struct bt_gatt_client *gatt = desc->chrc->service->client->gatt; DBG("Removing GATT descriptor: %s", desc->path); if (desc->read_id) bt_gatt_client_cancel(gatt, desc->read_id); if (desc->write_id) bt_gatt_client_cancel(gatt, desc->write_id); desc->chrc = NULL; g_dbus_unregister_interface(btd_get_dbus_connection(), desc->path, GATT_DESCRIPTOR_IFACE); }
static void unregister_characteristic(void *data) { struct characteristic *chrc = data; struct bt_gatt_client *gatt = chrc->service->client->gatt; DBG("Removing GATT characteristic: %s", chrc->path); if (chrc->read_id) bt_gatt_client_cancel(gatt, chrc->read_id); if (chrc->write_id) bt_gatt_client_cancel(gatt, chrc->write_id); queue_remove_all(chrc->descs, NULL, NULL, unregister_descriptor); g_dbus_unregister_interface(btd_get_dbus_connection(), chrc->path, GATT_CHARACTERISTIC_IFACE); }
static void cmd_write_execute(struct client *cli, char *cmd_str) { char *argvbuf[516]; char **argv = argvbuf; int argc = 0; char *endptr = NULL; unsigned int session_id; bool execute; if (!bt_gatt_client_is_ready(cli->gatt)) { printf("GATT client not initialized\n"); return; } if (!parse_args(cmd_str, 514, argv, &argc)) { printf("Too many arguments\n"); write_value_usage(); return; } if (argc < 2) { write_execute_usage(); return; } session_id = strtol(argv[0], &endptr, 0); if (!endptr || *endptr != '\0') { printf("Invalid session id: %s\n", argv[0]); return; } if (session_id != cli->reliable_session_id) { printf("Invalid session id: %u != %u\n", session_id, cli->reliable_session_id); return; } execute = !!strtol(argv[1], &endptr, 0); if (!endptr || *endptr != '\0') { printf("Invalid execute: %s\n", argv[1]); return; } if (execute) { if (!bt_gatt_client_write_execute(cli->gatt, session_id, write_cb, NULL, NULL)) printf("Failed to proceed write execute\n"); } else { bt_gatt_client_cancel(cli->gatt, session_id); } cli->reliable_session_id = 0; }