| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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_characteristic_chromeos.h" | 5 #include "device/bluetooth/bluetooth_remote_gatt_characteristic_bluez.h" |
| 6 | 6 |
| 7 #include <limits> | 7 #include <limits> |
| 8 | 8 |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/strings/stringprintf.h" | 10 #include "base/strings/stringprintf.h" |
| 11 #include "device/bluetooth/bluetooth_adapter_chromeos.h" | 11 #include "device/bluetooth/bluetooth_adapter_bluez.h" |
| 12 #include "device/bluetooth/bluetooth_device.h" | 12 #include "device/bluetooth/bluetooth_device.h" |
| 13 #include "device/bluetooth/bluetooth_gatt_notify_session_chromeos.h" | 13 #include "device/bluetooth/bluetooth_gatt_notify_session_bluez.h" |
| 14 #include "device/bluetooth/bluetooth_remote_gatt_characteristic_chromeos.h" | 14 #include "device/bluetooth/bluetooth_remote_gatt_characteristic_bluez.h" |
| 15 #include "device/bluetooth/bluetooth_remote_gatt_descriptor_chromeos.h" | 15 #include "device/bluetooth/bluetooth_remote_gatt_descriptor_bluez.h" |
| 16 #include "device/bluetooth/bluetooth_remote_gatt_service_chromeos.h" | 16 #include "device/bluetooth/bluetooth_remote_gatt_service_bluez.h" |
| 17 #include "device/bluetooth/dbus/bluez_dbus_manager.h" | 17 #include "device/bluetooth/dbus/bluez_dbus_manager.h" |
| 18 #include "third_party/cros_system_api/dbus/service_constants.h" | 18 #include "third_party/cros_system_api/dbus/service_constants.h" |
| 19 | 19 |
| 20 namespace chromeos { | 20 namespace bluez { |
| 21 | 21 |
| 22 namespace { | 22 namespace { |
| 23 | 23 |
| 24 // Stream operator for logging vector<uint8>. | 24 // Stream operator for logging vector<uint8>. |
| 25 std::ostream& operator<<(std::ostream& out, const std::vector<uint8> bytes) { | 25 std::ostream& operator<<(std::ostream& out, const std::vector<uint8> bytes) { |
| 26 out << "["; | 26 out << "["; |
| 27 for (std::vector<uint8>::const_iterator iter = bytes.begin(); | 27 for (std::vector<uint8>::const_iterator iter = bytes.begin(); |
| 28 iter != bytes.end(); ++iter) { | 28 iter != bytes.end(); ++iter) { |
| 29 out << base::StringPrintf("%02X", *iter); | 29 out << base::StringPrintf("%02X", *iter); |
| 30 } | 30 } |
| 31 return out << "]"; | 31 return out << "]"; |
| 32 } | 32 } |
| 33 | 33 |
| 34 } // namespace | 34 } // namespace |
| 35 | 35 |
| 36 BluetoothRemoteGattCharacteristicChromeOS:: | 36 BluetoothRemoteGattCharacteristicBlueZ::BluetoothRemoteGattCharacteristicBlueZ( |
| 37 BluetoothRemoteGattCharacteristicChromeOS( | 37 BluetoothRemoteGattServiceBlueZ* service, |
| 38 BluetoothRemoteGattServiceChromeOS* service, | 38 const dbus::ObjectPath& object_path) |
| 39 const dbus::ObjectPath& object_path) | |
| 40 : object_path_(object_path), | 39 : object_path_(object_path), |
| 41 service_(service), | 40 service_(service), |
| 42 num_notify_sessions_(0), | 41 num_notify_sessions_(0), |
| 43 notify_call_pending_(false), | 42 notify_call_pending_(false), |
| 44 weak_ptr_factory_(this) { | 43 weak_ptr_factory_(this) { |
| 45 VLOG(1) << "Creating remote GATT characteristic with identifier: " | 44 VLOG(1) << "Creating remote GATT characteristic with identifier: " |
| 46 << GetIdentifier() << ", UUID: " << GetUUID().canonical_value(); | 45 << GetIdentifier() << ", UUID: " << GetUUID().canonical_value(); |
| 47 bluez::BluezDBusManager::Get() | 46 bluez::BluezDBusManager::Get() |
| 48 ->GetBluetoothGattDescriptorClient() | 47 ->GetBluetoothGattDescriptorClient() |
| 49 ->AddObserver(this); | 48 ->AddObserver(this); |
| 50 | 49 |
| 51 // Add all known GATT characteristic descriptors. | 50 // Add all known GATT characteristic descriptors. |
| 52 const std::vector<dbus::ObjectPath>& gatt_descs = | 51 const std::vector<dbus::ObjectPath>& gatt_descs = |
| 53 bluez::BluezDBusManager::Get() | 52 bluez::BluezDBusManager::Get() |
| 54 ->GetBluetoothGattDescriptorClient() | 53 ->GetBluetoothGattDescriptorClient() |
| 55 ->GetDescriptors(); | 54 ->GetDescriptors(); |
| 56 for (std::vector<dbus::ObjectPath>::const_iterator iter = gatt_descs.begin(); | 55 for (std::vector<dbus::ObjectPath>::const_iterator iter = gatt_descs.begin(); |
| 57 iter != gatt_descs.end(); ++iter) | 56 iter != gatt_descs.end(); ++iter) |
| 58 GattDescriptorAdded(*iter); | 57 GattDescriptorAdded(*iter); |
| 59 } | 58 } |
| 60 | 59 |
| 61 BluetoothRemoteGattCharacteristicChromeOS:: | 60 BluetoothRemoteGattCharacteristicBlueZ:: |
| 62 ~BluetoothRemoteGattCharacteristicChromeOS() { | 61 ~BluetoothRemoteGattCharacteristicBlueZ() { |
| 63 bluez::BluezDBusManager::Get() | 62 bluez::BluezDBusManager::Get() |
| 64 ->GetBluetoothGattDescriptorClient() | 63 ->GetBluetoothGattDescriptorClient() |
| 65 ->RemoveObserver(this); | 64 ->RemoveObserver(this); |
| 66 | 65 |
| 67 // Clean up all the descriptors. There isn't much point in notifying service | 66 // Clean up all the descriptors. There isn't much point in notifying service |
| 68 // observers for each descriptor that gets removed, so just delete them. | 67 // observers for each descriptor that gets removed, so just delete them. |
| 69 for (DescriptorMap::iterator iter = descriptors_.begin(); | 68 for (DescriptorMap::iterator iter = descriptors_.begin(); |
| 70 iter != descriptors_.end(); ++iter) | 69 iter != descriptors_.end(); ++iter) |
| 71 delete iter->second; | 70 delete iter->second; |
| 72 | 71 |
| 73 // Report an error for all pending calls to StartNotifySession. | 72 // Report an error for all pending calls to StartNotifySession. |
| 74 while (!pending_start_notify_calls_.empty()) { | 73 while (!pending_start_notify_calls_.empty()) { |
| 75 PendingStartNotifyCall callbacks = pending_start_notify_calls_.front(); | 74 PendingStartNotifyCall callbacks = pending_start_notify_calls_.front(); |
| 76 pending_start_notify_calls_.pop(); | 75 pending_start_notify_calls_.pop(); |
| 77 callbacks.second.Run(device::BluetoothGattService::GATT_ERROR_FAILED); | 76 callbacks.second.Run(device::BluetoothGattService::GATT_ERROR_FAILED); |
| 78 } | 77 } |
| 79 } | 78 } |
| 80 | 79 |
| 81 std::string BluetoothRemoteGattCharacteristicChromeOS::GetIdentifier() const { | 80 std::string BluetoothRemoteGattCharacteristicBlueZ::GetIdentifier() const { |
| 82 return object_path_.value(); | 81 return object_path_.value(); |
| 83 } | 82 } |
| 84 | 83 |
| 85 device::BluetoothUUID | 84 device::BluetoothUUID BluetoothRemoteGattCharacteristicBlueZ::GetUUID() const { |
| 86 BluetoothRemoteGattCharacteristicChromeOS::GetUUID() const { | |
| 87 bluez::BluetoothGattCharacteristicClient::Properties* properties = | 85 bluez::BluetoothGattCharacteristicClient::Properties* properties = |
| 88 bluez::BluezDBusManager::Get() | 86 bluez::BluezDBusManager::Get() |
| 89 ->GetBluetoothGattCharacteristicClient() | 87 ->GetBluetoothGattCharacteristicClient() |
| 90 ->GetProperties(object_path_); | 88 ->GetProperties(object_path_); |
| 91 DCHECK(properties); | 89 DCHECK(properties); |
| 92 return device::BluetoothUUID(properties->uuid.value()); | 90 return device::BluetoothUUID(properties->uuid.value()); |
| 93 } | 91 } |
| 94 | 92 |
| 95 bool BluetoothRemoteGattCharacteristicChromeOS::IsLocal() const { | 93 bool BluetoothRemoteGattCharacteristicBlueZ::IsLocal() const { |
| 96 return false; | 94 return false; |
| 97 } | 95 } |
| 98 | 96 |
| 99 const std::vector<uint8>& | 97 const std::vector<uint8>& BluetoothRemoteGattCharacteristicBlueZ::GetValue() |
| 100 BluetoothRemoteGattCharacteristicChromeOS::GetValue() const { | 98 const { |
| 101 bluez::BluetoothGattCharacteristicClient::Properties* properties = | 99 bluez::BluetoothGattCharacteristicClient::Properties* properties = |
| 102 bluez::BluezDBusManager::Get() | 100 bluez::BluezDBusManager::Get() |
| 103 ->GetBluetoothGattCharacteristicClient() | 101 ->GetBluetoothGattCharacteristicClient() |
| 104 ->GetProperties(object_path_); | 102 ->GetProperties(object_path_); |
| 105 | 103 |
| 106 DCHECK(properties); | 104 DCHECK(properties); |
| 107 | 105 |
| 108 return properties->value.value(); | 106 return properties->value.value(); |
| 109 } | 107 } |
| 110 | 108 |
| 111 device::BluetoothGattService* | 109 device::BluetoothGattService* |
| 112 BluetoothRemoteGattCharacteristicChromeOS::GetService() const { | 110 BluetoothRemoteGattCharacteristicBlueZ::GetService() const { |
| 113 return service_; | 111 return service_; |
| 114 } | 112 } |
| 115 | 113 |
| 116 device::BluetoothGattCharacteristic::Properties | 114 device::BluetoothGattCharacteristic::Properties |
| 117 BluetoothRemoteGattCharacteristicChromeOS::GetProperties() const { | 115 BluetoothRemoteGattCharacteristicBlueZ::GetProperties() const { |
| 118 bluez::BluetoothGattCharacteristicClient::Properties* properties = | 116 bluez::BluetoothGattCharacteristicClient::Properties* properties = |
| 119 bluez::BluezDBusManager::Get() | 117 bluez::BluezDBusManager::Get() |
| 120 ->GetBluetoothGattCharacteristicClient() | 118 ->GetBluetoothGattCharacteristicClient() |
| 121 ->GetProperties(object_path_); | 119 ->GetProperties(object_path_); |
| 122 DCHECK(properties); | 120 DCHECK(properties); |
| 123 | 121 |
| 124 Properties props = PROPERTY_NONE; | 122 Properties props = PROPERTY_NONE; |
| 125 const std::vector<std::string>& flags = properties->flags.value(); | 123 const std::vector<std::string>& flags = properties->flags.value(); |
| 126 for (std::vector<std::string>::const_iterator iter = flags.begin(); | 124 for (std::vector<std::string>::const_iterator iter = flags.begin(); |
| 127 iter != flags.end(); | 125 iter != flags.end(); ++iter) { |
| 128 ++iter) { | |
| 129 if (*iter == bluetooth_gatt_characteristic::kFlagBroadcast) | 126 if (*iter == bluetooth_gatt_characteristic::kFlagBroadcast) |
| 130 props |= PROPERTY_BROADCAST; | 127 props |= PROPERTY_BROADCAST; |
| 131 if (*iter == bluetooth_gatt_characteristic::kFlagRead) | 128 if (*iter == bluetooth_gatt_characteristic::kFlagRead) |
| 132 props |= PROPERTY_READ; | 129 props |= PROPERTY_READ; |
| 133 if (*iter == bluetooth_gatt_characteristic::kFlagWriteWithoutResponse) | 130 if (*iter == bluetooth_gatt_characteristic::kFlagWriteWithoutResponse) |
| 134 props |= PROPERTY_WRITE_WITHOUT_RESPONSE; | 131 props |= PROPERTY_WRITE_WITHOUT_RESPONSE; |
| 135 if (*iter == bluetooth_gatt_characteristic::kFlagWrite) | 132 if (*iter == bluetooth_gatt_characteristic::kFlagWrite) |
| 136 props |= PROPERTY_WRITE; | 133 props |= PROPERTY_WRITE; |
| 137 if (*iter == bluetooth_gatt_characteristic::kFlagNotify) | 134 if (*iter == bluetooth_gatt_characteristic::kFlagNotify) |
| 138 props |= PROPERTY_NOTIFY; | 135 props |= PROPERTY_NOTIFY; |
| 139 if (*iter == bluetooth_gatt_characteristic::kFlagIndicate) | 136 if (*iter == bluetooth_gatt_characteristic::kFlagIndicate) |
| 140 props |= PROPERTY_INDICATE; | 137 props |= PROPERTY_INDICATE; |
| 141 if (*iter == bluetooth_gatt_characteristic::kFlagAuthenticatedSignedWrites) | 138 if (*iter == bluetooth_gatt_characteristic::kFlagAuthenticatedSignedWrites) |
| 142 props |= PROPERTY_AUTHENTICATED_SIGNED_WRITES; | 139 props |= PROPERTY_AUTHENTICATED_SIGNED_WRITES; |
| 143 if (*iter == bluetooth_gatt_characteristic::kFlagExtendedProperties) | 140 if (*iter == bluetooth_gatt_characteristic::kFlagExtendedProperties) |
| 144 props |= PROPERTY_EXTENDED_PROPERTIES; | 141 props |= PROPERTY_EXTENDED_PROPERTIES; |
| 145 if (*iter == bluetooth_gatt_characteristic::kFlagReliableWrite) | 142 if (*iter == bluetooth_gatt_characteristic::kFlagReliableWrite) |
| 146 props |= PROPERTY_RELIABLE_WRITE; | 143 props |= PROPERTY_RELIABLE_WRITE; |
| 147 if (*iter == bluetooth_gatt_characteristic::kFlagWritableAuxiliaries) | 144 if (*iter == bluetooth_gatt_characteristic::kFlagWritableAuxiliaries) |
| 148 props |= PROPERTY_WRITABLE_AUXILIARIES; | 145 props |= PROPERTY_WRITABLE_AUXILIARIES; |
| 149 } | 146 } |
| 150 | 147 |
| 151 return props; | 148 return props; |
| 152 } | 149 } |
| 153 | 150 |
| 154 device::BluetoothGattCharacteristic::Permissions | 151 device::BluetoothGattCharacteristic::Permissions |
| 155 BluetoothRemoteGattCharacteristicChromeOS::GetPermissions() const { | 152 BluetoothRemoteGattCharacteristicBlueZ::GetPermissions() const { |
| 156 // TODO(armansito): Once BlueZ defines the permissions, return the correct | 153 // TODO(armansito): Once BlueZ defines the permissions, return the correct |
| 157 // values here. | 154 // values here. |
| 158 return PERMISSION_NONE; | 155 return PERMISSION_NONE; |
| 159 } | 156 } |
| 160 | 157 |
| 161 bool BluetoothRemoteGattCharacteristicChromeOS::IsNotifying() const { | 158 bool BluetoothRemoteGattCharacteristicBlueZ::IsNotifying() const { |
| 162 bluez::BluetoothGattCharacteristicClient::Properties* properties = | 159 bluez::BluetoothGattCharacteristicClient::Properties* properties = |
| 163 bluez::BluezDBusManager::Get() | 160 bluez::BluezDBusManager::Get() |
| 164 ->GetBluetoothGattCharacteristicClient() | 161 ->GetBluetoothGattCharacteristicClient() |
| 165 ->GetProperties(object_path_); | 162 ->GetProperties(object_path_); |
| 166 DCHECK(properties); | 163 DCHECK(properties); |
| 167 | 164 |
| 168 return properties->notifying.value(); | 165 return properties->notifying.value(); |
| 169 } | 166 } |
| 170 | 167 |
| 171 std::vector<device::BluetoothGattDescriptor*> | 168 std::vector<device::BluetoothGattDescriptor*> |
| 172 BluetoothRemoteGattCharacteristicChromeOS::GetDescriptors() const { | 169 BluetoothRemoteGattCharacteristicBlueZ::GetDescriptors() const { |
| 173 std::vector<device::BluetoothGattDescriptor*> descriptors; | 170 std::vector<device::BluetoothGattDescriptor*> descriptors; |
| 174 for (DescriptorMap::const_iterator iter = descriptors_.begin(); | 171 for (DescriptorMap::const_iterator iter = descriptors_.begin(); |
| 175 iter != descriptors_.end(); ++iter) | 172 iter != descriptors_.end(); ++iter) |
| 176 descriptors.push_back(iter->second); | 173 descriptors.push_back(iter->second); |
| 177 return descriptors; | 174 return descriptors; |
| 178 } | 175 } |
| 179 | 176 |
| 180 device::BluetoothGattDescriptor* | 177 device::BluetoothGattDescriptor* |
| 181 BluetoothRemoteGattCharacteristicChromeOS::GetDescriptor( | 178 BluetoothRemoteGattCharacteristicBlueZ::GetDescriptor( |
| 182 const std::string& identifier) const { | 179 const std::string& identifier) const { |
| 183 DescriptorMap::const_iterator iter = | 180 DescriptorMap::const_iterator iter = |
| 184 descriptors_.find(dbus::ObjectPath(identifier)); | 181 descriptors_.find(dbus::ObjectPath(identifier)); |
| 185 if (iter == descriptors_.end()) | 182 if (iter == descriptors_.end()) |
| 186 return NULL; | 183 return NULL; |
| 187 return iter->second; | 184 return iter->second; |
| 188 } | 185 } |
| 189 | 186 |
| 190 bool BluetoothRemoteGattCharacteristicChromeOS::AddDescriptor( | 187 bool BluetoothRemoteGattCharacteristicBlueZ::AddDescriptor( |
| 191 device::BluetoothGattDescriptor* descriptor) { | 188 device::BluetoothGattDescriptor* descriptor) { |
| 192 VLOG(1) << "Descriptors cannot be added to a remote GATT characteristic."; | 189 VLOG(1) << "Descriptors cannot be added to a remote GATT characteristic."; |
| 193 return false; | 190 return false; |
| 194 } | 191 } |
| 195 | 192 |
| 196 bool BluetoothRemoteGattCharacteristicChromeOS::UpdateValue( | 193 bool BluetoothRemoteGattCharacteristicBlueZ::UpdateValue( |
| 197 const std::vector<uint8>& value) { | 194 const std::vector<uint8>& value) { |
| 198 VLOG(1) << "Cannot update the value of a remote GATT characteristic."; | 195 VLOG(1) << "Cannot update the value of a remote GATT characteristic."; |
| 199 return false; | 196 return false; |
| 200 } | 197 } |
| 201 | 198 |
| 202 void BluetoothRemoteGattCharacteristicChromeOS::ReadRemoteCharacteristic( | 199 void BluetoothRemoteGattCharacteristicBlueZ::ReadRemoteCharacteristic( |
| 203 const ValueCallback& callback, | 200 const ValueCallback& callback, |
| 204 const ErrorCallback& error_callback) { | 201 const ErrorCallback& error_callback) { |
| 205 VLOG(1) << "Sending GATT characteristic read request to characteristic: " | 202 VLOG(1) << "Sending GATT characteristic read request to characteristic: " |
| 206 << GetIdentifier() << ", UUID: " << GetUUID().canonical_value() | 203 << GetIdentifier() << ", UUID: " << GetUUID().canonical_value() |
| 207 << "."; | 204 << "."; |
| 208 | 205 |
| 209 bluez::BluezDBusManager::Get() | 206 bluez::BluezDBusManager::Get() |
| 210 ->GetBluetoothGattCharacteristicClient() | 207 ->GetBluetoothGattCharacteristicClient() |
| 211 ->ReadValue( | 208 ->ReadValue(object_path_, callback, |
| 212 object_path_, callback, | 209 base::Bind(&BluetoothRemoteGattCharacteristicBlueZ::OnError, |
| 213 base::Bind(&BluetoothRemoteGattCharacteristicChromeOS::OnError, | 210 weak_ptr_factory_.GetWeakPtr(), error_callback)); |
| 214 weak_ptr_factory_.GetWeakPtr(), error_callback)); | |
| 215 } | 211 } |
| 216 | 212 |
| 217 void BluetoothRemoteGattCharacteristicChromeOS::WriteRemoteCharacteristic( | 213 void BluetoothRemoteGattCharacteristicBlueZ::WriteRemoteCharacteristic( |
| 218 const std::vector<uint8>& new_value, | 214 const std::vector<uint8>& new_value, |
| 219 const base::Closure& callback, | 215 const base::Closure& callback, |
| 220 const ErrorCallback& error_callback) { | 216 const ErrorCallback& error_callback) { |
| 221 VLOG(1) << "Sending GATT characteristic write request to characteristic: " | 217 VLOG(1) << "Sending GATT characteristic write request to characteristic: " |
| 222 << GetIdentifier() << ", UUID: " << GetUUID().canonical_value() | 218 << GetIdentifier() << ", UUID: " << GetUUID().canonical_value() |
| 223 << ", with value: " << new_value << "."; | 219 << ", with value: " << new_value << "."; |
| 224 | 220 |
| 225 bluez::BluezDBusManager::Get() | 221 bluez::BluezDBusManager::Get() |
| 226 ->GetBluetoothGattCharacteristicClient() | 222 ->GetBluetoothGattCharacteristicClient() |
| 227 ->WriteValue( | 223 ->WriteValue(object_path_, new_value, callback, |
| 228 object_path_, new_value, callback, | 224 base::Bind(&BluetoothRemoteGattCharacteristicBlueZ::OnError, |
| 229 base::Bind(&BluetoothRemoteGattCharacteristicChromeOS::OnError, | 225 weak_ptr_factory_.GetWeakPtr(), error_callback)); |
| 230 weak_ptr_factory_.GetWeakPtr(), error_callback)); | |
| 231 } | 226 } |
| 232 | 227 |
| 233 void BluetoothRemoteGattCharacteristicChromeOS::StartNotifySession( | 228 void BluetoothRemoteGattCharacteristicBlueZ::StartNotifySession( |
| 234 const NotifySessionCallback& callback, | 229 const NotifySessionCallback& callback, |
| 235 const ErrorCallback& error_callback) { | 230 const ErrorCallback& error_callback) { |
| 236 VLOG(1) << __func__; | 231 VLOG(1) << __func__; |
| 237 | 232 |
| 238 if (num_notify_sessions_ > 0) { | 233 if (num_notify_sessions_ > 0) { |
| 239 // The characteristic might have stopped notifying even though the session | 234 // The characteristic might have stopped notifying even though the session |
| 240 // count is nonzero. This means that notifications stopped outside of our | 235 // count is nonzero. This means that notifications stopped outside of our |
| 241 // control and we should reset the count. If the characteristic is still | 236 // control and we should reset the count. If the characteristic is still |
| 242 // notifying, then return success. Otherwise, reset the count and treat | 237 // notifying, then return success. Otherwise, reset the count and treat |
| 243 // this call as if the count were 0. | 238 // this call as if the count were 0. |
| 244 if (IsNotifying()) { | 239 if (IsNotifying()) { |
| 245 // Check for overflows, though unlikely. | 240 // Check for overflows, though unlikely. |
| 246 if (num_notify_sessions_ == std::numeric_limits<size_t>::max()) { | 241 if (num_notify_sessions_ == std::numeric_limits<size_t>::max()) { |
| 247 error_callback.Run(device::BluetoothGattService::GATT_ERROR_FAILED); | 242 error_callback.Run(device::BluetoothGattService::GATT_ERROR_FAILED); |
| 248 return; | 243 return; |
| 249 } | 244 } |
| 250 | 245 |
| 251 ++num_notify_sessions_; | 246 ++num_notify_sessions_; |
| 252 DCHECK(service_); | 247 DCHECK(service_); |
| 253 DCHECK(service_->GetAdapter()); | 248 DCHECK(service_->GetAdapter()); |
| 254 DCHECK(service_->GetDevice()); | 249 DCHECK(service_->GetDevice()); |
| 255 scoped_ptr<device::BluetoothGattNotifySession> session( | 250 scoped_ptr<device::BluetoothGattNotifySession> session( |
| 256 new BluetoothGattNotifySessionChromeOS( | 251 new BluetoothGattNotifySessionBlueZ( |
| 257 service_->GetAdapter(), | 252 service_->GetAdapter(), service_->GetDevice()->GetAddress(), |
| 258 service_->GetDevice()->GetAddress(), | 253 service_->GetIdentifier(), GetIdentifier(), object_path_)); |
| 259 service_->GetIdentifier(), | |
| 260 GetIdentifier(), | |
| 261 object_path_)); | |
| 262 callback.Run(session.Pass()); | 254 callback.Run(session.Pass()); |
| 263 return; | 255 return; |
| 264 } | 256 } |
| 265 | 257 |
| 266 num_notify_sessions_ = 0; | 258 num_notify_sessions_ = 0; |
| 267 } | 259 } |
| 268 | 260 |
| 269 // Queue the callbacks if there is a pending call to bluetoothd. | 261 // Queue the callbacks if there is a pending call to bluetoothd. |
| 270 if (notify_call_pending_) { | 262 if (notify_call_pending_) { |
| 271 pending_start_notify_calls_.push(std::make_pair(callback, error_callback)); | 263 pending_start_notify_calls_.push(std::make_pair(callback, error_callback)); |
| 272 return; | 264 return; |
| 273 } | 265 } |
| 274 | 266 |
| 275 notify_call_pending_ = true; | 267 notify_call_pending_ = true; |
| 276 bluez::BluezDBusManager::Get() | 268 bluez::BluezDBusManager::Get() |
| 277 ->GetBluetoothGattCharacteristicClient() | 269 ->GetBluetoothGattCharacteristicClient() |
| 278 ->StartNotify( | 270 ->StartNotify( |
| 279 object_path_, | 271 object_path_, |
| 280 base::Bind( | 272 base::Bind( |
| 281 &BluetoothRemoteGattCharacteristicChromeOS::OnStartNotifySuccess, | 273 &BluetoothRemoteGattCharacteristicBlueZ::OnStartNotifySuccess, |
| 282 weak_ptr_factory_.GetWeakPtr(), callback), | 274 weak_ptr_factory_.GetWeakPtr(), callback), |
| 283 base::Bind( | 275 base::Bind( |
| 284 &BluetoothRemoteGattCharacteristicChromeOS::OnStartNotifyError, | 276 &BluetoothRemoteGattCharacteristicBlueZ::OnStartNotifyError, |
| 285 weak_ptr_factory_.GetWeakPtr(), error_callback)); | 277 weak_ptr_factory_.GetWeakPtr(), error_callback)); |
| 286 } | 278 } |
| 287 | 279 |
| 288 void BluetoothRemoteGattCharacteristicChromeOS::RemoveNotifySession( | 280 void BluetoothRemoteGattCharacteristicBlueZ::RemoveNotifySession( |
| 289 const base::Closure& callback) { | 281 const base::Closure& callback) { |
| 290 VLOG(1) << __func__; | 282 VLOG(1) << __func__; |
| 291 | 283 |
| 292 if (num_notify_sessions_ > 1) { | 284 if (num_notify_sessions_ > 1) { |
| 293 DCHECK(!notify_call_pending_); | 285 DCHECK(!notify_call_pending_); |
| 294 --num_notify_sessions_; | 286 --num_notify_sessions_; |
| 295 callback.Run(); | 287 callback.Run(); |
| 296 return; | 288 return; |
| 297 } | 289 } |
| 298 | 290 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 309 return; | 301 return; |
| 310 } | 302 } |
| 311 | 303 |
| 312 DCHECK(num_notify_sessions_ == 1); | 304 DCHECK(num_notify_sessions_ == 1); |
| 313 notify_call_pending_ = true; | 305 notify_call_pending_ = true; |
| 314 bluez::BluezDBusManager::Get() | 306 bluez::BluezDBusManager::Get() |
| 315 ->GetBluetoothGattCharacteristicClient() | 307 ->GetBluetoothGattCharacteristicClient() |
| 316 ->StopNotify( | 308 ->StopNotify( |
| 317 object_path_, | 309 object_path_, |
| 318 base::Bind( | 310 base::Bind( |
| 319 &BluetoothRemoteGattCharacteristicChromeOS::OnStopNotifySuccess, | 311 &BluetoothRemoteGattCharacteristicBlueZ::OnStopNotifySuccess, |
| 320 weak_ptr_factory_.GetWeakPtr(), callback), | 312 weak_ptr_factory_.GetWeakPtr(), callback), |
| 321 base::Bind( | 313 base::Bind(&BluetoothRemoteGattCharacteristicBlueZ::OnStopNotifyError, |
| 322 &BluetoothRemoteGattCharacteristicChromeOS::OnStopNotifyError, | 314 weak_ptr_factory_.GetWeakPtr(), callback)); |
| 323 weak_ptr_factory_.GetWeakPtr(), callback)); | |
| 324 } | 315 } |
| 325 | 316 |
| 326 void BluetoothRemoteGattCharacteristicChromeOS::GattDescriptorAdded( | 317 void BluetoothRemoteGattCharacteristicBlueZ::GattDescriptorAdded( |
| 327 const dbus::ObjectPath& object_path) { | 318 const dbus::ObjectPath& object_path) { |
| 328 if (descriptors_.find(object_path) != descriptors_.end()) { | 319 if (descriptors_.find(object_path) != descriptors_.end()) { |
| 329 VLOG(1) << "Remote GATT characteristic descriptor already exists: " | 320 VLOG(1) << "Remote GATT characteristic descriptor already exists: " |
| 330 << object_path.value(); | 321 << object_path.value(); |
| 331 return; | 322 return; |
| 332 } | 323 } |
| 333 | 324 |
| 334 bluez::BluetoothGattDescriptorClient::Properties* properties = | 325 bluez::BluetoothGattDescriptorClient::Properties* properties = |
| 335 bluez::BluezDBusManager::Get() | 326 bluez::BluezDBusManager::Get() |
| 336 ->GetBluetoothGattDescriptorClient() | 327 ->GetBluetoothGattDescriptorClient() |
| 337 ->GetProperties(object_path); | 328 ->GetProperties(object_path); |
| 338 DCHECK(properties); | 329 DCHECK(properties); |
| 339 if (properties->characteristic.value() != object_path_) { | 330 if (properties->characteristic.value() != object_path_) { |
| 340 VLOG(3) << "Remote GATT descriptor does not belong to this characteristic."; | 331 VLOG(3) << "Remote GATT descriptor does not belong to this characteristic."; |
| 341 return; | 332 return; |
| 342 } | 333 } |
| 343 | 334 |
| 344 VLOG(1) << "Adding new remote GATT descriptor for GATT characteristic: " | 335 VLOG(1) << "Adding new remote GATT descriptor for GATT characteristic: " |
| 345 << GetIdentifier() << ", UUID: " << GetUUID().canonical_value(); | 336 << GetIdentifier() << ", UUID: " << GetUUID().canonical_value(); |
| 346 | 337 |
| 347 BluetoothRemoteGattDescriptorChromeOS* descriptor = | 338 BluetoothRemoteGattDescriptorBlueZ* descriptor = |
| 348 new BluetoothRemoteGattDescriptorChromeOS(this, object_path); | 339 new BluetoothRemoteGattDescriptorBlueZ(this, object_path); |
| 349 descriptors_[object_path] = descriptor; | 340 descriptors_[object_path] = descriptor; |
| 350 DCHECK(descriptor->GetIdentifier() == object_path.value()); | 341 DCHECK(descriptor->GetIdentifier() == object_path.value()); |
| 351 DCHECK(descriptor->GetUUID().IsValid()); | 342 DCHECK(descriptor->GetUUID().IsValid()); |
| 352 DCHECK(service_); | 343 DCHECK(service_); |
| 353 | 344 |
| 354 service_->NotifyDescriptorAddedOrRemoved(this, descriptor, true /* added */); | 345 service_->NotifyDescriptorAddedOrRemoved(this, descriptor, true /* added */); |
| 355 } | 346 } |
| 356 | 347 |
| 357 void BluetoothRemoteGattCharacteristicChromeOS::GattDescriptorRemoved( | 348 void BluetoothRemoteGattCharacteristicBlueZ::GattDescriptorRemoved( |
| 358 const dbus::ObjectPath& object_path) { | 349 const dbus::ObjectPath& object_path) { |
| 359 DescriptorMap::iterator iter = descriptors_.find(object_path); | 350 DescriptorMap::iterator iter = descriptors_.find(object_path); |
| 360 if (iter == descriptors_.end()) { | 351 if (iter == descriptors_.end()) { |
| 361 VLOG(2) << "Unknown descriptor removed: " << object_path.value(); | 352 VLOG(2) << "Unknown descriptor removed: " << object_path.value(); |
| 362 return; | 353 return; |
| 363 } | 354 } |
| 364 | 355 |
| 365 VLOG(1) << "Removing remote GATT descriptor from characteristic: " | 356 VLOG(1) << "Removing remote GATT descriptor from characteristic: " |
| 366 << GetIdentifier() << ", UUID: " << GetUUID().canonical_value(); | 357 << GetIdentifier() << ", UUID: " << GetUUID().canonical_value(); |
| 367 | 358 |
| 368 BluetoothRemoteGattDescriptorChromeOS* descriptor = iter->second; | 359 BluetoothRemoteGattDescriptorBlueZ* descriptor = iter->second; |
| 369 DCHECK(descriptor->object_path() == object_path); | 360 DCHECK(descriptor->object_path() == object_path); |
| 370 descriptors_.erase(iter); | 361 descriptors_.erase(iter); |
| 371 | 362 |
| 372 DCHECK(service_); | 363 DCHECK(service_); |
| 373 service_->NotifyDescriptorAddedOrRemoved(this, descriptor, false /* added */); | 364 service_->NotifyDescriptorAddedOrRemoved(this, descriptor, false /* added */); |
| 374 | 365 |
| 375 delete descriptor; | 366 delete descriptor; |
| 376 } | 367 } |
| 377 | 368 |
| 378 void BluetoothRemoteGattCharacteristicChromeOS::GattDescriptorPropertyChanged( | 369 void BluetoothRemoteGattCharacteristicBlueZ::GattDescriptorPropertyChanged( |
| 379 const dbus::ObjectPath& object_path, | 370 const dbus::ObjectPath& object_path, |
| 380 const std::string& property_name) { | 371 const std::string& property_name) { |
| 381 DescriptorMap::iterator iter = descriptors_.find(object_path); | 372 DescriptorMap::iterator iter = descriptors_.find(object_path); |
| 382 if (iter == descriptors_.end()) { | 373 if (iter == descriptors_.end()) { |
| 383 VLOG(2) << "Unknown descriptor removed: " << object_path.value(); | 374 VLOG(2) << "Unknown descriptor removed: " << object_path.value(); |
| 384 return; | 375 return; |
| 385 } | 376 } |
| 386 | 377 |
| 387 bluez::BluetoothGattDescriptorClient::Properties* properties = | 378 bluez::BluetoothGattDescriptorClient::Properties* properties = |
| 388 bluez::BluezDBusManager::Get() | 379 bluez::BluezDBusManager::Get() |
| 389 ->GetBluetoothGattDescriptorClient() | 380 ->GetBluetoothGattDescriptorClient() |
| 390 ->GetProperties(object_path); | 381 ->GetProperties(object_path); |
| 391 | 382 |
| 392 DCHECK(properties); | 383 DCHECK(properties); |
| 393 | 384 |
| 394 if (property_name != properties->value.name()) | 385 if (property_name != properties->value.name()) |
| 395 return; | 386 return; |
| 396 | 387 |
| 397 DCHECK(service_); | 388 DCHECK(service_); |
| 398 service_->NotifyDescriptorValueChanged(this, iter->second, | 389 service_->NotifyDescriptorValueChanged(this, iter->second, |
| 399 properties->value.value()); | 390 properties->value.value()); |
| 400 } | 391 } |
| 401 | 392 |
| 402 void BluetoothRemoteGattCharacteristicChromeOS::OnError( | 393 void BluetoothRemoteGattCharacteristicBlueZ::OnError( |
| 403 const ErrorCallback& error_callback, | 394 const ErrorCallback& error_callback, |
| 404 const std::string& error_name, | 395 const std::string& error_name, |
| 405 const std::string& error_message) { | 396 const std::string& error_message) { |
| 406 VLOG(1) << "Operation failed: " << error_name << ", message: " | 397 VLOG(1) << "Operation failed: " << error_name |
| 407 << error_message; | 398 << ", message: " << error_message; |
| 408 error_callback.Run( | 399 error_callback.Run( |
| 409 BluetoothRemoteGattServiceChromeOS::DBusErrorToServiceError(error_name)); | 400 BluetoothRemoteGattServiceBlueZ::DBusErrorToServiceError(error_name)); |
| 410 } | 401 } |
| 411 | 402 |
| 412 void BluetoothRemoteGattCharacteristicChromeOS::OnStartNotifySuccess( | 403 void BluetoothRemoteGattCharacteristicBlueZ::OnStartNotifySuccess( |
| 413 const NotifySessionCallback& callback) { | 404 const NotifySessionCallback& callback) { |
| 414 VLOG(1) << "Started notifications from characteristic: " | 405 VLOG(1) << "Started notifications from characteristic: " |
| 415 << object_path_.value(); | 406 << object_path_.value(); |
| 416 DCHECK(num_notify_sessions_ == 0); | 407 DCHECK(num_notify_sessions_ == 0); |
| 417 DCHECK(notify_call_pending_); | 408 DCHECK(notify_call_pending_); |
| 418 | 409 |
| 419 ++num_notify_sessions_; | 410 ++num_notify_sessions_; |
| 420 notify_call_pending_ = false; | 411 notify_call_pending_ = false; |
| 421 | 412 |
| 422 // Invoke the queued callbacks for this operation. | 413 // Invoke the queued callbacks for this operation. |
| 423 DCHECK(service_); | 414 DCHECK(service_); |
| 424 DCHECK(service_->GetDevice()); | 415 DCHECK(service_->GetDevice()); |
| 425 scoped_ptr<device::BluetoothGattNotifySession> session( | 416 scoped_ptr<device::BluetoothGattNotifySession> session( |
| 426 new BluetoothGattNotifySessionChromeOS( | 417 new BluetoothGattNotifySessionBlueZ( |
| 427 service_->GetAdapter(), | 418 service_->GetAdapter(), service_->GetDevice()->GetAddress(), |
| 428 service_->GetDevice()->GetAddress(), | 419 service_->GetIdentifier(), GetIdentifier(), object_path_)); |
| 429 service_->GetIdentifier(), | |
| 430 GetIdentifier(), | |
| 431 object_path_)); | |
| 432 callback.Run(session.Pass()); | 420 callback.Run(session.Pass()); |
| 433 | 421 |
| 434 ProcessStartNotifyQueue(); | 422 ProcessStartNotifyQueue(); |
| 435 } | 423 } |
| 436 | 424 |
| 437 void BluetoothRemoteGattCharacteristicChromeOS::OnStartNotifyError( | 425 void BluetoothRemoteGattCharacteristicBlueZ::OnStartNotifyError( |
| 438 const ErrorCallback& error_callback, | 426 const ErrorCallback& error_callback, |
| 439 const std::string& error_name, | 427 const std::string& error_name, |
| 440 const std::string& error_message) { | 428 const std::string& error_message) { |
| 441 VLOG(1) << "Failed to start notifications from characteristic: " | 429 VLOG(1) << "Failed to start notifications from characteristic: " |
| 442 << object_path_.value() << ": " << error_name << ", " | 430 << object_path_.value() << ": " << error_name << ", " |
| 443 << error_message; | 431 << error_message; |
| 444 DCHECK(num_notify_sessions_ == 0); | 432 DCHECK(num_notify_sessions_ == 0); |
| 445 DCHECK(notify_call_pending_); | 433 DCHECK(notify_call_pending_); |
| 446 | 434 |
| 447 notify_call_pending_ = false; | 435 notify_call_pending_ = false; |
| 448 | 436 |
| 449 error_callback.Run( | 437 error_callback.Run( |
| 450 BluetoothRemoteGattServiceChromeOS::DBusErrorToServiceError(error_name)); | 438 BluetoothRemoteGattServiceBlueZ::DBusErrorToServiceError(error_name)); |
| 451 | 439 |
| 452 ProcessStartNotifyQueue(); | 440 ProcessStartNotifyQueue(); |
| 453 } | 441 } |
| 454 | 442 |
| 455 void BluetoothRemoteGattCharacteristicChromeOS::OnStopNotifySuccess( | 443 void BluetoothRemoteGattCharacteristicBlueZ::OnStopNotifySuccess( |
| 456 const base::Closure& callback) { | 444 const base::Closure& callback) { |
| 457 DCHECK(notify_call_pending_); | 445 DCHECK(notify_call_pending_); |
| 458 DCHECK(num_notify_sessions_ == 1); | 446 DCHECK(num_notify_sessions_ == 1); |
| 459 | 447 |
| 460 notify_call_pending_ = false; | 448 notify_call_pending_ = false; |
| 461 --num_notify_sessions_; | 449 --num_notify_sessions_; |
| 462 callback.Run(); | 450 callback.Run(); |
| 463 | 451 |
| 464 ProcessStartNotifyQueue(); | 452 ProcessStartNotifyQueue(); |
| 465 } | 453 } |
| 466 | 454 |
| 467 void BluetoothRemoteGattCharacteristicChromeOS::OnStopNotifyError( | 455 void BluetoothRemoteGattCharacteristicBlueZ::OnStopNotifyError( |
| 468 const base::Closure& callback, | 456 const base::Closure& callback, |
| 469 const std::string& error_name, | 457 const std::string& error_name, |
| 470 const std::string& error_message) { | 458 const std::string& error_message) { |
| 471 VLOG(1) << "Call to stop notifications failed for characteristic: " | 459 VLOG(1) << "Call to stop notifications failed for characteristic: " |
| 472 << object_path_.value() << ": " << error_name << ", " | 460 << object_path_.value() << ": " << error_name << ", " |
| 473 << error_message; | 461 << error_message; |
| 474 | 462 |
| 475 // Since this is a best effort operation, treat this as success. | 463 // Since this is a best effort operation, treat this as success. |
| 476 OnStopNotifySuccess(callback); | 464 OnStopNotifySuccess(callback); |
| 477 } | 465 } |
| 478 | 466 |
| 479 void BluetoothRemoteGattCharacteristicChromeOS::ProcessStartNotifyQueue() { | 467 void BluetoothRemoteGattCharacteristicBlueZ::ProcessStartNotifyQueue() { |
| 480 while (!pending_start_notify_calls_.empty()) { | 468 while (!pending_start_notify_calls_.empty()) { |
| 481 PendingStartNotifyCall callbacks = pending_start_notify_calls_.front(); | 469 PendingStartNotifyCall callbacks = pending_start_notify_calls_.front(); |
| 482 pending_start_notify_calls_.pop(); | 470 pending_start_notify_calls_.pop(); |
| 483 StartNotifySession(callbacks.first, callbacks.second); | 471 StartNotifySession(callbacks.first, callbacks.second); |
| 484 } | 472 } |
| 485 } | 473 } |
| 486 | 474 |
| 487 } // namespace chromeos | 475 } // namespace bluez |
| OLD | NEW |