Index: device/bluetooth/bluetooth_adapter_chromeos.cc |
diff --git a/device/bluetooth/bluetooth_adapter_chromeos.cc b/device/bluetooth/bluetooth_adapter_chromeos.cc |
index 7703002675c6d1683007057505f81b57733988b2..db9cb9089f3c3bf67b7e4334632cb1bfced00070 100644 |
--- a/device/bluetooth/bluetooth_adapter_chromeos.cc |
+++ b/device/bluetooth/bluetooth_adapter_chromeos.cc |
@@ -85,6 +85,13 @@ void BluetoothAdapterChromeOS::Shutdown() { |
if (IsPresent()) |
RemoveAdapter(); // Also deletes devices_. |
DCHECK(devices_.empty()); |
+ // profiles_ should be empty because all BluetoothSockets have been signaled |
+ // that this adapter is disappearing. |
+ DCHECK(profiles_.empty()); |
+ |
+ for (auto& it : profile_queues_) |
+ delete it.second; |
+ profile_queues_.clear(); |
DBusThreadManager::Get()->GetBluetoothAdapterClient()->RemoveObserver(this); |
DBusThreadManager::Get()->GetBluetoothDeviceClient()->RemoveObserver(this); |
@@ -957,6 +964,12 @@ void BluetoothAdapterChromeOS::UseProfile( |
const ErrorCompletionCallback& error_callback) { |
DCHECK(delegate); |
+ if (!IsPresent()) { |
+ VLOG(2) << "Adapter not present, erroring out"; |
+ error_callback.Run("Adapter not present"); |
+ return; |
+ } |
+ |
if (profiles_.find(uuid) != profiles_.end()) { |
// TODO(jamuraa) check that the options are the same and error when they are |
// not. |
@@ -965,15 +978,35 @@ void BluetoothAdapterChromeOS::UseProfile( |
return; |
} |
- profiles_[uuid] = BluetoothAdapterProfileChromeOS::Register( |
- this, uuid, options, |
- base::Bind(&BluetoothAdapterChromeOS::OnRegisterProfile, this, uuid, |
+ if (profile_queues_.find(uuid) == profile_queues_.end()) { |
+ BluetoothAdapterProfileChromeOS::Register( |
+ uuid, options, |
+ base::Bind(&BluetoothAdapterChromeOS::OnRegisterProfile, this, uuid), |
+ base::Bind(&BluetoothAdapterChromeOS::OnRegisterProfileError, this, |
+ uuid)); |
+ |
+ profile_queues_[uuid] = new std::vector<RegisterProfileCompletionPair>(); |
+ } |
+ |
+ profile_queues_[uuid]->push_back(std::make_pair( |
+ base::Bind(&BluetoothAdapterChromeOS::SetProfileDelegate, this, uuid, |
device_path, delegate, success_callback, error_callback), |
- base::Bind(&BluetoothAdapterChromeOS::OnRegisterProfileError, this, uuid, |
- error_callback)); |
+ error_callback)); |
+} |
+ |
+void BluetoothAdapterChromeOS::ReleaseProfile( |
+ const dbus::ObjectPath& device_path, |
+ BluetoothAdapterProfileChromeOS* profile) { |
+ VLOG(2) << "Releasing Profile: " << profile->uuid().canonical_value() |
+ << " from " << device_path.value(); |
+ profile->RemoveDelegate( |
+ device_path, base::Bind(&BluetoothAdapterChromeOS::RemoveProfile, |
+ weak_ptr_factory_.GetWeakPtr(), profile->uuid())); |
} |
-void BluetoothAdapterChromeOS::ReleaseProfile(const BluetoothUUID& uuid) { |
+void BluetoothAdapterChromeOS::RemoveProfile(const BluetoothUUID& uuid) { |
+ VLOG(2) << "Remove Profile: " << uuid.canonical_value(); |
+ |
if (profiles_.find(uuid) != profiles_.end()) { |
delete profiles_[uuid]; |
profiles_.erase(uuid); |
@@ -982,39 +1015,52 @@ void BluetoothAdapterChromeOS::ReleaseProfile(const BluetoothUUID& uuid) { |
void BluetoothAdapterChromeOS::OnRegisterProfile( |
const BluetoothUUID& uuid, |
- const dbus::ObjectPath& device_path, |
- BluetoothProfileServiceProvider::Delegate* delegate, |
- const ProfileRegisteredCallback& success_callback, |
- const ErrorCompletionCallback& error_callback) { |
- SetProfileDelegate(uuid, device_path, delegate, success_callback, |
- error_callback); |
+ BluetoothAdapterProfileChromeOS* profile) { |
+ profiles_[uuid] = profile; |
+ |
+ if (profile_queues_.find(uuid) == profile_queues_.end()) |
+ return; |
+ |
+ for (auto& it : *profile_queues_[uuid]) |
+ it.first.Run(); |
+ delete profile_queues_[uuid]; |
+ profile_queues_.erase(uuid); |
} |
-bool BluetoothAdapterChromeOS::SetProfileDelegate( |
+void BluetoothAdapterChromeOS::SetProfileDelegate( |
const BluetoothUUID& uuid, |
const dbus::ObjectPath& device_path, |
BluetoothProfileServiceProvider::Delegate* delegate, |
const ProfileRegisteredCallback& success_callback, |
const ErrorCompletionCallback& error_callback) { |
+ |
+ if (profiles_.find(uuid) == profiles_.end()) { |
+ error_callback.Run("Cannot find profile!"); |
+ return; |
+ } |
+ |
if (profiles_[uuid]->SetDelegate(device_path, delegate)) { |
success_callback.Run(profiles_[uuid]); |
- return true; |
+ return; |
} |
// Already set |
error_callback.Run(bluetooth_agent_manager::kErrorAlreadyExists); |
- return false; |
} |
void BluetoothAdapterChromeOS::OnRegisterProfileError( |
const BluetoothUUID& uuid, |
- const ErrorCompletionCallback& error_callback, |
const std::string& error_name, |
const std::string& error_message) { |
- LOG(WARNING) << object_path_.value() |
- << ": Failed to register profile: " << error_name << ": " |
- << error_message; |
- error_callback.Run(error_message); |
- ReleaseProfile(uuid); |
+ VLOG(2) << object_path_.value() << ": Failed to register profile: " |
+ << error_name << ": " << error_message; |
+ if (profile_queues_.find(uuid) == profile_queues_.end()) |
+ return; |
+ |
+ for (auto& it : *profile_queues_[uuid]) |
+ it.second.Run(error_message); |
+ |
+ delete profile_queues_[uuid]; |
+ profile_queues_.erase(uuid); |
} |
void BluetoothAdapterChromeOS::OnSetDiscoverable( |