Index: device/bluetooth/bluetooth_device_win.cc |
diff --git a/device/bluetooth/bluetooth_device_win.cc b/device/bluetooth/bluetooth_device_win.cc |
index e628a25591b9507561c28266de92a845ca0b4408..fc0dd4dcee1b99ddce4de41818c16478149cbd55 100644 |
--- a/device/bluetooth/bluetooth_device_win.cc |
+++ b/device/bluetooth/bluetooth_device_win.cc |
@@ -9,6 +9,7 @@ |
#include "base/containers/scoped_ptr_hash_map.h" |
#include "base/logging.h" |
+#include "base/memory/ptr_util.h" |
#include "base/memory/scoped_vector.h" |
#include "base/sequenced_task_runner.h" |
#include "base/strings/stringprintf.h" |
@@ -44,15 +45,6 @@ BluetoothDeviceWin::BluetoothDeviceWin( |
} |
BluetoothDeviceWin::~BluetoothDeviceWin() { |
- // Explicitly take and erase GATT services one by one to ensure that calling |
- // GetGattService on removed service in GattServiceRemoved returns null. |
- std::vector<std::string> service_keys; |
- for (const auto& gatt_service : gatt_services_) { |
- service_keys.push_back(gatt_service.first); |
- } |
- for (const auto& key : service_keys) { |
- gatt_services_.take_and_erase(key); |
- } |
} |
uint32_t BluetoothDeviceWin::GetBluetoothClass() const { |
@@ -213,13 +205,11 @@ void BluetoothDeviceWin::CreateGattConnection( |
const BluetoothServiceRecordWin* BluetoothDeviceWin::GetServiceRecord( |
const device::BluetoothUUID& uuid) const { |
- for (ServiceRecordList::const_iterator iter = service_record_list_.begin(); |
- iter != service_record_list_.end(); |
- ++iter) { |
- if ((*iter)->uuid() == uuid) |
- return *iter; |
+ for (auto& record : service_record_list_) { |
+ if (record->uuid() == uuid) |
+ return record.get(); |
} |
- return NULL; |
+ return nullptr; |
} |
bool BluetoothDeviceWin::IsEqual( |
@@ -233,21 +223,17 @@ bool BluetoothDeviceWin::IsEqual( |
} |
// Checks service collection |
- typedef base::ScopedPtrHashMap<std::string, |
- std::unique_ptr<BluetoothServiceRecordWin>> |
- ServiceRecordMap; |
- |
+ using ServiceRecordMap = |
+ std::unordered_map<std::string, |
+ std::unique_ptr<BluetoothServiceRecordWin>>; |
UUIDSet new_services; |
ServiceRecordMap new_service_records; |
- for (ScopedVector<BluetoothTaskManagerWin::ServiceRecordState>::const_iterator |
- iter = device_state.service_record_states.begin(); |
- iter != device_state.service_record_states.end(); ++iter) { |
- BluetoothServiceRecordWin* service_record = new BluetoothServiceRecordWin( |
- address_, (*iter)->name, (*iter)->sdp_bytes, (*iter)->gatt_uuid); |
+ for (auto& state : device_state.service_record_states) { |
+ auto service_record = base::MakeUnique<BluetoothServiceRecordWin>( |
+ address_, state->name, state->sdp_bytes, state->gatt_uuid); |
new_services.insert(service_record->uuid()); |
- new_service_records.set( |
- service_record->uuid().canonical_value(), |
- std::unique_ptr<BluetoothServiceRecordWin>(service_record)); |
+ new_service_records[service_record->uuid().canonical_value()] = |
+ std::move(service_record); |
} |
// Check that no new services have been added or removed. |
@@ -255,12 +241,14 @@ bool BluetoothDeviceWin::IsEqual( |
return false; |
} |
- for (ServiceRecordList::const_iterator iter = service_record_list_.begin(); |
- iter != service_record_list_.end(); ++iter) { |
- BluetoothServiceRecordWin* service_record = (*iter); |
- BluetoothServiceRecordWin* new_service_record = |
- new_service_records.get((*iter)->uuid().canonical_value()); |
- if (!service_record->IsEqual(*new_service_record)) |
+ for (auto& service_record : service_record_list_) { |
+ auto new_service_record = |
+ new_service_records.find(service_record->uuid().canonical_value()); |
+ |
+ if (new_service_record == new_service_records.end()) |
+ return false; |
+ |
+ if (!service_record->IsEqual(*new_service_record->second.get())) |
return false; |
} |
return true; |
@@ -300,14 +288,12 @@ void BluetoothDeviceWin::UpdateServices( |
uuids_.clear(); |
service_record_list_.clear(); |
- for (ScopedVector<BluetoothTaskManagerWin::ServiceRecordState>::const_iterator |
- iter = device_state.service_record_states.begin(); |
- iter != device_state.service_record_states.end(); ++iter) { |
- BluetoothServiceRecordWin* service_record = |
- new BluetoothServiceRecordWin(device_state.address, (*iter)->name, |
- (*iter)->sdp_bytes, (*iter)->gatt_uuid); |
- service_record_list_.push_back(service_record); |
+ for (auto& state : device_state.service_record_states) { |
+ std::unique_ptr<BluetoothServiceRecordWin> service_record( |
+ new BluetoothServiceRecordWin(device_state.address, state->name, |
+ state->sdp_bytes, state->gatt_uuid)); |
uuids_.insert(service_record->uuid()); |
+ service_record_list_.push_back(std::move(service_record)); |
} |
if (!device_state.is_bluetooth_classic()) |
@@ -316,12 +302,11 @@ void BluetoothDeviceWin::UpdateServices( |
bool BluetoothDeviceWin::IsGattServiceDiscovered(BluetoothUUID& uuid, |
uint16_t attribute_handle) { |
- GattServiceMap::iterator it = gatt_services_.begin(); |
- for (; it != gatt_services_.end(); it++) { |
+ for (auto& service : gatt_services_) { |
uint16_t it_att_handle = |
- static_cast<BluetoothRemoteGattServiceWin*>(it->second) |
+ static_cast<BluetoothRemoteGattServiceWin*>(service.second.get()) |
->GetAttributeHandle(); |
- BluetoothUUID it_uuid = it->second->GetUUID(); |
+ BluetoothUUID it_uuid = service.second->GetUUID(); |
if (attribute_handle == it_att_handle && uuid == it_uuid) { |
return true; |
} |
@@ -330,39 +315,39 @@ bool BluetoothDeviceWin::IsGattServiceDiscovered(BluetoothUUID& uuid, |
} |
bool BluetoothDeviceWin::DoesGattServiceExist( |
- const ScopedVector<BluetoothTaskManagerWin::ServiceRecordState>& |
- service_state, |
+ const std::vector<std::unique_ptr< |
+ BluetoothTaskManagerWin::ServiceRecordState>>& service_state, |
BluetoothRemoteGattService* service) { |
uint16_t attribute_handle = |
static_cast<BluetoothRemoteGattServiceWin*>(service) |
->GetAttributeHandle(); |
BluetoothUUID uuid = service->GetUUID(); |
- ScopedVector<BluetoothTaskManagerWin::ServiceRecordState>::const_iterator it = |
- service_state.begin(); |
- for (; it != service_state.end(); ++it) { |
- if (attribute_handle == (*it)->attribute_handle && uuid == (*it)->gatt_uuid) |
+ |
+ for (auto& state : service_state) { |
+ if (attribute_handle == state->attribute_handle && uuid == state->gatt_uuid) |
return true; |
} |
return false; |
} |
void BluetoothDeviceWin::UpdateGattServices( |
- const ScopedVector<BluetoothTaskManagerWin::ServiceRecordState>& |
+ const std::vector< |
+ std::unique_ptr<BluetoothTaskManagerWin::ServiceRecordState>>& |
service_state) { |
// First, remove no longer exist GATT service. |
{ |
std::vector<std::string> to_be_removed_services; |
- for (const auto& gatt_service : gatt_services_) { |
- if (!DoesGattServiceExist(service_state, gatt_service.second)) { |
- to_be_removed_services.push_back(gatt_service.first); |
+ for (const auto& service : gatt_services_) { |
+ if (!DoesGattServiceExist(service_state, service.second.get())) { |
+ to_be_removed_services.push_back(service.first); |
} |
} |
for (const auto& service : to_be_removed_services) { |
- gatt_services_.take_and_erase(service); |
+ gatt_services_.erase(service); |
} |
// Update previously discovered services. |
- for (auto gatt_service : gatt_services_) { |
- static_cast<BluetoothRemoteGattServiceWin*>(gatt_service.second) |
+ for (auto& service : gatt_services_) { |
+ static_cast<BluetoothRemoteGattServiceWin*>(service.second.get()) |
->Update(); |
} |
} |
@@ -370,23 +355,20 @@ void BluetoothDeviceWin::UpdateGattServices( |
// Return if no new services have been added. |
if (gatt_services_.size() == service_state.size()) |
return; |
- |
// Add new services. |
- for (ScopedVector<BluetoothTaskManagerWin::ServiceRecordState>::const_iterator |
- it = service_state.begin(); |
- it != service_state.end(); ++it) { |
- if (!IsGattServiceDiscovered((*it)->gatt_uuid, (*it)->attribute_handle)) { |
- BluetoothRemoteGattServiceWin* primary_service = |
- new BluetoothRemoteGattServiceWin(this, (*it)->path, (*it)->gatt_uuid, |
- (*it)->attribute_handle, true, |
- nullptr, ui_task_runner_); |
- gatt_services_.add( |
- primary_service->GetIdentifier(), |
- std::unique_ptr<BluetoothRemoteGattService>(primary_service)); |
- adapter_->NotifyGattServiceAdded(primary_service); |
+ for (auto& state : service_state) { |
+ if (!IsGattServiceDiscovered(state->gatt_uuid, state->attribute_handle)) { |
+ auto primary_service = base::MakeUnique<BluetoothRemoteGattServiceWin>( |
+ this, state->path, state->gatt_uuid, state->attribute_handle, true, |
+ nullptr, ui_task_runner_); |
+ |
+ auto insertion = gatt_services_.insert(std::make_pair( |
+ primary_service->GetIdentifier(), std::move(primary_service))); |
+ |
+ if (insertion.second) |
+ adapter_->NotifyGattServiceAdded(insertion.first->second.get()); |
} |
} |
- |
adapter_->NotifyGattServicesDiscovered(this); |
} |