1 // Copyright (c) 2012 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 "device/bluetooth/bluetooth_device.h"
6
7 #include <string>
8
9 #include "base/strings/utf_string_conversions.h"
10 #include "device/bluetooth/bluetooth_utils.h"
11 #include "grit/device_bluetooth_strings.h"
12 #include "ui/base/l10n/l10n_util.h"
13
14 namespace device {
15
16 // static
IsUUIDValid(const std::string & uuid)17 bool BluetoothDevice::IsUUIDValid(const std::string& uuid) {
18 return !bluetooth_utils::CanonicalUuid(uuid).empty();
19 }
20
BluetoothDevice()21 BluetoothDevice::BluetoothDevice() {
22 }
23
~BluetoothDevice()24 BluetoothDevice::~BluetoothDevice() {
25 }
26
GetName() const27 string16 BluetoothDevice::GetName() const {
28 std::string name = GetDeviceName();
29 if (!name.empty()) {
30 return UTF8ToUTF16(name);
31 } else {
32 return GetAddressWithLocalizedDeviceTypeName();
33 }
34 }
35
GetAddressWithLocalizedDeviceTypeName() const36 string16 BluetoothDevice::GetAddressWithLocalizedDeviceTypeName() const {
37 string16 address_utf16 = UTF8ToUTF16(GetAddress());
38 BluetoothDevice::DeviceType device_type = GetDeviceType();
39 switch (device_type) {
40 case DEVICE_COMPUTER:
41 return l10n_util::GetStringFUTF16(IDS_BLUETOOTH_DEVICE_COMPUTER,
42 address_utf16);
43 case DEVICE_PHONE:
44 return l10n_util::GetStringFUTF16(IDS_BLUETOOTH_DEVICE_PHONE,
45 address_utf16);
46 case DEVICE_MODEM:
47 return l10n_util::GetStringFUTF16(IDS_BLUETOOTH_DEVICE_MODEM,
48 address_utf16);
49 case DEVICE_AUDIO:
50 return l10n_util::GetStringFUTF16(IDS_BLUETOOTH_DEVICE_AUDIO,
51 address_utf16);
52 case DEVICE_CAR_AUDIO:
53 return l10n_util::GetStringFUTF16(IDS_BLUETOOTH_DEVICE_CAR_AUDIO,
54 address_utf16);
55 case DEVICE_VIDEO:
56 return l10n_util::GetStringFUTF16(IDS_BLUETOOTH_DEVICE_VIDEO,
57 address_utf16);
58 case DEVICE_JOYSTICK:
59 return l10n_util::GetStringFUTF16(IDS_BLUETOOTH_DEVICE_JOYSTICK,
60 address_utf16);
61 case DEVICE_GAMEPAD:
62 return l10n_util::GetStringFUTF16(IDS_BLUETOOTH_DEVICE_GAMEPAD,
63 address_utf16);
64 case DEVICE_KEYBOARD:
65 return l10n_util::GetStringFUTF16(IDS_BLUETOOTH_DEVICE_KEYBOARD,
66 address_utf16);
67 case DEVICE_MOUSE:
68 return l10n_util::GetStringFUTF16(IDS_BLUETOOTH_DEVICE_MOUSE,
69 address_utf16);
70 case DEVICE_TABLET:
71 return l10n_util::GetStringFUTF16(IDS_BLUETOOTH_DEVICE_TABLET,
72 address_utf16);
73 case DEVICE_KEYBOARD_MOUSE_COMBO:
74 return l10n_util::GetStringFUTF16(
75 IDS_BLUETOOTH_DEVICE_KEYBOARD_MOUSE_COMBO, address_utf16);
76 default:
77 return l10n_util::GetStringFUTF16(IDS_BLUETOOTH_DEVICE_UNKNOWN,
78 address_utf16);
79 }
80 }
81
GetDeviceType() const82 BluetoothDevice::DeviceType BluetoothDevice::GetDeviceType() const {
83 // https://www.bluetooth.org/Technical/AssignedNumbers/baseband.htm
84 uint32 bluetooth_class = GetBluetoothClass();
85 switch ((bluetooth_class & 0x1f00) >> 8) {
86 case 0x01:
87 // Computer major device class.
88 return DEVICE_COMPUTER;
89 case 0x02:
90 // Phone major device class.
91 switch ((bluetooth_class & 0xfc) >> 2) {
92 case 0x01:
93 case 0x02:
94 case 0x03:
95 // Cellular, cordless and smart phones.
96 return DEVICE_PHONE;
97 case 0x04:
98 case 0x05:
99 // Modems: wired or voice gateway and common ISDN access.
100 return DEVICE_MODEM;
101 }
102 break;
103 case 0x04:
104 // Audio major device class.
105 switch ((bluetooth_class & 0xfc) >> 2) {
106 case 0x08:
107 // Car audio.
108 return DEVICE_CAR_AUDIO;
109 case 0x0b:
110 case 0x0c:
111 case 0x0d:
112 case 0x0e:
113 case 0x0f:
114 case 0x010:
115 // Video devices.
116 return DEVICE_VIDEO;
117 default:
118 return DEVICE_AUDIO;
119 }
120 break;
121 case 0x05:
122 // Peripheral major device class.
123 switch ((bluetooth_class & 0xc0) >> 6) {
124 case 0x00:
125 // "Not a keyboard or pointing device."
126 switch ((bluetooth_class & 0x01e) >> 2) {
127 case 0x01:
128 // Joystick.
129 return DEVICE_JOYSTICK;
130 case 0x02:
131 // Gamepad.
132 return DEVICE_GAMEPAD;
133 default:
134 return DEVICE_PERIPHERAL;
135 }
136 break;
137 case 0x01:
138 // Keyboard.
139 return DEVICE_KEYBOARD;
140 case 0x02:
141 // Pointing device.
142 switch ((bluetooth_class & 0x01e) >> 2) {
143 case 0x05:
144 // Digitizer tablet.
145 return DEVICE_TABLET;
146 default:
147 // Mouse.
148 return DEVICE_MOUSE;
149 }
150 break;
151 case 0x03:
152 // Combo device.
153 return DEVICE_KEYBOARD_MOUSE_COMBO;
154 }
155 break;
156 }
157
158 return DEVICE_UNKNOWN;
159 }
160
IsPairable() const161 bool BluetoothDevice::IsPairable() const {
162 DeviceType type = GetDeviceType();
163
164 // Get the vendor part of the address: "00:11:22" for "00:11:22:33:44:55"
165 std::string vendor = GetAddress().substr(0, 8);
166
167 // Verbatim "Bluetooth Mouse", model 96674
168 if ((type == DEVICE_MOUSE && vendor == "00:12:A1") ||
169 // Microsoft "Microsoft Bluetooth Notebook Mouse 5000", model X807028-001
170 (type == DEVICE_MOUSE && vendor == "7C:ED:8D"))
171 return false;
172 // TODO: Move this database into a config file.
173
174 return true;
175 }
176
ProvidesServiceWithUUID(const std::string & uuid) const177 bool BluetoothDevice::ProvidesServiceWithUUID(
178 const std::string& uuid) const {
179 std::string canonical_uuid = bluetooth_utils::CanonicalUuid(uuid);
180 BluetoothDevice::ServiceList services = GetServices();
181 for (BluetoothDevice::ServiceList::const_iterator iter = services.begin();
182 iter != services.end();
183 ++iter) {
184 if (bluetooth_utils::CanonicalUuid(*iter) == canonical_uuid)
185 return true;
186 }
187 return false;
188 }
189
190 } // namespace device
191