You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
253 lines
7.5 KiB
253 lines
7.5 KiB
// |
|
// 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/ipc/binder/bluetooth_binder_server.h" |
|
|
|
#include <base/logging.h> |
|
|
|
#include "service/ipc/binder/bluetooth_gatt_client_binder_server.h" |
|
#include "service/ipc/binder/bluetooth_gatt_server_binder_server.h" |
|
#include "service/ipc/binder/bluetooth_le_advertiser_binder_server.h" |
|
#include "service/ipc/binder/bluetooth_le_scanner_binder_server.h" |
|
#include "service/ipc/binder/bluetooth_low_energy_binder_server.h" |
|
|
|
#include "service/hal/bluetooth_interface.h" |
|
|
|
using android::sp; |
|
using android::String8; |
|
using android::String16; |
|
|
|
using android::bluetooth::IBluetoothCallback; |
|
using android::bluetooth::IBluetoothGattClient; |
|
using android::bluetooth::IBluetoothGattServer; |
|
|
|
namespace ipc { |
|
namespace binder { |
|
|
|
BluetoothBinderServer::BluetoothBinderServer(bluetooth::Adapter* adapter) |
|
: adapter_(adapter) { |
|
CHECK(adapter_); |
|
adapter_->AddObserver(this); |
|
} |
|
|
|
BluetoothBinderServer::~BluetoothBinderServer() { |
|
adapter_->RemoveObserver(this); |
|
} |
|
|
|
// binder::BnBluetooth overrides: |
|
Status BluetoothBinderServer::IsEnabled(bool* _aidl_return) { |
|
VLOG(2) << __func__; |
|
*_aidl_return = adapter_->IsEnabled(); |
|
return Status::ok(); |
|
} |
|
|
|
Status BluetoothBinderServer::GetState(int32_t* _aidl_return) { |
|
VLOG(2) << __func__; |
|
*_aidl_return = adapter_->GetState(); |
|
return Status::ok(); |
|
} |
|
|
|
Status BluetoothBinderServer::Enable(bool start_restricted, |
|
bool* _aidl_return) { |
|
VLOG(2) << __func__; |
|
*_aidl_return = adapter_->Enable(start_restricted); |
|
return Status::ok(); |
|
} |
|
|
|
Status BluetoothBinderServer::EnableNoAutoConnect(bool* _aidl_return) { |
|
VLOG(2) << __func__; |
|
// TODO(armansito): Implement. |
|
*_aidl_return = false; |
|
return Status::ok(); |
|
} |
|
|
|
Status BluetoothBinderServer::Disable(bool* _aidl_return) { |
|
VLOG(2) << __func__; |
|
*_aidl_return = adapter_->Disable(); |
|
return Status::ok(); |
|
} |
|
|
|
Status BluetoothBinderServer::GetAddress(::android::String16* _aidl_return) { |
|
VLOG(2) << __func__; |
|
*_aidl_return = String16(String8(adapter_->GetAddress().c_str())); |
|
return Status::ok(); |
|
} |
|
|
|
Status BluetoothBinderServer::GetUUIDs( |
|
::std::vector<::android::bluetooth::UUID>* _aidl_return) { |
|
VLOG(2) << __func__; |
|
// TODO(armansito): Implement. |
|
*_aidl_return = std::vector<android::bluetooth::UUID>(); |
|
return Status::ok(); |
|
} |
|
|
|
Status BluetoothBinderServer::SetName(const ::android::String16& name, |
|
bool* _aidl_return) { |
|
VLOG(2) << __func__; |
|
*_aidl_return = adapter_->SetName(std::string(String8(name).string())); |
|
return Status::ok(); |
|
} |
|
|
|
Status BluetoothBinderServer::GetName(::android::String16* _aidl_return) { |
|
VLOG(2) << __func__; |
|
*_aidl_return = String16(String8(adapter_->GetName().c_str())); |
|
return Status::ok(); |
|
} |
|
|
|
Status BluetoothBinderServer::RegisterCallback( |
|
const ::android::sp<IBluetoothCallback>& callback) { |
|
VLOG(2) << __func__; |
|
if (!callback.get()) { |
|
LOG(ERROR) << "RegisterCallback called with NULL binder. Ignoring."; |
|
return Status::ok(); |
|
} |
|
callbacks_.Register(callback); |
|
return Status::ok(); |
|
} |
|
|
|
Status BluetoothBinderServer::UnregisterCallback( |
|
const ::android::sp<IBluetoothCallback>& callback) { |
|
VLOG(2) << __func__; |
|
if (!callback.get()) { |
|
LOG(ERROR) << "UnregisterCallback called with NULL binder. Ignoring."; |
|
return Status::ok(); |
|
} |
|
callbacks_.Unregister(callback); |
|
return Status::ok(); |
|
} |
|
|
|
Status BluetoothBinderServer::IsMultiAdvertisementSupported( |
|
bool* _aidl_return) { |
|
VLOG(2) << __func__; |
|
*_aidl_return = adapter_->IsMultiAdvertisementSupported(); |
|
return Status::ok(); |
|
} |
|
|
|
Status BluetoothBinderServer::GetLowEnergyInterface( |
|
::android::sp<IBluetoothLowEnergy>* _aidl_return) { |
|
VLOG(2) << __func__; |
|
|
|
if (!adapter_->IsEnabled()) { |
|
LOG(ERROR) << "Cannot obtain IBluetoothLowEnergy interface while disabled"; |
|
*_aidl_return = NULL; |
|
return Status::ok(); |
|
} |
|
|
|
if (!low_energy_interface_.get()) |
|
low_energy_interface_ = new BluetoothLowEnergyBinderServer(adapter_); |
|
|
|
*_aidl_return = low_energy_interface_; |
|
return Status::ok(); |
|
} |
|
|
|
Status BluetoothBinderServer::GetLeAdvertiserInterface( |
|
::android::sp<IBluetoothLeAdvertiser>* _aidl_return) { |
|
VLOG(2) << __func__; |
|
|
|
if (!adapter_->IsEnabled()) { |
|
LOG(ERROR) |
|
<< "Cannot obtain IBluetoothLeAdvertiser interface while disabled"; |
|
*_aidl_return = NULL; |
|
return Status::ok(); |
|
} |
|
|
|
if (!le_advertiser_interface_.get()) |
|
le_advertiser_interface_ = new BluetoothLeAdvertiserBinderServer(adapter_); |
|
|
|
*_aidl_return = le_advertiser_interface_; |
|
return Status::ok(); |
|
} |
|
|
|
Status BluetoothBinderServer::GetLeScannerInterface( |
|
::android::sp<IBluetoothLeScanner>* _aidl_return) { |
|
VLOG(2) << __func__; |
|
|
|
if (!adapter_->IsEnabled()) { |
|
LOG(ERROR) << "Cannot obtain IBluetoothLeScanner interface while disabled"; |
|
*_aidl_return = NULL; |
|
return Status::ok(); |
|
} |
|
|
|
if (!le_scanner_interface_.get()) |
|
le_scanner_interface_ = new BluetoothLeScannerBinderServer(adapter_); |
|
|
|
*_aidl_return = le_scanner_interface_; |
|
return Status::ok(); |
|
} |
|
|
|
Status BluetoothBinderServer::GetGattClientInterface( |
|
::android::sp<IBluetoothGattClient>* _aidl_return) { |
|
VLOG(2) << __func__; |
|
|
|
if (!adapter_->IsEnabled()) { |
|
LOG(ERROR) << "Cannot obtain IBluetoothGattClient interface while disabled"; |
|
*_aidl_return = NULL; |
|
return Status::ok(); |
|
} |
|
|
|
if (!gatt_client_interface_.get()) |
|
gatt_client_interface_ = new BluetoothGattClientBinderServer(adapter_); |
|
|
|
*_aidl_return = gatt_client_interface_; |
|
return Status::ok(); |
|
} |
|
|
|
Status BluetoothBinderServer::GetGattServerInterface( |
|
::android::sp<IBluetoothGattServer>* _aidl_return) { |
|
VLOG(2) << __func__; |
|
|
|
if (!adapter_->IsEnabled()) { |
|
LOG(ERROR) << "Cannot obtain IBluetoothGattServer interface while disabled"; |
|
*_aidl_return = NULL; |
|
return Status::ok(); |
|
} |
|
|
|
if (!gatt_server_interface_.get()) |
|
gatt_server_interface_ = new BluetoothGattServerBinderServer(adapter_); |
|
|
|
*_aidl_return = gatt_server_interface_; |
|
return Status::ok(); |
|
} |
|
|
|
android::status_t BluetoothBinderServer::dump( |
|
int fd, const android::Vector<android::String16>& args) { |
|
VLOG(2) << __func__ << " called with fd " << fd; |
|
if (args.size() > 0) { |
|
// TODO (jamuraa): Parse arguments and switch on --proto, --proto_text |
|
for (const auto& x : args) { |
|
VLOG(2) << __func__ << "argument: " << x.string(); |
|
} |
|
} |
|
// TODO (jamuraa): enumerate profiles and dump profile information |
|
const bt_interface_t* iface = |
|
bluetooth::hal::BluetoothInterface::Get()->GetHALInterface(); |
|
iface->dump(fd, NULL); |
|
return android::NO_ERROR; |
|
} |
|
|
|
void BluetoothBinderServer::OnAdapterStateChanged( |
|
bluetooth::Adapter* adapter, bluetooth::AdapterState prev_state, |
|
bluetooth::AdapterState new_state) { |
|
CHECK_EQ(adapter, adapter_); |
|
VLOG(2) << "Received adapter state update - prev: " << prev_state |
|
<< " new: " << new_state; |
|
callbacks_.ForEach([prev_state, new_state](IBluetoothCallback* callback) { |
|
callback->OnBluetoothStateChange(prev_state, new_state); |
|
}); |
|
} |
|
|
|
} // namespace binder |
|
} // namespace ipc
|
|
|