blob: 7c100ec71d5330e0842cab531f24aae02c3008c4 [file] [log] [blame]
Torne (Richard Coles)58218062012-11-14 11:43:16 +00001// 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
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +00007#include <string>
8
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +01009#include "base/strings/utf_string_conversions.h"
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000010#include "device/bluetooth/bluetooth_utils.h"
11#include "grit/device_bluetooth_strings.h"
Torne (Richard Coles)58218062012-11-14 11:43:16 +000012#include "ui/base/l10n/l10n_util.h"
13
14namespace device {
15
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000016// static
17bool BluetoothDevice::IsUUIDValid(const std::string& uuid) {
18 return !bluetooth_utils::CanonicalUuid(uuid).empty();
19}
20
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010021BluetoothDevice::BluetoothDevice() {
Torne (Richard Coles)58218062012-11-14 11:43:16 +000022}
23
24BluetoothDevice::~BluetoothDevice() {
25}
26
Torne (Richard Coles)5d1f7b12014-02-21 12:16:55 +000027base::string16 BluetoothDevice::GetName() const {
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010028 std::string name = GetDeviceName();
29 if (!name.empty()) {
Torne (Richard Coles)5d1f7b12014-02-21 12:16:55 +000030 return base::UTF8ToUTF16(name);
Torne (Richard Coles)58218062012-11-14 11:43:16 +000031 } else {
32 return GetAddressWithLocalizedDeviceTypeName();
33 }
34}
35
Torne (Richard Coles)5d1f7b12014-02-21 12:16:55 +000036base::string16 BluetoothDevice::GetAddressWithLocalizedDeviceTypeName() const {
37 base::string16 address_utf16 = base::UTF8ToUTF16(GetAddress());
Torne (Richard Coles)58218062012-11-14 11:43:16 +000038 BluetoothDevice::DeviceType device_type = GetDeviceType();
39 switch (device_type) {
40 case DEVICE_COMPUTER:
41 return l10n_util::GetStringFUTF16(IDS_BLUETOOTH_DEVICE_COMPUTER,
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010042 address_utf16);
Torne (Richard Coles)58218062012-11-14 11:43:16 +000043 case DEVICE_PHONE:
44 return l10n_util::GetStringFUTF16(IDS_BLUETOOTH_DEVICE_PHONE,
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010045 address_utf16);
Torne (Richard Coles)58218062012-11-14 11:43:16 +000046 case DEVICE_MODEM:
47 return l10n_util::GetStringFUTF16(IDS_BLUETOOTH_DEVICE_MODEM,
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010048 address_utf16);
Torne (Richard Coles)58218062012-11-14 11:43:16 +000049 case DEVICE_AUDIO:
50 return l10n_util::GetStringFUTF16(IDS_BLUETOOTH_DEVICE_AUDIO,
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010051 address_utf16);
Torne (Richard Coles)58218062012-11-14 11:43:16 +000052 case DEVICE_CAR_AUDIO:
53 return l10n_util::GetStringFUTF16(IDS_BLUETOOTH_DEVICE_CAR_AUDIO,
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010054 address_utf16);
Torne (Richard Coles)58218062012-11-14 11:43:16 +000055 case DEVICE_VIDEO:
56 return l10n_util::GetStringFUTF16(IDS_BLUETOOTH_DEVICE_VIDEO,
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010057 address_utf16);
Torne (Richard Coles)58218062012-11-14 11:43:16 +000058 case DEVICE_JOYSTICK:
59 return l10n_util::GetStringFUTF16(IDS_BLUETOOTH_DEVICE_JOYSTICK,
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010060 address_utf16);
Torne (Richard Coles)58218062012-11-14 11:43:16 +000061 case DEVICE_GAMEPAD:
62 return l10n_util::GetStringFUTF16(IDS_BLUETOOTH_DEVICE_GAMEPAD,
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010063 address_utf16);
Torne (Richard Coles)58218062012-11-14 11:43:16 +000064 case DEVICE_KEYBOARD:
65 return l10n_util::GetStringFUTF16(IDS_BLUETOOTH_DEVICE_KEYBOARD,
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010066 address_utf16);
Torne (Richard Coles)58218062012-11-14 11:43:16 +000067 case DEVICE_MOUSE:
68 return l10n_util::GetStringFUTF16(IDS_BLUETOOTH_DEVICE_MOUSE,
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010069 address_utf16);
Torne (Richard Coles)58218062012-11-14 11:43:16 +000070 case DEVICE_TABLET:
71 return l10n_util::GetStringFUTF16(IDS_BLUETOOTH_DEVICE_TABLET,
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010072 address_utf16);
Torne (Richard Coles)58218062012-11-14 11:43:16 +000073 case DEVICE_KEYBOARD_MOUSE_COMBO:
74 return l10n_util::GetStringFUTF16(
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010075 IDS_BLUETOOTH_DEVICE_KEYBOARD_MOUSE_COMBO, address_utf16);
Torne (Richard Coles)58218062012-11-14 11:43:16 +000076 default:
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010077 return l10n_util::GetStringFUTF16(IDS_BLUETOOTH_DEVICE_UNKNOWN,
78 address_utf16);
Torne (Richard Coles)58218062012-11-14 11:43:16 +000079 }
80}
81
82BluetoothDevice::DeviceType BluetoothDevice::GetDeviceType() const {
83 // https://www.bluetooth.org/Technical/AssignedNumbers/baseband.htm
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010084 uint32 bluetooth_class = GetBluetoothClass();
85 switch ((bluetooth_class & 0x1f00) >> 8) {
Torne (Richard Coles)58218062012-11-14 11:43:16 +000086 case 0x01:
87 // Computer major device class.
88 return DEVICE_COMPUTER;
89 case 0x02:
90 // Phone major device class.
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010091 switch ((bluetooth_class & 0xfc) >> 2) {
Torne (Richard Coles)58218062012-11-14 11:43:16 +000092 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.
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100105 switch ((bluetooth_class & 0xfc) >> 2) {
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000106 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.
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100123 switch ((bluetooth_class & 0xc0) >> 6) {
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000124 case 0x00:
125 // "Not a keyboard or pointing device."
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100126 switch ((bluetooth_class & 0x01e) >> 2) {
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000127 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.
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100142 switch ((bluetooth_class & 0x01e) >> 2) {
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000143 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
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100161bool BluetoothDevice::IsPairable() const {
162 DeviceType type = GetDeviceType();
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000163
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100164 // 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);
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000166
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100167 // 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.
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000173
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100174 return true;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000175}
176
177bool BluetoothDevice::ProvidesServiceWithUUID(
178 const std::string& uuid) const {
179 std::string canonical_uuid = bluetooth_utils::CanonicalUuid(uuid);
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100180 BluetoothDevice::ServiceList services = GetServices();
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000181 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
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000190} // namespace device