| // |
| // Copyright (C) 2015 Google, Inc. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at: |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| // |
| |
| #include "service/hal/fake_bluetooth_interface.h" |
| |
| namespace bluetooth { |
| namespace hal { |
| |
| namespace { |
| |
| FakeBluetoothInterface::Manager g_hal_manager; |
| |
| int FakeHALEnable(bool start_restricted) { |
| return g_hal_manager.enable_succeed ? BT_STATUS_SUCCESS : BT_STATUS_FAIL; |
| } |
| |
| int FakeHALDisable() { |
| return g_hal_manager.disable_succeed ? BT_STATUS_SUCCESS : BT_STATUS_FAIL; |
| } |
| |
| int FakeHALGetAdapterProperties() { |
| return BT_STATUS_SUCCESS; |
| } |
| |
| int FakeHALSetAdapterProperty(const bt_property_t* /* property */) { |
| LOG(INFO) << __func__; |
| return (g_hal_manager.set_property_succeed ? BT_STATUS_SUCCESS : |
| BT_STATUS_FAIL); |
| } |
| |
| bt_interface_t fake_bt_iface = { |
| sizeof(bt_interface_t), |
| nullptr, /* init */ |
| FakeHALEnable, |
| FakeHALDisable, |
| nullptr, /* cleanup */ |
| FakeHALGetAdapterProperties, |
| nullptr, /* get_adapter_property */ |
| FakeHALSetAdapterProperty, |
| nullptr, /* get_remote_device_properties */ |
| nullptr, /* get_remote_device_property */ |
| nullptr, /* set_remote_device_property */ |
| nullptr, /* get_remote_service_record */ |
| nullptr, /* get_remote_services */ |
| nullptr, /* start_discovery */ |
| nullptr, /* cancel_discovery */ |
| nullptr, /* create_bond */ |
| nullptr, /* create_bond_out_of_band */ |
| nullptr, /* remove_bond */ |
| nullptr, /* cancel_bond */ |
| nullptr, /* get_connection_state */ |
| nullptr, /* pin_reply */ |
| nullptr, /* ssp_reply */ |
| nullptr, /* get_profile_interface */ |
| nullptr, /* dut_mode_configure */ |
| nullptr, /* dut_more_send */ |
| nullptr, /* le_test_mode */ |
| nullptr, /* config_hci_snoop_log */ |
| nullptr, /* set_os_callouts */ |
| nullptr, /* read_energy_info */ |
| nullptr, /* dump */ |
| nullptr, /* config clear */ |
| nullptr, /* interop_database_clear */ |
| nullptr /* interop_database_add */ |
| }; |
| |
| } // namespace |
| |
| // static |
| FakeBluetoothInterface::Manager* FakeBluetoothInterface::GetManager() { |
| return &g_hal_manager; |
| } |
| |
| FakeBluetoothInterface::Manager::Manager() |
| : enable_succeed(false), |
| disable_succeed(false), |
| set_property_succeed(false) { |
| } |
| |
| void FakeBluetoothInterface::NotifyAdapterStateChanged(bt_state_t state) { |
| FOR_EACH_OBSERVER(Observer, observers_, AdapterStateChangedCallback(state)); |
| } |
| |
| void FakeBluetoothInterface::NotifyAdapterPropertiesChanged( |
| int num_properties, |
| bt_property_t* properties) { |
| FOR_EACH_OBSERVER( |
| Observer, observers_, |
| AdapterPropertiesCallback(BT_STATUS_SUCCESS, num_properties, properties)); |
| } |
| |
| void FakeBluetoothInterface::NotifyAdapterNamePropertyChanged( |
| const std::string& name) { |
| bt_bdname_t hal_name; |
| strncpy(reinterpret_cast<char*>(hal_name.name), |
| name.c_str(), |
| std::min(sizeof(hal_name)-1, name.length())); |
| reinterpret_cast<char*>(hal_name.name)[name.length()] = '\0'; |
| |
| bt_property_t property; |
| property.len = sizeof(hal_name); |
| property.val = &hal_name; |
| property.type = BT_PROPERTY_BDNAME; |
| |
| NotifyAdapterPropertiesChanged(1, &property); |
| } |
| |
| void FakeBluetoothInterface::NotifyAdapterAddressPropertyChanged( |
| const bt_bdaddr_t* address) { |
| bt_property_t property; |
| property.len = sizeof(bt_bdaddr_t); |
| property.val = (void*)address; |
| property.type = BT_PROPERTY_BDADDR; |
| |
| NotifyAdapterPropertiesChanged(1, &property); |
| } |
| |
| void FakeBluetoothInterface::NotifyAdapterLocalLeFeaturesPropertyChanged( |
| const bt_local_le_features_t* features) { |
| bt_property_t property; |
| property.len = sizeof(*features); |
| property.val = (void*)features; |
| property.type = BT_PROPERTY_LOCAL_LE_FEATURES; |
| |
| NotifyAdapterPropertiesChanged(1, &property); |
| } |
| |
| void FakeBluetoothInterface::NotifyAclStateChangedCallback( |
| bt_status_t status, |
| const bt_bdaddr_t& remote_bdaddr, |
| bt_acl_state_t state) { |
| FOR_EACH_OBSERVER( |
| Observer, observers_, |
| AclStateChangedCallback(status, remote_bdaddr, state)); |
| } |
| |
| void FakeBluetoothInterface::AddObserver(Observer* observer) { |
| observers_.AddObserver(observer); |
| } |
| |
| void FakeBluetoothInterface::RemoveObserver(Observer* observer) { |
| observers_.RemoveObserver(observer); |
| } |
| |
| const bt_interface_t* FakeBluetoothInterface::GetHALInterface() const { |
| return &fake_bt_iface; |
| } |
| |
| const bluetooth_device_t* FakeBluetoothInterface::GetHALAdapter() const { |
| // TODO(armansito): Do something meaningful here to simulate test behavior. |
| return nullptr; |
| } |
| |
| } // namespace hal |
| } // namespace bluetooth |