2012-11-21 13:49:47

by Frederic Danis

[permalink] [raw]
Subject: [PATCH 1/5] doc: Update settings-storage.txt

Remote features are not available from user space,
so replace Features entry by SupportedTechnologies.

Device blocked should be saved in device info file.
---
doc/settings-storage.txt | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/doc/settings-storage.txt b/doc/settings-storage.txt
index 1174d44..3fdcb03 100644
--- a/doc/settings-storage.txt
+++ b/doc/settings-storage.txt
@@ -139,13 +139,16 @@ Long term key) related to a remote device.
Class String Device class in hexadecimal,
i.e. 0x000000

- Features String Bluetooth device features in
- hexadecimal, i.e. 0x0000000000000000
+ SupportedTechnologies List of List of technologies supported by
+ strings device, separated by ";"
+ Technologies can be BR/EDR or LE

AddressType String An address can be "static" or "public"

Trusted Boolean True if the remote device is trusted

+ Blocked Boolean True if the remote device is blocked
+
Profiles List of List of profiles advertised by remote,
strings in 128-bits UUID format, separated by
";"
--
1.7.9.5



2012-11-21 18:46:11

by Johan Hedberg

[permalink] [raw]
Subject: Re: [PATCH 1/5] doc: Update settings-storage.txt

Hi Frederic,

On Wed, Nov 21, 2012, Fr?d?ric Danis wrote:
> Remote features are not available from user space,
> so replace Features entry by SupportedTechnologies.
>
> Device blocked should be saved in device info file.
> ---
> doc/settings-storage.txt | 7 +++++--
> 1 file changed, 5 insertions(+), 2 deletions(-)

All five patches have been applied. Thanks.

Johan

2012-11-21 13:49:51

by Frederic Danis

[permalink] [raw]
Subject: [PATCH 5/5] device: Retrieve device pnp ids from storage

When device pnp ids are updated, save them and emit property
changed signals.
---
src/device.c | 51 ++++++++++++++++++++++++++++++++++-----------------
1 file changed, 34 insertions(+), 17 deletions(-)

diff --git a/src/device.c b/src/device.c
index d4a553d..4559674 100644
--- a/src/device.c
+++ b/src/device.c
@@ -236,6 +236,17 @@ static gboolean store_device_info_cb(gpointer user_data)
g_key_file_set_boolean(key_file, "General", "Blocked",
device->blocked);

+ if (device->vendor_src) {
+ g_key_file_set_integer(key_file, "DeviceID", "Source",
+ device->vendor_src);
+ g_key_file_set_integer(key_file, "DeviceID", "Vendor",
+ device->vendor);
+ g_key_file_set_integer(key_file, "DeviceID", "Product",
+ device->product);
+ g_key_file_set_integer(key_file, "DeviceID", "Version",
+ device->version);
+ }
+
ba2str(adapter_get_address(device->adapter), adapter_addr);
ba2str(&device->bdaddr, device_addr);
snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/info", adapter_addr,
@@ -1766,6 +1777,7 @@ static void load_info(struct btd_device *device, const gchar *local,
char *str;
gboolean store_needed = FALSE;
gboolean blocked;
+ int source, vendor, product, version;

snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/info", local, peer);
filename[PATH_MAX] = '\0';
@@ -1811,6 +1823,24 @@ static void load_info(struct btd_device *device, const gchar *local,
if (blocked)
device_block(device, FALSE);

+ /* Load device id */
+ source = g_key_file_get_integer(key_file, "DeviceID", "Source", NULL);
+ if (source) {
+ device_set_vendor_src(device, source);
+
+ vendor = g_key_file_get_integer(key_file, "DeviceID",
+ "Vendor", NULL);
+ device_set_vendor(device, vendor);
+
+ product = g_key_file_get_integer(key_file, "DeviceID",
+ "Product", NULL);
+ device_set_product(device, product);
+
+ version = g_key_file_get_integer(key_file, "DeviceID",
+ "Version", NULL);
+ device_set_version(device, version);
+ }
+
if (store_needed)
store_device_info(device);

@@ -1825,7 +1855,6 @@ struct btd_device *device_create(struct btd_adapter *adapter,
const gchar *adapter_path = adapter_get_path(adapter);
const bdaddr_t *src;
char srcaddr[18];
- uint16_t vendor, product, version;

device = g_try_malloc0(sizeof(struct btd_device));
if (device == NULL)
@@ -1867,13 +1896,6 @@ struct btd_device *device_create(struct btd_adapter *adapter,
device_set_bonded(device, TRUE);
}

- if (read_device_id(srcaddr, address, bdaddr_type, NULL, &vendor,
- &product, &version) == 0) {
- device_set_vendor(device, vendor);
- device_set_product(device, product);
- device_set_version(device, version);
- }
-
return btd_device_ref(device);
}

@@ -2320,22 +2342,15 @@ static void update_bredr_services(struct browse_req *req, sdp_list_t *recs)
pdlist = sdp_data_get(rec, SDP_ATTR_VENDOR_ID);
vendor = pdlist ? pdlist->val.uint16 : 0x0000;

- device_set_vendor(device, vendor);
-
pdlist = sdp_data_get(rec, SDP_ATTR_PRODUCT_ID);
product = pdlist ? pdlist->val.uint16 : 0x0000;

- device_set_product(device, product);
-
pdlist = sdp_data_get(rec, SDP_ATTR_VERSION);
version = pdlist ? pdlist->val.uint16 : 0x0000;

- device_set_version(device, version);
-
if (source || vendor || product || version)
- store_device_id(srcaddr, dstaddr,
- device->bdaddr_type, source,
- vendor, product, version);
+ device_set_pnpid(device, source, vendor,
+ product, version);
}

/* Check for duplicates */
@@ -4094,4 +4109,6 @@ void device_set_pnpid(struct btd_device *device, uint8_t vendor_id_src,
device_set_vendor_src(device, vendor_id_src);
device_set_product(device, product_id);
device_set_version(device, product_ver);
+
+ store_device_info(device);
}
--
1.7.9.5


2012-11-21 13:49:50

by Frederic Danis

[permalink] [raw]
Subject: [PATCH 4/5] adapter: Convert storage did file

---
src/adapter.c | 42 ++++++++++++++++++++++++++++++++++++++++++
1 file changed, 42 insertions(+)

diff --git a/src/adapter.c b/src/adapter.c
index 3dafacb..0d1dfea 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -2548,6 +2548,45 @@ static void convert_blocked_entry(GKeyFile *key_file, void *value)
g_key_file_set_boolean(key_file, "General", "Blocked", TRUE);
}

+static void convert_did_entry(GKeyFile *key_file, void *value)
+{
+ char *vendor_str, *product_str, *version_str;
+ uint16_t val;
+
+ vendor_str = strchr(value, ' ');
+ if (!vendor_str)
+ return;
+
+ *(vendor_str++) = 0;
+
+ if (g_str_equal(value, "FFFF"))
+ return;
+
+ product_str = strchr(vendor_str, ' ');
+ if (!product_str)
+ return;
+
+ *(product_str++) = 0;
+
+ version_str = strchr(product_str, ' ');
+ if (!version_str)
+ return;
+
+ *(version_str++) = 0;
+
+ val = (uint16_t) strtol(value, NULL, 16);
+ g_key_file_set_integer(key_file, "DeviceID", "Source", val);
+
+ val = (uint16_t) strtol(vendor_str, NULL, 16);
+ g_key_file_set_integer(key_file, "DeviceID", "Vendor", val);
+
+ val = (uint16_t) strtol(product_str, NULL, 16);
+ g_key_file_set_integer(key_file, "DeviceID", "Product", val);
+
+ val = (uint16_t) strtol(version_str, NULL, 16);
+ g_key_file_set_integer(key_file, "DeviceID", "Version", val);
+}
+
static void convert_entry(char *key, char *value, void *user_data)
{
struct device_converter *converter = user_data;
@@ -2633,6 +2672,9 @@ static void convert_device_storage(struct btd_adapter *adapter)

/* Convert blocked */
convert_file("blocked", address, convert_blocked_entry);
+
+ /* Convert device ids */
+ convert_file("did", address, convert_did_entry);
}

static void convert_config(struct btd_adapter *adapter, const char *filename,
--
1.7.9.5


2012-11-21 13:49:49

by Frederic Danis

[permalink] [raw]
Subject: [PATCH 3/5] device: Retrieve device blocked from storage

---
src/device.c | 22 +++++++++++-----------
1 file changed, 11 insertions(+), 11 deletions(-)

diff --git a/src/device.c b/src/device.c
index 915b0f8..d4a553d 100644
--- a/src/device.c
+++ b/src/device.c
@@ -233,6 +233,9 @@ static gboolean store_device_info_cb(gpointer user_data)
g_key_file_set_boolean(key_file, "General", "Trusted",
device->trusted);

+ g_key_file_set_boolean(key_file, "General", "Blocked",
+ device->blocked);
+
ba2str(adapter_get_address(device->adapter), adapter_addr);
ba2str(&device->bdaddr, device_addr);
snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/info", adapter_addr,
@@ -920,10 +923,7 @@ int device_block(struct btd_device *device, gboolean update_only)

device->blocked = TRUE;

- err = write_blocked(adapter_get_address(device->adapter),
- &device->bdaddr, device->bdaddr_type, TRUE);
- if (err < 0)
- error("write_blocked(): %s (%d)", strerror(-err), -err);
+ store_device_info(device);

device_set_temporary(device, FALSE);

@@ -950,10 +950,7 @@ int device_unblock(struct btd_device *device, gboolean silent,

device->blocked = FALSE;

- err = write_blocked(adapter_get_address(device->adapter),
- &device->bdaddr, device->bdaddr_type, FALSE);
- if (err < 0)
- error("write_blocked(): %s (%d)", strerror(-err), -err);
+ store_device_info(device);

if (!silent) {
g_dbus_emit_property_changed(btd_get_dbus_connection(),
@@ -1768,6 +1765,7 @@ static void load_info(struct btd_device *device, const gchar *local,
GKeyFile *key_file;
char *str;
gboolean store_needed = FALSE;
+ gboolean blocked;

snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/info", local, peer);
filename[PATH_MAX] = '\0';
@@ -1808,6 +1806,11 @@ static void load_info(struct btd_device *device, const gchar *local,
device->trusted = g_key_file_get_boolean(key_file, "General",
"Trusted", NULL);

+ /* Load device blocked */
+ blocked = g_key_file_get_boolean(key_file, "General", "Blocked", NULL);
+ if (blocked)
+ device_block(device, FALSE);
+
if (store_needed)
store_device_info(device);

@@ -1852,9 +1855,6 @@ struct btd_device *device_create(struct btd_adapter *adapter,

load_info(device, srcaddr, address);

- if (read_blocked(src, &device->bdaddr, device->bdaddr_type))
- device_block(device, FALSE);
-
if (read_link_key(src, &device->bdaddr, device->bdaddr_type, NULL,
NULL) == 0) {
device_set_paired(device, TRUE);
--
1.7.9.5


2012-11-21 13:49:48

by Frederic Danis

[permalink] [raw]
Subject: [PATCH 2/5] adapter: Convert storage device blocked

An entry exists in blocked file only when a device is blocked.
So, we do not need to check entry value and set device (entry key) as
blocked.
---
src/adapter.c | 8 ++++++++
1 file changed, 8 insertions(+)

diff --git a/src/adapter.c b/src/adapter.c
index 0f6a078..3dafacb 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -2543,6 +2543,11 @@ static void convert_classes_entry(GKeyFile *key_file, void *value)
g_key_file_set_string(key_file, "General", "Class", value);
}

+static void convert_blocked_entry(GKeyFile *key_file, void *value)
+{
+ g_key_file_set_boolean(key_file, "General", "Blocked", TRUE);
+}
+
static void convert_entry(char *key, char *value, void *user_data)
{
struct device_converter *converter = user_data;
@@ -2625,6 +2630,9 @@ static void convert_device_storage(struct btd_adapter *adapter)

/* Convert classes */
convert_file("classes", address, convert_classes_entry);
+
+ /* Convert blocked */
+ convert_file("blocked", address, convert_blocked_entry);
}

static void convert_config(struct btd_adapter *adapter, const char *filename,
--
1.7.9.5