Get the related devices properties after devices destory 84/26484/1
authorwu zheng <wu.zheng@intel.com>
Thu, 21 Aug 2014 10:54:24 +0000 (18:54 +0800)
committerwu zheng <wu.zheng@intel.com>
Thu, 21 Aug 2014 10:54:24 +0000 (18:54 +0800)
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>
capi/bluetooth.c
include/bluez.h
lib/bluez-hdp.c
lib/bluez.c

index 6040bbb..f162a1f 100644 (file)
@@ -256,42 +256,25 @@ static void divide_device_class(bt_class_s *bt_class, unsigned int class)
 }
 
 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;
 }
@@ -299,18 +282,9 @@ static bt_adapter_device_discovery_info_s *get_discovery_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);
 }
 
@@ -391,20 +365,18 @@ void adapter_powered_changed(bluez_adapter_t *adater,
 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 *
@@ -419,11 +391,14 @@ static void bluez_unpaired_device_removed(bluez_device_t *device,
 {
        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,
@@ -434,13 +409,14 @@ static void bluez_unpaired_device_removed(bluez_device_t *device,
 
 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);
@@ -770,9 +746,13 @@ static void bluez_device_created(bluez_device_t *device, void *user_data)
 {
        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,
@@ -817,11 +797,17 @@ static void bluez_adapter_discovering_changed(bluez_adapter_t *adapter,
 
        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);
index d03589b..67d0c32 100644 (file)
@@ -105,6 +105,19 @@ typedef struct {
        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);
 
index 07b8dce..a5e68e4 100644 (file)
@@ -61,6 +61,8 @@ struct _bluez_device {
        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);
index a08b652..305a1d9 100644 (file)
@@ -183,6 +183,8 @@ struct _bluez_device {
        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 {
@@ -246,6 +248,130 @@ static gpointer dev_connect_data;
 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);
@@ -685,6 +811,9 @@ static void device_properties_changed(GDBusProxy *proxy,
 
        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);
 
@@ -942,6 +1071,8 @@ static void parse_bluez_device_interfaces(gpointer data, gpointer 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) {
@@ -1248,6 +1379,10 @@ static void destruct_bluez_device(gpointer data)
        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)