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

Unified Diff: device/bluetooth/bluetooth_low_energy_device_mac.mm

Issue 2641133003: Bluetooth: macOS: Adding counter for service discovery callbacks. (Closed)
Patch Set: Adding comment Created 3 years, 9 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « device/bluetooth/bluetooth_low_energy_device_mac.h ('k') | device/bluetooth/test/bluetooth_test_mac.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: device/bluetooth/bluetooth_low_energy_device_mac.mm
diff --git a/device/bluetooth/bluetooth_low_energy_device_mac.mm b/device/bluetooth/bluetooth_low_energy_device_mac.mm
index a52d2bcf618f00e0e6c18768ed6259e400a02219..6fa8927657b9b53b79404a03d6a621a03db24542 100644
--- a/device/bluetooth/bluetooth_low_energy_device_mac.mm
+++ b/device/bluetooth/bluetooth_low_energy_device_mac.mm
@@ -25,7 +25,8 @@ BluetoothLowEnergyDeviceMac::BluetoothLowEnergyDeviceMac(
BluetoothAdapterMac* adapter,
CBPeripheral* peripheral)
: BluetoothDeviceMac(adapter),
- peripheral_(peripheral, base::scoped_policy::RETAIN) {
+ peripheral_(peripheral, base::scoped_policy::RETAIN),
+ discovery_pending_count_(0) {
DCHECK(BluetoothAdapterMac::IsLowEnergyAvailable());
DCHECK(peripheral_.get());
peripheral_delegate_.reset([[BluetoothLowEnergyPeripheralDelegate alloc]
@@ -184,6 +185,16 @@ void BluetoothLowEnergyDeviceMac::DisconnectGatt() {
}
void BluetoothLowEnergyDeviceMac::DidDiscoverPrimaryServices(NSError* error) {
+ --discovery_pending_count_;
+ if (discovery_pending_count_ < 0) {
+ // This should never happens, just in case it happens with a device,
+ // discovery_pending_count_ is set back to 0.
+ VLOG(1) << GetName()->c_str()
+ << ": BluetoothLowEnergyDeviceMac::discovery_pending_count_ "
+ << discovery_pending_count_;
+ discovery_pending_count_ = 0;
+ return;
+ }
if (error) {
// TODO(http://crbug.com/609320): Need to pass the error.
// TODO(http://crbug.com/609844): Decide what to do if discover failed
@@ -193,7 +204,8 @@ void BluetoothLowEnergyDeviceMac::DidDiscoverPrimaryServices(NSError* error) {
<< ": " << error.code << ")";
return;
}
- VLOG(1) << "DidDiscoverPrimaryServices.";
+ VLOG(1) << "DidDiscoverPrimaryServices, pending count: "
+ << discovery_pending_count_;
if (!IsGattConnected()) {
// Don't create services if the device disconnected.
@@ -212,11 +224,14 @@ void BluetoothLowEnergyDeviceMac::DidDiscoverPrimaryServices(NSError* error) {
adapter_->NotifyGattServiceAdded(gatt_service);
}
}
- for (auto it = gatt_services_.begin(); it != gatt_services_.end(); ++it) {
- device::BluetoothRemoteGattService* gatt_service = it->second.get();
- device::BluetoothRemoteGattServiceMac* gatt_service_mac =
- static_cast<BluetoothRemoteGattServiceMac*>(gatt_service);
- gatt_service_mac->DiscoverCharacteristics();
+ if (discovery_pending_count_ == 0) {
+ for (auto it = gatt_services_.begin(); it != gatt_services_.end(); ++it) {
+ device::BluetoothRemoteGattService* gatt_service = it->second.get();
+ device::BluetoothRemoteGattServiceMac* gatt_service_mac =
+ static_cast<BluetoothRemoteGattServiceMac*>(gatt_service);
+ gatt_service_mac->DiscoverCharacteristics();
+ }
+ SendNotificationIfDiscoveryComplete();
}
}
@@ -261,7 +276,7 @@ void BluetoothLowEnergyDeviceMac::DidModifyServices(
device_uuids_.ClearServiceUUIDs();
SetGattServicesDiscoveryComplete(false);
adapter_->NotifyDeviceChanged(this);
- [GetPeripheral() discoverServices:nil];
+ DiscoverPrimaryServices();
}
void BluetoothLowEnergyDeviceMac::DidUpdateValue(
@@ -337,12 +352,19 @@ std::string BluetoothLowEnergyDeviceMac::GetPeripheralHashAddress(
return BluetoothDevice::CanonicalizeAddress(hash);
}
+void BluetoothLowEnergyDeviceMac::DiscoverPrimaryServices() {
+ VLOG(1) << "DidDiscoverDescriptors pending count" << discovery_pending_count_;
+ ++discovery_pending_count_;
+ [GetPeripheral() discoverServices:nil];
+}
+
void BluetoothLowEnergyDeviceMac::SendNotificationIfDiscoveryComplete() {
// Notify when all services have been discovered.
bool discovery_complete =
+ discovery_pending_count_ == 0 &&
std::find_if_not(
- gatt_services_.begin(), gatt_services_.end(),
- [](GattServiceMap::value_type& pair) {
+ gatt_services_.begin(),
+ gatt_services_.end(), [](GattServiceMap::value_type & pair) {
BluetoothRemoteGattService* gatt_service = pair.second.get();
return static_cast<BluetoothRemoteGattServiceMac*>(gatt_service)
->IsDiscoveryComplete();
« no previous file with comments | « device/bluetooth/bluetooth_low_energy_device_mac.h ('k') | device/bluetooth/test/bluetooth_test_mac.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698