| OLD | NEW |
| 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 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 169 | 169 |
| 170 void BluetoothLowEnergyDeviceMac::ConnectToServiceInsecurely( | 170 void BluetoothLowEnergyDeviceMac::ConnectToServiceInsecurely( |
| 171 const device::BluetoothUUID& uuid, | 171 const device::BluetoothUUID& uuid, |
| 172 const ConnectToServiceCallback& callback, | 172 const ConnectToServiceCallback& callback, |
| 173 const ConnectToServiceErrorCallback& error_callback) { | 173 const ConnectToServiceErrorCallback& error_callback) { |
| 174 NOTIMPLEMENTED(); | 174 NOTIMPLEMENTED(); |
| 175 } | 175 } |
| 176 | 176 |
| 177 void BluetoothLowEnergyDeviceMac::CreateGattConnectionImpl() { | 177 void BluetoothLowEnergyDeviceMac::CreateGattConnectionImpl() { |
| 178 if (!IsGattConnected()) { | 178 if (!IsGattConnected()) { |
| 179 VLOG(1) << *this << ": CreateGattConnection."; |
| 179 GetMacAdapter()->CreateGattConnection(this); | 180 GetMacAdapter()->CreateGattConnection(this); |
| 180 } | 181 } |
| 181 } | 182 } |
| 182 | 183 |
| 183 void BluetoothLowEnergyDeviceMac::DisconnectGatt() { | 184 void BluetoothLowEnergyDeviceMac::DisconnectGatt() { |
| 185 VLOG(1) << *this << ": Disconnect."; |
| 184 GetMacAdapter()->DisconnectGatt(this); | 186 GetMacAdapter()->DisconnectGatt(this); |
| 185 } | 187 } |
| 186 | 188 |
| 187 void BluetoothLowEnergyDeviceMac::DidDiscoverPrimaryServices(NSError* error) { | 189 void BluetoothLowEnergyDeviceMac::DidDiscoverPrimaryServices(NSError* error) { |
| 188 --discovery_pending_count_; | 190 --discovery_pending_count_; |
| 189 if (discovery_pending_count_ < 0) { | 191 if (discovery_pending_count_ < 0) { |
| 190 // This should never happens, just in case it happens with a device, | 192 // This should never happens, just in case it happens with a device, |
| 191 // discovery_pending_count_ is set back to 0. | 193 // discovery_pending_count_ is set back to 0. |
| 192 VLOG(1) << GetName()->c_str() | 194 VLOG(1) << *this |
| 193 << ": BluetoothLowEnergyDeviceMac::discovery_pending_count_ " | 195 << ": BluetoothLowEnergyDeviceMac::discovery_pending_count_ " |
| 194 << discovery_pending_count_; | 196 << discovery_pending_count_; |
| 195 discovery_pending_count_ = 0; | 197 discovery_pending_count_ = 0; |
| 196 return; | 198 return; |
| 197 } | 199 } |
| 198 if (error) { | 200 if (error) { |
| 199 // TODO(http://crbug.com/609320): Need to pass the error. | 201 // TODO(http://crbug.com/609320): Need to pass the error. |
| 200 // 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 |
| 201 // a device services. | 203 // a device services. |
| 202 VLOG(1) << "Can't discover primary services: " | 204 VLOG(1) << *this << ": Can't discover primary services: " |
| 203 << error.localizedDescription.UTF8String << " (" << error.domain | 205 << error.localizedDescription.UTF8String << " (" << error.domain |
| 204 << ": " << error.code << ")"; | 206 << ": " << error.code << ")."; |
| 205 return; | 207 return; |
| 206 } | 208 } |
| 207 VLOG(1) << "DidDiscoverPrimaryServices, pending count: " | |
| 208 << discovery_pending_count_; | |
| 209 | 209 |
| 210 if (!IsGattConnected()) { | 210 if (!IsGattConnected()) { |
| 211 // Don't create services if the device disconnected. | 211 // Don't create services if the device disconnected. |
| 212 VLOG(1) << *this << ": DidDiscoverPrimaryServices, gatt not connected."; |
| 212 return; | 213 return; |
| 213 } | 214 } |
| 215 VLOG(1) << *this << ": DidDiscoverPrimaryServices, pending count: " |
| 216 << discovery_pending_count_; |
| 214 | 217 |
| 215 for (CBService* cb_service in GetPeripheral().services) { | 218 for (CBService* cb_service in GetPeripheral().services) { |
| 216 BluetoothRemoteGattServiceMac* gatt_service = | 219 BluetoothRemoteGattServiceMac* gatt_service = |
| 217 GetBluetoothRemoteGattService(cb_service); | 220 GetBluetoothRemoteGattService(cb_service); |
| 218 if (!gatt_service) { | 221 if (!gatt_service) { |
| 219 gatt_service = new BluetoothRemoteGattServiceMac(this, cb_service, | 222 gatt_service = new BluetoothRemoteGattServiceMac(this, cb_service, |
| 220 true /* is_primary */); | 223 true /* is_primary */); |
| 221 auto result_iter = gatt_services_.insert(std::make_pair( | 224 auto result_iter = gatt_services_.insert(std::make_pair( |
| 222 gatt_service->GetIdentifier(), base::WrapUnique(gatt_service))); | 225 gatt_service->GetIdentifier(), base::WrapUnique(gatt_service))); |
| 223 DCHECK(result_iter.second); | 226 DCHECK(result_iter.second); |
| 227 VLOG(1) << *gatt_service << ": New service."; |
| 224 adapter_->NotifyGattServiceAdded(gatt_service); | 228 adapter_->NotifyGattServiceAdded(gatt_service); |
| 229 } else { |
| 230 VLOG(1) << *gatt_service << ": Known service."; |
| 225 } | 231 } |
| 226 } | 232 } |
| 227 if (discovery_pending_count_ == 0) { | 233 if (discovery_pending_count_ == 0) { |
| 228 for (auto it = gatt_services_.begin(); it != gatt_services_.end(); ++it) { | 234 for (auto it = gatt_services_.begin(); it != gatt_services_.end(); ++it) { |
| 229 device::BluetoothRemoteGattService* gatt_service = it->second.get(); | 235 device::BluetoothRemoteGattService* gatt_service = it->second.get(); |
| 230 device::BluetoothRemoteGattServiceMac* gatt_service_mac = | 236 device::BluetoothRemoteGattServiceMac* gatt_service_mac = |
| 231 static_cast<BluetoothRemoteGattServiceMac*>(gatt_service); | 237 static_cast<BluetoothRemoteGattServiceMac*>(gatt_service); |
| 232 gatt_service_mac->DiscoverCharacteristics(); | 238 gatt_service_mac->DiscoverCharacteristics(); |
| 233 } | 239 } |
| 234 SendNotificationIfDiscoveryComplete(); | 240 SendNotificationIfDiscoveryComplete(); |
| 235 } | 241 } |
| 236 } | 242 } |
| 237 | 243 |
| 238 void BluetoothLowEnergyDeviceMac::DidDiscoverCharacteristics( | 244 void BluetoothLowEnergyDeviceMac::DidDiscoverCharacteristics( |
| 239 CBService* cb_service, | 245 CBService* cb_service, |
| 240 NSError* error) { | 246 NSError* error) { |
| 241 if (error) { | 247 if (error) { |
| 242 // TODO(http://crbug.com/609320): Need to pass the error. | 248 // TODO(http://crbug.com/609320): Need to pass the error. |
| 243 // TODO(http://crbug.com/609844): Decide what to do if discover failed | 249 // TODO(http://crbug.com/609844): Decide what to do if discover failed |
| 244 VLOG(1) << "Can't discover characteristics: " | 250 VLOG(1) << *this << ": Can't discover characteristics: " |
| 245 << error.localizedDescription.UTF8String << " (" << error.domain | 251 << error.localizedDescription.UTF8String << " (" << error.domain |
| 246 << ": " << error.code << ")"; | 252 << ": " << error.code << ")."; |
| 247 return; | 253 return; |
| 248 } | 254 } |
| 249 VLOG(1) << "DidDiscoverCharacteristics."; | |
| 250 | 255 |
| 251 if (!IsGattConnected()) { | 256 if (!IsGattConnected()) { |
| 257 VLOG(1) << *this << ": DidDiscoverCharacteristics, gatt disconnected."; |
| 252 // Don't create characteristics if the device disconnected. | 258 // Don't create characteristics if the device disconnected. |
| 253 return; | 259 return; |
| 254 } | 260 } |
| 255 | 261 |
| 256 BluetoothRemoteGattServiceMac* gatt_service = | 262 BluetoothRemoteGattServiceMac* gatt_service = |
| 257 GetBluetoothRemoteGattService(cb_service); | 263 GetBluetoothRemoteGattService(cb_service); |
| 258 DCHECK(gatt_service); | 264 DCHECK(gatt_service); |
| 259 gatt_service->DidDiscoverCharacteristics(); | 265 gatt_service->DidDiscoverCharacteristics(); |
| 260 SendNotificationIfDiscoveryComplete(); | 266 SendNotificationIfDiscoveryComplete(); |
| 261 } | 267 } |
| 262 | 268 |
| 263 void BluetoothLowEnergyDeviceMac::DidModifyServices( | 269 void BluetoothLowEnergyDeviceMac::DidModifyServices( |
| 264 NSArray* invalidatedServices) { | 270 NSArray* invalidatedServices) { |
| 265 VLOG(1) << "DidModifyServices: "; | 271 VLOG(1) << *this << ": DidModifyServices: " |
| 272 << " invalidated services " |
| 273 << base::SysNSStringToUTF8([invalidatedServices description]); |
| 266 for (CBService* cb_service in invalidatedServices) { | 274 for (CBService* cb_service in invalidatedServices) { |
| 267 BluetoothRemoteGattServiceMac* gatt_service = | 275 BluetoothRemoteGattServiceMac* gatt_service = |
| 268 GetBluetoothRemoteGattService(cb_service); | 276 GetBluetoothRemoteGattService(cb_service); |
| 269 DCHECK(gatt_service); | 277 DCHECK(gatt_service); |
| 270 VLOG(1) << gatt_service->GetUUID().canonical_value(); | 278 VLOG(1) << gatt_service->GetUUID().canonical_value(); |
| 271 std::unique_ptr<BluetoothRemoteGattService> scoped_service = | 279 std::unique_ptr<BluetoothRemoteGattService> scoped_service = |
| 272 std::move(gatt_services_[gatt_service->GetIdentifier()]); | 280 std::move(gatt_services_[gatt_service->GetIdentifier()]); |
| 273 gatt_services_.erase(gatt_service->GetIdentifier()); | 281 gatt_services_.erase(gatt_service->GetIdentifier()); |
| 274 adapter_->NotifyGattServiceRemoved(scoped_service.get()); | 282 adapter_->NotifyGattServiceRemoved(scoped_service.get()); |
| 275 } | 283 } |
| 276 device_uuids_.ClearServiceUUIDs(); | 284 device_uuids_.ClearServiceUUIDs(); |
| 277 SetGattServicesDiscoveryComplete(false); | 285 SetGattServicesDiscoveryComplete(false); |
| 278 adapter_->NotifyDeviceChanged(this); | 286 adapter_->NotifyDeviceChanged(this); |
| 279 DiscoverPrimaryServices(); | 287 DiscoverPrimaryServices(); |
| 280 } | 288 } |
| 281 | 289 |
| 282 void BluetoothLowEnergyDeviceMac::DidUpdateValue( | 290 void BluetoothLowEnergyDeviceMac::DidUpdateValue( |
| 283 CBCharacteristic* characteristic, | 291 CBCharacteristic* characteristic, |
| 284 NSError* error) { | 292 NSError* error) { |
| 285 VLOG(1) << "DidUpdateValue."; | |
| 286 BluetoothRemoteGattServiceMac* gatt_service = | 293 BluetoothRemoteGattServiceMac* gatt_service = |
| 287 GetBluetoothRemoteGattService(characteristic.service); | 294 GetBluetoothRemoteGattService(characteristic.service); |
| 288 DCHECK(gatt_service); | 295 DCHECK(gatt_service); |
| 289 gatt_service->DidUpdateValue(characteristic, error); | 296 gatt_service->DidUpdateValue(characteristic, error); |
| 290 } | 297 } |
| 291 | 298 |
| 292 void BluetoothLowEnergyDeviceMac::DidWriteValue( | 299 void BluetoothLowEnergyDeviceMac::DidWriteValue( |
| 293 CBCharacteristic* characteristic, | 300 CBCharacteristic* characteristic, |
| 294 NSError* error) { | 301 NSError* error) { |
| 295 VLOG(1) << "DidWriteValue."; | |
| 296 BluetoothRemoteGattServiceMac* gatt_service = | 302 BluetoothRemoteGattServiceMac* gatt_service = |
| 297 GetBluetoothRemoteGattService(characteristic.service); | 303 GetBluetoothRemoteGattService(characteristic.service); |
| 298 DCHECK(gatt_service); | 304 DCHECK(gatt_service); |
| 299 gatt_service->DidWriteValue(characteristic, error); | 305 gatt_service->DidWriteValue(characteristic, error); |
| 300 } | 306 } |
| 301 | 307 |
| 302 void BluetoothLowEnergyDeviceMac::DidUpdateNotificationState( | 308 void BluetoothLowEnergyDeviceMac::DidUpdateNotificationState( |
| 303 CBCharacteristic* characteristic, | 309 CBCharacteristic* characteristic, |
| 304 NSError* error) { | 310 NSError* error) { |
| 305 VLOG(1) << "DidUpdateNotificationState"; | |
| 306 BluetoothRemoteGattServiceMac* gatt_service = | 311 BluetoothRemoteGattServiceMac* gatt_service = |
| 307 GetBluetoothRemoteGattService(characteristic.service); | 312 GetBluetoothRemoteGattService(characteristic.service); |
| 308 DCHECK(gatt_service); | 313 DCHECK(gatt_service); |
| 309 gatt_service->DidUpdateNotificationState(characteristic, error); | 314 gatt_service->DidUpdateNotificationState(characteristic, error); |
| 310 } | 315 } |
| 311 | 316 |
| 312 void BluetoothLowEnergyDeviceMac::DidDiscoverDescriptors( | 317 void BluetoothLowEnergyDeviceMac::DidDiscoverDescriptors( |
| 313 CBCharacteristic* cb_characteristic, | 318 CBCharacteristic* cb_characteristic, |
| 314 NSError* error) { | 319 NSError* error) { |
| 315 if (error) { | 320 if (error) { |
| 316 // TODO(http://crbug.com/609320): Need to pass the error. | 321 // TODO(http://crbug.com/609320): Need to pass the error. |
| 317 // TODO(http://crbug.com/609844): Decide what to do if discover failed | 322 // TODO(http://crbug.com/609844): Decide what to do if discover failed |
| 318 VLOG(1) << "Can't discover descriptors: " | 323 VLOG(1) << *this << ": Can't discover descriptors: " |
| 319 << error.localizedDescription.UTF8String << " (" << error.domain | 324 << error.localizedDescription.UTF8String << " (" << error.domain |
| 320 << ": " << error.code << ")"; | 325 << ": " << error.code << ")."; |
| 321 return; | 326 return; |
| 322 } | 327 } |
| 323 VLOG(1) << "DidDiscoverDescriptors."; | |
| 324 if (!IsGattConnected()) { | 328 if (!IsGattConnected()) { |
| 329 VLOG(1) << *this << ": DidDiscoverDescriptors, disconnected."; |
| 325 // Don't discover descriptors if the device disconnected. | 330 // Don't discover descriptors if the device disconnected. |
| 326 return; | 331 return; |
| 327 } | 332 } |
| 328 BluetoothRemoteGattServiceMac* gatt_service = | 333 BluetoothRemoteGattServiceMac* gatt_service = |
| 329 GetBluetoothRemoteGattService(cb_characteristic.service); | 334 GetBluetoothRemoteGattService(cb_characteristic.service); |
| 330 DCHECK(gatt_service); | 335 DCHECK(gatt_service); |
| 331 gatt_service->DidDiscoverDescriptors(cb_characteristic); | 336 gatt_service->DidDiscoverDescriptors(cb_characteristic); |
| 332 SendNotificationIfDiscoveryComplete(); | 337 SendNotificationIfDiscoveryComplete(); |
| 333 } | 338 } |
| 334 | 339 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 346 CBPeripheral* peripheral) { | 351 CBPeripheral* peripheral) { |
| 347 const size_t kCanonicalAddressNumberOfBytes = 6; | 352 const size_t kCanonicalAddressNumberOfBytes = 6; |
| 348 char raw[kCanonicalAddressNumberOfBytes]; | 353 char raw[kCanonicalAddressNumberOfBytes]; |
| 349 crypto::SHA256HashString(GetPeripheralIdentifier(peripheral), raw, | 354 crypto::SHA256HashString(GetPeripheralIdentifier(peripheral), raw, |
| 350 sizeof(raw)); | 355 sizeof(raw)); |
| 351 std::string hash = base::HexEncode(raw, sizeof(raw)); | 356 std::string hash = base::HexEncode(raw, sizeof(raw)); |
| 352 return BluetoothDevice::CanonicalizeAddress(hash); | 357 return BluetoothDevice::CanonicalizeAddress(hash); |
| 353 } | 358 } |
| 354 | 359 |
| 355 void BluetoothLowEnergyDeviceMac::DiscoverPrimaryServices() { | 360 void BluetoothLowEnergyDeviceMac::DiscoverPrimaryServices() { |
| 356 VLOG(1) << "DidDiscoverDescriptors pending count" << discovery_pending_count_; | 361 VLOG(1) << *this << ": DiscoverPrimaryServices, pending count " |
| 362 << discovery_pending_count_; |
| 357 ++discovery_pending_count_; | 363 ++discovery_pending_count_; |
| 358 [GetPeripheral() discoverServices:nil]; | 364 [GetPeripheral() discoverServices:nil]; |
| 359 } | 365 } |
| 360 | 366 |
| 361 void BluetoothLowEnergyDeviceMac::SendNotificationIfDiscoveryComplete() { | 367 void BluetoothLowEnergyDeviceMac::SendNotificationIfDiscoveryComplete() { |
| 362 // Notify when all services have been discovered. | 368 // Notify when all services have been discovered. |
| 363 bool discovery_complete = | 369 bool discovery_complete = |
| 364 discovery_pending_count_ == 0 && | 370 discovery_pending_count_ == 0 && |
| 365 std::find_if_not( | 371 std::find_if_not( |
| 366 gatt_services_.begin(), | 372 gatt_services_.begin(), |
| 367 gatt_services_.end(), [](GattServiceMap::value_type & pair) { | 373 gatt_services_.end(), [](GattServiceMap::value_type & pair) { |
| 368 BluetoothRemoteGattService* gatt_service = pair.second.get(); | 374 BluetoothRemoteGattService* gatt_service = pair.second.get(); |
| 369 return static_cast<BluetoothRemoteGattServiceMac*>(gatt_service) | 375 return static_cast<BluetoothRemoteGattServiceMac*>(gatt_service) |
| 370 ->IsDiscoveryComplete(); | 376 ->IsDiscoveryComplete(); |
| 371 }) == gatt_services_.end(); | 377 }) == gatt_services_.end(); |
| 372 if (discovery_complete) { | 378 if (discovery_complete) { |
| 379 VLOG(1) << *this << ": Discovery complete."; |
| 373 device_uuids_.ReplaceServiceUUIDs(gatt_services_); | 380 device_uuids_.ReplaceServiceUUIDs(gatt_services_); |
| 374 SetGattServicesDiscoveryComplete(true); | 381 SetGattServicesDiscoveryComplete(true); |
| 375 adapter_->NotifyGattServicesDiscovered(this); | 382 adapter_->NotifyGattServicesDiscovered(this); |
| 376 adapter_->NotifyDeviceChanged(this); | 383 adapter_->NotifyDeviceChanged(this); |
| 377 } | 384 } |
| 378 } | 385 } |
| 379 | 386 |
| 380 device::BluetoothAdapterMac* BluetoothLowEnergyDeviceMac::GetMacAdapter() { | 387 device::BluetoothAdapterMac* BluetoothLowEnergyDeviceMac::GetMacAdapter() { |
| 381 return static_cast<BluetoothAdapterMac*>(this->adapter_); | 388 return static_cast<BluetoothAdapterMac*>(this->adapter_); |
| 382 } | 389 } |
| 383 | 390 |
| 384 CBPeripheral* BluetoothLowEnergyDeviceMac::GetPeripheral() { | 391 CBPeripheral* BluetoothLowEnergyDeviceMac::GetPeripheral() { |
| 385 return peripheral_; | 392 return peripheral_; |
| 386 } | 393 } |
| 387 | 394 |
| 388 device::BluetoothRemoteGattServiceMac* | 395 device::BluetoothRemoteGattServiceMac* |
| 389 BluetoothLowEnergyDeviceMac::GetBluetoothRemoteGattService( | 396 BluetoothLowEnergyDeviceMac::GetBluetoothRemoteGattService( |
| 390 CBService* cb_service) const { | 397 CBService* cb_service) const { |
| 391 for (auto it = gatt_services_.begin(); it != gatt_services_.end(); ++it) { | 398 for (auto it = gatt_services_.begin(); it != gatt_services_.end(); ++it) { |
| 392 device::BluetoothRemoteGattService* gatt_service = it->second.get(); | 399 device::BluetoothRemoteGattService* gatt_service = it->second.get(); |
| 393 device::BluetoothRemoteGattServiceMac* gatt_service_mac = | 400 device::BluetoothRemoteGattServiceMac* gatt_service_mac = |
| 394 static_cast<BluetoothRemoteGattServiceMac*>(gatt_service); | 401 static_cast<BluetoothRemoteGattServiceMac*>(gatt_service); |
| 395 if (gatt_service_mac->GetService() == cb_service) | 402 if (gatt_service_mac->GetService() == cb_service) |
| 396 return gatt_service_mac; | 403 return gatt_service_mac; |
| 397 } | 404 } |
| 398 return nullptr; | 405 return nullptr; |
| 399 } | 406 } |
| 400 | 407 |
| 401 void BluetoothLowEnergyDeviceMac::DidDisconnectPeripheral(NSError* error) { | 408 void BluetoothLowEnergyDeviceMac::DidDisconnectPeripheral(NSError* error) { |
| 409 VLOG(1) << *this << ": Disconnected from peripheral."; |
| 410 if (error) { |
| 411 VLOG(1) << *this << ": Bluetooth error, domain: " << error.domain.UTF8String |
| 412 << ", error code: " << error.code; |
| 413 } |
| 402 SetGattServicesDiscoveryComplete(false); | 414 SetGattServicesDiscoveryComplete(false); |
| 403 // Removing all services at once to ensure that calling GetGattService on | 415 // Removing all services at once to ensure that calling GetGattService on |
| 404 // removed service in GattServiceRemoved returns null. | 416 // removed service in GattServiceRemoved returns null. |
| 405 GattServiceMap gatt_services_swapped; | 417 GattServiceMap gatt_services_swapped; |
| 406 gatt_services_swapped.swap(gatt_services_); | 418 gatt_services_swapped.swap(gatt_services_); |
| 407 gatt_services_swapped.clear(); | 419 gatt_services_swapped.clear(); |
| 408 device_uuids_.ClearServiceUUIDs(); | 420 device_uuids_.ClearServiceUUIDs(); |
| 409 // There are two cases in which this function will be called: | 421 // There are two cases in which this function will be called: |
| 410 // 1. When the connection to the device breaks (either because | 422 // 1. When the connection to the device breaks (either because |
| 411 // we closed it or the device closed it). | 423 // we closed it or the device closed it). |
| 412 // 2. When we cancel a pending connection request. | 424 // 2. When we cancel a pending connection request. |
| 413 if (create_gatt_connection_error_callbacks_.empty()) { | 425 if (create_gatt_connection_error_callbacks_.empty()) { |
| 414 // If there are no pending callbacks then the connection broke (#1). | 426 // If there are no pending callbacks then the connection broke (#1). |
| 415 DidDisconnectGatt(true /* notifyDeviceChanged */); | 427 DidDisconnectGatt(true /* notifyDeviceChanged */); |
| 416 return; | 428 return; |
| 417 } | 429 } |
| 418 // Else we canceled the connection request (#2). | 430 // Else we canceled the connection request (#2). |
| 419 // TODO(http://crbug.com/585897): Need to pass the error. | 431 // TODO(http://crbug.com/585897): Need to pass the error. |
| 420 DidFailToConnectGatt(BluetoothDevice::ConnectErrorCode::ERROR_FAILED); | 432 DidFailToConnectGatt(BluetoothDevice::ConnectErrorCode::ERROR_FAILED); |
| 421 } | 433 } |
| 434 |
| 435 namespace device { |
| 436 |
| 437 std::ostream& operator<<(std::ostream& out, |
| 438 const BluetoothLowEnergyDeviceMac& device) { |
| 439 // TODO(crbug.com/703878): Should use |
| 440 // BluetoothLowEnergyDeviceMac::GetNameForDisplay() instead. |
| 441 base::Optional<std::string> name = device.GetName(); |
| 442 const char* name_cstr = name ? name->c_str() : ""; |
| 443 return out << "<BluetoothLowEnergyDeviceMac " << device.GetAddress() << "/" |
| 444 << &device << ", \"" << name_cstr << "\">"; |
| 445 } |
| 446 } // namespace device |
| OLD | NEW |