OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <string> | 5 #include <string> |
6 #include <utility> | 6 #include <utility> |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
| 9 #include "base/memory/ptr_util.h" |
9 #include "device/bluetooth/adapter.h" | 10 #include "device/bluetooth/adapter.h" |
10 #include "device/bluetooth/device.h" | 11 #include "device/bluetooth/device.h" |
11 #include "mojo/public/cpp/bindings/strong_binding.h" | |
12 | 12 |
13 namespace bluetooth { | 13 namespace bluetooth { |
| 14 namespace { |
| 15 mojom::ConnectResult BluetoothErrorCodeToMojomResult( |
| 16 device::BluetoothDevice::ConnectErrorCode error_code) { |
| 17 switch (error_code) { |
| 18 case device::BluetoothDevice::ConnectErrorCode:: |
| 19 ERROR_ATTRIBUTE_LENGTH_INVALID: |
| 20 return mojom::ConnectResult::ATTRIBUTE_LENGTH_INVALID; |
| 21 case device::BluetoothDevice::ConnectErrorCode::ERROR_AUTH_CANCELED: |
| 22 return mojom::ConnectResult::AUTH_CANCELED; |
| 23 case device::BluetoothDevice::ConnectErrorCode::ERROR_AUTH_FAILED: |
| 24 return mojom::ConnectResult::AUTH_FAILED; |
| 25 case device::BluetoothDevice::ConnectErrorCode::ERROR_AUTH_REJECTED: |
| 26 return mojom::ConnectResult::AUTH_REJECTED; |
| 27 case device::BluetoothDevice::ConnectErrorCode::ERROR_AUTH_TIMEOUT: |
| 28 return mojom::ConnectResult::AUTH_TIMEOUT; |
| 29 case device::BluetoothDevice::ConnectErrorCode::ERROR_CONNECTION_CONGESTED: |
| 30 return mojom::ConnectResult::CONNECTION_CONGESTED; |
| 31 case device::BluetoothDevice::ConnectErrorCode::ERROR_FAILED: |
| 32 return mojom::ConnectResult::FAILED; |
| 33 case device::BluetoothDevice::ConnectErrorCode::ERROR_INPROGRESS: |
| 34 return mojom::ConnectResult::INPROGRESS; |
| 35 case device::BluetoothDevice::ConnectErrorCode:: |
| 36 ERROR_INSUFFICIENT_ENCRYPTION: |
| 37 return mojom::ConnectResult::INSUFFICIENT_ENCRYPTION; |
| 38 case device::BluetoothDevice::ConnectErrorCode::ERROR_OFFSET_INVALID: |
| 39 return mojom::ConnectResult::OFFSET_INVALID; |
| 40 case device::BluetoothDevice::ConnectErrorCode::ERROR_READ_NOT_PERMITTED: |
| 41 return mojom::ConnectResult::READ_NOT_PERMITTED; |
| 42 case device::BluetoothDevice::ConnectErrorCode::ERROR_REQUEST_NOT_SUPPORTED: |
| 43 return mojom::ConnectResult::REQUEST_NOT_SUPPORTED; |
| 44 case device::BluetoothDevice::ConnectErrorCode::ERROR_UNKNOWN: |
| 45 return mojom::ConnectResult::UNKNOWN; |
| 46 case device::BluetoothDevice::ConnectErrorCode::ERROR_UNSUPPORTED_DEVICE: |
| 47 return mojom::ConnectResult::UNSUPPORTED_DEVICE; |
| 48 case device::BluetoothDevice::ConnectErrorCode::ERROR_WRITE_NOT_PERMITTED: |
| 49 return mojom::ConnectResult::WRITE_NOT_PERMITTED; |
| 50 case device::BluetoothDevice::ConnectErrorCode::NUM_CONNECT_ERROR_CODES: |
| 51 NOTREACHED(); |
| 52 return mojom::ConnectResult::UNTRANSLATED_CONNECT_ERROR_CODE; |
| 53 } |
| 54 NOTREACHED(); |
| 55 return mojom::ConnectResult::UNTRANSLATED_CONNECT_ERROR_CODE; |
| 56 } |
| 57 } // namespace |
14 | 58 |
15 Adapter::Adapter(scoped_refptr<device::BluetoothAdapter> adapter) | 59 Adapter::Adapter(scoped_refptr<device::BluetoothAdapter> adapter) |
16 : adapter_(std::move(adapter)), client_(nullptr), weak_ptr_factory_(this) { | 60 : adapter_(std::move(adapter)), client_(nullptr), weak_ptr_factory_(this) { |
17 adapter_->AddObserver(this); | 61 adapter_->AddObserver(this); |
18 } | 62 } |
19 | 63 |
20 Adapter::~Adapter() { | 64 Adapter::~Adapter() { |
21 adapter_->RemoveObserver(this); | 65 adapter_->RemoveObserver(this); |
22 adapter_ = nullptr; | 66 adapter_ = nullptr; |
23 } | 67 } |
24 | 68 |
25 void Adapter::GetInfo(const GetInfoCallback& callback) { | 69 void Adapter::GetInfo(const GetInfoCallback& callback) { |
26 mojom::AdapterInfoPtr adapter_info = mojom::AdapterInfo::New(); | 70 mojom::AdapterInfoPtr adapter_info = mojom::AdapterInfo::New(); |
27 adapter_info->address = adapter_->GetAddress(); | 71 adapter_info->address = adapter_->GetAddress(); |
28 adapter_info->name = adapter_->GetName(); | 72 adapter_info->name = adapter_->GetName(); |
29 adapter_info->initialized = adapter_->IsInitialized(); | 73 adapter_info->initialized = adapter_->IsInitialized(); |
30 adapter_info->present = adapter_->IsPresent(); | 74 adapter_info->present = adapter_->IsPresent(); |
31 adapter_info->powered = adapter_->IsPowered(); | 75 adapter_info->powered = adapter_->IsPowered(); |
32 adapter_info->discoverable = adapter_->IsDiscoverable(); | 76 adapter_info->discoverable = adapter_->IsDiscoverable(); |
33 adapter_info->discovering = adapter_->IsDiscovering(); | 77 adapter_info->discovering = adapter_->IsDiscovering(); |
34 callback.Run(std::move(adapter_info)); | 78 callback.Run(std::move(adapter_info)); |
35 } | 79 } |
36 | 80 |
37 void Adapter::GetDevice(const std::string& address, | 81 void Adapter::ConnectToDevice(const std::string& address, |
38 const GetDeviceCallback& callback) { | 82 const ConnectToDeviceCallback& callback) { |
39 mojom::DevicePtr device_ptr; | 83 device::BluetoothDevice* device = adapter_->GetDevice(address); |
40 mojo::MakeStrongBinding(base::MakeUnique<Device>(address, adapter_), | 84 |
41 mojo::GetProxy(&device_ptr)); | 85 if (!device) { |
42 callback.Run(std::move(device_ptr)); | 86 callback.Run(mojom::ConnectResult::DEVICE_NO_LONGER_IN_RANGE, |
| 87 nullptr /* device */); |
| 88 return; |
| 89 } |
| 90 |
| 91 device->CreateGattConnection( |
| 92 base::Bind(&Adapter::OnGattConnected, weak_ptr_factory_.GetWeakPtr(), |
| 93 callback), |
| 94 base::Bind(&Adapter::OnConnectError, weak_ptr_factory_.GetWeakPtr(), |
| 95 callback)); |
43 } | 96 } |
44 | 97 |
45 void Adapter::GetDevices(const GetDevicesCallback& callback) { | 98 void Adapter::GetDevices(const GetDevicesCallback& callback) { |
46 std::vector<mojom::DeviceInfoPtr> devices; | 99 std::vector<mojom::DeviceInfoPtr> devices; |
47 | 100 |
48 for (const device::BluetoothDevice* device : adapter_->GetDevices()) { | 101 for (const device::BluetoothDevice* device : adapter_->GetDevices()) { |
49 mojom::DeviceInfoPtr device_info = | 102 mojom::DeviceInfoPtr device_info = |
50 Device::ConstructDeviceInfoStruct(device); | 103 Device::ConstructDeviceInfoStruct(device); |
51 devices.push_back(std::move(device_info)); | 104 devices.push_back(std::move(device_info)); |
52 } | 105 } |
(...skipping 22 matching lines...) Expand all Loading... |
75 } | 128 } |
76 | 129 |
77 void Adapter::DeviceChanged(device::BluetoothAdapter* adapter, | 130 void Adapter::DeviceChanged(device::BluetoothAdapter* adapter, |
78 device::BluetoothDevice* device) { | 131 device::BluetoothDevice* device) { |
79 if (client_) { | 132 if (client_) { |
80 auto device_info = Device::ConstructDeviceInfoStruct(device); | 133 auto device_info = Device::ConstructDeviceInfoStruct(device); |
81 client_->DeviceChanged(std::move(device_info)); | 134 client_->DeviceChanged(std::move(device_info)); |
82 } | 135 } |
83 } | 136 } |
84 | 137 |
| 138 void Adapter::OnGattConnected( |
| 139 const ConnectToDeviceCallback& callback, |
| 140 std::unique_ptr<device::BluetoothGattConnection> connection) { |
| 141 mojom::DevicePtr device_ptr; |
| 142 Device::Create(adapter_, std::move(connection), mojo::GetProxy(&device_ptr)); |
| 143 callback.Run(mojom::ConnectResult::SUCCESS, std::move(device_ptr)); |
| 144 } |
| 145 |
| 146 void Adapter::OnConnectError( |
| 147 const ConnectToDeviceCallback& callback, |
| 148 device::BluetoothDevice::ConnectErrorCode error_code) { |
| 149 mojom::ConnectResult code = BluetoothErrorCodeToMojomResult(error_code); |
| 150 callback.Run(code, nullptr /* Device */); |
| 151 } |
85 } // namespace bluetooth | 152 } // namespace bluetooth |
OLD | NEW |