Chromium Code Reviews| Index: chromeos/components/tether/ble_advertiser.h |
| diff --git a/chromeos/components/tether/ble_advertiser.h b/chromeos/components/tether/ble_advertiser.h |
| index 590b86e15bbe7b294d41ce7cebfb222bb9db78ca..bb383328f135c45d738ddae6da1a7d220e0ddd84 100644 |
| --- a/chromeos/components/tether/ble_advertiser.h |
| +++ b/chromeos/components/tether/ble_advertiser.h |
| @@ -6,6 +6,7 @@ |
| #define CHROMEOS_COMPONENTS_TETHER_BLE_ADVERTISER_H_ |
| #include <map> |
| +#include <unordered_set> |
| #include "base/macros.h" |
| #include "base/memory/weak_ptr.h" |
| @@ -44,6 +45,17 @@ class BleAdvertiser { |
| private: |
| friend class BleAdvertiserTest; |
| + // One IndividualAdvertisement is created for each device to which |
| + // BleAdvertiser should be advertising. When an IndividualAdvertisement is |
| + // created, it starts trying to advertise to its associated device ID; |
| + // likewise, when it is destroyed, it stops advertising if necessary. |
| + // |
| + // However, because unregistering an advertisement is an asynchronous |
| + // operation, it is possible that if an IndividualAdvertisement for one device |
| + // is created just after another IndividualAdvertisement for the same device |
| + // was destroyed, the previous advertisement was not fully unregistered. |
| + // If that is the case, the newly-created IndividualAdvertisement must wait |
|
Ryan Hansberry
2017/07/11 21:27:41
please explicitly mention OnPreviousAdvertisementU
Kyle Horimoto
2017/07/12 02:22:04
Done.
|
| + // until the previous advertisement was unregistered. |
| class IndividualAdvertisement |
| : public device::BluetoothAdapter::Observer, |
| public device::BluetoothAdvertisement::Observer { |
| @@ -51,9 +63,15 @@ class BleAdvertiser { |
| IndividualAdvertisement( |
| const std::string& device_id, |
| scoped_refptr<device::BluetoothAdapter> adapter, |
| - std::unique_ptr<cryptauth::DataWithTimestamp> advertisement_data); |
| + std::unique_ptr<cryptauth::DataWithTimestamp> advertisement_data, |
| + const base::Closure& on_advertisement_unregistered_callback, |
| + std::unordered_set<std::string>* active_advertisement_device_ids_set); |
| ~IndividualAdvertisement() override; |
| + // Callback for when a previously-registered advertisement corresponding to |
| + // |device_id_| has been unregistered. |
| + void OnPreviousAdvertisementUnregistered(); |
| + |
| // device::BluetoothAdapter::Observer |
| void AdapterPoweredChanged(device::BluetoothAdapter* adapter, |
| bool powered) override; |
| @@ -85,6 +103,9 @@ class BleAdvertiser { |
| bool is_initializing_advertising_; |
| scoped_refptr<device::BluetoothAdvertisement> advertisement_; |
| + base::Closure on_advertisement_unregistered_callback_; |
| + std::unordered_set<std::string>* active_advertisement_device_ids_set_; |
| + |
| base::WeakPtrFactory<IndividualAdvertisement> weak_ptr_factory_; |
| DISALLOW_COPY_AND_ASSIGN(IndividualAdvertisement); |
| @@ -96,6 +117,8 @@ class BleAdvertiser { |
| const cryptauth::RemoteBeaconSeedFetcher* remote_beacon_seed_fetcher, |
| const cryptauth::LocalDeviceDataProvider* local_device_data_provider); |
| + void OnAdvertisementUnregistered(const std::string& associated_device_id); |
| + |
| scoped_refptr<device::BluetoothAdapter> adapter_; |
| std::unique_ptr<cryptauth::ForegroundEidGenerator> eid_generator_; |
| @@ -105,6 +128,9 @@ class BleAdvertiser { |
| std::map<std::string, std::unique_ptr<IndividualAdvertisement>> |
| device_id_to_advertisement_map_; |
| + std::unordered_set<std::string> active_advertisement_device_ids_set_; |
| + |
| + base::WeakPtrFactory<BleAdvertiser> weak_ptr_factory_; |
| DISALLOW_COPY_AND_ASSIGN(BleAdvertiser); |
| }; |