| 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_service_service_provider.h" | 5 #include "device/bluetooth/dbus/bluetooth_gatt_service_service_provider.h" |
| 6 | 6 |
| 7 #include <memory> | |
| 8 #include <utility> | |
| 9 | |
| 10 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/callback.h" |
| 11 #include "base/logging.h" | 9 #include "base/logging.h" |
| 12 #include "base/macros.h" | |
| 13 #include "base/memory/ref_counted.h" | 10 #include "base/memory/ref_counted.h" |
| 14 #include "base/memory/weak_ptr.h" | 11 #include "base/memory/weak_ptr.h" |
| 15 #include "base/threading/platform_thread.h" | 12 #include "base/threading/platform_thread.h" |
| 16 #include "dbus/exported_object.h" | 13 #include "dbus/exported_object.h" |
| 17 #include "dbus/message.h" | |
| 18 #include "device/bluetooth/dbus/bluez_dbus_manager.h" | 14 #include "device/bluetooth/dbus/bluez_dbus_manager.h" |
| 19 #include "device/bluetooth/dbus/fake_bluetooth_gatt_service_service_provider.h" | 15 #include "device/bluetooth/dbus/fake_bluetooth_gatt_service_service_provider.h" |
| 20 #include "third_party/cros_system_api/dbus/service_constants.h" | 16 #include "third_party/cros_system_api/dbus/service_constants.h" |
| 21 | 17 |
| 22 namespace bluez { | 18 namespace bluez { |
| 23 namespace { | 19 namespace { |
| 24 const char kErrorInvalidArgs[] = "org.freedesktop.DBus.Error.InvalidArgs"; | 20 const char kErrorInvalidArgs[] = "org.freedesktop.DBus.Error.InvalidArgs"; |
| 25 const char kErrorPropertyReadOnly[] = | 21 const char kErrorPropertyReadOnly[] = |
| 26 "org.freedesktop.DBus.Error.PropertyReadOnly"; | 22 "org.freedesktop.DBus.Error.PropertyReadOnly"; |
| 27 } // namespace | 23 } // namespace |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 185 dbus::ErrorResponse::FromMethodCall( | 181 dbus::ErrorResponse::FromMethodCall( |
| 186 method_call, kErrorInvalidArgs, | 182 method_call, kErrorInvalidArgs, |
| 187 "No such interface: '" + interface_name + "'."); | 183 "No such interface: '" + interface_name + "'."); |
| 188 response_sender.Run(std::move(error_response)); | 184 response_sender.Run(std::move(error_response)); |
| 189 return; | 185 return; |
| 190 } | 186 } |
| 191 | 187 |
| 192 std::unique_ptr<dbus::Response> response = | 188 std::unique_ptr<dbus::Response> response = |
| 193 dbus::Response::FromMethodCall(method_call); | 189 dbus::Response::FromMethodCall(method_call); |
| 194 dbus::MessageWriter writer(response.get()); | 190 dbus::MessageWriter writer(response.get()); |
| 191 WriteProperties(&writer); |
| 192 response_sender.Run(std::move(response)); |
| 193 } |
| 194 |
| 195 void WriteProperties(dbus::MessageWriter* writer) override { |
| 195 dbus::MessageWriter array_writer(NULL); | 196 dbus::MessageWriter array_writer(NULL); |
| 196 dbus::MessageWriter dict_entry_writer(NULL); | 197 dbus::MessageWriter dict_entry_writer(NULL); |
| 197 dbus::MessageWriter variant_writer(NULL); | 198 dbus::MessageWriter variant_writer(NULL); |
| 198 | 199 |
| 199 writer.OpenArray("{sv}", &array_writer); | 200 writer->OpenArray("{sv}", &array_writer); |
| 200 | 201 |
| 201 array_writer.OpenDictEntry(&dict_entry_writer); | 202 array_writer.OpenDictEntry(&dict_entry_writer); |
| 202 dict_entry_writer.AppendString(bluetooth_gatt_service::kUUIDProperty); | 203 dict_entry_writer.AppendString(bluetooth_gatt_service::kUUIDProperty); |
| 203 dict_entry_writer.AppendVariantOfString(uuid_); | 204 dict_entry_writer.AppendVariantOfString(uuid_); |
| 204 array_writer.CloseContainer(&dict_entry_writer); | 205 array_writer.CloseContainer(&dict_entry_writer); |
| 205 | 206 |
| 206 array_writer.OpenDictEntry(&dict_entry_writer); | 207 array_writer.OpenDictEntry(&dict_entry_writer); |
| 207 dict_entry_writer.AppendString(bluetooth_gatt_service::kIncludesProperty); | 208 dict_entry_writer.AppendString(bluetooth_gatt_service::kIncludesProperty); |
| 208 dict_entry_writer.OpenVariant("ao", &variant_writer); | 209 dict_entry_writer.OpenVariant("ao", &variant_writer); |
| 209 variant_writer.AppendArrayOfObjectPaths(includes_); | 210 variant_writer.AppendArrayOfObjectPaths(includes_); |
| 210 dict_entry_writer.CloseContainer(&variant_writer); | 211 dict_entry_writer.CloseContainer(&variant_writer); |
| 211 array_writer.CloseContainer(&dict_entry_writer); | 212 array_writer.CloseContainer(&dict_entry_writer); |
| 212 | 213 |
| 213 writer.CloseContainer(&array_writer); | 214 writer->CloseContainer(&array_writer); |
| 214 | |
| 215 response_sender.Run(std::move(response)); | |
| 216 } | 215 } |
| 217 | 216 |
| 218 // Called by dbus:: when a method is exported. | 217 // Called by dbus:: when a method is exported. |
| 219 void OnExported(const std::string& interface_name, | 218 void OnExported(const std::string& interface_name, |
| 220 const std::string& method_name, | 219 const std::string& method_name, |
| 221 bool success) { | 220 bool success) { |
| 222 LOG_IF(WARNING, !success) << "Failed to export " << interface_name << "." | 221 LOG_IF(WARNING, !success) << "Failed to export " << interface_name << "." |
| 223 << method_name; | 222 << method_name; |
| 224 } | 223 } |
| 225 | 224 |
| 225 const dbus::ObjectPath& object_path() const override { return object_path_; } |
| 226 |
| 226 // Origin thread (i.e. the UI thread in production). | 227 // Origin thread (i.e. the UI thread in production). |
| 227 base::PlatformThreadId origin_thread_id_; | 228 base::PlatformThreadId origin_thread_id_; |
| 228 | 229 |
| 229 // 128-bit service UUID of this object. | 230 // 128-bit service UUID of this object. |
| 230 std::string uuid_; | 231 std::string uuid_; |
| 231 | 232 |
| 232 // List of object paths that represent other exported GATT services that are | 233 // List of object paths that represent other exported GATT services that are |
| 233 // included from this service. | 234 // included from this service. |
| 234 std::vector<dbus::ObjectPath> includes_; | 235 std::vector<dbus::ObjectPath> includes_; |
| 235 | 236 |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 267 const std::vector<dbus::ObjectPath>& includes) { | 268 const std::vector<dbus::ObjectPath>& includes) { |
| 268 if (!bluez::BluezDBusManager::Get()->IsUsingFakes()) { | 269 if (!bluez::BluezDBusManager::Get()->IsUsingFakes()) { |
| 269 return new BluetoothGattServiceServiceProviderImpl(bus, object_path, uuid, | 270 return new BluetoothGattServiceServiceProviderImpl(bus, object_path, uuid, |
| 270 includes); | 271 includes); |
| 271 } | 272 } |
| 272 return new FakeBluetoothGattServiceServiceProvider(object_path, uuid, | 273 return new FakeBluetoothGattServiceServiceProvider(object_path, uuid, |
| 273 includes); | 274 includes); |
| 274 } | 275 } |
| 275 | 276 |
| 276 } // namespace bluez | 277 } // namespace bluez |
| OLD | NEW |