OLD | NEW |
---|---|
(Empty) | |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include <utility> | |
6 #include <vector> | |
7 | |
8 #include "chrome/browser/ui/webui/bluetooth_internals/services/bluetooth_adapter _service.h" | |
9 #include "mojo/public/cpp/bindings/string.h" | |
10 | |
11 BluetoothAdapterService::BluetoothAdapterService( | |
12 bluetooth::mojom::AdapterClientPtr client) | |
13 : client_(std::move(client)), weak_ptr_factory_(this) {} | |
14 | |
15 BluetoothAdapterService::~BluetoothAdapterService() { | |
16 if (adapter_.get()) { | |
17 adapter_->RemoveObserver(this); | |
18 adapter_ = nullptr; | |
19 } | |
20 } | |
21 | |
22 void BluetoothAdapterService::OnGetAdapter( | |
23 scoped_refptr<device::BluetoothAdapter> adapter) { | |
24 if (!adapter_.get()) { | |
25 VLOG(1) << "Adapter acquired in BluetoothAdapterService"; | |
26 adapter_ = adapter; | |
27 adapter_->AddObserver(this); | |
28 } | |
29 } | |
30 | |
31 void BluetoothAdapterService::GetDevices(const GetDevicesCallback& callback) { | |
32 if (!GetAdapter().get()) { | |
33 if (device::BluetoothAdapterFactory::IsBluetoothAdapterAvailable()) { | |
34 device::BluetoothAdapterFactory::GetAdapter( | |
35 base::Bind(&BluetoothAdapterService::GetDevicesImpl, | |
36 weak_ptr_factory_.GetWeakPtr(), callback)); | |
37 return; | |
38 } | |
39 callback.Run(std::vector<bluetooth::mojom::DeviceInfoPtr>()); | |
40 return; | |
41 } | |
42 GetDevicesImpl(callback, GetAdapter()); | |
43 } | |
44 | |
45 void BluetoothAdapterService::GetDevicesImpl( | |
46 const GetDevicesCallback& callback, | |
47 scoped_refptr<device::BluetoothAdapter> adapter) { | |
48 OnGetAdapter(adapter); | |
49 std::vector<bluetooth::mojom::DeviceInfoPtr> devices; | |
50 | |
51 for (const device::BluetoothDevice* device : adapter->GetDevices()) { | |
52 addresses_.insert(device->GetAddress()); | |
53 } | |
54 | |
55 for (const std::string& address : addresses_) { | |
56 device::BluetoothDevice* device = adapter->GetDevice(address); | |
57 bluetooth::mojom::DeviceInfoPtr device_info = | |
58 ConstructDeviceInfoStruct(device); | |
59 devices.push_back(std::move(device_info)); | |
60 } | |
61 | |
62 callback.Run(std::move(devices)); | |
63 } | |
64 | |
65 scoped_refptr<device::BluetoothAdapter> BluetoothAdapterService::GetAdapter() { | |
66 return adapter_; | |
67 } | |
68 | |
69 void BluetoothAdapterService::DeviceAdded(device::BluetoothAdapter* adapter, | |
70 device::BluetoothDevice* device) { | |
71 std::string device_address = device->GetAddress(); | |
72 | |
73 // If unknown address was added, alert client | |
74 if (addresses_.insert(device_address).second && client_) { | |
scheib
2016/09/26 19:37:27
Do we need this logic here? Why not pass through t
mbrunson
2016/09/28 02:18:22
Done.
| |
75 auto device_info = ConstructDeviceInfoStruct(device); | |
76 client_->DeviceAdded(std::move(device_info)); | |
77 } | |
78 } | |
79 | |
80 void BluetoothAdapterService::DeviceRemoved(device::BluetoothAdapter* adapter, | |
81 device::BluetoothDevice* device) { | |
82 std::string device_address = device->GetAddress(); | |
83 | |
84 // If known address was removed, alert client | |
85 if (addresses_.erase(device_address) && client_) { | |
86 auto device_info = ConstructDeviceInfoStruct(device); | |
87 client_->DeviceRemoved(std::move(device_info)); | |
88 } | |
89 } | |
90 | |
91 bluetooth::mojom::DeviceInfoPtr | |
92 BluetoothAdapterService::ConstructDeviceInfoStruct( | |
93 device::BluetoothDevice* device) { | |
94 bluetooth::mojom::DeviceInfoPtr device_info = | |
95 bluetooth::mojom::DeviceInfo::New(); | |
96 | |
97 device_info->name = device->GetName(); | |
98 device_info->name_for_display = | |
99 base::UTF16ToUTF8(device->GetNameForDisplay()); | |
100 device_info->id = device->GetIdentifier(); | |
101 device_info->address = device->GetAddress(); | |
102 | |
103 return device_info; | |
104 } | |
OLD | NEW |