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

Side by Side Diff: device/bluetooth/bluez/bluetooth_remote_gatt_characteristic_bluez.cc

Issue 1898643002: Refactor device::BluetoothGattXXX classes to split into remote/local. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: minor cleanup Created 4 years, 8 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 2014 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_characteristic_bluez.h" 5 #include "device/bluetooth/bluez/bluetooth_remote_gatt_characteristic_bluez.h"
6 6
7 #include <iterator> 7 #include <iterator>
8 #include <limits> 8 #include <limits>
9 #include <ostream>
10 9
11 #include "base/bind.h" 10 #include "base/bind.h"
12 #include "base/callback.h" 11 #include "base/callback.h"
13 #include "base/callback_forward.h"
14 #include "base/logging.h" 12 #include "base/logging.h"
15 #include "base/strings/stringprintf.h" 13 #include "base/strings/stringprintf.h"
16 #include "dbus/property.h" 14 #include "dbus/property.h"
17 #include "device/bluetooth/bluetooth_adapter_bluez.h"
18 #include "device/bluetooth/bluetooth_device.h" 15 #include "device/bluetooth/bluetooth_device.h"
19 #include "device/bluetooth/bluetooth_gatt_characteristic.h" 16 #include "device/bluetooth/bluetooth_gatt_characteristic.h"
20 #include "device/bluetooth/bluetooth_gatt_descriptor_bluez.h"
21 #include "device/bluetooth/bluetooth_gatt_notify_session_bluez.h"
22 #include "device/bluetooth/bluetooth_gatt_service.h" 17 #include "device/bluetooth/bluetooth_gatt_service.h"
23 #include "device/bluetooth/bluetooth_remote_gatt_service_bluez.h" 18 #include "device/bluetooth/bluez/bluetooth_adapter_bluez.h"
19 #include "device/bluetooth/bluez/bluetooth_gatt_notify_session_bluez.h"
20 #include "device/bluetooth/bluez/bluetooth_remote_gatt_descriptor_bluez.h"
21 #include "device/bluetooth/bluez/bluetooth_remote_gatt_service_bluez.h"
24 #include "device/bluetooth/dbus/bluetooth_gatt_characteristic_client.h" 22 #include "device/bluetooth/dbus/bluetooth_gatt_characteristic_client.h"
25 #include "device/bluetooth/dbus/bluez_dbus_manager.h" 23 #include "device/bluetooth/dbus/bluez_dbus_manager.h"
26 #include "third_party/cros_system_api/dbus/service_constants.h" 24 #include "third_party/cros_system_api/dbus/service_constants.h"
27 25
28 namespace bluez { 26 namespace bluez {
29 27
30 namespace { 28 namespace {
31 29
32 // Stream operator for logging vector<uint8_t>. 30 // Stream operator for logging vector<uint8_t>.
33 std::ostream& operator<<(std::ostream& out, const std::vector<uint8_t> bytes) { 31 std::ostream& operator<<(std::ostream& out, const std::vector<uint8_t> bytes) {
34 out << "["; 32 out << "[";
35 for (std::vector<uint8_t>::const_iterator iter = bytes.begin(); 33 for (std::vector<uint8_t>::const_iterator iter = bytes.begin();
36 iter != bytes.end(); ++iter) { 34 iter != bytes.end(); ++iter) {
37 out << base::StringPrintf("%02X", *iter); 35 out << base::StringPrintf("%02X", *iter);
38 } 36 }
39 return out << "]"; 37 return out << "]";
40 } 38 }
41 39
42 } // namespace 40 } // namespace
43 41
44 BluetoothRemoteGattCharacteristicBlueZ::BluetoothRemoteGattCharacteristicBlueZ( 42 BluetoothRemoteGattCharacteristicBlueZ::BluetoothRemoteGattCharacteristicBlueZ(
45 BluetoothRemoteGattServiceBlueZ* service, 43 BluetoothRemoteGattServiceBlueZ* service,
46 const dbus::ObjectPath& object_path) 44 const dbus::ObjectPath& object_path)
47 : BluetoothGattCharacteristicBlueZ(service, object_path), 45 : BluetoothGattCharacteristicBlueZ(object_path),
48 num_notify_sessions_(0), 46 num_notify_sessions_(0),
49 notify_call_pending_(false), 47 notify_call_pending_(false),
48 service_(service),
50 weak_ptr_factory_(this) { 49 weak_ptr_factory_(this) {
51 VLOG(1) << "Creating remote GATT characteristic with identifier: " 50 VLOG(1) << "Creating remote GATT characteristic with identifier: "
52 << GetIdentifier() << ", UUID: " << GetUUID().canonical_value(); 51 << GetIdentifier() << ", UUID: " << GetUUID().canonical_value();
53 bluez::BluezDBusManager::Get() 52 bluez::BluezDBusManager::Get()
54 ->GetBluetoothGattDescriptorClient() 53 ->GetBluetoothGattDescriptorClient()
55 ->AddObserver(this); 54 ->AddObserver(this);
56 55
57 // Add all known GATT characteristic descriptors. 56 // Add all known GATT characteristic descriptors.
58 const std::vector<dbus::ObjectPath>& gatt_descs = 57 const std::vector<dbus::ObjectPath>& gatt_descs =
59 bluez::BluezDBusManager::Get() 58 bluez::BluezDBusManager::Get()
(...skipping 13 matching lines...) Expand all
73 // Clean up all the descriptors. There isn't much point in notifying service 72 // Clean up all the descriptors. There isn't much point in notifying service
74 // observers for each descriptor that gets removed, so just delete them. 73 // observers for each descriptor that gets removed, so just delete them.
75 for (DescriptorMap::iterator iter = descriptors_.begin(); 74 for (DescriptorMap::iterator iter = descriptors_.begin();
76 iter != descriptors_.end(); ++iter) 75 iter != descriptors_.end(); ++iter)
77 delete iter->second; 76 delete iter->second;
78 77
79 // Report an error for all pending calls to StartNotifySession. 78 // Report an error for all pending calls to StartNotifySession.
80 while (!pending_start_notify_calls_.empty()) { 79 while (!pending_start_notify_calls_.empty()) {
81 PendingStartNotifyCall callbacks = pending_start_notify_calls_.front(); 80 PendingStartNotifyCall callbacks = pending_start_notify_calls_.front();
82 pending_start_notify_calls_.pop(); 81 pending_start_notify_calls_.pop();
83 callbacks.second.Run(device::BluetoothGattService::GATT_ERROR_FAILED); 82 callbacks.second.Run(device::BluetoothRemoteGattService::GATT_ERROR_FAILED);
84 } 83 }
85 } 84 }
86 85
87 device::BluetoothUUID BluetoothRemoteGattCharacteristicBlueZ::GetUUID() const { 86 device::BluetoothUUID BluetoothRemoteGattCharacteristicBlueZ::GetUUID() const {
88 bluez::BluetoothGattCharacteristicClient::Properties* properties = 87 bluez::BluetoothGattCharacteristicClient::Properties* properties =
89 bluez::BluezDBusManager::Get() 88 bluez::BluezDBusManager::Get()
90 ->GetBluetoothGattCharacteristicClient() 89 ->GetBluetoothGattCharacteristicClient()
91 ->GetProperties(object_path()); 90 ->GetProperties(object_path());
92 DCHECK(properties); 91 DCHECK(properties);
93 return device::BluetoothUUID(properties->uuid.value()); 92 return device::BluetoothUUID(properties->uuid.value());
94 } 93 }
95 94
96 bool BluetoothRemoteGattCharacteristicBlueZ::IsLocal() const {
97 return false;
98 }
99
100 const std::vector<uint8_t>& BluetoothRemoteGattCharacteristicBlueZ::GetValue() 95 const std::vector<uint8_t>& BluetoothRemoteGattCharacteristicBlueZ::GetValue()
101 const { 96 const {
102 bluez::BluetoothGattCharacteristicClient::Properties* properties = 97 bluez::BluetoothGattCharacteristicClient::Properties* properties =
103 bluez::BluezDBusManager::Get() 98 bluez::BluezDBusManager::Get()
104 ->GetBluetoothGattCharacteristicClient() 99 ->GetBluetoothGattCharacteristicClient()
105 ->GetProperties(object_path()); 100 ->GetProperties(object_path());
106 101
107 DCHECK(properties); 102 DCHECK(properties);
108 103
109 return properties->value.value(); 104 return properties->value.value();
110 } 105 }
111 106
112 device::BluetoothGattCharacteristic::Properties 107 device::BluetoothRemoteGattCharacteristic::Properties
113 BluetoothRemoteGattCharacteristicBlueZ::GetProperties() const { 108 BluetoothRemoteGattCharacteristicBlueZ::GetProperties() const {
114 bluez::BluetoothGattCharacteristicClient::Properties* properties = 109 bluez::BluetoothGattCharacteristicClient::Properties* properties =
115 bluez::BluezDBusManager::Get() 110 bluez::BluezDBusManager::Get()
116 ->GetBluetoothGattCharacteristicClient() 111 ->GetBluetoothGattCharacteristicClient()
117 ->GetProperties(object_path()); 112 ->GetProperties(object_path());
118 DCHECK(properties); 113 DCHECK(properties);
119 114
120 Properties props = PROPERTY_NONE; 115 Properties props = PROPERTY_NONE;
121 const std::vector<std::string>& flags = properties->flags.value(); 116 const std::vector<std::string>& flags = properties->flags.value();
122 for (std::vector<std::string>::const_iterator iter = flags.begin(); 117 for (std::vector<std::string>::const_iterator iter = flags.begin();
(...skipping 26 matching lines...) Expand all
149 bool BluetoothRemoteGattCharacteristicBlueZ::IsNotifying() const { 144 bool BluetoothRemoteGattCharacteristicBlueZ::IsNotifying() const {
150 bluez::BluetoothGattCharacteristicClient::Properties* properties = 145 bluez::BluetoothGattCharacteristicClient::Properties* properties =
151 bluez::BluezDBusManager::Get() 146 bluez::BluezDBusManager::Get()
152 ->GetBluetoothGattCharacteristicClient() 147 ->GetBluetoothGattCharacteristicClient()
153 ->GetProperties(object_path()); 148 ->GetProperties(object_path());
154 DCHECK(properties); 149 DCHECK(properties);
155 150
156 return properties->notifying.value(); 151 return properties->notifying.value();
157 } 152 }
158 153
159 bool BluetoothRemoteGattCharacteristicBlueZ::AddDescriptor( 154 device::BluetoothRemoteGattService*
160 device::BluetoothGattDescriptor* descriptor) { 155 BluetoothRemoteGattCharacteristicBlueZ::GetService() const {
161 VLOG(1) << "Descriptors cannot be added to a remote GATT characteristic."; 156 return service_;
162 return false;
163 } 157 }
164 158
165 bool BluetoothRemoteGattCharacteristicBlueZ::UpdateValue( 159 device::BluetoothRemoteGattCharacteristic::Permissions
166 const std::vector<uint8_t>& value) { 160 BluetoothRemoteGattCharacteristicBlueZ::GetPermissions() const {
167 VLOG(1) << "Cannot update the value of a remote GATT characteristic."; 161 // TODO(armansito): Once BlueZ defines the permissions, return the correct
168 return false; 162 // values here.
163 return PERMISSION_NONE;
164 }
165
166 std::vector<device::BluetoothRemoteGattDescriptor*>
167 BluetoothRemoteGattCharacteristicBlueZ::GetDescriptors() const {
168 std::vector<device::BluetoothRemoteGattDescriptor*> descriptors;
169 for (DescriptorMap::const_iterator iter = descriptors_.begin();
170 iter != descriptors_.end(); ++iter)
171 descriptors.push_back(iter->second);
172 return descriptors;
173 }
174
175 device::BluetoothRemoteGattDescriptor*
176 BluetoothRemoteGattCharacteristicBlueZ::GetDescriptor(
177 const std::string& identifier) const {
178 DescriptorMap::const_iterator iter =
179 descriptors_.find(dbus::ObjectPath(identifier));
180 if (iter == descriptors_.end())
181 return nullptr;
182 return iter->second;
169 } 183 }
170 184
171 void BluetoothRemoteGattCharacteristicBlueZ::StartNotifySession( 185 void BluetoothRemoteGattCharacteristicBlueZ::StartNotifySession(
172 const NotifySessionCallback& callback, 186 const NotifySessionCallback& callback,
173 const ErrorCallback& error_callback) { 187 const ErrorCallback& error_callback) {
174 VLOG(1) << __func__; 188 VLOG(1) << __func__;
175 189
176 if (num_notify_sessions_ > 0) { 190 if (num_notify_sessions_ > 0) {
177 // The characteristic might have stopped notifying even though the session 191 // The characteristic might have stopped notifying even though the session
178 // count is nonzero. This means that notifications stopped outside of our 192 // count is nonzero. This means that notifications stopped outside of our
179 // control and we should reset the count. If the characteristic is still 193 // control and we should reset the count. If the characteristic is still
180 // notifying, then return success. Otherwise, reset the count and treat 194 // notifying, then return success. Otherwise, reset the count and treat
181 // this call as if the count were 0. 195 // this call as if the count were 0.
182 if (IsNotifying()) { 196 if (IsNotifying()) {
183 // Check for overflows, though unlikely. 197 // Check for overflows, though unlikely.
184 if (num_notify_sessions_ == std::numeric_limits<size_t>::max()) { 198 if (num_notify_sessions_ == std::numeric_limits<size_t>::max()) {
185 error_callback.Run(device::BluetoothGattService::GATT_ERROR_FAILED); 199 error_callback.Run(
200 device::BluetoothRemoteGattService::GATT_ERROR_FAILED);
186 return; 201 return;
187 } 202 }
188 203
189 ++num_notify_sessions_; 204 ++num_notify_sessions_;
190 DCHECK(service_); 205 DCHECK(service_);
191 DCHECK(service_->GetAdapter()); 206 DCHECK(service_->GetAdapter());
192 DCHECK(service_->GetDevice()); 207 DCHECK(service_->GetDevice());
193 std::unique_ptr<device::BluetoothGattNotifySession> session( 208 std::unique_ptr<device::BluetoothGattNotifySession> session(
194 new BluetoothGattNotifySessionBlueZ( 209 new BluetoothGattNotifySessionBlueZ(
195 service_->GetAdapter(), service_->GetDevice()->GetAddress(), 210 service_->GetAdapter(), service_->GetDevice()->GetAddress(),
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
300 ->GetProperties(object_path); 315 ->GetProperties(object_path);
301 DCHECK(properties); 316 DCHECK(properties);
302 if (properties->characteristic.value() != this->object_path()) { 317 if (properties->characteristic.value() != this->object_path()) {
303 VLOG(3) << "Remote GATT descriptor does not belong to this characteristic."; 318 VLOG(3) << "Remote GATT descriptor does not belong to this characteristic.";
304 return; 319 return;
305 } 320 }
306 321
307 VLOG(1) << "Adding new remote GATT descriptor for GATT characteristic: " 322 VLOG(1) << "Adding new remote GATT descriptor for GATT characteristic: "
308 << GetIdentifier() << ", UUID: " << GetUUID().canonical_value(); 323 << GetIdentifier() << ", UUID: " << GetUUID().canonical_value();
309 324
310 BluetoothGattDescriptorBlueZ* descriptor = 325 BluetoothRemoteGattDescriptorBlueZ* descriptor =
311 new BluetoothGattDescriptorBlueZ(this, object_path, false /* is_local */); 326 new BluetoothRemoteGattDescriptorBlueZ(this, object_path);
312 descriptors_[object_path] = descriptor; 327 descriptors_[object_path] = descriptor;
313 DCHECK(descriptor->GetIdentifier() == object_path.value()); 328 DCHECK(descriptor->GetIdentifier() == object_path.value());
314 DCHECK(descriptor->GetUUID().IsValid()); 329 DCHECK(descriptor->GetUUID().IsValid());
315 DCHECK(service_); 330 DCHECK(service_);
316 331
317 static_cast<BluetoothRemoteGattServiceBlueZ*>(service_) 332 static_cast<BluetoothRemoteGattServiceBlueZ*>(service_)
318 ->NotifyDescriptorAddedOrRemoved(this, descriptor, true /* added */); 333 ->NotifyDescriptorAddedOrRemoved(this, descriptor, true /* added */);
319 } 334 }
320 335
321 void BluetoothRemoteGattCharacteristicBlueZ::GattDescriptorRemoved( 336 void BluetoothRemoteGattCharacteristicBlueZ::GattDescriptorRemoved(
322 const dbus::ObjectPath& object_path) { 337 const dbus::ObjectPath& object_path) {
323 DescriptorMap::iterator iter = descriptors_.find(object_path); 338 DescriptorMap::iterator iter = descriptors_.find(object_path);
324 if (iter == descriptors_.end()) { 339 if (iter == descriptors_.end()) {
325 VLOG(2) << "Unknown descriptor removed: " << object_path.value(); 340 VLOG(2) << "Unknown descriptor removed: " << object_path.value();
326 return; 341 return;
327 } 342 }
328 343
329 VLOG(1) << "Removing remote GATT descriptor from characteristic: " 344 VLOG(1) << "Removing remote GATT descriptor from characteristic: "
330 << GetIdentifier() << ", UUID: " << GetUUID().canonical_value(); 345 << GetIdentifier() << ", UUID: " << GetUUID().canonical_value();
331 346
332 BluetoothGattDescriptorBlueZ* descriptor = iter->second; 347 BluetoothRemoteGattDescriptorBlueZ* descriptor = iter->second;
333 DCHECK(descriptor->object_path() == object_path); 348 DCHECK(descriptor->object_path() == object_path);
334 descriptors_.erase(iter); 349 descriptors_.erase(iter);
335 350
336 DCHECK(service_); 351 DCHECK(service_);
337 static_cast<BluetoothRemoteGattServiceBlueZ*>(service_) 352 static_cast<BluetoothRemoteGattServiceBlueZ*>(service_)
338 ->NotifyDescriptorAddedOrRemoved(this, descriptor, false /* added */); 353 ->NotifyDescriptorAddedOrRemoved(this, descriptor, false /* added */);
339 354
340 delete descriptor; 355 delete descriptor;
341 } 356 }
342 357
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
441 const ErrorCallback& error_callback, 456 const ErrorCallback& error_callback,
442 const std::string& error_name, 457 const std::string& error_name,
443 const std::string& error_message) { 458 const std::string& error_message) {
444 VLOG(1) << "Operation failed: " << error_name 459 VLOG(1) << "Operation failed: " << error_name
445 << ", message: " << error_message; 460 << ", message: " << error_message;
446 error_callback.Run( 461 error_callback.Run(
447 BluetoothGattServiceBlueZ::DBusErrorToServiceError(error_name)); 462 BluetoothGattServiceBlueZ::DBusErrorToServiceError(error_name));
448 } 463 }
449 464
450 } // namespace bluez 465 } // namespace bluez
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698