main.cc revision 10b54c4b7f1a863a27eca4158f256062ec9c3770
1f52095257e36b887d7ddfd1f00871b9311dbfa1bArman Uguray// 2f52095257e36b887d7ddfd1f00871b9311dbfa1bArman Uguray// Copyright (C) 2015 Google, Inc. 3f52095257e36b887d7ddfd1f00871b9311dbfa1bArman Uguray// 4f52095257e36b887d7ddfd1f00871b9311dbfa1bArman Uguray// Licensed under the Apache License, Version 2.0 (the "License"); 5f52095257e36b887d7ddfd1f00871b9311dbfa1bArman Uguray// you may not use this file except in compliance with the License. 6f52095257e36b887d7ddfd1f00871b9311dbfa1bArman Uguray// You may obtain a copy of the License at: 7f52095257e36b887d7ddfd1f00871b9311dbfa1bArman Uguray// 8f52095257e36b887d7ddfd1f00871b9311dbfa1bArman Uguray// http://www.apache.org/licenses/LICENSE-2.0 9f52095257e36b887d7ddfd1f00871b9311dbfa1bArman Uguray// 10f52095257e36b887d7ddfd1f00871b9311dbfa1bArman Uguray// Unless required by applicable law or agreed to in writing, software 11f52095257e36b887d7ddfd1f00871b9311dbfa1bArman Uguray// distributed under the License is distributed on an "AS IS" BASIS, 12f52095257e36b887d7ddfd1f00871b9311dbfa1bArman Uguray// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f52095257e36b887d7ddfd1f00871b9311dbfa1bArman Uguray// See the License for the specific language governing permissions and 14f52095257e36b887d7ddfd1f00871b9311dbfa1bArman Uguray// limitations under the License. 15f52095257e36b887d7ddfd1f00871b9311dbfa1bArman Uguray// 16f52095257e36b887d7ddfd1f00871b9311dbfa1bArman Uguray 17fcf2e0391950a8b140082fbe78688fa89471fbedArman Uguray#include <iostream> 18fcf2e0391950a8b140082fbe78688fa89471fbedArman Uguray#include <string> 19fcf2e0391950a8b140082fbe78688fa89471fbedArman Uguray 20f52095257e36b887d7ddfd1f00871b9311dbfa1bArman Uguray#include <base/logging.h> 2139a66bed960d96eca900e7e002e0d7bef0e0e151Arman Uguray#include <base/macros.h> 225192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray#include <base/strings/string_split.h> 235192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray#include <base/strings/string_util.h> 2439a66bed960d96eca900e7e002e0d7bef0e0e151Arman Uguray#include <binder/ProcessState.h> 25f52095257e36b887d7ddfd1f00871b9311dbfa1bArman Uguray 262117e520c9f5b105ade7e92c4ab4928ea905f176Arman Uguray#include "service/adapter_state.h" 27f52095257e36b887d7ddfd1f00871b9311dbfa1bArman Uguray#include "service/ipc/binder/IBluetooth.h" 2839a66bed960d96eca900e7e002e0d7bef0e0e151Arman Uguray#include "service/ipc/binder/IBluetoothCallback.h" 29f52095257e36b887d7ddfd1f00871b9311dbfa1bArman Uguray 30fcf2e0391950a8b140082fbe78688fa89471fbedArman Ugurayusing namespace std; 31fcf2e0391950a8b140082fbe78688fa89471fbedArman Uguray 32f52095257e36b887d7ddfd1f00871b9311dbfa1bArman Ugurayusing android::sp; 33f52095257e36b887d7ddfd1f00871b9311dbfa1bArman Uguray 34f52095257e36b887d7ddfd1f00871b9311dbfa1bArman Ugurayusing ipc::binder::IBluetooth; 35f52095257e36b887d7ddfd1f00871b9311dbfa1bArman Uguray 362117e520c9f5b105ade7e92c4ab4928ea905f176Arman Uguraynamespace { 372117e520c9f5b105ade7e92c4ab4928ea905f176Arman Uguray 382117e520c9f5b105ade7e92c4ab4928ea905f176Arman Uguray#define COLOR_OFF "\x1B[0m" 392117e520c9f5b105ade7e92c4ab4928ea905f176Arman Uguray#define COLOR_RED "\x1B[0;91m" 402117e520c9f5b105ade7e92c4ab4928ea905f176Arman Uguray#define COLOR_GREEN "\x1B[0;92m" 412117e520c9f5b105ade7e92c4ab4928ea905f176Arman Uguray#define COLOR_YELLOW "\x1B[0;93m" 422117e520c9f5b105ade7e92c4ab4928ea905f176Arman Uguray#define COLOR_BLUE "\x1B[0;94m" 432117e520c9f5b105ade7e92c4ab4928ea905f176Arman Uguray#define COLOR_MAGENTA "\x1B[0;95m" 442117e520c9f5b105ade7e92c4ab4928ea905f176Arman Uguray#define COLOR_BOLDGRAY "\x1B[1;30m" 452117e520c9f5b105ade7e92c4ab4928ea905f176Arman Uguray#define COLOR_BOLDWHITE "\x1B[1;37m" 462117e520c9f5b105ade7e92c4ab4928ea905f176Arman Uguray#define COLOR_BOLDYELLOW "\x1B[1;93m" 47fcf2e0391950a8b140082fbe78688fa89471fbedArman Uguray 48fcf2e0391950a8b140082fbe78688fa89471fbedArman Ugurayconst char kCommandDisable[] = "disable"; 49fcf2e0391950a8b140082fbe78688fa89471fbedArman Ugurayconst char kCommandEnable[] = "enable"; 50fcf2e0391950a8b140082fbe78688fa89471fbedArman Ugurayconst char kCommandGetState[] = "get-state"; 51fcf2e0391950a8b140082fbe78688fa89471fbedArman Ugurayconst char kCommandIsEnabled[] = "is-enabled"; 52fcf2e0391950a8b140082fbe78688fa89471fbedArman Uguray 535192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray#define CHECK_ARGS_COUNT(args, op, num, msg) \ 545192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray if (!(args.size() op num)) { \ 555192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray PrintError(msg); \ 565192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray return; \ 575192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray } 585192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray#define CHECK_NO_ARGS(args) \ 595192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray CHECK_ARGS_COUNT(args, ==, 0, "Expected no arguments") 605192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray 6139a66bed960d96eca900e7e002e0d7bef0e0e151Arman Uguray// TODO(armansito): Clean up this code. Right now everything is in this 6239a66bed960d96eca900e7e002e0d7bef0e0e151Arman Uguray// monolithic file. We should organize this into different classes for command 6339a66bed960d96eca900e7e002e0d7bef0e0e151Arman Uguray// handling, console output/printing, callback handling, etc. 6439a66bed960d96eca900e7e002e0d7bef0e0e151Arman Uguray// (See http://b/23387611) 6539a66bed960d96eca900e7e002e0d7bef0e0e151Arman Uguray 6639a66bed960d96eca900e7e002e0d7bef0e0e151Arman Uguray// Used to synchronize the printing of the command-line prompt and incoming 6739a66bed960d96eca900e7e002e0d7bef0e0e151Arman Uguray// Binder callbacks. 6839a66bed960d96eca900e7e002e0d7bef0e0e151Arman Uguraystd::atomic_bool showing_prompt(false); 6939a66bed960d96eca900e7e002e0d7bef0e0e151Arman Uguray 7039a66bed960d96eca900e7e002e0d7bef0e0e151Arman Ugurayvoid PrintPrompt() { 7139a66bed960d96eca900e7e002e0d7bef0e0e151Arman Uguray cout << COLOR_BLUE "[FCLI] " COLOR_OFF << flush; 7239a66bed960d96eca900e7e002e0d7bef0e0e151Arman Uguray} 7339a66bed960d96eca900e7e002e0d7bef0e0e151Arman Uguray 7439a66bed960d96eca900e7e002e0d7bef0e0e151Arman Ugurayclass CLIBluetoothCallback : public ipc::binder::BnBluetoothCallback { 7539a66bed960d96eca900e7e002e0d7bef0e0e151Arman Uguray public: 7639a66bed960d96eca900e7e002e0d7bef0e0e151Arman Uguray CLIBluetoothCallback() = default; 7739a66bed960d96eca900e7e002e0d7bef0e0e151Arman Uguray ~CLIBluetoothCallback() override = default; 7839a66bed960d96eca900e7e002e0d7bef0e0e151Arman Uguray 7939a66bed960d96eca900e7e002e0d7bef0e0e151Arman Uguray // IBluetoothCallback override: 8039a66bed960d96eca900e7e002e0d7bef0e0e151Arman Uguray void OnBluetoothStateChange( 8139a66bed960d96eca900e7e002e0d7bef0e0e151Arman Uguray bluetooth::AdapterState prev_state, 8239a66bed960d96eca900e7e002e0d7bef0e0e151Arman Uguray bluetooth::AdapterState new_state) override { 8339a66bed960d96eca900e7e002e0d7bef0e0e151Arman Uguray if (showing_prompt.load()) 8439a66bed960d96eca900e7e002e0d7bef0e0e151Arman Uguray cout << endl; 8539a66bed960d96eca900e7e002e0d7bef0e0e151Arman Uguray cout << COLOR_BOLDWHITE "Adapter state changed: " COLOR_OFF 8639a66bed960d96eca900e7e002e0d7bef0e0e151Arman Uguray << COLOR_MAGENTA << AdapterStateToString(prev_state) << COLOR_OFF 8739a66bed960d96eca900e7e002e0d7bef0e0e151Arman Uguray << COLOR_BOLDWHITE " -> " COLOR_OFF 8839a66bed960d96eca900e7e002e0d7bef0e0e151Arman Uguray << COLOR_BOLDYELLOW << AdapterStateToString(new_state) << COLOR_OFF 8939a66bed960d96eca900e7e002e0d7bef0e0e151Arman Uguray << endl << endl; 9039a66bed960d96eca900e7e002e0d7bef0e0e151Arman Uguray if (showing_prompt.load()) 9139a66bed960d96eca900e7e002e0d7bef0e0e151Arman Uguray PrintPrompt(); 9239a66bed960d96eca900e7e002e0d7bef0e0e151Arman Uguray } 9339a66bed960d96eca900e7e002e0d7bef0e0e151Arman Uguray 9439a66bed960d96eca900e7e002e0d7bef0e0e151Arman Uguray private: 9539a66bed960d96eca900e7e002e0d7bef0e0e151Arman Uguray DISALLOW_COPY_AND_ASSIGN(CLIBluetoothCallback); 9639a66bed960d96eca900e7e002e0d7bef0e0e151Arman Uguray}; 9739a66bed960d96eca900e7e002e0d7bef0e0e151Arman Uguray 985192309af14408c3f170f15c1282ae5c1eb5abffArman Ugurayvoid PrintError(const string& message) { 995192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray cout << COLOR_RED << message << COLOR_OFF << endl; 1005192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray} 1015192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray 102fcf2e0391950a8b140082fbe78688fa89471fbedArman Ugurayvoid PrintCommandStatus(bool status) { 103fcf2e0391950a8b140082fbe78688fa89471fbedArman Uguray cout << COLOR_BOLDWHITE "Command status: " COLOR_OFF 104fcf2e0391950a8b140082fbe78688fa89471fbedArman Uguray << (status ? (COLOR_GREEN "success") : (COLOR_RED "failure")) 105fcf2e0391950a8b140082fbe78688fa89471fbedArman Uguray << COLOR_OFF << endl << endl; 106fcf2e0391950a8b140082fbe78688fa89471fbedArman Uguray} 107fcf2e0391950a8b140082fbe78688fa89471fbedArman Uguray 1085192309af14408c3f170f15c1282ae5c1eb5abffArman Ugurayvoid PrintFieldAndValue(const string& field, const string& value) { 1095192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray cout << COLOR_BOLDWHITE << field << ": " << COLOR_BOLDYELLOW << value 1105192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray << COLOR_OFF << endl; 1115192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray} 1125192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray 1135192309af14408c3f170f15c1282ae5c1eb5abffArman Ugurayvoid PrintFieldAndBoolValue(const string& field, bool value) { 1145192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray PrintFieldAndValue(field, (value ? "true" : "false")); 1155192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray} 1165192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray 1175192309af14408c3f170f15c1282ae5c1eb5abffArman Ugurayvoid HandleDisable(IBluetooth* bt_iface, const vector<string>& args) { 1185192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray CHECK_NO_ARGS(args); 119fcf2e0391950a8b140082fbe78688fa89471fbedArman Uguray PrintCommandStatus(bt_iface->Disable()); 120fcf2e0391950a8b140082fbe78688fa89471fbedArman Uguray} 121fcf2e0391950a8b140082fbe78688fa89471fbedArman Uguray 1225192309af14408c3f170f15c1282ae5c1eb5abffArman Ugurayvoid HandleEnable(IBluetooth* bt_iface, const vector<string>& args) { 1235192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray CHECK_NO_ARGS(args); 124fcf2e0391950a8b140082fbe78688fa89471fbedArman Uguray PrintCommandStatus(bt_iface->Enable()); 125fcf2e0391950a8b140082fbe78688fa89471fbedArman Uguray} 126fcf2e0391950a8b140082fbe78688fa89471fbedArman Uguray 1275192309af14408c3f170f15c1282ae5c1eb5abffArman Ugurayvoid HandleGetState(IBluetooth* bt_iface, const vector<string>& args) { 1285192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray CHECK_NO_ARGS(args); 1292117e520c9f5b105ade7e92c4ab4928ea905f176Arman Uguray bluetooth::AdapterState state = static_cast<bluetooth::AdapterState>( 1302117e520c9f5b105ade7e92c4ab4928ea905f176Arman Uguray bt_iface->GetState()); 1315192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray PrintFieldAndValue("Adapter state", bluetooth::AdapterStateToString(state)); 132fcf2e0391950a8b140082fbe78688fa89471fbedArman Uguray} 133fcf2e0391950a8b140082fbe78688fa89471fbedArman Uguray 1345192309af14408c3f170f15c1282ae5c1eb5abffArman Ugurayvoid HandleIsEnabled(IBluetooth* bt_iface, const vector<string>& args) { 1355192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray CHECK_NO_ARGS(args); 136fcf2e0391950a8b140082fbe78688fa89471fbedArman Uguray bool enabled = bt_iface->IsEnabled(); 1375192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray PrintFieldAndBoolValue("Adapter enabled", enabled); 138fcf2e0391950a8b140082fbe78688fa89471fbedArman Uguray} 139fcf2e0391950a8b140082fbe78688fa89471fbedArman Uguray 1405192309af14408c3f170f15c1282ae5c1eb5abffArman Ugurayvoid HandleGetLocalAddress(IBluetooth* bt_iface, const vector<string>& args) { 1415192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray CHECK_NO_ARGS(args); 1425192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray string address = bt_iface->GetAddress(); 1435192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray PrintFieldAndValue("Adapter address", address); 1445192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray} 1455192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray 1465192309af14408c3f170f15c1282ae5c1eb5abffArman Ugurayvoid HandleSetLocalName(IBluetooth* bt_iface, const vector<string>& args) { 1475192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray CHECK_ARGS_COUNT(args, >=, 1, "No name was given"); 1485192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray 1495192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray std::string name; 1505192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray for (const auto& arg : args) 1515192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray name += arg + " "; 1525192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray 1535192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray base::TrimWhitespaceASCII(name, base::TRIM_TRAILING, &name); 1545192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray 1555192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray PrintCommandStatus(bt_iface->SetName(name)); 1565192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray} 1575192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray 1585192309af14408c3f170f15c1282ae5c1eb5abffArman Ugurayvoid HandleGetLocalName(IBluetooth* bt_iface, const vector<string>& args) { 1595192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray CHECK_NO_ARGS(args); 1605192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray string name = bt_iface->GetName(); 1615192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray PrintFieldAndValue("Adapter name", name); 1625192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray} 1635192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray 1645192309af14408c3f170f15c1282ae5c1eb5abffArman Ugurayvoid HandleAdapterInfo(IBluetooth* bt_iface, const vector<string>& args) { 1655192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray CHECK_NO_ARGS(args); 1665192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray 1675192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray cout << COLOR_BOLDWHITE "Adapter Properties: " COLOR_OFF << endl; 1685192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray 1695192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray PrintFieldAndValue("\tAddress", bt_iface->GetAddress()); 1705192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray PrintFieldAndValue("\tState", bluetooth::AdapterStateToString( 1715192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray static_cast<bluetooth::AdapterState>(bt_iface->GetState()))); 1725192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray PrintFieldAndValue("\tName", bt_iface->GetName()); 17310b54c4b7f1a863a27eca4158f256062ec9c3770Arman Uguray PrintFieldAndBoolValue("\tMulti-Adv. supported", 17410b54c4b7f1a863a27eca4158f256062ec9c3770Arman Uguray bt_iface->IsMultiAdvertisementSupported()); 17510b54c4b7f1a863a27eca4158f256062ec9c3770Arman Uguray} 17610b54c4b7f1a863a27eca4158f256062ec9c3770Arman Uguray 17710b54c4b7f1a863a27eca4158f256062ec9c3770Arman Ugurayvoid HandleSupportsMultiAdv(IBluetooth* bt_iface, const vector<string>& args) { 17810b54c4b7f1a863a27eca4158f256062ec9c3770Arman Uguray CHECK_NO_ARGS(args); 17910b54c4b7f1a863a27eca4158f256062ec9c3770Arman Uguray 18010b54c4b7f1a863a27eca4158f256062ec9c3770Arman Uguray bool status = bt_iface->IsMultiAdvertisementSupported(); 18110b54c4b7f1a863a27eca4158f256062ec9c3770Arman Uguray PrintFieldAndBoolValue("Multi-advertisement support", status); 1825192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray} 1835192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray 1845192309af14408c3f170f15c1282ae5c1eb5abffArman Ugurayvoid HandleHelp(IBluetooth* bt_iface, const vector<string>& args); 1852117e520c9f5b105ade7e92c4ab4928ea905f176Arman Uguray 186fcf2e0391950a8b140082fbe78688fa89471fbedArman Uguraystruct { 187fcf2e0391950a8b140082fbe78688fa89471fbedArman Uguray string command; 1885192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray void (*func)(IBluetooth*, const vector<string>& args); 1892117e520c9f5b105ade7e92c4ab4928ea905f176Arman Uguray string help; 190fcf2e0391950a8b140082fbe78688fa89471fbedArman Uguray} kCommandMap[] = { 1915192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray { "help", HandleHelp, "\t\t\tDisplay this message" }, 1925192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray { "disable", HandleDisable, "\t\t\tDisable Bluetooth" }, 1935192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray { "enable", HandleEnable, "\t\t\tEnable Bluetooth" }, 1945192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray { "get-state", HandleGetState, "\t\tGet the current adapter state" }, 1955192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray { "is-enabled", HandleIsEnabled, "\t\tReturn if Bluetooth is enabled" }, 1965192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray { "get-local-address", HandleGetLocalAddress, 1975192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray "\tGet the local adapter address" }, 1985192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray { "set-local-name", HandleSetLocalName, "\t\tSet the local adapter name" }, 1995192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray { "get-local-name", HandleGetLocalName, "\t\tGet the local adapter name" }, 2005192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray { "adapter-info", HandleAdapterInfo, "\t\tPrint adapter properties" }, 20110b54c4b7f1a863a27eca4158f256062ec9c3770Arman Uguray { "supports-multi-adv", HandleSupportsMultiAdv, 20210b54c4b7f1a863a27eca4158f256062ec9c3770Arman Uguray "\tWhether multi-advertisement is currently supported" }, 203fcf2e0391950a8b140082fbe78688fa89471fbedArman Uguray {}, 204fcf2e0391950a8b140082fbe78688fa89471fbedArman Uguray}; 205f52095257e36b887d7ddfd1f00871b9311dbfa1bArman Uguray 2065192309af14408c3f170f15c1282ae5c1eb5abffArman Ugurayvoid HandleHelp(IBluetooth* /* bt_iface */, const vector<string>& /* args */) { 2072117e520c9f5b105ade7e92c4ab4928ea905f176Arman Uguray cout << endl; 2082117e520c9f5b105ade7e92c4ab4928ea905f176Arman Uguray for (int i = 0; kCommandMap[i].func; i++) 2092117e520c9f5b105ade7e92c4ab4928ea905f176Arman Uguray cout << "\t" << kCommandMap[i].command << kCommandMap[i].help << endl; 2102117e520c9f5b105ade7e92c4ab4928ea905f176Arman Uguray cout << endl; 2112117e520c9f5b105ade7e92c4ab4928ea905f176Arman Uguray} 2122117e520c9f5b105ade7e92c4ab4928ea905f176Arman Uguray 2132117e520c9f5b105ade7e92c4ab4928ea905f176Arman Uguray} // namespace 2142117e520c9f5b105ade7e92c4ab4928ea905f176Arman Uguray 215f52095257e36b887d7ddfd1f00871b9311dbfa1bArman Ugurayint main() { 216f52095257e36b887d7ddfd1f00871b9311dbfa1bArman Uguray sp<IBluetooth> bt_iface = IBluetooth::getClientInterface(); 217f52095257e36b887d7ddfd1f00871b9311dbfa1bArman Uguray if (!bt_iface.get()) { 218f52095257e36b887d7ddfd1f00871b9311dbfa1bArman Uguray LOG(ERROR) << "Failed to obtain handle on IBluetooth"; 219f52095257e36b887d7ddfd1f00871b9311dbfa1bArman Uguray return EXIT_FAILURE; 220f52095257e36b887d7ddfd1f00871b9311dbfa1bArman Uguray } 221f52095257e36b887d7ddfd1f00871b9311dbfa1bArman Uguray 22239a66bed960d96eca900e7e002e0d7bef0e0e151Arman Uguray // Initialize the Binder process thread pool. We have to set this up, 22339a66bed960d96eca900e7e002e0d7bef0e0e151Arman Uguray // otherwise, incoming callbacks from IBluetoothCallback will block the main 22439a66bed960d96eca900e7e002e0d7bef0e0e151Arman Uguray // thread (in other words, we have to do this as we are a "Binder server"). 22539a66bed960d96eca900e7e002e0d7bef0e0e151Arman Uguray android::ProcessState::self()->startThreadPool(); 22639a66bed960d96eca900e7e002e0d7bef0e0e151Arman Uguray 22739a66bed960d96eca900e7e002e0d7bef0e0e151Arman Uguray // Register Adapter state-change callback 22839a66bed960d96eca900e7e002e0d7bef0e0e151Arman Uguray sp<CLIBluetoothCallback> callback = new CLIBluetoothCallback(); 22939a66bed960d96eca900e7e002e0d7bef0e0e151Arman Uguray bt_iface->RegisterCallback(callback); 23039a66bed960d96eca900e7e002e0d7bef0e0e151Arman Uguray 231fcf2e0391950a8b140082fbe78688fa89471fbedArman Uguray cout << COLOR_BOLDWHITE << "Fluoride Command-Line Interface\n" << COLOR_OFF 2322117e520c9f5b105ade7e92c4ab4928ea905f176Arman Uguray << endl 2332117e520c9f5b105ade7e92c4ab4928ea905f176Arman Uguray << "Type \"help\" to see possible commands.\n" 234fcf2e0391950a8b140082fbe78688fa89471fbedArman Uguray << endl; 235fcf2e0391950a8b140082fbe78688fa89471fbedArman Uguray 236fcf2e0391950a8b140082fbe78688fa89471fbedArman Uguray while (true) { 237fcf2e0391950a8b140082fbe78688fa89471fbedArman Uguray string command; 2385192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray 23939a66bed960d96eca900e7e002e0d7bef0e0e151Arman Uguray PrintPrompt(); 24039a66bed960d96eca900e7e002e0d7bef0e0e151Arman Uguray 24139a66bed960d96eca900e7e002e0d7bef0e0e151Arman Uguray showing_prompt = true; 242fcf2e0391950a8b140082fbe78688fa89471fbedArman Uguray getline(cin, command); 24339a66bed960d96eca900e7e002e0d7bef0e0e151Arman Uguray showing_prompt = false; 244fcf2e0391950a8b140082fbe78688fa89471fbedArman Uguray 2455192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray vector<string> args; 2465192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray base::SplitString(command, ' ', &args); 2475192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray 2485192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray if (args.empty()) 2495192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray continue; 2505192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray 2515192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray // The first argument is the command while the remaning are what we pass to 2525192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray // the handler functions. 2535192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray command = args[0]; 2545192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray args.erase(args.begin()); 2555192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray 256fcf2e0391950a8b140082fbe78688fa89471fbedArman Uguray bool command_handled = false; 2572117e520c9f5b105ade7e92c4ab4928ea905f176Arman Uguray for (int i = 0; kCommandMap[i].func && !command_handled; i++) { 258fcf2e0391950a8b140082fbe78688fa89471fbedArman Uguray if (command == kCommandMap[i].command) { 2595192309af14408c3f170f15c1282ae5c1eb5abffArman Uguray kCommandMap[i].func(bt_iface.get(), args); 260fcf2e0391950a8b140082fbe78688fa89471fbedArman Uguray command_handled = true; 261fcf2e0391950a8b140082fbe78688fa89471fbedArman Uguray } 262fcf2e0391950a8b140082fbe78688fa89471fbedArman Uguray } 263fcf2e0391950a8b140082fbe78688fa89471fbedArman Uguray 264fcf2e0391950a8b140082fbe78688fa89471fbedArman Uguray if (!command_handled) 265fcf2e0391950a8b140082fbe78688fa89471fbedArman Uguray cout << "Unrecognized command: " << command << endl; 266fcf2e0391950a8b140082fbe78688fa89471fbedArman Uguray } 267f52095257e36b887d7ddfd1f00871b9311dbfa1bArman Uguray 268f52095257e36b887d7ddfd1f00871b9311dbfa1bArman Uguray return EXIT_SUCCESS; 269f52095257e36b887d7ddfd1f00871b9311dbfa1bArman Uguray} 270