From 34b80bda45dc659903feb60393332aede26ad481 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Danis?= Date: Thu, 13 Dec 2012 21:39:16 +0100 Subject: [PATCH] device: Retrieve device technology from storage --- src/device.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/src/device.c b/src/device.c index e7aa44da1..515ee61ec 100644 --- a/src/device.c +++ b/src/device.c @@ -244,6 +244,35 @@ static gboolean store_device_info_cb(gpointer user_data) g_key_file_remove_key(key_file, "General", "Class", NULL); } + switch (device->bdaddr_type) { + case BDADDR_BREDR: + g_key_file_set_string(key_file, "General", + "SupportedTechnologies", "BR/EDR"); + g_key_file_remove_key(key_file, "General", + "AddressType", NULL); + break; + + case BDADDR_LE_PUBLIC: + g_key_file_set_string(key_file, "General", + "SupportedTechnologies", "LE"); + g_key_file_set_string(key_file, "General", + "AddressType", "public"); + break; + + case BDADDR_LE_RANDOM: + g_key_file_set_string(key_file, "General", + "SupportedTechnologies", "LE"); + g_key_file_set_string(key_file, "General", + "AddressType", "static"); + break; + + default: + g_key_file_remove_key(key_file, "General", + "SupportedTechnologies", NULL); + g_key_file_remove_key(key_file, "General", + "AddressType", NULL); + } + g_key_file_set_boolean(key_file, "General", "Trusted", device->trusted); @@ -1714,6 +1743,9 @@ static void load_info(struct btd_device *device, const gchar *local, gboolean store_needed = FALSE; gboolean blocked; int source, vendor, product, version; + char **techno, **t; + gboolean bredr = FALSE; + gboolean le = FALSE; snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/info", local, peer); filename[PATH_MAX] = '\0'; @@ -1750,6 +1782,42 @@ static void load_info(struct btd_device *device, const gchar *local, g_free(str); } + /* Load device technology */ + techno = g_key_file_get_string_list(key_file, "General", + "SupportedTechnologies", NULL, NULL); + if (!techno) + goto next; + + for (t = techno; *t; t++) { + if (g_str_equal(*t, "BR/EDR")) + bredr = TRUE; + else if (g_str_equal(*t, "LE")) + le = TRUE; + else + error("Unknown device technology"); + } + + if (bredr && le) { + /* TODO: Add correct type for dual mode device */ + } else if (bredr) { + device->bdaddr_type = BDADDR_BREDR; + } else if (le) { + str = g_key_file_get_string(key_file, "General", + "AddressType", NULL); + + if (str && g_str_equal(str, "public")) + device->bdaddr_type = BDADDR_LE_PUBLIC; + else if (str && g_str_equal(str, "static")) + device->bdaddr_type = BDADDR_LE_RANDOM; + else + error("Unknown LE device technology"); + + g_free(str); + } + + g_strfreev(techno); + +next: /* Load trust */ device->trusted = g_key_file_get_boolean(key_file, "General", "Trusted", NULL); -- 2.47.3