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 "device/bluetooth/bluetooth_remote_gatt_service_mac.h" | 5 #include "device/bluetooth/bluetooth_remote_gatt_service_mac.h" |
| 6 | 6 |
| 7 #import <CoreBluetooth/CoreBluetooth.h> | 7 #import <CoreBluetooth/CoreBluetooth.h> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 71 const std::string& identifier) const { | 71 const std::string& identifier) const { |
| 72 auto searched_pair = gatt_characteristic_macs_.find(identifier); | 72 auto searched_pair = gatt_characteristic_macs_.find(identifier); |
| 73 if (searched_pair == gatt_characteristic_macs_.end()) { | 73 if (searched_pair == gatt_characteristic_macs_.end()) { |
| 74 return nullptr; | 74 return nullptr; |
| 75 } | 75 } |
| 76 return static_cast<BluetoothRemoteGattCharacteristic*>( | 76 return static_cast<BluetoothRemoteGattCharacteristic*>( |
| 77 searched_pair->second.get()); | 77 searched_pair->second.get()); |
| 78 } | 78 } |
| 79 | 79 |
| 80 void BluetoothRemoteGattServiceMac::DiscoverCharacteristics() { | 80 void BluetoothRemoteGattServiceMac::DiscoverCharacteristics() { |
| 81 VLOG(1) << ToString() << ": DiscoverCharacteristics."; | |
| 81 is_discovery_complete_ = false; | 82 is_discovery_complete_ = false; |
| 82 [GetCBPeripheral() discoverCharacteristics:nil forService:GetService()]; | 83 [GetCBPeripheral() discoverCharacteristics:nil forService:GetService()]; |
| 83 } | 84 } |
| 84 | 85 |
| 85 void BluetoothRemoteGattServiceMac::DidDiscoverCharacteristics() { | 86 void BluetoothRemoteGattServiceMac::DidDiscoverCharacteristics() { |
| 86 DCHECK(!is_discovery_complete_); | 87 DCHECK(!is_discovery_complete_); |
| 88 VLOG(1) << ToString() << ": DidDiscoverCharacteristics."; | |
| 87 std::unordered_set<std::string> characteristic_identifier_to_remove; | 89 std::unordered_set<std::string> characteristic_identifier_to_remove; |
| 88 for (const auto& iter : gatt_characteristic_macs_) { | 90 for (const auto& iter : gatt_characteristic_macs_) { |
| 89 characteristic_identifier_to_remove.insert(iter.first); | 91 characteristic_identifier_to_remove.insert(iter.first); |
| 90 } | 92 } |
| 91 | 93 |
| 92 for (CBCharacteristic* cb_characteristic in GetService().characteristics) { | 94 for (CBCharacteristic* cb_characteristic in GetService().characteristics) { |
| 93 BluetoothRemoteGattCharacteristicMac* gatt_characteristic_mac = | 95 BluetoothRemoteGattCharacteristicMac* gatt_characteristic_mac = |
| 94 GetBluetoothRemoteGattCharacteristicMac(cb_characteristic); | 96 GetBluetoothRemoteGattCharacteristicMac(cb_characteristic); |
| 95 if (gatt_characteristic_mac) { | 97 if (gatt_characteristic_mac) { |
| 98 VLOG(1) << gatt_characteristic_mac->ToString() | |
| 99 << ": Known characteristic, properties " | |
| 100 << gatt_characteristic_mac->GetProperties(); | |
| 96 const std::string& identifier = gatt_characteristic_mac->GetIdentifier(); | 101 const std::string& identifier = gatt_characteristic_mac->GetIdentifier(); |
| 97 characteristic_identifier_to_remove.erase(identifier); | 102 characteristic_identifier_to_remove.erase(identifier); |
| 98 gatt_characteristic_mac->DiscoverDescriptors(); | 103 gatt_characteristic_mac->DiscoverDescriptors(); |
| 99 continue; | 104 continue; |
| 100 } | 105 } |
| 101 gatt_characteristic_mac = | 106 gatt_characteristic_mac = |
| 102 new BluetoothRemoteGattCharacteristicMac(this, cb_characteristic); | 107 new BluetoothRemoteGattCharacteristicMac(this, cb_characteristic); |
| 103 const std::string& identifier = gatt_characteristic_mac->GetIdentifier(); | 108 const std::string& identifier = gatt_characteristic_mac->GetIdentifier(); |
| 104 auto result_iter = gatt_characteristic_macs_.insert( | 109 auto result_iter = gatt_characteristic_macs_.insert( |
| 105 {identifier, base::WrapUnique(gatt_characteristic_mac)}); | 110 {identifier, base::WrapUnique(gatt_characteristic_mac)}); |
| 106 DCHECK(result_iter.second); | 111 DCHECK(result_iter.second); |
| 112 VLOG(1) << gatt_characteristic_mac->ToString() | |
| 113 << ": New characteristic, properties " | |
| 114 << gatt_characteristic_mac->GetProperties(); | |
| 107 gatt_characteristic_mac->DiscoverDescriptors(); | 115 gatt_characteristic_mac->DiscoverDescriptors(); |
| 108 GetMacAdapter()->NotifyGattCharacteristicAdded(gatt_characteristic_mac); | 116 GetMacAdapter()->NotifyGattCharacteristicAdded(gatt_characteristic_mac); |
| 109 } | 117 } |
| 110 | 118 |
| 111 for (const std::string& identifier : characteristic_identifier_to_remove) { | 119 for (const std::string& identifier : characteristic_identifier_to_remove) { |
| 112 auto pair_to_remove = gatt_characteristic_macs_.find(identifier); | 120 auto pair_to_remove = gatt_characteristic_macs_.find(identifier); |
| 113 std::unique_ptr<BluetoothRemoteGattCharacteristicMac> | 121 std::unique_ptr<BluetoothRemoteGattCharacteristicMac> |
| 114 characteristic_to_remove; | 122 characteristic_to_remove; |
| 123 VLOG(1) << characteristic_to_remove->ToString() | |
| 124 << ": Removed characteristic."; | |
| 115 pair_to_remove->second.swap(characteristic_to_remove); | 125 pair_to_remove->second.swap(characteristic_to_remove); |
| 116 gatt_characteristic_macs_.erase(pair_to_remove); | 126 gatt_characteristic_macs_.erase(pair_to_remove); |
| 117 GetMacAdapter()->NotifyGattCharacteristicRemoved( | 127 GetMacAdapter()->NotifyGattCharacteristicRemoved( |
| 118 characteristic_to_remove.get()); | 128 characteristic_to_remove.get()); |
| 119 } | 129 } |
| 120 SendNotificationIfComplete(); | 130 SendNotificationIfComplete(); |
| 121 } | 131 } |
| 122 | 132 |
| 123 void BluetoothRemoteGattServiceMac::DidDiscoverDescriptors( | 133 void BluetoothRemoteGattServiceMac::DidDiscoverDescriptors( |
| 124 CBCharacteristic* characteristic) { | 134 CBCharacteristic* characteristic) { |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 135 // Notify when all characteristics have been fully discovered. | 145 // Notify when all characteristics have been fully discovered. |
| 136 is_discovery_complete_ = | 146 is_discovery_complete_ = |
| 137 std::find_if_not( | 147 std::find_if_not( |
| 138 gatt_characteristic_macs_.begin(), gatt_characteristic_macs_.end(), | 148 gatt_characteristic_macs_.begin(), gatt_characteristic_macs_.end(), |
| 139 [](const std::pair< | 149 [](const std::pair< |
| 140 const std::string, | 150 const std::string, |
| 141 std::unique_ptr<BluetoothRemoteGattCharacteristicMac>>& pair) { | 151 std::unique_ptr<BluetoothRemoteGattCharacteristicMac>>& pair) { |
| 142 return pair.second->IsDiscoveryComplete(); | 152 return pair.second->IsDiscoveryComplete(); |
| 143 }) == gatt_characteristic_macs_.end(); | 153 }) == gatt_characteristic_macs_.end(); |
| 144 if (is_discovery_complete_) { | 154 if (is_discovery_complete_) { |
| 155 VLOG(1) << ToString() << ": Discovery complete."; | |
| 145 GetMacAdapter()->NotifyGattServiceChanged(this); | 156 GetMacAdapter()->NotifyGattServiceChanged(this); |
| 146 } | 157 } |
| 147 } | 158 } |
| 148 | 159 |
| 149 void BluetoothRemoteGattServiceMac::DidUpdateValue( | 160 void BluetoothRemoteGattServiceMac::DidUpdateValue( |
| 150 CBCharacteristic* characteristic, | 161 CBCharacteristic* characteristic, |
| 151 NSError* error) { | 162 NSError* error) { |
| 152 BluetoothRemoteGattCharacteristicMac* gatt_characteristic = | 163 BluetoothRemoteGattCharacteristicMac* gatt_characteristic = |
| 153 GetBluetoothRemoteGattCharacteristicMac(characteristic); | 164 GetBluetoothRemoteGattCharacteristicMac(characteristic); |
| 154 DCHECK(gatt_characteristic); | 165 DCHECK(gatt_characteristic); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 200 std::unique_ptr<BluetoothRemoteGattCharacteristicMac>>& pair) { | 211 std::unique_ptr<BluetoothRemoteGattCharacteristicMac>>& pair) { |
| 201 return pair.second->GetCBCharacteristic() == characteristic; | 212 return pair.second->GetCBCharacteristic() == characteristic; |
| 202 }); | 213 }); |
| 203 if (found == gatt_characteristic_macs_.end()) { | 214 if (found == gatt_characteristic_macs_.end()) { |
| 204 return nullptr; | 215 return nullptr; |
| 205 } else { | 216 } else { |
| 206 return found->second.get(); | 217 return found->second.get(); |
| 207 } | 218 } |
| 208 } | 219 } |
| 209 | 220 |
| 221 std::string BluetoothRemoteGattServiceMac::ToString() const { | |
| 222 return std::string("<BluetoothRemoteGattServiceMac ") + GetIdentifier() + | |
| 223 ", device " + bluetooth_device_mac_->GetIdentifier() + ">"; | |
|
ortuno
2017/03/14 00:34:33
Same here: UUID might be more useful.
| |
| 224 } | |
| 225 | |
| 210 } // namespace device | 226 } // namespace device |
| OLD | NEW |