After destory device, the related properties can't get.
Therefore, device properties need to be saved in device struct.
Change-Id: I114de42f2fa1310d6a316c89dc2d25cfcffdc829
Signed-off-by: Wu Zheng <wu.zheng@intel.com>
}
static bt_adapter_device_discovery_info_s *get_discovery_device_info(
- bluez_device_t *device)
+ adapter_device_discovery_info_t *device_discovery_info)
{
- guint len;
- signed short rssi;
- int paired;
- char *alias, *address;
- char **uuids;
- unsigned int class;
bt_adapter_device_discovery_info_s *device_info;
- if (device == NULL)
- return NULL;
-
device_info = g_new0(bt_adapter_device_discovery_info_s, 1);
if (device_info == NULL) {
ERROR("no memory.");
return NULL;
}
- address = bluez_device_get_property_address(device);
- alias = bluez_device_get_property_alias(device);
- uuids = bluez_device_get_property_uuids(device);
- bluez_device_get_property_class(device, &class);
- bluez_device_get_property_rssi(device, &rssi);
- bluez_device_get_property_paired(device, &paired);
+ device_info->service_count = device_discovery_info->service_count;
+ device_info->remote_address = device_discovery_info->remote_address;
+ device_info->remote_name = device_discovery_info->remote_name;
+ device_info->rssi = device_discovery_info->rssi;
+ device_info->is_bonded = device_discovery_info->is_bonded;
+ device_info->service_uuid = device_discovery_info->service_uuid;
- len = g_strv_length(uuids);
-
- device_info->service_count = len;
- device_info->remote_address = address;
- device_info->remote_name = alias;
- device_info->rssi = rssi;
- device_info->is_bonded = paired;
- device_info->service_uuid = uuids;
-
- divide_device_class(&device_info->bt_class, class);
+ divide_device_class(&device_info->bt_class,
+ device_discovery_info->bt_class);
return device_info;
}
static void free_discovery_device_info(
bt_adapter_device_discovery_info_s *discovery_device_info)
{
- int i;
-
if (discovery_device_info == NULL)
return ;
- g_free(discovery_device_info->remote_address);
- g_free(discovery_device_info->remote_name);
-
- for (i = 0; i < discovery_device_info->service_count; ++i)
- g_free(discovery_device_info->service_uuid[i]);
-
- g_free(discovery_device_info->service_uuid);
g_free(discovery_device_info);
}
static void bluez_paired_device_removed(bluez_device_t *device,
void *user_data)
{
- int paired;
char *device_addr;
- char *address;
struct device_destroy_paired_cb_node *data = user_data;
+ adapter_device_discovery_info_t *device_info;
DBG("");
if (data == NULL)
return;
- address = bluez_device_get_property_address(device);
- bluez_device_get_property_paired(device, &paired);
+ device_info = bluez_get_discovery_device_info(device);
- device_addr = address;
+ device_addr = device_info->remote_address;
/* CAPI function bt_device_bond_destroyed_cb
* parameter 2 is char *, not the const char *
{
bt_adapter_device_discovery_info_s *discovery_device_info;
struct device_destroy_unpaired_cb_node *node = user_data;
+ adapter_device_discovery_info_t *device_info;
if (node == NULL)
return;
- discovery_device_info = get_discovery_device_info(device);
+ device_info = bluez_get_discovery_device_info(device);
+
+ discovery_device_info = get_discovery_device_info(device_info);
if (node->cb)
node->cb(BT_SUCCESS, BT_ADAPTER_DEVICE_DISCOVERY_REMOVED,
static void handle_generic_device_removed(bluez_device_t *device, void *user_data)
{
- int paired;
+ adapter_device_discovery_info_t *device_info;
- if (device == NULL)
+ device_info = bluez_get_discovery_device_info(device);
+
+ if (device_info == NULL)
return;
- bluez_device_get_property_paired(device, &paired);
- if (paired == false)
+ if (device_info->is_bonded == false)
bluez_unpaired_device_removed(device, unpaired_device_removed_node);
else
bluez_paired_device_removed(device, paired_device_removed_node);
{
bt_adapter_device_discovery_info_s *discovery_device_info;
struct device_created_cb_node *node = user_data;
+ adapter_device_discovery_info_t *device_info;
DBG("");
- discovery_device_info = get_discovery_device_info(device);
+
+ device_info = bluez_get_discovery_device_info(device);
+
+ discovery_device_info = get_discovery_device_info(device_info);
DBG("name: %s, uuid: %p, uuid_count: %d", discovery_device_info->remote_name,
discovery_device_info->service_uuid,
device_list = bluez_adapter_get_devices(default_adapter);
for (list = g_list_first(device_list); list; list = next) {
+ adapter_device_discovery_info_t *device_info;
+
+ DBG("device discoverying changed");
+
next = g_list_next(list);
device = list->data;
- discovery_device_info = get_discovery_device_info(device);
+ device_info = bluez_get_discovery_device_info(device);
+
+ discovery_device_info = get_discovery_device_info(device_info);
node->cb(BT_SUCCESS, BT_ADAPTER_DEVICE_DISCOVERY_FOUND,
discovery_device_info, node->user_data);
media_metadata_attributes_t metadata;
} media_player_settings_t;
+typedef struct {
+ char *remote_address;
+ char *remote_name;
+ guint32 bt_class;
+ gint16 rssi;
+ gboolean is_bonded;
+ char **service_uuid;
+ int service_count;
+} adapter_device_discovery_info_t;
+
+adapter_device_discovery_info_t *bluez_get_discovery_device_info(
+ bluez_device_t *device);
+
void bluez_lib_deinit(void);
int bluez_lib_init(void);
gpointer data_received_changed_data;
bluez_device_input_connected_cb_t input_connected_cb;
gpointer input_connected_cb_data;
+
+ adapter_device_discovery_info_t *device_discovery_info;
};
static void hdp_obj_info_free(hdp_obj_info_t *info);
gpointer data_received_changed_data;
bluez_device_input_connected_cb_t input_connected_cb;
gpointer input_connected_cb_data;
+
+ adapter_device_discovery_info_t *device_discovery_info;
};
struct _bluez_gatt_service {
static device_disconnect_cb_t dev_disconnect_cb;
static gpointer dev_disconnect_data;
+static void free_discovery_device_info(
+ adapter_device_discovery_info_t *discovery_device_info)
+{
+ int i;
+
+ if (discovery_device_info == NULL)
+ return;
+
+ g_free(discovery_device_info->remote_address);
+ g_free(discovery_device_info->remote_name);
+
+ for (i = 0; i < discovery_device_info->service_count; ++i)
+ g_free(discovery_device_info->service_uuid[i]);
+
+ g_free(discovery_device_info->service_uuid);
+ g_free(discovery_device_info);
+}
+
+static void update_device_discovery_info(GVariant *changed_properties,
+ adapter_device_discovery_info_t *device_info)
+{
+ gchar *remote_address, *remote_name;
+ gint16 rssi;
+ gboolean paired;
+ guint32 class;
+ char **uuids;
+
+ if (device_info == NULL)
+ return;
+
+ DBG("+");
+
+ if (g_variant_lookup(changed_properties, "Address",
+ "s", &remote_address)) {
+ if (device_info->remote_address)
+ g_free(device_info->remote_address);
+ device_info->remote_address = remote_address;
+ }
+
+ if (g_variant_lookup(changed_properties, "Alias",
+ "s", &remote_name)) {
+ if (device_info->remote_name)
+ g_free(device_info->remote_name);
+ device_info->remote_name = remote_name;
+ }
+
+ if (g_variant_lookup(changed_properties, "RSSI",
+ "n", &rssi))
+ device_info->rssi = rssi;
+
+ if (g_variant_lookup(changed_properties, "Paired",
+ "b", &paired))
+ device_info->is_bonded = paired;
+
+ if (g_variant_lookup(changed_properties, "UUIDs",
+ "ss", &uuids)) {
+ int i;
+
+ for (i = 0; i < device_info->service_count; i++)
+ g_free(device_info->service_uuid[i]);
+
+ g_free(device_info->service_uuid);
+
+ device_info->service_uuid = uuids;
+ device_info->service_count = g_strv_length(uuids);
+ }
+
+ if (g_variant_lookup(changed_properties, "Class",
+ "u", &class))
+ device_info->bt_class = class;
+
+ DBG("-");
+}
+
+static adapter_device_discovery_info_t *get_discovery_device_info(
+ bluez_device_t *device)
+{
+ guint len;
+ signed short rssi;
+ int paired;
+ char *alias, *address;
+ char **uuids;
+ unsigned int class;
+ adapter_device_discovery_info_t *device_info;
+
+ if (device == NULL)
+ return NULL;
+
+ device_info = g_new0(adapter_device_discovery_info_t, 1);
+ if (device_info == NULL) {
+ ERROR("no memory.");
+ return NULL;
+ }
+
+ address = bluez_device_get_property_address(device);
+ alias = bluez_device_get_property_alias(device);
+ uuids = bluez_device_get_property_uuids(device);
+ bluez_device_get_property_class(device, &class);
+ bluez_device_get_property_rssi(device, &rssi);
+ bluez_device_get_property_paired(device, &paired);
+
+ len = g_strv_length(uuids);
+
+ device_info->service_count = len;
+ device_info->remote_address = address;
+ device_info->remote_name = alias;
+ device_info->rssi = rssi;
+ device_info->is_bonded = paired;
+ device_info->service_uuid = uuids;
+
+ device_info->bt_class = class;
+
+ return device_info;
+}
+
+adapter_device_discovery_info_t *bluez_get_discovery_device_info(
+ bluez_device_t *device)
+{
+ if (device)
+ return device->device_discovery_info;
+
+ return NULL;
+}
+
static struct _bluez_object *get_object_from_path(const char *path)
{
return g_hash_table_lookup(bluez_object_hash, (gpointer) path);
DBG("properties %s", properties);
+ update_device_discovery_info(changed_properties,
+ device->device_discovery_info);
+
if (device->device_paired_cb)
handle_device_paired(changed_properties, user_data);
device->interface = interface;
device->proxy = proxy;
device->property_proxy = property_proxy;
+ device->device_discovery_info =
+ get_discovery_device_info(device);
g_signal_connect(proxy, "g-properties-changed",
G_CALLBACK(device_properties_changed), device);
} else if (g_strcmp0(iface_name, MEDIACONTROL_INTERFACE) == 0) {
g_free(device->object_path);
g_object_unref(device->interface);
g_object_unref(device->proxy);
+
+ if (device->device_discovery_info)
+ free_discovery_device_info(
+ device->device_discovery_info);
if (device->control_proxy)
g_object_unref(device->control_proxy);
if (device->control_interface)