Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(30)

Side by Side Diff: components/arc/bluetooth/arc_bluetooth_bridge.cc

Issue 2376873002: arc: bluetooth: Use uuid 128 bit for service uuid (Closed)
Patch Set: Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 "components/arc/bluetooth/arc_bluetooth_bridge.h" 5 #include "components/arc/bluetooth/arc_bluetooth_bridge.h"
6 6
7 #include <bluetooth/bluetooth.h> 7 #include <bluetooth/bluetooth.h>
8 #include <fcntl.h> 8 #include <fcntl.h>
9 #include <stddef.h> 9 #include <stddef.h>
10 #include <sys/socket.h> 10 #include <sys/socket.h>
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after
187 if (status == arc::mojom::BluetoothGattStatus::GATT_SUCCESS) 187 if (status == arc::mojom::BluetoothGattStatus::GATT_SUCCESS)
188 success_callback.Run(); 188 success_callback.Run();
189 else 189 else
190 error_callback.Run(); 190 error_callback.Run();
191 } 191 }
192 192
193 bool IsGattOffsetValid(int offset) { 193 bool IsGattOffsetValid(int offset) {
194 return 0 <= offset && offset < kMaxGattAttributeLength; 194 return 0 <= offset && offset < kMaxGattAttributeLength;
195 } 195 }
196 196
197 // This is needed because Android only support UUID 16 bits in advertising data. 197 bool isUuid16(const BluetoothUUID& uuid) {
198 // Convert to uuid16 and compare with original uuid.
199 return uuid == BluetoothUUID(uuid.canonical_value().substr(4, 4));
200 }
201
202 // This is needed because Android only support UUID 16 bits in service data
203 // section in advertising data
198 uint16_t GetUUID16(const BluetoothUUID& uuid) { 204 uint16_t GetUUID16(const BluetoothUUID& uuid) {
199 // Convert xxxxyyyy-xxxx-xxxx-xxxx-xxxxxxxxxxxx to int16 yyyy 205 // Convert xxxxyyyy-xxxx-xxxx-xxxx-xxxxxxxxxxxx to int16 yyyy
206 if (!isUuid16(uuid))
207 LOG(WARNING) << "Illegal conversion to UUID16 " << uuid.canonical_value();
200 return std::stoi(uuid.canonical_value().substr(4, 4), nullptr, 16); 208 return std::stoi(uuid.canonical_value().substr(4, 4), nullptr, 16);
201 } 209 }
202 210
203 mojo::Array<arc::mojom::BluetoothPropertyPtr> GetDiscoveryTimeoutProperty( 211 mojo::Array<arc::mojom::BluetoothPropertyPtr> GetDiscoveryTimeoutProperty(
204 uint32_t timeout) { 212 uint32_t timeout) {
205 arc::mojom::BluetoothPropertyPtr property = 213 arc::mojom::BluetoothPropertyPtr property =
206 arc::mojom::BluetoothProperty::New(); 214 arc::mojom::BluetoothProperty::New();
207 property->set_discovery_timeout(timeout); 215 property->set_discovery_timeout(timeout);
208 mojo::Array<arc::mojom::BluetoothPropertyPtr> properties; 216 mojo::Array<arc::mojom::BluetoothPropertyPtr> properties;
209 properties.push_back(std::move(property)); 217 properties.push_back(std::move(property));
(...skipping 1639 matching lines...) Expand 10 before | Expand all | Expand 10 after
1849 btp->set_local_le_features(std::move(le_features)); 1857 btp->set_local_le_features(std::move(le_features));
1850 properties.push_back(std::move(btp)); 1858 properties.push_back(std::move(btp));
1851 } 1859 }
1852 1860
1853 return properties; 1861 return properties;
1854 } 1862 }
1855 1863
1856 // Android support 5 types of Advertising Data. 1864 // Android support 5 types of Advertising Data.
1857 // However Chrome didn't expose AdvertiseFlag and ManufacturerData. 1865 // However Chrome didn't expose AdvertiseFlag and ManufacturerData.
1858 // So we will only expose local_name, service_uuids and service_data. 1866 // So we will only expose local_name, service_uuids and service_data.
1859 // Note that we need to use UUID 16 bits because Android does not support 1867 // Note that we need to use UUID 16 bits because Android does not support
Luis Héctor Chávez 2016/09/28 16:11:48 This does not seem to be true anymore? Or at least
puthik_chromium 2016/09/29 21:06:50 Done.
1860 // UUID 128 bits. 1868 // UUID 128 bits.
1861 // TODO(crbug.com/618442) Make Chrome expose missing data. 1869 // TODO(crbug.com/618442) Make Chrome expose missing data.
1862 mojo::Array<mojom::BluetoothAdvertisingDataPtr> 1870 mojo::Array<mojom::BluetoothAdvertisingDataPtr>
1863 ArcBluetoothBridge::GetAdvertisingData(BluetoothDevice* device) const { 1871 ArcBluetoothBridge::GetAdvertisingData(BluetoothDevice* device) const {
1864 mojo::Array<mojom::BluetoothAdvertisingDataPtr> advertising_data; 1872 mojo::Array<mojom::BluetoothAdvertisingDataPtr> advertising_data;
1865 1873
1866 // LocalName 1874 // LocalName
1867 mojom::BluetoothAdvertisingDataPtr local_name = 1875 mojom::BluetoothAdvertisingDataPtr local_name =
1868 mojom::BluetoothAdvertisingData::New(); 1876 mojom::BluetoothAdvertisingData::New();
1869 local_name->set_local_name(device->GetName() ? device->GetName().value() 1877 local_name->set_local_name(device->GetName() ? device->GetName().value()
1870 : nullptr); 1878 : nullptr);
1871 advertising_data.push_back(std::move(local_name)); 1879 advertising_data.push_back(std::move(local_name));
1872 1880
1873 // ServiceUuid 1881 // ServiceUuid
1874 BluetoothDevice::UUIDSet uuid_set = device->GetUUIDs(); 1882 BluetoothDevice::UUIDSet uuid_set = device->GetUUIDs();
1875 if (uuid_set.size() > 0) { 1883 if (uuid_set.size() > 0) {
1876 mojom::BluetoothAdvertisingDataPtr service_uuids_16 = 1884 mojom::BluetoothAdvertisingDataPtr service_uuids =
1877 mojom::BluetoothAdvertisingData::New(); 1885 mojom::BluetoothAdvertisingData::New();
1878 mojo::Array<uint16_t> uuid16s(uuid_set.size()); 1886 if (std::all_of(uuid_set.begin(), uuid_set.end(), isUuid16)) {
1879 size_t i = 0; 1887 mojo::Array<uint16_t> uuid16s(uuid_set.size());
1880 for (const auto& uuid : uuid_set) { 1888 size_t i = 0;
1881 uuid16s[i] = GetUUID16(uuid); 1889 for (const auto& uuid : uuid_set) {
1882 i++; 1890 uuid16s[i] = GetUUID16(uuid);
1891 i++;
Luis Héctor Chávez 2016/09/28 16:11:48 Ugh, more of this pattern :( Can you try using th
puthik_chromium 2016/09/29 02:06:08 It works. Thanks for doing this.
1892 }
1893 service_uuids->set_service_uuids_16(std::move(uuid16s));
1894 } else {
1895 mojo::Array<BluetoothUUID> uuids(uuid_set.size());
1896 size_t i = 0;
1897 for (const auto& uuid : uuid_set) {
1898 uuids[i] = uuid;
1899 i++;
1900 }
1901 service_uuids->set_service_uuids(std::move(uuids));
1883 } 1902 }
1884 service_uuids_16->set_service_uuids_16(std::move(uuid16s)); 1903 advertising_data.push_back(std::move(service_uuids));
1885 advertising_data.push_back(std::move(service_uuids_16));
1886 } 1904 }
1887 1905
1888 // Service data 1906 // Service data
1889 for (const BluetoothUUID& uuid : device->GetServiceDataUUIDs()) { 1907 for (const BluetoothUUID& uuid : device->GetServiceDataUUIDs()) {
1890 mojom::BluetoothAdvertisingDataPtr service_data_element = 1908 mojom::BluetoothAdvertisingDataPtr service_data_element =
1891 mojom::BluetoothAdvertisingData::New(); 1909 mojom::BluetoothAdvertisingData::New();
1892 mojom::BluetoothServiceDataPtr service_data = 1910 mojom::BluetoothServiceDataPtr service_data =
1893 mojom::BluetoothServiceData::New(); 1911 mojom::BluetoothServiceData::New();
1894 1912
1895 service_data->uuid_16bit = GetUUID16(uuid); 1913 service_data->uuid_16bit = GetUUID16(uuid);
Luis Héctor Chávez 2016/09/28 16:11:48 In which cases |uuid| won't be an uuid16? Will it
puthik_chromium 2016/09/29 21:06:50 I think it is rare not to have uuid 16 bit for ser
1896 1914
1897 const std::vector<uint8_t>* data = device->GetServiceDataForUUID(uuid); 1915 const std::vector<uint8_t>* data = device->GetServiceDataForUUID(uuid);
1898 DCHECK(data != nullptr); 1916 DCHECK(data != nullptr);
1899 1917
1900 std::vector<uint8_t> data_copy = *data; 1918 std::vector<uint8_t> data_copy = *data;
1901 service_data->data.Swap(&data_copy); 1919 service_data->data.Swap(&data_copy);
1902 1920
1903 service_data_element->set_service_data(std::move(service_data)); 1921 service_data_element->set_service_data(std::move(service_data));
1904 advertising_data.push_back(std::move(service_data_element)); 1922 advertising_data.push_back(std::move(service_data_element));
1905 } 1923 }
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
2022 sdp_bluetooth_instance->OnGetSdpRecords( 2040 sdp_bluetooth_instance->OnGetSdpRecords(
2023 status, std::move(remote_addr), target_uuid, 2041 status, std::move(remote_addr), target_uuid,
2024 mojo::Array<mojom::BluetoothSdpRecordPtr>::New(0)); 2042 mojo::Array<mojom::BluetoothSdpRecordPtr>::New(0));
2025 } 2043 }
2026 2044
2027 bool ArcBluetoothBridge::CalledOnValidThread() { 2045 bool ArcBluetoothBridge::CalledOnValidThread() {
2028 return thread_checker_.CalledOnValidThread(); 2046 return thread_checker_.CalledOnValidThread();
2029 } 2047 }
2030 2048
2031 } // namespace arc 2049 } // namespace arc
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698