Chromium Code Reviews| Index: chrome/browser/ui/webui/bluetooth_internals/services/bluetooth_adapter_service.cc |
| diff --git a/chrome/browser/ui/webui/bluetooth_internals/services/bluetooth_adapter_service.cc b/chrome/browser/ui/webui/bluetooth_internals/services/bluetooth_adapter_service.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..ddcd7ca7328a2fae16fbc7df91aae7a01404a0b3 |
| --- /dev/null |
| +++ b/chrome/browser/ui/webui/bluetooth_internals/services/bluetooth_adapter_service.cc |
| @@ -0,0 +1,90 @@ |
| +// Copyright 2016 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include <utility> |
| +#include <vector> |
| + |
| +#include "chrome/browser/ui/webui/bluetooth_internals/services/bluetooth_adapter_service.h" |
| +#include "mojo/public/cpp/bindings/string.h" |
| + |
| +BluetoothAdapterService::BluetoothAdapterService( |
| + bluetooth::AdapterClientPtr client) |
| + : client_(std::move(client)), weak_ptr_factory_(this) { |
| + if (!GetAdapter()) { |
| + device::BluetoothAdapterFactoryWrapper::Get().AcquireAdapter( |
|
ortuno
2016/09/22 08:32:53
Don't use the Wrapper. That class was added becaus
mbrunson
2016/09/24 01:05:47
Done.
|
| + this, base::Bind(&BluetoothAdapterService::OnAdapterAcquired, |
| + weak_ptr_factory_.GetWeakPtr())); |
| + } |
| +} |
| + |
| +BluetoothAdapterService::~BluetoothAdapterService() {} |
| + |
| +void BluetoothAdapterService::OnAdapterAcquired( |
| + device::BluetoothAdapter* adapter) { |
| + VLOG(1) << "Adapter acquired in BluetoothAdapterService"; |
| + |
| + for (const device::BluetoothDevice* device : adapter->GetDevices()) { |
|
ortuno
2016/09/22 08:32:54
q: Why do you do this after adapter construction r
mbrunson
2016/09/24 01:05:47
Done.
|
| + addresses_.insert(device->GetAddress()); |
| + } |
| +} |
| + |
| +void BluetoothAdapterService::GetDevices(int8_t index, |
| + int8_t count, |
| + const GetDevicesCallback& callback) { |
| + std::vector<bluetooth::DeviceInfoPtr> result; |
|
ortuno
2016/09/22 08:32:53
optional nit: "devices" is more specific.
mbrunson
2016/09/24 01:05:47
Done.
|
| + |
| + for (const std::string& address : addresses_) { |
| + if (result.size() >= (size_t)(count)) { |
| + break; |
| + } |
| + |
| + device::BluetoothDevice* device = GetAdapter()->GetDevice(address); |
| + bluetooth::DeviceInfoPtr device_info = GetDeviceInfo(device); |
| + result.push_back(std::move(device_info)); |
| + } |
| + |
| + callback.Run(std::move(result)); |
| +} |
| + |
| +device::BluetoothAdapter* BluetoothAdapterService::GetAdapter() { |
| + return device::BluetoothAdapterFactoryWrapper::Get().GetAdapter(this); |
| +} |
| + |
| +void BluetoothAdapterService::DeviceAdded(device::BluetoothAdapter* adapter, |
| + device::BluetoothDevice* device) { |
| + std::string device_address = device->GetAddress(); |
| + |
| + // If known address was added, alert client |
| + if (addresses_.insert(device_address).second && client_) { |
|
ortuno
2016/09/22 08:32:53
The comment says that if a *known* address was add
mbrunson
2016/09/24 01:05:47
That's a typo.
I don't expect to see known addres
ortuno
2016/09/26 01:57:55
We should be able to trust the API to not mess up.
|
| + device::BluetoothDevice* device = GetAdapter()->GetDevice(device_address); |
| + auto device_info = GetDeviceInfo(device); |
| + client_->DeviceAdded(std::move(device_info)); |
| + } |
| +} |
| + |
| +void BluetoothAdapterService::DeviceRemoved(device::BluetoothAdapter* adapter, |
| + device::BluetoothDevice* device) { |
| + std::string device_address = device->GetAddress(); |
| + |
| + // If known address was removed, alert client |
| + if (addresses_.erase(device_address) && client_) { |
| + device::BluetoothDevice* device = GetAdapter()->GetDevice(device_address); |
| + auto device_info = GetDeviceInfo(device); |
| + client_->DeviceRemoved(std::move(device_info)); |
| + } |
| +} |
| + |
| +bluetooth::DeviceInfoPtr BluetoothAdapterService::GetDeviceInfo( |
|
ortuno
2016/09/22 08:32:54
optional nit: ConstructDeviceInfoStruct would be m
mbrunson
2016/09/24 01:05:47
Done.
|
| + device::BluetoothDevice* device) { |
| + bluetooth::DeviceInfoPtr device_info = bluetooth::DeviceInfo::New(); |
| + device_info->name = device->GetName().value_or(""); |
|
ortuno
2016/09/22 08:32:53
I think you need to surround this by an if stateme
mbrunson
2016/09/24 01:05:47
Removing the value_or should be enough. Name is an
|
| + device_info->name_for_display = |
| + base::UTF16ToUTF8(device->GetNameForDisplay()); |
| + device_info->id = device->GetIdentifier(); |
| + device_info->address = device->GetAddress(); |
| + device_info->device_id = device->GetDeviceID(); |
| + device_info->product_id = device->GetProductID(); |
| + device_info->vendor_id = device->GetVendorID(); |
| + return device_info; |
| +} |