diff options
author | Vinicius Costa Gomes <vinicius.gomes@openbossa.org> | 2010-07-30 13:56:25 -0300 |
---|---|---|
committer | Johan Hedberg <johan.hedberg@nokia.com> | 2010-08-09 18:06:47 -0400 |
commit | 70a27054c2f58d9ba8ed68cc52cf41639a4134be (patch) | |
tree | 13a9291e27e883fc798028683b5c52cf3ca36862 | |
parent | 739afe307c33ce7524842002a807d55eafa5aecb (diff) | |
download | bluez-70a27054c2f58d9ba8ed68cc52cf41639a4134be.tar.gz bluez-70a27054c2f58d9ba8ed68cc52cf41639a4134be.tar.xz bluez-70a27054c2f58d9ba8ed68cc52cf41639a4134be.zip |
Add support from restoring characteristics from storage
Now every known characteristic object is restored from storage with
essential information. Each characteristic DBus object path is registered
from that information.
-rw-r--r-- | attrib/client.c | 73 |
1 files changed, 72 insertions, 1 deletions
diff --git a/attrib/client.c b/attrib/client.c index 4cbcfd68..8aa47947 100644 --- a/attrib/client.c +++ b/attrib/client.c @@ -184,6 +184,47 @@ static char *characteristic_list_to_string(GSList *chars) return g_string_free(characteristics, FALSE); } +static GSList *string_to_characteristic_list(const char *prim_path, + const char *str) +{ + GSList *l = NULL; + char **chars; + int i; + + if (str == NULL) + return NULL; + + chars = g_strsplit(str, " ", 0); + if (chars == NULL) + return NULL; + + for (i = 0; chars[i]; i++) { + struct characteristic *chr; + char uuidstr[MAX_LEN_UUID_STR + 1]; + int ret; + + chr = g_new0(struct characteristic, 1); + + ret = sscanf(chars[i], "%04hX#%02hhX#%04hX#%s", &chr->handle, + &chr->perm, &chr->end, uuidstr); + if (ret < 4) { + g_free(chr); + continue; + } + + chr->path = g_strdup_printf("%s/characteristic%04x", prim_path, + chr->handle); + + bt_string2uuid(&chr->type, uuidstr); + + l = g_slist_append(l, chr); + } + + g_strfreev(chars); + + return l; +} + static void store_characteristics(struct gatt_service *gatt, struct primary *prim) { @@ -197,6 +238,35 @@ static void store_characteristics(struct gatt_service *gatt, g_free(characteristics); } +static void load_characteristics(gpointer data, gpointer user_data) +{ + struct primary *prim = data; + struct gatt_service *gatt = user_data; + GSList *chrs_list; + char *str; + + if (prim->chars) { + DBG("Characteristics already loaded"); + return; + } + + str = read_device_characteristics(&gatt->sba, &gatt->dba, prim->start); + if (str == NULL) + return; + + chrs_list = string_to_characteristic_list(prim->path, str); + + free(str); + + if (chrs_list == NULL) + return; + + + prim->chars = chrs_list; + + return; +} + static void char_discovered_cb(guint8 status, const guint8 *pdu, guint16 plen, gpointer user_data) { @@ -335,7 +405,7 @@ static GSList *string_to_primary_list(char *gatt_path, const char *str) prim->start); ret = sscanf(services[i], "%04hX#%04hX#%s", &prim->start, - &prim->end, (char *) &uuidstr); + &prim->end, uuidstr); if (ret < 3) continue; @@ -383,6 +453,7 @@ static gboolean load_primary_services(struct gatt_service *gatt) gatt->primary = primary_list; + g_slist_foreach(gatt->primary, load_characteristics, gatt); /* FIXME: register interfaces here */ return TRUE; |