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 "extensions/browser/api/bluetooth/bluetooth_api_utils.h"
6
7#include "base/strings/utf_string_conversions.h"
8#include "base/values.h"
9#include "device/bluetooth/bluetooth_adapter.h"
10#include "device/bluetooth/bluetooth_device.h"
11#include "extensions/common/api/bluetooth.h"
12
13namespace bluetooth = extensions::core_api::bluetooth;
14
15using device::BluetoothDevice;
16using bluetooth::VendorIdSource;
17
18namespace {
19
20bool ConvertVendorIDSourceToApi(const BluetoothDevice::VendorIDSource& input,
21                                bluetooth::VendorIdSource* output) {
22  switch (input) {
23    case BluetoothDevice::VENDOR_ID_UNKNOWN:
24      *output = bluetooth::VENDOR_ID_SOURCE_NONE;
25      return true;
26    case BluetoothDevice::VENDOR_ID_BLUETOOTH:
27      *output = bluetooth::VENDOR_ID_SOURCE_BLUETOOTH;
28      return true;
29    case BluetoothDevice::VENDOR_ID_USB:
30      *output = bluetooth::VENDOR_ID_SOURCE_USB;
31      return true;
32    default:
33      NOTREACHED();
34      return false;
35  }
36}
37
38bool ConvertDeviceTypeToApi(const BluetoothDevice::DeviceType& input,
39                            bluetooth::DeviceType* output) {
40  switch (input) {
41    case BluetoothDevice::DEVICE_UNKNOWN:
42      *output = bluetooth::DEVICE_TYPE_NONE;
43      return true;
44    case BluetoothDevice::DEVICE_COMPUTER:
45      *output = bluetooth::DEVICE_TYPE_COMPUTER;
46      return true;
47    case BluetoothDevice::DEVICE_PHONE:
48      *output = bluetooth::DEVICE_TYPE_PHONE;
49      return true;
50    case BluetoothDevice::DEVICE_MODEM:
51      *output = bluetooth::DEVICE_TYPE_MODEM;
52      return true;
53    case BluetoothDevice::DEVICE_AUDIO:
54      *output = bluetooth::DEVICE_TYPE_AUDIO;
55      return true;
56    case BluetoothDevice::DEVICE_CAR_AUDIO:
57      *output = bluetooth::DEVICE_TYPE_CARAUDIO;
58      return true;
59    case BluetoothDevice::DEVICE_VIDEO:
60      *output = bluetooth::DEVICE_TYPE_VIDEO;
61      return true;
62    case BluetoothDevice::DEVICE_PERIPHERAL:
63      *output = bluetooth::DEVICE_TYPE_PERIPHERAL;
64      return true;
65    case BluetoothDevice::DEVICE_JOYSTICK:
66      *output = bluetooth::DEVICE_TYPE_JOYSTICK;
67      return true;
68    case BluetoothDevice::DEVICE_GAMEPAD:
69      *output = bluetooth::DEVICE_TYPE_GAMEPAD;
70      return true;
71    case BluetoothDevice::DEVICE_KEYBOARD:
72      *output = bluetooth::DEVICE_TYPE_KEYBOARD;
73      return true;
74    case BluetoothDevice::DEVICE_MOUSE:
75      *output = bluetooth::DEVICE_TYPE_MOUSE;
76      return true;
77    case BluetoothDevice::DEVICE_TABLET:
78      *output = bluetooth::DEVICE_TYPE_TABLET;
79      return true;
80    case BluetoothDevice::DEVICE_KEYBOARD_MOUSE_COMBO:
81      *output = bluetooth::DEVICE_TYPE_KEYBOARDMOUSECOMBO;
82      return true;
83    default:
84      return false;
85  }
86}
87
88}  // namespace
89
90namespace extensions {
91namespace core_api {
92namespace bluetooth {
93
94void BluetoothDeviceToApiDevice(const device::BluetoothDevice& device,
95                                Device* out) {
96  out->address = device.GetAddress();
97  out->name.reset(new std::string(base::UTF16ToUTF8(device.GetName())));
98  out->device_class.reset(new int(device.GetBluetoothClass()));
99
100  // Only include the Device ID members when one exists for the device, and
101  // always include all or none.
102  if (ConvertVendorIDSourceToApi(device.GetVendorIDSource(),
103                                 &(out->vendor_id_source)) &&
104      out->vendor_id_source != VENDOR_ID_SOURCE_NONE) {
105    out->vendor_id.reset(new int(device.GetVendorID()));
106    out->product_id.reset(new int(device.GetProductID()));
107    out->device_id.reset(new int(device.GetDeviceID()));
108  }
109
110  ConvertDeviceTypeToApi(device.GetDeviceType(), &(out->type));
111
112  out->paired.reset(new bool(device.IsPaired()));
113  out->connected.reset(new bool(device.IsConnected()));
114
115  int rssi = device.GetRSSI();
116  if (rssi != BluetoothDevice::kUnknownPower)
117    out->rssi.reset(new int(rssi));
118
119  if (*out->connected) {
120    int current_transmit_power = device.GetCurrentHostTransmitPower();
121    if (current_transmit_power != BluetoothDevice::kUnknownPower)
122      out->current_host_transmit_power.reset(new int(current_transmit_power));
123    int maximum_transmit_power = device.GetMaximumHostTransmitPower();
124    if (maximum_transmit_power != BluetoothDevice::kUnknownPower)
125      out->maximum_host_transmit_power.reset(new int(maximum_transmit_power));
126  }
127
128  std::vector<std::string>* string_uuids = new std::vector<std::string>();
129  const device::BluetoothDevice::UUIDList& uuids = device.GetUUIDs();
130  for (device::BluetoothDevice::UUIDList::const_iterator iter = uuids.begin();
131       iter != uuids.end(); ++iter)
132    string_uuids->push_back(iter->canonical_value());
133  out->uuids.reset(string_uuids);
134}
135
136void PopulateAdapterState(const device::BluetoothAdapter& adapter,
137                          AdapterState* out) {
138  out->discovering = adapter.IsDiscovering();
139  out->available = adapter.IsPresent();
140  out->powered = adapter.IsPowered();
141  out->name = adapter.GetName();
142  out->address = adapter.GetAddress();
143}
144
145}  // namespace bluetooth
146}  // namespace core_api
147}  // namespace extensions
148