| // Copyright 2020 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef CHROME_BROWSER_NEARBY_SHARING_FAST_INITIATION_FAST_INITIATION_ADVERTISER_H_ |
| #define CHROME_BROWSER_NEARBY_SHARING_FAST_INITIATION_FAST_INITIATION_ADVERTISER_H_ |
| |
| #include <memory> |
| #include <vector> |
| |
| #include "base/memory/weak_ptr.h" |
| #include "device/bluetooth/bluetooth_adapter.h" |
| |
| // FastInitiationAdvertiser broadcasts advertisements with the service UUID |
| // 0xFE2C. The service data will be 0xFC128E along with 2 additional bytes of |
| // metadata at the end. Some remote devices background scan for Fast Initiation |
| // advertisements as a signal to begin advertising via Nearby Connections. This |
| // scanning is performed in FastInitiationScanner. |
| class FastInitiationAdvertiser |
| : public device::BluetoothAdvertisement::Observer { |
| public: |
| enum class FastInitType : uint8_t { |
| kNotify = 0, |
| kSilent = 1, |
| }; |
| |
| class Factory { |
| public: |
| Factory() = default; |
| Factory(const Factory&) = delete; |
| Factory& operator=(const Factory&) = delete; |
| |
| static std::unique_ptr<FastInitiationAdvertiser> Create( |
| scoped_refptr<device::BluetoothAdapter> adapter); |
| |
| static void SetFactoryForTesting(Factory* factory); |
| |
| protected: |
| virtual ~Factory() = default; |
| virtual std::unique_ptr<FastInitiationAdvertiser> CreateInstance( |
| scoped_refptr<device::BluetoothAdapter> adapter) = 0; |
| |
| private: |
| static Factory* factory_instance_; |
| }; |
| |
| explicit FastInitiationAdvertiser( |
| scoped_refptr<device::BluetoothAdapter> adapter); |
| ~FastInitiationAdvertiser() override; |
| FastInitiationAdvertiser(const FastInitiationAdvertiser&) = delete; |
| FastInitiationAdvertiser& operator=(const FastInitiationAdvertiser&) = delete; |
| |
| // Begin broadcasting Fast Initiation advertisement. |
| virtual void StartAdvertising(FastInitType type, |
| base::OnceClosure callback, |
| base::OnceClosure error_callback); |
| |
| // Stop broadcasting Fast Initiation advertisement. |
| virtual void StopAdvertising(base::OnceClosure callback); |
| |
| private: |
| // device::BluetoothAdvertisement::Observer: |
| void AdvertisementReleased( |
| device::BluetoothAdvertisement* advertisement) override; |
| |
| void RegisterAdvertisement(FastInitType type, |
| base::OnceClosure callback, |
| base::OnceClosure error_callback); |
| void OnRegisterAdvertisement( |
| base::OnceClosure callback, |
| scoped_refptr<device::BluetoothAdvertisement> advertisement); |
| void OnRegisterAdvertisementError( |
| base::OnceClosure error_callback, |
| device::BluetoothAdvertisement::ErrorCode error_code); |
| void UnregisterAdvertisement(base::OnceClosure callback); |
| void OnUnregisterAdvertisement(); |
| void OnUnregisterAdvertisementError( |
| device::BluetoothAdvertisement::ErrorCode error_code); |
| |
| // Fast Init V1 metadata has 2 bytes, in format |
| // [ version (3 bits) | type (3 bits) | uwb_enable (1 bit) | reserved (1 bit), |
| // adjusted_tx_power (1 byte) ]. |
| std::vector<uint8_t> GenerateFastInitV1Metadata(FastInitType type); |
| |
| scoped_refptr<device::BluetoothAdapter> adapter_; |
| scoped_refptr<device::BluetoothAdvertisement> advertisement_; |
| base::OnceClosure stop_callback_; |
| base::WeakPtrFactory<FastInitiationAdvertiser> weak_ptr_factory_{this}; |
| }; |
| |
| #endif // CHROME_BROWSER_NEARBY_SHARING_FAST_INITIATION_FAST_INITIATION_ADVERTISER_H_ |