OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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_chromeos.h" | 5 #include "device/bluetooth/bluetooth_device_chromeos.h" |
6 | 6 |
7 #include <map> | 7 #include <map> |
8 #include <string> | 8 #include <string> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
43 void DoNothingServiceRecordList(const BluetoothDevice::ServiceRecordList&) {} | 43 void DoNothingServiceRecordList(const BluetoothDevice::ServiceRecordList&) {} |
44 | 44 |
45 } // namespace | 45 } // namespace |
46 | 46 |
47 namespace chromeos { | 47 namespace chromeos { |
48 | 48 |
49 BluetoothDeviceChromeOS::BluetoothDeviceChromeOS( | 49 BluetoothDeviceChromeOS::BluetoothDeviceChromeOS( |
50 BluetoothAdapterChromeOS* adapter) | 50 BluetoothAdapterChromeOS* adapter) |
51 : BluetoothDevice(), | 51 : BluetoothDevice(), |
52 adapter_(adapter), | 52 adapter_(adapter), |
| 53 bluetooth_class_(0), |
| 54 paired_(false), |
| 55 connected_(false), |
| 56 connectable_(true), |
| 57 connecting_(false), |
53 pairing_delegate_(NULL), | 58 pairing_delegate_(NULL), |
54 connecting_applications_counter_(0), | 59 connecting_applications_counter_(0), |
55 connecting_calls_(0), | 60 connecting_calls_(0), |
56 service_records_loaded_(false), | 61 service_records_loaded_(false), |
57 weak_ptr_factory_(this) { | 62 weak_ptr_factory_(this) { |
58 } | 63 } |
59 | 64 |
60 BluetoothDeviceChromeOS::~BluetoothDeviceChromeOS() { | 65 BluetoothDeviceChromeOS::~BluetoothDeviceChromeOS() { |
61 } | 66 } |
62 | 67 |
63 bool BluetoothDeviceChromeOS::IsPaired() const { | 68 uint32 BluetoothDeviceChromeOS::GetBluetoothClass() const { |
64 return !object_path_.value().empty(); | 69 return bluetooth_class_; |
65 } | 70 } |
66 | 71 |
67 const BluetoothDevice::ServiceList& | 72 std::string BluetoothDeviceChromeOS::GetDeviceName() const { |
| 73 return name_; |
| 74 } |
| 75 |
| 76 std::string BluetoothDeviceChromeOS::GetAddress() const { |
| 77 return address_; |
| 78 } |
| 79 |
| 80 bool BluetoothDeviceChromeOS::IsPaired() const { |
| 81 return paired_; |
| 82 } |
| 83 |
| 84 bool BluetoothDeviceChromeOS::IsConnected() const { |
| 85 return connected_; |
| 86 } |
| 87 |
| 88 bool BluetoothDeviceChromeOS::IsConnectable() const { |
| 89 return connectable_; |
| 90 } |
| 91 |
| 92 bool BluetoothDeviceChromeOS::IsConnecting() const { |
| 93 return connecting_; |
| 94 } |
| 95 |
| 96 BluetoothDeviceChromeOS::ServiceList |
68 BluetoothDeviceChromeOS::GetServices() const { | 97 BluetoothDeviceChromeOS::GetServices() const { |
69 return service_uuids_; | 98 return service_uuids_; |
70 } | 99 } |
71 | 100 |
72 void BluetoothDeviceChromeOS::GetServiceRecords( | 101 void BluetoothDeviceChromeOS::GetServiceRecords( |
73 const ServiceRecordsCallback& callback, | 102 const ServiceRecordsCallback& callback, |
74 const ErrorCallback& error_callback) { | 103 const ErrorCallback& error_callback) { |
75 DBusThreadManager::Get()->GetBluetoothDeviceClient()-> | 104 DBusThreadManager::Get()->GetBluetoothDeviceClient()-> |
76 DiscoverServices( | 105 DiscoverServices( |
77 object_path_, | 106 object_path_, |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
122 // Set the decrement to be issued when either callback is called. | 151 // Set the decrement to be issued when either callback is called. |
123 base::Closure wrapped_callback = base::Bind( | 152 base::Closure wrapped_callback = base::Bind( |
124 &BluetoothDeviceChromeOS::OnConnectCallbackCalled, | 153 &BluetoothDeviceChromeOS::OnConnectCallbackCalled, |
125 weak_ptr_factory_.GetWeakPtr(), | 154 weak_ptr_factory_.GetWeakPtr(), |
126 callback); | 155 callback); |
127 ConnectErrorCallback wrapped_error_callback = base::Bind( | 156 ConnectErrorCallback wrapped_error_callback = base::Bind( |
128 &BluetoothDeviceChromeOS::OnConnectErrorCallbackCalled, | 157 &BluetoothDeviceChromeOS::OnConnectErrorCallbackCalled, |
129 weak_ptr_factory_.GetWeakPtr(), | 158 weak_ptr_factory_.GetWeakPtr(), |
130 error_callback); | 159 error_callback); |
131 | 160 |
132 if (IsPaired() || IsBonded() || IsConnected()) { | 161 if (IsPaired() || IsConnected()) { |
133 // Connection to already paired or connected device. | 162 // Connection to already paired or connected device. |
134 ConnectApplications(wrapped_callback, wrapped_error_callback); | 163 ConnectApplications(wrapped_callback, wrapped_error_callback); |
135 | 164 |
136 } else if (!pairing_delegate) { | 165 } else if (!pairing_delegate) { |
137 // No pairing delegate supplied, initiate low-security connection only. | 166 // No pairing delegate supplied, initiate low-security connection only. |
138 DBusThreadManager::Get()->GetBluetoothAdapterClient()-> | 167 DBusThreadManager::Get()->GetBluetoothAdapterClient()-> |
139 CreateDevice(adapter_->object_path_, | 168 CreateDevice(adapter_->object_path_, |
140 address_, | 169 address_, |
141 base::Bind(&BluetoothDeviceChromeOS::OnCreateDevice, | 170 base::Bind(&BluetoothDeviceChromeOS::OnCreateDevice, |
142 weak_ptr_factory_.GetWeakPtr(), | 171 weak_ptr_factory_.GetWeakPtr(), |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
294 callback)); | 323 callback)); |
295 } | 324 } |
296 | 325 |
297 void BluetoothDeviceChromeOS::SetOutOfBandPairingData( | 326 void BluetoothDeviceChromeOS::SetOutOfBandPairingData( |
298 const BluetoothOutOfBandPairingData& data, | 327 const BluetoothOutOfBandPairingData& data, |
299 const base::Closure& callback, | 328 const base::Closure& callback, |
300 const ErrorCallback& error_callback) { | 329 const ErrorCallback& error_callback) { |
301 DBusThreadManager::Get()->GetBluetoothOutOfBandClient()-> | 330 DBusThreadManager::Get()->GetBluetoothOutOfBandClient()-> |
302 AddRemoteData( | 331 AddRemoteData( |
303 object_path_, | 332 object_path_, |
304 address(), | 333 address_, |
305 data, | 334 data, |
306 base::Bind(&BluetoothDeviceChromeOS::OnRemoteDataCallback, | 335 base::Bind(&BluetoothDeviceChromeOS::OnRemoteDataCallback, |
307 weak_ptr_factory_.GetWeakPtr(), | 336 weak_ptr_factory_.GetWeakPtr(), |
308 callback, | 337 callback, |
309 error_callback)); | 338 error_callback)); |
310 } | 339 } |
311 | 340 |
312 void BluetoothDeviceChromeOS::ClearOutOfBandPairingData( | 341 void BluetoothDeviceChromeOS::ClearOutOfBandPairingData( |
313 const base::Closure& callback, | 342 const base::Closure& callback, |
314 const ErrorCallback& error_callback) { | 343 const ErrorCallback& error_callback) { |
315 DBusThreadManager::Get()->GetBluetoothOutOfBandClient()-> | 344 DBusThreadManager::Get()->GetBluetoothOutOfBandClient()-> |
316 RemoveRemoteData( | 345 RemoveRemoteData( |
317 object_path_, | 346 object_path_, |
318 address(), | 347 address_, |
319 base::Bind(&BluetoothDeviceChromeOS::OnRemoteDataCallback, | 348 base::Bind(&BluetoothDeviceChromeOS::OnRemoteDataCallback, |
320 weak_ptr_factory_.GetWeakPtr(), | 349 weak_ptr_factory_.GetWeakPtr(), |
321 callback, | 350 callback, |
322 error_callback)); | 351 error_callback)); |
323 } | 352 } |
324 | 353 |
325 void BluetoothDeviceChromeOS::SetObjectPath( | 354 void BluetoothDeviceChromeOS::SetObjectPath( |
326 const dbus::ObjectPath& object_path) { | 355 const dbus::ObjectPath& object_path) { |
327 DCHECK(object_path_ == dbus::ObjectPath("")); | 356 DCHECK(object_path_ == dbus::ObjectPath("")); |
328 object_path_ = object_path; | 357 object_path_ = object_path; |
(...skipping 24 matching lines...) Expand all Loading... |
353 } | 382 } |
354 | 383 |
355 if (update_state) { | 384 if (update_state) { |
356 // When the device reconnects and we don't have any service records for it, | 385 // When the device reconnects and we don't have any service records for it, |
357 // try to update the cache or fail silently. | 386 // try to update the cache or fail silently. |
358 if (!service_records_loaded_ && !connected_ && | 387 if (!service_records_loaded_ && !connected_ && |
359 properties->connected.value()) | 388 properties->connected.value()) |
360 GetServiceRecords(base::Bind(&DoNothingServiceRecordList), | 389 GetServiceRecords(base::Bind(&DoNothingServiceRecordList), |
361 base::Bind(&base::DoNothing)); | 390 base::Bind(&base::DoNothing)); |
362 | 391 |
363 // BlueZ uses paired to mean link keys exchanged, whereas the Bluetooth | 392 paired_ = properties->paired.value(); |
364 // spec refers to this as bonded. Use the spec name for our interface. | |
365 bonded_ = properties->paired.value(); | |
366 connected_ = properties->connected.value(); | 393 connected_ = properties->connected.value(); |
367 } | 394 } |
368 } | 395 } |
369 | 396 |
370 void BluetoothDeviceChromeOS::OnCreateDevice( | 397 void BluetoothDeviceChromeOS::OnCreateDevice( |
371 const base::Closure& callback, | 398 const base::Closure& callback, |
372 const ConnectErrorCallback& error_callback, | 399 const ConnectErrorCallback& error_callback, |
373 const dbus::ObjectPath& device_path) { | 400 const dbus::ObjectPath& device_path) { |
374 VLOG(1) << "Connection successful: " << device_path.value(); | 401 VLOG(1) << "Connection successful: " << device_path.value(); |
375 if (object_path_.value().empty()) { | 402 if (object_path_.value().empty()) { |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
447 // callback, so it is safe to delete the previous objects here. | 474 // callback, so it is safe to delete the previous objects here. |
448 service_records_.clear(); | 475 service_records_.clear(); |
449 // TODO(deymo): Perhaps don't update the cache if the new SDP information is | 476 // TODO(deymo): Perhaps don't update the cache if the new SDP information is |
450 // empty and we had something before. Some devices only answer this | 477 // empty and we had something before. Some devices only answer this |
451 // information while paired, and this callback could be called in any order if | 478 // information while paired, and this callback could be called in any order if |
452 // several calls to GetServiceRecords are made while initial pairing with the | 479 // several calls to GetServiceRecords are made while initial pairing with the |
453 // device. This requires more investigation. | 480 // device. This requires more investigation. |
454 for (BluetoothDeviceClient::ServiceMap::const_iterator i = | 481 for (BluetoothDeviceClient::ServiceMap::const_iterator i = |
455 service_map.begin(); i != service_map.end(); ++i) { | 482 service_map.begin(); i != service_map.end(); ++i) { |
456 service_records_.push_back( | 483 service_records_.push_back( |
457 new BluetoothServiceRecordChromeOS(address(), i->second)); | 484 new BluetoothServiceRecordChromeOS(address_, i->second)); |
458 } | 485 } |
459 service_records_loaded_ = true; | 486 service_records_loaded_ = true; |
460 | 487 |
461 callback.Run(service_records_); | 488 callback.Run(service_records_); |
462 } | 489 } |
463 | 490 |
464 void BluetoothDeviceChromeOS::OnSetTrusted(bool success) { | 491 void BluetoothDeviceChromeOS::OnSetTrusted(bool success) { |
465 LOG_IF(WARNING, !success) << "Failed to set device as trusted: " << address_; | 492 LOG_IF(WARNING, !success) << "Failed to set device as trusted: " << address_; |
466 } | 493 } |
467 | 494 |
(...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
821 } | 848 } |
822 | 849 |
823 | 850 |
824 // static | 851 // static |
825 BluetoothDeviceChromeOS* BluetoothDeviceChromeOS::Create( | 852 BluetoothDeviceChromeOS* BluetoothDeviceChromeOS::Create( |
826 BluetoothAdapterChromeOS* adapter) { | 853 BluetoothAdapterChromeOS* adapter) { |
827 return new BluetoothDeviceChromeOS(adapter); | 854 return new BluetoothDeviceChromeOS(adapter); |
828 } | 855 } |
829 | 856 |
830 } // namespace chromeos | 857 } // namespace chromeos |
OLD | NEW |