blob: 7b6ee0d927ef75029bce207013e585a3ebafc785 [file] [log] [blame]
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "device/bluetooth/bluetooth_device.h"
#include <string>
#include "base/strings/utf_string_conversions.h"
#include "device/bluetooth/bluetooth_utils.h"
#include "grit/device_bluetooth_strings.h"
#include "ui/base/l10n/l10n_util.h"
namespace device {
// static
bool BluetoothDevice::IsUUIDValid(const std::string& uuid) {
return !bluetooth_utils::CanonicalUuid(uuid).empty();
}
BluetoothDevice::BluetoothDevice() {
}
BluetoothDevice::~BluetoothDevice() {
}
string16 BluetoothDevice::GetName() const {
std::string name = GetDeviceName();
if (!name.empty()) {
return UTF8ToUTF16(name);
} else {
return GetAddressWithLocalizedDeviceTypeName();
}
}
string16 BluetoothDevice::GetAddressWithLocalizedDeviceTypeName() const {
string16 address_utf16 = UTF8ToUTF16(GetAddress());
BluetoothDevice::DeviceType device_type = GetDeviceType();
switch (device_type) {
case DEVICE_COMPUTER:
return l10n_util::GetStringFUTF16(IDS_BLUETOOTH_DEVICE_COMPUTER,
address_utf16);
case DEVICE_PHONE:
return l10n_util::GetStringFUTF16(IDS_BLUETOOTH_DEVICE_PHONE,
address_utf16);
case DEVICE_MODEM:
return l10n_util::GetStringFUTF16(IDS_BLUETOOTH_DEVICE_MODEM,
address_utf16);
case DEVICE_AUDIO:
return l10n_util::GetStringFUTF16(IDS_BLUETOOTH_DEVICE_AUDIO,
address_utf16);
case DEVICE_CAR_AUDIO:
return l10n_util::GetStringFUTF16(IDS_BLUETOOTH_DEVICE_CAR_AUDIO,
address_utf16);
case DEVICE_VIDEO:
return l10n_util::GetStringFUTF16(IDS_BLUETOOTH_DEVICE_VIDEO,
address_utf16);
case DEVICE_JOYSTICK:
return l10n_util::GetStringFUTF16(IDS_BLUETOOTH_DEVICE_JOYSTICK,
address_utf16);
case DEVICE_GAMEPAD:
return l10n_util::GetStringFUTF16(IDS_BLUETOOTH_DEVICE_GAMEPAD,
address_utf16);
case DEVICE_KEYBOARD:
return l10n_util::GetStringFUTF16(IDS_BLUETOOTH_DEVICE_KEYBOARD,
address_utf16);
case DEVICE_MOUSE:
return l10n_util::GetStringFUTF16(IDS_BLUETOOTH_DEVICE_MOUSE,
address_utf16);
case DEVICE_TABLET:
return l10n_util::GetStringFUTF16(IDS_BLUETOOTH_DEVICE_TABLET,
address_utf16);
case DEVICE_KEYBOARD_MOUSE_COMBO:
return l10n_util::GetStringFUTF16(
IDS_BLUETOOTH_DEVICE_KEYBOARD_MOUSE_COMBO, address_utf16);
default:
return l10n_util::GetStringFUTF16(IDS_BLUETOOTH_DEVICE_UNKNOWN,
address_utf16);
}
}
BluetoothDevice::DeviceType BluetoothDevice::GetDeviceType() const {
// https://www.bluetooth.org/Technical/AssignedNumbers/baseband.htm
uint32 bluetooth_class = GetBluetoothClass();
switch ((bluetooth_class & 0x1f00) >> 8) {
case 0x01:
// Computer major device class.
return DEVICE_COMPUTER;
case 0x02:
// Phone major device class.
switch ((bluetooth_class & 0xfc) >> 2) {
case 0x01:
case 0x02:
case 0x03:
// Cellular, cordless and smart phones.
return DEVICE_PHONE;
case 0x04:
case 0x05:
// Modems: wired or voice gateway and common ISDN access.
return DEVICE_MODEM;
}
break;
case 0x04:
// Audio major device class.
switch ((bluetooth_class & 0xfc) >> 2) {
case 0x08:
// Car audio.
return DEVICE_CAR_AUDIO;
case 0x0b:
case 0x0c:
case 0x0d:
case 0x0e:
case 0x0f:
case 0x010:
// Video devices.
return DEVICE_VIDEO;
default:
return DEVICE_AUDIO;
}
break;
case 0x05:
// Peripheral major device class.
switch ((bluetooth_class & 0xc0) >> 6) {
case 0x00:
// "Not a keyboard or pointing device."
switch ((bluetooth_class & 0x01e) >> 2) {
case 0x01:
// Joystick.
return DEVICE_JOYSTICK;
case 0x02:
// Gamepad.
return DEVICE_GAMEPAD;
default:
return DEVICE_PERIPHERAL;
}
break;
case 0x01:
// Keyboard.
return DEVICE_KEYBOARD;
case 0x02:
// Pointing device.
switch ((bluetooth_class & 0x01e) >> 2) {
case 0x05:
// Digitizer tablet.
return DEVICE_TABLET;
default:
// Mouse.
return DEVICE_MOUSE;
}
break;
case 0x03:
// Combo device.
return DEVICE_KEYBOARD_MOUSE_COMBO;
}
break;
}
return DEVICE_UNKNOWN;
}
bool BluetoothDevice::IsPairable() const {
DeviceType type = GetDeviceType();
// Get the vendor part of the address: "00:11:22" for "00:11:22:33:44:55"
std::string vendor = GetAddress().substr(0, 8);
// Verbatim "Bluetooth Mouse", model 96674
if ((type == DEVICE_MOUSE && vendor == "00:12:A1") ||
// Microsoft "Microsoft Bluetooth Notebook Mouse 5000", model X807028-001
(type == DEVICE_MOUSE && vendor == "7C:ED:8D"))
return false;
// TODO: Move this database into a config file.
return true;
}
bool BluetoothDevice::ProvidesServiceWithUUID(
const std::string& uuid) const {
std::string canonical_uuid = bluetooth_utils::CanonicalUuid(uuid);
BluetoothDevice::ServiceList services = GetServices();
for (BluetoothDevice::ServiceList::const_iterator iter = services.begin();
iter != services.end();
++iter) {
if (bluetooth_utils::CanonicalUuid(*iter) == canonical_uuid)
return true;
}
return false;
}
} // namespace device