AVRCP CT: Fix invalid object_path/proxy issue 56/150156/1
authorAtul Rai <a.rai@samsung.com>
Mon, 11 Sep 2017 11:55:40 +0000 (17:25 +0530)
committerAtul Rai <a.rai@samsung.com>
Thu, 14 Sep 2017 11:43:58 +0000 (17:13 +0530)
Change-Id: I45094ae1069ac190820b4cb77615da9393cf73ae
Signed-off-by: Atul Rai <a.rai@samsung.com>
bt-oal/bluez_hal/src/bt-hal-avrcp-ctrl-dbus-handler.c
bt-oal/bluez_hal/src/bt-hal-dbus-common-utils.c
bt-oal/bluez_hal/src/bt-hal-dbus-common-utils.h
bt-oal/bluez_hal/src/bt-hal-event-receiver.c

index a13328d..949f9db 100644 (file)
@@ -343,13 +343,11 @@ static const char *__bt_media_type_to_str(int type)
 
 bt_status_t _bt_hal_dbus_handler_avrcp_ctrl_set_property(bt_bdaddr_t *bd_addr, uint8_t type, uint8_t value)
 {
-       GValue *attr_value = NULL;
        GVariant *reply, *param = NULL;
        GError *err = NULL;
        GDBusProxy *proxy = NULL;
 
-       g_value_init(attr_value, G_TYPE_STRING);
-
+       DBG("+");
        switch (type) {
        case BTRC_PLAYER_ATTR_EQUALIZER:
                param = g_variant_new("s", equalizer_status[value].property);
@@ -369,7 +367,6 @@ bt_status_t _bt_hal_dbus_handler_avrcp_ctrl_set_property(bt_bdaddr_t *bd_addr, u
                break;
        default:
                ERR("Invalid property type: %d", type);
-               g_value_unset(attr_value);
                return BT_STATUS_FAIL;
        }
 
@@ -388,8 +385,7 @@ bt_status_t _bt_hal_dbus_handler_avrcp_ctrl_set_property(bt_bdaddr_t *bd_addr, u
                                BT_HAL_PLAYER_CONTROL_INTERFACE,
                                __bt_media_type_to_str(type), param),
                        G_DBUS_CALL_FLAGS_NONE, -1, NULL, &err);
-       g_variant_unref(param);
-
+       g_object_unref(proxy);
        if (!reply) {
                ERR("Can't get managed objects");
                if (err) {
@@ -398,7 +394,8 @@ bt_status_t _bt_hal_dbus_handler_avrcp_ctrl_set_property(bt_bdaddr_t *bd_addr, u
                        return BT_STATUS_FAIL;
                }
        }
+
        g_variant_unref(reply);
-       g_value_unset(attr_value);
+       DBG("-");
        return BT_STATUS_SUCCESS;
 }
index b66560e..0606864 100644 (file)
@@ -54,8 +54,6 @@
  */
 #define RFCOMM_DEFAULT_PROFILE_CHANNEL 0
 
-#define BT_MEDIA_CONTROL_PATH "%s/player0"
-
 static char *avrcp_control_path = NULL;
 
 static GDBusConnection *system_conn;
@@ -66,7 +64,6 @@ static GDBusProxy *profile_gproxy = NULL;
 
 static GDBusProxy *adapter_properties_proxy;
 static GDBusProxy *avrcp_ctrl_proxy;
-static GDBusProxy *avrcp_ctrl_properties_proxy;
 
 static GDBusConnection *system_gconn = NULL;
 
@@ -218,7 +215,7 @@ static GDBusProxy *__bt_init_adapter_properties_proxy(void)
        return proxy;
 }
 
-void _bt_set_control_device_path(const char *path)
+void _bt_hal_set_control_device_path(const char *path)
 {
 
        if (path == NULL)
@@ -229,7 +226,7 @@ void _bt_set_control_device_path(const char *path)
        avrcp_control_path = g_strdup(path);
 }
 
-void _bt_remove_control_device_path(const char *path)
+void _bt_hal_remove_control_device_path(const char *path)
 {
        if (path == NULL)
                return;
@@ -242,9 +239,63 @@ void _bt_remove_control_device_path(const char *path)
        }
 }
 
-char *_bt_get_control_device_path(bt_bdaddr_t *bd_addr)
+static char *__bt_hal_extract_control_device_path(GVariantIter *iter, char *address)
+{
+       char *object_path = NULL;
+       char *interface_str = NULL;
+       char device_address[BT_HAL_ADDRESS_STRING_SIZE] = { 0 };
+
+       /* Parse the signature: oa{sa{sv}}} */
+       while (g_variant_iter_loop(iter, "{&oa{sa{sv}}}", &object_path, &interface_str)) {
+               if (object_path == NULL)
+                       return  NULL;
+
+               if (g_strcmp0(interface_str, BT_HAL_PLAYER_CONTROL_INTERFACE) == 0) {
+                       _bt_convert_device_path_to_address(object_path, device_address);
+                       if (g_strcmp0(address, device_address) == 0)
+                               return g_strdup(object_path);
+               }
+       }
+       return NULL;
+}
+
+static char *__bt_hal_get_control_device_object_path(char *address)
+{
+       char *object_path = NULL;
+       GDBusConnection *conn;
+       GDBusProxy *manager_proxy;
+       GVariant *result = NULL;
+       GVariantIter *iter = NULL;
+
+       conn = _bt_get_system_gconn();
+       if (conn == NULL)
+               return NULL;
+
+       manager_proxy = _bt_hal_get_manager_proxy();
+       if (manager_proxy == NULL)
+               return  NULL;
+
+       result = g_dbus_proxy_call_sync(manager_proxy, "GetManagedObjects",
+                       NULL,
+                       G_DBUS_CALL_FLAGS_NONE,
+                       -1,
+                       NULL,
+                       NULL);
+       if (!result) {
+               ERR("Can't get managed objects");
+               return NULL;
+       }
+
+       /* signature of GetManagedObjects:  a{oa{sa{sv}}} */
+       g_variant_get(result, "(a{oa{sa{sv}}})", &iter);
+       object_path = __bt_hal_extract_control_device_path(iter, address);
+       g_variant_iter_free(iter);
+       g_variant_unref(result);
+       return object_path;
+}
+
+char *_bt_hal_get_control_device_path(bt_bdaddr_t *bd_addr)
 {
-       char *adapter_path;
        char *control_path;
        char connected_address[BT_HAL_ADDRESS_STRING_SIZE];
 
@@ -257,13 +308,10 @@ char *_bt_get_control_device_path(bt_bdaddr_t *bd_addr)
 
        DBG("device address = %s", connected_address);
 
-       adapter_path = _bt_get_device_object_path(connected_address);
-       if (adapter_path == NULL)
+       control_path = __bt_hal_get_control_device_object_path(connected_address);
+       if (control_path == NULL)
                return NULL;
 
-       control_path = g_strdup_printf(BT_MEDIA_CONTROL_PATH, adapter_path);
-       g_free(adapter_path);
-
        avrcp_control_path = control_path;
        DBG("control_path = %s", control_path);
        return control_path;
@@ -295,7 +343,7 @@ static GDBusProxy *__bt_init_avrcp_ctrl_proxy(bt_bdaddr_t *bd_addr)
                return  NULL;
        }
 
-       control_path = _bt_get_control_device_path(bd_addr);
+       control_path = _bt_hal_get_control_device_path(bd_addr);
        if (control_path == NULL) {
                return  NULL;
        }
@@ -375,14 +423,15 @@ GDBusProxy *_bt_get_avrcp_ctrl_proxy(bt_bdaddr_t *bd_addr)
 
 }
 
-static GDBusProxy *__bt_init_avrcp_ctrl_properties_proxy(bt_bdaddr_t *bd_addr)
+GDBusProxy *_bt_get_avrcp_ctrl_properties_proxy(bt_bdaddr_t *bd_addr)
 {
        GDBusProxy *proxy;
        GError *error = NULL;
        char *control_path = NULL;
        GDBusConnection *conn = NULL;
 
-       control_path = _bt_get_control_device_path(bd_addr);
+       DBG("+");
+       control_path = _bt_hal_get_control_device_path(bd_addr);
        if (control_path == NULL) {
                return  NULL;
        }
@@ -405,16 +454,9 @@ static GDBusProxy *__bt_init_avrcp_ctrl_properties_proxy(bt_bdaddr_t *bd_addr)
                }
                return NULL;
        }
-       avrcp_ctrl_properties_proxy = proxy;
-       return proxy;
-}
-
 
-
-GDBusProxy *_bt_get_avrcp_ctrl_properties_proxy(bt_bdaddr_t *bd_addr)
-{
-       return (avrcp_ctrl_properties_proxy) ? avrcp_ctrl_properties_proxy :
-               __bt_init_avrcp_ctrl_properties_proxy(bd_addr);
+       DBG("-");
+       return proxy;
 }
 
 GDBusProxy *_bt_get_adapter_properties_proxy(void)
index 06d0eb0..a03d3ab 100644 (file)
@@ -459,7 +459,10 @@ int _bt_discover_service_uuids(char *address, char *remote_uuid);
 int _bt_register_new_gdbus_object(const char *path, bt_hal_new_connection_cb cb);
 void _bt_unregister_gdbus_object(int object_id);
 
-char *_bt_get_control_device_path(bt_bdaddr_t *bd_addr);
+char *_bt_hal_get_control_device_path(bt_bdaddr_t *bd_addr);
+void _bt_hal_set_control_device_path(const char *path);
+void _bt_hal_remove_control_device_path(const char *path);
+
 
 int bt_hal_gatt_convert_prop2string(
                         bt_hal_gatt_characteristic_property_t properties,
index 35d3988..885a030 100644 (file)
@@ -827,14 +827,26 @@ static gboolean __bt_hal_event_manager(gpointer data)
                                DBG("Device path : %s ", obj_path);
                                __bt_hal_handle_device_event(value, param->parameters);
                        } else if (bt_event == BT_HAL_AVRCP_CONTROL_EVENT) {
-                               /*TODO: Handle AVRCP control events from BlueZ */
+                               DBG("Device path : %s ", obj_path);
+                               _bt_hal_set_control_device_path(obj_path);
                        }
                }
                g_variant_unref(value);
 
        } else if (strcasecmp(param->signal_name, "InterfacesRemoved") == 0) {
+               char *str;
+               GVariantIter *iter;
+
                /*TODO: Handle Interfaces Removed Signal from stack */
                DBG("Manager Event: Signal Name: InterfacesRemoved");
+
+               g_variant_get(param->parameters, "(&oas)", &obj_path, &iter);
+               DBG("Device path : %s ", obj_path);
+               while (g_variant_iter_loop(iter, "s", &str)) {
+                       if (g_strcmp0(str, BT_HAL_PLAYER_CONTROL_INTERFACE) == 0)
+                               _bt_hal_remove_control_device_path(obj_path);
+               }
+               g_variant_iter_free(iter);
        } else if (strcasecmp(param->signal_name, "NameOwnerChanged") == 0) {
                char *name = NULL;
                char *previous = NULL;