| 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 |