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

Side by Side Diff: chromeos/dbus/experimental_bluetooth_agent_service_provider.cc

Issue 12605008: D-Bus Clients for BlueZ 5 API (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Add service providers Created 7 years, 9 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 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_agent_service_provider.h" 5 #include "chromeos/dbus/experimental_bluetooth_agent_service_provider.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/chromeos/chromeos_version.h" 10 #include "base/chromeos/chromeos_version.h"
11 #include "base/logging.h" 11 #include "base/logging.h"
12 #include "base/memory/ref_counted.h" 12 #include "base/memory/ref_counted.h"
13 #include "base/threading/platform_thread.h" 13 #include "base/threading/platform_thread.h"
14 #include "dbus/bus.h" 14 #include "dbus/bus.h"
15 #include "dbus/exported_object.h" 15 #include "dbus/exported_object.h"
16 #include "dbus/message.h" 16 #include "dbus/message.h"
17 #include "dbus/object_path.h" 17 #include "dbus/object_path.h"
18 #include "third_party/cros_system_api/dbus/service_constants.h" 18 #include "third_party/cros_system_api/dbus/service_constants.h"
19 19
20 namespace {
21
22 // Constants used by BlueZ for the ConfirmModeChange method.
23 const char kModeOff[] = "off";
24 const char kModeConnectable[] = "connectable";
25 const char kModeDiscoverable[] = "discoverable";
26
27 } // namespace
28
29 namespace chromeos { 20 namespace chromeos {
30 21
31 // The BluetoothAgentServiceProvider implementation used in production. 22 // The ExperimentalBluetoothAgentServiceProvider implementation used in
32 class BluetoothAgentServiceProviderImpl : public BluetoothAgentServiceProvider { 23 // production.
24 class ExperimentalBluetoothAgentServiceProviderImpl
25 : public ExperimentalBluetoothAgentServiceProvider {
33 public: 26 public:
34 BluetoothAgentServiceProviderImpl(dbus::Bus* bus, 27 ExperimentalBluetoothAgentServiceProviderImpl(
35 const dbus::ObjectPath& object_path, 28 dbus::Bus* bus,
36 Delegate* delegate) 29 const dbus::ObjectPath& object_path,
30 Delegate* delegate)
37 : origin_thread_id_(base::PlatformThread::CurrentId()), 31 : origin_thread_id_(base::PlatformThread::CurrentId()),
38 bus_(bus), 32 bus_(bus),
39 delegate_(delegate), 33 delegate_(delegate),
40 object_path_(object_path), 34 object_path_(object_path),
41 weak_ptr_factory_(this) { 35 weak_ptr_factory_(this) {
42 VLOG(1) << "Creating BluetoothAdapterClientImpl for " 36 VLOG(1) << "Creating Bluetooth Agent: " << object_path_.value();
43 << object_path.value();
44 37
45 exported_object_ = bus_->GetExportedObject(object_path_); 38 exported_object_ = bus_->GetExportedObject(object_path_);
46 39
47 exported_object_->ExportMethod( 40 exported_object_->ExportMethod(
48 bluetooth_agent::kBluetoothAgentInterface, 41 bluetooth_agent::kExperimentalBluetoothAgentInterface,
49 bluetooth_agent::kRelease, 42 bluetooth_agent::kRelease,
50 base::Bind(&BluetoothAgentServiceProviderImpl::Release,
51 weak_ptr_factory_.GetWeakPtr()),
52 base::Bind(&BluetoothAgentServiceProviderImpl::ReleaseExported,
53 weak_ptr_factory_.GetWeakPtr()));
54
55 exported_object_->ExportMethod(
56 bluetooth_agent::kBluetoothAgentInterface,
57 bluetooth_agent::kRequestPinCode,
58 base::Bind(&BluetoothAgentServiceProviderImpl::RequestPinCode,
59 weak_ptr_factory_.GetWeakPtr()),
60 base::Bind(&BluetoothAgentServiceProviderImpl::RequestPinCodeExported,
61 weak_ptr_factory_.GetWeakPtr()));
62
63 exported_object_->ExportMethod(
64 bluetooth_agent::kBluetoothAgentInterface,
65 bluetooth_agent::kRequestPasskey,
66 base::Bind(&BluetoothAgentServiceProviderImpl::RequestPasskey,
67 weak_ptr_factory_.GetWeakPtr()),
68 base::Bind(&BluetoothAgentServiceProviderImpl::RequestPasskeyExported,
69 weak_ptr_factory_.GetWeakPtr()));
70
71 exported_object_->ExportMethod(
72 bluetooth_agent::kBluetoothAgentInterface,
73 bluetooth_agent::kDisplayPinCode,
74 base::Bind(&BluetoothAgentServiceProviderImpl::DisplayPinCode,
75 weak_ptr_factory_.GetWeakPtr()),
76 base::Bind(&BluetoothAgentServiceProviderImpl::DisplayPinCodeExported,
77 weak_ptr_factory_.GetWeakPtr()));
78
79 exported_object_->ExportMethod(
80 bluetooth_agent::kBluetoothAgentInterface,
81 bluetooth_agent::kDisplayPasskey,
82 base::Bind(&BluetoothAgentServiceProviderImpl::DisplayPasskey,
83 weak_ptr_factory_.GetWeakPtr()),
84 base::Bind(&BluetoothAgentServiceProviderImpl::DisplayPasskeyExported,
85 weak_ptr_factory_.GetWeakPtr()));
86
87 exported_object_->ExportMethod(
88 bluetooth_agent::kBluetoothAgentInterface,
89 bluetooth_agent::kRequestConfirmation,
90 base::Bind(&BluetoothAgentServiceProviderImpl::RequestConfirmation,
91 weak_ptr_factory_.GetWeakPtr()),
92 base::Bind( 43 base::Bind(
93 &BluetoothAgentServiceProviderImpl::RequestConfirmationExported, 44 &ExperimentalBluetoothAgentServiceProviderImpl::Release,
45 weak_ptr_factory_.GetWeakPtr()),
46 base::Bind(
47 &ExperimentalBluetoothAgentServiceProviderImpl::OnExported,
94 weak_ptr_factory_.GetWeakPtr())); 48 weak_ptr_factory_.GetWeakPtr()));
95 49
96 exported_object_->ExportMethod( 50 exported_object_->ExportMethod(
97 bluetooth_agent::kBluetoothAgentInterface, 51 bluetooth_agent::kExperimentalBluetoothAgentInterface,
98 bluetooth_agent::kAuthorize, 52 bluetooth_agent::kRequestPinCode,
99 base::Bind(&BluetoothAgentServiceProviderImpl::Authorize,
100 weak_ptr_factory_.GetWeakPtr()),
101 base::Bind(&BluetoothAgentServiceProviderImpl::AuthorizeExported,
102 weak_ptr_factory_.GetWeakPtr()));
103
104 exported_object_->ExportMethod(
105 bluetooth_agent::kBluetoothAgentInterface,
106 bluetooth_agent::kConfirmModeChange,
107 base::Bind(&BluetoothAgentServiceProviderImpl::ConfirmModeChange,
108 weak_ptr_factory_.GetWeakPtr()),
109 base::Bind( 53 base::Bind(
110 &BluetoothAgentServiceProviderImpl::ConfirmModeChangeExported, 54 &ExperimentalBluetoothAgentServiceProviderImpl::RequestPinCode,
55 weak_ptr_factory_.GetWeakPtr()),
56 base::Bind(
57 &ExperimentalBluetoothAgentServiceProviderImpl::OnExported,
111 weak_ptr_factory_.GetWeakPtr())); 58 weak_ptr_factory_.GetWeakPtr()));
112 59
113 exported_object_->ExportMethod( 60 exported_object_->ExportMethod(
114 bluetooth_agent::kBluetoothAgentInterface, 61 bluetooth_agent::kExperimentalBluetoothAgentInterface,
62 bluetooth_agent::kDisplayPinCode,
63 base::Bind(
64 &ExperimentalBluetoothAgentServiceProviderImpl::DisplayPinCode,
65 weak_ptr_factory_.GetWeakPtr()),
66 base::Bind(
67 &ExperimentalBluetoothAgentServiceProviderImpl::OnExported,
68 weak_ptr_factory_.GetWeakPtr()));
69
70 exported_object_->ExportMethod(
71 bluetooth_agent::kExperimentalBluetoothAgentInterface,
72 bluetooth_agent::kRequestPasskey,
73 base::Bind(
74 &ExperimentalBluetoothAgentServiceProviderImpl::RequestPasskey,
75 weak_ptr_factory_.GetWeakPtr()),
76 base::Bind(
77 &ExperimentalBluetoothAgentServiceProviderImpl::OnExported,
78 weak_ptr_factory_.GetWeakPtr()));
79
80 exported_object_->ExportMethod(
81 bluetooth_agent::kExperimentalBluetoothAgentInterface,
82 bluetooth_agent::kDisplayPasskey,
83 base::Bind(
84 &ExperimentalBluetoothAgentServiceProviderImpl::DisplayPasskey,
85 weak_ptr_factory_.GetWeakPtr()),
86 base::Bind(
87 &ExperimentalBluetoothAgentServiceProviderImpl::OnExported,
88 weak_ptr_factory_.GetWeakPtr()));
89
90 exported_object_->ExportMethod(
91 bluetooth_agent::kExperimentalBluetoothAgentInterface,
92 bluetooth_agent::kRequestConfirmation,
93 base::Bind(
94 &ExperimentalBluetoothAgentServiceProviderImpl::RequestConfirmation,
95 weak_ptr_factory_.GetWeakPtr()),
96 base::Bind(
97 &ExperimentalBluetoothAgentServiceProviderImpl::OnExported,
98 weak_ptr_factory_.GetWeakPtr()));
99
100 exported_object_->ExportMethod(
101 bluetooth_agent::kExperimentalBluetoothAgentInterface,
102 bluetooth_agent::kRequestAuthorization,
103 base::Bind(
104 &ExperimentalBluetoothAgentServiceProviderImpl::RequestAuthorization,
105 weak_ptr_factory_.GetWeakPtr()),
106 base::Bind(
107 &ExperimentalBluetoothAgentServiceProviderImpl::OnExported,
108 weak_ptr_factory_.GetWeakPtr()));
109
110 exported_object_->ExportMethod(
111 bluetooth_agent::kExperimentalBluetoothAgentInterface,
112 bluetooth_agent::kAuthorizeService,
113 base::Bind(
114 &ExperimentalBluetoothAgentServiceProviderImpl::AuthorizeService,
115 weak_ptr_factory_.GetWeakPtr()),
116 base::Bind(
117 &ExperimentalBluetoothAgentServiceProviderImpl::OnExported,
118 weak_ptr_factory_.GetWeakPtr()));
119
120 exported_object_->ExportMethod(
121 bluetooth_agent::kExperimentalBluetoothAgentInterface,
115 bluetooth_agent::kCancel, 122 bluetooth_agent::kCancel,
116 base::Bind(&BluetoothAgentServiceProviderImpl::Cancel, 123 base::Bind(
117 weak_ptr_factory_.GetWeakPtr()), 124 &ExperimentalBluetoothAgentServiceProviderImpl::Cancel,
118 base::Bind(&BluetoothAgentServiceProviderImpl::CancelExported, 125 weak_ptr_factory_.GetWeakPtr()),
119 weak_ptr_factory_.GetWeakPtr())); 126 base::Bind(
127 &ExperimentalBluetoothAgentServiceProviderImpl::OnExported,
128 weak_ptr_factory_.GetWeakPtr()));
120 } 129 }
121 130
122 virtual ~BluetoothAgentServiceProviderImpl() { 131 virtual ~ExperimentalBluetoothAgentServiceProviderImpl() {
132 VLOG(1) << "Cleaning up Bluetooth Agent: " << object_path_.value();
133
123 // Unregister the object path so we can reuse with a new agent. 134 // Unregister the object path so we can reuse with a new agent.
124 bus_->UnregisterExportedObject(object_path_); 135 bus_->UnregisterExportedObject(object_path_);
125 } 136 }
126 137
127 private: 138 private:
128 // Returns true if the current thread is on the origin thread. 139 // Returns true if the current thread is on the origin thread.
129 bool OnOriginThread() { 140 bool OnOriginThread() {
130 return base::PlatformThread::CurrentId() == origin_thread_id_; 141 return base::PlatformThread::CurrentId() == origin_thread_id_;
131 } 142 }
132 143
133 // Called by dbus:: when the agent is unregistered from the Bluetooth 144 // Called by dbus:: when the agent is unregistered from the Bluetooth
134 // daemon, generally at the end of a pairing request. 145 // daemon, generally at the end of a pairing request.
135 void Release(dbus::MethodCall* method_call, 146 void Release(dbus::MethodCall* method_call,
136 dbus::ExportedObject::ResponseSender response_sender) { 147 dbus::ExportedObject::ResponseSender response_sender) {
137 DCHECK(OnOriginThread()); 148 DCHECK(OnOriginThread());
138 DCHECK(delegate_); 149 DCHECK(delegate_);
139 150
140 delegate_->Release(); 151 delegate_->Release();
141 152
142 response_sender.Run(dbus::Response::FromMethodCall(method_call)); 153 response_sender.Run(dbus::Response::FromMethodCall(method_call));
143 } 154 }
144 155
145 // Called by dbus:: when the Release method is exported.
146 void ReleaseExported(const std::string& interface_name,
147 const std::string& method_name,
148 bool success) {
149 LOG_IF(WARNING, !success) << "Failed to export "
150 << interface_name << "." << method_name;
151 }
152
153 // Called by dbus:: when the Bluetooth daemon requires a PIN Code for 156 // Called by dbus:: when the Bluetooth daemon requires a PIN Code for
154 // device authentication. 157 // device authentication.
155 void RequestPinCode(dbus::MethodCall* method_call, 158 void RequestPinCode(dbus::MethodCall* method_call,
156 dbus::ExportedObject::ResponseSender response_sender) { 159 dbus::ExportedObject::ResponseSender response_sender) {
157 DCHECK(OnOriginThread()); 160 DCHECK(OnOriginThread());
158 DCHECK(delegate_); 161 DCHECK(delegate_);
159 162
160 dbus::MessageReader reader(method_call); 163 dbus::MessageReader reader(method_call);
161 dbus::ObjectPath device_path; 164 dbus::ObjectPath device_path;
162 if (!reader.PopObjectPath(&device_path)) { 165 if (!reader.PopObjectPath(&device_path)) {
163 LOG(WARNING) << "RequestPinCode called with incorrect paramters: " 166 LOG(WARNING) << "RequestPinCode called with incorrect paramters: "
164 << method_call->ToString(); 167 << method_call->ToString();
165 return; 168 return;
166 } 169 }
167 170
168 Delegate::PinCodeCallback callback = base::Bind( 171 Delegate::PinCodeCallback callback = base::Bind(
169 &BluetoothAgentServiceProviderImpl::OnPinCode, 172 &ExperimentalBluetoothAgentServiceProviderImpl::OnPinCode,
170 weak_ptr_factory_.GetWeakPtr(), 173 weak_ptr_factory_.GetWeakPtr(),
171 method_call, 174 method_call,
172 response_sender); 175 response_sender);
173 176
174 delegate_->RequestPinCode(device_path, callback); 177 delegate_->RequestPinCode(device_path, callback);
175 } 178 }
176 179
177 // Called by dbus:: when the RequestPinCode method is exported.
178 void RequestPinCodeExported(const std::string& interface_name,
179 const std::string& method_name,
180 bool success) {
181 LOG_IF(WARNING, !success) << "Failed to export "
182 << interface_name << "." << method_name;
183 }
184
185 // Called by dbus:: when the Bluetooth daemon requires a Passkey for
186 // device authentication.
187 void RequestPasskey(dbus::MethodCall* method_call,
188 dbus::ExportedObject::ResponseSender response_sender) {
189 DCHECK(OnOriginThread());
190 DCHECK(delegate_);
191
192 dbus::MessageReader reader(method_call);
193 dbus::ObjectPath device_path;
194 if (!reader.PopObjectPath(&device_path)) {
195 LOG(WARNING) << "RequestPasskey called with incorrect paramters: "
196 << method_call->ToString();
197 return;
198 }
199
200 Delegate::PasskeyCallback callback = base::Bind(
201 &BluetoothAgentServiceProviderImpl::OnPasskey,
202 weak_ptr_factory_.GetWeakPtr(),
203 method_call,
204 response_sender);
205
206 delegate_->RequestPasskey(device_path, callback);
207 }
208
209 // Called by dbus:: when the RequestPasskey method is exported.
210 void RequestPasskeyExported(const std::string& interface_name,
211 const std::string& method_name,
212 bool success) {
213 LOG_IF(WARNING, !success) << "Failed to export "
214 << interface_name << "." << method_name;
215 }
216
217 // Called by dbus:: when the Bluetooth daemon requires that the user 180 // Called by dbus:: when the Bluetooth daemon requires that the user
218 // enter a PIN Code into the remote device so that it may be 181 // enter a PIN Code into the remote device so that it may be
219 // authenticated. 182 // authenticated.
220 void DisplayPinCode(dbus::MethodCall* method_call, 183 void DisplayPinCode(dbus::MethodCall* method_call,
221 dbus::ExportedObject::ResponseSender response_sender) { 184 dbus::ExportedObject::ResponseSender response_sender) {
222 DCHECK(OnOriginThread()); 185 DCHECK(OnOriginThread());
223 DCHECK(delegate_); 186 DCHECK(delegate_);
224 187
225 dbus::MessageReader reader(method_call); 188 dbus::MessageReader reader(method_call);
226 dbus::ObjectPath device_path; 189 dbus::ObjectPath device_path;
227 std::string pincode; 190 std::string pincode;
228 if (!reader.PopObjectPath(&device_path) || 191 if (!reader.PopObjectPath(&device_path) ||
229 !reader.PopString(&pincode)) { 192 !reader.PopString(&pincode)) {
230 LOG(WARNING) << "DisplayPinCode called with incorrect paramters: " 193 LOG(WARNING) << "DisplayPinCode called with incorrect paramters: "
231 << method_call->ToString(); 194 << method_call->ToString();
232 return; 195 return;
233 } 196 }
234 197
235 delegate_->DisplayPinCode(device_path, pincode); 198 delegate_->DisplayPinCode(device_path, pincode);
236 199
237 response_sender.Run(dbus::Response::FromMethodCall(method_call)); 200 response_sender.Run(dbus::Response::FromMethodCall(method_call));
238 } 201 }
239 202
240 // Called by dbus:: when the DisplayPinCode method is exported. 203 // Called by dbus:: when the Bluetooth daemon requires a Passkey for
241 void DisplayPinCodeExported(const std::string& interface_name, 204 // device authentication.
242 const std::string& method_name, 205 void RequestPasskey(dbus::MethodCall* method_call,
243 bool success) { 206 dbus::ExportedObject::ResponseSender response_sender) {
244 LOG_IF(WARNING, !success) << "Failed to export " 207 DCHECK(OnOriginThread());
245 << interface_name << "." << method_name; 208 DCHECK(delegate_);
209
210 dbus::MessageReader reader(method_call);
211 dbus::ObjectPath device_path;
212 if (!reader.PopObjectPath(&device_path)) {
213 LOG(WARNING) << "RequestPasskey called with incorrect paramters: "
214 << method_call->ToString();
215 return;
216 }
217
218 Delegate::PasskeyCallback callback = base::Bind(
219 &ExperimentalBluetoothAgentServiceProviderImpl::OnPasskey,
220 weak_ptr_factory_.GetWeakPtr(),
221 method_call,
222 response_sender);
223
224 delegate_->RequestPasskey(device_path, callback);
246 } 225 }
247 226
248 // Called by dbus:: when the Bluetooth daemon requires that the user 227 // Called by dbus:: when the Bluetooth daemon requires that the user
249 // enter a Passkey into the remote device so that it may be 228 // enter a Passkey into the remote device so that it may be
250 // authenticated. 229 // authenticated.
251 void DisplayPasskey(dbus::MethodCall* method_call, 230 void DisplayPasskey(dbus::MethodCall* method_call,
252 dbus::ExportedObject::ResponseSender response_sender) { 231 dbus::ExportedObject::ResponseSender response_sender) {
253 DCHECK(OnOriginThread()); 232 DCHECK(OnOriginThread());
254 DCHECK(delegate_); 233 DCHECK(delegate_);
255 234
256 dbus::MessageReader reader(method_call); 235 dbus::MessageReader reader(method_call);
257 dbus::ObjectPath device_path; 236 dbus::ObjectPath device_path;
258 uint32 passkey; 237 uint32 passkey;
238 int16 entered;
satorux1 2013/03/22 02:00:12 more like a matter of taste: initialize them with
259 if (!reader.PopObjectPath(&device_path) || 239 if (!reader.PopObjectPath(&device_path) ||
260 !reader.PopUint32(&passkey)) { 240 !reader.PopUint32(&passkey)) {
261 LOG(WARNING) << "DisplayPasskey called with incorrect paramters: " 241 LOG(WARNING) << "DisplayPasskey called with incorrect paramters: "
262 << method_call->ToString(); 242 << method_call->ToString();
263 return; 243 return;
264 } 244 }
265 245
266 delegate_->DisplayPasskey(device_path, passkey); 246 // This wasn't always provided, play it safe...
247 if (!reader.PopInt16(&entered))
248 entered = 0;
249
250 delegate_->DisplayPasskey(device_path, passkey, entered);
267 251
268 response_sender.Run(dbus::Response::FromMethodCall(method_call)); 252 response_sender.Run(dbus::Response::FromMethodCall(method_call));
269 } 253 }
270 254
271 // Called by dbus:: when the DisplayPasskey method is exported.
272 void DisplayPasskeyExported(const std::string& interface_name,
273 const std::string& method_name,
274 bool success) {
275 LOG_IF(WARNING, !success) << "Failed to export "
276 << interface_name << "." << method_name;
277 }
278
279 // Called by dbus:: when the Bluetooth daemon requires that the user 255 // Called by dbus:: when the Bluetooth daemon requires that the user
280 // confirm that a Passkey is displayed on the screen of the remote 256 // confirm that a Passkey is displayed on the screen of the remote
281 // device so that it may be authenticated. 257 // device so that it may be authenticated.
282 void RequestConfirmation( 258 void RequestConfirmation(
283 dbus::MethodCall* method_call, 259 dbus::MethodCall* method_call,
284 dbus::ExportedObject::ResponseSender response_sender) { 260 dbus::ExportedObject::ResponseSender response_sender) {
285 DCHECK(OnOriginThread()); 261 DCHECK(OnOriginThread());
286 DCHECK(delegate_); 262 DCHECK(delegate_);
287 263
288 dbus::MessageReader reader(method_call); 264 dbus::MessageReader reader(method_call);
289 dbus::ObjectPath device_path; 265 dbus::ObjectPath device_path;
290 uint32 passkey; 266 uint32 passkey;
satorux1 2013/03/22 02:00:12 ditto.
291 if (!reader.PopObjectPath(&device_path) || 267 if (!reader.PopObjectPath(&device_path) ||
292 !reader.PopUint32(&passkey)) { 268 !reader.PopUint32(&passkey)) {
293 LOG(WARNING) << "RequestConfirmation called with incorrect paramters: " 269 LOG(WARNING) << "RequestConfirmation called with incorrect paramters: "
294 << method_call->ToString(); 270 << method_call->ToString();
295 return; 271 return;
296 } 272 }
297 273
298 Delegate::ConfirmationCallback callback = base::Bind( 274 Delegate::ConfirmationCallback callback = base::Bind(
299 &BluetoothAgentServiceProviderImpl::OnConfirmation, 275 &ExperimentalBluetoothAgentServiceProviderImpl::OnConfirmation,
300 weak_ptr_factory_.GetWeakPtr(), 276 weak_ptr_factory_.GetWeakPtr(),
301 method_call, 277 method_call,
302 response_sender); 278 response_sender);
303 279
304 delegate_->RequestConfirmation(device_path, passkey, callback); 280 delegate_->RequestConfirmation(device_path, passkey, callback);
305 } 281 }
306 282
307 // Called by dbus:: when the RequestConfirmation method is exported. 283 // Called by dbus:: when the Bluetooth daemon requires that the user
308 void RequestConfirmationExported(const std::string& interface_name, 284 // confirm an incoming just-works pairing.
309 const std::string& method_name, 285 void RequestAuthorization(
310 bool success) { 286 dbus::MethodCall* method_call,
311 LOG_IF(WARNING, !success) << "Failed to export " 287 dbus::ExportedObject::ResponseSender response_sender) {
312 << interface_name << "." << method_name; 288 DCHECK(OnOriginThread());
289 DCHECK(delegate_);
290
291 dbus::MessageReader reader(method_call);
292 dbus::ObjectPath device_path;
293 if (!reader.PopObjectPath(&device_path)) {
294 LOG(WARNING) << "RequestAuthorization called with incorrect paramters: "
295 << method_call->ToString();
296 return;
297 }
298
299 Delegate::ConfirmationCallback callback = base::Bind(
300 &ExperimentalBluetoothAgentServiceProviderImpl::OnConfirmation,
301 weak_ptr_factory_.GetWeakPtr(),
302 method_call,
303 response_sender);
304
305 delegate_->RequestAuthorization(device_path, callback);
313 } 306 }
314 307
315 // Called by dbus:: when the Bluetooth daemon requires that the user 308 // Called by dbus:: when the Bluetooth daemon requires that the user
316 // confirm that that a remote device is authorized to connect to a service 309 // confirm that that a remote device is authorized to connect to a service
317 // UUID. 310 // UUID.
318 void Authorize(dbus::MethodCall* method_call, 311 void AuthorizeService(dbus::MethodCall* method_call,
319 dbus::ExportedObject::ResponseSender response_sender) { 312 dbus::ExportedObject::ResponseSender response_sender) {
320 DCHECK(OnOriginThread()); 313 DCHECK(OnOriginThread());
321 DCHECK(delegate_); 314 DCHECK(delegate_);
322 315
323 dbus::MessageReader reader(method_call); 316 dbus::MessageReader reader(method_call);
324 dbus::ObjectPath device_path; 317 dbus::ObjectPath device_path;
325 std::string uuid; 318 std::string uuid;
326 if (!reader.PopObjectPath(&device_path) || 319 if (!reader.PopObjectPath(&device_path) ||
327 !reader.PopString(&uuid)) { 320 !reader.PopString(&uuid)) {
328 LOG(WARNING) << "Authorize called with incorrect paramters: " 321 LOG(WARNING) << "AuthorizeService called with incorrect paramters: "
329 << method_call->ToString(); 322 << method_call->ToString();
330 return; 323 return;
331 } 324 }
332 325
333 Delegate::ConfirmationCallback callback = base::Bind( 326 Delegate::ConfirmationCallback callback = base::Bind(
334 &BluetoothAgentServiceProviderImpl::OnConfirmation, 327 &ExperimentalBluetoothAgentServiceProviderImpl::OnConfirmation,
335 weak_ptr_factory_.GetWeakPtr(), 328 weak_ptr_factory_.GetWeakPtr(),
336 method_call, 329 method_call,
337 response_sender); 330 response_sender);
338 331
339 delegate_->Authorize(device_path, uuid, callback); 332 delegate_->AuthorizeService(device_path, uuid, callback);
340 }
341
342 // Called by dbus:: when the Authorize method is exported.
343 void AuthorizeExported(const std::string& interface_name,
344 const std::string& method_name,
345 bool success) {
346 LOG_IF(WARNING, !success) << "Failed to export "
347 << interface_name << "." << method_name;
348 }
349
350 // Called by dbus:: when the Bluetooth daemon requires that the user
351 // confirm that the adapter may change mode.
352 void ConfirmModeChange(dbus::MethodCall* method_call,
353 dbus::ExportedObject::ResponseSender response_sender) {
354 DCHECK(OnOriginThread());
355 DCHECK(delegate_);
356
357 dbus::MessageReader reader(method_call);
358 std::string mode_str;
359 if (!reader.PopString(&mode_str)) {
360 LOG(WARNING) << "ConfirmModeChange called with incorrect paramters: "
361 << method_call->ToString();
362 return;
363 }
364
365 Delegate::Mode mode;
366 if (mode_str == kModeOff) {
367 mode = Delegate::OFF;
368 } else if (mode_str == kModeConnectable) {
369 mode = Delegate::CONNECTABLE;
370 } else if (mode_str == kModeDiscoverable) {
371 mode = Delegate::DISCOVERABLE;
372 } else {
373 LOG(WARNING) << "ConfirmModeChange called with unknown mode: "
374 << mode_str;
375 return;
376 }
377
378 Delegate::ConfirmationCallback callback = base::Bind(
379 &BluetoothAgentServiceProviderImpl::OnConfirmation,
380 weak_ptr_factory_.GetWeakPtr(),
381 method_call,
382 response_sender);
383
384 delegate_->ConfirmModeChange(mode, callback);
385 }
386
387 // Called by dbus:: when the ConfirmModeChange method is exported.
388 void ConfirmModeChangeExported(const std::string& interface_name,
389 const std::string& method_name,
390 bool success) {
391 LOG_IF(WARNING, !success) << "Failed to export "
392 << interface_name << "." << method_name;
393 } 333 }
394 334
395 // Called by dbus:: when the request failed before a reply was returned 335 // Called by dbus:: when the request failed before a reply was returned
396 // from the device. 336 // from the device.
397 void Cancel(dbus::MethodCall* method_call, 337 void Cancel(dbus::MethodCall* method_call,
398 dbus::ExportedObject::ResponseSender response_sender) { 338 dbus::ExportedObject::ResponseSender response_sender) {
399 DCHECK(OnOriginThread()); 339 DCHECK(OnOriginThread());
400 DCHECK(delegate_); 340 DCHECK(delegate_);
401 341
402 delegate_->Cancel(); 342 delegate_->Cancel();
403 343
404 response_sender.Run(dbus::Response::FromMethodCall(method_call)); 344 response_sender.Run(dbus::Response::FromMethodCall(method_call));
405 } 345 }
406 346
407 // Called by dbus:: when the Cancel method is exported. 347 // Called by dbus:: when a method is exported.
408 void CancelExported(const std::string& interface_name, 348 void OnExported(const std::string& interface_name,
409 const std::string& method_name, 349 const std::string& method_name,
410 bool success) { 350 bool success) {
411 LOG_IF(WARNING, !success) << "Failed to export " 351 LOG_IF(WARNING, !success) << "Failed to export "
412 << interface_name << "." << method_name; 352 << interface_name << "." << method_name;
413 } 353 }
414 354
415 // Called by the Delegate to response to a method requesting a PIN code. 355 // Called by the Delegate to response to a method requesting a PIN code.
416 void OnPinCode(dbus::MethodCall* method_call, 356 void OnPinCode(dbus::MethodCall* method_call,
417 dbus::ExportedObject::ResponseSender response_sender, 357 dbus::ExportedObject::ResponseSender response_sender,
418 Delegate::Status status, 358 Delegate::Status status,
419 const std::string& pincode) { 359 const std::string& pincode) {
420 DCHECK(OnOriginThread()); 360 DCHECK(OnOriginThread());
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
528 // again in our destructor. 468 // again in our destructor.
529 dbus::ObjectPath object_path_; 469 dbus::ObjectPath object_path_;
530 470
531 // D-Bus object we are exporting, owned by this object. 471 // D-Bus object we are exporting, owned by this object.
532 scoped_refptr<dbus::ExportedObject> exported_object_; 472 scoped_refptr<dbus::ExportedObject> exported_object_;
533 473
534 // Weak pointer factory for generating 'this' pointers that might live longer 474 // Weak pointer factory for generating 'this' pointers that might live longer
535 // than we do. 475 // than we do.
536 // Note: This should remain the last member so it'll be destroyed and 476 // Note: This should remain the last member so it'll be destroyed and
537 // invalidate its weak pointers before any other members are destroyed. 477 // invalidate its weak pointers before any other members are destroyed.
538 base::WeakPtrFactory<BluetoothAgentServiceProviderImpl> weak_ptr_factory_; 478 base::WeakPtrFactory<ExperimentalBluetoothAgentServiceProviderImpl>
479 weak_ptr_factory_;
539 480
540 DISALLOW_COPY_AND_ASSIGN(BluetoothAgentServiceProviderImpl); 481 DISALLOW_COPY_AND_ASSIGN(ExperimentalBluetoothAgentServiceProviderImpl);
541 }; 482 };
542 483
543 // The BluetoothAgentServiceProvider implementation used on Linux desktop, 484 // The ExperimentalBluetoothAgentServiceProvider implementation used on Linux
544 // which does nothing. 485 // desktop, which does nothing.
545 class BluetoothAgentServiceProviderStubImpl 486 class ExperimentalBluetoothAgentServiceProviderStubImpl
546 : public BluetoothAgentServiceProvider { 487 : public ExperimentalBluetoothAgentServiceProvider {
547 public: 488 public:
548 explicit BluetoothAgentServiceProviderStubImpl(Delegate* delegate_) { 489 explicit ExperimentalBluetoothAgentServiceProviderStubImpl(
490 Delegate* delegate) {
549 } 491 }
550 492
551 virtual ~BluetoothAgentServiceProviderStubImpl() { 493 virtual ~ExperimentalBluetoothAgentServiceProviderStubImpl() {
552 } 494 }
553 }; 495 };
554 496
555 BluetoothAgentServiceProvider::BluetoothAgentServiceProvider() { 497 ExperimentalBluetoothAgentServiceProvider::
498 ExperimentalBluetoothAgentServiceProvider() {
556 } 499 }
557 500
558 BluetoothAgentServiceProvider::~BluetoothAgentServiceProvider() { 501 ExperimentalBluetoothAgentServiceProvider::
502 ~ExperimentalBluetoothAgentServiceProvider() {
559 } 503 }
560 504
561 // static 505 // static
562 BluetoothAgentServiceProvider* BluetoothAgentServiceProvider::Create( 506 ExperimentalBluetoothAgentServiceProvider*
563 dbus::Bus* bus, 507 ExperimentalBluetoothAgentServiceProvider::Create(
564 const dbus::ObjectPath& object_path, 508 dbus::Bus* bus,
565 Delegate* delegate) { 509 const dbus::ObjectPath& object_path,
510 Delegate* delegate) {
566 if (base::chromeos::IsRunningOnChromeOS()) { 511 if (base::chromeos::IsRunningOnChromeOS()) {
567 return new BluetoothAgentServiceProviderImpl(bus, object_path, delegate); 512 return new ExperimentalBluetoothAgentServiceProviderImpl(
513 bus, object_path, delegate);
568 } else { 514 } else {
569 return new BluetoothAgentServiceProviderStubImpl(delegate); 515 return new ExperimentalBluetoothAgentServiceProviderStubImpl(delegate);
570 } 516 }
571 } 517 }
572 518
573 } // namespace chromeos 519 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698