// Copyright 2016 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef DEVICE_BLUETOOTH_ADAPTER_H_ #define DEVICE_BLUETOOTH_ADAPTER_H_ #include #include #include #include #include "base/macros.h" #include "base/memory/ref_counted.h" #include "device/bluetooth/bluetooth_adapter.h" #include "device/bluetooth/bluetooth_advertisement.h" #include "device/bluetooth/bluetooth_gatt_connection.h" #include "device/bluetooth/public/cpp/bluetooth_uuid.h" #include "device/bluetooth/public/mojom/adapter.mojom.h" #include "device/bluetooth/public/mojom/device.mojom-forward.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/remote_set.h" namespace bluetooth { // Implementation of Mojo Adapter located in // device/bluetooth/public/mojom/adapter.mojom. // It handles requests for Bluetooth adapter capabilities // and devices and uses the platform abstraction of device/bluetooth. class Adapter : public mojom::Adapter, public device::BluetoothAdapter::Observer { public: explicit Adapter(scoped_refptr adapter); ~Adapter() override; // mojom::Adapter overrides: void ConnectToDevice(const std::string& address, ConnectToDeviceCallback callback) override; void GetDevices(GetDevicesCallback callback) override; void GetInfo(GetInfoCallback callback) override; void AddObserver(mojo::PendingRemote observer, AddObserverCallback callback) override; void RegisterAdvertisement(const device::BluetoothUUID& service_uuid, const std::vector& service_data, bool use_scan_response, RegisterAdvertisementCallback callback) override; void SetDiscoverable(bool discoverable, SetDiscoverableCallback callback) override; void SetName(const std::string& name, SetNameCallback callback) override; void StartDiscoverySession(StartDiscoverySessionCallback callback) override; // TODO(b/162975217): Add a mechanism to allowlist which address and UUID // pairs clients are allowed to create a connection to. void ConnectToServiceInsecurely( const std::string& address, const device::BluetoothUUID& service_uuid, ConnectToServiceInsecurelyCallback callback) override; void CreateRfcommServiceInsecurely( const std::string& service_name, const device::BluetoothUUID& service_uuid, CreateRfcommServiceInsecurelyCallback callback) override; // device::BluetoothAdapter::Observer overrides: void AdapterPresentChanged(device::BluetoothAdapter* adapter, bool present) override; void AdapterPoweredChanged(device::BluetoothAdapter* adapter, bool powered) override; void AdapterDiscoverableChanged(device::BluetoothAdapter* adapter, bool discoverable) override; void AdapterDiscoveringChanged(device::BluetoothAdapter* adapter, bool discovering) override; void DeviceAdded(device::BluetoothAdapter* adapter, device::BluetoothDevice* device) override; void DeviceChanged(device::BluetoothAdapter* adapter, device::BluetoothDevice* device) override; void DeviceRemoved(device::BluetoothAdapter* adapter, device::BluetoothDevice* device) override; void GattServicesDiscovered(device::BluetoothAdapter* adapter, device::BluetoothDevice* device) override; private: void OnDeviceFetchedForInsecureServiceConnection( const device::BluetoothUUID& service_uuid, ConnectToServiceInsecurelyCallback callback, device::BluetoothDevice* device); void OnGattConnected( ConnectToDeviceCallback callback, std::unique_ptr connection); void OnConnectError(ConnectToDeviceCallback callback, device::BluetoothDevice::ConnectErrorCode error_code); void OnRegisterAdvertisement( RegisterAdvertisementCallback callback, scoped_refptr advertisement); void OnRegisterAdvertisementError( RegisterAdvertisementCallback callback, device::BluetoothAdvertisement::ErrorCode error_code); void OnSetDiscoverable(SetDiscoverableCallback callback); void OnSetDiscoverableError(SetDiscoverableCallback callback); void OnSetName(SetNameCallback callback); void OnSetNameError(SetNameCallback callback); void OnStartDiscoverySession( StartDiscoverySessionCallback callback, std::unique_ptr session); void OnDiscoverySessionError(StartDiscoverySessionCallback callback); void OnConnectToService(ConnectToServiceInsecurelyCallback callback, scoped_refptr socket); void OnConnectToServiceError(ConnectToServiceInsecurelyCallback callback, const std::string& message); void OnCreateRfcommServiceInsecurely( CreateRfcommServiceInsecurelyCallback callback, scoped_refptr socket); void OnCreateRfcommServiceInsecurelyError( CreateRfcommServiceInsecurelyCallback callback, const std::string& message); // The current Bluetooth adapter. scoped_refptr adapter_; // The adapter observers that listen to this service. mojo::RemoteSet observers_; // Arguments provided to ConnectToServiceInsecurely(), cached until the // device is ready to be connected to. std::vector> pending_connect_to_service_args_; base::WeakPtrFactory weak_ptr_factory_{this}; DISALLOW_COPY_AND_ASSIGN(Adapter); }; } // namespace bluetooth #endif // DEVICE_BLUETOOTH_ADAPTER_H_