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/dbus/bluetooth_gatt_descriptor_service_provider.h" | 5 #include "device/bluetooth/dbus/bluetooth_gatt_descriptor_service_provider.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <utility> |
8 | 9 |
9 #include "base/bind.h" | 10 #include "base/bind.h" |
10 #include "base/logging.h" | 11 #include "base/logging.h" |
11 #include "base/macros.h" | 12 #include "base/macros.h" |
12 #include "base/memory/weak_ptr.h" | 13 #include "base/memory/weak_ptr.h" |
13 #include "base/strings/string_util.h" | 14 #include "base/strings/string_util.h" |
14 #include "base/threading/platform_thread.h" | 15 #include "base/threading/platform_thread.h" |
15 #include "dbus/exported_object.h" | 16 #include "dbus/exported_object.h" |
16 #include "dbus/message.h" | 17 #include "dbus/message.h" |
17 #include "device/bluetooth/dbus/bluez_dbus_manager.h" | 18 #include "device/bluetooth/dbus/bluez_dbus_manager.h" |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
132 | 133 |
133 dbus::MessageReader reader(method_call); | 134 dbus::MessageReader reader(method_call); |
134 | 135 |
135 std::string interface_name; | 136 std::string interface_name; |
136 std::string property_name; | 137 std::string property_name; |
137 if (!reader.PopString(&interface_name) || | 138 if (!reader.PopString(&interface_name) || |
138 !reader.PopString(&property_name) || reader.HasMoreData()) { | 139 !reader.PopString(&property_name) || reader.HasMoreData()) { |
139 scoped_ptr<dbus::ErrorResponse> error_response = | 140 scoped_ptr<dbus::ErrorResponse> error_response = |
140 dbus::ErrorResponse::FromMethodCall(method_call, kErrorInvalidArgs, | 141 dbus::ErrorResponse::FromMethodCall(method_call, kErrorInvalidArgs, |
141 "Expected 'ss'."); | 142 "Expected 'ss'."); |
142 response_sender.Run(error_response.Pass()); | 143 response_sender.Run(std::move(error_response)); |
143 return; | 144 return; |
144 } | 145 } |
145 | 146 |
146 // Only the GATT descriptor interface is supported. | 147 // Only the GATT descriptor interface is supported. |
147 if (interface_name != | 148 if (interface_name != |
148 bluetooth_gatt_descriptor::kBluetoothGattDescriptorInterface) { | 149 bluetooth_gatt_descriptor::kBluetoothGattDescriptorInterface) { |
149 scoped_ptr<dbus::ErrorResponse> error_response = | 150 scoped_ptr<dbus::ErrorResponse> error_response = |
150 dbus::ErrorResponse::FromMethodCall( | 151 dbus::ErrorResponse::FromMethodCall( |
151 method_call, kErrorInvalidArgs, | 152 method_call, kErrorInvalidArgs, |
152 "No such interface: '" + interface_name + "'."); | 153 "No such interface: '" + interface_name + "'."); |
153 response_sender.Run(error_response.Pass()); | 154 response_sender.Run(std::move(error_response)); |
154 return; | 155 return; |
155 } | 156 } |
156 | 157 |
157 // If getting the "Value" property, obtain the value from the delegate. | 158 // If getting the "Value" property, obtain the value from the delegate. |
158 if (property_name == bluetooth_gatt_descriptor::kValueProperty) { | 159 if (property_name == bluetooth_gatt_descriptor::kValueProperty) { |
159 DCHECK(delegate_); | 160 DCHECK(delegate_); |
160 delegate_->GetDescriptorValue( | 161 delegate_->GetDescriptorValue( |
161 base::Bind(&BluetoothGattDescriptorServiceProviderImpl::OnGet, | 162 base::Bind(&BluetoothGattDescriptorServiceProviderImpl::OnGet, |
162 weak_ptr_factory_.GetWeakPtr(), method_call, | 163 weak_ptr_factory_.GetWeakPtr(), method_call, |
163 response_sender), | 164 response_sender), |
(...skipping 17 matching lines...) Expand all Loading... |
181 bluetooth_gatt_descriptor::kCharacteristicProperty) { | 182 bluetooth_gatt_descriptor::kCharacteristicProperty) { |
182 writer.OpenVariant("o", &variant_writer); | 183 writer.OpenVariant("o", &variant_writer); |
183 variant_writer.AppendObjectPath(characteristic_path_); | 184 variant_writer.AppendObjectPath(characteristic_path_); |
184 writer.CloseContainer(&variant_writer); | 185 writer.CloseContainer(&variant_writer); |
185 } else { | 186 } else { |
186 response = dbus::ErrorResponse::FromMethodCall( | 187 response = dbus::ErrorResponse::FromMethodCall( |
187 method_call, kErrorInvalidArgs, | 188 method_call, kErrorInvalidArgs, |
188 "No such property: '" + property_name + "'."); | 189 "No such property: '" + property_name + "'."); |
189 } | 190 } |
190 | 191 |
191 response_sender.Run(response.Pass()); | 192 response_sender.Run(std::move(response)); |
192 } | 193 } |
193 | 194 |
194 // Called by dbus:: when the Bluetooth daemon sets a single property of the | 195 // Called by dbus:: when the Bluetooth daemon sets a single property of the |
195 // descriptor. | 196 // descriptor. |
196 void Set(dbus::MethodCall* method_call, | 197 void Set(dbus::MethodCall* method_call, |
197 dbus::ExportedObject::ResponseSender response_sender) { | 198 dbus::ExportedObject::ResponseSender response_sender) { |
198 VLOG(2) << "BluetoothGattDescriptorServiceProvider::Set: " | 199 VLOG(2) << "BluetoothGattDescriptorServiceProvider::Set: " |
199 << object_path_.value(); | 200 << object_path_.value(); |
200 DCHECK(OnOriginThread()); | 201 DCHECK(OnOriginThread()); |
201 | 202 |
202 dbus::MessageReader reader(method_call); | 203 dbus::MessageReader reader(method_call); |
203 | 204 |
204 std::string interface_name; | 205 std::string interface_name; |
205 std::string property_name; | 206 std::string property_name; |
206 dbus::MessageReader variant_reader(NULL); | 207 dbus::MessageReader variant_reader(NULL); |
207 if (!reader.PopString(&interface_name) || | 208 if (!reader.PopString(&interface_name) || |
208 !reader.PopString(&property_name) || | 209 !reader.PopString(&property_name) || |
209 !reader.PopVariant(&variant_reader) || reader.HasMoreData()) { | 210 !reader.PopVariant(&variant_reader) || reader.HasMoreData()) { |
210 scoped_ptr<dbus::ErrorResponse> error_response = | 211 scoped_ptr<dbus::ErrorResponse> error_response = |
211 dbus::ErrorResponse::FromMethodCall(method_call, kErrorInvalidArgs, | 212 dbus::ErrorResponse::FromMethodCall(method_call, kErrorInvalidArgs, |
212 "Expected 'ssv'."); | 213 "Expected 'ssv'."); |
213 response_sender.Run(error_response.Pass()); | 214 response_sender.Run(std::move(error_response)); |
214 return; | 215 return; |
215 } | 216 } |
216 | 217 |
217 // Only the GATT descriptor interface is allowed. | 218 // Only the GATT descriptor interface is allowed. |
218 if (interface_name != | 219 if (interface_name != |
219 bluetooth_gatt_descriptor::kBluetoothGattDescriptorInterface) { | 220 bluetooth_gatt_descriptor::kBluetoothGattDescriptorInterface) { |
220 scoped_ptr<dbus::ErrorResponse> error_response = | 221 scoped_ptr<dbus::ErrorResponse> error_response = |
221 dbus::ErrorResponse::FromMethodCall( | 222 dbus::ErrorResponse::FromMethodCall( |
222 method_call, kErrorInvalidArgs, | 223 method_call, kErrorInvalidArgs, |
223 "No such interface: '" + interface_name + "'."); | 224 "No such interface: '" + interface_name + "'."); |
224 response_sender.Run(error_response.Pass()); | 225 response_sender.Run(std::move(error_response)); |
225 return; | 226 return; |
226 } | 227 } |
227 | 228 |
228 // Only the "Value" property is writeable. | 229 // Only the "Value" property is writeable. |
229 if (property_name != bluetooth_gatt_descriptor::kValueProperty) { | 230 if (property_name != bluetooth_gatt_descriptor::kValueProperty) { |
230 std::string error_name; | 231 std::string error_name; |
231 std::string error_message; | 232 std::string error_message; |
232 if (property_name == bluetooth_gatt_descriptor::kUUIDProperty || | 233 if (property_name == bluetooth_gatt_descriptor::kUUIDProperty || |
233 property_name == bluetooth_gatt_descriptor::kCharacteristicProperty) { | 234 property_name == bluetooth_gatt_descriptor::kCharacteristicProperty) { |
234 error_name = kErrorPropertyReadOnly; | 235 error_name = kErrorPropertyReadOnly; |
235 error_message = "Read-only property: '" + property_name + "'."; | 236 error_message = "Read-only property: '" + property_name + "'."; |
236 } else { | 237 } else { |
237 error_name = kErrorInvalidArgs; | 238 error_name = kErrorInvalidArgs; |
238 error_message = "No such property: '" + property_name + "'."; | 239 error_message = "No such property: '" + property_name + "'."; |
239 } | 240 } |
240 scoped_ptr<dbus::ErrorResponse> error_response = | 241 scoped_ptr<dbus::ErrorResponse> error_response = |
241 dbus::ErrorResponse::FromMethodCall(method_call, error_name, | 242 dbus::ErrorResponse::FromMethodCall(method_call, error_name, |
242 error_message); | 243 error_message); |
243 response_sender.Run(error_response.Pass()); | 244 response_sender.Run(std::move(error_response)); |
244 return; | 245 return; |
245 } | 246 } |
246 | 247 |
247 // Obtain the value. | 248 // Obtain the value. |
248 const uint8_t* bytes = NULL; | 249 const uint8_t* bytes = NULL; |
249 size_t length = 0; | 250 size_t length = 0; |
250 if (!variant_reader.PopArrayOfBytes(&bytes, &length)) { | 251 if (!variant_reader.PopArrayOfBytes(&bytes, &length)) { |
251 scoped_ptr<dbus::ErrorResponse> error_response = | 252 scoped_ptr<dbus::ErrorResponse> error_response = |
252 dbus::ErrorResponse::FromMethodCall( | 253 dbus::ErrorResponse::FromMethodCall( |
253 method_call, kErrorInvalidArgs, | 254 method_call, kErrorInvalidArgs, |
254 "Property '" + property_name + "' has type 'ay'."); | 255 "Property '" + property_name + "' has type 'ay'."); |
255 response_sender.Run(error_response.Pass()); | 256 response_sender.Run(std::move(error_response)); |
256 return; | 257 return; |
257 } | 258 } |
258 | 259 |
259 // Pass the set request onto the delegate. | 260 // Pass the set request onto the delegate. |
260 std::vector<uint8_t> value(bytes, bytes + length); | 261 std::vector<uint8_t> value(bytes, bytes + length); |
261 DCHECK(delegate_); | 262 DCHECK(delegate_); |
262 delegate_->SetDescriptorValue( | 263 delegate_->SetDescriptorValue( |
263 value, base::Bind(&BluetoothGattDescriptorServiceProviderImpl::OnSet, | 264 value, base::Bind(&BluetoothGattDescriptorServiceProviderImpl::OnSet, |
264 weak_ptr_factory_.GetWeakPtr(), method_call, | 265 weak_ptr_factory_.GetWeakPtr(), method_call, |
265 response_sender), | 266 response_sender), |
(...skipping 10 matching lines...) Expand all Loading... |
276 << object_path_.value(); | 277 << object_path_.value(); |
277 DCHECK(OnOriginThread()); | 278 DCHECK(OnOriginThread()); |
278 | 279 |
279 dbus::MessageReader reader(method_call); | 280 dbus::MessageReader reader(method_call); |
280 | 281 |
281 std::string interface_name; | 282 std::string interface_name; |
282 if (!reader.PopString(&interface_name) || reader.HasMoreData()) { | 283 if (!reader.PopString(&interface_name) || reader.HasMoreData()) { |
283 scoped_ptr<dbus::ErrorResponse> error_response = | 284 scoped_ptr<dbus::ErrorResponse> error_response = |
284 dbus::ErrorResponse::FromMethodCall(method_call, kErrorInvalidArgs, | 285 dbus::ErrorResponse::FromMethodCall(method_call, kErrorInvalidArgs, |
285 "Expected 's'."); | 286 "Expected 's'."); |
286 response_sender.Run(error_response.Pass()); | 287 response_sender.Run(std::move(error_response)); |
287 return; | 288 return; |
288 } | 289 } |
289 | 290 |
290 // Only the GATT descriptor interface is supported. | 291 // Only the GATT descriptor interface is supported. |
291 if (interface_name != | 292 if (interface_name != |
292 bluetooth_gatt_descriptor::kBluetoothGattDescriptorInterface) { | 293 bluetooth_gatt_descriptor::kBluetoothGattDescriptorInterface) { |
293 scoped_ptr<dbus::ErrorResponse> error_response = | 294 scoped_ptr<dbus::ErrorResponse> error_response = |
294 dbus::ErrorResponse::FromMethodCall( | 295 dbus::ErrorResponse::FromMethodCall( |
295 method_call, kErrorInvalidArgs, | 296 method_call, kErrorInvalidArgs, |
296 "No such interface: '" + interface_name + "'."); | 297 "No such interface: '" + interface_name + "'."); |
297 response_sender.Run(error_response.Pass()); | 298 response_sender.Run(std::move(error_response)); |
298 return; | 299 return; |
299 } | 300 } |
300 | 301 |
301 // Try to obtain the value from the delegate. We will construct the | 302 // Try to obtain the value from the delegate. We will construct the |
302 // response in the success callback. | 303 // response in the success callback. |
303 DCHECK(delegate_); | 304 DCHECK(delegate_); |
304 delegate_->GetDescriptorValue( | 305 delegate_->GetDescriptorValue( |
305 base::Bind(&BluetoothGattDescriptorServiceProviderImpl::OnGetAll, | 306 base::Bind(&BluetoothGattDescriptorServiceProviderImpl::OnGetAll, |
306 weak_ptr_factory_.GetWeakPtr(), method_call, | 307 weak_ptr_factory_.GetWeakPtr(), method_call, |
307 response_sender), | 308 response_sender), |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
351 dict_entry_writer.AppendString(bluetooth_gatt_descriptor::kValueProperty); | 352 dict_entry_writer.AppendString(bluetooth_gatt_descriptor::kValueProperty); |
352 dict_entry_writer.OpenVariant("ay", &variant_writer); | 353 dict_entry_writer.OpenVariant("ay", &variant_writer); |
353 variant_writer.AppendArrayOfBytes(value.data(), value.size()); | 354 variant_writer.AppendArrayOfBytes(value.data(), value.size()); |
354 dict_entry_writer.CloseContainer(&variant_writer); | 355 dict_entry_writer.CloseContainer(&variant_writer); |
355 array_writer.CloseContainer(&dict_entry_writer); | 356 array_writer.CloseContainer(&dict_entry_writer); |
356 | 357 |
357 // TODO(armansito): Process "Permissions" property. | 358 // TODO(armansito): Process "Permissions" property. |
358 | 359 |
359 writer.CloseContainer(&array_writer); | 360 writer.CloseContainer(&array_writer); |
360 | 361 |
361 response_sender.Run(response.Pass()); | 362 response_sender.Run(std::move(response)); |
362 } | 363 } |
363 | 364 |
364 // Called by the Delegate in response to a successful method call to get the | 365 // Called by the Delegate in response to a successful method call to get the |
365 // descriptor value. | 366 // descriptor value. |
366 void OnGet(dbus::MethodCall* method_call, | 367 void OnGet(dbus::MethodCall* method_call, |
367 dbus::ExportedObject::ResponseSender response_sender, | 368 dbus::ExportedObject::ResponseSender response_sender, |
368 const std::vector<uint8_t>& value) { | 369 const std::vector<uint8_t>& value) { |
369 VLOG(2) << "Returning descriptor value obtained from delegate."; | 370 VLOG(2) << "Returning descriptor value obtained from delegate."; |
370 scoped_ptr<dbus::Response> response = | 371 scoped_ptr<dbus::Response> response = |
371 dbus::Response::FromMethodCall(method_call); | 372 dbus::Response::FromMethodCall(method_call); |
372 dbus::MessageWriter writer(response.get()); | 373 dbus::MessageWriter writer(response.get()); |
373 dbus::MessageWriter variant_writer(NULL); | 374 dbus::MessageWriter variant_writer(NULL); |
374 | 375 |
375 writer.OpenVariant("ay", &variant_writer); | 376 writer.OpenVariant("ay", &variant_writer); |
376 variant_writer.AppendArrayOfBytes(value.data(), value.size()); | 377 variant_writer.AppendArrayOfBytes(value.data(), value.size()); |
377 writer.CloseContainer(&variant_writer); | 378 writer.CloseContainer(&variant_writer); |
378 | 379 |
379 response_sender.Run(response.Pass()); | 380 response_sender.Run(std::move(response)); |
380 } | 381 } |
381 | 382 |
382 // Called by the Delegate in response to a successful method call to set the | 383 // Called by the Delegate in response to a successful method call to set the |
383 // descriptor value. | 384 // descriptor value. |
384 void OnSet(dbus::MethodCall* method_call, | 385 void OnSet(dbus::MethodCall* method_call, |
385 dbus::ExportedObject::ResponseSender response_sender) { | 386 dbus::ExportedObject::ResponseSender response_sender) { |
386 VLOG(2) << "Successfully set descriptor value. Return success."; | 387 VLOG(2) << "Successfully set descriptor value. Return success."; |
387 response_sender.Run(dbus::Response::FromMethodCall(method_call)); | 388 response_sender.Run(dbus::Response::FromMethodCall(method_call)); |
388 } | 389 } |
389 | 390 |
390 // Called by the Delegate in response to a failed method call to get or set | 391 // Called by the Delegate in response to a failed method call to get or set |
391 // the descriptor value. | 392 // the descriptor value. |
392 void OnFailure(dbus::MethodCall* method_call, | 393 void OnFailure(dbus::MethodCall* method_call, |
393 dbus::ExportedObject::ResponseSender response_sender) { | 394 dbus::ExportedObject::ResponseSender response_sender) { |
394 VLOG(2) << "Failed to get/set descriptor value. Report error."; | 395 VLOG(2) << "Failed to get/set descriptor value. Report error."; |
395 scoped_ptr<dbus::ErrorResponse> error_response = | 396 scoped_ptr<dbus::ErrorResponse> error_response = |
396 dbus::ErrorResponse::FromMethodCall( | 397 dbus::ErrorResponse::FromMethodCall( |
397 method_call, kErrorFailed, "Failed to get/set descriptor value."); | 398 method_call, kErrorFailed, "Failed to get/set descriptor value."); |
398 response_sender.Run(error_response.Pass()); | 399 response_sender.Run(std::move(error_response)); |
399 } | 400 } |
400 | 401 |
401 // Origin thread (i.e. the UI thread in production). | 402 // Origin thread (i.e. the UI thread in production). |
402 base::PlatformThreadId origin_thread_id_; | 403 base::PlatformThreadId origin_thread_id_; |
403 | 404 |
404 // 128-bit descriptor UUID of this object. | 405 // 128-bit descriptor UUID of this object. |
405 std::string uuid_; | 406 std::string uuid_; |
406 | 407 |
407 // D-Bus bus object is exported on, not owned by this object and must | 408 // D-Bus bus object is exported on, not owned by this object and must |
408 // outlive it. | 409 // outlive it. |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
451 const dbus::ObjectPath& characteristic_path) { | 452 const dbus::ObjectPath& characteristic_path) { |
452 if (!bluez::BluezDBusManager::Get()->IsUsingStub()) { | 453 if (!bluez::BluezDBusManager::Get()->IsUsingStub()) { |
453 return new BluetoothGattDescriptorServiceProviderImpl( | 454 return new BluetoothGattDescriptorServiceProviderImpl( |
454 bus, object_path, delegate, uuid, permissions, characteristic_path); | 455 bus, object_path, delegate, uuid, permissions, characteristic_path); |
455 } | 456 } |
456 return new FakeBluetoothGattDescriptorServiceProvider( | 457 return new FakeBluetoothGattDescriptorServiceProvider( |
457 object_path, delegate, uuid, permissions, characteristic_path); | 458 object_path, delegate, uuid, permissions, characteristic_path); |
458 } | 459 } |
459 | 460 |
460 } // namespace bluez | 461 } // namespace bluez |
OLD | NEW |