Chromium Code Reviews| Index: device/bluetooth/bluez/bluetooth_adapter_bluez.cc |
| diff --git a/device/bluetooth/bluez/bluetooth_adapter_bluez.cc b/device/bluetooth/bluez/bluetooth_adapter_bluez.cc |
| index 758e6b6f3d96176c88d10dfd5e0f096f25d2eb79..60dc8cc3d4f0189cb417d444d404bcde4208b045 100644 |
| --- a/device/bluetooth/bluez/bluetooth_adapter_bluez.cc |
| +++ b/device/bluetooth/bluez/bluetooth_adapter_bluez.cc |
| @@ -26,6 +26,7 @@ |
| #include "device/bluetooth/bluez/bluetooth_advertisement_bluez.h" |
| #include "device/bluetooth/bluez/bluetooth_audio_sink_bluez.h" |
| #include "device/bluetooth/bluez/bluetooth_device_bluez.h" |
| +#include "device/bluetooth/bluez/bluetooth_gatt_service_bluez.h" |
| #include "device/bluetooth/bluez/bluetooth_local_gatt_service_bluez.h" |
| #include "device/bluetooth/bluez/bluetooth_pairing_bluez.h" |
| #include "device/bluetooth/bluez/bluetooth_socket_bluez.h" |
| @@ -33,6 +34,8 @@ |
| #include "device/bluetooth/dbus/bluetooth_agent_manager_client.h" |
| #include "device/bluetooth/dbus/bluetooth_agent_service_provider.h" |
| #include "device/bluetooth/dbus/bluetooth_device_client.h" |
| +#include "device/bluetooth/dbus/bluetooth_gatt_application_service_provider.h" |
| +#include "device/bluetooth/dbus/bluetooth_gatt_manager_client.h" |
| #include "device/bluetooth/dbus/bluetooth_input_client.h" |
| #include "device/bluetooth/dbus/bluez_dbus_manager.h" |
| #include "third_party/cros_system_api/dbus/service_constants.h" |
| @@ -54,6 +57,7 @@ namespace { |
| // The agent path is relatively meaningless since BlueZ only permits one to |
| // exist per D-Bus connection, it just has to be unique within Chromium. |
| const char kAgentPath[] = "/org/chromium/bluetooth_agent"; |
| +const char kGattApplicationObjectPath[] = "/gatt_application"; |
| void OnUnregisterAgentError(const std::string& error_name, |
| const std::string& error_message) { |
| @@ -99,6 +103,20 @@ base::WeakPtr<BluetoothAdapter> BluetoothAdapter::CreateAdapter( |
| namespace bluez { |
| +namespace { |
| + |
| +void OnServiceErrorCallback( |
|
scheib
2016/05/03 05:55:57
Just the VLOG makes this 'register / unregister' s
rkc
2016/05/03 18:22:15
Done.
|
| + const device::BluetoothGattService::ErrorCallback& error_callback, |
| + const std::string& error_name, |
| + const std::string& error_message) { |
| + VLOG(1) << "Failed to [Un]register service: " << error_name << ", " |
| + << error_message; |
| + error_callback.Run( |
| + BluetoothGattServiceBlueZ::DBusErrorToServiceError(error_name)); |
| +} |
| + |
| +} // namespace |
| + |
| // static |
| base::WeakPtr<BluetoothAdapter> BluetoothAdapterBlueZ::CreateAdapter( |
| const InitCallback& init_callback) { |
| @@ -1046,6 +1064,84 @@ void BluetoothAdapterBlueZ::AddLocalGattService( |
| owned_gatt_services_.push_back(std::move(service)); |
| } |
| +void BluetoothAdapterBlueZ::RegisterGattService( |
| + BluetoothLocalGattServiceBlueZ* service, |
| + const base::Closure& callback, |
| + const device::BluetoothGattService::ErrorCallback& error_callback) { |
| + if (registered_gatt_services_.count(service->object_path()) > 0) { |
| + LOG(WARNING) << "Re-registering a service that is already registered!"; |
| + error_callback.Run(device::BluetoothGattService::GATT_ERROR_FAILED); |
| + return; |
| + } |
| + |
| + registered_gatt_services_[service->object_path()] = service; |
| + gatt_application_provider_ = BluetoothGattApplicationServiceProvider::Create( |
| + bluez::BluezDBusManager::Get()->GetSystemBus(), |
| + GetApplicationObjectPath(), registered_gatt_services_); |
| + |
| + RegisterApplication(callback, error_callback); |
| +} |
| + |
| +void BluetoothAdapterBlueZ::RegisterApplication( |
|
scheib
2016/05/03 05:55:57
Keep declarations and definitions in same order.
rkc
2016/05/03 18:22:15
Done.
|
| + const base::Closure& callback, |
| + const device::BluetoothGattService::ErrorCallback& error_callback) { |
| + DCHECK(bluez::BluezDBusManager::Get()); |
| + bluez::BluezDBusManager::Get() |
| + ->GetBluetoothGattManagerClient() |
| + ->RegisterApplication( |
| + GetApplicationObjectPath(), BluetoothGattManagerClient::Options(), |
| + callback, base::Bind(&OnServiceErrorCallback, error_callback)); |
| +} |
| + |
| +void BluetoothAdapterBlueZ::UnregisterGattService( |
| + BluetoothLocalGattServiceBlueZ* service, |
| + const base::Closure& callback, |
| + const device::BluetoothGattService::ErrorCallback& error_callback) { |
| + DCHECK(bluez::BluezDBusManager::Get()); |
| + |
| + if (registered_gatt_services_.count(service->object_path()) == 0) { |
| + LOG(WARNING) << "Unregistering a service that isn't registered! path: " |
| + << service->object_path().value(); |
| + error_callback.Run(device::BluetoothGattService::GATT_ERROR_FAILED); |
| + return; |
| + } |
| + |
| + registered_gatt_services_.erase(service->object_path()); |
| + |
| + // If we have no GATT services left, unregister our application. |
| + if (registered_gatt_services_.size() == 0) { |
| + bluez::BluezDBusManager::Get() |
| + ->GetBluetoothGattManagerClient() |
| + ->UnregisterApplication( |
| + GetApplicationObjectPath(), callback, |
| + base::Bind(&OnServiceErrorCallback, error_callback)); |
| + return; |
| + } |
| + |
| + // Otherwise, this is tricky (since at the moment, BlueZ does not support |
| + // adding/removing services individually). We need to update our list of |
| + // services, then unregister our application, then re-register it with the |
| + // updated services. TODO(rkc): Fix this once BlueZ is fixed. |
| + gatt_application_provider_ = BluetoothGattApplicationServiceProvider::Create( |
| + bluez::BluezDBusManager::Get()->GetSystemBus(), object_path_, |
| + registered_gatt_services_); |
| + |
| + // Unregister our current application. If we are successful, make a call to |
| + // register the application again with the current set of services. |
| + bluez::BluezDBusManager::Get() |
| + ->GetBluetoothGattManagerClient() |
| + ->UnregisterApplication( |
| + GetApplicationObjectPath(), |
| + base::Bind(&BluetoothAdapterBlueZ::RegisterApplication, |
| + weak_ptr_factory_.GetWeakPtr(), callback, error_callback), |
| + base::Bind(&OnServiceErrorCallback, error_callback)); |
| +} |
| + |
| +// Returns the object path of the adapter. |
| +dbus::ObjectPath BluetoothAdapterBlueZ::GetApplicationObjectPath() const { |
| + return dbus::ObjectPath(object_path_.value() + kGattApplicationObjectPath); |
| +} |
| + |
| void BluetoothAdapterBlueZ::OnRegisterProfile( |
| const BluetoothUUID& uuid, |
| std::unique_ptr<BluetoothAdapterProfileBlueZ> profile) { |