Home | History | Annotate | Download | only in bluetooth
      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 
     13 namespace bluetooth = extensions::core_api::bluetooth;
     14 
     15 using device::BluetoothDevice;
     16 using bluetooth::VendorIdSource;
     17 
     18 namespace {
     19 
     20 bool 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 
     38 bool 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 
     90 namespace extensions {
     91 namespace core_api {
     92 namespace bluetooth {
     93 
     94 void 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 
    136 void 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