Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(194)

Side by Side Diff: device/bluetooth/bluetooth_low_energy_device_mac.mm

Issue 2638653002: Bluetooth: macOS: DidModifyServices can happens while scanning (Closed)
Patch Set: Merge Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 "device/bluetooth/bluetooth_low_energy_device_mac.h" 5 #include "device/bluetooth/bluetooth_low_energy_device_mac.h"
6 6
7 #import <CoreFoundation/CoreFoundation.h> 7 #import <CoreFoundation/CoreFoundation.h>
8 #include <stddef.h> 8 #include <stddef.h>
9 9
10 #include "base/mac/mac_util.h" 10 #include "base/mac/mac_util.h"
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after
182 } 182 }
183 } 183 }
184 184
185 void BluetoothLowEnergyDeviceMac::DisconnectGatt() { 185 void BluetoothLowEnergyDeviceMac::DisconnectGatt() {
186 GetMacAdapter()->DisconnectGatt(this); 186 GetMacAdapter()->DisconnectGatt(this);
187 } 187 }
188 188
189 void BluetoothLowEnergyDeviceMac::DidDiscoverPrimaryServices(NSError* error) { 189 void BluetoothLowEnergyDeviceMac::DidDiscoverPrimaryServices(NSError* error) {
190 --discovery_pending_count_; 190 --discovery_pending_count_;
191 if (discovery_pending_count_ < 0) { 191 if (discovery_pending_count_ < 0) {
192 // This should never happens, just in case it happens with a device, 192 // This should never happen, just in case it happens with a device,
193 // discovery_pending_count_ is set back to 0. 193 // discovery_pending_count_ is set back to 0.
194 VLOG(1) << *this 194 VLOG(1) << *this
195 << ": BluetoothLowEnergyDeviceMac::discovery_pending_count_ " 195 << ": BluetoothLowEnergyDeviceMac::discovery_pending_count_ "
196 << discovery_pending_count_; 196 << discovery_pending_count_;
197 discovery_pending_count_ = 0; 197 discovery_pending_count_ = 0;
198 return; 198 return;
199 } 199 }
200 if (error) { 200 if (error) {
201 // TODO(http://crbug.com/609320): Need to pass the error. 201 // TODO(http://crbug.com/609320): Need to pass the error.
202 // TODO(http://crbug.com/609844): Decide what to do if discover failed 202 // TODO(http://crbug.com/609844): Decide what to do if discover failed
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
249 VLOG(1) << *this << ": Can't discover characteristics: " 249 VLOG(1) << *this << ": Can't discover characteristics: "
250 << BluetoothAdapterMac::String(error); 250 << BluetoothAdapterMac::String(error);
251 return; 251 return;
252 } 252 }
253 253
254 if (!IsGattConnected()) { 254 if (!IsGattConnected()) {
255 VLOG(1) << *this << ": DidDiscoverCharacteristics, gatt disconnected."; 255 VLOG(1) << *this << ": DidDiscoverCharacteristics, gatt disconnected.";
256 // Don't create characteristics if the device disconnected. 256 // Don't create characteristics if the device disconnected.
257 return; 257 return;
258 } 258 }
259 if (IsGattServicesDiscoveryComplete()) {
260 // This should never happen, just in case it happens with a device, this
261 // notification should be ignored.
262 VLOG(1) << *this
263 << ": Discovery complete, ignoring DidDiscoverCharacteristics.";
264 return;
265 }
259 266
260 BluetoothRemoteGattServiceMac* gatt_service = 267 BluetoothRemoteGattServiceMac* gatt_service =
261 GetBluetoothRemoteGattService(cb_service); 268 GetBluetoothRemoteGattService(cb_service);
262 DCHECK(gatt_service); 269 DCHECK(gatt_service);
263 gatt_service->DidDiscoverCharacteristics(); 270 gatt_service->DidDiscoverCharacteristics();
264 SendNotificationIfDiscoveryComplete(); 271 SendNotificationIfDiscoveryComplete();
265 } 272 }
266 273
267 void BluetoothLowEnergyDeviceMac::DidModifyServices( 274 void BluetoothLowEnergyDeviceMac::DidModifyServices(
268 NSArray* invalidatedServices) { 275 NSArray* invalidatedServices) {
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
320 // TODO(http://crbug.com/609844): Decide what to do if discover failed 327 // TODO(http://crbug.com/609844): Decide what to do if discover failed
321 VLOG(1) << *this << ": Can't discover descriptors: " 328 VLOG(1) << *this << ": Can't discover descriptors: "
322 << BluetoothAdapterMac::String(error); 329 << BluetoothAdapterMac::String(error);
323 return; 330 return;
324 } 331 }
325 if (!IsGattConnected()) { 332 if (!IsGattConnected()) {
326 VLOG(1) << *this << ": DidDiscoverDescriptors, disconnected."; 333 VLOG(1) << *this << ": DidDiscoverDescriptors, disconnected.";
327 // Don't discover descriptors if the device disconnected. 334 // Don't discover descriptors if the device disconnected.
328 return; 335 return;
329 } 336 }
337 if (IsGattServicesDiscoveryComplete()) {
338 // This should never happen, just in case it happens with a device, this
339 // notification should be ignored.
340 VLOG(1) << *this
341 << ": Discovery complete, ignoring DidDiscoverDescriptors.";
342 return;
343 }
330 BluetoothRemoteGattServiceMac* gatt_service = 344 BluetoothRemoteGattServiceMac* gatt_service =
331 GetBluetoothRemoteGattService(cb_characteristic.service); 345 GetBluetoothRemoteGattService(cb_characteristic.service);
332 DCHECK(gatt_service); 346 DCHECK(gatt_service);
333 gatt_service->DidDiscoverDescriptors(cb_characteristic); 347 gatt_service->DidDiscoverDescriptors(cb_characteristic);
334 SendNotificationIfDiscoveryComplete(); 348 SendNotificationIfDiscoveryComplete();
335 } 349 }
336 350
337 void BluetoothLowEnergyDeviceMac::DidUpdateValueForDescriptor( 351 void BluetoothLowEnergyDeviceMac::DidUpdateValueForDescriptor(
338 CBDescriptor* cb_descriptor, 352 CBDescriptor* cb_descriptor,
339 NSError* error) { 353 NSError* error) {
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
373 } 387 }
374 388
375 void BluetoothLowEnergyDeviceMac::DiscoverPrimaryServices() { 389 void BluetoothLowEnergyDeviceMac::DiscoverPrimaryServices() {
376 VLOG(1) << *this << ": DiscoverPrimaryServices, pending count " 390 VLOG(1) << *this << ": DiscoverPrimaryServices, pending count "
377 << discovery_pending_count_; 391 << discovery_pending_count_;
378 ++discovery_pending_count_; 392 ++discovery_pending_count_;
379 [GetPeripheral() discoverServices:nil]; 393 [GetPeripheral() discoverServices:nil];
380 } 394 }
381 395
382 void BluetoothLowEnergyDeviceMac::SendNotificationIfDiscoveryComplete() { 396 void BluetoothLowEnergyDeviceMac::SendNotificationIfDiscoveryComplete() {
397 DCHECK(!IsGattServicesDiscoveryComplete());
383 // Notify when all services have been discovered. 398 // Notify when all services have been discovered.
384 bool discovery_complete = 399 bool discovery_complete =
385 discovery_pending_count_ == 0 && 400 discovery_pending_count_ == 0 &&
386 std::find_if_not( 401 std::find_if_not(
387 gatt_services_.begin(), 402 gatt_services_.begin(),
388 gatt_services_.end(), [](GattServiceMap::value_type & pair) { 403 gatt_services_.end(), [](GattServiceMap::value_type & pair) {
389 BluetoothRemoteGattService* gatt_service = pair.second.get(); 404 BluetoothRemoteGattService* gatt_service = pair.second.get();
390 return static_cast<BluetoothRemoteGattServiceMac*>(gatt_service) 405 return static_cast<BluetoothRemoteGattServiceMac*>(gatt_service)
391 ->IsDiscoveryComplete(); 406 ->IsDiscoveryComplete();
392 }) == gatt_services_.end(); 407 }) == gatt_services_.end();
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
466 std::ostream& operator<<(std::ostream& out, 481 std::ostream& operator<<(std::ostream& out,
467 const BluetoothLowEnergyDeviceMac& device) { 482 const BluetoothLowEnergyDeviceMac& device) {
468 // TODO(crbug.com/703878): Should use 483 // TODO(crbug.com/703878): Should use
469 // BluetoothLowEnergyDeviceMac::GetNameForDisplay() instead. 484 // BluetoothLowEnergyDeviceMac::GetNameForDisplay() instead.
470 base::Optional<std::string> name = device.GetName(); 485 base::Optional<std::string> name = device.GetName();
471 const char* name_cstr = name ? name->c_str() : ""; 486 const char* name_cstr = name ? name->c_str() : "";
472 return out << "<BluetoothLowEnergyDeviceMac " << device.GetAddress() << "/" 487 return out << "<BluetoothLowEnergyDeviceMac " << device.GetAddress() << "/"
473 << &device << ", \"" << name_cstr << "\">"; 488 << &device << ", \"" << name_cstr << "\">";
474 } 489 }
475 } // namespace device 490 } // namespace device
OLDNEW
« no previous file with comments | « device/bluetooth/bluetooth_device_unittest.cc ('k') | device/bluetooth/bluetooth_remote_gatt_characteristic_mac.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698