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 "components/arc/bluetooth/arc_bluetooth_bridge.h" | 5 #include "components/arc/bluetooth/arc_bluetooth_bridge.h" |
| 6 | 6 |
| 7 #include <fcntl.h> | 7 #include <fcntl.h> |
| 8 #include <stddef.h> | 8 #include <stddef.h> |
| 9 | 9 |
| 10 #include <iomanip> | 10 #include <iomanip> |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 38 using device::BluetoothGattNotifySession; | 38 using device::BluetoothGattNotifySession; |
| 39 using device::BluetoothGattCharacteristic; | 39 using device::BluetoothGattCharacteristic; |
| 40 using device::BluetoothGattDescriptor; | 40 using device::BluetoothGattDescriptor; |
| 41 using device::BluetoothGattService; | 41 using device::BluetoothGattService; |
| 42 using device::BluetoothRemoteGattCharacteristic; | 42 using device::BluetoothRemoteGattCharacteristic; |
| 43 using device::BluetoothRemoteGattDescriptor; | 43 using device::BluetoothRemoteGattDescriptor; |
| 44 using device::BluetoothRemoteGattService; | 44 using device::BluetoothRemoteGattService; |
| 45 using device::BluetoothUUID; | 45 using device::BluetoothUUID; |
| 46 | 46 |
| 47 namespace { | 47 namespace { |
| 48 const int kMinBtleVersion = 1; | 48 constexpr int32_t kMinBtleVersion = 1; |
| 49 const uint32_t kGattReadPermission = | 49 constexpr int32_t kMinBtleNotifyVersion = 2; |
| 50 constexpr uint32_t kGattReadPermission = | |
| 50 BluetoothGattCharacteristic::Permission::PERMISSION_READ | | 51 BluetoothGattCharacteristic::Permission::PERMISSION_READ | |
| 51 BluetoothGattCharacteristic::Permission::PERMISSION_READ_ENCRYPTED | | 52 BluetoothGattCharacteristic::Permission::PERMISSION_READ_ENCRYPTED | |
| 52 BluetoothGattCharacteristic::Permission:: | 53 BluetoothGattCharacteristic::Permission:: |
| 53 PERMISSION_READ_ENCRYPTED_AUTHENTICATED; | 54 PERMISSION_READ_ENCRYPTED_AUTHENTICATED; |
| 54 const uint32_t kGattWritePermission = | 55 constexpr uint32_t kGattWritePermission = |
| 55 BluetoothGattCharacteristic::Permission::PERMISSION_WRITE | | 56 BluetoothGattCharacteristic::Permission::PERMISSION_WRITE | |
| 56 BluetoothGattCharacteristic::Permission::PERMISSION_WRITE_ENCRYPTED | | 57 BluetoothGattCharacteristic::Permission::PERMISSION_WRITE_ENCRYPTED | |
| 57 BluetoothGattCharacteristic::Permission:: | 58 BluetoothGattCharacteristic::Permission:: |
| 58 PERMISSION_WRITE_ENCRYPTED_AUTHENTICATED; | 59 PERMISSION_WRITE_ENCRYPTED_AUTHENTICATED; |
| 59 } // namespace | 60 } // namespace |
| 60 | 61 |
| 61 namespace arc { | 62 namespace arc { |
| 62 | 63 |
| 63 ArcBluetoothBridge::ArcBluetoothBridge(ArcBridgeService* bridge_service) | 64 ArcBluetoothBridge::ArcBluetoothBridge(ArcBridgeService* bridge_service) |
| 64 : ArcService(bridge_service), binding_(this), weak_factory_(this) { | 65 : ArcService(bridge_service), binding_(this), weak_factory_(this) { |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 124 | 125 |
| 125 if (device->IsConnected()) | 126 if (device->IsConnected()) |
| 126 return; | 127 return; |
| 127 | 128 |
| 128 mojo::Array<mojom::BluetoothPropertyPtr> properties = | 129 mojo::Array<mojom::BluetoothPropertyPtr> properties = |
| 129 GetDeviceProperties(mojom::BluetoothPropertyType::ALL, device); | 130 GetDeviceProperties(mojom::BluetoothPropertyType::ALL, device); |
| 130 | 131 |
| 131 arc_bridge_service()->bluetooth_instance()->OnDeviceFound( | 132 arc_bridge_service()->bluetooth_instance()->OnDeviceFound( |
| 132 std::move(properties)); | 133 std::move(properties)); |
| 133 | 134 |
| 134 if (arc_bridge_service()->bluetooth_version() < kMinBtleVersion) { | 135 if (!CheckBluetoothInstanceVersion(kMinBtleVersion)) |
| 135 LOG(WARNING) << "Bluetooth instance is too old and does not support BTLE"; | |
| 136 return; | 136 return; |
| 137 } | |
| 138 | 137 |
| 139 mojom::BluetoothAddressPtr addr = | 138 mojom::BluetoothAddressPtr addr = |
| 140 mojom::BluetoothAddress::From(device->GetAddress()); | 139 mojom::BluetoothAddress::From(device->GetAddress()); |
| 141 int rssi = device->GetInquiryRSSI(); | 140 int rssi = device->GetInquiryRSSI(); |
| 142 mojo::Array<mojom::BluetoothAdvertisingDataPtr> adv_data = | 141 mojo::Array<mojom::BluetoothAdvertisingDataPtr> adv_data = |
| 143 GetAdvertisingData(device); | 142 GetAdvertisingData(device); |
| 144 arc_bridge_service()->bluetooth_instance()->OnLEDeviceFound( | 143 arc_bridge_service()->bluetooth_instance()->OnLEDeviceFound( |
| 145 std::move(addr), rssi, std::move(adv_data)); | 144 std::move(addr), rssi, std::move(adv_data)); |
| 146 } | 145 } |
| 147 | 146 |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 198 BluetoothDevice* device, | 197 BluetoothDevice* device, |
| 199 BluetoothRemoteGattService* service) { | 198 BluetoothRemoteGattService* service) { |
| 200 // Placeholder for GATT client functionality | 199 // Placeholder for GATT client functionality |
| 201 } | 200 } |
| 202 | 201 |
| 203 void ArcBluetoothBridge::GattServicesDiscovered(BluetoothAdapter* adapter, | 202 void ArcBluetoothBridge::GattServicesDiscovered(BluetoothAdapter* adapter, |
| 204 BluetoothDevice* device) { | 203 BluetoothDevice* device) { |
| 205 if (!HasBluetoothInstance()) | 204 if (!HasBluetoothInstance()) |
| 206 return; | 205 return; |
| 207 | 206 |
| 208 if (arc_bridge_service()->bluetooth_version() < kMinBtleVersion) { | 207 if (!CheckBluetoothInstanceVersion(kMinBtleVersion)) |
| 209 LOG(WARNING) << "Bluetooth instance is too old and does not support BTLE"; | |
| 210 return; | 208 return; |
| 211 } | |
| 212 | 209 |
| 213 mojom::BluetoothAddressPtr addr = | 210 mojom::BluetoothAddressPtr addr = |
| 214 mojom::BluetoothAddress::From(device->GetAddress()); | 211 mojom::BluetoothAddress::From(device->GetAddress()); |
| 215 | 212 |
| 216 arc_bridge_service()->bluetooth_instance()->OnSearchComplete( | 213 arc_bridge_service()->bluetooth_instance()->OnSearchComplete( |
| 217 std::move(addr), mojom::BluetoothGattStatus::GATT_SUCCESS); | 214 std::move(addr), mojom::BluetoothGattStatus::GATT_SUCCESS); |
| 218 } | 215 } |
| 219 | 216 |
| 220 void ArcBluetoothBridge::GattDiscoveryCompleteForService( | 217 void ArcBluetoothBridge::GattDiscoveryCompleteForService( |
| 221 BluetoothAdapter* adapter, | 218 BluetoothAdapter* adapter, |
| (...skipping 28 matching lines...) Expand all Loading... | |
| 250 void ArcBluetoothBridge::GattDescriptorRemoved( | 247 void ArcBluetoothBridge::GattDescriptorRemoved( |
| 251 BluetoothAdapter* adapter, | 248 BluetoothAdapter* adapter, |
| 252 BluetoothRemoteGattDescriptor* descriptor) { | 249 BluetoothRemoteGattDescriptor* descriptor) { |
| 253 // Placeholder for GATT client functionality | 250 // Placeholder for GATT client functionality |
| 254 } | 251 } |
| 255 | 252 |
| 256 void ArcBluetoothBridge::GattCharacteristicValueChanged( | 253 void ArcBluetoothBridge::GattCharacteristicValueChanged( |
| 257 BluetoothAdapter* adapter, | 254 BluetoothAdapter* adapter, |
| 258 BluetoothRemoteGattCharacteristic* characteristic, | 255 BluetoothRemoteGattCharacteristic* characteristic, |
| 259 const std::vector<uint8_t>& value) { | 256 const std::vector<uint8_t>& value) { |
| 260 // Placeholder for GATT client functionality | 257 if (!HasBluetoothInstance()) |
| 258 return; | |
| 259 | |
| 260 if (!CheckBluetoothInstanceVersion(kMinBtleNotifyVersion)) | |
| 261 return; | |
| 262 | |
| 263 BluetoothRemoteGattService* service = characteristic->GetService(); | |
| 264 BluetoothDevice* device = service->GetDevice(); | |
| 265 mojom::BluetoothAddressPtr address = | |
| 266 mojom::BluetoothAddress::From(device->GetAddress()); | |
| 267 mojom::BluetoothGattServiceIDPtr service_id = | |
| 268 mojom::BluetoothGattServiceID::New(); | |
| 269 service_id->is_primary = service->IsPrimary(); | |
| 270 service_id->id = mojom::BluetoothGattID::New(); | |
| 271 service_id->id->inst_id = ConvertGattIdentifierToId(service->GetIdentifier()); | |
| 272 service_id->id->uuid = mojom::BluetoothUUID::From(service->GetUUID()); | |
| 273 | |
| 274 mojom::BluetoothGattIDPtr char_id = mojom::BluetoothGattID::New(); | |
| 275 char_id->inst_id = ConvertGattIdentifierToId(characteristic->GetIdentifier()); | |
| 276 char_id->uuid = mojom::BluetoothUUID::From(characteristic->GetUUID()); | |
| 277 | |
| 278 arc_bridge_service()->bluetooth_instance()->OnGattNotify( | |
| 279 std::move(address), std::move(service_id), std::move(char_id), | |
| 280 true /* is_notify */, mojo::Array<uint8_t>::From(value)); | |
| 261 } | 281 } |
| 262 | 282 |
| 263 void ArcBluetoothBridge::GattDescriptorValueChanged( | 283 void ArcBluetoothBridge::GattDescriptorValueChanged( |
| 264 BluetoothAdapter* adapter, | 284 BluetoothAdapter* adapter, |
| 265 BluetoothRemoteGattDescriptor* descriptor, | 285 BluetoothRemoteGattDescriptor* descriptor, |
| 266 const std::vector<uint8_t>& value) { | 286 const std::vector<uint8_t>& value) { |
| 267 // Placeholder for GATT client functionality | 287 // Placeholder for GATT client functionality |
| 268 } | 288 } |
| 269 | 289 |
| 270 void ArcBluetoothBridge::EnableAdapter(const EnableAdapterCallback& callback) { | 290 void ArcBluetoothBridge::EnableAdapter(const EnableAdapterCallback& callback) { |
| (...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 530 void ArcBluetoothBridge::StopLEScan() { | 550 void ArcBluetoothBridge::StopLEScan() { |
| 531 CancelDiscovery(); | 551 CancelDiscovery(); |
| 532 } | 552 } |
| 533 | 553 |
| 534 void ArcBluetoothBridge::OnGattConnectStateChanged( | 554 void ArcBluetoothBridge::OnGattConnectStateChanged( |
| 535 mojom::BluetoothAddressPtr addr, | 555 mojom::BluetoothAddressPtr addr, |
| 536 bool connected) const { | 556 bool connected) const { |
| 537 if (!HasBluetoothInstance()) | 557 if (!HasBluetoothInstance()) |
| 538 return; | 558 return; |
| 539 | 559 |
| 540 if (arc_bridge_service()->bluetooth_version() < kMinBtleVersion) { | 560 if (!CheckBluetoothInstanceVersion(kMinBtleVersion)) |
| 541 LOG(WARNING) << "Bluetooth instance is too old and does not support BTLE"; | |
| 542 return; | 561 return; |
| 543 } | |
| 544 | 562 |
| 545 DCHECK(addr); | 563 DCHECK(addr); |
| 546 | 564 |
| 547 arc_bridge_service()->bluetooth_instance()->OnLEConnectionStateChange( | 565 arc_bridge_service()->bluetooth_instance()->OnLEConnectionStateChange( |
| 548 std::move(addr), connected); | 566 std::move(addr), connected); |
| 549 } | 567 } |
| 550 | 568 |
| 551 void ArcBluetoothBridge::OnGattConnected( | 569 void ArcBluetoothBridge::OnGattConnected( |
| 552 mojom::BluetoothAddressPtr addr, | 570 mojom::BluetoothAddressPtr addr, |
| 553 std::unique_ptr<BluetoothGattConnection> connection) const { | 571 std::unique_ptr<BluetoothGattConnection> connection) const { |
| (...skipping 341 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 895 mojom::BluetoothGattIDPtr char_id, | 913 mojom::BluetoothGattIDPtr char_id, |
| 896 mojom::BluetoothGattIDPtr desc_id, | 914 mojom::BluetoothGattIDPtr desc_id, |
| 897 mojom::BluetoothGattValuePtr value, | 915 mojom::BluetoothGattValuePtr value, |
| 898 const WriteGattDescriptorCallback& callback) { | 916 const WriteGattDescriptorCallback& callback) { |
| 899 BluetoothRemoteGattDescriptor* descriptor = | 917 BluetoothRemoteGattDescriptor* descriptor = |
| 900 FindGattDescriptor(std::move(remote_addr), std::move(service_id), | 918 FindGattDescriptor(std::move(remote_addr), std::move(service_id), |
| 901 std::move(char_id), std::move(desc_id)); | 919 std::move(char_id), std::move(desc_id)); |
| 902 DCHECK(descriptor); | 920 DCHECK(descriptor); |
| 903 DCHECK(descriptor->GetPermissions() & kGattWritePermission); | 921 DCHECK(descriptor->GetPermissions() & kGattWritePermission); |
| 904 | 922 |
| 923 // To register / deregister GATT notification, we need to | |
| 924 // 1) Write to CCC Descriptor to enable/disable the notification | |
| 925 // 2) Ask BT hw to register / deregister the notification | |
| 926 // The Chrome API groups both steps into one API, and does not support writing | |
| 927 // directly to the CCC Descriptor. Therefore, until we fix | |
| 928 // https://crbug.com/622832, we return successfully when we encounter this. | |
| 929 // TODO(http://crbug.com/622832) | |
| 930 if (descriptor->GetUUID() == | |
| 931 BluetoothGattDescriptor::ClientCharacteristicConfigurationUuid()) { | |
| 932 OnGattWriteDone(callback); | |
| 933 return; | |
| 934 } | |
| 935 | |
| 905 descriptor->WriteRemoteDescriptor( | 936 descriptor->WriteRemoteDescriptor( |
| 906 value->value.To<std::vector<uint8_t>>(), | 937 value->value.To<std::vector<uint8_t>>(), |
| 907 base::Bind(&ArcBluetoothBridge::OnGattWriteDone, | 938 base::Bind(&ArcBluetoothBridge::OnGattWriteDone, |
| 908 weak_factory_.GetWeakPtr(), callback), | 939 weak_factory_.GetWeakPtr(), callback), |
| 909 base::Bind(&ArcBluetoothBridge::OnGattWriteError, | 940 base::Bind(&ArcBluetoothBridge::OnGattWriteError, |
| 910 weak_factory_.GetWeakPtr(), callback)); | 941 weak_factory_.GetWeakPtr(), callback)); |
| 911 } | 942 } |
| 912 | 943 |
| 913 void ArcBluetoothBridge::OnGattNotifyStartDone( | 944 void ArcBluetoothBridge::OnGattNotifyStartDone( |
| 914 const RegisterForGattNotificationCallback& callback, | 945 const RegisterForGattNotificationCallback& callback, |
| (...skipping 395 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1310 // OnBondStateChanged must be called with mojom::BluetoothBondState::BONDING | 1341 // OnBondStateChanged must be called with mojom::BluetoothBondState::BONDING |
| 1311 // to | 1342 // to |
| 1312 // make sure the bond state machine on Android is ready to take the | 1343 // make sure the bond state machine on Android is ready to take the |
| 1313 // pair-done event. Otherwise the pair-done event will be dropped as an | 1344 // pair-done event. Otherwise the pair-done event will be dropped as an |
| 1314 // invalid change of paired status. | 1345 // invalid change of paired status. |
| 1315 OnPairing(addr->Clone()); | 1346 OnPairing(addr->Clone()); |
| 1316 OnPairedDone(std::move(addr)); | 1347 OnPairedDone(std::move(addr)); |
| 1317 } | 1348 } |
| 1318 } | 1349 } |
| 1319 | 1350 |
| 1351 bool ArcBluetoothBridge::CheckBluetoothInstanceVersion( | |
| 1352 int32_t version_need) const { | |
| 1353 int32_t version = arc_bridge_service()->bluetooth_version(); | |
| 1354 if (version < version_need) | |
|
Luis Héctor Chávez
2016/06/27 21:54:40
shouldn't this be >=?
puthik_chromium
2016/06/27 21:59:22
Yes. My bad.
| |
| 1355 return true; | |
| 1356 LOG(WARNING) << "Bluetooth instance is too old (version " << version | |
| 1357 << ") need version " << version_need; | |
| 1358 return false; | |
| 1359 } | |
| 1360 | |
| 1320 } // namespace arc | 1361 } // namespace arc |
| OLD | NEW |