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

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

Issue 1347193004: Refactor DBusThreadManager to split away BT clients. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 2 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
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_service_service_provider.h" 5 #include "device/bluetooth/dbus/bluetooth_gatt_service_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/ref_counted.h" 9 #include "base/memory/ref_counted.h"
10 #include "base/memory/weak_ptr.h" 10 #include "base/memory/weak_ptr.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_service_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_service_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 } // namespace 23 } // namespace
25 24
26 // The BluetoothGattServiceServiceProvider implementation used in production. 25 // The BluetoothGattServiceServiceProvider implementation used in production.
27 class BluetoothGattServiceServiceProviderImpl 26 class BluetoothGattServiceServiceProviderImpl
28 : public BluetoothGattServiceServiceProvider { 27 : public BluetoothGattServiceServiceProvider {
29 public: 28 public:
30 BluetoothGattServiceServiceProviderImpl( 29 BluetoothGattServiceServiceProviderImpl(
31 dbus::Bus* bus, 30 dbus::Bus* bus,
32 const dbus::ObjectPath& object_path, 31 const dbus::ObjectPath& object_path,
33 const std::string& uuid, 32 const std::string& uuid,
34 const std::vector<dbus::ObjectPath>& includes) 33 const std::vector<dbus::ObjectPath>& includes)
35 : origin_thread_id_(base::PlatformThread::CurrentId()), 34 : origin_thread_id_(base::PlatformThread::CurrentId()),
36 uuid_(uuid), 35 uuid_(uuid),
37 includes_(includes), 36 includes_(includes),
38 bus_(bus), 37 bus_(bus),
39 object_path_(object_path), 38 object_path_(object_path),
40 weak_ptr_factory_(this) { 39 weak_ptr_factory_(this) {
41 VLOG(1) << "Creating Bluetooth GATT service: " << object_path_.value() 40 VLOG(1) << "Creating Bluetooth GATT service: " << object_path_.value()
42 << " UUID: " << uuid; 41 << " UUID: " << uuid;
43 DCHECK(!uuid_.empty()); 42 DCHECK(!uuid_.empty());
44 DCHECK(object_path_.IsValid()); 43 DCHECK(object_path_.IsValid());
45 DCHECK(bus_); 44 DCHECK(bus_);
46 45
47 exported_object_ = bus_->GetExportedObject(object_path_); 46 exported_object_ = bus_->GetExportedObject(object_path_);
48 47
49 exported_object_->ExportMethod( 48 exported_object_->ExportMethod(
50 dbus::kDBusPropertiesInterface, 49 dbus::kDBusPropertiesInterface, dbus::kDBusPropertiesGet,
51 dbus::kDBusPropertiesGet,
52 base::Bind(&BluetoothGattServiceServiceProviderImpl::Get, 50 base::Bind(&BluetoothGattServiceServiceProviderImpl::Get,
53 weak_ptr_factory_.GetWeakPtr()), 51 weak_ptr_factory_.GetWeakPtr()),
54 base::Bind(&BluetoothGattServiceServiceProviderImpl::OnExported, 52 base::Bind(&BluetoothGattServiceServiceProviderImpl::OnExported,
55 weak_ptr_factory_.GetWeakPtr())); 53 weak_ptr_factory_.GetWeakPtr()));
56 54
57 exported_object_->ExportMethod( 55 exported_object_->ExportMethod(
58 dbus::kDBusPropertiesInterface, 56 dbus::kDBusPropertiesInterface, dbus::kDBusPropertiesSet,
59 dbus::kDBusPropertiesSet,
60 base::Bind(&BluetoothGattServiceServiceProviderImpl::Set, 57 base::Bind(&BluetoothGattServiceServiceProviderImpl::Set,
61 weak_ptr_factory_.GetWeakPtr()), 58 weak_ptr_factory_.GetWeakPtr()),
62 base::Bind(&BluetoothGattServiceServiceProviderImpl::OnExported, 59 base::Bind(&BluetoothGattServiceServiceProviderImpl::OnExported,
63 weak_ptr_factory_.GetWeakPtr())); 60 weak_ptr_factory_.GetWeakPtr()));
64 61
65 exported_object_->ExportMethod( 62 exported_object_->ExportMethod(
66 dbus::kDBusPropertiesInterface, 63 dbus::kDBusPropertiesInterface, dbus::kDBusPropertiesGetAll,
67 dbus::kDBusPropertiesGetAll,
68 base::Bind(&BluetoothGattServiceServiceProviderImpl::GetAll, 64 base::Bind(&BluetoothGattServiceServiceProviderImpl::GetAll,
69 weak_ptr_factory_.GetWeakPtr()), 65 weak_ptr_factory_.GetWeakPtr()),
70 base::Bind(&BluetoothGattServiceServiceProviderImpl::OnExported, 66 base::Bind(&BluetoothGattServiceServiceProviderImpl::OnExported,
71 weak_ptr_factory_.GetWeakPtr())); 67 weak_ptr_factory_.GetWeakPtr()));
72 } 68 }
73 69
74 ~BluetoothGattServiceServiceProviderImpl() override { 70 ~BluetoothGattServiceServiceProviderImpl() override {
75 VLOG(1) << "Cleaning up Bluetooth GATT service: " << object_path_.value(); 71 VLOG(1) << "Cleaning up Bluetooth GATT service: " << object_path_.value();
76 bus_->UnregisterExportedObject(object_path_); 72 bus_->UnregisterExportedObject(object_path_);
77 } 73 }
(...skipping 10 matching lines...) Expand all
88 dbus::ExportedObject::ResponseSender response_sender) { 84 dbus::ExportedObject::ResponseSender response_sender) {
89 VLOG(2) << "BluetoothGattServiceServiceProvider::Get: " 85 VLOG(2) << "BluetoothGattServiceServiceProvider::Get: "
90 << object_path_.value(); 86 << object_path_.value();
91 DCHECK(OnOriginThread()); 87 DCHECK(OnOriginThread());
92 88
93 dbus::MessageReader reader(method_call); 89 dbus::MessageReader reader(method_call);
94 90
95 std::string interface_name; 91 std::string interface_name;
96 std::string property_name; 92 std::string property_name;
97 if (!reader.PopString(&interface_name) || 93 if (!reader.PopString(&interface_name) ||
98 !reader.PopString(&property_name) || 94 !reader.PopString(&property_name) || reader.HasMoreData()) {
99 reader.HasMoreData()) {
100 scoped_ptr<dbus::ErrorResponse> error_response = 95 scoped_ptr<dbus::ErrorResponse> error_response =
101 dbus::ErrorResponse::FromMethodCall( 96 dbus::ErrorResponse::FromMethodCall(method_call, kErrorInvalidArgs,
102 method_call, kErrorInvalidArgs, "Expected 'ss'."); 97 "Expected 'ss'.");
103 response_sender.Run(error_response.Pass()); 98 response_sender.Run(error_response.Pass());
104 return; 99 return;
105 } 100 }
106 101
107 // Only the GATT service interface is allowed. 102 // Only the GATT service interface is allowed.
108 if (interface_name != 103 if (interface_name !=
109 bluetooth_gatt_service::kBluetoothGattServiceInterface) { 104 bluetooth_gatt_service::kBluetoothGattServiceInterface) {
110 scoped_ptr<dbus::ErrorResponse> error_response = 105 scoped_ptr<dbus::ErrorResponse> error_response =
111 dbus::ErrorResponse::FromMethodCall( 106 dbus::ErrorResponse::FromMethodCall(
112 method_call, kErrorInvalidArgs, 107 method_call, kErrorInvalidArgs,
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
148 // service. 143 // service.
149 void Set(dbus::MethodCall* method_call, 144 void Set(dbus::MethodCall* method_call,
150 dbus::ExportedObject::ResponseSender response_sender) { 145 dbus::ExportedObject::ResponseSender response_sender) {
151 VLOG(2) << "BluetoothGattServiceServiceProvider::Set: " 146 VLOG(2) << "BluetoothGattServiceServiceProvider::Set: "
152 << object_path_.value(); 147 << object_path_.value();
153 DCHECK(OnOriginThread()); 148 DCHECK(OnOriginThread());
154 149
155 // All of the properties on this interface are read-only, so just return 150 // All of the properties on this interface are read-only, so just return
156 // error. 151 // error.
157 scoped_ptr<dbus::ErrorResponse> error_response = 152 scoped_ptr<dbus::ErrorResponse> error_response =
158 dbus::ErrorResponse::FromMethodCall( 153 dbus::ErrorResponse::FromMethodCall(method_call, kErrorPropertyReadOnly,
159 method_call, kErrorPropertyReadOnly, 154 "All properties are read-only.");
160 "All properties are read-only.");
161 response_sender.Run(error_response.Pass()); 155 response_sender.Run(error_response.Pass());
162 } 156 }
163 157
164 // Called by dbus:: when the Bluetooth daemon fetches all properties of the 158 // Called by dbus:: when the Bluetooth daemon fetches all properties of the
165 // service. 159 // service.
166 void GetAll(dbus::MethodCall* method_call, 160 void GetAll(dbus::MethodCall* method_call,
167 dbus::ExportedObject::ResponseSender response_sender) { 161 dbus::ExportedObject::ResponseSender response_sender) {
168 VLOG(2) << "BluetoothGattServiceServiceProvider::GetAll: " 162 VLOG(2) << "BluetoothGattServiceServiceProvider::GetAll: "
169 << object_path_.value(); 163 << object_path_.value();
170 DCHECK(OnOriginThread()); 164 DCHECK(OnOriginThread());
171 165
172 dbus::MessageReader reader(method_call); 166 dbus::MessageReader reader(method_call);
173 167
174 std::string interface_name; 168 std::string interface_name;
175 if (!reader.PopString(&interface_name) || reader.HasMoreData()) { 169 if (!reader.PopString(&interface_name) || reader.HasMoreData()) {
176 scoped_ptr<dbus::ErrorResponse> error_response = 170 scoped_ptr<dbus::ErrorResponse> error_response =
177 dbus::ErrorResponse::FromMethodCall( 171 dbus::ErrorResponse::FromMethodCall(method_call, kErrorInvalidArgs,
178 method_call, kErrorInvalidArgs, "Expected 's'."); 172 "Expected 's'.");
179 response_sender.Run(error_response.Pass()); 173 response_sender.Run(error_response.Pass());
180 return; 174 return;
181 } 175 }
182 176
183 // Only the GATT service interface is allowed. 177 // Only the GATT service interface is allowed.
184 if (interface_name != 178 if (interface_name !=
185 bluetooth_gatt_service::kBluetoothGattServiceInterface) { 179 bluetooth_gatt_service::kBluetoothGattServiceInterface) {
186 scoped_ptr<dbus::ErrorResponse> error_response = 180 scoped_ptr<dbus::ErrorResponse> error_response =
187 dbus::ErrorResponse::FromMethodCall( 181 dbus::ErrorResponse::FromMethodCall(
188 method_call, kErrorInvalidArgs, 182 method_call, kErrorInvalidArgs,
(...skipping 25 matching lines...) Expand all
214 208
215 writer.CloseContainer(&array_writer); 209 writer.CloseContainer(&array_writer);
216 210
217 response_sender.Run(response.Pass()); 211 response_sender.Run(response.Pass());
218 } 212 }
219 213
220 // Called by dbus:: when a method is exported. 214 // Called by dbus:: when a method is exported.
221 void OnExported(const std::string& interface_name, 215 void OnExported(const std::string& interface_name,
222 const std::string& method_name, 216 const std::string& method_name,
223 bool success) { 217 bool success) {
224 LOG_IF(WARNING, !success) << "Failed to export " 218 LOG_IF(WARNING, !success) << "Failed to export " << interface_name << "."
225 << interface_name << "." << method_name; 219 << method_name;
226 } 220 }
227 221
228 // Origin thread (i.e. the UI thread in production). 222 // Origin thread (i.e. the UI thread in production).
229 base::PlatformThreadId origin_thread_id_; 223 base::PlatformThreadId origin_thread_id_;
230 224
231 // 128-bit service UUID of this object. 225 // 128-bit service UUID of this object.
232 std::string uuid_; 226 std::string uuid_;
233 227
234 // List of object paths that represent other exported GATT services that are 228 // List of object paths that represent other exported GATT services that are
235 // included from this service. 229 // included from this service.
(...skipping 13 matching lines...) Expand all
249 // Weak pointer factory for generating 'this' pointers that might live longer 243 // Weak pointer factory for generating 'this' pointers that might live longer
250 // than we do. 244 // than we do.
251 // Note: This should remain the last member so it'll be destroyed and 245 // Note: This should remain the last member so it'll be destroyed and
252 // invalidate its weak pointers before any other members are destroyed. 246 // invalidate its weak pointers before any other members are destroyed.
253 base::WeakPtrFactory<BluetoothGattServiceServiceProviderImpl> 247 base::WeakPtrFactory<BluetoothGattServiceServiceProviderImpl>
254 weak_ptr_factory_; 248 weak_ptr_factory_;
255 249
256 DISALLOW_COPY_AND_ASSIGN(BluetoothGattServiceServiceProviderImpl); 250 DISALLOW_COPY_AND_ASSIGN(BluetoothGattServiceServiceProviderImpl);
257 }; 251 };
258 252
259 BluetoothGattServiceServiceProvider::BluetoothGattServiceServiceProvider() { 253 BluetoothGattServiceServiceProvider::BluetoothGattServiceServiceProvider() {}
260 }
261 254
262 BluetoothGattServiceServiceProvider::~BluetoothGattServiceServiceProvider() { 255 BluetoothGattServiceServiceProvider::~BluetoothGattServiceServiceProvider() {}
263 }
264 256
265 // static 257 // static
266 BluetoothGattServiceServiceProvider* 258 BluetoothGattServiceServiceProvider*
267 BluetoothGattServiceServiceProvider::Create( 259 BluetoothGattServiceServiceProvider::Create(
268 dbus::Bus* bus, 260 dbus::Bus* bus,
269 const dbus::ObjectPath& object_path, 261 const dbus::ObjectPath& object_path,
270 const std::string& uuid, 262 const std::string& uuid,
271 const std::vector<dbus::ObjectPath>& includes) { 263 const std::vector<dbus::ObjectPath>& includes) {
272 if (!DBusThreadManager::Get()->IsUsingStub(DBusClientBundle::BLUETOOTH)) { 264 if (!bluez::BluezDBusManager::Get()->IsUsingStub()) {
273 return new BluetoothGattServiceServiceProviderImpl( 265 return new BluetoothGattServiceServiceProviderImpl(bus, object_path, uuid,
274 bus, object_path, uuid, includes); 266 includes);
275 } 267 }
276 return new FakeBluetoothGattServiceServiceProvider( 268 return new FakeBluetoothGattServiceServiceProvider(object_path, uuid,
277 object_path, uuid, includes); 269 includes);
278 } 270 }
279 271
280 } // namespace chromeos 272 } // namespace bluez
OLDNEW
« no previous file with comments | « device/bluetooth/dbus/bluetooth_gatt_service_service_provider.h ('k') | device/bluetooth/dbus/bluetooth_input_client.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698