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

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

Issue 1165053003: Adding support for Low Energy device discovery to BluetoothAdapterMac (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: comment nit on SetManagerForTesting. Created 5 years, 5 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_discovery_manager_mac.h" 5 #include "device/bluetooth/bluetooth_low_energy_discovery_manager_mac.h"
6 6
7 #include "base/mac/mac_util.h" 7 #include "base/mac/mac_util.h"
8 #include "base/memory/scoped_ptr.h" 8 #include "base/memory/scoped_ptr.h"
9 #include "base/strings/sys_string_conversions.h" 9 #include "base/strings/sys_string_conversions.h"
10 #include "device/bluetooth/bluetooth_low_energy_device_mac.h" 10 #include "device/bluetooth/bluetooth_low_energy_device_mac.h"
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
72 72
73 - (void)centralManagerDidUpdateState:(CBCentralManager*)central { 73 - (void)centralManagerDidUpdateState:(CBCentralManager*)central {
74 // Notifies when the powered state of the central manager changed. 74 // Notifies when the powered state of the central manager changed.
75 delegate_->TryStartDiscovery(); 75 delegate_->TryStartDiscovery();
76 } 76 }
77 77
78 @end 78 @end
79 79
80 BluetoothLowEnergyDiscoveryManagerMac:: 80 BluetoothLowEnergyDiscoveryManagerMac::
81 ~BluetoothLowEnergyDiscoveryManagerMac() { 81 ~BluetoothLowEnergyDiscoveryManagerMac() {
82 ClearDevices(); 82 // Set the manager's delegate to nil since the object it points to
83 // (|bridge_|) will be deallocated while |manager_| is leaked.
84 if (base::mac::IsOSLionOrLater()) {
85 // CoreBluetooth only available in OSX 10.7 and later.
86 SEL selector = NSSelectorFromString(@"setDelegate:");
87 [manager_ performSelector:selector withObject:nil];
88 }
83 } 89 }
84 90
85 bool BluetoothLowEnergyDiscoveryManagerMac::IsDiscovering() const { 91 bool BluetoothLowEnergyDiscoveryManagerMac::IsDiscovering() const {
86 return discovering_; 92 return discovering_;
87 } 93 }
88 94
89 void BluetoothLowEnergyDiscoveryManagerMac::StartDiscovery( 95 void BluetoothLowEnergyDiscoveryManagerMac::StartDiscovery(
90 BluetoothDevice::UUIDList services_uuids) { 96 BluetoothDevice::UUIDList services_uuids) {
91 ClearDevices();
92 discovering_ = true; 97 discovering_ = true;
93 pending_ = true; 98 pending_ = true;
94 services_uuids_ = services_uuids; 99 services_uuids_ = services_uuids;
95 TryStartDiscovery(); 100 TryStartDiscovery();
96 } 101 }
97 102
98 void BluetoothLowEnergyDiscoveryManagerMac::TryStartDiscovery() { 103 void BluetoothLowEnergyDiscoveryManagerMac::TryStartDiscovery() {
99 if (!discovering_) { 104 if (!discovering_) {
100 return; 105 return;
101 } 106 }
(...skipping 28 matching lines...) Expand all
130 if (discovering_ && !pending_) { 135 if (discovering_ && !pending_) {
131 [manager_ stopScan]; 136 [manager_ stopScan];
132 } 137 }
133 discovering_ = false; 138 discovering_ = false;
134 } 139 }
135 140
136 void BluetoothLowEnergyDiscoveryManagerMac::DiscoveredPeripheral( 141 void BluetoothLowEnergyDiscoveryManagerMac::DiscoveredPeripheral(
137 CBPeripheral* peripheral, 142 CBPeripheral* peripheral,
138 NSDictionary* advertisementData, 143 NSDictionary* advertisementData,
139 int rssi) { 144 int rssi) {
140 // Look for existing device. 145 observer_->LowEnergyDeviceUpdated(peripheral, advertisementData, rssi);
141 auto iter = devices_.find( 146 }
142 BluetoothLowEnergyDeviceMac::GetPeripheralIdentifier(peripheral));
143 if (iter == devices_.end()) {
144 // A device has been added.
145 BluetoothLowEnergyDeviceMac* device =
146 new BluetoothLowEnergyDeviceMac(peripheral, advertisementData, rssi);
147 devices_.insert(devices_.begin(),
148 std::make_pair(device->GetIdentifier(), device));
149 observer_->DeviceFound(device);
150 return;
151 }
152 147
153 // A device has an update. 148 void BluetoothLowEnergyDiscoveryManagerMac::SetManagerForTesting(
154 BluetoothLowEnergyDeviceMac* old_device = iter->second; 149 CBCentralManager* manager) {
155 old_device->Update(peripheral, advertisementData, rssi); 150 // setDelegate is only available in OSX 10.7 and later.
156 observer_->DeviceUpdated(old_device); 151 CHECK(base::mac::IsOSLionOrLater());
152 SEL selector = NSSelectorFromString(@"setDelegate:");
153 [manager performSelector:selector withObject:bridge_];
154 manager_.reset(manager);
157 } 155 }
158 156
159 BluetoothLowEnergyDiscoveryManagerMac* 157 BluetoothLowEnergyDiscoveryManagerMac*
160 BluetoothLowEnergyDiscoveryManagerMac::Create(Observer* observer) { 158 BluetoothLowEnergyDiscoveryManagerMac::Create(Observer* observer) {
161 return new BluetoothLowEnergyDiscoveryManagerMac(observer); 159 return new BluetoothLowEnergyDiscoveryManagerMac(observer);
162 } 160 }
163 161
164 BluetoothLowEnergyDiscoveryManagerMac::BluetoothLowEnergyDiscoveryManagerMac( 162 BluetoothLowEnergyDiscoveryManagerMac::BluetoothLowEnergyDiscoveryManagerMac(
165 Observer* observer) 163 Observer* observer)
166 : observer_(observer) { 164 : observer_(observer) {
167 bridge_.reset([[BluetoothLowEnergyDiscoveryManagerMacBridge alloc] 165 bridge_.reset([[BluetoothLowEnergyDiscoveryManagerMacBridge alloc]
168 initWithManager:this]); 166 initWithManager:this]);
169 // Since CoreBluetooth is only available on OS X 10.7 or later, we 167 // Since CoreBluetooth is only available on OS X 10.7 or later, we
170 // instantiate CBCentralManager only for OS X >= 10.7. 168 // instantiate CBCentralManager only for OS X >= 10.7.
171 if (base::mac::IsOSLionOrLater()) { 169 if (base::mac::IsOSLionOrLater()) {
172 Class aClass = NSClassFromString(@"CBCentralManager"); 170 Class aClass = NSClassFromString(@"CBCentralManager");
173 manager_.reset( 171 manager_.reset(
174 [[aClass alloc] initWithDelegate:bridge_ 172 [[aClass alloc] initWithDelegate:bridge_
175 queue:dispatch_get_main_queue()]); 173 queue:dispatch_get_main_queue()]);
174 [manager_ retain];
scheib 2015/06/24 23:24:25 Add a comment here referencing the explanation in
krstnmnlsn 2015/06/24 23:42:26 Done.
176 } 175 }
177 discovering_ = false; 176 discovering_ = false;
178 } 177 }
179
180 void BluetoothLowEnergyDiscoveryManagerMac::ClearDevices() {
181 STLDeleteValues(&devices_);
182 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698