| 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);
|
| }
|
|
|
|
|