OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 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_adapter_chromeos.h" | 5 #include "device/bluetooth/bluetooth_adapter_chromeos.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/location.h" | 10 #include "base/location.h" |
11 #include "base/logging.h" | 11 #include "base/logging.h" |
12 #include "base/metrics/histogram.h" | 12 #include "base/metrics/histogram.h" |
13 #include "base/sequenced_task_runner.h" | 13 #include "base/sequenced_task_runner.h" |
14 #include "base/single_thread_task_runner.h" | 14 #include "base/single_thread_task_runner.h" |
15 #include "base/sys_info.h" | 15 #include "base/sys_info.h" |
16 #include "base/thread_task_runner_handle.h" | 16 #include "base/thread_task_runner_handle.h" |
17 #include "chromeos/dbus/bluetooth_adapter_client.h" | 17 #include "chromeos/dbus/bluetooth_adapter_client.h" |
18 #include "chromeos/dbus/bluetooth_agent_manager_client.h" | 18 #include "chromeos/dbus/bluetooth_agent_manager_client.h" |
19 #include "chromeos/dbus/bluetooth_agent_service_provider.h" | 19 #include "chromeos/dbus/bluetooth_agent_service_provider.h" |
20 #include "chromeos/dbus/bluetooth_device_client.h" | 20 #include "chromeos/dbus/bluetooth_device_client.h" |
21 #include "chromeos/dbus/bluetooth_input_client.h" | 21 #include "chromeos/dbus/bluetooth_input_client.h" |
22 #include "chromeos/dbus/dbus_thread_manager.h" | 22 #include "chromeos/dbus/dbus_thread_manager.h" |
| 23 #include "device/bluetooth/bluetooth_audio_sink_chromeos.h" |
23 #include "device/bluetooth/bluetooth_device.h" | 24 #include "device/bluetooth/bluetooth_device.h" |
24 #include "device/bluetooth/bluetooth_device_chromeos.h" | 25 #include "device/bluetooth/bluetooth_device_chromeos.h" |
25 #include "device/bluetooth/bluetooth_pairing_chromeos.h" | 26 #include "device/bluetooth/bluetooth_pairing_chromeos.h" |
26 #include "device/bluetooth/bluetooth_remote_gatt_characteristic_chromeos.h" | 27 #include "device/bluetooth/bluetooth_remote_gatt_characteristic_chromeos.h" |
27 #include "device/bluetooth/bluetooth_remote_gatt_descriptor_chromeos.h" | 28 #include "device/bluetooth/bluetooth_remote_gatt_descriptor_chromeos.h" |
28 #include "device/bluetooth/bluetooth_remote_gatt_service_chromeos.h" | 29 #include "device/bluetooth/bluetooth_remote_gatt_service_chromeos.h" |
29 #include "device/bluetooth/bluetooth_socket_chromeos.h" | 30 #include "device/bluetooth/bluetooth_socket_chromeos.h" |
30 #include "device/bluetooth/bluetooth_socket_thread.h" | 31 #include "device/bluetooth/bluetooth_socket_thread.h" |
31 #include "device/bluetooth/bluetooth_uuid.h" | 32 #include "device/bluetooth/bluetooth_uuid.h" |
32 #include "third_party/cros_system_api/dbus/service_constants.h" | 33 #include "third_party/cros_system_api/dbus/service_constants.h" |
(...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
298 uuid, | 299 uuid, |
299 options, | 300 options, |
300 base::Bind(callback, socket), | 301 base::Bind(callback, socket), |
301 error_callback); | 302 error_callback); |
302 } | 303 } |
303 | 304 |
304 void BluetoothAdapterChromeOS::RegisterAudioSink( | 305 void BluetoothAdapterChromeOS::RegisterAudioSink( |
305 const device::BluetoothAudioSink::Options& options, | 306 const device::BluetoothAudioSink::Options& options, |
306 const device::BluetoothAdapter::AcquiredCallback& callback, | 307 const device::BluetoothAdapter::AcquiredCallback& callback, |
307 const device::BluetoothAudioSink::ErrorCallback& error_callback) { | 308 const device::BluetoothAudioSink::ErrorCallback& error_callback) { |
308 // TODO(mcchou): Create and register a BluetoothAudioSink. Add the | 309 VLOG(1) << "Registering audio sink"; |
309 // newly-created audio sink as an observer of the adapter. | 310 if (!this->IsPresent()) { |
310 // Add OnRegisterAudioSink(AcquiredCallback& , BluetoothAudioSink*) and pass | 311 error_callback.Run(device::BluetoothAudioSink::ERROR_INVALID_ADAPTER); |
311 // it as an argument to BluetoothAudioSinkChromeOS::Register. | 312 return; |
312 error_callback.Run(device::BluetoothAudioSink::ERROR_UNSUPPORTED_PLATFORM); | 313 } |
| 314 scoped_refptr<BluetoothAudioSinkChromeOS> audio_sink( |
| 315 new BluetoothAudioSinkChromeOS(this)); |
| 316 audio_sink->Register( |
| 317 options, |
| 318 base::Bind(&BluetoothAdapterChromeOS::OnRegisterAudioSink, |
| 319 weak_ptr_factory_.GetWeakPtr(), callback, audio_sink), |
| 320 error_callback); |
313 } | 321 } |
314 | 322 |
315 void BluetoothAdapterChromeOS::RemovePairingDelegateInternal( | 323 void BluetoothAdapterChromeOS::RemovePairingDelegateInternal( |
316 BluetoothDevice::PairingDelegate* pairing_delegate) { | 324 BluetoothDevice::PairingDelegate* pairing_delegate) { |
317 DCHECK(IsPresent()); | 325 DCHECK(IsPresent()); |
318 // Before removing a pairing delegate make sure that there aren't any devices | 326 // Before removing a pairing delegate make sure that there aren't any devices |
319 // currently using it; if there are, clear the pairing context which will | 327 // currently using it; if there are, clear the pairing context which will |
320 // make any responses no-ops. | 328 // make any responses no-ops. |
321 for (DevicesMap::iterator iter = devices_.begin(); | 329 for (DevicesMap::iterator iter = devices_.begin(); |
322 iter != devices_.end(); ++iter) { | 330 iter != devices_.end(); ++iter) { |
(...skipping 321 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
644 } | 652 } |
645 | 653 |
646 void BluetoothAdapterChromeOS::OnRequestDefaultAgentError( | 654 void BluetoothAdapterChromeOS::OnRequestDefaultAgentError( |
647 const std::string& error_name, | 655 const std::string& error_name, |
648 const std::string& error_message) { | 656 const std::string& error_message) { |
649 DCHECK(IsPresent()); | 657 DCHECK(IsPresent()); |
650 LOG(WARNING) << ": Failed to make pairing agent default: " | 658 LOG(WARNING) << ": Failed to make pairing agent default: " |
651 << error_name << ": " << error_message; | 659 << error_name << ": " << error_message; |
652 } | 660 } |
653 | 661 |
| 662 void BluetoothAdapterChromeOS::OnRegisterAudioSink( |
| 663 const device::BluetoothAdapter::AcquiredCallback& callback, |
| 664 scoped_refptr<device::BluetoothAudioSink> audio_sink) { |
| 665 DCHECK(audio_sink.get()); |
| 666 callback.Run(audio_sink); |
| 667 } |
| 668 |
654 BluetoothDeviceChromeOS* | 669 BluetoothDeviceChromeOS* |
655 BluetoothAdapterChromeOS::GetDeviceWithPath( | 670 BluetoothAdapterChromeOS::GetDeviceWithPath( |
656 const dbus::ObjectPath& object_path) { | 671 const dbus::ObjectPath& object_path) { |
657 if (!IsPresent()) | 672 if (!IsPresent()) |
658 return NULL; | 673 return NULL; |
659 | 674 |
660 for (DevicesMap::iterator iter = devices_.begin(); iter != devices_.end(); | 675 for (DevicesMap::iterator iter = devices_.begin(); iter != devices_.end(); |
661 ++iter) { | 676 ++iter) { |
662 BluetoothDeviceChromeOS* device_chromeos = | 677 BluetoothDeviceChromeOS* device_chromeos = |
663 static_cast<BluetoothDeviceChromeOS*>(iter->second); | 678 static_cast<BluetoothDeviceChromeOS*>(iter->second); |
(...skipping 313 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
977 // The adapter is already discovering. | 992 // The adapter is already discovering. |
978 if (num_discovery_sessions_ > 0) { | 993 if (num_discovery_sessions_ > 0) { |
979 DCHECK(IsDiscovering()); | 994 DCHECK(IsDiscovering()); |
980 DCHECK(!discovery_request_pending_); | 995 DCHECK(!discovery_request_pending_); |
981 num_discovery_sessions_++; | 996 num_discovery_sessions_++; |
982 callback.Run(); | 997 callback.Run(); |
983 return; | 998 return; |
984 } | 999 } |
985 | 1000 |
986 // There are no active discovery sessions. | 1001 // There are no active discovery sessions. |
987 DCHECK(num_discovery_sessions_ == 0); | 1002 DCHECK_EQ(num_discovery_sessions_, 0); |
988 | 1003 |
989 // This is the first request to start device discovery. | 1004 // This is the first request to start device discovery. |
990 discovery_request_pending_ = true; | 1005 discovery_request_pending_ = true; |
991 DBusThreadManager::Get()->GetBluetoothAdapterClient()-> | 1006 DBusThreadManager::Get()->GetBluetoothAdapterClient()-> |
992 StartDiscovery( | 1007 StartDiscovery( |
993 object_path_, | 1008 object_path_, |
994 base::Bind(&BluetoothAdapterChromeOS::OnStartDiscovery, | 1009 base::Bind(&BluetoothAdapterChromeOS::OnStartDiscovery, |
995 weak_ptr_factory_.GetWeakPtr(), | 1010 weak_ptr_factory_.GetWeakPtr(), |
996 callback), | 1011 callback), |
997 base::Bind(&BluetoothAdapterChromeOS::OnStartDiscoveryError, | 1012 base::Bind(&BluetoothAdapterChromeOS::OnStartDiscoveryError, |
(...skipping 29 matching lines...) Expand all Loading... |
1027 // TODO(armansito): This should never happen once we have the | 1042 // TODO(armansito): This should never happen once we have the |
1028 // DiscoverySession API. Replace this case with an assert once it's | 1043 // DiscoverySession API. Replace this case with an assert once it's |
1029 // the deprecated methods have been removed. (See crbug.com/3445008). | 1044 // the deprecated methods have been removed. (See crbug.com/3445008). |
1030 VLOG(1) << "No active discovery sessions. Returning error."; | 1045 VLOG(1) << "No active discovery sessions. Returning error."; |
1031 error_callback.Run(); | 1046 error_callback.Run(); |
1032 return; | 1047 return; |
1033 } | 1048 } |
1034 | 1049 |
1035 // There is exactly one active discovery session. Request BlueZ to stop | 1050 // There is exactly one active discovery session. Request BlueZ to stop |
1036 // discovery. | 1051 // discovery. |
1037 DCHECK(num_discovery_sessions_ == 1); | 1052 DCHECK_EQ(num_discovery_sessions_, 1); |
1038 discovery_request_pending_ = true; | 1053 discovery_request_pending_ = true; |
1039 DBusThreadManager::Get()->GetBluetoothAdapterClient()-> | 1054 DBusThreadManager::Get()->GetBluetoothAdapterClient()-> |
1040 StopDiscovery( | 1055 StopDiscovery( |
1041 object_path_, | 1056 object_path_, |
1042 base::Bind(&BluetoothAdapterChromeOS::OnStopDiscovery, | 1057 base::Bind(&BluetoothAdapterChromeOS::OnStopDiscovery, |
1043 weak_ptr_factory_.GetWeakPtr(), | 1058 weak_ptr_factory_.GetWeakPtr(), |
1044 callback), | 1059 callback), |
1045 base::Bind(&BluetoothAdapterChromeOS::OnStopDiscoveryError, | 1060 base::Bind(&BluetoothAdapterChromeOS::OnStopDiscoveryError, |
1046 weak_ptr_factory_.GetWeakPtr(), | 1061 weak_ptr_factory_.GetWeakPtr(), |
1047 error_callback)); | 1062 error_callback)); |
1048 } | 1063 } |
1049 | 1064 |
1050 void BluetoothAdapterChromeOS::OnStartDiscovery(const base::Closure& callback) { | 1065 void BluetoothAdapterChromeOS::OnStartDiscovery(const base::Closure& callback) { |
1051 DCHECK(IsPresent()); | 1066 DCHECK(IsPresent()); |
1052 // Report success on the original request and increment the count. | 1067 // Report success on the original request and increment the count. |
1053 VLOG(1) << __func__; | 1068 VLOG(1) << __func__; |
1054 DCHECK(discovery_request_pending_); | 1069 DCHECK(discovery_request_pending_); |
1055 DCHECK(num_discovery_sessions_ == 0); | 1070 DCHECK_EQ(num_discovery_sessions_, 0); |
1056 discovery_request_pending_ = false; | 1071 discovery_request_pending_ = false; |
1057 num_discovery_sessions_++; | 1072 num_discovery_sessions_++; |
1058 callback.Run(); | 1073 callback.Run(); |
1059 | 1074 |
1060 // Try to add a new discovery session for each queued request. | 1075 // Try to add a new discovery session for each queued request. |
1061 ProcessQueuedDiscoveryRequests(); | 1076 ProcessQueuedDiscoveryRequests(); |
1062 } | 1077 } |
1063 | 1078 |
1064 void BluetoothAdapterChromeOS::OnStartDiscoveryError( | 1079 void BluetoothAdapterChromeOS::OnStartDiscoveryError( |
1065 const base::Closure& callback, | 1080 const base::Closure& callback, |
1066 const ErrorCallback& error_callback, | 1081 const ErrorCallback& error_callback, |
1067 const std::string& error_name, | 1082 const std::string& error_name, |
1068 const std::string& error_message) { | 1083 const std::string& error_message) { |
1069 DCHECK(IsPresent()); | 1084 DCHECK(IsPresent()); |
1070 LOG(WARNING) << object_path_.value() << ": Failed to start discovery: " | 1085 LOG(WARNING) << object_path_.value() << ": Failed to start discovery: " |
1071 << error_name << ": " << error_message; | 1086 << error_name << ": " << error_message; |
1072 | 1087 |
1073 // Failed to start discovery. This can only happen if the count is at 0. | 1088 // Failed to start discovery. This can only happen if the count is at 0. |
1074 DCHECK(num_discovery_sessions_ == 0); | 1089 DCHECK_EQ(num_discovery_sessions_, 0); |
1075 DCHECK(discovery_request_pending_); | 1090 DCHECK(discovery_request_pending_); |
1076 discovery_request_pending_ = false; | 1091 discovery_request_pending_ = false; |
1077 | 1092 |
1078 // Discovery request may fail if discovery was previously initiated by Chrome, | 1093 // Discovery request may fail if discovery was previously initiated by Chrome, |
1079 // but the session were invalidated due to the discovery state unexpectedly | 1094 // but the session were invalidated due to the discovery state unexpectedly |
1080 // changing to false and then back to true. In this case, report success. | 1095 // changing to false and then back to true. In this case, report success. |
1081 if (error_name == bluetooth_device::kErrorInProgress && IsDiscovering()) { | 1096 if (error_name == bluetooth_device::kErrorInProgress && IsDiscovering()) { |
1082 VLOG(1) << "Discovery previously initiated. Reporting success."; | 1097 VLOG(1) << "Discovery previously initiated. Reporting success."; |
1083 num_discovery_sessions_++; | 1098 num_discovery_sessions_++; |
1084 callback.Run(); | 1099 callback.Run(); |
1085 } else { | 1100 } else { |
1086 error_callback.Run(); | 1101 error_callback.Run(); |
1087 } | 1102 } |
1088 | 1103 |
1089 // Try to add a new discovery session for each queued request. | 1104 // Try to add a new discovery session for each queued request. |
1090 ProcessQueuedDiscoveryRequests(); | 1105 ProcessQueuedDiscoveryRequests(); |
1091 } | 1106 } |
1092 | 1107 |
1093 void BluetoothAdapterChromeOS::OnStopDiscovery(const base::Closure& callback) { | 1108 void BluetoothAdapterChromeOS::OnStopDiscovery(const base::Closure& callback) { |
1094 DCHECK(IsPresent()); | 1109 DCHECK(IsPresent()); |
1095 // Report success on the original request and decrement the count. | 1110 // Report success on the original request and decrement the count. |
1096 VLOG(1) << __func__; | 1111 VLOG(1) << __func__; |
1097 DCHECK(discovery_request_pending_); | 1112 DCHECK(discovery_request_pending_); |
1098 DCHECK(num_discovery_sessions_ == 1); | 1113 DCHECK_EQ(num_discovery_sessions_, 1); |
1099 discovery_request_pending_ = false; | 1114 discovery_request_pending_ = false; |
1100 num_discovery_sessions_--; | 1115 num_discovery_sessions_--; |
1101 callback.Run(); | 1116 callback.Run(); |
1102 | 1117 |
1103 // Try to add a new discovery session for each queued request. | 1118 // Try to add a new discovery session for each queued request. |
1104 ProcessQueuedDiscoveryRequests(); | 1119 ProcessQueuedDiscoveryRequests(); |
1105 } | 1120 } |
1106 | 1121 |
1107 void BluetoothAdapterChromeOS::OnStopDiscoveryError( | 1122 void BluetoothAdapterChromeOS::OnStopDiscoveryError( |
1108 const ErrorCallback& error_callback, | 1123 const ErrorCallback& error_callback, |
1109 const std::string& error_name, | 1124 const std::string& error_name, |
1110 const std::string& error_message) { | 1125 const std::string& error_message) { |
1111 DCHECK(IsPresent()); | 1126 DCHECK(IsPresent()); |
1112 LOG(WARNING) << object_path_.value() << ": Failed to stop discovery: " | 1127 LOG(WARNING) << object_path_.value() << ": Failed to stop discovery: " |
1113 << error_name << ": " << error_message; | 1128 << error_name << ": " << error_message; |
1114 | 1129 |
1115 // Failed to stop discovery. This can only happen if the count is at 1. | 1130 // Failed to stop discovery. This can only happen if the count is at 1. |
1116 DCHECK(discovery_request_pending_); | 1131 DCHECK(discovery_request_pending_); |
1117 DCHECK(num_discovery_sessions_ == 1); | 1132 DCHECK_EQ(num_discovery_sessions_, 1); |
1118 discovery_request_pending_ = false; | 1133 discovery_request_pending_ = false; |
1119 error_callback.Run(); | 1134 error_callback.Run(); |
1120 | 1135 |
1121 // Try to add a new discovery session for each queued request. | 1136 // Try to add a new discovery session for each queued request. |
1122 ProcessQueuedDiscoveryRequests(); | 1137 ProcessQueuedDiscoveryRequests(); |
1123 } | 1138 } |
1124 | 1139 |
1125 void BluetoothAdapterChromeOS::ProcessQueuedDiscoveryRequests() { | 1140 void BluetoothAdapterChromeOS::ProcessQueuedDiscoveryRequests() { |
1126 while (!discovery_request_queue_.empty()) { | 1141 while (!discovery_request_queue_.empty()) { |
1127 VLOG(1) << "Process queued discovery request."; | 1142 VLOG(1) << "Process queued discovery request."; |
1128 DiscoveryCallbackPair callbacks = discovery_request_queue_.front(); | 1143 DiscoveryCallbackPair callbacks = discovery_request_queue_.front(); |
1129 discovery_request_queue_.pop(); | 1144 discovery_request_queue_.pop(); |
1130 AddDiscoverySession(callbacks.first, callbacks.second); | 1145 AddDiscoverySession(callbacks.first, callbacks.second); |
1131 | 1146 |
1132 // If the queued request resulted in a pending call, then let it | 1147 // If the queued request resulted in a pending call, then let it |
1133 // asynchonously process the remaining queued requests once the pending | 1148 // asynchonously process the remaining queued requests once the pending |
1134 // call returns. | 1149 // call returns. |
1135 if (discovery_request_pending_) | 1150 if (discovery_request_pending_) |
1136 return; | 1151 return; |
1137 } | 1152 } |
1138 } | 1153 } |
1139 | 1154 |
1140 } // namespace chromeos | 1155 } // namespace chromeos |
OLD | NEW |