OLD | NEW |
---|---|
(Empty) | |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 #include "device/bluetooth/bluetooth_device_experimental_chromeos.h" | |
6 | |
7 #include "base/bind.h" | |
8 #include "chromeos/dbus/dbus_thread_manager.h" | |
9 #include "chromeos/dbus/experimental_bluetooth_adapter_client.h" | |
10 #include "chromeos/dbus/experimental_bluetooth_agent_manager_client.h" | |
11 #include "chromeos/dbus/experimental_bluetooth_agent_service_provider.h" | |
12 #include "chromeos/dbus/experimental_bluetooth_device_client.h" | |
13 #include "dbus/bus.h" | |
14 #include "device/bluetooth/bluetooth_adapter_experimental_chromeos.h" | |
15 #include "device/bluetooth/bluetooth_socket.h" | |
16 #include "third_party/cros_system_api/dbus/service_constants.h" | |
17 | |
18 using device::BluetoothDevice; | |
19 | |
20 namespace { | |
21 | |
22 // The agent path is relatively meaningless since BlueZ only supports one | |
23 // at time and will fail in an attempt to register another with "Already Exists" | |
24 // (which we fail in OnRegisterAgentError with ERROR_INPROGRESS). | |
25 const char kAgentPath[] = "/org/chromium/bluetooth_agent"; | |
26 | |
27 } // namespace | |
28 | |
29 namespace chromeos { | |
30 | |
31 BluetoothDeviceExperimentalChromeOS::BluetoothDeviceExperimentalChromeOS( | |
32 BluetoothAdapterExperimentalChromeOS* adapter, | |
33 const dbus::ObjectPath& object_path) | |
34 : adapter_(adapter), | |
35 object_path_(object_path), | |
36 num_connecting_calls_(0), | |
37 pairing_delegate_(NULL), | |
38 weak_ptr_factory_(this) { | |
39 } | |
40 | |
41 BluetoothDeviceExperimentalChromeOS::~BluetoothDeviceExperimentalChromeOS() { | |
42 } | |
43 | |
44 uint32 BluetoothDeviceExperimentalChromeOS::GetBluetoothClass() const { | |
45 ExperimentalBluetoothDeviceClient::Properties* properties = | |
46 DBusThreadManager::Get()->GetExperimentalBluetoothDeviceClient()-> | |
47 GetProperties(object_path_); | |
48 DCHECK(properties); | |
49 | |
50 return properties->bluetooth_class.value(); | |
51 } | |
52 | |
53 std::string BluetoothDeviceExperimentalChromeOS::GetDeviceName() const { | |
54 ExperimentalBluetoothDeviceClient::Properties* properties = | |
55 DBusThreadManager::Get()->GetExperimentalBluetoothDeviceClient()-> | |
56 GetProperties(object_path_); | |
57 DCHECK(properties); | |
58 | |
59 return properties->alias.value(); | |
60 } | |
61 | |
62 std::string BluetoothDeviceExperimentalChromeOS::GetAddress() const { | |
63 ExperimentalBluetoothDeviceClient::Properties* properties = | |
64 DBusThreadManager::Get()->GetExperimentalBluetoothDeviceClient()-> | |
65 GetProperties(object_path_); | |
66 DCHECK(properties); | |
67 | |
68 return properties->address.value(); | |
69 } | |
70 | |
71 bool BluetoothDeviceExperimentalChromeOS::IsPaired() const { | |
72 ExperimentalBluetoothDeviceClient::Properties* properties = | |
73 DBusThreadManager::Get()->GetExperimentalBluetoothDeviceClient()-> | |
74 GetProperties(object_path_); | |
75 DCHECK(properties); | |
76 | |
77 return properties->paired.value(); | |
78 } | |
79 | |
80 bool BluetoothDeviceExperimentalChromeOS::IsConnected() const { | |
81 ExperimentalBluetoothDeviceClient::Properties* properties = | |
82 DBusThreadManager::Get()->GetExperimentalBluetoothDeviceClient()-> | |
83 GetProperties(object_path_); | |
84 DCHECK(properties); | |
85 | |
86 return properties->connected.value(); | |
87 } | |
88 | |
89 bool BluetoothDeviceExperimentalChromeOS::IsConnectable() const { | |
90 // TODO(deymo): implement | |
91 return false; | |
92 } | |
93 | |
94 bool BluetoothDeviceExperimentalChromeOS::IsConnecting() const { | |
95 return num_connecting_calls_ > 0; | |
96 } | |
97 | |
98 BluetoothDeviceExperimentalChromeOS::ServiceList | |
99 BluetoothDeviceExperimentalChromeOS::GetServices() const { | |
100 ExperimentalBluetoothDeviceClient::Properties* properties = | |
101 DBusThreadManager::Get()->GetExperimentalBluetoothDeviceClient()-> | |
102 GetProperties(object_path_); | |
103 DCHECK(properties); | |
104 | |
105 return properties->uuids.value(); | |
106 } | |
107 | |
108 void BluetoothDeviceExperimentalChromeOS::GetServiceRecords( | |
109 const ServiceRecordsCallback& callback, | |
110 const ErrorCallback& error_callback) { | |
111 // TODO(keybuk): not implemented; remove | |
112 error_callback.Run(); | |
113 } | |
114 | |
115 void BluetoothDeviceExperimentalChromeOS::ProvidesServiceWithName( | |
116 const std::string& name, | |
117 const ProvidesServiceCallback& callback) { | |
118 // TODO(keybuk): not implemented; remove | |
119 callback.Run(false); | |
120 } | |
121 | |
122 bool BluetoothDeviceExperimentalChromeOS::ExpectingPinCode() const { | |
123 return !pincode_callback_.is_null(); | |
124 } | |
125 | |
126 bool BluetoothDeviceExperimentalChromeOS::ExpectingPasskey() const { | |
127 return !passkey_callback_.is_null(); | |
128 } | |
129 | |
130 bool BluetoothDeviceExperimentalChromeOS::ExpectingConfirmation() const { | |
131 return !confirmation_callback_.is_null(); | |
132 } | |
133 | |
134 void BluetoothDeviceExperimentalChromeOS::Connect( | |
135 BluetoothDevice::PairingDelegate* pairing_delegate, | |
136 const base::Closure& callback, | |
137 const ConnectErrorCallback& error_callback) { | |
138 ++num_connecting_calls_; | |
139 VLOG(1) << object_path_.value() << ": Connecting, " << num_connecting_calls_ | |
140 << " in progress"; | |
141 | |
142 if (IsPaired() || IsConnected() || !pairing_delegate) { | |
143 // No need to pair, skip straight to connection. | |
144 ConnectInternal(callback, error_callback); | |
145 } else { | |
146 // Initiate high-security connection with pairing. | |
147 DCHECK(!pairing_delegate_); | |
148 DCHECK(agent_.get() == NULL); | |
149 | |
150 pairing_delegate_ = pairing_delegate; | |
151 | |
152 // The agent path is relatively meaningless since BlueZ only supports | |
153 // one per application at a time. | |
154 dbus::Bus* system_bus = DBusThreadManager::Get()->GetSystemBus(); | |
155 agent_.reset(ExperimentalBluetoothAgentServiceProvider::Create( | |
156 system_bus, dbus::ObjectPath(kAgentPath), this)); | |
157 DCHECK(agent_.get()); | |
158 | |
159 VLOG(1) << object_path_.value() << ": Registering agent for pairing"; | |
160 DBusThreadManager::Get()->GetExperimentalBluetoothAgentManagerClient()-> | |
161 RegisterAgent( | |
162 dbus::ObjectPath(kAgentPath), | |
163 bluetooth_agent_manager::kKeyboardDisplayCapability, | |
164 base::Bind( | |
165 &BluetoothDeviceExperimentalChromeOS::OnRegisterAgent, | |
166 weak_ptr_factory_.GetWeakPtr(), | |
167 callback, | |
168 error_callback), | |
169 base::Bind( | |
170 &BluetoothDeviceExperimentalChromeOS::OnRegisterAgentError, | |
171 weak_ptr_factory_.GetWeakPtr(), | |
172 error_callback)); | |
173 } | |
174 } | |
175 | |
176 void BluetoothDeviceExperimentalChromeOS::SetPinCode( | |
177 const std::string& pincode) { | |
178 if (!agent_.get() || pincode_callback_.is_null()) | |
179 return; | |
180 | |
181 pincode_callback_.Run(SUCCESS, pincode); | |
182 pincode_callback_.Reset(); | |
183 } | |
184 | |
185 void BluetoothDeviceExperimentalChromeOS::SetPasskey(uint32 passkey) { | |
186 if (!agent_.get() || passkey_callback_.is_null()) | |
187 return; | |
188 | |
189 passkey_callback_.Run(SUCCESS, passkey); | |
190 passkey_callback_.Reset(); | |
191 } | |
192 | |
193 void BluetoothDeviceExperimentalChromeOS::ConfirmPairing() { | |
194 if (!agent_.get() || confirmation_callback_.is_null()) | |
195 return; | |
196 | |
197 confirmation_callback_.Run(SUCCESS); | |
198 confirmation_callback_.Reset(); | |
199 } | |
200 | |
201 void BluetoothDeviceExperimentalChromeOS::RejectPairing() { | |
202 RunPairingCallbacks(REJECTED); | |
203 } | |
204 | |
205 void BluetoothDeviceExperimentalChromeOS::CancelPairing() { | |
206 // If there wasn't a callback in progress that we can reply to then we | |
207 // have to send a CancelPairing() to the device instead. | |
208 if (!RunPairingCallbacks(CANCELLED)) { | |
209 DBusThreadManager::Get()->GetExperimentalBluetoothDeviceClient()-> | |
210 CancelPairing( | |
211 object_path_, | |
212 base::Bind(&base::DoNothing), | |
213 base::Bind( | |
214 &BluetoothDeviceExperimentalChromeOS::OnCancelPairingError, | |
215 weak_ptr_factory_.GetWeakPtr())); | |
216 } | |
217 } | |
218 | |
219 void BluetoothDeviceExperimentalChromeOS::Disconnect( | |
220 const base::Closure& callback, | |
221 const ErrorCallback& error_callback) { | |
222 VLOG(1) << object_path_.value() << ": Disconnecting"; | |
223 DBusThreadManager::Get()->GetExperimentalBluetoothDeviceClient()-> | |
224 Disconnect( | |
225 object_path_, | |
226 base::Bind( | |
227 &BluetoothDeviceExperimentalChromeOS::OnDisconnect, | |
228 weak_ptr_factory_.GetWeakPtr(), | |
229 callback), | |
230 base::Bind( | |
231 &BluetoothDeviceExperimentalChromeOS::OnDisconnectError, | |
232 weak_ptr_factory_.GetWeakPtr(), | |
233 error_callback)); | |
234 } | |
235 | |
236 void BluetoothDeviceExperimentalChromeOS::Forget( | |
237 const ErrorCallback& error_callback) { | |
238 VLOG(1) << object_path_.value() << ": Removing device"; | |
239 DBusThreadManager::Get()->GetExperimentalBluetoothAdapterClient()-> | |
240 RemoveDevice( | |
241 adapter_->object_path_, | |
242 object_path_, | |
243 base::Bind(&base::DoNothing), | |
244 base::Bind( | |
245 &BluetoothDeviceExperimentalChromeOS::OnForgetError, | |
246 weak_ptr_factory_.GetWeakPtr(), | |
247 error_callback)); | |
248 } | |
249 | |
250 void BluetoothDeviceExperimentalChromeOS::ConnectToService( | |
251 const std::string& service_uuid, | |
252 const SocketCallback& callback) { | |
253 // TODO(keybuk): implement | |
254 callback.Run(scoped_refptr<device::BluetoothSocket>()); | |
255 } | |
256 | |
257 void BluetoothDeviceExperimentalChromeOS::SetOutOfBandPairingData( | |
258 const device::BluetoothOutOfBandPairingData& data, | |
259 const base::Closure& callback, | |
260 const ErrorCallback& error_callback) { | |
261 // TODO(keybuk): implement | |
262 error_callback.Run(); | |
263 } | |
264 | |
265 void BluetoothDeviceExperimentalChromeOS::ClearOutOfBandPairingData( | |
266 const base::Closure& callback, | |
267 const ErrorCallback& error_callback) { | |
268 // TODO(keybuk): implement | |
269 error_callback.Run(); | |
270 } | |
271 | |
272 | |
273 void BluetoothDeviceExperimentalChromeOS::Release() { | |
274 DCHECK(agent_.get()); | |
275 DCHECK(pairing_delegate_); | |
276 VLOG(1) << object_path_.value() << ": Release"; | |
277 | |
278 pincode_callback_.Reset(); | |
279 passkey_callback_.Reset(); | |
280 confirmation_callback_.Reset(); | |
281 | |
282 UnregisterAgent(); | |
283 } | |
284 | |
285 void BluetoothDeviceExperimentalChromeOS::RequestPinCode( | |
286 const dbus::ObjectPath& device_path, | |
287 const PinCodeCallback& callback) { | |
288 DCHECK(agent_.get()); | |
289 DCHECK(device_path == object_path_); | |
290 VLOG(1) << object_path_.value() << ": RequestPinCode"; | |
291 | |
292 DCHECK(pairing_delegate_); | |
293 DCHECK(pincode_callback_.is_null()); | |
294 pincode_callback_ = callback; | |
295 pairing_delegate_->RequestPinCode(this); | |
296 } | |
297 | |
298 void BluetoothDeviceExperimentalChromeOS::DisplayPinCode( | |
299 const dbus::ObjectPath& device_path, | |
300 const std::string& pincode) { | |
301 DCHECK(agent_.get()); | |
302 DCHECK(device_path == object_path_); | |
303 VLOG(1) << object_path_.value() << ": DisplayPinCode: " << pincode; | |
304 | |
305 DCHECK(pairing_delegate_); | |
306 pairing_delegate_->DisplayPinCode(this, pincode); | |
307 } | |
308 | |
309 void BluetoothDeviceExperimentalChromeOS::RequestPasskey( | |
310 const dbus::ObjectPath& device_path, | |
311 const PasskeyCallback& callback) { | |
312 DCHECK(agent_.get()); | |
313 DCHECK(device_path == object_path_); | |
314 VLOG(1) << object_path_.value() << ": RequestPasskey"; | |
315 | |
316 DCHECK(pairing_delegate_); | |
317 DCHECK(passkey_callback_.is_null()); | |
318 passkey_callback_ = callback; | |
319 pairing_delegate_->RequestPasskey(this); | |
320 } | |
321 | |
322 void BluetoothDeviceExperimentalChromeOS::DisplayPasskey( | |
323 const dbus::ObjectPath& device_path, | |
324 uint32 passkey, int16 entered) { | |
325 DCHECK(agent_.get()); | |
326 DCHECK(device_path == object_path_); | |
327 VLOG(1) << object_path_.value() << ": DisplayPasskey: " << passkey | |
328 << " (" << entered << " entered)"; | |
329 | |
330 // TODO(keybuk): disambiguate entered vs display | |
331 if (entered > 0) | |
332 return; | |
333 | |
334 DCHECK(pairing_delegate_); | |
335 pairing_delegate_->DisplayPasskey(this, passkey); | |
336 } | |
337 | |
338 void BluetoothDeviceExperimentalChromeOS::RequestConfirmation( | |
339 const dbus::ObjectPath& device_path, | |
340 uint32 passkey, | |
341 const ConfirmationCallback& callback) { | |
342 DCHECK(agent_.get()); | |
343 DCHECK(device_path == object_path_); | |
344 VLOG(1) << object_path_.value() << ": RequestConfirmation: " << passkey; | |
345 | |
346 DCHECK(pairing_delegate_); | |
347 DCHECK(confirmation_callback_.is_null()); | |
348 confirmation_callback_ = callback; | |
349 pairing_delegate_->ConfirmPasskey(this, passkey); | |
350 } | |
351 | |
352 void BluetoothDeviceExperimentalChromeOS::RequestAuthorization( | |
353 const dbus::ObjectPath& device_path, | |
354 const ConfirmationCallback& callback) { | |
355 // TODO(keybuk): implement | |
356 callback.Run(CANCELLED); | |
357 } | |
358 | |
359 void BluetoothDeviceExperimentalChromeOS::AuthorizeService( | |
360 const dbus::ObjectPath& device_path, | |
361 const std::string& uuid, | |
362 const ConfirmationCallback& callback) { | |
363 // TODO(keybuk): implement | |
364 callback.Run(CANCELLED); | |
365 } | |
366 | |
367 void BluetoothDeviceExperimentalChromeOS::Cancel() { | |
368 DCHECK(agent_.get()); | |
369 VLOG(1) << object_path_.value() << ": Cancel"; | |
370 | |
371 DCHECK(pairing_delegate_); | |
372 pairing_delegate_->DismissDisplayOrConfirm(); | |
373 } | |
374 | |
375 void BluetoothDeviceExperimentalChromeOS::ConnectInternal( | |
376 const base::Closure& callback, | |
377 const ConnectErrorCallback& error_callback) { | |
378 VLOG(1) << object_path_.value() << ": Connecting"; | |
379 DBusThreadManager::Get()->GetExperimentalBluetoothDeviceClient()-> | |
380 Connect( | |
381 object_path_, | |
382 base::Bind( | |
383 &BluetoothDeviceExperimentalChromeOS::OnConnect, | |
384 weak_ptr_factory_.GetWeakPtr(), | |
385 callback), | |
386 base::Bind( | |
387 &BluetoothDeviceExperimentalChromeOS::OnConnectError, | |
388 weak_ptr_factory_.GetWeakPtr(), | |
389 error_callback)); | |
390 } | |
391 | |
392 void BluetoothDeviceExperimentalChromeOS::OnConnect( | |
393 const base::Closure& callback) { | |
394 --num_connecting_calls_; | |
395 DCHECK(num_connecting_calls_ >= 0); | |
396 VLOG(1) << object_path_.value() << ": Connected, " << num_connecting_calls_ | |
397 << " still in progress"; | |
398 | |
399 callback.Run(); | |
400 } | |
401 | |
402 void BluetoothDeviceExperimentalChromeOS::OnConnectError( | |
403 const ConnectErrorCallback& error_callback, | |
404 const std::string& error_name, | |
405 const std::string& error_message) { | |
406 --num_connecting_calls_; | |
407 DCHECK(num_connecting_calls_ >= 0); | |
408 LOG(WARNING) << object_path_.value() << ": Failed to connect device: " | |
409 << error_name << ": " << error_message; | |
410 VLOG(1) << object_path_.value() << ": " << num_connecting_calls_ | |
411 << " still in progress"; | |
412 | |
413 // Determine the error code from error_name. | |
414 ConnectErrorCode error_code = ERROR_UNKNOWN; | |
415 if (error_name == bluetooth_adapter::kErrorFailed) { | |
416 error_code = ERROR_FAILED; | |
417 } else if (error_name == bluetooth_adapter::kErrorInProgress) { | |
418 error_code = ERROR_INPROGRESS; | |
419 } else if (error_name == bluetooth_adapter::kErrorNotSupported) { | |
420 error_code = ERROR_UNSUPPORTED_DEVICE; | |
421 } | |
422 | |
423 error_callback.Run(error_code); | |
424 } | |
425 | |
426 void BluetoothDeviceExperimentalChromeOS::OnRegisterAgent( | |
427 const base::Closure& callback, | |
428 const ConnectErrorCallback& error_callback) { | |
429 VLOG(1) << object_path_.value() << ": Agent registered, now pairing"; | |
430 | |
431 DBusThreadManager::Get()->GetExperimentalBluetoothDeviceClient()-> | |
432 Pair(object_path_, | |
433 base::Bind( | |
434 &BluetoothDeviceExperimentalChromeOS::OnPair, | |
435 weak_ptr_factory_.GetWeakPtr(), | |
436 callback, error_callback), | |
437 base::Bind( | |
438 &BluetoothDeviceExperimentalChromeOS::OnPairError, | |
439 weak_ptr_factory_.GetWeakPtr(), | |
440 error_callback)); | |
441 } | |
442 | |
443 void BluetoothDeviceExperimentalChromeOS::OnRegisterAgentError( | |
444 const ConnectErrorCallback& error_callback, | |
445 const std::string& error_name, | |
446 const std::string& error_message) { | |
447 --num_connecting_calls_; | |
448 DCHECK(num_connecting_calls_ >= 0); | |
449 LOG(WARNING) << object_path_.value() << ": Failed to register agent: " | |
450 << error_name << ": " << error_message; | |
451 VLOG(1) << object_path_.value() << ": " << num_connecting_calls_ | |
452 << " still in progress"; | |
453 | |
454 UnregisterAgent(); | |
455 | |
456 // Determine the error code from error_name. | |
457 ConnectErrorCode error_code = ERROR_UNKNOWN; | |
458 if (error_name == bluetooth_adapter::kErrorAlreadyExists) | |
459 error_code = ERROR_INPROGRESS; | |
460 | |
461 error_callback.Run(error_code); | |
462 } | |
463 | |
464 void BluetoothDeviceExperimentalChromeOS::OnPair( | |
465 const base::Closure& callback, | |
466 const ConnectErrorCallback& error_callback) { | |
467 VLOG(1) << object_path_.value() << ": Paired"; | |
468 | |
469 // Now that we're paired, we need to set the device as trusted so that | |
470 // incoming connections will be accepted. This should only ever fail if | |
471 // the device is removed mid-pairing, so do it in the background while | |
472 // we connect and don't worry about errors. | |
473 DBusThreadManager::Get()->GetExperimentalBluetoothDeviceClient()-> | |
474 GetProperties(object_path_)->trusted.Set( | |
475 true, | |
476 base::Bind( | |
477 &BluetoothDeviceExperimentalChromeOS::OnSetTrusted, | |
478 weak_ptr_factory_.GetWeakPtr())); | |
479 | |
480 UnregisterAgent(); | |
481 | |
482 // Now we can connect to the device! | |
483 ConnectInternal(callback, error_callback); | |
484 } | |
485 | |
486 void BluetoothDeviceExperimentalChromeOS::OnPairError( | |
487 const ConnectErrorCallback& error_callback, | |
488 const std::string& error_name, | |
489 const std::string& error_message) { | |
490 --num_connecting_calls_; | |
491 DCHECK(num_connecting_calls_ >= 0); | |
492 LOG(WARNING) << object_path_.value() << ": Failed to pair device: " | |
493 << error_name << ": " << error_message; | |
494 VLOG(1) << object_path_.value() << ": " << num_connecting_calls_ | |
495 << " still in progress"; | |
496 | |
497 UnregisterAgent(); | |
498 | |
499 // Determine the error code from error_name. | |
500 ConnectErrorCode error_code = ERROR_UNKNOWN; | |
501 if (error_name == bluetooth_adapter::kErrorConnectionAttemptFailed) { | |
502 error_code = ERROR_FAILED; | |
503 } else if (error_name == bluetooth_adapter::kErrorAuthenticationFailed) { | |
504 error_code = ERROR_AUTH_FAILED; | |
505 } else if (error_name == bluetooth_adapter::kErrorAuthenticationCanceled) { | |
506 error_code = ERROR_AUTH_CANCELED; | |
507 } else if (error_name == bluetooth_adapter::kErrorAuthenticationRejected) { | |
508 error_code = ERROR_AUTH_REJECTED; | |
509 } else if (error_name == bluetooth_adapter::kErrorAuthenticationTimeout) { | |
510 error_code = ERROR_AUTH_TIMEOUT; | |
511 } | |
512 | |
513 error_callback.Run(error_code); | |
514 } | |
515 | |
516 void BluetoothDeviceExperimentalChromeOS::OnCancelPairingError( | |
517 const std::string& error_name, | |
518 const std::string& error_message) { | |
519 LOG(WARNING) << object_path_.value() << ": Failed to cancel pairing: " | |
520 << error_name << ": " << error_message; | |
521 } | |
522 | |
523 void BluetoothDeviceExperimentalChromeOS::OnSetTrusted(bool success) { | |
524 LOG_IF(WARNING, !success) << object_path_.value() | |
525 << ": Failed to set device as trusted"; | |
526 } | |
527 | |
528 void BluetoothDeviceExperimentalChromeOS::UnregisterAgent() { | |
529 DCHECK(agent_.get()); | |
530 DCHECK(pairing_delegate_); | |
531 | |
532 DCHECK(pincode_callback_.is_null()); | |
533 DCHECK(passkey_callback_.is_null()); | |
534 DCHECK(confirmation_callback_.is_null()); | |
535 | |
536 pairing_delegate_->DismissDisplayOrConfirm(); | |
537 pairing_delegate_ = NULL; | |
538 | |
539 agent_.reset(); | |
540 | |
541 // Clean up after ourselves. | |
542 VLOG(1) << object_path_.value() << ": Unregistering pairing agent"; | |
543 DBusThreadManager::Get()->GetExperimentalBluetoothAgentManagerClient()-> | |
544 UnregisterAgent( | |
545 dbus::ObjectPath(kAgentPath), | |
546 base::Bind(&base::DoNothing), | |
547 base::Bind( | |
548 &BluetoothDeviceExperimentalChromeOS::OnUnregisterAgentError, | |
549 weak_ptr_factory_.GetWeakPtr())); | |
550 } | |
551 | |
552 void BluetoothDeviceExperimentalChromeOS::OnUnregisterAgentError( | |
553 const std::string& error_name, | |
554 const std::string& error_message) { | |
555 LOG(WARNING) << object_path_.value() << ": Failed to unregister agent: " | |
556 << error_name << ": " << error_message; | |
557 } | |
558 | |
559 void BluetoothDeviceExperimentalChromeOS::OnDisconnect( | |
560 const base::Closure& callback) { | |
561 VLOG(1) << object_path_.value() << ": Disconnected"; | |
562 callback.Run(); | |
563 } | |
564 | |
565 void BluetoothDeviceExperimentalChromeOS::OnDisconnectError( | |
566 const ErrorCallback& error_callback, | |
567 const std::string& error_name, | |
568 const std::string& error_message) { | |
569 LOG(WARNING) << object_path_.value() << ": Failed to disconnect device: " | |
570 << error_name << ": " << error_message; | |
571 error_callback.Run(); | |
572 } | |
573 | |
574 void BluetoothDeviceExperimentalChromeOS::OnForgetError( | |
575 const ErrorCallback& error_callback, | |
576 const std::string& error_name, | |
577 const std::string& error_message) { | |
578 LOG(WARNING) << object_path_.value() << ": Failed to remove device: " | |
579 << error_name << ": " << error_message; | |
580 error_callback.Run(); | |
581 } | |
582 | |
583 bool BluetoothDeviceExperimentalChromeOS::RunPairingCallbacks(Status status) { | |
584 if (!agent_.get()) | |
585 return false; | |
586 | |
587 bool have_callback = false; | |
satorux1
2013/04/18 00:36:28
I found it slightly confusing as we'll reset callb
keybuk
2013/04/18 00:40:55
Done.
artifact of consolidating into one function
| |
588 if (!pincode_callback_.is_null()) { | |
589 pincode_callback_.Run(status, ""); | |
590 pincode_callback_.Reset(); | |
591 have_callback = true; | |
592 } | |
593 | |
594 if (!passkey_callback_.is_null()) { | |
595 passkey_callback_.Run(status, 0); | |
596 passkey_callback_.Reset(); | |
597 have_callback = true; | |
598 } | |
599 | |
600 if (!confirmation_callback_.is_null()) { | |
601 confirmation_callback_.Run(status); | |
602 confirmation_callback_.Reset(); | |
603 have_callback = true; | |
604 } | |
605 | |
606 return have_callback; | |
607 } | |
608 | |
609 } // namespace chromeos | |
OLD | NEW |