diff options
author | Luiz Augusto von Dentz <luiz.dentz@openbossa.org> | 2009-04-08 19:39:43 -0300 |
---|---|---|
committer | Johan Hedberg <johan.hedberg@nokia.com> | 2009-04-09 11:38:53 +0300 |
commit | 74478aebb19c6d5dce36ddde2696fae29a6bf80f (patch) | |
tree | 6bb887a4c677f601734e65ae6d0ec6ac75c9d975 /src | |
parent | 8fd334315e5a78a490c5ec89c56fa8a484439379 (diff) | |
download | bluez-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.c | 126 | ||||
-rw-r--r-- | src/adapter.h | 9 | ||||
-rw-r--r-- | src/dbus-hci.c | 120 |
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) |