1/* 2 * Copyright (C) 2021-2022 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16#include "bluetooth_host.h" 17#include <memory> 18#include <mutex> 19#include <unistd.h> 20#include <thread> 21#include "bluetooth_ble_peripheral_observer_stub.h" 22#include "bluetooth_host_load_callback.h" 23#include "bluetooth_host_observer_stub.h" 24#include "bluetooth_host_proxy.h" 25#include "bluetooth_profile_manager.h" 26#include "bluetooth_log.h" 27#include "bluetooth_utils.h" 28#include "bluetooth_observer_list.h" 29#include "bluetooth_remote_device_observer_stub.h" 30#include "bluetooth_resource_manager_observer_stub.h" 31#include "iservice_registry.h" 32#include "parameter.h" 33#include "system_ability_definition.h" 34#include "bluetooth_switch_module.h" 35#include "ffrt_inner.h" 36#include "common_event.h" 37#include "common_event_data.h" 38#include "common_event_manager.h" 39 40using namespace OHOS::EventFwk; 41 42namespace OHOS { 43namespace Bluetooth { 44namespace { 45constexpr int32_t LOAD_SA_TIMEOUT_MS = 4000; 46} 47 48struct BluetoothHost::impl { 49 impl(); 50 ~impl(); 51 52 bool LoadBluetoothHostService(); 53 void LoadSystemAbilitySuccess(const sptr<IRemoteObject> &remoteObject); 54 void LoadSystemAbilityFail(); 55 int EnableBluetoothAfterFactoryReset(void); 56 57 // host observer 58 class BluetoothHostObserverImp; 59 sptr<BluetoothHostObserverImp> observerImp_ = nullptr; 60 sptr<BluetoothHostObserverImp> bleObserverImp_ = nullptr; 61 62 // remote device observer 63 class BluetoothRemoteDeviceObserverImp; 64 sptr<BluetoothRemoteDeviceObserverImp> remoteObserverImp_ = nullptr; 65 66 // remote device observer 67 class BluetoothBlePeripheralCallbackImp; 68 sptr<BluetoothBlePeripheralCallbackImp> bleRemoteObserverImp_ = nullptr; 69 70 // bluetooth resource manager observer 71 class BluetoothResourceManagerObserverImp; 72 sptr<BluetoothResourceManagerObserverImp> resourceManagerObserverImp_ = nullptr; 73 74 // user regist observers 75 BluetoothObserverList<BluetoothHostObserver> observers_; 76 77 // user regist remote observers 78 BluetoothObserverList<BluetoothRemoteDeviceObserver> remoteObservers_; 79 80 // user regist resource manager observers 81 BluetoothObserverList<BluetoothResourceManagerObserver> resourceManagerObservers_; 82 83 void SyncRandomAddrToService(void); 84 85 std::mutex proxyMutex_; 86 std::string stagingRealAddr_; 87 std::string stagingRandomAddr_; 88 int32_t profileRegisterId = 0; 89 std::atomic_bool isFactoryReseting_ { false }; 90 91 class BluetoothSwitchAction; 92 std::mutex switchModuleMutex_ {}; // used for serial execute enableBluetoothToRestrictMode. 93 std::shared_ptr<BluetoothSwitchModule> switchModule_ { nullptr }; 94 95private: 96 SaManagerStatus saManagerStatus_ = SaManagerStatus::WAIT_NOTIFY; 97 std::condition_variable proxyConVar_; 98}; 99 100class BluetoothHost::impl::BluetoothHostObserverImp : public BluetoothHostObserverStub { 101public: 102 explicit BluetoothHostObserverImp(BluetoothHost::impl &host) : host_(host){}; 103 ~BluetoothHostObserverImp() override{}; 104 105 void Register(std::shared_ptr<BluetoothHostObserver> &observer) 106 { 107 host_.observers_.Register(observer); 108 } 109 110 void Deregister(std::shared_ptr<BluetoothHostObserver> &observer) 111 { 112 host_.observers_.Deregister(observer); 113 } 114 115 void OnStateChanged(int32_t transport, int32_t status) override 116 { 117 if (status == BTStateID::STATE_TURN_ON) { 118 host_.SyncRandomAddrToService(); 119 } 120 CHECK_AND_RETURN_LOG(!isNeedInterceptSwitchStatus(transport, status), "No Need transform same status"); 121 BluetoothProfileManager::GetInstance().NotifyBluetoothStateChange(transport, status); 122 host_.observers_.ForEach([transport, status](std::shared_ptr<BluetoothHostObserver> observer) { 123 observer->OnStateChanged(transport, status); 124 }); 125 } 126 127 void OnBluetoothStateChanged(int32_t state) override 128 { 129 std::lock_guard<std::mutex> lock(host_.switchModuleMutex_); 130 CHECK_AND_RETURN_LOG(host_.switchModule_, "switchModule is nullptr"); 131 if (state == bluetooth::BluetoothSwitchState::STATE_ON) { 132 host_.switchModule_->ProcessBluetoothSwitchEvent(BluetoothSwitchEvent::BLUETOOTH_ON); 133 } 134 if (state == bluetooth::BluetoothSwitchState::STATE_OFF) { 135 host_.switchModule_->ProcessBluetoothSwitchEvent(BluetoothSwitchEvent::BLUETOOTH_OFF); 136 } 137 if (state == bluetooth::BluetoothSwitchState::STATE_HALF) { 138 host_.switchModule_->ProcessBluetoothSwitchEvent(BluetoothSwitchEvent::BLUETOOTH_HALF); 139 } 140 } 141 142 void OnDiscoveryStateChanged(int32_t status) override 143 { 144 HILOGD("enter, status: %{public}d", status); 145 host_.observers_.ForEach( 146 [status](std::shared_ptr<BluetoothHostObserver> observer) { observer->OnDiscoveryStateChanged(status); }); 147 } 148 149 void OnDiscoveryResult( 150 const BluetoothRawAddress &device, int rssi, const std::string deviceName, int deviceClass) override 151 { 152 BluetoothRemoteDevice remoteDevice(device.GetAddress(), BTTransport::ADAPTER_BREDR); 153 host_.observers_.ForEach([remoteDevice, rssi, deviceName, deviceClass]( 154 std::shared_ptr<BluetoothHostObserver> observer) { 155 observer->OnDiscoveryResult(remoteDevice, rssi, deviceName, deviceClass); 156 }); 157 } 158 159 void OnPairRequested(const int32_t transport, const BluetoothRawAddress &device) override 160 { 161 HILOGI("enter, transport: %{public}d, device: %{public}s", 162 transport, GET_ENCRYPT_RAW_ADDR(device)); 163 BluetoothRemoteDevice remoteDevice(device.GetAddress(), transport); 164 host_.observers_.ForEach([remoteDevice](std::shared_ptr<BluetoothHostObserver> observer) { 165 observer->OnPairRequested(remoteDevice); 166 }); 167 } 168 169 void OnPairConfirmed(const int32_t transport, const BluetoothRawAddress &device, int reqType, int number) override 170 { 171 HILOGI("enter, transport: %{public}d, device: %{public}s, reqType: %{public}d, number: %{public}d", 172 transport, GET_ENCRYPT_RAW_ADDR(device), reqType, number); 173 BluetoothRemoteDevice remoteDevice(device.GetAddress(), transport); 174 host_.observers_.ForEach([remoteDevice, reqType, number](std::shared_ptr<BluetoothHostObserver> observer) { 175 observer->OnPairConfirmed(remoteDevice, reqType, number); 176 }); 177 } 178 179 void OnScanModeChanged(int mode) override 180 { 181 HILOGI("enter, mode: %{public}d", mode); 182 host_.observers_.ForEach( 183 [mode](std::shared_ptr<BluetoothHostObserver> observer) { observer->OnScanModeChanged(mode); }); 184 } 185 186 void OnDeviceNameChanged(const std::string &deviceName) override 187 { 188 HILOGI("enter, deviceName: %{public}s", deviceName.c_str()); 189 host_.observers_.ForEach([deviceName](std::shared_ptr<BluetoothHostObserver> observer) { 190 observer->OnDeviceNameChanged(deviceName); 191 }); 192 } 193 194 void OnDeviceAddrChanged(const std::string &address) override 195 { 196 HILOGD("enter"); 197 host_.observers_.ForEach( 198 [address](std::shared_ptr<BluetoothHostObserver> observer) { observer->OnDeviceAddrChanged(address); }); 199 } 200 201private: 202 bool isNeedInterceptSwitchStatus(int32_t transport, int32_t status) 203 { 204 bool isBluetoothSeriviceOn = BluetoothProfileManager::GetInstance().IsBluetoothServiceOn(); 205 if (status == BTStateID::STATE_TURN_OFF) { 206 if (transport == BTTransport::ADAPTER_BLE && 207 preBleState_ == BTStateID::STATE_TURN_OFF && !isBluetoothSeriviceOn) { 208 return true; 209 } 210 if (transport == BTTransport::ADAPTER_BREDR && 211 preBrState_ == BTStateID::STATE_TURN_OFF && !isBluetoothSeriviceOn) { 212 return true; 213 } 214 } 215 if (transport == BTTransport::ADAPTER_BREDR) { 216 preBrState_ = status; 217 } else { 218 preBleState_ = status; 219 } 220 return false; 221 } 222 BluetoothHost::impl &host_; 223 const int32_t INVALID_STATE = -1; 224 int32_t preBrState_ = INVALID_STATE; 225 int32_t preBleState_ = INVALID_STATE; 226 BLUETOOTH_DISALLOW_COPY_AND_ASSIGN(BluetoothHostObserverImp); 227}; 228 229class BluetoothHost::impl::BluetoothRemoteDeviceObserverImp : public BluetoothRemoteDeviceObserverstub { 230public: 231 explicit BluetoothRemoteDeviceObserverImp(BluetoothHost::impl &host) : host_(host){}; 232 ~BluetoothRemoteDeviceObserverImp() override = default; 233 234 void OnAclStateChanged(const BluetoothRawAddress &device, int32_t state, uint32_t reason) override 235 { 236 HILOGD("enter, device: %{public}s, state: %{public}d, reason: %{public}u", 237 GET_ENCRYPT_RAW_ADDR(device), state, reason); 238 BluetoothRemoteDevice remoteDevice(device.GetAddress(), BTTransport::ADAPTER_BREDR); 239 host_.remoteObservers_.ForEach( 240 [remoteDevice, state, reason](std::shared_ptr<BluetoothRemoteDeviceObserver> observer) { 241 observer->OnAclStateChanged(remoteDevice, state, reason); 242 }); 243 } 244 245 void OnPairStatusChanged(const int32_t transport, const BluetoothRawAddress &device, 246 int32_t status, int32_t cause) override 247 { 248 HILOGD("enter, transport: %{public}d, device: %{public}s, status: %{public}d, cause: %{public}d", 249 transport, GET_ENCRYPT_RAW_ADDR(device), status, cause); 250 BluetoothRemoteDevice remoteDevice(device.GetAddress(), transport); 251 host_.remoteObservers_.ForEach( 252 [remoteDevice, status, cause](std::shared_ptr<BluetoothRemoteDeviceObserver> observer) { 253 observer->OnPairStatusChanged(remoteDevice, status, cause); 254 }); 255 } 256 257 void OnRemoteUuidChanged(const BluetoothRawAddress &device, const std::vector<bluetooth::Uuid> uuids) override 258 { 259 HILOGD("enter, device: %{public}s", GET_ENCRYPT_RAW_ADDR(device)); 260 BluetoothRemoteDevice remoteDevice(device.GetAddress(), BTTransport::ADAPTER_BREDR); 261 host_.remoteObservers_.ForEach( 262 [remoteDevice, uuids](std::shared_ptr<BluetoothRemoteDeviceObserver> observer) { 263 std::vector<ParcelUuid> parcelUuids; 264 for (auto &uuid : uuids) { 265 ParcelUuid parcelUuid = UUID::ConvertFrom128Bits(uuid.ConvertTo128Bits()); 266 parcelUuids.push_back(parcelUuid); 267 } 268 observer->OnRemoteUuidChanged(remoteDevice, parcelUuids); 269 }); 270 } 271 272 void OnRemoteNameChanged(const BluetoothRawAddress &device, const std::string deviceName) override 273 { 274 HILOGD("enter, device: %{public}s, deviceName: %{public}s", 275 GET_ENCRYPT_RAW_ADDR(device), deviceName.c_str()); 276 BluetoothRemoteDevice remoteDevice(device.GetAddress(), BTTransport::ADAPTER_BREDR); 277 host_.remoteObservers_.ForEach( 278 [remoteDevice, deviceName](std::shared_ptr<BluetoothRemoteDeviceObserver> observer) { 279 observer->OnRemoteNameChanged(remoteDevice, deviceName); 280 }); 281 } 282 283 void OnRemoteAliasChanged(const BluetoothRawAddress &device, const std::string alias) override 284 { 285 HILOGI("enter, device: %{public}s, alias: %{public}s", 286 GET_ENCRYPT_RAW_ADDR(device), alias.c_str()); 287 BluetoothRemoteDevice remoteDevice(device.GetAddress(), BTTransport::ADAPTER_BREDR); 288 host_.remoteObservers_.ForEach( 289 [remoteDevice, alias](std::shared_ptr<BluetoothRemoteDeviceObserver> observer) { 290 observer->OnRemoteAliasChanged(remoteDevice, alias); 291 }); 292 } 293 294 void OnRemoteCodChanged(const BluetoothRawAddress &device, int32_t cod) override 295 { 296 HILOGD("enter, device: %{public}s, cod: %{public}d", GET_ENCRYPT_RAW_ADDR(device), cod); 297 BluetoothRemoteDevice remoteDevice(device.GetAddress(), BTTransport::ADAPTER_BREDR); 298 BluetoothDeviceClass deviceClass(cod); 299 host_.remoteObservers_.ForEach( 300 [remoteDevice, deviceClass](std::shared_ptr<BluetoothRemoteDeviceObserver> observer) { 301 observer->OnRemoteCodChanged(remoteDevice, deviceClass); 302 }); 303 } 304 305 void OnRemoteBatteryChanged(const BluetoothRawAddress &device, const BluetoothBatteryInfo &batteryInfo) override 306 { 307 BluetoothRemoteDevice remoteDevice(device.GetAddress(), BTTransport::ADAPTER_BREDR); 308 DeviceBatteryInfo info; 309 info.deviceId_ = device.GetAddress(); 310 info.batteryLevel_ = batteryInfo.batteryLevel_; 311 info.leftEarBatteryLevel_ = batteryInfo.leftEarBatteryLevel_; 312 info.leftEarChargeState_ = static_cast<DeviceChargeState>(batteryInfo.leftEarChargeState_); 313 info.rightEarBatteryLevel_ = batteryInfo.rightEarBatteryLevel_; 314 info.rightEarChargeState_ = static_cast<DeviceChargeState>(batteryInfo.rightEarChargeState_); 315 info.boxBatteryLevel_ = batteryInfo.boxBatteryLevel_; 316 info.boxChargeState_ = static_cast<DeviceChargeState>(batteryInfo.boxChargeState_); 317 host_.remoteObservers_.ForEach( 318 [remoteDevice, info](std::shared_ptr<BluetoothRemoteDeviceObserver> observer) { 319 observer->OnRemoteBatteryChanged(remoteDevice, info); 320 }); 321 } 322 323 void OnRemoteDeviceCommonInfoReport(const BluetoothRawAddress &device, const std::vector<uint8_t> &value) override 324 { 325 BluetoothRemoteDevice remoteDevice(device.GetAddress(), BTTransport::ADAPTER_BREDR); 326 host_.remoteObservers_.ForEach( 327 [remoteDevice, value](std::shared_ptr<BluetoothRemoteDeviceObserver> observer) { 328 observer->OnRemoteDeviceCommonInfoReport(remoteDevice, value); 329 }); 330 } 331 332private: 333 BluetoothHost::impl &host_; 334 BLUETOOTH_DISALLOW_COPY_AND_ASSIGN(BluetoothRemoteDeviceObserverImp); 335}; 336 337class BluetoothHost::impl::BluetoothBlePeripheralCallbackImp : public BluetoothBlePeripheralObserverStub { 338public: 339 explicit BluetoothBlePeripheralCallbackImp(BluetoothHost::impl &host) : host_(host){}; 340 ~BluetoothBlePeripheralCallbackImp() override = default; 341 342 void OnAclStateChanged(const BluetoothRawAddress &device, int state, unsigned int reason) override 343 { 344 HILOGD("enter, device: %{public}s, state: %{public}d, reason: %{public}u", 345 GET_ENCRYPT_RAW_ADDR(device), state, reason); 346 BluetoothRemoteDevice remoteDevice(device.GetAddress(), BTTransport::ADAPTER_BLE); 347 host_.remoteObservers_.ForEach( 348 [remoteDevice, state, reason](std::shared_ptr<BluetoothRemoteDeviceObserver> observer) { 349 observer->OnAclStateChanged(remoteDevice, state, reason); 350 }); 351 } 352 353 void OnPairStatusChanged(const int32_t transport, const BluetoothRawAddress &device, int status, int cause) override 354 { 355 HILOGI("enter, transport: %{public}d, device: %{public}s, status: %{public}d, cause: %{public}d", 356 transport, GET_ENCRYPT_RAW_ADDR(device), status, cause); 357 BluetoothRemoteDevice remoteDevice(device.GetAddress(), transport); 358 host_.remoteObservers_.ForEach( 359 [remoteDevice, status, cause](std::shared_ptr<BluetoothRemoteDeviceObserver> observer) { 360 observer->OnPairStatusChanged(remoteDevice, status, cause); 361 }); 362 } 363 364 void OnReadRemoteRssiEvent(const BluetoothRawAddress &device, int rssi, int status) override 365 { 366 HILOGI("enter, device: %{public}s, rssi: %{public}d, status: %{public}d", 367 GET_ENCRYPT_RAW_ADDR(device), rssi, status); 368 BluetoothRemoteDevice remoteDevice(device.GetAddress(), BTTransport::ADAPTER_BLE); 369 host_.remoteObservers_.ForEach( 370 [remoteDevice, rssi, status](std::shared_ptr<BluetoothRemoteDeviceObserver> observer) { 371 observer->OnReadRemoteRssiEvent(remoteDevice, rssi, status); 372 }); 373 } 374 375private: 376 BluetoothHost::impl &host_; 377 BLUETOOTH_DISALLOW_COPY_AND_ASSIGN(BluetoothBlePeripheralCallbackImp); 378}; 379 380class BluetoothHost::impl::BluetoothResourceManagerObserverImp : public BluetoothResourceManagerObserverStub { 381public: 382 explicit BluetoothResourceManagerObserverImp(BluetoothHost::impl &host) : host_(host){}; 383 ~BluetoothResourceManagerObserverImp() override = default; 384 385 void OnSensingStateChanged(uint8_t eventId, const BluetoothSensingInfo &info) override 386 { 387 HILOGD("enter, eventId: %{public}d", eventId); 388 SensingInfo sensingInfo; 389 sensingInfo.addr_ = info.addr_; 390 sensingInfo.uuid_ = info.uuid_; 391 sensingInfo.resourceId_ = info.resourceId_; 392 sensingInfo.pkgName_ = info.pkgName_; 393 sensingInfo.isServer_ = info.isServer_; 394 sensingInfo.interval_ = info.interval_; 395 host_.resourceManagerObservers_.ForEach( 396 [eventId, sensingInfo](std::shared_ptr<BluetoothResourceManagerObserver> observer) { 397 observer->OnSensingStateChanged(eventId, sensingInfo); 398 }); 399 } 400 401 void OnBluetoothResourceDecision(uint8_t eventId, const BluetoothSensingInfo &info, uint32_t &result) override 402 { 403 HILOGD("enter, eventId: %{public}d, result: %{public}d", eventId, result); 404 SensingInfo sensingInfo; 405 sensingInfo.addr_ = info.addr_; 406 sensingInfo.uuid_ = info.uuid_; 407 sensingInfo.resourceId_ = info.resourceId_; 408 sensingInfo.pkgName_ = info.pkgName_; 409 sensingInfo.isServer_ = info.isServer_; 410 sensingInfo.interval_ = info.interval_; 411 host_.resourceManagerObservers_.ForEach( 412 [eventId, sensingInfo, &result](std::shared_ptr<BluetoothResourceManagerObserver> observer) { 413 observer->OnBluetoothResourceDecision(eventId, sensingInfo, result); 414 }); 415 } 416 417private: 418 BluetoothHost::impl &host_; 419 BLUETOOTH_DISALLOW_COPY_AND_ASSIGN(BluetoothResourceManagerObserverImp); 420}; 421 422class BluetoothHost::impl::BluetoothSwitchAction : public IBluetoothSwitchAction { 423public: 424 BluetoothSwitchAction() = default; 425 ~BluetoothSwitchAction() override = default; 426 427 int EnableBluetooth(void) override 428 { 429 CHECK_AND_RETURN_LOG_RET(!BluetoothHost::GetDefaultHost().IsBtProhibitedByEdm(), 430 BT_ERR_PROHIBITED_BY_EDM, "bluetooth is prohibited !"); 431 CHECK_AND_RETURN_LOG_RET(BluetoothHost::GetDefaultHost().pimpl->LoadBluetoothHostService(), 432 BT_ERR_INTERNAL_ERROR, "pimpl is null or load bluetooth service failed."); 433 434 sptr<IBluetoothHost> proxy = GetRemoteProxy<IBluetoothHost>(BLUETOOTH_HOST); 435 CHECK_AND_RETURN_LOG_RET(proxy != nullptr, BT_ERR_INTERNAL_ERROR, "proxy is nullptr"); 436 return proxy->EnableBle(); 437 } 438 439 int DisableBluetooth(void) override 440 { 441 sptr<IBluetoothHost> proxy = GetRemoteProxy<IBluetoothHost>(BLUETOOTH_HOST); 442 CHECK_AND_RETURN_LOG_RET(proxy != nullptr, BT_ERR_INTERNAL_ERROR, "proxy is nullptr"); 443 return proxy->DisableBt(); 444 } 445 446 int EnableBluetoothToRestrictMode(void) override 447 { 448 CHECK_AND_RETURN_LOG_RET(!BluetoothHost::GetDefaultHost().IsBtProhibitedByEdm(), 449 BT_ERR_PROHIBITED_BY_EDM, "bluetooth is prohibited !"); 450 CHECK_AND_RETURN_LOG_RET(BluetoothHost::GetDefaultHost().pimpl->LoadBluetoothHostService(), 451 BT_ERR_INTERNAL_ERROR, "pimpl is null or load bluetooth service failed."); 452 453 sptr<IBluetoothHost> proxy = GetRemoteProxy<IBluetoothHost>(BLUETOOTH_HOST); 454 CHECK_AND_RETURN_LOG_RET(proxy != nullptr, BT_ERR_INTERNAL_ERROR, "proxy is nullptr"); 455 return proxy->EnableBluetoothToRestrictMode(); 456 } 457}; 458 459BluetoothHost::impl::impl() 460{ 461 observerImp_ = new BluetoothHostObserverImp(*this); 462 remoteObserverImp_ = new BluetoothRemoteDeviceObserverImp(*this); 463 bleRemoteObserverImp_ = new BluetoothBlePeripheralCallbackImp(*this); 464 bleObserverImp_ = new BluetoothHostObserverImp(*this); 465 resourceManagerObserverImp_ = new BluetoothResourceManagerObserverImp(*this); 466 467 auto switchActionPtr = std::make_unique<BluetoothSwitchAction>(); 468 switchModule_ = std::make_shared<BluetoothSwitchModule>(std::move(switchActionPtr)); 469 470 profileRegisterId = BluetoothProfileManager::GetInstance().RegisterFunc(BLUETOOTH_HOST, 471 [this](sptr<IRemoteObject> remote) { 472 sptr<IBluetoothHost> proxy = iface_cast<IBluetoothHost>(remote); 473 CHECK_AND_RETURN_LOG(proxy != nullptr, "proxy is nullptr"); 474 proxy->RegisterObserver(observerImp_); 475 proxy->RegisterBleAdapterObserver(bleObserverImp_); 476 proxy->RegisterRemoteDeviceObserver(remoteObserverImp_); 477 proxy->RegisterBlePeripheralCallback(bleRemoteObserverImp_); 478 proxy->RegisterBtResourceManagerObserver(resourceManagerObserverImp_); 479 }); 480} 481 482BluetoothHost::impl::~impl() 483{ 484 HILOGI("starts"); 485 BluetoothProfileManager::GetInstance().DeregisterFunc(profileRegisterId); 486 sptr<IBluetoothHost> proxy = GetRemoteProxy<IBluetoothHost>(BLUETOOTH_HOST); 487 CHECK_AND_RETURN_LOG(proxy != nullptr, "proxy is nullptr"); 488 proxy->DeregisterObserver(observerImp_); 489 proxy->DeregisterBleAdapterObserver(bleObserverImp_); 490 proxy->DeregisterRemoteDeviceObserver(remoteObserverImp_); 491 proxy->DeregisterBlePeripheralCallback(bleRemoteObserverImp_); 492 proxy->DeregisterBtResourceManagerObserver(resourceManagerObserverImp_); 493} 494 495bool BluetoothHost::impl::LoadBluetoothHostService() 496{ 497 std::unique_lock<std::mutex> lock(proxyMutex_); 498 auto samgrProxy = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager(); 499 if (samgrProxy == nullptr) { 500 HILOGE("samgrProxy is nullptr."); 501 return false; 502 } 503 sptr<IRemoteObject> hostRemote = BluetoothProfileManager::GetInstance().GetProfileRemote(BLUETOOTH_HOST); 504 //当蓝牙服务已经起来的时候。这时的hostRemote不为空, 不需要进行后续的从sa拉起蓝牙服务的动作 505 if (hostRemote != nullptr) { 506 return true; 507 } 508 509 sptr<BluetoothHostLoadCallBack> loadCallback = new BluetoothHostLoadCallBack(); 510 if (loadCallback == nullptr) { 511 HILOGE("loadCallback is nullptr."); 512 return false; 513 } 514 int32_t ret = samgrProxy->LoadSystemAbility(BLUETOOTH_HOST_SYS_ABILITY_ID, loadCallback); 515 if (ret != ERR_OK) { 516 HILOGE("Failed to load bluetooth systemAbility"); 517 return false; 518 } 519 auto waitStatus = proxyConVar_.wait_for( 520 lock, std::chrono::milliseconds(LOAD_SA_TIMEOUT_MS), [this]() { 521 HILOGI("bluetooth_service load systemAbility finished"); 522 sptr<IBluetoothHost> proxy = GetRemoteProxy<IBluetoothHost>(BLUETOOTH_HOST); 523 return proxy != nullptr || saManagerStatus_ == SaManagerStatus::LOAD_FAIL; 524 }); 525 if (!waitStatus) { 526 HILOGE("load bluetooth systemAbility timeout"); 527 return false; 528 } 529 if (saManagerStatus_ == SaManagerStatus::LOAD_FAIL) { 530 HILOGE("load bluetooth_service fail"); 531 saManagerStatus_ = SaManagerStatus::WAIT_NOTIFY; 532 return false; 533 } 534 saManagerStatus_ = SaManagerStatus::WAIT_NOTIFY; 535 return true; 536} 537 538void BluetoothHost::impl::LoadSystemAbilitySuccess(const sptr<IRemoteObject> &remoteObject) 539{ 540 HILOGI("LoadSystemAbilitySuccess FinishStart SA"); 541 saManagerStatus_ = SaManagerStatus::LOAD_SUCCESS; 542 proxyConVar_.notify_one(); 543} 544 545void BluetoothHost::impl::LoadSystemAbilityFail() 546{ 547 HILOGI("LoadSystemAbilityFail FinishStart SA"); 548 saManagerStatus_ = SaManagerStatus::LOAD_FAIL; 549 proxyConVar_.notify_one(); 550} 551 552void BluetoothHost::impl::SyncRandomAddrToService(void) 553{ 554 if (!IsValidBluetoothAddr(stagingRealAddr_)) { 555 HILOGD("stagingRealAddr_ is invalid."); 556 return; 557 } 558 if (!IsValidBluetoothAddr(stagingRandomAddr_)) { 559 HILOGE("stagingRandomAddr_ is invalid."); 560 return; 561 } 562 sptr<IBluetoothHost> proxy = GetRemoteProxy<IBluetoothHost>(BLUETOOTH_HOST); 563 CHECK_AND_RETURN_LOG(proxy != nullptr, "proxy is nullptr"); 564 proxy->SyncRandomAddress(stagingRealAddr_, stagingRandomAddr_); 565 stagingRealAddr_ = ""; 566 stagingRandomAddr_ = ""; 567} 568 569BluetoothHost::BluetoothHost() 570{ 571 pimpl = std::make_unique<impl>(); 572 if (!pimpl) { 573 HILOGE("fails: no pimpl"); 574 } 575} 576 577BluetoothHost::~BluetoothHost() {} 578 579BluetoothHost &BluetoothHost::GetDefaultHost() 580{ 581#ifdef DTFUZZ_TEST 582 static BluetoothNoDestructor<BluetoothHost> instance; 583 return *instance; 584#else 585 // C++11 static local variable initialization is thread-safe. 586 static BluetoothHost hostAdapter; 587 return hostAdapter; 588#endif 589} 590 591void BluetoothHost::RegisterObserver(std::shared_ptr<BluetoothHostObserver> observer) 592{ 593 HILOGD("enter"); 594 CHECK_AND_RETURN_LOG(pimpl != nullptr, "pimpl is null."); 595 pimpl->observers_.Register(observer); 596} 597 598void BluetoothHost::DeregisterObserver(std::shared_ptr<BluetoothHostObserver> observer) 599{ 600 HILOGD("enter"); 601 CHECK_AND_RETURN_LOG(pimpl != nullptr, "pimpl is null."); 602 pimpl->observers_.Deregister(observer); 603} 604 605int BluetoothHost::EnableBt() 606{ 607 HILOGD("enter"); 608 CHECK_AND_RETURN_LOG_RET(!IsBtProhibitedByEdm(), BT_ERR_PROHIBITED_BY_EDM, "bluetooth is prohibited"); 609 sptr<IBluetoothHost> proxy = GetRemoteProxy<IBluetoothHost>(BLUETOOTH_HOST); 610 CHECK_AND_RETURN_LOG_RET(proxy != nullptr, BT_ERR_INTERNAL_ERROR, "proxy is nullptr"); 611 612 return proxy->EnableBt(); 613} 614 615int BluetoothHost::DisableBt() 616{ 617 HILOGI("enter"); 618 std::lock_guard<std::mutex> lock(pimpl->switchModuleMutex_); 619 CHECK_AND_RETURN_LOG_RET(pimpl->switchModule_, BT_ERR_INTERNAL_ERROR, "switchModule is nullptr"); 620 return pimpl->switchModule_->ProcessBluetoothSwitchEvent(BluetoothSwitchEvent::DISABLE_BLUETOOTH); 621} 622 623static void PublishBtSwitchRestrictBluetoothEvent(void) 624{ 625 OHOS::AAFwk::Want want; 626 want.SetAction("usual.event.bluetooth.BT_SWITCH_RESTRICT_BLUETOOTH"); 627 628 OHOS::EventFwk::CommonEventData data; 629 data.SetWant(want); 630 631 OHOS::EventFwk::CommonEventPublishInfo publishInfo; 632 publishInfo.SetSubscriberPermissions({"ohos.permission.ACCESS_BLUETOOTH"}); 633 bool ret = OHOS::EventFwk::CommonEventManager::PublishCommonEvent(data, publishInfo); 634 if (!ret) { 635 HILOGE("Publish usual.event.bluetooth.BT_SWITCH_RESTRICT_BLUETOOTH event failed"); 636 return; 637 } 638} 639 640int BluetoothHost::RestrictBluetooth() 641{ 642 HILOGI("enter"); 643 std::lock_guard<std::mutex> lock(pimpl->switchModuleMutex_); 644 PublishBtSwitchRestrictBluetoothEvent(); 645 CHECK_AND_RETURN_LOG_RET(pimpl->switchModule_, BT_ERR_INTERNAL_ERROR, "switchModule is nullptr"); 646 int ret = pimpl->switchModule_->ProcessBluetoothSwitchEvent(BluetoothSwitchEvent::DISABLE_BLUETOOTH); 647 if (ret != BT_NO_ERROR) { 648 return ret; 649 } 650 ret = pimpl->switchModule_->ProcessBluetoothSwitchEvent(BluetoothSwitchEvent::ENABLE_BLUETOOTH_TO_RESTRICE_MODE); 651 return ret; 652} 653 654void BluetoothHost::UpdateVirtualDevice(int32_t action, const std::string &address) 655{ 656 HILOGD("enter"); 657 CHECK_AND_RETURN_LOG(IS_BT_ENABLED(), "bluetooth is off"); 658 sptr<IBluetoothHost> proxy = GetRemoteProxy<IBluetoothHost>(BLUETOOTH_HOST); 659 CHECK_AND_RETURN_LOG(proxy != nullptr, "proxy is nullptr"); 660 proxy->UpdateVirtualDevice(action, address); 661} 662 663int BluetoothHost::SatelliteControl(int type, int state) 664{ 665 HILOGI("type: %{public}d, state: %{public}d", type, state); 666 if (type == static_cast<int>(SATELLITE_CONTROL_MODE::ANTENNA)) { 667 CHECK_AND_RETURN_LOG_RET(IS_BT_ENABLED(), BT_ERR_INVALID_STATE, "bluetooth is off."); 668 } else if (type == static_cast<int>(SATELLITE_CONTROL_MODE::BLUETOOTH_SWITCH)) { 669 pimpl->LoadBluetoothHostService(); 670 } else { 671 HILOGE("Invalid control type: %{public}d", type); 672 return BT_ERR_INVALID_PARAM; 673 } 674 675 sptr<IBluetoothHost> proxy = GetRemoteProxy<IBluetoothHost>(BLUETOOTH_HOST); 676 CHECK_AND_RETURN_LOG_RET(proxy != nullptr, BT_ERR_INTERNAL_ERROR, "proxy is nullptr"); 677 return proxy->SatelliteControl(type, state); 678} 679 680int BluetoothHost::GetBtState() const 681{ 682 HILOGD("enter"); 683 if (!IS_BT_ENABLED()) { 684 HILOGD("bluetooth is off."); 685 return BTStateID::STATE_TURN_OFF; 686 } 687 sptr<IBluetoothHost> proxy = GetRemoteProxy<IBluetoothHost>(BLUETOOTH_HOST); 688 CHECK_AND_RETURN_LOG_RET(proxy != nullptr, BTStateID::STATE_TURN_OFF, "proxy is nullptr"); 689 690 int state = BTStateID::STATE_TURN_OFF; 691 proxy->GetBtState(state); 692 HILOGD("state: %{public}d", state); 693 return state; 694} 695 696int BluetoothHost::GetBtState(int &state) const 697{ 698 HILOGD("enter"); 699 state = BTStateID::STATE_TURN_OFF; 700 CHECK_AND_RETURN_LOG_RET(IS_BT_ENABLED(), BT_NO_ERROR, "bluetooth is off."); 701 702 sptr<IBluetoothHost> proxy = GetRemoteProxy<IBluetoothHost>(BLUETOOTH_HOST); 703 CHECK_AND_RETURN_LOG_RET(proxy != nullptr, BT_ERR_INVALID_STATE, "proxy is nullptr"); 704 705 int ret = proxy->GetBtState(state); 706 HILOGI("state: %{public}d", state); 707 return ret; 708} 709 710int BluetoothHost::impl::EnableBluetoothAfterFactoryReset(void) 711{ 712 HILOGI("Attempt to enable bluetooth after factory reset"); 713 isFactoryReseting_ = false; 714 SetParameter("persist.bluetooth.switch_enable", "2"); // 2 means bluetooth auto enter restricted mode 715 return BT_NO_ERROR; 716} 717 718int BluetoothHost::BluetoothFactoryReset() 719{ 720 HILOGI("enter"); 721 constexpr const char* BLUETOOTH_FACTORY_RESET_KEY = "persist.bluetooth.factoryreset"; 722 int ret = SetParameter(BLUETOOTH_FACTORY_RESET_KEY, "true"); 723 CHECK_AND_RETURN_LOG_RET(ret == 0, BT_ERR_INTERNAL_ERROR, "SetParameter failed"); 724 725 pimpl->isFactoryReseting_ = true; 726 727 sptr<IBluetoothHost> proxy = GetRemoteProxy<IBluetoothHost>(BLUETOOTH_HOST); 728 if (proxy == nullptr) { 729 return pimpl->EnableBluetoothAfterFactoryReset(); 730 } 731 CHECK_AND_RETURN_LOG_RET(IS_BLE_ENABLED(), BT_NO_ERROR, "bluetooth is off."); 732 return proxy->BluetoothFactoryReset(); 733} 734 735bool BluetoothHost::IsValidBluetoothAddr(const std::string &addr) 736{ 737#if defined(IOS_PLATFORM) 738 const std::regex deviceIdRegex("^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$"); 739 return regex_match(addr, deviceIdRegex); 740#elif defined(ANDROID_PLATFORM) 741 const std::regex deviceIdRegex("^[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}$"); 742 return regex_match(addr, deviceIdRegex); 743#else 744 if (addr.length() != ADDRESS_LENGTH) { 745 HILOGD("invalid address len."); 746 return false; 747 } 748 749 for (int i = 0; i < ADDRESS_LENGTH; i++) { 750 char c = addr[i]; 751 switch (i % ADDRESS_SEPARATOR_UNIT) { 752 case 0: 753 case 1: 754 if ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'F')) { 755 break; 756 } 757 return false; 758 case ADDRESS_COLON_INDEX: 759 default: 760 if (c == ':') { 761 break; 762 } 763 return false; 764 } 765 } 766 return true; 767#endif 768} 769 770BluetoothRemoteDevice BluetoothHost::GetRemoteDevice(const std::string &addr, int transport) const 771{ 772 BluetoothRemoteDevice remoteDevice(addr, transport); 773 return remoteDevice; 774} 775 776int BluetoothHost::EnableBle() 777{ 778 HILOGI("enter"); 779 std::lock_guard<std::mutex> lock(pimpl->switchModuleMutex_); 780 CHECK_AND_RETURN_LOG_RET(pimpl->switchModule_, BT_ERR_INTERNAL_ERROR, "switchModule is nullptr"); 781 return pimpl->switchModule_->ProcessBluetoothSwitchEvent(BluetoothSwitchEvent::ENABLE_BLUETOOTH); 782} 783 784int BluetoothHost::DisableBle() 785{ 786 HILOGD("enter"); 787 sptr<IBluetoothHost> proxy = GetRemoteProxy<IBluetoothHost>(BLUETOOTH_HOST); 788 CHECK_AND_RETURN_LOG_RET(proxy != nullptr, BT_ERR_INTERNAL_ERROR, "proxy is nullptr"); 789 790 return proxy->DisableBle(); 791} 792 793int BluetoothHost::EnableBluetoothToRestrictMode(void) 794{ 795 HILOGI("enter"); 796 std::lock_guard<std::mutex> lock(pimpl->switchModuleMutex_); 797 CHECK_AND_RETURN_LOG_RET(pimpl->switchModule_, BT_ERR_INTERNAL_ERROR, "switchModule is nullptr"); 798 return pimpl->switchModule_->ProcessBluetoothSwitchEvent(BluetoothSwitchEvent::ENABLE_BLUETOOTH_TO_RESTRICE_MODE); 799} 800 801bool BluetoothHost::IsBrEnabled() const 802{ 803 sptr<IBluetoothHost> proxy = GetRemoteProxy<IBluetoothHost>(BLUETOOTH_HOST); 804 if (proxy == nullptr) { 805 HILOGD("proxy is nullptr"); 806 return false; 807 } 808 809 return proxy->IsBrEnabled(); 810} 811 812bool BluetoothHost::IsBleEnabled() const 813{ 814 sptr<IBluetoothHost> proxy = GetRemoteProxy<IBluetoothHost>(BLUETOOTH_HOST); 815 if (proxy == nullptr) { 816 HILOGD("proxy is nullptr"); 817 return false; 818 } 819 820 return proxy->IsBleEnabled(); 821} 822 823int BluetoothHost::GetLocalAddress(std::string &addr) const 824{ 825 sptr<IBluetoothHost> proxy = GetRemoteProxy<IBluetoothHost>(BLUETOOTH_HOST); 826 CHECK_AND_RETURN_LOG_RET(proxy != nullptr, BT_ERR_UNAVAILABLE_PROXY, "failed: no proxy"); 827 828 return proxy->GetLocalAddress(addr); 829} 830 831std::vector<uint32_t> BluetoothHost::GetProfileList() const 832{ 833 HILOGD("enter"); 834 std::vector<uint32_t> profileList; 835 sptr<IBluetoothHost> proxy = GetRemoteProxy<IBluetoothHost>(BLUETOOTH_HOST); 836 CHECK_AND_RETURN_LOG_RET(proxy != nullptr, profileList, "proxy is nullptr"); 837 838 profileList = proxy->GetProfileList(); 839 return profileList; 840} 841 842int BluetoothHost::GetMaxNumConnectedAudioDevices() const 843{ 844 HILOGD("enter"); 845 sptr<IBluetoothHost> proxy = GetRemoteProxy<IBluetoothHost>(BLUETOOTH_HOST); 846 CHECK_AND_RETURN_LOG_RET(proxy != nullptr, INVALID_VALUE, "proxy is nullptr"); 847 848 return proxy->GetMaxNumConnectedAudioDevices(); 849} 850 851int BluetoothHost::GetBtConnectionState() const 852{ 853 HILOGD("enter"); 854 int state = static_cast<int>(BTConnectState::DISCONNECTED); 855 CHECK_AND_RETURN_LOG_RET(IS_BT_ENABLED(), state, "bluetooth is off."); 856 857 sptr<IBluetoothHost> proxy = GetRemoteProxy<IBluetoothHost>(BLUETOOTH_HOST); 858 CHECK_AND_RETURN_LOG_RET(proxy != nullptr, state, "proxy is nullptr"); 859 860 proxy->GetBtConnectionState(state); 861 HILOGI("state: %{public}d", state); 862 return state; 863} 864 865int BluetoothHost::GetBtConnectionState(int &state) const 866{ 867 HILOGD("enter"); 868 state = static_cast<int>(BTConnectState::DISCONNECTED); 869 CHECK_AND_RETURN_LOG_RET(IS_BT_ENABLED(), BT_ERR_INVALID_STATE, "bluetooth is off."); 870 871 sptr<IBluetoothHost> proxy = GetRemoteProxy<IBluetoothHost>(BLUETOOTH_HOST); 872 CHECK_AND_RETURN_LOG_RET(proxy != nullptr, BT_ERR_UNAVAILABLE_PROXY, "proxy is nullptr"); 873 874 int ret = proxy->GetBtConnectionState(state); 875 HILOGI("state: %{public}d", state); 876 return ret; 877} 878 879int BluetoothHost::GetBtProfileConnState(uint32_t profileId, int &state) const 880{ 881 HILOGI("profileId: %{public}d", profileId); 882 state = static_cast<int>(BTConnectState::DISCONNECTED); 883 CHECK_AND_RETURN_LOG_RET(IS_BT_ENABLED(), BT_ERR_INVALID_STATE, "bluetooth is off."); 884 885 sptr<IBluetoothHost> proxy = GetRemoteProxy<IBluetoothHost>(BLUETOOTH_HOST); 886 CHECK_AND_RETURN_LOG_RET(proxy != nullptr, BT_ERR_UNAVAILABLE_PROXY, "proxy is nullptr"); 887 888 return proxy->GetBtProfileConnState(profileId, state); 889} 890 891void BluetoothHost::GetLocalSupportedUuids(std::vector<ParcelUuid> &uuids) 892{ 893 HILOGD("enter"); 894 sptr<IBluetoothHost> proxy = GetRemoteProxy<IBluetoothHost>(BLUETOOTH_HOST); 895 CHECK_AND_RETURN_LOG(proxy != nullptr, "proxy is nullptr"); 896 897 std::vector<std::string> stringUuids; 898 proxy->GetLocalSupportedUuids(stringUuids); 899 900 for (auto uuid : stringUuids) { 901 uuids.push_back(UUID::FromString(uuid)); 902 } 903} 904 905bool BluetoothHost::Start() 906{ 907 // / This function only used for passthrough, so this is empty. 908 return true; 909} 910 911void BluetoothHost::Stop() 912{ 913 // / This function only used for passthrough, so this is empty. 914} 915 916BluetoothDeviceClass BluetoothHost::GetLocalDeviceClass() const 917{ 918 HILOGD("enter"); 919 sptr<IBluetoothHost> proxy = GetRemoteProxy<IBluetoothHost>(BLUETOOTH_HOST); 920 CHECK_AND_RETURN_LOG_RET(proxy != nullptr, BluetoothDeviceClass(0), "proxy is nullptr"); 921 922 int LocalDeviceClass = proxy->GetLocalDeviceClass(); 923 return BluetoothDeviceClass(LocalDeviceClass); 924} 925 926bool BluetoothHost::SetLocalDeviceClass(const BluetoothDeviceClass &deviceClass) 927{ 928 HILOGD("enter"); 929 sptr<IBluetoothHost> proxy = GetRemoteProxy<IBluetoothHost>(BLUETOOTH_HOST); 930 CHECK_AND_RETURN_LOG_RET(proxy != nullptr, false, "proxy is nullptr"); 931 932 int cod = deviceClass.GetClassOfDevice(); 933 return proxy->SetLocalDeviceClass(cod); 934} 935 936std::string BluetoothHost::GetLocalName() const 937{ 938 HILOGD("enter"); 939 sptr<IBluetoothHost> proxy = GetRemoteProxy<IBluetoothHost>(BLUETOOTH_HOST); 940 CHECK_AND_RETURN_LOG_RET(proxy != nullptr, std::string(), "proxy is nullptr"); 941 942 std::string name = INVALID_NAME; 943 proxy->GetLocalName(name); 944 return name; 945} 946 947int BluetoothHost::GetLocalName(std::string &name) const 948{ 949 HILOGD("enter"); 950 sptr<IBluetoothHost> proxy = GetRemoteProxy<IBluetoothHost>(BLUETOOTH_HOST); 951 CHECK_AND_RETURN_LOG_RET(proxy != nullptr, BT_ERR_UNAVAILABLE_PROXY, "proxy is nullptr"); 952 953 return proxy->GetLocalName(name); 954} 955 956int BluetoothHost::SetLocalName(const std::string &name) 957{ 958 HILOGD("enter"); 959 CHECK_AND_RETURN_LOG_RET(IS_BT_ENABLED(), BT_ERR_INVALID_STATE, "bluetooth is off."); 960 961 sptr<IBluetoothHost> proxy = GetRemoteProxy<IBluetoothHost>(BLUETOOTH_HOST); 962 CHECK_AND_RETURN_LOG_RET(proxy != nullptr, BT_ERR_UNAVAILABLE_PROXY, "proxy is nullptr"); 963 964 return proxy->SetLocalName(name); 965} 966 967int BluetoothHost::GetBtScanMode(int32_t &scanMode) const 968{ 969 HILOGD("enter"); 970 CHECK_AND_RETURN_LOG_RET(IS_BT_ENABLED(), BT_ERR_INVALID_STATE, "bluetooth is off."); 971 972 sptr<IBluetoothHost> proxy = GetRemoteProxy<IBluetoothHost>(BLUETOOTH_HOST); 973 CHECK_AND_RETURN_LOG_RET(proxy != nullptr, BT_ERR_UNAVAILABLE_PROXY, "proxy is nullptr"); 974 975 return proxy->GetBtScanMode(scanMode); 976} 977 978int BluetoothHost::SetBtScanMode(int mode, int duration) 979{ 980 HILOGD("mode: %{public}d, duration: %{public}d", mode, duration); 981 CHECK_AND_RETURN_LOG_RET(IS_BT_ENABLED(), BT_ERR_INVALID_STATE, "bluetooth is off."); 982 983 sptr<IBluetoothHost> proxy = GetRemoteProxy<IBluetoothHost>(BLUETOOTH_HOST); 984 CHECK_AND_RETURN_LOG_RET(proxy != nullptr, BT_ERR_UNAVAILABLE_PROXY, "proxy is nullptr"); 985 986 return proxy->SetBtScanMode(mode, duration); 987} 988 989int BluetoothHost::GetBondableMode(int transport) const 990{ 991 HILOGI("transport: %{public}d", transport); 992 sptr<IBluetoothHost> proxy = GetRemoteProxy<IBluetoothHost>(BLUETOOTH_HOST); 993 CHECK_AND_RETURN_LOG_RET(proxy != nullptr, INVALID_VALUE, "proxy is nullptr"); 994 995 return proxy->GetBondableMode(transport); 996} 997 998bool BluetoothHost::SetBondableMode(int transport, int mode) 999{ 1000 HILOGD("transport: %{public}d, mode: %{public}d", transport, mode); 1001 sptr<IBluetoothHost> proxy = GetRemoteProxy<IBluetoothHost>(BLUETOOTH_HOST); 1002 CHECK_AND_RETURN_LOG_RET(proxy != nullptr, false, "proxy is nullptr"); 1003 1004 return proxy->SetBondableMode(transport, mode); 1005} 1006 1007int BluetoothHost::StartBtDiscovery() 1008{ 1009 HILOGD("enter"); 1010 CHECK_AND_RETURN_LOG_RET(IS_BT_ENABLED(), BT_ERR_INVALID_STATE, "bluetooth is off."); 1011 1012 sptr<IBluetoothHost> proxy = GetRemoteProxy<IBluetoothHost>(BLUETOOTH_HOST); 1013 CHECK_AND_RETURN_LOG_RET(proxy != nullptr, BT_ERR_UNAVAILABLE_PROXY, "proxy is nullptr"); 1014 1015 return proxy->StartBtDiscovery(); 1016} 1017 1018int BluetoothHost::CancelBtDiscovery() 1019{ 1020 HILOGD("enter"); 1021 CHECK_AND_RETURN_LOG_RET(IS_BT_ENABLED(), BT_ERR_INVALID_STATE, "bluetooth is off."); 1022 1023 sptr<IBluetoothHost> proxy = GetRemoteProxy<IBluetoothHost>(BLUETOOTH_HOST); 1024 CHECK_AND_RETURN_LOG_RET(proxy != nullptr, BT_ERR_UNAVAILABLE_PROXY, "proxy is nullptr"); 1025 1026 return proxy->CancelBtDiscovery(); 1027} 1028 1029int32_t BluetoothHost::IsBtDiscovering(bool &isDiscovering, int transport) const 1030{ 1031 HILOGI("transport: %{public}d", transport); 1032 CHECK_AND_RETURN_LOG_RET(IS_BT_ENABLED(), BT_ERR_INVALID_STATE, "bluetooth is off."); 1033 1034 sptr<IBluetoothHost> proxy = GetRemoteProxy<IBluetoothHost>(BLUETOOTH_HOST); 1035 CHECK_AND_RETURN_LOG_RET(proxy != nullptr, BT_ERR_INVALID_STATE, "proxy is nullptr"); 1036 1037 return proxy->IsBtDiscovering(isDiscovering, transport); 1038} 1039 1040long BluetoothHost::GetBtDiscoveryEndMillis() const 1041{ 1042 HILOGD("enter"); 1043 CHECK_AND_RETURN_LOG_RET(IS_BT_ENABLED(), 0, "bluetooth is off."); 1044 1045 sptr<IBluetoothHost> proxy = GetRemoteProxy<IBluetoothHost>(BLUETOOTH_HOST); 1046 CHECK_AND_RETURN_LOG_RET(proxy != nullptr, 0, "proxy is nullptr"); 1047 1048 return proxy->GetBtDiscoveryEndMillis(); 1049} 1050 1051int32_t BluetoothHost::GetPairedDevices(int transport, std::vector<BluetoothRemoteDevice> &pairedDevices) const 1052{ 1053 HILOGI("transport: %{public}d", transport); 1054 CHECK_AND_RETURN_LOG_RET(IS_BT_ENABLED(), BT_ERR_INVALID_STATE, "bluetooth is off."); 1055 1056 sptr<IBluetoothHost> proxy = GetRemoteProxy<IBluetoothHost>(BLUETOOTH_HOST); 1057 CHECK_AND_RETURN_LOG_RET(proxy != nullptr, BT_ERR_UNAVAILABLE_PROXY, "proxy is nullptr"); 1058 1059 std::vector<BluetoothRawAddress> pairedAddr; 1060 int32_t ret = proxy->GetPairedDevices(pairedAddr); 1061 1062 for (auto it = pairedAddr.begin(); it != pairedAddr.end(); it++) { 1063 BluetoothRemoteDevice device((*it).GetAddress(), transport); 1064 pairedDevices.emplace_back(device); 1065 } 1066 return ret; 1067} 1068 1069int32_t BluetoothHost::RemovePair(const BluetoothRemoteDevice &device) 1070{ 1071 HILOGI("device: %{public}s", GET_ENCRYPT_ADDR(device)); 1072 CHECK_AND_RETURN_LOG_RET(device.IsValidBluetoothRemoteDevice(), BT_ERR_INTERNAL_ERROR, "Invalid remote device."); 1073 1074 sptr<IBluetoothHost> proxy = GetRemoteProxy<IBluetoothHost>(BLUETOOTH_HOST); 1075 CHECK_AND_RETURN_LOG_RET(proxy != nullptr, BT_ERR_UNAVAILABLE_PROXY, "proxy is nullptr"); 1076 1077 sptr<BluetoothRawAddress> rawAddrSptr = new BluetoothRawAddress(device.GetDeviceAddr()); 1078 return proxy->RemovePair(device.GetTransportType(), rawAddrSptr); 1079} 1080 1081bool BluetoothHost::RemoveAllPairs() 1082{ 1083 HILOGD("enter"); 1084 sptr<IBluetoothHost> proxy = GetRemoteProxy<IBluetoothHost>(BLUETOOTH_HOST); 1085 CHECK_AND_RETURN_LOG_RET(proxy != nullptr, false, "proxy is nullptr"); 1086 1087 return proxy->RemoveAllPairs(); 1088} 1089 1090void BluetoothHost::RegisterRemoteDeviceObserver(std::shared_ptr<BluetoothRemoteDeviceObserver> observer) 1091{ 1092 HILOGD("enter"); 1093 CHECK_AND_RETURN_LOG(pimpl != nullptr, "pimpl is null."); 1094 1095 pimpl->remoteObservers_.Register(observer); 1096} 1097 1098void BluetoothHost::DeregisterRemoteDeviceObserver(std::shared_ptr<BluetoothRemoteDeviceObserver> observer) 1099{ 1100 HILOGD("enter"); 1101 CHECK_AND_RETURN_LOG(pimpl != nullptr, "pimpl is null."); 1102 1103 pimpl->remoteObservers_.Deregister(observer); 1104} 1105 1106int BluetoothHost::GetBleMaxAdvertisingDataLength() const 1107{ 1108 sptr<IBluetoothHost> proxy = GetRemoteProxy<IBluetoothHost>(BLUETOOTH_HOST); 1109 CHECK_AND_RETURN_LOG_RET(proxy != nullptr, INVALID_VALUE, "proxy is nullptr"); 1110 1111 return proxy->GetBleMaxAdvertisingDataLength(); 1112} 1113 1114void BluetoothHost::LoadSystemAbilitySuccess(const sptr<IRemoteObject> &remoteObject) 1115{ 1116 CHECK_AND_RETURN_LOG(pimpl, "pimpl is null."); 1117 1118 pimpl->LoadSystemAbilitySuccess(remoteObject); 1119} 1120 1121void BluetoothHost::LoadSystemAbilityFail() 1122{ 1123 CHECK_AND_RETURN_LOG(pimpl, "pimpl is null."); 1124 1125 pimpl->LoadSystemAbilityFail(); 1126} 1127 1128int32_t BluetoothHost::GetLocalProfileUuids(std::vector<std::string> &uuids) 1129{ 1130 CHECK_AND_RETURN_LOG_RET(IS_BT_ENABLED(), BT_ERR_INTERNAL_ERROR, "bluetooth is off."); 1131 1132 sptr<IBluetoothHost> proxy = GetRemoteProxy<IBluetoothHost>(BLUETOOTH_HOST); 1133 CHECK_AND_RETURN_LOG_RET(proxy != nullptr, BT_ERR_UNAVAILABLE_PROXY, "proxy is nullptr"); 1134 1135 return proxy->GetLocalProfileUuids(uuids); 1136} 1137 1138int BluetoothHost::SetFastScan(bool isEnable) 1139{ 1140 HILOGI("isEnable: %{public}d", isEnable); 1141 CHECK_AND_RETURN_LOG_RET(IS_BT_ENABLED(), BT_ERR_INVALID_STATE, "bluetooth is off."); 1142 1143 sptr<IBluetoothHost> proxy = GetRemoteProxy<IBluetoothHost>(BLUETOOTH_HOST); 1144 CHECK_AND_RETURN_LOG_RET(proxy != nullptr, BT_ERR_UNAVAILABLE_PROXY, "proxy is nullptr"); 1145 1146 return proxy->SetFastScan(isEnable); 1147} 1148 1149int BluetoothHost::GetRandomAddress(const std::string &realAddr, std::string &randomAddr) const 1150{ 1151 randomAddr = realAddr; 1152 return BT_NO_ERROR; 1153} 1154 1155int BluetoothHost::ConnectAllowedProfiles(const std::string &remoteAddr) const 1156{ 1157 HILOGI("enter"); 1158 CHECK_AND_RETURN_LOG_RET(IS_BT_ENABLED(), BT_ERR_INVALID_STATE, "bluetooth is off."); 1159 1160 sptr<IBluetoothHost> proxy = GetRemoteProxy<IBluetoothHost>(BLUETOOTH_HOST); 1161 CHECK_AND_RETURN_LOG_RET(proxy != nullptr, BT_ERR_UNAVAILABLE_PROXY, "pimpl or bluetooth host is nullptr"); 1162 1163 return proxy->ConnectAllowedProfiles(remoteAddr); 1164} 1165 1166int BluetoothHost::DisconnectAllowedProfiles(const std::string &remoteAddr) const 1167{ 1168 HILOGI("enter"); 1169 CHECK_AND_RETURN_LOG_RET(IS_BT_ENABLED(), BT_ERR_INVALID_STATE, "bluetooth is off."); 1170 1171 sptr<IBluetoothHost> proxy = GetRemoteProxy<IBluetoothHost>(BLUETOOTH_HOST); 1172 CHECK_AND_RETURN_LOG_RET(proxy != nullptr, BT_ERR_UNAVAILABLE_PROXY, "pimpl or bluetooth host is nullptr"); 1173 1174 return proxy->DisconnectAllowedProfiles(remoteAddr); 1175} 1176 1177void BluetoothHost::RegisterBtResourceManagerObserver(std::shared_ptr<BluetoothResourceManagerObserver> observer) 1178{ 1179 CHECK_AND_RETURN_LOG(pimpl != nullptr, "pimpl is null."); 1180 1181 pimpl->resourceManagerObservers_.Register(observer); 1182} 1183 1184void BluetoothHost::DeregisterBtResourceManagerObserver(std::shared_ptr<BluetoothResourceManagerObserver> observer) 1185{ 1186 CHECK_AND_RETURN_LOG(pimpl != nullptr, "pimpl is null."); 1187 1188 pimpl->resourceManagerObservers_.Deregister(observer); 1189} 1190 1191int BluetoothHost::SetFastScanLevel(int level) 1192{ 1193 CHECK_AND_RETURN_LOG_RET(IS_BT_ENABLED(), BT_ERR_INVALID_STATE, "bluetooth is off."); 1194 sptr<IBluetoothHost> proxy = GetRemoteProxy<IBluetoothHost>(BLUETOOTH_HOST); 1195 CHECK_AND_RETURN_LOG_RET(proxy != nullptr, BT_ERR_UNAVAILABLE_PROXY, "pimpl or bluetooth host is nullptr"); 1196 return proxy->SetFastScanLevel(level); 1197} 1198 1199bool BluetoothHost::IsBtProhibitedByEdm(void) 1200{ 1201 constexpr const char* BLUETOOTH_EDM_KEY = "persist.edm.prohibit_bluetooth"; 1202 constexpr const uint32_t PARAM_TRUE_LEN = 4; // "true" 4bytes 1203 constexpr const uint32_t PARAM_FALSE_LEN = 5; // "false" 5bytes 1204 constexpr const char* PARAM_TRUE = "true"; 1205 constexpr const char* PARAM_FALSE = "false"; 1206 1207 char result[PARAM_FALSE_LEN + 1] = {0}; 1208 // Returns the number of bytes of the system parameter if the operation is successful. 1209 int len = GetParameter(BLUETOOTH_EDM_KEY, PARAM_FALSE, result, PARAM_FALSE_LEN + 1); 1210 CHECK_AND_RETURN_LOG_RET(len == PARAM_FALSE_LEN || len == PARAM_TRUE_LEN, false, "GetParameter len is invalid."); 1211 1212 if (strncmp(result, PARAM_TRUE, PARAM_TRUE_LEN) == 0) { 1213 HILOGW("bluetooth is prohibited by EDM. You won't be able to turn on bluetooth !"); 1214 return true; 1215 } 1216 return false; 1217} 1218 1219static bool IsBluetoothSystemAbilityOn(void) 1220{ 1221 auto samgrProxy = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager(); 1222 CHECK_AND_RETURN_LOG_RET(samgrProxy != nullptr, false, "samgrProxy is nullptr"); 1223 auto object = samgrProxy->CheckSystemAbility(BLUETOOTH_HOST_SYS_ABILITY_ID); 1224 return object != nullptr; 1225} 1226 1227void BluetoothHost::OnRemoveBluetoothSystemAbility() 1228{ 1229 // Notify the upper layer that bluetooth is disabled. 1230 bool isBluetoothSystemAbilityOn = IsBluetoothSystemAbilityOn(); 1231 if (isBluetoothSystemAbilityOn) { 1232 HILOGW("Bluetooth SA is started, the hap application may be freezed by rss"); 1233 } 1234 bool isNeedNotifyBluetoothOffState = pimpl->observerImp_ && pimpl->bleObserverImp_ && !isBluetoothSystemAbilityOn; 1235 if (isNeedNotifyBluetoothOffState) { 1236 HILOGD("bluetooth_servi died and send state off to app"); 1237 pimpl->observerImp_->OnStateChanged(BTTransport::ADAPTER_BREDR, BTStateID::STATE_TURN_OFF); 1238 pimpl->bleObserverImp_->OnStateChanged(BTTransport::ADAPTER_BLE, BTStateID::STATE_TURN_OFF); 1239 } 1240 if (pimpl->isFactoryReseting_.load()) { 1241 pimpl->EnableBluetoothAfterFactoryReset(); 1242 } 1243 std::lock_guard<std::mutex> lock(pimpl->switchModuleMutex_); 1244 if (pimpl->switchModule_) { 1245 pimpl->switchModule_->ProcessBluetoothSwitchEvent(BluetoothSwitchEvent::BLUETOOTH_OFF); 1246 } 1247} 1248 1249void BluetoothHost::Close(void) 1250{ 1251 std::lock_guard<std::mutex> lock(pimpl->switchModuleMutex_); 1252 pimpl->switchModule_ = nullptr; 1253} 1254} // namespace Bluetooth 1255} // namespace OHOS 1256