• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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