Home | History | Annotate | Download | only in hal
      1 //
      2 //  Copyright 2015 Google, Inc.
      3 //
      4 //  Licensed under the Apache License, Version 2.0 (the "License");
      5 //  you may not use this file except in compliance with the License.
      6 //  You may obtain a copy of the License at:
      7 //
      8 //  http://www.apache.org/licenses/LICENSE-2.0
      9 //
     10 //  Unless required by applicable law or agreed to in writing, software
     11 //  distributed under the License is distributed on an "AS IS" BASIS,
     12 //  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13 //  See the License for the specific language governing permissions and
     14 //  limitations under the License.
     15 //
     16 
     17 #include "service/hal/fake_bluetooth_interface.h"
     18 
     19 namespace bluetooth {
     20 namespace hal {
     21 
     22 namespace {
     23 
     24 FakeBluetoothInterface::Manager g_hal_manager;
     25 
     26 int FakeHALEnable(bool start_restricted) {
     27   return g_hal_manager.enable_succeed ? BT_STATUS_SUCCESS : BT_STATUS_FAIL;
     28 }
     29 
     30 int FakeHALDisable() {
     31   return g_hal_manager.disable_succeed ? BT_STATUS_SUCCESS : BT_STATUS_FAIL;
     32 }
     33 
     34 int FakeHALGetAdapterProperties() { return BT_STATUS_SUCCESS; }
     35 
     36 int FakeHALSetAdapterProperty(const bt_property_t* /* property */) {
     37   LOG(INFO) << __func__;
     38   return (g_hal_manager.set_property_succeed ? BT_STATUS_SUCCESS
     39                                              : BT_STATUS_FAIL);
     40 }
     41 
     42 bt_interface_t fake_bt_iface = {
     43     sizeof(bt_interface_t),
     44     nullptr, /* init */
     45     FakeHALEnable,
     46     FakeHALDisable,
     47     nullptr, /* cleanup */
     48     FakeHALGetAdapterProperties,
     49     nullptr, /* get_adapter_property */
     50     FakeHALSetAdapterProperty,
     51     nullptr, /* get_remote_device_properties */
     52     nullptr, /* get_remote_device_property */
     53     nullptr, /* set_remote_device_property */
     54     nullptr, /* get_remote_service_record */
     55     nullptr, /* get_remote_services */
     56     nullptr, /* start_discovery */
     57     nullptr, /* cancel_discovery */
     58     nullptr, /* create_bond */
     59     nullptr, /* create_bond_out_of_band */
     60     nullptr, /* remove_bond */
     61     nullptr, /* cancel_bond */
     62     nullptr, /* get_connection_state */
     63     nullptr, /* pin_reply */
     64     nullptr, /* ssp_reply */
     65     nullptr, /* get_profile_interface */
     66     nullptr, /* dut_mode_configure */
     67     nullptr, /* dut_more_send */
     68     nullptr, /* le_test_mode */
     69     nullptr, /* set_os_callouts */
     70     nullptr, /* read_energy_info */
     71     nullptr, /* dump */
     72     nullptr, /* dumpMetrics */
     73     nullptr, /* config clear */
     74     nullptr, /* interop_database_clear */
     75     nullptr, /* interop_database_add */
     76     nullptr, /* get_avrcp_service */
     77 };
     78 
     79 }  // namespace
     80 
     81 // static
     82 FakeBluetoothInterface::Manager* FakeBluetoothInterface::GetManager() {
     83   return &g_hal_manager;
     84 }
     85 
     86 FakeBluetoothInterface::Manager::Manager()
     87     : enable_succeed(false),
     88       disable_succeed(false),
     89       set_property_succeed(false) {}
     90 
     91 void FakeBluetoothInterface::NotifyAdapterStateChanged(bt_state_t state) {
     92   for (auto& observer : observers_) {
     93     observer.AdapterStateChangedCallback(state);
     94   }
     95 }
     96 
     97 void FakeBluetoothInterface::NotifyAdapterPropertiesChanged(
     98     int num_properties, bt_property_t* properties) {
     99   for (auto& observer : observers_) {
    100     observer.AdapterPropertiesCallback(BT_STATUS_SUCCESS, num_properties,
    101                                        properties);
    102   }
    103 }
    104 
    105 void FakeBluetoothInterface::NotifyAdapterNamePropertyChanged(
    106     const std::string& name) {
    107   bt_bdname_t hal_name;
    108   strncpy(reinterpret_cast<char*>(hal_name.name), name.c_str(),
    109           std::min(sizeof(hal_name) - 1, name.length()));
    110   reinterpret_cast<char*>(hal_name.name)[name.length()] = '\0';
    111 
    112   bt_property_t property;
    113   property.len = sizeof(hal_name);
    114   property.val = &hal_name;
    115   property.type = BT_PROPERTY_BDNAME;
    116 
    117   NotifyAdapterPropertiesChanged(1, &property);
    118 }
    119 
    120 void FakeBluetoothInterface::NotifyAdapterAddressPropertyChanged(
    121     const RawAddress* address) {
    122   bt_property_t property;
    123   property.len = RawAddress::kLength;
    124   property.val = (void*)address->address;
    125   property.type = BT_PROPERTY_BDADDR;
    126 
    127   NotifyAdapterPropertiesChanged(1, &property);
    128 }
    129 
    130 void FakeBluetoothInterface::NotifyAdapterLocalLeFeaturesPropertyChanged(
    131     const bt_local_le_features_t* features) {
    132   bt_property_t property;
    133   property.len = sizeof(*features);
    134   property.val = (void*)features;
    135   property.type = BT_PROPERTY_LOCAL_LE_FEATURES;
    136 
    137   NotifyAdapterPropertiesChanged(1, &property);
    138 }
    139 
    140 void FakeBluetoothInterface::NotifyAclStateChangedCallback(
    141     bt_status_t status, const RawAddress& remote_bdaddr, bt_acl_state_t state) {
    142   for (auto& observer : observers_) {
    143     observer.AclStateChangedCallback(status, remote_bdaddr, state);
    144   }
    145 }
    146 
    147 void FakeBluetoothInterface::AddObserver(Observer* observer) {
    148   observers_.AddObserver(observer);
    149 }
    150 
    151 void FakeBluetoothInterface::RemoveObserver(Observer* observer) {
    152   observers_.RemoveObserver(observer);
    153 }
    154 
    155 const bt_interface_t* FakeBluetoothInterface::GetHALInterface() const {
    156   return &fake_bt_iface;
    157 }
    158 
    159 bt_callbacks_t* FakeBluetoothInterface::GetHALCallbacks() const {
    160   return nullptr;
    161 }
    162 
    163 }  // namespace hal
    164 }  // namespace bluetooth
    165