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

Side by Side Diff: device/bluetooth/dbus/bluetooth_gatt_application_service_provider_impl.cc

Issue 1914893002: DBus changes for implementing local GATT attributes. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@bluetooth_classes
Patch Set: test leak fix Created 4 years, 7 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
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "device/bluetooth/dbus/bluetooth_gatt_application_service_provider_impl .h"
6
7 #include "base/bind.h"
8 #include "base/logging.h"
9 #include "third_party/cros_system_api/dbus/service_constants.h"
10
11 namespace bluez {
12
13 BluetoothGattApplicationServiceProviderImpl::
14 BluetoothGattApplicationServiceProviderImpl(
15 dbus::Bus* bus,
16 const dbus::ObjectPath& object_path,
17 const std::map<dbus::ObjectPath, BluetoothLocalGattServiceBlueZ*>&
18 services)
19 : origin_thread_id_(base::PlatformThread::CurrentId()),
20 bus_(bus),
21 object_path_(object_path),
22 weak_ptr_factory_(this) {
23 VLOG(1) << "Creating Bluetooth GATT application: " << object_path_.value();
24 DCHECK(object_path_.IsValid());
25 DCHECK(bus_);
26
27 exported_object_ = bus_->GetExportedObject(object_path_);
28
29 exported_object_->ExportMethod(
30 dbus::kDBusObjectManagerInterface,
31 dbus::kDBusObjectManagerGetManagedObjects,
32 base::Bind(
33 &BluetoothGattApplicationServiceProviderImpl::GetManagedObjects,
34 weak_ptr_factory_.GetWeakPtr()),
35 base::Bind(&BluetoothGattApplicationServiceProviderImpl::OnExported,
36 weak_ptr_factory_.GetWeakPtr()));
37
38 BluetoothGattApplicationServiceProvider::CreateAttributeServiceProviders(
39 bus, services, &service_providers_, &characteristic_providers_,
40 &descriptor_providers_);
41 }
42
43 BluetoothGattApplicationServiceProviderImpl::
44 ~BluetoothGattApplicationServiceProviderImpl() {
45 VLOG(1) << "Cleaning up Bluetooth GATT service: " << object_path_.value();
46 if (bus_)
47 bus_->UnregisterExportedObject(object_path_);
48 }
49
50 BluetoothGattApplicationServiceProviderImpl::
51 BluetoothGattApplicationServiceProviderImpl(
52 const dbus::ObjectPath& object_path)
53 : origin_thread_id_(base::PlatformThread::CurrentId()),
54 bus_(nullptr),
55 object_path_(object_path),
56 weak_ptr_factory_(this) {
57 VLOG(1) << "Creating Fake Bluetooth GATT application service provider.";
58 }
59
60 bool BluetoothGattApplicationServiceProviderImpl::OnOriginThread() {
61 return base::PlatformThread::CurrentId() == origin_thread_id_;
62 }
63
64 template <typename AttributeProvider>
65 void BluetoothGattApplicationServiceProviderImpl::WriteObjectStruct(
66 dbus::MessageWriter* writer,
67 const std::string& attribute_interface,
68 AttributeProvider* attribute_provider) {
69 // Open a struct entry for { object_path : interface_list }.
70 dbus::MessageWriter object_struct_writer(NULL);
71 // [ (oa(sa{sv}) ]
72 writer->OpenStruct(&object_struct_writer);
73
74 // Key: Object path. [ (o ]
75 object_struct_writer.AppendObjectPath(attribute_provider->object_path());
76
77 // Value: Open array for single entry interface_list. [ a(sa{sv}) ]
78 dbus::MessageWriter interface_array_writer(NULL);
79 object_struct_writer.OpenArray("(sa{sv})", &interface_array_writer);
80 WriteInterfaceStruct(&interface_array_writer, attribute_interface,
81 attribute_provider);
82 object_struct_writer.CloseContainer(&interface_array_writer);
83
84 writer->CloseContainer(&object_struct_writer);
85 }
86
87 template <typename AttributeProvider>
88 void BluetoothGattApplicationServiceProviderImpl::WriteInterfaceStruct(
89 dbus::MessageWriter* writer,
90 const std::string& attribute_interface,
91 AttributeProvider* attribute_provider) {
92 // Open a struct entry for { interface_name : properties_list }.
93 dbus::MessageWriter interface_struct_writer(NULL);
94 // [ (sa{sv}) ]
95 writer->OpenStruct(&interface_struct_writer);
96
97 // Key: Interface name. [ (s ]
98 interface_struct_writer.AppendString(attribute_interface);
99 // Value: Open a array for properties_list. [ a{sv}) ]
100 WriteAttributeProperties(&interface_struct_writer, attribute_provider);
101 writer->CloseContainer(&interface_struct_writer);
102 }
103
104 void BluetoothGattApplicationServiceProviderImpl::WriteAttributeProperties(
105 dbus::MessageWriter* writer,
106 BluetoothGattServiceServiceProvider* service_provider) {
107 service_provider->WriteProperties(writer);
108 }
109
110 void BluetoothGattApplicationServiceProviderImpl::WriteAttributeProperties(
111 dbus::MessageWriter* writer,
112 BluetoothGattCharacteristicServiceProvider* characteristic_provider) {
113 characteristic_provider->WriteProperties(writer, nullptr);
114 }
115
116 void BluetoothGattApplicationServiceProviderImpl::WriteAttributeProperties(
117 dbus::MessageWriter* writer,
118 BluetoothGattDescriptorServiceProvider* descriptor_provider) {
119 descriptor_provider->WriteProperties(writer, nullptr);
120 }
121
122 void BluetoothGattApplicationServiceProviderImpl::GetManagedObjects(
123 dbus::MethodCall* method_call,
124 dbus::ExportedObject::ResponseSender response_sender) {
125 VLOG(2) << "BluetoothGattApplicationServiceProvider::GetManagedObjects: "
126 << object_path_.value();
127 DCHECK(OnOriginThread());
128
129 dbus::MessageReader reader(method_call);
130
131 std::unique_ptr<dbus::Response> response =
132 dbus::Response::FromMethodCall(method_call);
133
134 // The expected format by GetAll is [ a(oa(sa{sv})) ]
135 dbus::MessageWriter writer(response.get());
136 dbus::MessageWriter array_writer(nullptr);
137
138 writer.OpenArray("(oa(sa{sv}))", &array_writer);
139
140 for (const auto& service_provider : service_providers_) {
141 WriteObjectStruct(&array_writer,
142 bluetooth_gatt_service::kBluetoothGattServiceInterface,
143 service_provider.get());
144 }
145 for (const auto& characteristic_provider : characteristic_providers_) {
146 WriteObjectStruct(
147 &array_writer,
148 bluetooth_gatt_characteristic::kBluetoothGattCharacteristicInterface,
149 characteristic_provider.get());
150 }
151 for (const auto& descriptor_provider : descriptor_providers_) {
152 WriteObjectStruct(
153 &array_writer,
154 bluetooth_gatt_descriptor::kBluetoothGattDescriptorInterface,
155 descriptor_provider.get());
156 }
157
158 writer.CloseContainer(&array_writer);
159
160 response_sender.Run(std::move(response));
161 }
162
163 // Called by dbus:: when a method is exported.
164 void BluetoothGattApplicationServiceProviderImpl::OnExported(
165 const std::string& interface_name,
166 const std::string& method_name,
167 bool success) {
168 LOG_IF(WARNING, !success) << "Failed to export " << interface_name << "."
169 << method_name;
170 }
171
172 } // namespace bluez
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698