summaryrefslogtreecommitdiff
path: root/cras/src/server/cras_bt_manager.c
diff options
context:
space:
mode:
Diffstat (limited to 'cras/src/server/cras_bt_manager.c')
-rw-r--r--cras/src/server/cras_bt_manager.c619
1 files changed, 0 insertions, 619 deletions
diff --git a/cras/src/server/cras_bt_manager.c b/cras/src/server/cras_bt_manager.c
deleted file mode 100644
index a7103406..00000000
--- a/cras/src/server/cras_bt_manager.c
+++ /dev/null
@@ -1,619 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <dbus/dbus.h>
-#include <errno.h>
-#include <stdint.h>
-#include <stdlib.h>
-#include <string.h>
-#include <syslog.h>
-
-#include "cras_bt_constants.h"
-#include "cras_bt_manager.h"
-#include "cras_bt_adapter.h"
-#include "cras_bt_device.h"
-#include "cras_bt_endpoint.h"
-#include "cras_bt_log.h"
-#include "cras_bt_player.h"
-#include "cras_bt_profile.h"
-#include "cras_bt_transport.h"
-#include "cras_bt_battery_provider.h"
-#include "utlist.h"
-
-struct cras_bt_event_log *btlog;
-
-static void cras_bt_interface_added(DBusConnection *conn,
- const char *object_path,
- const char *interface_name,
- DBusMessageIter *properties_array_iter)
-{
- if (strcmp(interface_name, BLUEZ_INTERFACE_ADAPTER) == 0) {
- struct cras_bt_adapter *adapter;
-
- adapter = cras_bt_adapter_get(object_path);
- if (adapter) {
- cras_bt_adapter_update_properties(
- adapter, properties_array_iter, NULL);
- } else {
- BTLOG(btlog, BT_ADAPTER_ADDED, 0, 0);
- adapter = cras_bt_adapter_create(conn, object_path);
- if (adapter) {
- cras_bt_adapter_update_properties(
- adapter, properties_array_iter, NULL);
-
- syslog(LOG_INFO, "Bluetooth Adapter: %s added",
- cras_bt_adapter_address(adapter));
- } else {
- syslog(LOG_WARNING,
- "Failed to create Bluetooth Adapter: %s",
- object_path);
- }
- }
-
- } else if (strcmp(interface_name, BLUEZ_INTERFACE_MEDIA) == 0) {
- struct cras_bt_adapter *adapter;
-
- adapter = cras_bt_adapter_get(object_path);
- if (adapter) {
- cras_bt_register_endpoints(conn, adapter);
- cras_bt_register_player(conn, adapter);
-
- syslog(LOG_INFO,
- "Bluetooth Endpoint and/or Player: %s added",
- cras_bt_adapter_address(adapter));
- } else {
- syslog(LOG_WARNING,
- "Failed to create Bluetooth Endpoint and/or Player: %s",
- object_path);
- }
-
- } else if (strcmp(interface_name, BLUEZ_PROFILE_MGMT_INTERFACE) == 0) {
- cras_bt_register_profiles(conn);
-
- syslog(LOG_INFO, "Bluetooth Profile Manager added");
-
- } else if (strcmp(interface_name, BLUEZ_INTERFACE_DEVICE) == 0) {
- struct cras_bt_device *device;
-
- device = cras_bt_device_get(object_path);
- if (device) {
- cras_bt_device_update_properties(
- device, properties_array_iter, NULL);
- } else {
- device = cras_bt_device_create(conn, object_path);
- if (device) {
- cras_bt_device_update_properties(
- device, properties_array_iter, NULL);
-
- syslog(LOG_INFO, "Bluetooth Device: %s added",
- cras_bt_device_address(device));
- } else {
- syslog(LOG_WARNING,
- "Failed to create Bluetooth Device: %s",
- object_path);
- }
- }
-
- } else if (strcmp(interface_name, BLUEZ_INTERFACE_MEDIA_TRANSPORT) ==
- 0) {
- struct cras_bt_transport *transport;
-
- transport = cras_bt_transport_get(object_path);
- if (transport) {
- cras_bt_transport_update_properties(
- transport, properties_array_iter, NULL);
- } else {
- transport = cras_bt_transport_create(conn, object_path);
- if (transport) {
- cras_bt_transport_update_properties(
- transport, properties_array_iter, NULL);
-
- syslog(LOG_INFO,
- "Bluetooth Transport: %s added",
- cras_bt_transport_object_path(
- transport));
- } else {
- syslog(LOG_WARNING,
- "Failed to create Bluetooth Transport: "
- "%s",
- object_path);
- }
- }
- } else if (strcmp(interface_name,
- BLUEZ_INTERFACE_BATTERY_PROVIDER_MANAGER) == 0) {
- struct cras_bt_adapter *adapter;
- int ret;
-
- syslog(LOG_INFO,
- "Bluetooth Battery Provider Manager available");
-
- adapter = cras_bt_adapter_get(object_path);
- if (adapter) {
- syslog(LOG_INFO,
- "Registering Battery Provider for adapter %s",
- cras_bt_adapter_address(adapter));
- ret = cras_bt_register_battery_provider(conn, adapter);
- if (ret != 0) {
- syslog(LOG_ERR,
- "Error registering Battery Provider "
- "for adapter %s: %s",
- cras_bt_adapter_address(adapter),
- strerror(-ret));
- }
- } else {
- syslog(LOG_WARNING,
- "Adapter not available when trying to create "
- "Battery Provider");
- }
- }
-}
-
-static void cras_bt_interface_removed(DBusConnection *conn,
- const char *object_path,
- const char *interface_name)
-{
- if (strcmp(interface_name, BLUEZ_INTERFACE_ADAPTER) == 0) {
- struct cras_bt_adapter *adapter;
-
- BTLOG(btlog, BT_ADAPTER_REMOVED, 0, 0);
- adapter = cras_bt_adapter_get(object_path);
- if (adapter) {
- syslog(LOG_INFO, "Bluetooth Adapter: %s removed",
- cras_bt_adapter_address(adapter));
- cras_bt_adapter_destroy(adapter);
- }
-
- } else if (strcmp(interface_name, BLUEZ_INTERFACE_DEVICE) == 0) {
- struct cras_bt_device *device;
-
- device = cras_bt_device_get(object_path);
- if (device) {
- syslog(LOG_INFO, "Bluetooth Device: %s removed",
- cras_bt_device_address(device));
- cras_bt_device_remove(device);
- }
-
- } else if (strcmp(interface_name, BLUEZ_INTERFACE_MEDIA_TRANSPORT) ==
- 0) {
- struct cras_bt_transport *transport;
-
- transport = cras_bt_transport_get(object_path);
- if (transport) {
- syslog(LOG_INFO, "Bluetooth Transport: %s removed",
- cras_bt_transport_object_path(transport));
- cras_bt_transport_remove(transport);
- }
- } else if (strcmp(interface_name,
- BLUEZ_INTERFACE_BATTERY_PROVIDER_MANAGER) == 0) {
- syslog(LOG_INFO, "Bluetooth Battery Provider Manager removed");
- cras_bt_battery_provider_reset();
- }
-}
-
-static void cras_bt_update_properties(DBusConnection *conn,
- const char *object_path,
- const char *interface_name,
- DBusMessageIter *properties_array_iter,
- DBusMessageIter *invalidated_array_iter)
-{
- if (strcmp(interface_name, BLUEZ_INTERFACE_ADAPTER) == 0) {
- struct cras_bt_adapter *adapter;
-
- adapter = cras_bt_adapter_get(object_path);
- if (adapter) {
- cras_bt_adapter_update_properties(
- adapter, properties_array_iter,
- invalidated_array_iter);
- }
-
- } else if (strcmp(interface_name, BLUEZ_INTERFACE_DEVICE) == 0) {
- struct cras_bt_device *device;
-
- device = cras_bt_device_get(object_path);
- if (device) {
- cras_bt_device_update_properties(
- device, properties_array_iter,
- invalidated_array_iter);
- }
-
- } else if (strcmp(interface_name, BLUEZ_INTERFACE_MEDIA_TRANSPORT) ==
- 0) {
- struct cras_bt_transport *transport;
-
- transport = cras_bt_transport_get(object_path);
- if (transport) {
- cras_bt_transport_update_properties(
- transport, properties_array_iter,
- invalidated_array_iter);
- }
- }
-}
-
-/* Destroys all bt related stuff. The reset functions must be called in
- * reverse order of the adapter -> device -> profile(s) hierarchy.
- */
-static void cras_bt_reset()
-{
- BTLOG(btlog, BT_RESET, 0, 0);
- cras_bt_endpoint_reset();
- cras_bt_transport_reset();
- cras_bt_profile_reset();
- cras_bt_device_reset();
- cras_bt_adapter_reset();
-}
-
-static void cras_bt_on_get_managed_objects(DBusPendingCall *pending_call,
- void *data)
-{
- DBusConnection *conn = (DBusConnection *)data;
- DBusMessage *reply;
- DBusMessageIter message_iter, object_array_iter;
-
- reply = dbus_pending_call_steal_reply(pending_call);
- dbus_pending_call_unref(pending_call);
-
- if (dbus_message_get_type(reply) == DBUS_MESSAGE_TYPE_ERROR) {
- syslog(LOG_WARNING, "GetManagedObjects returned error: %s",
- dbus_message_get_error_name(reply));
- dbus_message_unref(reply);
- return;
- }
-
- if (!dbus_message_has_signature(reply, "a{oa{sa{sv}}}")) {
- syslog(LOG_WARNING, "Bad GetManagedObjects reply received");
- dbus_message_unref(reply);
- return;
- }
-
- dbus_message_iter_init(reply, &message_iter);
- dbus_message_iter_recurse(&message_iter, &object_array_iter);
-
- while (dbus_message_iter_get_arg_type(&object_array_iter) !=
- DBUS_TYPE_INVALID) {
- DBusMessageIter object_dict_iter, interface_array_iter;
- const char *object_path;
-
- dbus_message_iter_recurse(&object_array_iter,
- &object_dict_iter);
-
- dbus_message_iter_get_basic(&object_dict_iter, &object_path);
- dbus_message_iter_next(&object_dict_iter);
-
- dbus_message_iter_recurse(&object_dict_iter,
- &interface_array_iter);
-
- while (dbus_message_iter_get_arg_type(&interface_array_iter) !=
- DBUS_TYPE_INVALID) {
- DBusMessageIter interface_dict_iter;
- DBusMessageIter properties_array_iter;
- const char *interface_name;
-
- dbus_message_iter_recurse(&interface_array_iter,
- &interface_dict_iter);
-
- dbus_message_iter_get_basic(&interface_dict_iter,
- &interface_name);
- dbus_message_iter_next(&interface_dict_iter);
-
- dbus_message_iter_recurse(&interface_dict_iter,
- &properties_array_iter);
-
- cras_bt_interface_added(conn, object_path,
- interface_name,
- &properties_array_iter);
-
- dbus_message_iter_next(&interface_array_iter);
- }
-
- dbus_message_iter_next(&object_array_iter);
- }
-
- dbus_message_unref(reply);
-}
-
-static int cras_bt_get_managed_objects(DBusConnection *conn)
-{
- DBusMessage *method_call;
- DBusPendingCall *pending_call;
-
- method_call =
- dbus_message_new_method_call(BLUEZ_SERVICE, "/",
- DBUS_INTERFACE_OBJECT_MANAGER,
- "GetManagedObjects");
- if (!method_call)
- return -ENOMEM;
-
- pending_call = NULL;
- if (!dbus_connection_send_with_reply(conn, method_call, &pending_call,
- DBUS_TIMEOUT_USE_DEFAULT)) {
- dbus_message_unref(method_call);
- return -ENOMEM;
- }
-
- dbus_message_unref(method_call);
- if (!pending_call)
- return -EIO;
-
- if (!dbus_pending_call_set_notify(
- pending_call, cras_bt_on_get_managed_objects, conn, NULL)) {
- dbus_pending_call_cancel(pending_call);
- dbus_pending_call_unref(pending_call);
- return -ENOMEM;
- }
-
- return 0;
-}
-
-static DBusHandlerResult cras_bt_handle_name_owner_changed(DBusConnection *conn,
- DBusMessage *message,
- void *arg)
-{
- DBusError dbus_error;
- const char *service_name, *old_owner, *new_owner;
-
- if (!dbus_message_is_signal(message, DBUS_INTERFACE_DBUS,
- "NameOwnerChanged"))
- return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-
- dbus_error_init(&dbus_error);
- if (!dbus_message_get_args(message, &dbus_error, DBUS_TYPE_STRING,
- &service_name, DBUS_TYPE_STRING, &old_owner,
- DBUS_TYPE_STRING, &new_owner,
- DBUS_TYPE_INVALID)) {
- syslog(LOG_WARNING, "Bad NameOwnerChanged signal received: %s",
- dbus_error.message);
- dbus_error_free(&dbus_error);
- return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
- }
-
- syslog(LOG_INFO, "Bluetooth daemon disconnected from the bus.");
- cras_bt_reset();
-
- if (strlen(new_owner) > 0)
- cras_bt_get_managed_objects(conn);
-
- return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult cras_bt_handle_interfaces_added(DBusConnection *conn,
- DBusMessage *message,
- void *arg)
-{
- DBusMessageIter message_iter, interface_array_iter;
- const char *object_path;
-
- if (!dbus_message_is_signal(message, DBUS_INTERFACE_OBJECT_MANAGER,
- "InterfacesAdded"))
- return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-
- if (!dbus_message_has_signature(message, "oa{sa{sv}}")) {
- syslog(LOG_WARNING, "Bad InterfacesAdded signal received");
- return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
- }
-
- dbus_message_iter_init(message, &message_iter);
-
- dbus_message_iter_get_basic(&message_iter, &object_path);
- dbus_message_iter_next(&message_iter);
-
- dbus_message_iter_recurse(&message_iter, &interface_array_iter);
-
- while (dbus_message_iter_get_arg_type(&interface_array_iter) !=
- DBUS_TYPE_INVALID) {
- DBusMessageIter interface_dict_iter, properties_array_iter;
- const char *interface_name;
-
- dbus_message_iter_recurse(&interface_array_iter,
- &interface_dict_iter);
-
- dbus_message_iter_get_basic(&interface_dict_iter,
- &interface_name);
- dbus_message_iter_next(&interface_dict_iter);
-
- dbus_message_iter_recurse(&interface_dict_iter,
- &properties_array_iter);
-
- cras_bt_interface_added(conn, object_path, interface_name,
- &properties_array_iter);
-
- dbus_message_iter_next(&interface_array_iter);
- }
-
- return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult cras_bt_handle_interfaces_removed(DBusConnection *conn,
- DBusMessage *message,
- void *arg)
-{
- DBusMessageIter message_iter, interface_array_iter;
- const char *object_path;
-
- if (!dbus_message_is_signal(message, DBUS_INTERFACE_OBJECT_MANAGER,
- "InterfacesRemoved"))
- return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-
- if (!dbus_message_has_signature(message, "oas")) {
- syslog(LOG_WARNING, "Bad InterfacesRemoved signal received");
- return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
- }
-
- dbus_message_iter_init(message, &message_iter);
-
- dbus_message_iter_get_basic(&message_iter, &object_path);
- dbus_message_iter_next(&message_iter);
-
- dbus_message_iter_recurse(&message_iter, &interface_array_iter);
-
- while (dbus_message_iter_get_arg_type(&interface_array_iter) !=
- DBUS_TYPE_INVALID) {
- const char *interface_name;
-
- dbus_message_iter_get_basic(&interface_array_iter,
- &interface_name);
-
- cras_bt_interface_removed(conn, object_path, interface_name);
-
- dbus_message_iter_next(&interface_array_iter);
- }
-
- return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult cras_bt_handle_properties_changed(DBusConnection *conn,
- DBusMessage *message,
- void *arg)
-{
- DBusMessageIter message_iter, properties_array_iter;
- DBusMessageIter invalidated_array_iter;
- const char *object_path, *interface_name;
-
- if (!dbus_message_is_signal(message, DBUS_INTERFACE_PROPERTIES,
- "PropertiesChanged"))
- return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-
- if (!dbus_message_has_signature(message, "sa{sv}as")) {
- syslog(LOG_WARNING, "Bad PropertiesChanged signal received");
- return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
- }
-
- object_path = dbus_message_get_path(message);
-
- dbus_message_iter_init(message, &message_iter);
-
- dbus_message_iter_get_basic(&message_iter, &interface_name);
- dbus_message_iter_next(&message_iter);
-
- dbus_message_iter_recurse(&message_iter, &properties_array_iter);
- dbus_message_iter_next(&message_iter);
-
- dbus_message_iter_recurse(&message_iter, &invalidated_array_iter);
-
- cras_bt_update_properties(conn, object_path, interface_name,
- &properties_array_iter,
- &invalidated_array_iter);
-
- return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-void cras_bt_start(DBusConnection *conn)
-{
- DBusError dbus_error;
-
- btlog = cras_bt_event_log_init();
-
- dbus_error_init(&dbus_error);
-
- /* Inform the bus daemon which signals we wish to receive. */
- dbus_bus_add_match(conn,
- "type='signal',"
- "sender='" DBUS_SERVICE_DBUS "',"
- "interface='" DBUS_INTERFACE_DBUS "',"
- "member='NameOwnerChanged',"
- "arg0='" BLUEZ_SERVICE "'",
- &dbus_error);
- if (dbus_error_is_set(&dbus_error))
- goto add_match_error;
-
- dbus_bus_add_match(conn,
- "type='signal',"
- "sender='" BLUEZ_SERVICE "',"
- "interface='" DBUS_INTERFACE_OBJECT_MANAGER "',"
- "member='InterfacesAdded'",
- &dbus_error);
- if (dbus_error_is_set(&dbus_error))
- goto add_match_error;
-
- dbus_bus_add_match(conn,
- "type='signal',"
- "sender='" BLUEZ_SERVICE "',"
- "interface='" DBUS_INTERFACE_OBJECT_MANAGER "',"
- "member='InterfacesRemoved'",
- &dbus_error);
- if (dbus_error_is_set(&dbus_error))
- goto add_match_error;
-
- dbus_bus_add_match(conn,
- "type='signal',"
- "sender='" BLUEZ_SERVICE "',"
- "interface='" DBUS_INTERFACE_PROPERTIES "',"
- "member='PropertiesChanged'",
- &dbus_error);
- if (dbus_error_is_set(&dbus_error))
- goto add_match_error;
-
- /* Install filter functions to handle the signals we receive. */
- if (!dbus_connection_add_filter(conn, cras_bt_handle_name_owner_changed,
- NULL, NULL))
- goto add_filter_error;
-
- if (!dbus_connection_add_filter(conn, cras_bt_handle_interfaces_added,
- NULL, NULL))
- goto add_filter_error;
-
- if (!dbus_connection_add_filter(conn, cras_bt_handle_interfaces_removed,
- NULL, NULL))
- goto add_filter_error;
-
- if (!dbus_connection_add_filter(conn, cras_bt_handle_properties_changed,
- NULL, NULL))
- goto add_filter_error;
-
- cras_bt_get_managed_objects(conn);
- return;
-
-add_match_error:
- syslog(LOG_WARNING, "Couldn't setup Bluetooth device monitoring: %s",
- dbus_error.message);
- dbus_error_free(&dbus_error);
- cras_bt_stop(conn);
- return;
-
-add_filter_error:
- syslog(LOG_WARNING, "Couldn't setup Bluetooth device monitoring: %s",
- strerror(ENOMEM));
- cras_bt_stop(conn);
- return;
-}
-
-void cras_bt_stop(DBusConnection *conn)
-{
- cras_bt_reset();
-
- dbus_bus_remove_match(conn,
- "type='signal',"
- "sender='" DBUS_SERVICE_DBUS "',"
- "interface='" DBUS_INTERFACE_DBUS "',"
- "member='NameOwnerChanged',"
- "arg0='" BLUEZ_SERVICE "'",
- NULL);
- dbus_bus_remove_match(conn,
- "type='signal',"
- "sender='" BLUEZ_SERVICE "',"
- "interface='" DBUS_INTERFACE_OBJECT_MANAGER "',"
- "member='InterfacesAdded'",
- NULL);
- dbus_bus_remove_match(conn,
- "type='signal',"
- "sender='" BLUEZ_SERVICE "',"
- "interface='" DBUS_INTERFACE_OBJECT_MANAGER "',"
- "member='InterfacesRemoved'",
- NULL);
- dbus_bus_remove_match(conn,
- "type='signal',"
- "sender='" BLUEZ_SERVICE "',"
- "interface='" DBUS_INTERFACE_PROPERTIES "',"
- "member='PropertiesChanged'",
- NULL);
-
- dbus_connection_remove_filter(conn, cras_bt_handle_name_owner_changed,
- NULL);
- dbus_connection_remove_filter(conn, cras_bt_handle_interfaces_added,
- NULL);
- dbus_connection_remove_filter(conn, cras_bt_handle_interfaces_removed,
- NULL);
- dbus_connection_remove_filter(conn, cras_bt_handle_properties_changed,
- NULL);
-}