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

Unified Diff: device/bluetooth/bluetooth_device_chromeos.cc

Issue 12310048: Bluetooth: Add a "connectable" property to the BluetoothDevice. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Created 7 years, 10 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 side-by-side diff with in-line comments
Download patch
Index: device/bluetooth/bluetooth_device_chromeos.cc
diff --git a/device/bluetooth/bluetooth_device_chromeos.cc b/device/bluetooth/bluetooth_device_chromeos.cc
index 996fb23a0c9b83a2e67fd57f82dcac1a7f171662..b3fa8d073ff18921c7fa1fbcfa512ce443e4eb18 100644
--- a/device/bluetooth/bluetooth_device_chromeos.cc
+++ b/device/bluetooth/bluetooth_device_chromeos.cc
@@ -46,6 +46,7 @@ BluetoothDeviceChromeOS::BluetoothDeviceChromeOS(
adapter_(adapter),
pairing_delegate_(NULL),
connecting_applications_counter_(0),
+ service_records_loaded_(false),
weak_ptr_factory_(this) {
}
@@ -64,6 +65,16 @@ BluetoothDeviceChromeOS::GetServices() const {
void BluetoothDeviceChromeOS::GetServiceRecords(
const ServiceRecordsCallback& callback,
const ErrorCallback& error_callback) {
+ if (service_records_loaded_) {
+ callback.Run(service_records_);
+ } else {
+ UpdateServiceRecords(callback, error_callback);
+ }
keybuk 2013/02/21 21:08:58 One of the reasons that GetServiceRecords() always
deymo 2013/02/22 23:09:09 Done.
+}
+
+void BluetoothDeviceChromeOS::UpdateServiceRecords(
+ const ServiceRecordsCallback& callback,
+ const ErrorCallback& error_callback) {
DBusThreadManager::Get()->GetBluetoothDeviceClient()->
DiscoverServices(
object_path_,
@@ -371,9 +382,7 @@ void BluetoothDeviceChromeOS::OnCreateDevice(
base::Bind(&BluetoothDeviceChromeOS::OnSetTrusted,
weak_ptr_factory_.GetWeakPtr(),
callback,
- base::Bind(error_callback,
- ERROR_UNKNOWN)));
- // TODO(deymo): Replace ERROR_UNKNOWN with an appropriate new constant.
+ error_callback));
// Connect application-layer protocols.
ConnectApplications(callback, error_callback);
@@ -416,26 +425,55 @@ void BluetoothDeviceChromeOS::CollectServiceRecordsCallback(
return;
}
- ScopedVector<BluetoothServiceRecord> records;
+ // Update the cache.
+ service_records_loaded_ = true;
+ service_records_.clear();
keybuk 2013/02/21 21:08:58 This gives a time period where another thread woul
deymo 2013/02/22 23:09:09 As discussed, this is ok.
keybuk 2013/02/22 23:50:03 after discussion, this seems okay - since all BDCO
+ // TODO(deymo): Perhaps don't update the cache if the new SDP information is
+ // empty and we had something before. Some devices only answer this
+ // information while paired. This requires more investigation.
for (BluetoothDeviceClient::ServiceMap::const_iterator i =
service_map.begin(); i != service_map.end(); ++i) {
- records.push_back(
+ service_records_.push_back(
new BluetoothServiceRecordChromeOS(address(), i->second));
}
- callback.Run(records);
+ callback.Run(service_records_);
}
-void BluetoothDeviceChromeOS::OnSetTrusted(const base::Closure& callback,
- const ErrorCallback& error_callback,
- bool success) {
+void BluetoothDeviceChromeOS::OnSetTrusted(
+ const base::Closure& callback,
+ const ConnectErrorCallback& error_callback,
+ bool success) {
if (success) {
- callback.Run();
+ UpdateServiceRecords(
+ base::Bind(&BluetoothDeviceChromeOS::OnServicesUpdatedAfterPair,
+ weak_ptr_factory_.GetWeakPtr(),
+ callback),
+ base::Bind(error_callback, ERROR_SDP_FAILED));
keybuk 2013/02/21 21:08:58 Could failure be handled better here? This adds an
deymo 2013/02/22 23:09:09 Not having the SDP information is not a "fatal" co
} else {
LOG(WARNING) << "Failed to set device as trusted: " << address_;
- error_callback.Run();
+ error_callback.Run(ERROR_UNKNOWN);
+ // TODO(deymo): Replace ERROR_UNKNOWN with an appropriate new constant.
}
}
+void BluetoothDeviceChromeOS::OnServicesUpdatedAfterPair(
+ const base::Closure& callback,
+ const ServiceRecordList& list) {
+ // Update the BluetoothDevice::connectable_ property.
keybuk 2013/02/21 21:08:58 nit: a comment explaining the boolean logic would
deymo 2013/02/22 23:09:09 We have a simplification of the device here. We ha
+ bool hid_normally_connectable = true;
+ bool hid_reconnect_initiate = true;
+ for (ServiceRecordList::const_iterator it = list.begin();
+ it != list.end(); ++it) {
+ hid_normally_connectable =
+ hid_normally_connectable && (*it)->hid_normally_connectable();
+ hid_reconnect_initiate =
+ hid_reconnect_initiate && (*it)->hid_reconnect_initiate();
+ }
+ connectable_ = hid_normally_connectable || !hid_reconnect_initiate;
+
+ callback.Run();
+}
+
void BluetoothDeviceChromeOS::ConnectApplications(
const base::Closure& callback,
const ConnectErrorCallback& error_callback) {

Powered by Google App Engine
This is Rietveld 408576698