aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLuiz Augusto von Dentz <luiz.dentz@openbossa.org>2009-04-08 19:39:43 -0300
committerJohan Hedberg <johan.hedberg@nokia.com>2009-04-09 11:38:53 +0300
commit74478aebb19c6d5dce36ddde2696fae29a6bf80f (patch)
tree6bb887a4c677f601734e65ae6d0ec6ac75c9d975 /src
parent8fd334315e5a78a490c5ec89c56fa8a484439379 (diff)
downloadbluez-74478aebb19c6d5dce36ddde2696fae29a6bf80f.tar.gz
Cleanup emit_device_found code.
Remove duplicate code which both hcid_dbus_remote_name and hcid_dbus_inquiry_result have been using.
Diffstat (limited to 'src')
-rw-r--r--src/adapter.c126
-rw-r--r--src/adapter.h9
-rw-r--r--src/dbus-hci.c120
3 files changed, 113 insertions, 142 deletions
diff --git a/src/adapter.c b/src/adapter.c
index 4307e087..8eeb9b3c 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -205,6 +205,7 @@ static int found_device_cmp(const struct remote_dev_info *d1,
static void dev_info_free(struct remote_dev_info *dev)
{
+ g_free(dev->name);
g_free(dev->alias);
g_free(dev);
}
@@ -2534,8 +2535,88 @@ static int dev_rssi_cmp(struct remote_dev_info *d1, struct remote_dev_info *d2)
return rssi1 - rssi2;
}
-int adapter_add_found_device(struct btd_adapter *adapter, bdaddr_t *bdaddr,
- int8_t rssi, uint32_t class, const char *alias,
+static void append_dict_valist(DBusMessageIter *iter,
+ const char *first_key,
+ va_list var_args)
+{
+ DBusMessageIter dict;
+ const char *key;
+ int type;
+ void *val;
+
+ dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY,
+ DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
+ DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_VARIANT_AS_STRING
+ DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &dict);
+
+ key = first_key;
+ while (key) {
+ type = va_arg(var_args, int);
+ val = va_arg(var_args, void *);
+ dict_append_entry(&dict, key, type, val);
+ key = va_arg(var_args, char *);
+ }
+
+ dbus_message_iter_close_container(iter, &dict);
+}
+
+static void emit_device_found(const char *path, const char *address,
+ const char *first_key, ...)
+{
+ DBusMessage *signal;
+ DBusMessageIter iter;
+ va_list var_args;
+
+ signal = dbus_message_new_signal(path, ADAPTER_INTERFACE,
+ "DeviceFound");
+ if (!signal) {
+ error("Unable to allocate new %s.DeviceFound signal",
+ ADAPTER_INTERFACE);
+ return;
+ }
+ dbus_message_iter_init_append(signal, &iter);
+ dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &address);
+
+ va_start(var_args, first_key);
+ append_dict_valist(&iter, first_key, var_args);
+ va_end(var_args);
+
+ g_dbus_send_message(connection, signal);
+}
+
+void adapter_emit_device_found(struct btd_adapter *adapter,
+ struct remote_dev_info *dev)
+{
+ struct btd_device *device;
+ char peer_addr[18], local_addr[18];
+ const char *icon, *paddr = peer_addr;
+ dbus_bool_t paired = FALSE;
+ dbus_int16_t rssi = dev->rssi;
+
+ ba2str(&dev->bdaddr, peer_addr);
+ ba2str(&adapter->bdaddr, local_addr);
+
+ device = adapter_find_device(adapter, paddr);
+ if (device)
+ paired = device_is_paired(device);
+
+ icon = class_to_icon(dev->class);
+
+ emit_device_found(adapter->path, paddr,
+ "Address", DBUS_TYPE_STRING, &paddr,
+ "Class", DBUS_TYPE_UINT32, &dev->class,
+ "Icon", DBUS_TYPE_STRING, &icon,
+ "RSSI", DBUS_TYPE_INT16, &rssi,
+ "Name", DBUS_TYPE_STRING, &dev->name,
+ "Alias", DBUS_TYPE_STRING, &dev->alias,
+ "LegacyPairing", DBUS_TYPE_BOOLEAN, &dev->legacy,
+ "Paired", DBUS_TYPE_BOOLEAN, &paired,
+ NULL);
+}
+
+void adapter_update_found_devices(struct btd_adapter *adapter, bdaddr_t *bdaddr,
+ int8_t rssi, uint32_t class, const char *name,
+ const char *alias, gboolean legacy,
name_status_t name_status)
{
struct remote_dev_info *dev, match;
@@ -2544,46 +2625,33 @@ int adapter_add_found_device(struct btd_adapter *adapter, bdaddr_t *bdaddr,
bacpy(&match.bdaddr, bdaddr);
match.name_status = NAME_ANY;
- /* ignore repeated entries */
dev = adapter_search_found_devices(adapter, &match);
if (dev) {
- /* device found, update the attributes */
- if (rssi != 0)
- dev->rssi = rssi;
-
- dev->class = class;
-
- if (alias) {
- g_free(dev->alias);
- dev->alias = g_strdup(alias);
- }
-
- /* Get remote name can be received while inquiring. Keep in
- * mind that multiple inquiry result events can be received
- * from the same remote device.
- */
- if (name_status != NAME_NOT_REQUIRED)
- dev->name_status = name_status;
-
- adapter->found_devices = g_slist_sort(adapter->found_devices,
- (GCompareFunc) dev_rssi_cmp);
-
- return -EALREADY;
+ if (rssi == dev->rssi)
+ return;
+ goto done;
}
dev = g_new0(struct remote_dev_info, 1);
bacpy(&dev->bdaddr, bdaddr);
- dev->rssi = rssi;
dev->class = class;
+ if (name)
+ dev->name = g_strdup(name);
if (alias)
dev->alias = g_strdup(alias);
+ dev->legacy = legacy;
dev->name_status = name_status;
- adapter->found_devices = g_slist_insert_sorted(adapter->found_devices,
- dev, (GCompareFunc) dev_rssi_cmp);
+ adapter->found_devices = g_slist_prepend(adapter->found_devices, dev);
- return 0;
+done:
+ dev->rssi = rssi;
+
+ adapter->found_devices = g_slist_sort(adapter->found_devices,
+ (GCompareFunc) dev_rssi_cmp);
+
+ adapter_emit_device_found(adapter, dev);
}
int adapter_remove_found_device(struct btd_adapter *adapter, bdaddr_t *bdaddr)
diff --git a/src/adapter.h b/src/adapter.h
index 4ca94121..6d9dd2c9 100644
--- a/src/adapter.h
+++ b/src/adapter.h
@@ -49,7 +49,9 @@ struct remote_dev_info {
bdaddr_t bdaddr;
int8_t rssi;
uint32_t class;
+ char *name;
char *alias;
+ dbus_bool_t legacy;
name_status_t name_status;
};
@@ -106,10 +108,13 @@ void adapter_set_state(struct btd_adapter *adapter, int state);
int adapter_get_state(struct btd_adapter *adapter);
struct remote_dev_info *adapter_search_found_devices(struct btd_adapter *adapter,
struct remote_dev_info *match);
-int adapter_add_found_device(struct btd_adapter *adapter, bdaddr_t *bdaddr,
- int8_t rssi, uint32_t class, const char *alias,
+void adapter_update_found_devices(struct btd_adapter *adapter, bdaddr_t *bdaddr,
+ int8_t rssi, uint32_t class, const char *name,
+ const char *alias, gboolean legacy,
name_status_t name_status);
int adapter_remove_found_device(struct btd_adapter *adapter, bdaddr_t *bdaddr);
+void adapter_emit_device_found(struct btd_adapter *adapter,
+ struct remote_dev_info *dev);
void adapter_update_oor_devices(struct btd_adapter *adapter);
void adapter_remove_oor_device(struct btd_adapter *adapter, char *peer_addr);
void adapter_mode_changed(struct btd_adapter *adapter, uint8_t scan_mode);
diff --git a/src/dbus-hci.c b/src/dbus-hci.c
index 4814f103..d2f758bd 100644
--- a/src/dbus-hci.c
+++ b/src/dbus-hci.c
@@ -625,55 +625,6 @@ static char *extract_eir_name(uint8_t *data, uint8_t *type)
return NULL;
}
-static void append_dict_valist(DBusMessageIter *iter,
- const char *first_key,
- va_list var_args)
-{
- DBusMessageIter dict;
- const char *key;
- int type;
- void *val;
-
- dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY,
- DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
- DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_VARIANT_AS_STRING
- DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &dict);
-
- key = first_key;
- while (key) {
- type = va_arg(var_args, int);
- val = va_arg(var_args, void *);
- dict_append_entry(&dict, key, type, val);
- key = va_arg(var_args, char *);
- }
-
- dbus_message_iter_close_container(iter, &dict);
-}
-
-static void emit_device_found(const char *path, const char *address,
- const char *first_key, ...)
-{
- DBusMessage *signal;
- DBusMessageIter iter;
- va_list var_args;
-
- signal = dbus_message_new_signal(path, ADAPTER_INTERFACE,
- "DeviceFound");
- if (!signal) {
- error("Unable to allocate new %s.DeviceFound signal",
- ADAPTER_INTERFACE);
- return;
- }
- dbus_message_iter_init_append(signal, &iter);
- dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &address);
-
- va_start(var_args, first_key);
- append_dict_valist(&iter, first_key, var_args);
- va_end(var_args);
-
- g_dbus_send_message(connection, signal);
-}
-
void hcid_dbus_inquiry_result(bdaddr_t *local, bdaddr_t *peer, uint32_t class,
int8_t rssi, uint8_t *data)
{
@@ -681,14 +632,11 @@ void hcid_dbus_inquiry_result(bdaddr_t *local, bdaddr_t *peer, uint32_t class,
struct btd_adapter *adapter;
struct btd_device *device;
char local_addr[18], peer_addr[18], *alias, *name, *tmp_name;
- const char *real_alias;
- const char *path, *icon, *paddr = peer_addr;
struct remote_dev_info *dev, match;
- dbus_int16_t tmp_rssi = rssi;
- dbus_bool_t paired, legacy = TRUE;
uint8_t name_type = 0x00;
name_status_t name_status;
int state;
+ dbus_bool_t legacy;
ba2str(local, local_addr);
ba2str(peer, peer_addr);
@@ -698,17 +646,10 @@ void hcid_dbus_inquiry_result(bdaddr_t *local, bdaddr_t *peer, uint32_t class,
return;
}
- if (device)
- paired = device_is_paired(device);
- else
- paired = FALSE;
-
write_remote_class(local, peer, class);
- if (data) {
+ if (data)
write_remote_eir(local, peer, data);
- legacy = FALSE;
- }
/*
* workaround to identify situation when the daemon started and
@@ -763,36 +704,21 @@ void hcid_dbus_inquiry_result(bdaddr_t *local, bdaddr_t *peer, uint32_t class,
}
if (!alias) {
- real_alias = NULL;
-
if (!name) {
alias = g_strdup(peer_addr);
g_strdelimit(alias, ":", '-');
} else
alias = g_strdup(name);
- } else
- real_alias = alias;
+ }
- path = adapter_get_path(adapter);
- icon = class_to_icon(class);
-
- emit_device_found(path, paddr,
- "Address", DBUS_TYPE_STRING, &paddr,
- "Class", DBUS_TYPE_UINT32, &class,
- "Icon", DBUS_TYPE_STRING, &icon,
- "RSSI", DBUS_TYPE_INT16, &tmp_rssi,
- "Name", DBUS_TYPE_STRING, &name,
- "Alias", DBUS_TYPE_STRING, &alias,
- "LegacyPairing", DBUS_TYPE_BOOLEAN, &legacy,
- "Paired", DBUS_TYPE_BOOLEAN, &paired,
- NULL);
+ legacy = (data == NULL);
if (name && name_type != 0x08)
name_status = NAME_SENT;
/* add in the list to track name sent/pending */
- adapter_add_found_device(adapter, peer, rssi, class, real_alias,
- name_status);
+ adapter_update_found_devices(adapter, peer, rssi, class, name, alias,
+ legacy, name_status);
g_free(name);
g_free(alias);
@@ -845,37 +771,9 @@ void hcid_dbus_remote_name(bdaddr_t *local, bdaddr_t *peer, uint8_t status,
dev_info = adapter_search_found_devices(adapter, &match);
if (dev_info) {
- const char *adapter_path = adapter_get_path(adapter);
- const char *icon = class_to_icon(dev_info->class);
- const char *alias, *paddr = dstaddr;
- dbus_int16_t rssi = dev_info->rssi;
- dbus_bool_t legacy, paired;
-
- if (dev_info->alias)
- alias = dev_info->alias;
- else
- alias = name;
-
- if (read_remote_eir(local, peer, NULL) < 0)
- legacy = TRUE;
- else
- legacy = FALSE;
-
- if (device)
- paired = device_is_paired(device);
- else
- paired = FALSE;
-
- emit_device_found(adapter_path, dstaddr,
- "Address", DBUS_TYPE_STRING, &paddr,
- "Class", DBUS_TYPE_UINT32, &dev_info->class,
- "Icon", DBUS_TYPE_STRING, &icon,
- "RSSI", DBUS_TYPE_INT16, &rssi,
- "Name", DBUS_TYPE_STRING, &name,
- "Alias", DBUS_TYPE_STRING, &alias,
- "LegacyPairing", DBUS_TYPE_BOOLEAN, &legacy,
- "Paired", DBUS_TYPE_BOOLEAN, &paired,
- NULL);
+ g_free(dev_info->name);
+ dev_info->name = g_strdup(name);
+ adapter_emit_device_found(adapter, dev_info);
}
if (device)