summaryrefslogtreecommitdiff
path: root/sl4n/facades/bluetooth/bt_binder_facade.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'sl4n/facades/bluetooth/bt_binder_facade.cpp')
-rw-r--r--sl4n/facades/bluetooth/bt_binder_facade.cpp409
1 files changed, 0 insertions, 409 deletions
diff --git a/sl4n/facades/bluetooth/bt_binder_facade.cpp b/sl4n/facades/bluetooth/bt_binder_facade.cpp
deleted file mode 100644
index b764ef4..0000000
--- a/sl4n/facades/bluetooth/bt_binder_facade.cpp
+++ /dev/null
@@ -1,409 +0,0 @@
-//
-// Copyright (C) 2016 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 <base.h>
-#include <base/at_exit.h>
-#include <base/command_line.h>
-#include <base/logging.h>
-#include <base/macros.h>
-#include <base/strings/string_split.h>
-#include <base/strings/string_util.h>
-#include <binder/IPCThreadState.h>
-#include <binder/IServiceManager.h>
-#include <binder/ProcessState.h>
-
-#include "bt_binder_facade.h"
-#include <rapidjson/document.h>
-#include <rapidjson/writer.h>
-#include <rapidjson/stringbuffer.h>
-#include <android/bluetooth/IBluetooth.h>
-#include <android/bluetooth/IBluetoothCallback.h>
-#include <android/bluetooth/IBluetoothLowEnergy.h>
-#include <service/common/bluetooth/low_energy_constants.h>
-#include <tuple>
-#include <utils/command_receiver.h>
-#include <utils/common_utils.h>
-
-using android::bluetooth::IBluetooth;
-using android::bluetooth::IBluetoothLowEnergy;
-using android::getService;
-using android::OK;
-using android::sp;
-using android::String8;
-using android::String16;
-
-std::atomic_bool ble_registering(false);
-std::atomic_int ble_client_id(0);
-
-std::string kServiceName = "bluetooth-service";
-
-bool BtBinderFacade::SharedValidator() {
- if (bt_iface == NULL) {
- LOG(ERROR) << sl4n::kTagStr << " IBluetooth interface not initialized";
- return false;
- }
- bool ret;
- bt_iface->IsEnabled(&ret);
- if (!ret) {
- LOG(ERROR) << sl4n::kTagStr << " IBluetooth interface not enabled";
- return false;
- }
- return true;
-}
-
-std::tuple<bool, int> BtBinderFacade::BtBinderEnable() {
- if (bt_iface == NULL) {
- LOG(ERROR) << sl4n::kTagStr << ": IBluetooth interface not enabled";
- return std::make_tuple(false, sl4n_error_codes::kFailInt);
- }
- bool ret;
- bt_iface->Enable(&ret);
- if (!ret) {
- LOG(ERROR) << sl4n::kTagStr << ": Failed to enable the Bluetooth service";
- return std::make_tuple(false, sl4n_error_codes::kPassInt);
- } else {
- return std::make_tuple(true, sl4n_error_codes::kPassInt);
- }
-}
-
-std::tuple<std::string, int> BtBinderFacade::BtBinderGetAddress() {
- if (!SharedValidator()) {
- return std::make_tuple(sl4n::kFailStr, sl4n_error_codes::kFailInt);
- }
- String16 address;
- bt_iface->GetAddress(&address);
- return std::make_tuple(std::string(String8(address).string()), sl4n_error_codes::kPassInt);
-}
-
-std::tuple<std::string, int> BtBinderFacade::BtBinderGetName() {
- if (!SharedValidator()) {
- return std::make_tuple(sl4n::kFailStr,sl4n_error_codes::kFailInt);
- }
-
- String16 name16;
- bt_iface->GetName(&name16);
- std::string name = std::string(String8(name16).string());
- if (name.empty()) {
- LOG(ERROR) << sl4n::kTagStr << ": Failed to get device name";
- return std::make_tuple(sl4n::kFailStr, sl4n_error_codes::kFailInt);
- } else {
- return std::make_tuple(name, sl4n_error_codes::kPassInt);
- }
-}
-
-std::tuple<bool, int> BtBinderFacade::BtBinderSetName(
- std::string name) {
-
- if (!SharedValidator()) {
- return std::make_tuple(false, sl4n_error_codes::kFailInt);
- }
-
- bool result;
- bt_iface->SetName(String16(String8(name.c_str())), &result);
- if (!result) {
- LOG(ERROR) << sl4n::kTagStr << ": Failed to set device name";
- return std::make_tuple(false, sl4n_error_codes::kFailInt);
- }
- return std::make_tuple(true, sl4n_error_codes::kPassInt);
-}
-
-std::tuple<bool, int> BtBinderFacade::BtBinderInitInterface() {
- status_t status = getService(String16(kServiceName.c_str()), &bt_iface);
- if (status != OK) {
- LOG(ERROR) << "Failed to get service binder: '" << kServiceName
- << "' status=" << status;
- return std::make_tuple(false, sl4n_error_codes::kFailInt);
- }
- return std::make_tuple(true, sl4n_error_codes::kPassInt);
-}
-
-std::tuple<bool, int> BtBinderFacade::BtBinderRegisterBLE() {
- // TODO (tturney): verify bt_iface initialized everywhere
- if (!SharedValidator()) {
- return std::make_tuple(false, sl4n_error_codes::kFailInt);
- }
- bt_iface->GetLowEnergyInterface(&ble_iface);
- if(!ble_iface.get()) {
- LOG(ERROR) << sl4n::kTagStr << ": Failed to register BLE";
- return std::make_tuple(false, sl4n_error_codes::kFailInt);
- }
- return std::make_tuple(true, sl4n_error_codes::kPassInt);
-}
-
-std::tuple<int, int> BtBinderFacade::BtBinderSetAdvSettings(
- int mode, int timeout_seconds, int tx_power_level, bool is_connectable) {
- if (!SharedValidator()) {
- return std::make_tuple(false,sl4n_error_codes::kFailInt);
- }
- bluetooth::AdvertiseSettings::Mode adv_mode;
- switch (mode) {
- case sl4n_ble::kAdvSettingsModeLowPowerInt :
- adv_mode = bluetooth::AdvertiseSettings::Mode::MODE_LOW_POWER;
- break;
- case sl4n_ble::kAdvSettingsModeBalancedInt :
- adv_mode = bluetooth::AdvertiseSettings::Mode::MODE_BALANCED;
- break;
- case sl4n_ble::kAdvSettingsModeLowLatencyInt :
- adv_mode = bluetooth::AdvertiseSettings::Mode::MODE_LOW_LATENCY;
- break;
- default :
- LOG(ERROR) << sl4n::kTagStr <<
- ": Input mode is outside the accepted values";
- return std::make_tuple(
- sl4n::kFailedCounterInt, sl4n_error_codes::kFailInt);
- }
-
- base::TimeDelta adv_timeout = base::TimeDelta::FromSeconds(
- timeout_seconds);
-
- bluetooth::AdvertiseSettings::TxPowerLevel adv_tx_power_level;
- switch (tx_power_level) {
- case sl4n_ble::kAdvSettingsTxPowerLevelUltraLowInt: adv_tx_power_level =
- bluetooth::AdvertiseSettings::TxPowerLevel::TX_POWER_LEVEL_ULTRA_LOW;
- break;
- case sl4n_ble::kAdvSettingsTxPowerLevelLowInt: adv_tx_power_level =
- bluetooth::AdvertiseSettings::TxPowerLevel::TX_POWER_LEVEL_LOW;
- break;
- case sl4n_ble::kAdvSettingsTxPowerLevelMediumInt: adv_tx_power_level =
- bluetooth::AdvertiseSettings::TxPowerLevel::TX_POWER_LEVEL_MEDIUM;
- break;
- case sl4n_ble::kAdvSettingsTxPowerLevelHighInt: adv_tx_power_level =
- bluetooth::AdvertiseSettings::TxPowerLevel::TX_POWER_LEVEL_HIGH;
- break;
- default :
- LOG(ERROR) << sl4n::kTagStr <<
- ": Input tx power level is outside the accepted values";
- return std::make_tuple(
- sl4n::kFailedCounterInt, sl4n_error_codes::kFailInt);
- }
-
- bluetooth::AdvertiseSettings adv_settings = bluetooth::AdvertiseSettings(
- adv_mode, adv_timeout, adv_tx_power_level, is_connectable);
- adv_settings_map[adv_settings_count] = adv_settings;
- int adv_settings_id = adv_settings_count;
- adv_settings_count++;
- return std::make_tuple(adv_settings_id, sl4n_error_codes::kPassInt);
-}
-
-//////////////////
-// wrappers
-//////////////////
-
-static BtBinderFacade facade; // triggers registration with CommandReceiver
-
-void bt_binder_get_local_name_wrapper(rapidjson::Document &doc) {
- int expected_param_size = 0;
- if (!CommonUtils::IsParamLengthMatching(doc, expected_param_size)) {
- return;
- }
- //check for kfailedstr or NULL???
- std::string name;
- int error_code;
- std::tie(name, error_code) = facade.BtBinderGetName();
- if (error_code == sl4n_error_codes::kFailInt) {
- doc.AddMember(sl4n::kResultStr, sl4n::kFailStr, doc.GetAllocator());
- doc.AddMember(sl4n::kErrorStr, sl4n::kFailStr, doc.GetAllocator());
- return;
- }
- rapidjson::Value tmp;
- tmp.SetString(name.c_str(), doc.GetAllocator());
- doc.AddMember(sl4n::kResultStr, tmp, doc.GetAllocator());
- doc.AddMember(sl4n::kErrorStr, NULL, doc.GetAllocator());
- return;
-}
-
-void bt_binder_init_interface_wapper(rapidjson::Document &doc) {
- int expected_param_size = 0;
- if (!CommonUtils::IsParamLengthMatching(doc, expected_param_size)) {
- return;
- }
- bool init_result;
- int error_code;
- std::tie(init_result, error_code) = facade.BtBinderInitInterface();
- if (error_code == sl4n_error_codes::kFailInt) {
- doc.AddMember(sl4n::kErrorStr, sl4n::kFailStr, doc.GetAllocator());
- } else {
- doc.AddMember(sl4n::kErrorStr, NULL, doc.GetAllocator());
- }
- doc.AddMember(sl4n::kResultStr, init_result, doc.GetAllocator());
- return;
-}
-
-void bt_binder_set_local_name_wrapper(rapidjson::Document &doc) {
- int expected_param_size = 1;
- if (!CommonUtils::IsParamLengthMatching(doc, expected_param_size)) {
- return;
- }
- std::string name;
- if (!doc[sl4n::kParamsStr][0].IsString()) {
- LOG(ERROR) << sl4n::kTagStr << ": Expected String input for name";
- doc.AddMember(sl4n::kResultStr, false, doc.GetAllocator());
- doc.AddMember(sl4n::kErrorStr, sl4n::kFailStr, doc.GetAllocator());
- return;
- } else {
- name = doc[sl4n::kParamsStr][0].GetString();
- }
- bool set_result;
- int error_code;
- std::tie(set_result, error_code) = facade.BtBinderSetName(name);
- if (error_code == sl4n_error_codes::kFailInt) {
- doc.AddMember(sl4n::kResultStr, false, doc.GetAllocator());
- doc.AddMember(sl4n::kErrorStr, sl4n::kFailStr, doc.GetAllocator());
- } else {
- doc.AddMember(sl4n::kResultStr, set_result, doc.GetAllocator());
- doc.AddMember(sl4n::kErrorStr, NULL, doc.GetAllocator());
- }
- return;
-}
-
-void bt_binder_get_local_address_wrapper(rapidjson::Document &doc) {
- int expected_param_size = 0;
- if (!CommonUtils::IsParamLengthMatching(doc, expected_param_size)) {
- return;
- }
- //check for kfailedstr or NULL???
- std::string address;
- int error_code;
- std::tie(address, error_code) = facade.BtBinderGetAddress();
- if (error_code == sl4n_error_codes::kFailInt) {
- doc.AddMember(sl4n::kResultStr, sl4n::kFailStr, doc.GetAllocator());
- doc.AddMember(sl4n::kErrorStr, sl4n::kFailStr, doc.GetAllocator());
- } else {
- rapidjson::Value tmp;
- tmp.SetString(address.c_str(), doc.GetAllocator());
- doc.AddMember(sl4n::kResultStr, tmp, doc.GetAllocator());
- doc.AddMember(sl4n::kErrorStr, NULL, doc.GetAllocator());
- }
- return;
-}
-
-void bt_binder_enable_wrapper(rapidjson::Document &doc) {
- int expected_param_size = 0;
- if (!CommonUtils::IsParamLengthMatching(doc, expected_param_size)) {
- return;
- }
- bool enable_result;
- int error_code;
- std::tie(enable_result, error_code) = facade.BtBinderEnable();
- if (error_code == sl4n_error_codes::kFailInt) {
- doc.AddMember(sl4n::kResultStr, false, doc.GetAllocator());
- doc.AddMember(sl4n::kErrorStr, sl4n::kFailStr, doc.GetAllocator());
- } else {
- doc.AddMember(sl4n::kResultStr, enable_result, doc.GetAllocator());
- doc.AddMember(sl4n::kErrorStr, NULL, doc.GetAllocator());
- }
-}
-
-void bt_binder_register_ble_wrapper(rapidjson::Document &doc) {
- int expected_param_size = 0;
- if (!CommonUtils::IsParamLengthMatching(doc, expected_param_size)) {
- return;
- }
- bool register_result;
- int error_code;
- std::tie(register_result, error_code) =
- facade.BtBinderRegisterBLE();
- if (error_code == sl4n_error_codes::kFailInt) {
- doc.AddMember(sl4n::kResultStr, false, doc.GetAllocator());
- doc.AddMember(sl4n::kErrorStr, sl4n::kFailStr, doc.GetAllocator());
- } else {
- doc.AddMember(sl4n::kResultStr, register_result, doc.GetAllocator());
- doc.AddMember(sl4n::kErrorStr, NULL, doc.GetAllocator());
- }
-}
-
-void bt_binder_set_adv_settings_wrapper(rapidjson::Document &doc) {
- int expected_param_size = 4;
- if (!CommonUtils::IsParamLengthMatching(doc, expected_param_size)) {
- return;
- }
- int mode;
- int timeout_seconds;
- int tx_power_level;
- bool is_connectable;
- // TODO(tturney) Verify inputs better
- if (!doc[sl4n::kParamsStr][0].IsInt()) {
- LOG(ERROR) << sl4n::kTagStr << ": Expected Int input for mode";
- doc.AddMember(sl4n::kResultStr, false, doc.GetAllocator());
- doc.AddMember(sl4n::kErrorStr, sl4n::kInvalidParamStr, doc.GetAllocator());
- return;
- } else {
- mode = doc[sl4n::kParamsStr][0].GetInt();
- }
- if (!doc[sl4n::kParamsStr][1].IsInt()) {
- LOG(ERROR) << sl4n::kTagStr << ": Expected Int input for timeout";
- doc.AddMember(sl4n::kResultStr, false, doc.GetAllocator());
- doc.AddMember(sl4n::kErrorStr, sl4n::kInvalidParamStr, doc.GetAllocator());
- return;
- } else {
- timeout_seconds = doc[sl4n::kParamsStr][1].GetInt();
- }
- if (!doc[sl4n::kParamsStr][2].IsInt()) {
- LOG(ERROR) << sl4n::kTagStr << ": Expected Int input for tx power level";
- doc.AddMember(sl4n::kResultStr, false, doc.GetAllocator());
- doc.AddMember(sl4n::kErrorStr, sl4n::kInvalidParamStr, doc.GetAllocator());
- return;
- } else {
- tx_power_level = doc[sl4n::kParamsStr][2].GetInt();
- }
- if (!doc[sl4n::kParamsStr][3].IsBool()) {
- LOG(ERROR) << sl4n::kTagStr << ": Expected Bool input for connectable";
- doc.AddMember(sl4n::kResultStr, false, doc.GetAllocator());
- doc.AddMember(sl4n::kErrorStr, sl4n::kInvalidParamStr, doc.GetAllocator());
- return;
- } else {
- is_connectable = doc[sl4n::kParamsStr][3].GetBool();
- }
-
- int adv_settings;
- int error_code;
- std::tie(adv_settings, error_code) = facade.BtBinderSetAdvSettings(
- mode, timeout_seconds, tx_power_level, is_connectable);
- if(error_code == sl4n_error_codes::kFailInt) {
- doc.AddMember(
- sl4n::kResultStr, sl4n_error_codes::kFailInt, doc.GetAllocator());
- doc.AddMember(sl4n::kErrorStr, sl4n::kFailedCounterInt, doc.GetAllocator());
- return;
- } else {
- doc.AddMember(sl4n::kResultStr, adv_settings, doc.GetAllocator());
- doc.AddMember(sl4n::kErrorStr, NULL, doc.GetAllocator());
- }
-}
-
-////////////////
-// constructor
-////////////////
-
-BtBinderFacade::BtBinderFacade() {
- adv_settings_count = 0;
- manu_data_count = 0;
-
- CommandReceiver::RegisterCommand("BtBinderInitInterface",
- &bt_binder_init_interface_wapper);
- CommandReceiver::RegisterCommand("BtBinderGetName",
- &bt_binder_get_local_name_wrapper);
- CommandReceiver::RegisterCommand("BtBinderSetName",
- &bt_binder_set_local_name_wrapper);
- CommandReceiver::RegisterCommand("BtBinderGetAddress",
- &bt_binder_get_local_address_wrapper);
- CommandReceiver::RegisterCommand("BtBinderEnable",
- &bt_binder_enable_wrapper);
- CommandReceiver::RegisterCommand("BtBinderRegisterBLE",
- &bt_binder_register_ble_wrapper);
- CommandReceiver::RegisterCommand("BtBinderSetAdvSettings",
- &bt_binder_set_adv_settings_wrapper);
-}
-