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);
break;
default:
ERR("Invalid property type: %d", type);
- g_value_unset(attr_value);
return BT_STATUS_FAIL;
}
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) {
return BT_STATUS_FAIL;
}
}
+
g_variant_unref(reply);
- g_value_unset(attr_value);
+ DBG("-");
return BT_STATUS_SUCCESS;
}
*/
#define RFCOMM_DEFAULT_PROFILE_CHANNEL 0
-#define BT_MEDIA_CONTROL_PATH "%s/player0"
-
static char *avrcp_control_path = NULL;
static GDBusConnection *system_conn;
static GDBusProxy *adapter_properties_proxy;
static GDBusProxy *avrcp_ctrl_proxy;
-static GDBusProxy *avrcp_ctrl_properties_proxy;
static GDBusConnection *system_gconn = NULL;
return proxy;
}
-void _bt_set_control_device_path(const char *path)
+void _bt_hal_set_control_device_path(const char *path)
{
if (path == NULL)
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;
}
}
-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];
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;
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;
}
}
-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;
}
}
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)
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;