| 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 "chromeos/dbus/bluetooth_gatt_descriptor_service_provider.h" | 5 #include "device/bluetooth/dbus/bluetooth_gatt_descriptor_service_provider.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/logging.h" | 8 #include "base/logging.h" |
| 9 #include "base/memory/weak_ptr.h" | 9 #include "base/memory/weak_ptr.h" |
| 10 #include "base/strings/string_util.h" | 10 #include "base/strings/string_util.h" |
| 11 #include "base/threading/platform_thread.h" | 11 #include "base/threading/platform_thread.h" |
| 12 #include "chromeos/dbus/dbus_thread_manager.h" | |
| 13 #include "chromeos/dbus/fake_bluetooth_gatt_descriptor_service_provider.h" | |
| 14 #include "dbus/exported_object.h" | 12 #include "dbus/exported_object.h" |
| 15 #include "dbus/message.h" | 13 #include "dbus/message.h" |
| 14 #include "device/bluetooth/dbus/bluez_dbus_manager.h" |
| 15 #include "device/bluetooth/dbus/fake_bluetooth_gatt_descriptor_service_provider.
h" |
| 16 #include "third_party/cros_system_api/dbus/service_constants.h" | 16 #include "third_party/cros_system_api/dbus/service_constants.h" |
| 17 | 17 |
| 18 namespace chromeos { | 18 namespace bluez { |
| 19 namespace { | 19 namespace { |
| 20 const char kErrorInvalidArgs[] = | 20 const char kErrorInvalidArgs[] = "org.freedesktop.DBus.Error.InvalidArgs"; |
| 21 "org.freedesktop.DBus.Error.InvalidArgs"; | |
| 22 const char kErrorPropertyReadOnly[] = | 21 const char kErrorPropertyReadOnly[] = |
| 23 "org.freedesktop.DBus.Error.PropertyReadOnly"; | 22 "org.freedesktop.DBus.Error.PropertyReadOnly"; |
| 24 const char kErrorFailed[] = | 23 const char kErrorFailed[] = "org.freedesktop.DBus.Error.Failed"; |
| 25 "org.freedesktop.DBus.Error.Failed"; | |
| 26 } // namespace | 24 } // namespace |
| 27 | 25 |
| 28 // The BluetoothGattDescriptorServiceProvider implementation used in production. | 26 // The BluetoothGattDescriptorServiceProvider implementation used in production. |
| 29 class BluetoothGattDescriptorServiceProviderImpl | 27 class BluetoothGattDescriptorServiceProviderImpl |
| 30 : public BluetoothGattDescriptorServiceProvider { | 28 : public BluetoothGattDescriptorServiceProvider { |
| 31 public: | 29 public: |
| 32 BluetoothGattDescriptorServiceProviderImpl( | 30 BluetoothGattDescriptorServiceProviderImpl( |
| 33 dbus::Bus* bus, | 31 dbus::Bus* bus, |
| 34 const dbus::ObjectPath& object_path, | 32 const dbus::ObjectPath& object_path, |
| 35 Delegate* delegate, | 33 Delegate* delegate, |
| (...skipping 14 matching lines...) Expand all Loading... |
| 50 DCHECK(!uuid_.empty()); | 48 DCHECK(!uuid_.empty()); |
| 51 DCHECK(object_path_.IsValid()); | 49 DCHECK(object_path_.IsValid()); |
| 52 DCHECK(characteristic_path_.IsValid()); | 50 DCHECK(characteristic_path_.IsValid()); |
| 53 DCHECK(base::StartsWith(object_path_.value(), | 51 DCHECK(base::StartsWith(object_path_.value(), |
| 54 characteristic_path_.value() + "/", | 52 characteristic_path_.value() + "/", |
| 55 base::CompareCase::SENSITIVE)); | 53 base::CompareCase::SENSITIVE)); |
| 56 | 54 |
| 57 exported_object_ = bus_->GetExportedObject(object_path_); | 55 exported_object_ = bus_->GetExportedObject(object_path_); |
| 58 | 56 |
| 59 exported_object_->ExportMethod( | 57 exported_object_->ExportMethod( |
| 60 dbus::kDBusPropertiesInterface, | 58 dbus::kDBusPropertiesInterface, dbus::kDBusPropertiesGet, |
| 61 dbus::kDBusPropertiesGet, | |
| 62 base::Bind(&BluetoothGattDescriptorServiceProviderImpl::Get, | 59 base::Bind(&BluetoothGattDescriptorServiceProviderImpl::Get, |
| 63 weak_ptr_factory_.GetWeakPtr()), | 60 weak_ptr_factory_.GetWeakPtr()), |
| 64 base::Bind(&BluetoothGattDescriptorServiceProviderImpl::OnExported, | 61 base::Bind(&BluetoothGattDescriptorServiceProviderImpl::OnExported, |
| 65 weak_ptr_factory_.GetWeakPtr())); | 62 weak_ptr_factory_.GetWeakPtr())); |
| 66 | 63 |
| 67 exported_object_->ExportMethod( | 64 exported_object_->ExportMethod( |
| 68 dbus::kDBusPropertiesInterface, | 65 dbus::kDBusPropertiesInterface, dbus::kDBusPropertiesSet, |
| 69 dbus::kDBusPropertiesSet, | |
| 70 base::Bind(&BluetoothGattDescriptorServiceProviderImpl::Set, | 66 base::Bind(&BluetoothGattDescriptorServiceProviderImpl::Set, |
| 71 weak_ptr_factory_.GetWeakPtr()), | 67 weak_ptr_factory_.GetWeakPtr()), |
| 72 base::Bind(&BluetoothGattDescriptorServiceProviderImpl::OnExported, | 68 base::Bind(&BluetoothGattDescriptorServiceProviderImpl::OnExported, |
| 73 weak_ptr_factory_.GetWeakPtr())); | 69 weak_ptr_factory_.GetWeakPtr())); |
| 74 | 70 |
| 75 exported_object_->ExportMethod( | 71 exported_object_->ExportMethod( |
| 76 dbus::kDBusPropertiesInterface, | 72 dbus::kDBusPropertiesInterface, dbus::kDBusPropertiesGetAll, |
| 77 dbus::kDBusPropertiesGetAll, | |
| 78 base::Bind(&BluetoothGattDescriptorServiceProviderImpl::GetAll, | 73 base::Bind(&BluetoothGattDescriptorServiceProviderImpl::GetAll, |
| 79 weak_ptr_factory_.GetWeakPtr()), | 74 weak_ptr_factory_.GetWeakPtr()), |
| 80 base::Bind(&BluetoothGattDescriptorServiceProviderImpl::OnExported, | 75 base::Bind(&BluetoothGattDescriptorServiceProviderImpl::OnExported, |
| 81 weak_ptr_factory_.GetWeakPtr())); | 76 weak_ptr_factory_.GetWeakPtr())); |
| 82 } | 77 } |
| 83 | 78 |
| 84 ~BluetoothGattDescriptorServiceProviderImpl() override { | 79 ~BluetoothGattDescriptorServiceProviderImpl() override { |
| 85 VLOG(1) << "Cleaning up Bluetooth GATT characteristic descriptor: " | 80 VLOG(1) << "Cleaning up Bluetooth GATT characteristic descriptor: " |
| 86 << object_path_.value(); | 81 << object_path_.value(); |
| 87 bus_->UnregisterExportedObject(object_path_); | 82 bus_->UnregisterExportedObject(object_path_); |
| 88 } | 83 } |
| 89 | 84 |
| 90 // BluetoothGattDescriptorServiceProvider override. | 85 // BluetoothGattDescriptorServiceProvider override. |
| 91 void SendValueChanged(const std::vector<uint8>& value) override { | 86 void SendValueChanged(const std::vector<uint8>& value) override { |
| 92 VLOG(2) << "Emitting a PropertiesChanged signal for descriptor value."; | 87 VLOG(2) << "Emitting a PropertiesChanged signal for descriptor value."; |
| 93 dbus::Signal signal( | 88 dbus::Signal signal(dbus::kDBusPropertiesInterface, |
| 94 dbus::kDBusPropertiesInterface, | 89 dbus::kDBusPropertiesChangedSignal); |
| 95 dbus::kDBusPropertiesChangedSignal); | |
| 96 dbus::MessageWriter writer(&signal); | 90 dbus::MessageWriter writer(&signal); |
| 97 dbus::MessageWriter array_writer(NULL); | 91 dbus::MessageWriter array_writer(NULL); |
| 98 dbus::MessageWriter dict_entry_writer(NULL); | 92 dbus::MessageWriter dict_entry_writer(NULL); |
| 99 dbus::MessageWriter variant_writer(NULL); | 93 dbus::MessageWriter variant_writer(NULL); |
| 100 | 94 |
| 101 // interface_name | 95 // interface_name |
| 102 writer.AppendString( | 96 writer.AppendString( |
| 103 bluetooth_gatt_descriptor::kBluetoothGattDescriptorInterface); | 97 bluetooth_gatt_descriptor::kBluetoothGattDescriptorInterface); |
| 104 | 98 |
| 105 // changed_properties | 99 // changed_properties |
| (...skipping 25 matching lines...) Expand all Loading... |
| 131 dbus::ExportedObject::ResponseSender response_sender) { | 125 dbus::ExportedObject::ResponseSender response_sender) { |
| 132 VLOG(2) << "BluetoothGattDescriptorServiceProvider::Get: " | 126 VLOG(2) << "BluetoothGattDescriptorServiceProvider::Get: " |
| 133 << object_path_.value(); | 127 << object_path_.value(); |
| 134 DCHECK(OnOriginThread()); | 128 DCHECK(OnOriginThread()); |
| 135 | 129 |
| 136 dbus::MessageReader reader(method_call); | 130 dbus::MessageReader reader(method_call); |
| 137 | 131 |
| 138 std::string interface_name; | 132 std::string interface_name; |
| 139 std::string property_name; | 133 std::string property_name; |
| 140 if (!reader.PopString(&interface_name) || | 134 if (!reader.PopString(&interface_name) || |
| 141 !reader.PopString(&property_name) || | 135 !reader.PopString(&property_name) || reader.HasMoreData()) { |
| 142 reader.HasMoreData()) { | |
| 143 scoped_ptr<dbus::ErrorResponse> error_response = | 136 scoped_ptr<dbus::ErrorResponse> error_response = |
| 144 dbus::ErrorResponse::FromMethodCall( | 137 dbus::ErrorResponse::FromMethodCall(method_call, kErrorInvalidArgs, |
| 145 method_call, kErrorInvalidArgs, "Expected 'ss'."); | 138 "Expected 'ss'."); |
| 146 response_sender.Run(error_response.Pass()); | 139 response_sender.Run(error_response.Pass()); |
| 147 return; | 140 return; |
| 148 } | 141 } |
| 149 | 142 |
| 150 // Only the GATT descriptor interface is supported. | 143 // Only the GATT descriptor interface is supported. |
| 151 if (interface_name != | 144 if (interface_name != |
| 152 bluetooth_gatt_descriptor::kBluetoothGattDescriptorInterface) { | 145 bluetooth_gatt_descriptor::kBluetoothGattDescriptorInterface) { |
| 153 scoped_ptr<dbus::ErrorResponse> error_response = | 146 scoped_ptr<dbus::ErrorResponse> error_response = |
| 154 dbus::ErrorResponse::FromMethodCall( | 147 dbus::ErrorResponse::FromMethodCall( |
| 155 method_call, kErrorInvalidArgs, | 148 method_call, kErrorInvalidArgs, |
| 156 "No such interface: '" + interface_name + "'."); | 149 "No such interface: '" + interface_name + "'."); |
| 157 response_sender.Run(error_response.Pass()); | 150 response_sender.Run(error_response.Pass()); |
| 158 return; | 151 return; |
| 159 } | 152 } |
| 160 | 153 |
| 161 // If getting the "Value" property, obtain the value from the delegate. | 154 // If getting the "Value" property, obtain the value from the delegate. |
| 162 if (property_name == bluetooth_gatt_descriptor::kValueProperty) { | 155 if (property_name == bluetooth_gatt_descriptor::kValueProperty) { |
| 163 DCHECK(delegate_); | 156 DCHECK(delegate_); |
| 164 delegate_->GetDescriptorValue( | 157 delegate_->GetDescriptorValue( |
| 165 base::Bind(&BluetoothGattDescriptorServiceProviderImpl::OnGet, | 158 base::Bind(&BluetoothGattDescriptorServiceProviderImpl::OnGet, |
| 166 weak_ptr_factory_.GetWeakPtr(), | 159 weak_ptr_factory_.GetWeakPtr(), method_call, |
| 167 method_call, response_sender), | 160 response_sender), |
| 168 base::Bind(&BluetoothGattDescriptorServiceProviderImpl::OnFailure, | 161 base::Bind(&BluetoothGattDescriptorServiceProviderImpl::OnFailure, |
| 169 weak_ptr_factory_.GetWeakPtr(), | 162 weak_ptr_factory_.GetWeakPtr(), method_call, |
| 170 method_call, response_sender)); | 163 response_sender)); |
| 171 return; | 164 return; |
| 172 } | 165 } |
| 173 | 166 |
| 174 scoped_ptr<dbus::Response> response = | 167 scoped_ptr<dbus::Response> response = |
| 175 dbus::Response::FromMethodCall(method_call); | 168 dbus::Response::FromMethodCall(method_call); |
| 176 dbus::MessageWriter writer(response.get()); | 169 dbus::MessageWriter writer(response.get()); |
| 177 dbus::MessageWriter variant_writer(NULL); | 170 dbus::MessageWriter variant_writer(NULL); |
| 178 | 171 |
| 179 // TODO(armansito): Process the "Permissions" property below. | 172 // TODO(armansito): Process the "Permissions" property below. |
| 180 if (property_name == bluetooth_gatt_descriptor::kUUIDProperty) { | 173 if (property_name == bluetooth_gatt_descriptor::kUUIDProperty) { |
| 181 writer.OpenVariant("s", &variant_writer); | 174 writer.OpenVariant("s", &variant_writer); |
| 182 variant_writer.AppendString(uuid_); | 175 variant_writer.AppendString(uuid_); |
| 183 writer.CloseContainer(&variant_writer); | 176 writer.CloseContainer(&variant_writer); |
| 184 } else if (property_name == | 177 } else if (property_name == |
| 185 bluetooth_gatt_descriptor::kCharacteristicProperty) { | 178 bluetooth_gatt_descriptor::kCharacteristicProperty) { |
| 186 writer.OpenVariant("o", &variant_writer); | 179 writer.OpenVariant("o", &variant_writer); |
| 187 variant_writer.AppendObjectPath(characteristic_path_); | 180 variant_writer.AppendObjectPath(characteristic_path_); |
| 188 writer.CloseContainer(&variant_writer); | 181 writer.CloseContainer(&variant_writer); |
| 189 } else { | 182 } else { |
| 190 response = dbus::ErrorResponse::FromMethodCall( | 183 response = dbus::ErrorResponse::FromMethodCall( |
| 191 method_call, | 184 method_call, kErrorInvalidArgs, |
| 192 kErrorInvalidArgs, | |
| 193 "No such property: '" + property_name + "'."); | 185 "No such property: '" + property_name + "'."); |
| 194 } | 186 } |
| 195 | 187 |
| 196 response_sender.Run(response.Pass()); | 188 response_sender.Run(response.Pass()); |
| 197 } | 189 } |
| 198 | 190 |
| 199 // Called by dbus:: when the Bluetooth daemon sets a single property of the | 191 // Called by dbus:: when the Bluetooth daemon sets a single property of the |
| 200 // descriptor. | 192 // descriptor. |
| 201 void Set(dbus::MethodCall* method_call, | 193 void Set(dbus::MethodCall* method_call, |
| 202 dbus::ExportedObject::ResponseSender response_sender) { | 194 dbus::ExportedObject::ResponseSender response_sender) { |
| 203 VLOG(2) << "BluetoothGattDescriptorServiceProvider::Set: " | 195 VLOG(2) << "BluetoothGattDescriptorServiceProvider::Set: " |
| 204 << object_path_.value(); | 196 << object_path_.value(); |
| 205 DCHECK(OnOriginThread()); | 197 DCHECK(OnOriginThread()); |
| 206 | 198 |
| 207 dbus::MessageReader reader(method_call); | 199 dbus::MessageReader reader(method_call); |
| 208 | 200 |
| 209 std::string interface_name; | 201 std::string interface_name; |
| 210 std::string property_name; | 202 std::string property_name; |
| 211 dbus::MessageReader variant_reader(NULL); | 203 dbus::MessageReader variant_reader(NULL); |
| 212 if (!reader.PopString(&interface_name) || | 204 if (!reader.PopString(&interface_name) || |
| 213 !reader.PopString(&property_name) || | 205 !reader.PopString(&property_name) || |
| 214 !reader.PopVariant(&variant_reader) || | 206 !reader.PopVariant(&variant_reader) || reader.HasMoreData()) { |
| 215 reader.HasMoreData()) { | |
| 216 scoped_ptr<dbus::ErrorResponse> error_response = | 207 scoped_ptr<dbus::ErrorResponse> error_response = |
| 217 dbus::ErrorResponse::FromMethodCall( | 208 dbus::ErrorResponse::FromMethodCall(method_call, kErrorInvalidArgs, |
| 218 method_call, kErrorInvalidArgs, "Expected 'ssv'."); | 209 "Expected 'ssv'."); |
| 219 response_sender.Run(error_response.Pass()); | 210 response_sender.Run(error_response.Pass()); |
| 220 return; | 211 return; |
| 221 } | 212 } |
| 222 | 213 |
| 223 // Only the GATT descriptor interface is allowed. | 214 // Only the GATT descriptor interface is allowed. |
| 224 if (interface_name != | 215 if (interface_name != |
| 225 bluetooth_gatt_descriptor::kBluetoothGattDescriptorInterface) { | 216 bluetooth_gatt_descriptor::kBluetoothGattDescriptorInterface) { |
| 226 scoped_ptr<dbus::ErrorResponse> error_response = | 217 scoped_ptr<dbus::ErrorResponse> error_response = |
| 227 dbus::ErrorResponse::FromMethodCall( | 218 dbus::ErrorResponse::FromMethodCall( |
| 228 method_call, kErrorInvalidArgs, | 219 method_call, kErrorInvalidArgs, |
| 229 "No such interface: '" + interface_name + "'."); | 220 "No such interface: '" + interface_name + "'."); |
| 230 response_sender.Run(error_response.Pass()); | 221 response_sender.Run(error_response.Pass()); |
| 231 return; | 222 return; |
| 232 } | 223 } |
| 233 | 224 |
| 234 // Only the "Value" property is writeable. | 225 // Only the "Value" property is writeable. |
| 235 if (property_name != bluetooth_gatt_descriptor::kValueProperty) { | 226 if (property_name != bluetooth_gatt_descriptor::kValueProperty) { |
| 236 std::string error_name; | 227 std::string error_name; |
| 237 std::string error_message; | 228 std::string error_message; |
| 238 if (property_name == bluetooth_gatt_descriptor::kUUIDProperty || | 229 if (property_name == bluetooth_gatt_descriptor::kUUIDProperty || |
| 239 property_name == bluetooth_gatt_descriptor::kCharacteristicProperty) { | 230 property_name == bluetooth_gatt_descriptor::kCharacteristicProperty) { |
| 240 error_name = kErrorPropertyReadOnly; | 231 error_name = kErrorPropertyReadOnly; |
| 241 error_message = "Read-only property: '" + property_name + "'."; | 232 error_message = "Read-only property: '" + property_name + "'."; |
| 242 } else { | 233 } else { |
| 243 error_name = kErrorInvalidArgs; | 234 error_name = kErrorInvalidArgs; |
| 244 error_message = "No such property: '" + property_name + "'."; | 235 error_message = "No such property: '" + property_name + "'."; |
| 245 } | 236 } |
| 246 scoped_ptr<dbus::ErrorResponse> error_response = | 237 scoped_ptr<dbus::ErrorResponse> error_response = |
| 247 dbus::ErrorResponse::FromMethodCall( | 238 dbus::ErrorResponse::FromMethodCall(method_call, error_name, |
| 248 method_call, error_name, error_message); | 239 error_message); |
| 249 response_sender.Run(error_response.Pass()); | 240 response_sender.Run(error_response.Pass()); |
| 250 return; | 241 return; |
| 251 } | 242 } |
| 252 | 243 |
| 253 // Obtain the value. | 244 // Obtain the value. |
| 254 const uint8* bytes = NULL; | 245 const uint8* bytes = NULL; |
| 255 size_t length = 0; | 246 size_t length = 0; |
| 256 if (!variant_reader.PopArrayOfBytes(&bytes, &length)) { | 247 if (!variant_reader.PopArrayOfBytes(&bytes, &length)) { |
| 257 scoped_ptr<dbus::ErrorResponse> error_response = | 248 scoped_ptr<dbus::ErrorResponse> error_response = |
| 258 dbus::ErrorResponse::FromMethodCall( | 249 dbus::ErrorResponse::FromMethodCall( |
| 259 method_call, kErrorInvalidArgs, | 250 method_call, kErrorInvalidArgs, |
| 260 "Property '" + property_name + "' has type 'ay'."); | 251 "Property '" + property_name + "' has type 'ay'."); |
| 261 response_sender.Run(error_response.Pass()); | 252 response_sender.Run(error_response.Pass()); |
| 262 return; | 253 return; |
| 263 } | 254 } |
| 264 | 255 |
| 265 // Pass the set request onto the delegate. | 256 // Pass the set request onto the delegate. |
| 266 std::vector<uint8> value(bytes, bytes + length); | 257 std::vector<uint8> value(bytes, bytes + length); |
| 267 DCHECK(delegate_); | 258 DCHECK(delegate_); |
| 268 delegate_->SetDescriptorValue( | 259 delegate_->SetDescriptorValue( |
| 269 value, | 260 value, base::Bind(&BluetoothGattDescriptorServiceProviderImpl::OnSet, |
| 270 base::Bind(&BluetoothGattDescriptorServiceProviderImpl::OnSet, | 261 weak_ptr_factory_.GetWeakPtr(), method_call, |
| 271 weak_ptr_factory_.GetWeakPtr(), | 262 response_sender), |
| 272 method_call, response_sender), | |
| 273 base::Bind(&BluetoothGattDescriptorServiceProviderImpl::OnFailure, | 263 base::Bind(&BluetoothGattDescriptorServiceProviderImpl::OnFailure, |
| 274 weak_ptr_factory_.GetWeakPtr(), | 264 weak_ptr_factory_.GetWeakPtr(), method_call, |
| 275 method_call, response_sender)); | 265 response_sender)); |
| 276 } | 266 } |
| 277 | 267 |
| 278 // Called by dbus:: when the Bluetooth daemon fetches all properties of the | 268 // Called by dbus:: when the Bluetooth daemon fetches all properties of the |
| 279 // descriptor. | 269 // descriptor. |
| 280 void GetAll(dbus::MethodCall* method_call, | 270 void GetAll(dbus::MethodCall* method_call, |
| 281 dbus::ExportedObject::ResponseSender response_sender) { | 271 dbus::ExportedObject::ResponseSender response_sender) { |
| 282 VLOG(2) << "BluetoothGattDescriptorServiceProvider::GetAll: " | 272 VLOG(2) << "BluetoothGattDescriptorServiceProvider::GetAll: " |
| 283 << object_path_.value(); | 273 << object_path_.value(); |
| 284 DCHECK(OnOriginThread()); | 274 DCHECK(OnOriginThread()); |
| 285 | 275 |
| 286 dbus::MessageReader reader(method_call); | 276 dbus::MessageReader reader(method_call); |
| 287 | 277 |
| 288 std::string interface_name; | 278 std::string interface_name; |
| 289 if (!reader.PopString(&interface_name) || reader.HasMoreData()) { | 279 if (!reader.PopString(&interface_name) || reader.HasMoreData()) { |
| 290 scoped_ptr<dbus::ErrorResponse> error_response = | 280 scoped_ptr<dbus::ErrorResponse> error_response = |
| 291 dbus::ErrorResponse::FromMethodCall( | 281 dbus::ErrorResponse::FromMethodCall(method_call, kErrorInvalidArgs, |
| 292 method_call, kErrorInvalidArgs, "Expected 's'."); | 282 "Expected 's'."); |
| 293 response_sender.Run(error_response.Pass()); | 283 response_sender.Run(error_response.Pass()); |
| 294 return; | 284 return; |
| 295 } | 285 } |
| 296 | 286 |
| 297 // Only the GATT descriptor interface is supported. | 287 // Only the GATT descriptor interface is supported. |
| 298 if (interface_name != | 288 if (interface_name != |
| 299 bluetooth_gatt_descriptor::kBluetoothGattDescriptorInterface) { | 289 bluetooth_gatt_descriptor::kBluetoothGattDescriptorInterface) { |
| 300 scoped_ptr<dbus::ErrorResponse> error_response = | 290 scoped_ptr<dbus::ErrorResponse> error_response = |
| 301 dbus::ErrorResponse::FromMethodCall( | 291 dbus::ErrorResponse::FromMethodCall( |
| 302 method_call, kErrorInvalidArgs, | 292 method_call, kErrorInvalidArgs, |
| 303 "No such interface: '" + interface_name + "'."); | 293 "No such interface: '" + interface_name + "'."); |
| 304 response_sender.Run(error_response.Pass()); | 294 response_sender.Run(error_response.Pass()); |
| 305 return; | 295 return; |
| 306 } | 296 } |
| 307 | 297 |
| 308 // Try to obtain the value from the delegate. We will construct the | 298 // Try to obtain the value from the delegate. We will construct the |
| 309 // response in the success callback. | 299 // response in the success callback. |
| 310 DCHECK(delegate_); | 300 DCHECK(delegate_); |
| 311 delegate_->GetDescriptorValue( | 301 delegate_->GetDescriptorValue( |
| 312 base::Bind(&BluetoothGattDescriptorServiceProviderImpl::OnGetAll, | 302 base::Bind(&BluetoothGattDescriptorServiceProviderImpl::OnGetAll, |
| 313 weak_ptr_factory_.GetWeakPtr(), | 303 weak_ptr_factory_.GetWeakPtr(), method_call, |
| 314 method_call, response_sender), | 304 response_sender), |
| 315 base::Bind(&BluetoothGattDescriptorServiceProviderImpl::OnFailure, | 305 base::Bind(&BluetoothGattDescriptorServiceProviderImpl::OnFailure, |
| 316 weak_ptr_factory_.GetWeakPtr(), | 306 weak_ptr_factory_.GetWeakPtr(), method_call, |
| 317 method_call, response_sender)); | 307 response_sender)); |
| 318 } | 308 } |
| 319 | 309 |
| 320 // Called by dbus:: when a method is exported. | 310 // Called by dbus:: when a method is exported. |
| 321 void OnExported(const std::string& interface_name, | 311 void OnExported(const std::string& interface_name, |
| 322 const std::string& method_name, | 312 const std::string& method_name, |
| 323 bool success) { | 313 bool success) { |
| 324 LOG_IF(WARNING, !success) << "Failed to export " | 314 LOG_IF(WARNING, !success) << "Failed to export " << interface_name << "." |
| 325 << interface_name << "." << method_name; | 315 << method_name; |
| 326 } | 316 } |
| 327 | 317 |
| 328 // Called by the Delegate in response to a method to call to get all | 318 // Called by the Delegate in response to a method to call to get all |
| 329 // properties, in which the delegate has successfully returned the | 319 // properties, in which the delegate has successfully returned the |
| 330 // descriptor value. | 320 // descriptor value. |
| 331 void OnGetAll(dbus::MethodCall* method_call, | 321 void OnGetAll(dbus::MethodCall* method_call, |
| 332 dbus::ExportedObject::ResponseSender response_sender, | 322 dbus::ExportedObject::ResponseSender response_sender, |
| 333 const std::vector<uint8>& value) { | 323 const std::vector<uint8>& value) { |
| 334 VLOG(2) << "Descriptor value obtained from delegate. Responding to " | 324 VLOG(2) << "Descriptor value obtained from delegate. Responding to " |
| 335 << "GetAll."; | 325 << "GetAll."; |
| 336 | 326 |
| 337 scoped_ptr<dbus::Response> response = | 327 scoped_ptr<dbus::Response> response = |
| 338 dbus::Response::FromMethodCall(method_call); | 328 dbus::Response::FromMethodCall(method_call); |
| 339 dbus::MessageWriter writer(response.get()); | 329 dbus::MessageWriter writer(response.get()); |
| 340 dbus::MessageWriter array_writer(NULL); | 330 dbus::MessageWriter array_writer(NULL); |
| 341 dbus::MessageWriter dict_entry_writer(NULL); | 331 dbus::MessageWriter dict_entry_writer(NULL); |
| 342 dbus::MessageWriter variant_writer(NULL); | 332 dbus::MessageWriter variant_writer(NULL); |
| 343 | 333 |
| 344 writer.OpenArray("{sv}", &array_writer); | 334 writer.OpenArray("{sv}", &array_writer); |
| 345 | 335 |
| 346 array_writer.OpenDictEntry(&dict_entry_writer); | 336 array_writer.OpenDictEntry(&dict_entry_writer); |
| 347 dict_entry_writer.AppendString( | 337 dict_entry_writer.AppendString(bluetooth_gatt_descriptor::kUUIDProperty); |
| 348 bluetooth_gatt_descriptor::kUUIDProperty); | |
| 349 dict_entry_writer.AppendVariantOfString(uuid_); | 338 dict_entry_writer.AppendVariantOfString(uuid_); |
| 350 array_writer.CloseContainer(&dict_entry_writer); | 339 array_writer.CloseContainer(&dict_entry_writer); |
| 351 | 340 |
| 352 array_writer.OpenDictEntry(&dict_entry_writer); | 341 array_writer.OpenDictEntry(&dict_entry_writer); |
| 353 dict_entry_writer.AppendString( | 342 dict_entry_writer.AppendString( |
| 354 bluetooth_gatt_descriptor::kCharacteristicProperty); | 343 bluetooth_gatt_descriptor::kCharacteristicProperty); |
| 355 dict_entry_writer.AppendVariantOfObjectPath(characteristic_path_); | 344 dict_entry_writer.AppendVariantOfObjectPath(characteristic_path_); |
| 356 array_writer.CloseContainer(&dict_entry_writer); | 345 array_writer.CloseContainer(&dict_entry_writer); |
| 357 | 346 |
| 358 array_writer.OpenDictEntry(&dict_entry_writer); | 347 array_writer.OpenDictEntry(&dict_entry_writer); |
| 359 dict_entry_writer.AppendString( | 348 dict_entry_writer.AppendString(bluetooth_gatt_descriptor::kValueProperty); |
| 360 bluetooth_gatt_descriptor::kValueProperty); | |
| 361 dict_entry_writer.OpenVariant("ay", &variant_writer); | 349 dict_entry_writer.OpenVariant("ay", &variant_writer); |
| 362 variant_writer.AppendArrayOfBytes(value.data(), value.size()); | 350 variant_writer.AppendArrayOfBytes(value.data(), value.size()); |
| 363 dict_entry_writer.CloseContainer(&variant_writer); | 351 dict_entry_writer.CloseContainer(&variant_writer); |
| 364 array_writer.CloseContainer(&dict_entry_writer); | 352 array_writer.CloseContainer(&dict_entry_writer); |
| 365 | 353 |
| 366 // TODO(armansito): Process "Permissions" property. | 354 // TODO(armansito): Process "Permissions" property. |
| 367 | 355 |
| 368 writer.CloseContainer(&array_writer); | 356 writer.CloseContainer(&array_writer); |
| 369 | 357 |
| 370 response_sender.Run(response.Pass()); | 358 response_sender.Run(response.Pass()); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 396 response_sender.Run(dbus::Response::FromMethodCall(method_call)); | 384 response_sender.Run(dbus::Response::FromMethodCall(method_call)); |
| 397 } | 385 } |
| 398 | 386 |
| 399 // Called by the Delegate in response to a failed method call to get or set | 387 // Called by the Delegate in response to a failed method call to get or set |
| 400 // the descriptor value. | 388 // the descriptor value. |
| 401 void OnFailure(dbus::MethodCall* method_call, | 389 void OnFailure(dbus::MethodCall* method_call, |
| 402 dbus::ExportedObject::ResponseSender response_sender) { | 390 dbus::ExportedObject::ResponseSender response_sender) { |
| 403 VLOG(2) << "Failed to get/set descriptor value. Report error."; | 391 VLOG(2) << "Failed to get/set descriptor value. Report error."; |
| 404 scoped_ptr<dbus::ErrorResponse> error_response = | 392 scoped_ptr<dbus::ErrorResponse> error_response = |
| 405 dbus::ErrorResponse::FromMethodCall( | 393 dbus::ErrorResponse::FromMethodCall( |
| 406 method_call, kErrorFailed, | 394 method_call, kErrorFailed, "Failed to get/set descriptor value."); |
| 407 "Failed to get/set descriptor value."); | |
| 408 response_sender.Run(error_response.Pass()); | 395 response_sender.Run(error_response.Pass()); |
| 409 } | 396 } |
| 410 | 397 |
| 411 // Origin thread (i.e. the UI thread in production). | 398 // Origin thread (i.e. the UI thread in production). |
| 412 base::PlatformThreadId origin_thread_id_; | 399 base::PlatformThreadId origin_thread_id_; |
| 413 | 400 |
| 414 // 128-bit descriptor UUID of this object. | 401 // 128-bit descriptor UUID of this object. |
| 415 std::string uuid_; | 402 std::string uuid_; |
| 416 | 403 |
| 417 // D-Bus bus object is exported on, not owned by this object and must | 404 // D-Bus bus object is exported on, not owned by this object and must |
| (...skipping 20 matching lines...) Expand all Loading... |
| 438 // than we do. | 425 // than we do. |
| 439 // Note: This should remain the last member so it'll be destroyed and | 426 // Note: This should remain the last member so it'll be destroyed and |
| 440 // invalidate its weak pointers before any other members are destroyed. | 427 // invalidate its weak pointers before any other members are destroyed. |
| 441 base::WeakPtrFactory<BluetoothGattDescriptorServiceProviderImpl> | 428 base::WeakPtrFactory<BluetoothGattDescriptorServiceProviderImpl> |
| 442 weak_ptr_factory_; | 429 weak_ptr_factory_; |
| 443 | 430 |
| 444 DISALLOW_COPY_AND_ASSIGN(BluetoothGattDescriptorServiceProviderImpl); | 431 DISALLOW_COPY_AND_ASSIGN(BluetoothGattDescriptorServiceProviderImpl); |
| 445 }; | 432 }; |
| 446 | 433 |
| 447 BluetoothGattDescriptorServiceProvider:: | 434 BluetoothGattDescriptorServiceProvider:: |
| 448 BluetoothGattDescriptorServiceProvider() { | 435 BluetoothGattDescriptorServiceProvider() {} |
| 449 } | |
| 450 | 436 |
| 451 BluetoothGattDescriptorServiceProvider:: | 437 BluetoothGattDescriptorServiceProvider:: |
| 452 ~BluetoothGattDescriptorServiceProvider() { | 438 ~BluetoothGattDescriptorServiceProvider() {} |
| 453 } | |
| 454 | 439 |
| 455 // static | 440 // static |
| 456 BluetoothGattDescriptorServiceProvider* | 441 BluetoothGattDescriptorServiceProvider* |
| 457 BluetoothGattDescriptorServiceProvider::Create( | 442 BluetoothGattDescriptorServiceProvider::Create( |
| 458 dbus::Bus* bus, | 443 dbus::Bus* bus, |
| 459 const dbus::ObjectPath& object_path, | 444 const dbus::ObjectPath& object_path, |
| 460 Delegate* delegate, | 445 Delegate* delegate, |
| 461 const std::string& uuid, | 446 const std::string& uuid, |
| 462 const std::vector<std::string>& permissions, | 447 const std::vector<std::string>& permissions, |
| 463 const dbus::ObjectPath& characteristic_path) { | 448 const dbus::ObjectPath& characteristic_path) { |
| 464 if (!DBusThreadManager::Get()->IsUsingStub(DBusClientBundle::BLUETOOTH)) { | 449 if (!bluez::BluezDBusManager::Get()->IsUsingStub()) { |
| 465 return new BluetoothGattDescriptorServiceProviderImpl( | 450 return new BluetoothGattDescriptorServiceProviderImpl( |
| 466 bus, object_path, delegate, uuid, permissions, characteristic_path); | 451 bus, object_path, delegate, uuid, permissions, characteristic_path); |
| 467 } | 452 } |
| 468 return new FakeBluetoothGattDescriptorServiceProvider( | 453 return new FakeBluetoothGattDescriptorServiceProvider( |
| 469 object_path, delegate, uuid, permissions, characteristic_path); | 454 object_path, delegate, uuid, permissions, characteristic_path); |
| 470 } | 455 } |
| 471 | 456 |
| 472 } // namespace chromeos | 457 } // namespace bluez |
| OLD | NEW |