From 3a5e8fe9b2fc65d3be1d76a41044418dc4e79734 Mon Sep 17 00:00:00 2001 From: Jakub Tyszkowski Date: Wed, 4 Jun 2014 16:36:30 +0200 Subject: [PATCH] android: Add gatt CCC value storage Client Characteristic Configuration for Service Changed Characteristic should be stored for every bonded device, so we know if we should be sending value (range affected by changes) indication. --- android/bluetooth.c | 52 +++++++++++++++++++++++++++++++++++++++++++++ android/bluetooth.h | 4 ++++ 2 files changed, 56 insertions(+) diff --git a/android/bluetooth.c b/android/bluetooth.c index 8ee202582..36b073eff 100644 --- a/android/bluetooth.c +++ b/android/bluetooth.c @@ -158,6 +158,7 @@ struct device { bool valid_local_csrk; uint8_t local_csrk[16]; uint32_t local_sign_cnt; + uint16_t gatt_ccc; }; struct browse_req { @@ -645,6 +646,51 @@ static void mgmt_dev_class_changed_event(uint16_t index, uint16_t length, /* TODO: Gatt attrib set*/ } +void bt_store_gatt_ccc(const bdaddr_t *dst, uint16_t value) +{ + struct device *dev; + GKeyFile *key_file; + gsize length = 0; + char addr[18]; + char *data; + + dev = find_device(dst); + if (!dev) + return; + + key_file = g_key_file_new(); + + if (!g_key_file_load_from_file(key_file, DEVICES_FILE, 0, NULL)) { + g_key_file_free(key_file); + return; + } + + ba2str(dst, addr); + + DBG("%s Gatt CCC %d", addr, value); + + g_key_file_set_integer(key_file, addr, "GattCCC", value); + + data = g_key_file_to_data(key_file, &length, NULL); + g_file_set_contents(DEVICES_FILE, data, length, NULL); + g_free(data); + + g_key_file_free(key_file); + + dev->gatt_ccc = value; +} + +uint16_t bt_get_gatt_ccc(const bdaddr_t *addr) +{ + struct device *dev; + + dev = find_device(addr); + if (!dev) + return 0; + + return dev->gatt_ccc; +} + static void store_link_key(const bdaddr_t *dst, const uint8_t *key, uint8_t type, uint8_t pin_length) { @@ -2408,6 +2454,12 @@ static struct device *create_device_from_info(GKeyFile *key_file, "RemoteCSRKSignCounter", NULL); } + str = g_key_file_get_string(key_file, peer, "GattCCC", NULL); + if (str) { + dev->gatt_ccc = atoi(str); + g_free(str); + } + str = g_key_file_get_string(key_file, peer, "Name", NULL); if (str) { g_free(dev->name); diff --git a/android/bluetooth.h b/android/bluetooth.h index 1c143770b..b4a5f3296 100644 --- a/android/bluetooth.h +++ b/android/bluetooth.h @@ -66,3 +66,7 @@ bool bt_get_csrk(const bdaddr_t *addr, enum bt_csrk_type type, uint8_t key[16], uint32_t *sign_cnt); void bt_update_sign_counter(const bdaddr_t *addr, enum bt_csrk_type type); + +void bt_store_gatt_ccc(const bdaddr_t *addr, uint16_t value); + +uint16_t bt_get_gatt_ccc(const bdaddr_t *addr); -- 2.47.3