Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chromeos/components/tether/ble_advertiser.h" | 5 #include "chromeos/components/tether/ble_advertiser.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "chromeos/components/tether/ble_constants.h" | 8 #include "chromeos/components/tether/ble_constants.h" |
| 9 #include "components/cryptauth/local_device_data_provider.h" | 9 #include "components/cryptauth/local_device_data_provider.h" |
| 10 #include "components/cryptauth/proto/cryptauth_api.pb.h" | 10 #include "components/cryptauth/proto/cryptauth_api.pb.h" |
| 11 #include "components/cryptauth/remote_beacon_seed_fetcher.h" | 11 #include "components/cryptauth/remote_beacon_seed_fetcher.h" |
| 12 #include "components/proximity_auth/logging/logging.h" | 12 #include "components/proximity_auth/logging/logging.h" |
| 13 #include "device/bluetooth/bluetooth_advertisement.h" | 13 #include "device/bluetooth/bluetooth_advertisement.h" |
| 14 | 14 |
| 15 namespace chromeos { | 15 namespace chromeos { |
| 16 | 16 |
| 17 namespace tether { | 17 namespace tether { |
| 18 | 18 |
| 19 namespace { | 19 namespace { |
| 20 | 20 |
| 21 uint8_t kInvertedConnectionFlag = 0x01; | 21 uint8_t kInvertedConnectionFlag = 0x01; |
| 22 | 22 |
| 23 } // namespace | 23 } // namespace |
| 24 | 24 |
| 25 BleAdvertiser::IndividualAdvertisement::IndividualAdvertisement( | 25 BleAdvertiser::IndividualAdvertisement::IndividualAdvertisement( |
| 26 const std::string& device_id, | 26 const std::string& device_id, |
| 27 scoped_refptr<device::BluetoothAdapter> adapter, | 27 scoped_refptr<device::BluetoothAdapter> adapter, |
| 28 std::unique_ptr<cryptauth::DataWithTimestamp> advertisement_data) | 28 std::unique_ptr<cryptauth::DataWithTimestamp> advertisement_data, |
| 29 const base::Closure& on_advertisement_unregistered_callback, | |
| 30 std::unordered_set<std::string>* active_advertisement_device_ids_set) | |
| 29 : device_id_(device_id), | 31 : device_id_(device_id), |
| 30 adapter_(adapter), | 32 adapter_(adapter), |
| 31 advertisement_data_(std::move(advertisement_data)), | 33 advertisement_data_(std::move(advertisement_data)), |
| 32 is_initializing_advertising_(false), | 34 is_initializing_advertising_(false), |
| 33 advertisement_(nullptr), | 35 advertisement_(nullptr), |
| 36 on_advertisement_unregistered_callback_( | |
| 37 on_advertisement_unregistered_callback), | |
| 38 active_advertisement_device_ids_set_(active_advertisement_device_ids_set), | |
| 34 weak_ptr_factory_(this) { | 39 weak_ptr_factory_(this) { |
| 35 adapter_->AddObserver(this); | 40 adapter_->AddObserver(this); |
| 36 AdvertiseIfPossible(); | 41 AdvertiseIfPossible(); |
| 37 } | 42 } |
| 38 | 43 |
| 39 BleAdvertiser::IndividualAdvertisement::~IndividualAdvertisement() { | 44 BleAdvertiser::IndividualAdvertisement::~IndividualAdvertisement() { |
| 40 if (advertisement_) { | 45 if (advertisement_) { |
| 41 advertisement_->Unregister( | 46 advertisement_->Unregister( |
| 42 base::Bind(&base::DoNothing), | 47 on_advertisement_unregistered_callback_, |
| 43 base::Bind(&IndividualAdvertisement::OnAdvertisementUnregisterFailure, | 48 base::Bind(&IndividualAdvertisement::OnAdvertisementUnregisterFailure, |
|
Ryan Hansberry
2017/07/11 21:27:41
I don't believe that this method is ever called wi
Kyle Horimoto
2017/07/12 02:22:04
Done.
| |
| 44 weak_ptr_factory_.GetWeakPtr())); | 49 weak_ptr_factory_.GetWeakPtr())); |
| 45 } | 50 } |
| 46 | 51 |
| 47 adapter_->RemoveObserver(this); | 52 adapter_->RemoveObserver(this); |
| 48 } | 53 } |
| 49 | 54 |
| 55 void BleAdvertiser::IndividualAdvertisement:: | |
| 56 OnPreviousAdvertisementUnregistered() { | |
| 57 DCHECK(active_advertisement_device_ids_set_->find(device_id_) == | |
| 58 active_advertisement_device_ids_set_->end()); | |
| 59 AdvertiseIfPossible(); | |
| 60 } | |
| 61 | |
| 50 void BleAdvertiser::IndividualAdvertisement::AdapterPoweredChanged( | 62 void BleAdvertiser::IndividualAdvertisement::AdapterPoweredChanged( |
| 51 device::BluetoothAdapter* adapter, | 63 device::BluetoothAdapter* adapter, |
| 52 bool powered) { | 64 bool powered) { |
| 53 DCHECK(adapter_.get() == adapter); | 65 DCHECK(adapter_.get() == adapter); |
| 54 AdvertiseIfPossible(); | 66 AdvertiseIfPossible(); |
| 55 } | 67 } |
| 56 | 68 |
| 57 void BleAdvertiser::IndividualAdvertisement::AdvertisementReleased( | 69 void BleAdvertiser::IndividualAdvertisement::AdvertisementReleased( |
| 58 device::BluetoothAdvertisement* advertisement) { | 70 device::BluetoothAdvertisement* advertisement) { |
| 59 DCHECK(advertisement_.get() == advertisement); | 71 DCHECK(advertisement_.get() == advertisement); |
| 60 | 72 |
| 61 // If the advertisement was released, delete it and try again. Note that this | 73 // If the advertisement was released, delete it and try again. Note that this |
| 62 // situation is not expected to occur under normal circumstances. | 74 // situation is not expected to occur under normal circumstances. |
| 75 advertisement_->RemoveObserver(this); | |
| 63 advertisement_ = nullptr; | 76 advertisement_ = nullptr; |
| 77 active_advertisement_device_ids_set_->erase(device_id_); | |
| 78 | |
| 64 AdvertiseIfPossible(); | 79 AdvertiseIfPossible(); |
| 65 } | 80 } |
| 66 | 81 |
| 67 void BleAdvertiser::IndividualAdvertisement::AdvertiseIfPossible() { | 82 void BleAdvertiser::IndividualAdvertisement::AdvertiseIfPossible() { |
| 68 if (!adapter_->IsPowered() || is_initializing_advertising_ || | 83 if (!adapter_->IsPowered() || is_initializing_advertising_ || |
| 69 advertisement_) { | 84 advertisement_ || |
| 85 active_advertisement_device_ids_set_->find(device_id_) != | |
| 86 active_advertisement_device_ids_set_->end()) { | |
| 87 // It is not possible to advertise if the adapter is not powered. Likewise, | |
| 88 // we should not try to advertise if there is an advertisement already in | |
| 89 // progress. | |
| 70 return; | 90 return; |
| 71 } | 91 } |
| 72 | 92 |
| 73 is_initializing_advertising_ = true; | 93 is_initializing_advertising_ = true; |
| 74 | 94 |
| 75 std::unique_ptr<device::BluetoothAdvertisement::Data> advertisement_data = | 95 std::unique_ptr<device::BluetoothAdvertisement::Data> advertisement_data = |
| 76 base::MakeUnique<device::BluetoothAdvertisement::Data>( | 96 base::MakeUnique<device::BluetoothAdvertisement::Data>( |
| 77 device::BluetoothAdvertisement::AdvertisementType:: | 97 device::BluetoothAdvertisement::AdvertisementType:: |
| 78 ADVERTISEMENT_TYPE_BROADCAST); | 98 ADVERTISEMENT_TYPE_BROADCAST); |
| 79 advertisement_data->set_service_uuids(CreateServiceUuids()); | 99 advertisement_data->set_service_uuids(CreateServiceUuids()); |
| 80 advertisement_data->set_service_data(CreateServiceData()); | 100 advertisement_data->set_service_data(CreateServiceData()); |
| 81 | 101 |
| 82 adapter_->RegisterAdvertisement( | 102 adapter_->RegisterAdvertisement( |
| 83 std::move(advertisement_data), | 103 std::move(advertisement_data), |
| 84 base::Bind(&IndividualAdvertisement::OnAdvertisementRegisteredCallback, | 104 base::Bind(&IndividualAdvertisement::OnAdvertisementRegisteredCallback, |
| 85 weak_ptr_factory_.GetWeakPtr()), | 105 weak_ptr_factory_.GetWeakPtr()), |
| 86 base::Bind(&IndividualAdvertisement::OnAdvertisementErrorCallback, | 106 base::Bind(&IndividualAdvertisement::OnAdvertisementErrorCallback, |
| 87 weak_ptr_factory_.GetWeakPtr())); | 107 weak_ptr_factory_.GetWeakPtr())); |
| 88 } | 108 } |
| 89 | 109 |
| 90 void BleAdvertiser::IndividualAdvertisement::OnAdvertisementRegisteredCallback( | 110 void BleAdvertiser::IndividualAdvertisement::OnAdvertisementRegisteredCallback( |
| 91 scoped_refptr<device::BluetoothAdvertisement> advertisement) { | 111 scoped_refptr<device::BluetoothAdvertisement> advertisement) { |
| 92 is_initializing_advertising_ = false; | 112 is_initializing_advertising_ = false; |
| 113 | |
| 93 advertisement_ = advertisement; | 114 advertisement_ = advertisement; |
| 115 advertisement_->AddObserver(this); | |
| 116 active_advertisement_device_ids_set_->insert(device_id_); | |
| 117 | |
| 94 PA_LOG(INFO) << "Advertisement registered. " | 118 PA_LOG(INFO) << "Advertisement registered. " |
| 95 << "Device ID: \"" | 119 << "Device ID: \"" |
| 96 << cryptauth::RemoteDevice::TruncateDeviceIdForLogs(device_id_) | 120 << cryptauth::RemoteDevice::TruncateDeviceIdForLogs(device_id_) |
| 97 << "\", Service data: " << advertisement_data_->DataInHex(); | 121 << "\", Service data: " << advertisement_data_->DataInHex(); |
| 98 } | 122 } |
| 99 | 123 |
| 100 void BleAdvertiser::IndividualAdvertisement::OnAdvertisementErrorCallback( | 124 void BleAdvertiser::IndividualAdvertisement::OnAdvertisementErrorCallback( |
| 101 device::BluetoothAdvertisement::ErrorCode error_code) { | 125 device::BluetoothAdvertisement::ErrorCode error_code) { |
| 102 is_initializing_advertising_ = false; | 126 is_initializing_advertising_ = false; |
| 103 PA_LOG(ERROR) << "Error registering advertisement. " | 127 PA_LOG(ERROR) << "Error registering advertisement. " |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 155 BleAdvertiser::~BleAdvertiser() {} | 179 BleAdvertiser::~BleAdvertiser() {} |
| 156 | 180 |
| 157 BleAdvertiser::BleAdvertiser( | 181 BleAdvertiser::BleAdvertiser( |
| 158 scoped_refptr<device::BluetoothAdapter> adapter, | 182 scoped_refptr<device::BluetoothAdapter> adapter, |
| 159 std::unique_ptr<cryptauth::ForegroundEidGenerator> eid_generator, | 183 std::unique_ptr<cryptauth::ForegroundEidGenerator> eid_generator, |
| 160 const cryptauth::RemoteBeaconSeedFetcher* remote_beacon_seed_fetcher, | 184 const cryptauth::RemoteBeaconSeedFetcher* remote_beacon_seed_fetcher, |
| 161 const cryptauth::LocalDeviceDataProvider* local_device_data_provider) | 185 const cryptauth::LocalDeviceDataProvider* local_device_data_provider) |
| 162 : adapter_(adapter), | 186 : adapter_(adapter), |
| 163 eid_generator_(std::move(eid_generator)), | 187 eid_generator_(std::move(eid_generator)), |
| 164 remote_beacon_seed_fetcher_(remote_beacon_seed_fetcher), | 188 remote_beacon_seed_fetcher_(remote_beacon_seed_fetcher), |
| 165 local_device_data_provider_(local_device_data_provider) {} | 189 local_device_data_provider_(local_device_data_provider), |
| 190 weak_ptr_factory_(this) {} | |
| 166 | 191 |
| 167 bool BleAdvertiser::StartAdvertisingToDevice( | 192 bool BleAdvertiser::StartAdvertisingToDevice( |
| 168 const cryptauth::RemoteDevice& remote_device) { | 193 const cryptauth::RemoteDevice& remote_device) { |
| 169 if (device_id_to_advertisement_map_.size() >= kMaxConcurrentAdvertisements) { | 194 if (device_id_to_advertisement_map_.size() >= kMaxConcurrentAdvertisements) { |
| 170 PA_LOG(ERROR) << "Attempted to register a device when the maximum number " | 195 PA_LOG(ERROR) << "Attempted to register a device when the maximum number " |
| 171 << "of devices have already been registered."; | 196 << "of devices have already been registered."; |
| 172 return false; | 197 return false; |
| 173 } | 198 } |
| 174 | 199 |
| 175 std::string local_device_public_key; | 200 std::string local_device_public_key; |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 201 std::unique_ptr<cryptauth::DataWithTimestamp> advertisement = | 226 std::unique_ptr<cryptauth::DataWithTimestamp> advertisement = |
| 202 eid_generator_->GenerateAdvertisement(local_device_public_key, | 227 eid_generator_->GenerateAdvertisement(local_device_public_key, |
| 203 remote_beacon_seeds); | 228 remote_beacon_seeds); |
| 204 if (!advertisement) { | 229 if (!advertisement) { |
| 205 PA_LOG(WARNING) << "Error generating advertisement for device with ID " | 230 PA_LOG(WARNING) << "Error generating advertisement for device with ID " |
| 206 << remote_device.GetTruncatedDeviceIdForLogs() << ". " | 231 << remote_device.GetTruncatedDeviceIdForLogs() << ". " |
| 207 << "Cannot advertise."; | 232 << "Cannot advertise."; |
| 208 return false; | 233 return false; |
| 209 } | 234 } |
| 210 | 235 |
| 211 device_id_to_advertisement_map_[remote_device.GetDeviceId()] = | 236 std::string device_id = remote_device.GetDeviceId(); |
| 237 device_id_to_advertisement_map_[device_id] = | |
| 212 base::MakeUnique<IndividualAdvertisement>( | 238 base::MakeUnique<IndividualAdvertisement>( |
| 213 remote_device.GetDeviceId(), adapter_, std::move(advertisement)); | 239 remote_device.GetDeviceId(), adapter_, std::move(advertisement), |
| 240 base::Bind(&BleAdvertiser::OnAdvertisementUnregistered, | |
| 241 weak_ptr_factory_.GetWeakPtr(), device_id), | |
| 242 &active_advertisement_device_ids_set_); | |
| 214 return true; | 243 return true; |
| 215 } | 244 } |
| 216 | 245 |
| 217 bool BleAdvertiser::StopAdvertisingToDevice( | 246 bool BleAdvertiser::StopAdvertisingToDevice( |
| 218 const cryptauth::RemoteDevice& remote_device) { | 247 const cryptauth::RemoteDevice& remote_device) { |
| 219 return device_id_to_advertisement_map_.erase(remote_device.GetDeviceId()) > 0; | 248 return device_id_to_advertisement_map_.erase(remote_device.GetDeviceId()) > 0; |
| 220 } | 249 } |
| 221 | 250 |
| 251 void BleAdvertiser::OnAdvertisementUnregistered( | |
| 252 const std::string& associated_device_id) { | |
| 253 active_advertisement_device_ids_set_.erase(associated_device_id); | |
| 254 | |
| 255 auto it = device_id_to_advertisement_map_.find(associated_device_id); | |
|
Ryan Hansberry
2017/07/11 21:27:41
nit: it's now easy to incorrectly conflate what ac
Kyle Horimoto
2017/07/12 02:22:04
Done.
| |
| 256 if (it != device_id_to_advertisement_map_.end()) | |
| 257 it->second->OnPreviousAdvertisementUnregistered(); | |
| 258 } | |
| 259 | |
| 222 } // namespace tether | 260 } // namespace tether |
| 223 | 261 |
| 224 } // namespace chromeos | 262 } // namespace chromeos |
| OLD | NEW |