---
src/adapter.c | 75 +++++++++++++++++++++++++--------------------------------
1 file changed, 33 insertions(+), 42 deletions(-)
diff --git a/src/adapter.c b/src/adapter.c
index 2a8e7d5..f4bb622 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -85,6 +85,7 @@
#define PENDING_FOUND_MAX 5
#define SETTINGS_PATH STORAGEDIR "/%s/settings"
+#define CACHE_PATH STORAGEDIR "/%s/cache/%s"
static GSList *adapter_drivers = NULL;
@@ -255,6 +256,32 @@ static void store_adapter_info(struct btd_adapter *adapter)
g_key_file_free(key_file);
}
+static void store_cached_name(const bdaddr_t *local, const bdaddr_t *peer,
+ char *name)
+{
+ char filename[PATH_MAX + 1];
+ char s_addr[18], d_addr[18];
+ GKeyFile *key_file;
+ char *data;
+ gsize length = 0;
+
+ ba2str(local, s_addr);
+ ba2str(peer, d_addr);
+ snprintf(filename, PATH_MAX, CACHE_PATH, s_addr, d_addr);
+ filename[PATH_MAX] = '\0';
+ create_file(filename, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
+
+ key_file = g_key_file_new();
+ g_key_file_load_from_file(key_file, filename, 0, NULL);
+ g_key_file_set_string(key_file, "General", "Name", name);
+
+ data = g_key_file_to_data(key_file, &length, NULL);
+ g_file_set_contents(filename, data, length, NULL);
+ g_free(data);
+
+ g_key_file_free(key_file);
+}
+
static struct session_req *session_ref(struct session_req *req)
{
req->refcount++;
@@ -2496,11 +2523,8 @@ void btd_adapter_unref(struct btd_adapter *adapter)
static void convert_names_entry(char *key, char *value, void *user_data)
{
char *address = user_data;
- char filename[PATH_MAX + 1];
char *str = key;
- GKeyFile *key_file;
- char *data;
- gsize length = 0;
+ bdaddr_t local, peer;
if (strchr(key, '#'))
str[17] = '\0';
@@ -2508,19 +2532,9 @@ static void convert_names_entry(char *key, char *value, void *user_data)
if (bachk(str) != 0)
return;
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/cache/%s", address, str);
- filename[PATH_MAX] = '\0';
- create_file(filename, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
-
- key_file = g_key_file_new();
- g_key_file_load_from_file(key_file, filename, 0, NULL);
- g_key_file_set_string(key_file, "General", "Name", value);
-
- data = g_key_file_to_data(key_file, &length, NULL);
- g_file_set_contents(filename, data, length, NULL);
- g_free(data);
-
- g_key_file_free(key_file);
+ str2ba(address, &local);
+ str2ba(str, &peer);
+ store_cached_name(&local, &peer, value);
}
static void convert_device_storage(struct btd_adapter *adapter)
@@ -2990,31 +3004,8 @@ void adapter_update_found_devices(struct btd_adapter *adapter,
write_remote_appearance(&adapter->bdaddr, bdaddr, bdaddr_type,
eir_data.appearance);
- if (eir_data.name != NULL && eir_data.name_complete) {
- char filename[PATH_MAX + 1];
- char s_addr[18], d_addr[18];
- GKeyFile *key_file;
- char *data;
- gsize length = 0;
-
- ba2str(&adapter->bdaddr, s_addr);
- ba2str(bdaddr, d_addr);
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/cache/%s",
- s_addr, d_addr);
- filename[PATH_MAX] = '\0';
- create_file(filename, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
-
- key_file = g_key_file_new();
- g_key_file_load_from_file(key_file, filename, 0, NULL);
- g_key_file_set_string(key_file, "General", "Name",
- eir_data.name);
-
- data = g_key_file_to_data(key_file, &length, NULL);
- g_file_set_contents(filename, data, length, NULL);
- g_free(data);
-
- g_key_file_free(key_file);
- }
+ if (eir_data.name != NULL && eir_data.name_complete)
+ store_cached_name(&adapter->bdaddr, bdaddr, eir_data.name);
/* Avoid creating LE device if it's not discoverable */
if (bdaddr_type != BDADDR_BREDR &&
--
1.7.9.5
Hi Szymon,
On Wed, Oct 31, 2012, Szymon Janc wrote:
> > --- a/plugins/dbusoob.c
> > +++ b/plugins/dbusoob.c
> > @@ -193,6 +193,7 @@ static gboolean parse_data(DBusMessageIter *data, struct oob_data *remote_data)
> >
> > static gboolean store_data(struct btd_adapter *adapter, struct oob_data *data)
> > {
> > + bdaddr_t local = *adapter_get_address(adapter);
> > bdaddr_t bdaddr;
> >
> > str2ba(data->addr, &bdaddr);
> > @@ -207,9 +208,13 @@ static gboolean store_data(struct btd_adapter *adapter, struct oob_data *data)
> > write_remote_class(adapter_get_address(adapter), &bdaddr,
> > data->class);
> >
> > - if (data->name)
> > - write_device_name(adapter_get_address(adapter), &bdaddr, 0,
> > - data->name);
> > + if (data->name) {
> > + char *str;
> > +
> > + str = g_strdup(data->name);
> > + btd_event_remote_name(&local, &bdaddr, str);
> > + g_free(str);
>
> Is this g_strdup needed? Why not just pass data->name directly?
This was because of missing const declarations in the event.h API. I
fixed this up and removed the extra strdup from this patch.
Johan
Hi Fr?d?ric,
On Tue, Oct 30, 2012, Fr?d?ric Danis wrote:
> ---
> src/adapter.c | 75 +++++++++++++++++++++++++--------------------------------
> 1 file changed, 33 insertions(+), 42 deletions(-)
All patches in this set have been applied. Thanks.
Johan
Hi Frédéric,
On Tuesday 30 of October 2012 19:05:26 Frédéric Danis wrote:
> ---
> plugins/dbusoob.c | 11 ++++++++---
> 1 file changed, 8 insertions(+), 3 deletions(-)
>
> diff --git a/plugins/dbusoob.c b/plugins/dbusoob.c
> index 5c5b6ef..0278941 100644
> --- a/plugins/dbusoob.c
> +++ b/plugins/dbusoob.c
> @@ -193,6 +193,7 @@ static gboolean parse_data(DBusMessageIter *data, struct oob_data *remote_data)
>
> static gboolean store_data(struct btd_adapter *adapter, struct oob_data *data)
> {
> + bdaddr_t local = *adapter_get_address(adapter);
> bdaddr_t bdaddr;
>
> str2ba(data->addr, &bdaddr);
> @@ -207,9 +208,13 @@ static gboolean store_data(struct btd_adapter *adapter, struct oob_data *data)
> write_remote_class(adapter_get_address(adapter), &bdaddr,
> data->class);
>
> - if (data->name)
> - write_device_name(adapter_get_address(adapter), &bdaddr, 0,
> - data->name);
> + if (data->name) {
> + char *str;
> +
> + str = g_strdup(data->name);
> + btd_event_remote_name(&local, &bdaddr, str);
> + g_free(str);
Is this g_strdup needed? Why not just pass data->name directly?
> + }
>
> return TRUE;
> }
> --
> 1.7.9.5
>
--
BR
Szymon Janc
---
Makefile.tools | 2 +-
tools/hcitool.c | 31 ++++++++++++++++++++++++++-----
2 files changed, 27 insertions(+), 6 deletions(-)
diff --git a/Makefile.tools b/Makefile.tools
index ec79cea..f7c85ef 100644
--- a/Makefile.tools
+++ b/Makefile.tools
@@ -28,7 +28,7 @@ tools_hciconfig_LDADD = lib/libbluetooth-private.la
tools_hcitool_SOURCES = tools/hcitool.c src/oui.h src/oui.c \
src/textfile.h src/textfile.c
-tools_hcitool_LDADD = lib/libbluetooth-private.la
+tools_hcitool_LDADD = lib/libbluetooth-private.la @GLIB_LIBS@
tools_sdptool_SOURCES = tools/sdptool.c src/sdp-xml.h src/sdp-xml.c
tools_sdptool_LDADD = lib/libbluetooth-private.la @GLIB_LIBS@
diff --git a/tools/hcitool.c b/tools/hcitool.c
index aefbd68..a05e31f 100644
--- a/tools/hcitool.c
+++ b/tools/hcitool.c
@@ -40,6 +40,8 @@
#include <sys/socket.h>
#include <signal.h>
+#include <glib.h>
+
#include <bluetooth/bluetooth.h>
#include <bluetooth/hci.h>
#include <bluetooth/hci_lib.h>
@@ -409,13 +411,32 @@ static char *major_classes[] = {
static char *get_device_name(const bdaddr_t *local, const bdaddr_t *peer)
{
- char filename[PATH_MAX + 1], addr[18];
+ char filename[PATH_MAX + 1];
+ char local_addr[18], peer_addr[18];
+ GKeyFile *key_file;
+ char *str = NULL;
+ int len;
+
+ ba2str(local, local_addr);
+ ba2str(peer, peer_addr);
+
+ snprintf(filename, PATH_MAX, STORAGEDIR "/%s/cache/%s", local_addr,
+ peer_addr);
+ filename[PATH_MAX] = '\0';
+ key_file = g_key_file_new();
+
+ if (g_key_file_load_from_file(key_file, filename, 0, NULL)) {
+ str = g_key_file_get_string(key_file, "General", "Name", NULL);
+ if (str) {
+ len = strlen(str);
+ if (len > HCI_MAX_NAME_LENGTH)
+ str[HCI_MAX_NAME_LENGTH] = '\0';
+ }
+ }
- ba2str(local, addr);
- create_name(filename, PATH_MAX, STORAGEDIR, addr, "names");
+ g_key_file_free(key_file);
- ba2str(peer, addr);
- return textfile_get(filename, addr);
+ return str;
}
/* Display local devices */
--
1.7.9.5
---
profiles/input/device.c | 9 +++------
1 file changed, 3 insertions(+), 6 deletions(-)
diff --git a/profiles/input/device.c b/profiles/input/device.c
index fbc3d6f..108be39 100644
--- a/profiles/input/device.c
+++ b/profiles/input/device.c
@@ -777,7 +777,7 @@ static struct input_device *input_device_new(struct btd_device *device,
{
struct btd_adapter *adapter = device_get_adapter(device);
struct input_device *idev;
- char name[249], src_addr[18], dst_addr[18];
+ char name[HCI_MAX_NAME_LENGTH + 1];
idev = g_new0(struct input_device, 1);
bacpy(&idev->src, adapter_get_address(adapter));
@@ -787,11 +787,8 @@ static struct input_device *input_device_new(struct btd_device *device,
idev->handle = handle;
idev->disable_sdp = disable_sdp;
- ba2str(&idev->src, src_addr);
- ba2str(&idev->dst, dst_addr);
-
- if (read_device_name(src_addr, dst_addr, device_get_addr_type(device),
- name) == 0)
+ device_get_name(device, name, HCI_MAX_NAME_LENGTH);
+ if (strlen(name) > 0)
idev->name = g_strdup(name);
if (g_dbus_register_interface(btd_get_dbus_connection(),
--
1.7.9.5
---
plugins/dbusoob.c | 11 ++++++++---
1 file changed, 8 insertions(+), 3 deletions(-)
diff --git a/plugins/dbusoob.c b/plugins/dbusoob.c
index 5c5b6ef..0278941 100644
--- a/plugins/dbusoob.c
+++ b/plugins/dbusoob.c
@@ -193,6 +193,7 @@ static gboolean parse_data(DBusMessageIter *data, struct oob_data *remote_data)
static gboolean store_data(struct btd_adapter *adapter, struct oob_data *data)
{
+ bdaddr_t local = *adapter_get_address(adapter);
bdaddr_t bdaddr;
str2ba(data->addr, &bdaddr);
@@ -207,9 +208,13 @@ static gboolean store_data(struct btd_adapter *adapter, struct oob_data *data)
write_remote_class(adapter_get_address(adapter), &bdaddr,
data->class);
- if (data->name)
- write_device_name(adapter_get_address(adapter), &bdaddr, 0,
- data->name);
+ if (data->name) {
+ char *str;
+
+ str = g_strdup(data->name);
+ btd_event_remote_name(&local, &bdaddr, str);
+ g_free(str);
+ }
return TRUE;
}
--
1.7.9.5
Try to retrieve name from device info file.
If that fails fall back to the cache and save it to device info file.
When device name is updated, save it.
---
src/device.c | 102 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 101 insertions(+), 1 deletion(-)
diff --git a/src/device.c b/src/device.c
index bc7f8dd..9749bfd 100644
--- a/src/device.c
+++ b/src/device.c
@@ -76,6 +76,9 @@
#define DISCONNECT_TIMER 2
#define DISCOVERY_TIMER 2
+#define INFO_PATH STORAGEDIR "/%s/%s/info"
+#define CACHE_PATH STORAGEDIR "/%s/cache/%s"
+
struct btd_disconnect_data {
guint id;
disconnect_watch watch;
@@ -202,6 +205,36 @@ static uint16_t uuid_list[] = {
0
};
+static void store_device_info(struct btd_device *device)
+{
+ GKeyFile *key_file;
+ char filename[PATH_MAX + 1];
+ char adapter_addr[18];
+ char device_addr[18];
+ char *str;
+ gsize length = 0;
+
+ if (device->temporary)
+ return;
+
+ key_file = g_key_file_new();
+
+ g_key_file_set_string(key_file, "General", "Name", device->name);
+
+ ba2str(adapter_get_address(device->adapter), adapter_addr);
+ ba2str(&device->bdaddr, device_addr);
+ snprintf(filename, PATH_MAX, INFO_PATH, adapter_addr, device_addr);
+ filename[PATH_MAX] = '\0';
+
+ create_file(filename, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
+
+ str = g_key_file_to_data(key_file, &length, NULL);
+ g_file_set_contents(filename, str, length, NULL);
+ g_free(str);
+
+ g_key_file_free(key_file);
+}
+
static void browse_request_free(struct browse_req *req)
{
if (req->listener_id)
@@ -1564,6 +1597,70 @@ static void device_set_version(struct btd_device *device, uint16_t value)
DEVICE_INTERFACE, "Version");
}
+static char *load_cached_name(struct btd_device *device, const char *local,
+ const gchar *peer)
+{
+ char filename[PATH_MAX + 1];
+ GKeyFile *key_file;
+ char *str = NULL;
+ int len;
+
+ snprintf(filename, PATH_MAX, CACHE_PATH, local, peer);
+ filename[PATH_MAX] = '\0';
+
+ key_file = g_key_file_new();
+
+ if (!g_key_file_load_from_file(key_file, filename, 0, NULL))
+ goto failed;
+
+ str = g_key_file_get_string(key_file, "General", "Name", NULL);
+ if (str) {
+ len = strlen(str);
+ if (len > HCI_MAX_NAME_LENGTH)
+ str[HCI_MAX_NAME_LENGTH] = '\0';
+ }
+
+failed:
+ g_key_file_free(key_file);
+
+ return str;
+}
+
+static void load_info(struct btd_device *device, const gchar *local,
+ const gchar *peer)
+{
+ char filename[PATH_MAX + 1];
+ GKeyFile *key_file;
+ char *str;
+ gboolean store_needed = FALSE;
+
+ snprintf(filename, PATH_MAX, INFO_PATH, local, peer);
+ filename[PATH_MAX] = '\0';
+
+ key_file = g_key_file_new();
+ g_key_file_load_from_file(key_file, filename, 0, NULL);
+
+ /* Load device name from storage info file, if that fails fall back to
+ * the cache.
+ */
+ str = g_key_file_get_string(key_file, "General", "Name", NULL);
+ if (str == NULL) {
+ str = load_cached_name(device, local, peer);
+ if (str)
+ store_needed = TRUE;
+ }
+
+ if (str) {
+ strcpy(device->name, str);
+ g_free(str);
+ }
+
+ if (store_needed)
+ store_device_info(device);
+
+ g_key_file_free(key_file);
+}
+
struct btd_device *device_create(struct btd_adapter *adapter,
const gchar *address, uint8_t bdaddr_type)
{
@@ -1600,7 +1697,8 @@ struct btd_device *device_create(struct btd_adapter *adapter,
src = adapter_get_address(adapter);
ba2str(src, srcaddr);
- read_device_name(srcaddr, address, bdaddr_type, device->name);
+ load_info(device, srcaddr, address);
+
if (read_device_alias(srcaddr, address, bdaddr_type, alias,
sizeof(alias)) == 0)
device->alias = g_strdup(alias);
@@ -1640,6 +1738,8 @@ void device_set_name(struct btd_device *device, const char *name)
strncpy(device->name, name, MAX_NAME_LENGTH);
+ store_device_info(device);
+
g_dbus_emit_property_changed(btd_get_dbus_connection(), device->path,
DEVICE_INTERFACE, "Name");
--
1.7.9.5
Device name should be saved in device info file.
---
doc/settings-storage.txt | 2 ++
1 file changed, 2 insertions(+)
diff --git a/doc/settings-storage.txt b/doc/settings-storage.txt
index 93184d1..1174d44 100644
--- a/doc/settings-storage.txt
+++ b/doc/settings-storage.txt
@@ -132,6 +132,8 @@ Long term key) related to a remote device.
[General] group contains:
+ Name String Remote device friendly name
+
Alias String Alias name
Class String Device class in hexadecimal,
--
1.7.9.5