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

Side by Side Diff: device/bluetooth/bluetooth_device_experimental_chromeos.cc

Issue 14225017: Bluetooth: treat unpairable devices as Trusted/Paired (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Forget() change was unneeded, keep the unit test though Created 7 years, 8 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) 2013 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 "device/bluetooth/bluetooth_device_experimental_chromeos.h" 5 #include "device/bluetooth/bluetooth_device_experimental_chromeos.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "chromeos/dbus/dbus_thread_manager.h" 8 #include "chromeos/dbus/dbus_thread_manager.h"
9 #include "chromeos/dbus/experimental_bluetooth_adapter_client.h" 9 #include "chromeos/dbus/experimental_bluetooth_adapter_client.h"
10 #include "chromeos/dbus/experimental_bluetooth_agent_manager_client.h" 10 #include "chromeos/dbus/experimental_bluetooth_agent_manager_client.h"
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
67 67
68 return properties->address.value(); 68 return properties->address.value();
69 } 69 }
70 70
71 bool BluetoothDeviceExperimentalChromeOS::IsPaired() const { 71 bool BluetoothDeviceExperimentalChromeOS::IsPaired() const {
72 ExperimentalBluetoothDeviceClient::Properties* properties = 72 ExperimentalBluetoothDeviceClient::Properties* properties =
73 DBusThreadManager::Get()->GetExperimentalBluetoothDeviceClient()-> 73 DBusThreadManager::Get()->GetExperimentalBluetoothDeviceClient()->
74 GetProperties(object_path_); 74 GetProperties(object_path_);
75 DCHECK(properties); 75 DCHECK(properties);
76 76
77 return properties->paired.value(); 77 // Trusted devices are devices that don't support pairing but that the
78 // user has explicitly connected; it makes no sense for UI purposes to
79 // treat them differently from each other.
80 return properties->paired.value() || properties->trusted.value();
78 } 81 }
79 82
80 bool BluetoothDeviceExperimentalChromeOS::IsConnected() const { 83 bool BluetoothDeviceExperimentalChromeOS::IsConnected() const {
81 ExperimentalBluetoothDeviceClient::Properties* properties = 84 ExperimentalBluetoothDeviceClient::Properties* properties =
82 DBusThreadManager::Get()->GetExperimentalBluetoothDeviceClient()-> 85 DBusThreadManager::Get()->GetExperimentalBluetoothDeviceClient()->
83 GetProperties(object_path_); 86 GetProperties(object_path_);
84 DCHECK(properties); 87 DCHECK(properties);
85 88
86 return properties->connected.value(); 89 return properties->connected.value();
87 } 90 }
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
132 } 135 }
133 136
134 void BluetoothDeviceExperimentalChromeOS::Connect( 137 void BluetoothDeviceExperimentalChromeOS::Connect(
135 BluetoothDevice::PairingDelegate* pairing_delegate, 138 BluetoothDevice::PairingDelegate* pairing_delegate,
136 const base::Closure& callback, 139 const base::Closure& callback,
137 const ConnectErrorCallback& error_callback) { 140 const ConnectErrorCallback& error_callback) {
138 ++num_connecting_calls_; 141 ++num_connecting_calls_;
139 VLOG(1) << object_path_.value() << ": Connecting, " << num_connecting_calls_ 142 VLOG(1) << object_path_.value() << ": Connecting, " << num_connecting_calls_
140 << " in progress"; 143 << " in progress";
141 144
142 if (IsPaired() || IsConnected() || !pairing_delegate) { 145 if (IsPaired() || IsConnected() || !pairing_delegate || !IsPairable()) {
143 // No need to pair, skip straight to connection. 146 // No need to pair, or unable to, skip straight to connection.
144 ConnectInternal(callback, error_callback); 147 ConnectInternal(callback, error_callback);
145 } else { 148 } else {
146 // Initiate high-security connection with pairing. 149 // Initiate high-security connection with pairing.
147 DCHECK(!pairing_delegate_); 150 DCHECK(!pairing_delegate_);
148 DCHECK(agent_.get() == NULL); 151 DCHECK(agent_.get() == NULL);
149 152
150 pairing_delegate_ = pairing_delegate; 153 pairing_delegate_ = pairing_delegate;
151 154
152 // The agent path is relatively meaningless since BlueZ only supports 155 // The agent path is relatively meaningless since BlueZ only supports
153 // one per application at a time. 156 // one per application at a time.
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
230 base::Bind( 233 base::Bind(
231 &BluetoothDeviceExperimentalChromeOS::OnDisconnectError, 234 &BluetoothDeviceExperimentalChromeOS::OnDisconnectError,
232 weak_ptr_factory_.GetWeakPtr(), 235 weak_ptr_factory_.GetWeakPtr(),
233 error_callback)); 236 error_callback));
234 } 237 }
235 238
236 void BluetoothDeviceExperimentalChromeOS::Forget( 239 void BluetoothDeviceExperimentalChromeOS::Forget(
237 const ErrorCallback& error_callback) { 240 const ErrorCallback& error_callback) {
238 VLOG(1) << object_path_.value() << ": Removing device"; 241 VLOG(1) << object_path_.value() << ": Removing device";
239 DBusThreadManager::Get()->GetExperimentalBluetoothAdapterClient()-> 242 DBusThreadManager::Get()->GetExperimentalBluetoothAdapterClient()->
240 RemoveDevice( 243 RemoveDevice(
deymo 2013/04/18 18:41:11 This block should have 4-space indentation instead
241 adapter_->object_path_, 244 adapter_->object_path_,
242 object_path_, 245 object_path_,
243 base::Bind(&base::DoNothing), 246 base::Bind(&base::DoNothing),
244 base::Bind( 247 base::Bind(
245 &BluetoothDeviceExperimentalChromeOS::OnForgetError, 248 &BluetoothDeviceExperimentalChromeOS::OnForgetError,
246 weak_ptr_factory_.GetWeakPtr(), 249 weak_ptr_factory_.GetWeakPtr(),
247 error_callback)); 250 error_callback));
248 } 251 }
249 252
250 void BluetoothDeviceExperimentalChromeOS::ConnectToService( 253 void BluetoothDeviceExperimentalChromeOS::ConnectToService(
251 const std::string& service_uuid, 254 const std::string& service_uuid,
252 const SocketCallback& callback) { 255 const SocketCallback& callback) {
253 // TODO(keybuk): implement 256 // TODO(keybuk): implement
254 callback.Run(scoped_refptr<device::BluetoothSocket>()); 257 callback.Run(scoped_refptr<device::BluetoothSocket>());
255 } 258 }
256 259
257 void BluetoothDeviceExperimentalChromeOS::SetOutOfBandPairingData( 260 void BluetoothDeviceExperimentalChromeOS::SetOutOfBandPairingData(
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
389 error_callback)); 392 error_callback));
390 } 393 }
391 394
392 void BluetoothDeviceExperimentalChromeOS::OnConnect( 395 void BluetoothDeviceExperimentalChromeOS::OnConnect(
393 const base::Closure& callback) { 396 const base::Closure& callback) {
394 --num_connecting_calls_; 397 --num_connecting_calls_;
395 DCHECK(num_connecting_calls_ >= 0); 398 DCHECK(num_connecting_calls_ >= 0);
396 VLOG(1) << object_path_.value() << ": Connected, " << num_connecting_calls_ 399 VLOG(1) << object_path_.value() << ": Connected, " << num_connecting_calls_
397 << " still in progress"; 400 << " still in progress";
398 401
402 SetTrusted();
403
399 callback.Run(); 404 callback.Run();
400 } 405 }
401 406
402 void BluetoothDeviceExperimentalChromeOS::OnConnectError( 407 void BluetoothDeviceExperimentalChromeOS::OnConnectError(
403 const ConnectErrorCallback& error_callback, 408 const ConnectErrorCallback& error_callback,
404 const std::string& error_name, 409 const std::string& error_name,
405 const std::string& error_message) { 410 const std::string& error_message) {
406 --num_connecting_calls_; 411 --num_connecting_calls_;
407 DCHECK(num_connecting_calls_ >= 0); 412 DCHECK(num_connecting_calls_ >= 0);
408 LOG(WARNING) << object_path_.value() << ": Failed to connect device: " 413 LOG(WARNING) << object_path_.value() << ": Failed to connect device: "
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
458 if (error_name == bluetooth_adapter::kErrorAlreadyExists) 463 if (error_name == bluetooth_adapter::kErrorAlreadyExists)
459 error_code = ERROR_INPROGRESS; 464 error_code = ERROR_INPROGRESS;
460 465
461 error_callback.Run(error_code); 466 error_callback.Run(error_code);
462 } 467 }
463 468
464 void BluetoothDeviceExperimentalChromeOS::OnPair( 469 void BluetoothDeviceExperimentalChromeOS::OnPair(
465 const base::Closure& callback, 470 const base::Closure& callback,
466 const ConnectErrorCallback& error_callback) { 471 const ConnectErrorCallback& error_callback) {
467 VLOG(1) << object_path_.value() << ": Paired"; 472 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(); 473 UnregisterAgent();
481 474 SetTrusted();
482 // Now we can connect to the device!
483 ConnectInternal(callback, error_callback); 475 ConnectInternal(callback, error_callback);
484 } 476 }
485 477
486 void BluetoothDeviceExperimentalChromeOS::OnPairError( 478 void BluetoothDeviceExperimentalChromeOS::OnPairError(
487 const ConnectErrorCallback& error_callback, 479 const ConnectErrorCallback& error_callback,
488 const std::string& error_name, 480 const std::string& error_name,
489 const std::string& error_message) { 481 const std::string& error_message) {
490 --num_connecting_calls_; 482 --num_connecting_calls_;
491 DCHECK(num_connecting_calls_ >= 0); 483 DCHECK(num_connecting_calls_ >= 0);
492 LOG(WARNING) << object_path_.value() << ": Failed to pair device: " 484 LOG(WARNING) << object_path_.value() << ": Failed to pair device: "
(...skipping 20 matching lines...) Expand all
513 error_callback.Run(error_code); 505 error_callback.Run(error_code);
514 } 506 }
515 507
516 void BluetoothDeviceExperimentalChromeOS::OnCancelPairingError( 508 void BluetoothDeviceExperimentalChromeOS::OnCancelPairingError(
517 const std::string& error_name, 509 const std::string& error_name,
518 const std::string& error_message) { 510 const std::string& error_message) {
519 LOG(WARNING) << object_path_.value() << ": Failed to cancel pairing: " 511 LOG(WARNING) << object_path_.value() << ": Failed to cancel pairing: "
520 << error_name << ": " << error_message; 512 << error_name << ": " << error_message;
521 } 513 }
522 514
515 void BluetoothDeviceExperimentalChromeOS::SetTrusted() {
516 // Unconditionally send the property change, rather than checking the value
517 // first; there's no harm in doing this and it solves any race conditions
518 // with the property becoming true or false and this call happening before
519 // we get the D-Bus signal about the earlier change.
520 DBusThreadManager::Get()->GetExperimentalBluetoothDeviceClient()->
521 GetProperties(object_path_)->trusted.Set(
522 true,
523 base::Bind(
524 &BluetoothDeviceExperimentalChromeOS::OnSetTrusted,
525 weak_ptr_factory_.GetWeakPtr()));
526 }
527
523 void BluetoothDeviceExperimentalChromeOS::OnSetTrusted(bool success) { 528 void BluetoothDeviceExperimentalChromeOS::OnSetTrusted(bool success) {
524 LOG_IF(WARNING, !success) << object_path_.value() 529 LOG_IF(WARNING, !success) << object_path_.value()
525 << ": Failed to set device as trusted"; 530 << "Failed to set device as trusted";
deymo 2013/04/18 18:41:11 Please insert a space before "Failed ..." in the o
526 } 531 }
527 532
528 void BluetoothDeviceExperimentalChromeOS::UnregisterAgent() { 533 void BluetoothDeviceExperimentalChromeOS::UnregisterAgent() {
529 DCHECK(agent_.get()); 534 DCHECK(agent_.get());
530 DCHECK(pairing_delegate_); 535 DCHECK(pairing_delegate_);
531 536
532 DCHECK(pincode_callback_.is_null()); 537 DCHECK(pincode_callback_.is_null());
533 DCHECK(passkey_callback_.is_null()); 538 DCHECK(passkey_callback_.is_null());
534 DCHECK(confirmation_callback_.is_null()); 539 DCHECK(confirmation_callback_.is_null());
535 540
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
600 if (!confirmation_callback_.is_null()) { 605 if (!confirmation_callback_.is_null()) {
601 confirmation_callback_.Run(status); 606 confirmation_callback_.Run(status);
602 confirmation_callback_.Reset(); 607 confirmation_callback_.Reset();
603 callback_run = true; 608 callback_run = true;
604 } 609 }
605 610
606 return callback_run; 611 return callback_run;
607 } 612 }
608 613
609 } // namespace chromeos 614 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698