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 <thread>
17
18 #include "bluetooth_a2dp_sink_server.h"
19 #include "bluetooth_a2dp_source_server.h"
20 #include "bluetooth_avrcp_ct_server.h"
21 #include "bluetooth_avrcp_tg_server.h"
22 #include "bluetooth_ble_advertiser_server.h"
23 #include "bluetooth_ble_central_manager_server.h"
24 #include "bluetooth_errorcode.h"
25 #include "bluetooth_gatt_client_server.h"
26 #include "bluetooth_gatt_server_server.h"
27 #include "bluetooth_hfp_ag_server.h"
28 #include "bluetooth_hfp_hf_server.h"
29 #include "bluetooth_hid_host_server.h"
30 #include "bluetooth_host_dumper.h"
31 #include "bluetooth_log.h"
32 #include "bluetooth_pan_server.h"
33 #include "bluetooth_socket_server.h"
34 #include "bluetooth_utils_server.h"
35 #include "file_ex.h"
36 #include "hisysevent.h"
37 #include "interface_adapter_manager.h"
38 #include "permission_utils.h"
39 #include "bluetooth_host_server.h"
40
41
42 #include "interface_adapter_ble.h"
43 #include "interface_adapter_classic.h"
44 #include "interface_profile_manager.h"
45 #include "ipc_skeleton.h"
46 #include "raw_address.h"
47 #include "remote_observer_list.h"
48 #include "string_ex.h"
49 #include "system_ability_definition.h"
50 #include "ipc_types.h"
51 #include "safe_map.h"
52
53 namespace OHOS {
54 namespace Bluetooth {
55 using namespace OHOS::bluetooth;
56 struct BluetoothHostServer::impl {
57 impl();
58 ~impl();
59 void Init();
60 void Clear();
61
62 /// sys state observer
63 class SystemStateObserver;
64 std::unique_ptr<SystemStateObserver> systemStateObserver_ = nullptr;
65
66 /// adapter state observer
67 class AdapterStateObserver;
68 std::unique_ptr<AdapterStateObserver> observerImp_ = nullptr;
69
70 /// classic observer
71 class AdapterClassicObserver;
72 std::unique_ptr<AdapterClassicObserver> classicObserverImp_ = nullptr;
73
74 /// classic remote device observer
75 class ClassicRemoteDeviceObserver;
76 std::unique_ptr<ClassicRemoteDeviceObserver> remoteObserverImp_ = nullptr;
77
78 /// ble observer
79 class AdapterBleObserver;
80 std::unique_ptr<AdapterBleObserver> bleObserverImp_ = nullptr;
81
82 /// ble remote device observer
83 class BlePeripheralCallback;
84 std::unique_ptr<BlePeripheralCallback> bleRemoteObserverImp_ = nullptr;
85
86 /// user regist observers
87 RemoteObserverList<IBluetoothHostObserver> observers_;
88 RemoteObserverList<IBluetoothHostObserver> bleObservers_;
89 SafeMap<sptr<IRemoteObject>, uint32_t> observersToken_;
90 SafeMap<sptr<IRemoteObject>, uint32_t> bleObserversToken_;
91 SafeMap<sptr<IRemoteObject>, int32_t> observersPid_;
92 SafeMap<sptr<IRemoteObject>, int32_t> bleObserversPid_;
93
94 /// user regist remote observers
95 RemoteObserverList<IBluetoothRemoteDeviceObserver> remoteObservers_;
96 SafeMap<sptr<IRemoteObject>, uint32_t> remoteObserversToken_;
97 SafeMap<sptr<IRemoteObject>, int32_t> remoteObserversPid_;
98
99 /// user regist remote observers
100 RemoteObserverList<IBluetoothBlePeripheralObserver> bleRemoteObservers_;
101 SafeMap<sptr<IRemoteObject>, uint32_t> bleRemoteObserversToken_;
102
103 SafeMap<std::string, sptr<IRemoteObject>> servers_;
104 SafeMap<std::string, sptr<IRemoteObject>> bleServers_;
105
106 std::vector<sptr<IBluetoothHostObserver>> hostObservers_;
107 std::mutex hostObserversMutex;
108 std::vector<sptr<IBluetoothRemoteDeviceObserver>> remoteDeviceObservers_;
109 std::mutex remoteDeviceObserversMutex;
110 std::vector<sptr<IBluetoothHostObserver>> bleAdapterObservers_;
111 std::mutex bleAdapterObserversMutex;
112 std::vector<sptr<IBluetoothBlePeripheralObserver>> blePeripheralObservers_;
113 std::mutex blePeripheralObserversMutex;
114
115 private:
116 void createServers();
117 };
118
119 class BluetoothHostServer::impl::SystemStateObserver : public ISystemStateObserver {
120 public:
SystemStateObserver(BluetoothHostServer::impl * impl)121 SystemStateObserver(BluetoothHostServer::impl *impl) : impl_(impl) {};
122 ~SystemStateObserver() override = default;
123
OnSystemStateChange(const BTSystemState state)124 void OnSystemStateChange(const BTSystemState state) override
125 {
126 if (!impl_) {
127 HILOGI("failed: impl_ is null");
128 return;
129 }
130 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
131 auto bleService = IAdapterManager::GetInstance()->GetBleAdapterInterface();
132 switch (state) {
133 case BTSystemState::ON:
134 /// update service ptr
135 if (classicService) {
136 classicService->RegisterClassicAdapterObserver(
137 *(IAdapterClassicObserver *)impl_->classicObserverImp_.get());
138 classicService->RegisterRemoteDeviceObserver(
139 *(IClassicRemoteDeviceObserver *)impl_->remoteObserverImp_.get());
140 }
141 if (bleService) {
142 bleService->RegisterBleAdapterObserver(
143 *(IAdapterBleObserver *)impl_->bleObserverImp_.get());
144 bleService->RegisterBlePeripheralCallback(
145 *(IBlePeripheralCallback *)impl_->bleRemoteObserverImp_.get());
146 }
147 break;
148
149 case BTSystemState::OFF:
150 if (classicService) {
151 classicService->DeregisterClassicAdapterObserver(
152 *(IAdapterClassicObserver *)impl_->classicObserverImp_.get());
153 classicService->DeregisterRemoteDeviceObserver(
154 *(IClassicRemoteDeviceObserver *)impl_->remoteObserverImp_.get());
155 classicService = nullptr;
156 }
157 if (bleService) {
158 bleService->DeregisterBleAdapterObserver(
159 *(IAdapterBleObserver *)impl_->bleObserverImp_.get());
160 bleService->DeregisterBlePeripheralCallback(
161 *(IBlePeripheralCallback *)impl_->bleRemoteObserverImp_.get());
162 bleService = nullptr;
163 }
164 break;
165 default:
166 break;
167 }
168 }
169
170 private:
171 BluetoothHostServer::impl *impl_ = nullptr;
172 };
173
174 class BluetoothHostServer::impl::AdapterStateObserver : public IAdapterStateObserver {
175 public:
AdapterStateObserver(BluetoothHostServer::impl * impl)176 AdapterStateObserver(BluetoothHostServer::impl *impl) : impl_(impl){};
177 ~AdapterStateObserver() override = default;
178
OnStateChangeV2(BTTransport transport,BTStateID state,sptr<IBluetoothHostObserver> & observer)179 static void OnStateChangeV2(BTTransport transport, BTStateID state, sptr<IBluetoothHostObserver> &observer)
180 {
181 if (transport == BTTransport::ADAPTER_BREDR && state == BTStateID::STATE_TURN_ON) {
182 observer->OnBluetoothStateChanged(BluetoothSwitchState::STATE_ON);
183 }
184 if (transport == BTTransport::ADAPTER_BLE && state == BTStateID::STATE_TURN_OFF) {
185 observer->OnBluetoothStateChanged(BluetoothSwitchState::STATE_OFF);
186 }
187 }
188
OnStateChange(const BTTransport transport,const BTStateID state)189 void OnStateChange(const BTTransport transport, const BTStateID state) override
190 {
191 if (!impl_) {
192 return;
193 }
194 if (transport == BTTransport::ADAPTER_BREDR) {
195 impl_->observers_.ForEach([this, transport, state](sptr<IBluetoothHostObserver> observer) {
196 int32_t pid = this->impl_->observersPid_.ReadVal(observer->AsObject());
197 if (BluetoothBleCentralManagerServer::IsResourceScheduleControlApp(pid)) {
198 HILOGI("pid:%{public}d is proxy pid, not callback.", pid);
199 return;
200 }
201 uint32_t tokenId = this->impl_->observersToken_.ReadVal(observer->AsObject());
202 if (PermissionUtils::VerifyUseBluetoothPermission(tokenId) == PERMISSION_DENIED) {
203 HILOGE("false, check permission failed");
204 } else {
205 observer->OnStateChanged(transport, state);
206 OnStateChangeV2(transport, state, observer);
207 }
208 });
209 if (state == BTStateID::STATE_TURN_ON || state == BTStateID::STATE_TURN_OFF) {
210 int32_t pid = IPCSkeleton::GetCallingPid();
211 int32_t uid = IPCSkeleton::GetCallingUid();
212 HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::BT_SERVICE, "BR_SWITCH_STATE",
213 HiviewDFX::HiSysEvent::EventType::STATISTIC, "PID", pid, "UID", uid, "STATE", state);
214 }
215 } else if (transport == BTTransport::ADAPTER_BLE) {
216 impl_->bleObservers_.ForEach([this, transport, state](sptr<IBluetoothHostObserver> observer) {
217 int32_t pid = this->impl_->bleObserversPid_.ReadVal(observer->AsObject());
218 if (BluetoothBleCentralManagerServer::IsResourceScheduleControlApp(pid)) {
219 HILOGI("pid:%{public}d is proxy pid, not callback.", pid);
220 return;
221 }
222 uint32_t tokenId = this->impl_->bleObserversToken_.ReadVal(observer->AsObject());
223 if (PermissionUtils::VerifyUseBluetoothPermission(tokenId) == PERMISSION_DENIED) {
224 HILOGE("false, check permission failed");
225 } else {
226 observer->OnStateChanged(transport, state);
227 OnStateChangeV2(transport, state, observer);
228 }
229 });
230 if (state == BTStateID::STATE_TURN_ON || state == BTStateID::STATE_TURN_OFF) {
231 int32_t pid = IPCSkeleton::GetCallingPid();
232 int32_t uid = IPCSkeleton::GetCallingUid();
233 HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::BT_SERVICE, "BLE_SWITCH_STATE",
234 HiviewDFX::HiSysEvent::EventType::STATISTIC, "PID", pid, "UID", uid, "STATE", state);
235 }
236 }
237 }
238
239 private:
240 BluetoothHostServer::impl *impl_ = nullptr;
241 BLUETOOTH_DISALLOW_COPY_AND_ASSIGN(AdapterStateObserver);
242 };
243 class BluetoothHostServer::impl::AdapterClassicObserver : public IAdapterClassicObserver {
244 public:
AdapterClassicObserver(BluetoothHostServer::impl * impl)245 AdapterClassicObserver(BluetoothHostServer::impl *impl) : impl_(impl) {};
246 ~AdapterClassicObserver() override = default;
247
OnDiscoveryStateChanged(const int32_t status)248 void OnDiscoveryStateChanged(const int32_t status) override
249 {
250 HILOGI("status: %{public}d", status);
251 impl_->observers_.ForEach([this, status](sptr<IBluetoothHostObserver> observer) {
252 int32_t pid = this->impl_->observersPid_.ReadVal(observer->AsObject());
253 if (BluetoothBleCentralManagerServer::IsResourceScheduleControlApp(pid)) {
254 HILOGI("pid:%{public}d is proxy pid, not callback.", pid);
255 return;
256 }
257 observer->OnDiscoveryStateChanged(static_cast<int32_t>(status));
258 });
259 if (status == DISCOVERY_STARTED || status == DISCOVERY_STOPED) {
260 int32_t pid = IPCSkeleton::GetCallingPid();
261 int32_t uid = IPCSkeleton::GetCallingUid();
262 HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::BT_SERVICE, "DISCOVERY_STATE",
263 HiviewDFX::HiSysEvent::EventType::STATISTIC, "PID", pid, "UID", uid, "STATE", status);
264 }
265 }
266
OnDiscoveryResult(const RawAddress & device,int rssi,const std::string deviceName,int deviceClass)267 void OnDiscoveryResult(
268 const RawAddress &device, int rssi, const std::string deviceName, int deviceClass) override
269 {
270 HILOGI("device: %{public}s, rssi: %{public}d, deviceName: %{pubiic}s, deviceClass: %{public}d",
271 GET_ENCRYPT_ADDR(device), rssi, deviceName.c_str(), deviceClass);
272 impl_->observers_.ForEach([this, device, rssi, deviceName, deviceClass](IBluetoothHostObserver *observer) {
273 int32_t pid = this->impl_->observersPid_.ReadVal(observer->AsObject());
274 if (BluetoothBleCentralManagerServer::IsResourceScheduleControlApp(pid)) {
275 HILOGI("pid:%{public}d is proxy pid, not callback.", pid);
276 return;
277 }
278 uint32_t tokenId = this->impl_->observersToken_.ReadVal(observer->AsObject());
279 if (PermissionUtils::VerifyDiscoverBluetoothPermission(tokenId) == PERMISSION_DENIED) {
280 HILOGE("OnDiscoveryResult() false, check permission failed");
281 } else {
282 observer->OnDiscoveryResult(device, rssi, deviceName, deviceClass);
283 }
284 });
285 }
286
OnPairRequested(const BTTransport transport,const RawAddress & device)287 void OnPairRequested(const BTTransport transport, const RawAddress &device) override
288 {
289 HILOGI("device: %{public}s", GET_ENCRYPT_ADDR(device));
290 impl_->observers_.ForEach(
291 [transport, device](IBluetoothHostObserver *observer) { observer->OnPairRequested(transport, device); });
292 }
293
OnPairConfirmed(const BTTransport transport,const RawAddress & device,int32_t reqType,int32_t number)294 void OnPairConfirmed(
295 const BTTransport transport, const RawAddress &device, int32_t reqType, int32_t number) override
296 {
297 HILOGI("device: %{public}s, reqType: %{public}d, number: %{public}d",
298 GET_ENCRYPT_ADDR(device), reqType, number);
299 impl_->observers_.ForEach([this, transport, device, reqType, number](IBluetoothHostObserver *observer) {
300 uint32_t tokenId = this->impl_->observersToken_.ReadVal(observer->AsObject());
301 if (PermissionUtils::VerifyUseBluetoothPermission(tokenId) == PERMISSION_DENIED) {
302 HILOGE("false, check permission failed");
303 } else {
304 observer->OnPairConfirmed(transport, device, reqType, number);
305 }
306 });
307 }
308
OnScanModeChanged(int32_t mode)309 void OnScanModeChanged(int32_t mode) override
310 {
311 HILOGI("mode: %{public}d", mode);
312 impl_->observers_.ForEach([mode](IBluetoothHostObserver *observer) { observer->OnScanModeChanged(mode); });
313 }
314
OnDeviceNameChanged(const std::string & deviceName)315 void OnDeviceNameChanged(const std::string &deviceName) override
316 {
317 HILOGI("deviceName: %{public}s", deviceName.c_str());
318 impl_->observers_.ForEach(
319 [deviceName](IBluetoothHostObserver *observer) { observer->OnDeviceNameChanged(deviceName); });
320 }
321
OnDeviceAddrChanged(const std::string & address)322 void OnDeviceAddrChanged(const std::string &address) override
323 {
324 HILOGI("address: %{public}s", GetEncryptAddr(address).c_str());
325 impl_->observers_.ForEach(
326 [address](IBluetoothHostObserver *observer) { observer->OnDeviceAddrChanged(address); });
327 }
328
329 private:
330 BluetoothHostServer::impl *impl_ = nullptr;
331 BLUETOOTH_DISALLOW_COPY_AND_ASSIGN(AdapterClassicObserver);
332 };
333 class BluetoothHostServer::impl::ClassicRemoteDeviceObserver : public IClassicRemoteDeviceObserver {
334 public:
ClassicRemoteDeviceObserver(BluetoothHostServer::impl * impl)335 ClassicRemoteDeviceObserver(BluetoothHostServer::impl *impl) : impl_(impl) {};
336 ~ClassicRemoteDeviceObserver() override = default;
337
OnAclStateChanged(const RawAddress & device,int state,unsigned int reason)338 void OnAclStateChanged(const RawAddress &device, int state, unsigned int reason) override
339 {
340 return;
341 }
342
OnPairStatusChanged(const BTTransport transport,const RawAddress & device,const int32_t status)343 void OnPairStatusChanged(const BTTransport transport, const RawAddress &device, const int32_t status) override
344 {
345 HILOGI("device: %{public}s, status: %{public}d", GET_ENCRYPT_ADDR(device), status);
346 impl_->remoteObservers_.ForEach([this, transport, device, status](IBluetoothRemoteDeviceObserver *observer) {
347 int32_t pid = this->impl_->remoteObserversPid_.ReadVal(observer->AsObject());
348 if (BluetoothBleCentralManagerServer::IsResourceScheduleControlApp(pid)) {
349 HILOGI("pid:%{public}d is proxy pid, not callback.", pid);
350 return;
351 }
352 uint32_t tokenId = this->impl_->remoteObserversToken_.ReadVal(observer->AsObject());
353 if (PermissionUtils::VerifyUseBluetoothPermission(tokenId) == PERMISSION_DENIED) {
354 HILOGE("false, check permission failed");
355 } else {
356 observer->OnPairStatusChanged(transport, device, status, PAIR_COMMON_BOND_CAUSE);
357 }
358 });
359 }
360
OnRemoteUuidChanged(const RawAddress & device,const std::vector<Uuid> & uuids)361 void OnRemoteUuidChanged(const RawAddress &device, const std::vector<Uuid> &uuids) override
362 {
363 HILOGI("device: %{public}s", GET_ENCRYPT_ADDR(device));
364 std::vector<bluetooth::Uuid> btUuids;
365 for (const auto &val : uuids) {
366 btUuids.push_back(val);
367 }
368 impl_->remoteObservers_.ForEach([this, device, btUuids](IBluetoothRemoteDeviceObserver *observer) {
369 int32_t pid = this->impl_->remoteObserversPid_.ReadVal(observer->AsObject());
370 if (BluetoothBleCentralManagerServer::IsResourceScheduleControlApp(pid)) {
371 HILOGI("pid:%{public}d is proxy pid, not callback.", pid);
372 return;
373 }
374 observer->OnRemoteUuidChanged(device, btUuids);
375 });
376 }
377
OnRemoteNameChanged(const RawAddress & device,const std::string & deviceName)378 void OnRemoteNameChanged(const RawAddress &device, const std::string &deviceName) override
379 {
380 HILOGI("device: %{public}s, deviceName: %{public}s", GET_ENCRYPT_ADDR(device), deviceName.c_str());
381 impl_->remoteObservers_.ForEach([this, device, deviceName](IBluetoothRemoteDeviceObserver *observer) {
382 int32_t pid = this->impl_->remoteObserversPid_.ReadVal(observer->AsObject());
383 if (BluetoothBleCentralManagerServer::IsResourceScheduleControlApp(pid)) {
384 HILOGI("pid:%{public}d is proxy pid, not callback.", pid);
385 return;
386 }
387 observer->OnRemoteNameChanged(device, deviceName);
388 });
389 }
390
OnRemoteAliasChanged(const RawAddress & device,const std::string & alias)391 void OnRemoteAliasChanged(const RawAddress &device, const std::string &alias) override
392 {
393 HILOGI("device: %{public}s, alias: %{public}s", GET_ENCRYPT_ADDR(device), alias.c_str());
394 impl_->remoteObservers_.ForEach([device, alias](IBluetoothRemoteDeviceObserver *observer) {
395 observer->OnRemoteAliasChanged(device, alias);
396 });
397 }
398
OnRemoteCodChanged(const RawAddress & device,int32_t cod)399 void OnRemoteCodChanged(const RawAddress &device, int32_t cod) override
400 {
401 HILOGI("device: %{public}s, cod: %{public}d", GET_ENCRYPT_ADDR(device), cod);
402 impl_->remoteObservers_.ForEach([this, device, cod](IBluetoothRemoteDeviceObserver *observer) {
403 int32_t pid = this->impl_->remoteObserversPid_.ReadVal(observer->AsObject());
404 if (BluetoothBleCentralManagerServer::IsResourceScheduleControlApp(pid)) {
405 HILOGI("pid:%{public}d is proxy pid, not callback.", pid);
406 return;
407 }
408 observer->OnRemoteCodChanged(device, cod);
409 });
410 }
411
412 private:
413 BluetoothHostServer::impl *impl_ = nullptr;
414 BLUETOOTH_DISALLOW_COPY_AND_ASSIGN(ClassicRemoteDeviceObserver);
415 };
416
417 class BluetoothHostServer::impl::AdapterBleObserver : public IAdapterBleObserver {
418 public:
AdapterBleObserver(BluetoothHostServer::impl * impl)419 AdapterBleObserver(BluetoothHostServer::impl *impl) : impl_(impl){};
420 ~AdapterBleObserver() override = default;
421
OnDiscoveryStateChanged(const int32_t status)422 void OnDiscoveryStateChanged(const int32_t status) override
423 {
424 HILOGI("status: %{public}d", status);
425 impl_->bleObservers_.ForEach([this, status](sptr<IBluetoothHostObserver> observer) {
426 int32_t pid = this->impl_->bleObserversPid_.ReadVal(observer->AsObject());
427 if (BluetoothBleCentralManagerServer::IsResourceScheduleControlApp(pid)) {
428 HILOGI("pid:%{public}d is proxy pid, not callback.", pid);
429 return;
430 }
431 observer->OnDiscoveryStateChanged(static_cast<int32_t>(status));
432 });
433 }
434
OnDiscoveryResult(const RawAddress & device,int rssi,const std::string deviceName,int deviceClass)435 void OnDiscoveryResult(
436 const RawAddress &device, int rssi, const std::string deviceName, int deviceClass) override
437 {
438 HILOGI("device: %{public}s, rssi: %{public}d, deviceName: %{pubiic}s, deviceClass: %{public}d",
439 GET_ENCRYPT_ADDR(device), rssi, deviceName.c_str(), deviceClass);
440 impl_->bleObservers_.ForEach([this, device, rssi, deviceName, deviceClass](IBluetoothHostObserver *observer) {
441 int32_t pid = this->impl_->bleObserversPid_.ReadVal(observer->AsObject());
442 if (BluetoothBleCentralManagerServer::IsResourceScheduleControlApp(pid)) {
443 HILOGI("pid:%{public}d is proxy pid, not callback.", pid);
444 return;
445 }
446 uint32_t tokenId = this->impl_->bleObserversToken_.ReadVal(observer->AsObject());
447 if (PermissionUtils::VerifyDiscoverBluetoothPermission(tokenId) == PERMISSION_DENIED) {
448 HILOGE("false, check permission failed");
449 } else {
450 observer->OnDiscoveryResult(device, rssi, deviceName, deviceClass);
451 }
452 });
453 }
454
OnPairRequested(const BTTransport transport,const RawAddress & device)455 void OnPairRequested(const BTTransport transport, const RawAddress &device) override
456 {
457 HILOGI("device: %{public}s", GET_ENCRYPT_ADDR(device));
458 impl_->bleObservers_.ForEach(
459 [transport, device](IBluetoothHostObserver *observer) { observer->OnPairRequested(transport, device); });
460 }
461
OnPairConfirmed(const BTTransport transport,const RawAddress & device,const int32_t reqType,const int32_t number)462 void OnPairConfirmed(
463 const BTTransport transport, const RawAddress &device, const int32_t reqType, const int32_t number) override
464 {
465 HILOGI("device: %{public}s, reqType: %{public}d, number: %{public}d",
466 GET_ENCRYPT_ADDR(device), reqType, number);
467 impl_->bleObservers_.ForEach([this, transport, device, reqType, number](IBluetoothHostObserver *observer) {
468 int32_t pid = this->impl_->bleObserversPid_.ReadVal(observer->AsObject());
469 if (BluetoothBleCentralManagerServer::IsResourceScheduleControlApp(pid)) {
470 HILOGI("pid:%{public}d is proxy pid, not callback.", pid);
471 return;
472 }
473 uint32_t tokenId = this->impl_->bleObserversToken_.ReadVal(observer->AsObject());
474 if (PermissionUtils::VerifyUseBluetoothPermission(tokenId) == PERMISSION_DENIED) {
475 HILOGE("OnPairConfirmed() false, check permission failed");
476 } else {
477 observer->OnPairConfirmed(transport, device, reqType, number);
478 }
479 });
480 }
481
OnScanModeChanged(const int32_t mode)482 void OnScanModeChanged(const int32_t mode) override
483 {
484 HILOGI("mode: %{public}d", mode);
485 impl_->bleObservers_.ForEach([mode](IBluetoothHostObserver *observer) { observer->OnScanModeChanged(mode); });
486 }
487
OnDeviceNameChanged(const std::string deviceName)488 void OnDeviceNameChanged(const std::string deviceName) override
489 {
490 HILOGI("deviceName: %{public}s", deviceName.c_str());
491 impl_->bleObservers_.ForEach(
492 [deviceName](IBluetoothHostObserver *observer) { observer->OnDeviceNameChanged(deviceName); });
493 }
494
OnDeviceAddrChanged(const std::string address)495 void OnDeviceAddrChanged(const std::string address) override
496 {
497 HILOGI("address: %{public}s", GetEncryptAddr(address).c_str());
498 impl_->bleObservers_.ForEach(
499 [address](IBluetoothHostObserver *observer) { observer->OnDeviceAddrChanged(address); });
500 }
501
OnAdvertisingStateChanged(const int32_t state)502 void OnAdvertisingStateChanged(const int32_t state) override
503 {}
504
505 private:
506 BluetoothHostServer::impl *impl_ = nullptr;
507 BLUETOOTH_DISALLOW_COPY_AND_ASSIGN(AdapterBleObserver);
508 };
509 class BluetoothHostServer::impl::BlePeripheralCallback : public IBlePeripheralCallback {
510 public:
BlePeripheralCallback(BluetoothHostServer::impl * impl)511 BlePeripheralCallback(BluetoothHostServer::impl *impl) : impl_(impl) {};
512 ~BlePeripheralCallback() override = default;
513
OnReadRemoteRssiEvent(const RawAddress & device,int32_t rssi,int32_t status)514 void OnReadRemoteRssiEvent(const RawAddress &device, int32_t rssi, int32_t status) override
515 {
516 HILOGI("device: %{public}s, rssi: %{public}d, status: %{public}d",
517 GET_ENCRYPT_ADDR(device), rssi, status);
518 impl_->bleRemoteObservers_.ForEach([device, rssi, status](IBluetoothBlePeripheralObserver *observer) {
519 observer->OnReadRemoteRssiEvent(device, rssi, status);
520 });
521 }
522
OnPairStatusChanged(const BTTransport transport,const RawAddress & device,int32_t status)523 void OnPairStatusChanged(const BTTransport transport, const RawAddress &device, int32_t status) override
524 {
525 HILOGI("device: %{public}s, status: %{public}d", GET_ENCRYPT_ADDR(device), status);
526 impl_->bleRemoteObservers_.ForEach([this, transport, device, status](
527 IBluetoothBlePeripheralObserver *observer) {
528 uint32_t tokenId = this->impl_->bleRemoteObserversToken_.ReadVal(observer->AsObject());
529 if (PermissionUtils::VerifyUseBluetoothPermission(tokenId) == PERMISSION_DENIED) {
530 HILOGE("false, check permission failed");
531 } else {
532 observer->OnPairStatusChanged(transport, device, status, PAIR_COMMON_BOND_CAUSE);
533 }
534 });
535 }
536
OnAclStateChanged(const RawAddress & device,int state,unsigned int reason)537 void OnAclStateChanged(const RawAddress &device, int state, unsigned int reason) override
538 {
539 return;
540 }
541
542 private:
543 BluetoothHostServer::impl *impl_ = nullptr;
544 BLUETOOTH_DISALLOW_COPY_AND_ASSIGN(BlePeripheralCallback);
545 };
546
547 std::mutex BluetoothHostServer::instanceLock;
548 sptr<BluetoothHostServer> BluetoothHostServer::instance;
549
550 const bool REGISTER_RESULT = SystemAbility::MakeAndRegisterAbility(BluetoothHostServer::GetInstance().GetRefPtr());
551
impl()552 BluetoothHostServer::impl::impl()
553 {
554 HILOGI("starts");
555 systemStateObserver_ = std::make_unique<SystemStateObserver>(this);
556 observerImp_ = std::make_unique<AdapterStateObserver>(this);
557 classicObserverImp_ = std::make_unique<AdapterClassicObserver>(this);
558 remoteObserverImp_ = std::make_unique<ClassicRemoteDeviceObserver>(this);
559 bleObserverImp_ = std::make_unique<AdapterBleObserver>(this);
560 bleRemoteObserverImp_ = std::make_unique<BlePeripheralCallback>(this);
561 }
562
~impl()563 BluetoothHostServer::impl::~impl()
564 {
565 HILOGI("starts");
566 }
567
Init()568 void BluetoothHostServer::impl::Init()
569 {
570 HILOGI("starts");
571 IAdapterManager::GetInstance()->RegisterSystemStateObserver(*systemStateObserver_);
572
573 IAdapterManager::GetInstance()->Start();
574 IAdapterManager::GetInstance()->RegisterStateObserver(*observerImp_);
575
576 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
577 auto bleService = IAdapterManager::GetInstance()->GetBleAdapterInterface();
578 if (classicService) {
579 classicService->RegisterClassicAdapterObserver(*classicObserverImp_.get());
580 classicService->RegisterRemoteDeviceObserver(*remoteObserverImp_.get());
581 }
582 if (bleService) {
583 bleService->RegisterBleAdapterObserver(*bleObserverImp_.get());
584 bleService->RegisterBlePeripheralCallback(*bleRemoteObserverImp_.get());
585 }
586
587 createServers();
588 }
589
Clear()590 void BluetoothHostServer::impl::Clear()
591 {
592 /// systerm state observer
593 IAdapterManager::GetInstance()->DeregisterSystemStateObserver(*systemStateObserver_);
594
595 /// adapter state observer
596 IAdapterManager::GetInstance()->Stop();
597 IAdapterManager::GetInstance()->DeregisterStateObserver(*observerImp_);
598
599 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
600 if (classicService) {
601 /// classic observer
602 classicService->DeregisterClassicAdapterObserver(*classicObserverImp_.get());
603 /// classic remote observer
604 classicService->DeregisterRemoteDeviceObserver(*remoteObserverImp_.get());
605 }
606
607 auto bleService = IAdapterManager::GetInstance()->GetBleAdapterInterface();
608 if (bleService) {
609 /// ble observer
610 bleService->DeregisterBleAdapterObserver(*bleObserverImp_.get());
611 /// ble remote observer
612 bleService->DeregisterBlePeripheralCallback(*bleRemoteObserverImp_.get());
613 }
614 }
615
createServers()616 void BluetoothHostServer::impl::createServers()
617 {
618 sptr<BluetoothSocketServer> socket = new BluetoothSocketServer();
619 servers_.EnsureInsert(PROFILE_SOCKET, socket->AsObject());
620
621 sptr<BluetoothGattServerServer> gattserver = new BluetoothGattServerServer();
622 servers_.EnsureInsert(PROFILE_GATT_SERVER, gattserver->AsObject());
623
624 sptr<BluetoothGattClientServer> gattclient = new BluetoothGattClientServer();
625 servers_.EnsureInsert(PROFILE_GATT_CLIENT, gattclient->AsObject());
626
627 #ifdef BLUETOOTH_HFP_AG_FEATURE
628 sptr<BluetoothHfpAgServer> hfpAg = new BluetoothHfpAgServer();
629 servers_.EnsureInsert(PROFILE_HFP_AG, hfpAg->AsObject());
630 #endif
631
632 #ifdef BLUETOOTH_HFP_HF_FEATURE
633 sptr<BluetoothHfpHfServer> hfpHf = new BluetoothHfpHfServer();
634 servers_.EnsureInsert(PROFILE_HFP_HF, hfpHf->AsObject());
635 #endif
636
637 #ifdef BLUETOOTH_AVRCP_CT_FEATURE
638 sptr<BluetoothAvrcpCtServer> avrcpCtServer = new BluetoothAvrcpCtServer();
639 servers_.EnsureInsert(PROFILE_AVRCP_CT, avrcpCtServer->AsObject());
640 #endif
641
642 #ifdef BLUETOOTH_AVRCP_TG_FEATURE
643 sptr<BluetoothAvrcpTgServer> avrcpTgServer = new BluetoothAvrcpTgServer();
644 servers_.EnsureInsert(PROFILE_AVRCP_TG, avrcpTgServer->AsObject());
645 #endif
646
647 sptr<BluetoothBleAdvertiserServer> bleAdvertiser = new BluetoothBleAdvertiserServer();
648 bleServers_.EnsureInsert(BLE_ADVERTISER_SERVER, bleAdvertiser->AsObject());
649
650 sptr<BluetoothBleCentralManagerServer> bleCentralManger = new BluetoothBleCentralManagerServer();
651 bleServers_.EnsureInsert(BLE_CENTRAL_MANAGER_SERVER, bleCentralManger->AsObject());
652
653 #ifdef BLUETOOTH_MAP_SERVER_FEATURE
654 sptr<BluetoothMapMceServer> mapMce = new BluetoothMapMceServer();
655 servers_.EnsureInsert(PROFILE_MAP_MCE, mapMce->AsObject());
656 #endif
657
658 #ifdef BLUETOOTH_MAP_CLIENT_FEATURE
659 sptr<BluetoothMapMseServer> mapMse = new BluetoothMapMseServer();
660 servers_.EnsureInsert(PROFILE_MAP_MSE, mapMse->AsObject());
661 #endif
662
663 #ifdef BLUETOOTH_A2DP_SRC_FEATURE
664 sptr<BluetoothA2dpSourceServer> a2dpSource = new BluetoothA2dpSourceServer();
665 servers_.EnsureInsert(PROFILE_A2DP_SRC, a2dpSource->AsObject());
666 #endif
667
668 #ifdef BLUETOOTH_A2DP_SINK_FEATURE
669 sptr<BluetoothA2dpSinkServer> a2dpSink = new BluetoothA2dpSinkServer();
670 servers_.EnsureInsert(PROFILE_A2DP_SINK, a2dpSink->AsObject());
671 #endif
672
673 #ifdef BLUETOOTH_HID_HOST_FEATURE
674 sptr<BluetoothHidHostServer> hidHostServer = new BluetoothHidHostServer();
675 servers_.EnsureInsert(PROFILE_HID_HOST_SERVER, hidHostServer->AsObject());
676 #endif
677
678 #ifdef BLUETOOTH_PAN_FEATURE
679 sptr<BluetoothPanServer> panServer = new BluetoothPanServer();
680 servers_.EnsureInsert(PROFILE_PAN_SERVER, panServer->AsObject());
681 #endif
682
683 HILOGI("servers_ constructed, size is %{public}d", servers_.Size());
684 }
685
BluetoothHostServer()686 BluetoothHostServer::BluetoothHostServer() : SystemAbility(BLUETOOTH_HOST_SYS_ABILITY_ID, true)
687 {
688 pimpl = std::make_unique<impl>();
689 }
690
~BluetoothHostServer()691 BluetoothHostServer::~BluetoothHostServer()
692 {
693 HILOGI("~BluetoothHostServer called.");
694 }
695
GetInstance()696 sptr<BluetoothHostServer> BluetoothHostServer::GetInstance()
697 {
698 std::lock_guard<std::mutex> autoLock(instanceLock);
699 if (instance == nullptr) {
700 sptr<BluetoothHostServer> temp = new BluetoothHostServer();
701 instance = temp;
702 }
703 return instance;
704 }
705
OnStart()706 void BluetoothHostServer::OnStart()
707 {
708 HILOGI("starting service.");
709 if (state_ == ServiceRunningState::STATE_RUNNING) {
710 HILOGI("service is already started.");
711 return;
712 }
713
714 if (!Init()) {
715 HILOGE("initiation failed");
716 OnStop();
717 return;
718 }
719
720 state_ = ServiceRunningState::STATE_RUNNING;
721
722 HILOGI("service has been started successfully");
723 return;
724 }
725
Init()726 bool BluetoothHostServer::Init()
727 {
728 pimpl->Init();
729 if (!registeredToService_) {
730 bool ret = Publish(BluetoothHostServer::GetInstance());
731 if (!ret) {
732 HILOGE("init publish failed!");
733 return false;
734 }
735 registeredToService_ = true;
736 }
737 HILOGI("init success");
738 return true;
739 }
740
OnStop()741 void BluetoothHostServer::OnStop()
742 {
743 HILOGI("stopping service.");
744
745 pimpl->Clear();
746 state_ = ServiceRunningState::STATE_IDLE;
747 registeredToService_ = false;
748 return;
749 }
750
RegisterObserver(const sptr<IBluetoothHostObserver> & observer)751 void BluetoothHostServer::RegisterObserver(const sptr<IBluetoothHostObserver> &observer)
752 {
753 if (observer == nullptr) {
754 HILOGE("RegisterObserver observer is null");
755 return;
756 }
757
758 pimpl->observersToken_.EnsureInsert(observer->AsObject(), IPCSkeleton::GetCallingTokenID());
759 pimpl->observersPid_.EnsureInsert(observer->AsObject(), IPCSkeleton::GetCallingUid());
760 auto func = std::bind(&BluetoothHostServer::DeregisterObserver, this, std::placeholders::_1);
761 pimpl->observers_.Register(observer, func);
762 std::lock_guard<std::mutex> lock(pimpl->hostObserversMutex);
763 pimpl->hostObservers_.push_back(observer);
764 }
765
DeregisterObserver(const sptr<IBluetoothHostObserver> & observer)766 void BluetoothHostServer::DeregisterObserver(const sptr<IBluetoothHostObserver> &observer)
767 {
768 if (observer == nullptr || pimpl == nullptr) {
769 HILOGE("DeregisterObserver observer is null");
770 return;
771 }
772 {
773 std::lock_guard<std::mutex> lock(pimpl->hostObserversMutex);
774 for (auto iter = pimpl->hostObservers_.begin(); iter != pimpl->hostObservers_.end(); ++iter) {
775 if ((*iter)->AsObject() == observer->AsObject()) {
776 pimpl->observers_.Deregister(*iter);
777 pimpl->hostObservers_.erase(iter);
778 break;
779 }
780 }
781 }
782 pimpl->observersToken_.Erase(observer->AsObject());
783 pimpl->observersPid_.Erase(observer->AsObject());
784 }
785
EnableBt()786 int32_t BluetoothHostServer::EnableBt()
787 {
788 if (IAdapterManager::GetInstance()->Enable(bluetooth::BTTransport::ADAPTER_BREDR)) {
789 return NO_ERROR;
790 }
791 return BT_ERR_INTERNAL_ERROR;
792 }
793
DisableBt()794 int32_t BluetoothHostServer::DisableBt()
795 {
796 if (IAdapterManager::GetInstance()->Disable(bluetooth::BTTransport::ADAPTER_BREDR)) {
797 return NO_ERROR;
798 }
799 return BT_ERR_INTERNAL_ERROR;
800 }
801
ConvertBTStateIDToBluetoothState(int32_t brState,int32_t bleState)802 static int32_t ConvertBTStateIDToBluetoothState(int32_t brState, int32_t bleState)
803 {
804 BluetoothState state = BluetoothState::STATE_OFF;
805 switch (brState) {
806 case BTStateID::STATE_TURN_ON: state = BluetoothState::STATE_ON; break;
807 case BTStateID::STATE_TURNING_ON: state = BluetoothState::STATE_TURNING_ON; break;
808 case BTStateID::STATE_TURNING_OFF: state = BluetoothState::STATE_TURNING_OFF; break;
809 case BTStateID::STATE_TURN_OFF: {
810 switch (bleState) {
811 case BTStateID::STATE_TURN_ON: state = BluetoothState::STATE_BLE_ON; break;
812 case BTStateID::STATE_TURNING_ON: state = BluetoothState::STATE_BLE_TURNING_ON; break;
813 case BTStateID::STATE_TURNING_OFF: state = BluetoothState::STATE_BLE_TURNING_OFF; break;
814 default: break;
815 }
816 }
817 default: HILOGE("Invalid bt state"); break;
818 }
819 return static_cast<int32_t>(state);
820 }
821
GetBtState(int32_t & state)822 int32_t BluetoothHostServer::GetBtState(int32_t &state)
823 {
824 int32_t brState = IAdapterManager::GetInstance()->GetState(bluetooth::BTTransport::ADAPTER_BREDR);
825 int32_t bleState = IAdapterManager::GetInstance()->GetState(bluetooth::BTTransport::ADAPTER_BLE);
826 state = ConvertBTStateIDToBluetoothState(brState, bleState);
827 return BT_NO_ERROR;
828 }
829
GetProfile(const std::string & name)830 sptr<IRemoteObject> BluetoothHostServer::GetProfile(const std::string &name)
831 {
832 HILOGI("seraching %{public}s ", name.c_str());
833 sptr<IRemoteObject> object = nullptr;
834 if (pimpl->servers_.Find(name, object)) {
835 return object;
836 }
837 return object;
838 }
839
GetBleRemote(const std::string & name)840 sptr<IRemoteObject> BluetoothHostServer::GetBleRemote(const std::string &name)
841 {
842 HILOGI("GetBleRemote %{public}s ", name.c_str());
843 sptr<IRemoteObject> object = nullptr;
844 if (pimpl->bleServers_.Find(name, object)) {
845 return object;
846 }
847 return object;
848 }
849
850 // Fac_Res_CODE
BluetoothFactoryReset()851 int32_t BluetoothHostServer::BluetoothFactoryReset()
852 {
853 bool ret = IAdapterManager::GetInstance()->FactoryReset();
854 return ret ? BT_NO_ERROR : BT_ERR_INTERNAL_ERROR;
855 }
856
GetDeviceType(int32_t transport,const std::string & address)857 int32_t BluetoothHostServer::GetDeviceType(int32_t transport, const std::string &address)
858 {
859 HILOGI("transport: %{public}d, address: %{public}s", transport, GetEncryptAddr(address).c_str());
860 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
861 auto bleService = IAdapterManager::GetInstance()->GetBleAdapterInterface();
862 RawAddress addr(address);
863 if ((transport == BTTransport::ADAPTER_BREDR) && IsBtEnabled() && classicService) {
864 return classicService->GetDeviceType(addr);
865 } else if ((transport == BTTransport::ADAPTER_BLE) && IsBleEnabled() && bleService) {
866 return bleService->GetDeviceType(addr);
867 } else {
868 HILOGE("transport invalid or BT current state is not enabled!");
869 }
870 return INVALID_VALUE;
871 }
872
GetLocalAddress(std::string & addr)873 int32_t BluetoothHostServer::GetLocalAddress(std::string &addr)
874 {
875 HILOGI("Enter!");
876 if (PermissionUtils::VerifyAccessBluetoothPermission() == PERMISSION_DENIED) {
877 HILOGE("false, check Access permission failed");
878 return BT_ERR_PERMISSION_FAILED;
879 }
880 if (PermissionUtils::VerifyGetBluetoothLocalMacPermission() == PERMISSION_DENIED) {
881 HILOGE("false, check GetLocalMac permission failed");
882 return BT_ERR_PERMISSION_FAILED;
883 }
884 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
885 auto bleService = IAdapterManager::GetInstance()->GetBleAdapterInterface();
886 if (IsBtEnabled() && classicService) {
887 addr = classicService->GetLocalAddress();
888 return NO_ERROR;
889 } else if (IsBleEnabled() && bleService) {
890 addr = bleService->GetLocalAddress();
891 return NO_ERROR;
892 } else {
893 HILOGW("BT current state is not enabled!");
894 return BT_ERR_INVALID_STATE;
895 }
896 }
897
EnableBle()898 int32_t BluetoothHostServer::EnableBle()
899 {
900 HILOGI("Enter!");
901 if (IAdapterManager::GetInstance()->Enable(BTTransport::ADAPTER_BLE)) {
902 return NO_ERROR;
903 }
904 return BT_ERR_INTERNAL_ERROR;
905 }
906
DisableBle()907 int32_t BluetoothHostServer::DisableBle()
908 {
909 HILOGI("Enter!");
910 if (IAdapterManager::GetInstance()->Disable(BTTransport::ADAPTER_BLE)) {
911 return NO_ERROR;
912 }
913 return BT_ERR_INTERNAL_ERROR;
914 }
915
IsBrEnabled()916 bool BluetoothHostServer::IsBrEnabled()
917 {
918 return IsBtEnabled();
919 }
920
IsBleEnabled()921 bool BluetoothHostServer::IsBleEnabled()
922 {
923 return IAdapterManager::GetInstance()->GetState(BTTransport::ADAPTER_BLE) == BTStateID::STATE_TURN_ON;
924 }
925
GetProfileList()926 std::vector<uint32_t> BluetoothHostServer::GetProfileList()
927 {
928 HILOGI("Enter!");
929 return IProfileManager::GetInstance()->GetProfileServicesList();
930 }
931
GetMaxNumConnectedAudioDevices()932 int32_t BluetoothHostServer::GetMaxNumConnectedAudioDevices()
933 {
934 HILOGI("Enter!");
935 return IAdapterManager::GetInstance()->GetMaxNumConnectedAudioDevices();
936 }
937
GetBtConnectionState(int32_t & state)938 int32_t BluetoothHostServer::GetBtConnectionState(int32_t &state)
939 {
940 if (PermissionUtils::VerifyUseBluetoothPermission() == PERMISSION_DENIED) {
941 HILOGE("false, check permission failed");
942 return BT_ERR_PERMISSION_FAILED;
943 }
944 if (IsBtEnabled()) {
945 state = (int32_t)IAdapterManager::GetInstance()->GetAdapterConnectState();
946 HILOGI("state: %{public}d", state);
947 return NO_ERROR;
948 } else {
949 HILOGW("BT current state is not enabled!");
950 return BT_ERR_INVALID_STATE;
951 }
952 }
953
GetBtProfileConnState(uint32_t profileId,int & state)954 int32_t BluetoothHostServer::GetBtProfileConnState(uint32_t profileId, int &state)
955 {
956 HILOGI("Enter!");
957 if (PermissionUtils::VerifyUseBluetoothPermission() == PERMISSION_DENIED) {
958 HILOGE("false, check permission failed");
959 return BT_ERR_PERMISSION_FAILED;
960 }
961 if (IsBtEnabled()) {
962 state = (int32_t)IProfileManager::GetInstance()->GetProfileServiceConnectState(profileId);
963 return NO_ERROR;
964 } else {
965 HILOGW("BT current state is not enabled!");
966 return BT_ERR_INVALID_STATE;
967 }
968 }
969
GetLocalSupportedUuids(std::vector<std::string> & uuids)970 void BluetoothHostServer::GetLocalSupportedUuids(std::vector<std::string> &uuids)
971 {
972 HILOGI("Enter!");
973 IProfileManager::GetInstance()->GetProfileServicesSupportedUuids(uuids);
974 }
975
GetLocalDeviceClass()976 int32_t BluetoothHostServer::GetLocalDeviceClass()
977 {
978 HILOGI("Enter!");
979 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
980 if (IsBtEnabled() && classicService) {
981 return classicService->GetLocalDeviceClass();
982 } else {
983 HILOGW("BT current state is not enabled!");
984 }
985 return 0;
986 }
987
SetLocalDeviceClass(const int32_t & deviceClass)988 bool BluetoothHostServer::SetLocalDeviceClass(const int32_t &deviceClass)
989 {
990 HILOGI("Enter!");
991 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
992 if (IsBtEnabled() && classicService) {
993 return classicService->SetLocalDeviceClass(deviceClass);
994 } else {
995 HILOGW("BT current state is not enabled!");
996 }
997 return false;
998 }
999
GetLocalName(std::string & name)1000 int32_t BluetoothHostServer::GetLocalName(std::string &name)
1001 {
1002 HILOGI("Enter!");
1003 if (PermissionUtils::VerifyUseBluetoothPermission() == PERMISSION_DENIED) {
1004 HILOGE("false, check permission failed");
1005 return BT_ERR_PERMISSION_FAILED;
1006 }
1007 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
1008 auto bleService = IAdapterManager::GetInstance()->GetBleAdapterInterface();
1009 if (IsBtEnabled() && classicService) {
1010 name = classicService->GetLocalName();
1011 return NO_ERROR;
1012 } else if (IsBleEnabled() && bleService) {
1013 name = bleService->GetLocalName();
1014 return NO_ERROR;
1015 } else {
1016 HILOGW("BT current state is not enabled!");
1017 return BT_ERR_INVALID_STATE;
1018 }
1019 }
1020
SetLocalName(const std::string & name)1021 int32_t BluetoothHostServer::SetLocalName(const std::string &name)
1022 {
1023 HILOGI("name: %{public}s", name.c_str());
1024 int api12 = 12;
1025 if (!PermissionUtils::CheckSystemHapApp() && PermissionUtils::GetApiVersion() >= api12) {
1026 return BT_ERR_API_NOT_SUPPORT;
1027 }
1028 if (PermissionUtils::VerifyDiscoverBluetoothPermission() == PERMISSION_DENIED) {
1029 HILOGE("false, check permission failed");
1030 return BT_ERR_PERMISSION_FAILED;
1031 }
1032 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
1033 auto bleService = IAdapterManager::GetInstance()->GetBleAdapterInterface();
1034 if (IsBtEnabled() && classicService) {
1035 bool ret = classicService->SetLocalName(name);
1036 if (ret && (IsBleEnabled() && bleService)) {
1037 if (bleService->SetLocalName(name)) {
1038 return NO_ERROR;
1039 }
1040 } else {
1041 HILOGE("failed!");
1042 return BT_ERR_INTERNAL_ERROR;
1043 }
1044 } else if (IsBleEnabled() && bleService) {
1045 if (bleService->SetLocalName(name)) {
1046 return NO_ERROR;
1047 }
1048 } else {
1049 HILOGW("BT current state is not enabled!");
1050 return BT_ERR_INVALID_STATE;
1051 }
1052 return BT_ERR_INTERNAL_ERROR;
1053 }
1054
GetBtScanMode(int32_t & scanMode)1055 int32_t BluetoothHostServer::GetBtScanMode(int32_t &scanMode)
1056 {
1057 HILOGI("Enter!");
1058 if (PermissionUtils::VerifyUseBluetoothPermission() == PERMISSION_DENIED) {
1059 HILOGE("false, check permission failed");
1060 return BT_ERR_PERMISSION_FAILED;
1061 }
1062 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
1063 if (IsBtEnabled() && classicService) {
1064 scanMode = classicService->GetBtScanMode();
1065 return NO_ERROR;
1066 } else {
1067 HILOGW("BT current state is not enabled!");
1068 return BT_ERR_INVALID_STATE;
1069 }
1070 }
1071
SetBtScanMode(int32_t mode,int32_t duration)1072 int32_t BluetoothHostServer::SetBtScanMode(int32_t mode, int32_t duration)
1073 {
1074 HILOGI("mode: %{public}d, duration: %{public}d", mode, duration);
1075 if (PermissionUtils::VerifyUseBluetoothPermission() == PERMISSION_DENIED) {
1076 HILOGE("false, check permission failed");
1077 return BT_ERR_PERMISSION_FAILED;
1078 }
1079 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
1080 if (IsBtEnabled() && classicService) {
1081 if (classicService->SetBtScanMode(mode, duration)) {
1082 return NO_ERROR;
1083 }
1084 } else {
1085 HILOGW("BT current state is not enabled!");
1086 return BT_ERR_INVALID_STATE;
1087 }
1088 return BT_ERR_INTERNAL_ERROR;
1089 }
1090
GetBondableMode(int32_t transport)1091 int32_t BluetoothHostServer::GetBondableMode(int32_t transport)
1092 {
1093 HILOGI("transport: %{public}d", transport);
1094 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
1095 auto bleService = IAdapterManager::GetInstance()->GetBleAdapterInterface();
1096 if ((transport == BTTransport::ADAPTER_BREDR) && IsBtEnabled() && classicService) {
1097 return classicService->GetBondableMode();
1098 } else if ((transport == BTTransport::ADAPTER_BLE) && IsBleEnabled() && bleService) {
1099 return bleService->GetBondableMode();
1100 } else {
1101 HILOGE("Parameter::transport invalid or BT current state is not enabled!");
1102 }
1103 return BONDABLE_MODE_OFF;
1104 }
1105
SetBondableMode(int32_t transport,int32_t mode)1106 bool BluetoothHostServer::SetBondableMode(int32_t transport, int32_t mode)
1107 {
1108 HILOGI("transport: %{public}d, mode: %{public}d", transport, mode);
1109 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
1110 auto bleService = IAdapterManager::GetInstance()->GetBleAdapterInterface();
1111 if ((transport == BTTransport::ADAPTER_BREDR) && IsBtEnabled() && classicService) {
1112 return classicService->SetBondableMode(mode);
1113 } else if ((transport == BTTransport::ADAPTER_BLE) && IsBleEnabled() && bleService) {
1114 return bleService->SetBondableMode(mode);
1115 } else {
1116 HILOGE("Parameter::transport invalid or BT current state is not enabled!");
1117 }
1118 return false;
1119 }
1120
StartBtDiscovery()1121 int32_t BluetoothHostServer::StartBtDiscovery()
1122 {
1123 HILOGI("Enter!");
1124 if (PermissionUtils::VerifyDiscoverBluetoothPermission() == PERMISSION_DENIED) {
1125 HILOGE("false, check permission failed");
1126 return BT_ERR_PERMISSION_FAILED;
1127 }
1128 if (PermissionUtils::VerifyApproximatelyPermission() == PERMISSION_DENIED &&
1129 PermissionUtils::VerifyLocationPermission() == PERMISSION_DENIED) {
1130 HILOGE("No location permission");
1131 return BT_ERR_PERMISSION_FAILED;
1132 }
1133 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
1134 if (IsBtEnabled() && classicService) {
1135 if (classicService->StartBtDiscovery()) {
1136 return NO_ERROR;
1137 }
1138 } else {
1139 HILOGW("BT current state is not enabled!");
1140 return BT_ERR_INVALID_STATE;
1141 }
1142 return BT_ERR_INTERNAL_ERROR;
1143 }
1144
CancelBtDiscovery()1145 int32_t BluetoothHostServer::CancelBtDiscovery()
1146 {
1147 HILOGI("Enter!");
1148 if (PermissionUtils::VerifyDiscoverBluetoothPermission() == PERMISSION_DENIED) {
1149 HILOGE("false, check permission failed");
1150 return BT_ERR_PERMISSION_FAILED;
1151 }
1152 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
1153 if (IsBtEnabled() && classicService) {
1154 if (classicService->CancelBtDiscovery()) {
1155 return NO_ERROR;
1156 }
1157 } else {
1158 HILOGW("BT current state is not enabled!");
1159 return BT_ERR_INVALID_STATE;
1160 }
1161 return BT_ERR_INTERNAL_ERROR;
1162 }
1163
IsBtDiscovering(bool & isDisCovering,int32_t transport)1164 int32_t BluetoothHostServer::IsBtDiscovering(bool &isDisCovering, int32_t transport)
1165 {
1166 HILOGI("transport: %{public}d", transport);
1167 if (PermissionUtils::VerifyAccessBluetoothPermission() == PERMISSION_DENIED) {
1168 HILOGE("false, check permission failed");
1169 return BT_ERR_PERMISSION_FAILED;
1170 }
1171 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
1172 auto bleService = IAdapterManager::GetInstance()->GetBleAdapterInterface();
1173 if ((transport == BTTransport::ADAPTER_BREDR) && IsBtEnabled() && classicService) {
1174 isDisCovering = classicService->IsBtDiscovering();
1175 } else if ((transport == BTTransport::ADAPTER_BLE) && IsBleEnabled() && bleService) {
1176 isDisCovering = bleService->IsBtDiscovering();
1177 } else {
1178 HILOGE("Parameter::transport invalid or BT current state is not enabled!");
1179 return BT_ERR_INVALID_STATE;
1180 }
1181 return BT_NO_ERROR;
1182 }
1183
GetBtDiscoveryEndMillis()1184 long BluetoothHostServer::GetBtDiscoveryEndMillis()
1185 {
1186 HILOGI("Enter!");
1187 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
1188 if (IsBtEnabled() && classicService) {
1189 return classicService->GetBtDiscoveryEndMillis();
1190 } else {
1191 HILOGW("BT current state is not enabled!");
1192 }
1193 return INVALID_VALUE;
1194 }
1195
GetPairedDevices(std::vector<BluetoothRawAddress> & pairedAddr)1196 int32_t BluetoothHostServer::GetPairedDevices(std::vector<BluetoothRawAddress> &pairedAddr)
1197 {
1198 HILOGI("GetPairedDevices");
1199 if (PermissionUtils::VerifyUseBluetoothPermission() == PERMISSION_DENIED) {
1200 HILOGE("false, check permission failed");
1201 return BT_ERR_SYSTEM_PERMISSION_FAILED;
1202 }
1203 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
1204 auto bleService = IAdapterManager::GetInstance()->GetBleAdapterInterface();
1205 std::vector<RawAddress> rawAddrVec;
1206 if (IsBtEnabled() && classicService) {
1207 rawAddrVec = classicService->GetPairedDevices();
1208 } else {
1209 HILOGE("transport invalid or BT current state is not enabled!");
1210 return BT_ERR_INVALID_STATE;
1211 }
1212 for (auto it = rawAddrVec.begin(); it != rawAddrVec.end(); ++it) {
1213 BluetoothRawAddress rawAddr = BluetoothRawAddress(*it);
1214 pairedAddr.emplace_back(rawAddr);
1215 }
1216 if (IsBleEnabled() && bleService) {
1217 rawAddrVec = bleService->GetPairedDevices();
1218 } else {
1219 HILOGE("transport invalid or BT current state is not enabled!");
1220 return BT_ERR_INVALID_STATE;
1221 }
1222
1223 for (auto it = rawAddrVec.begin(); it != rawAddrVec.end(); ++it) {
1224 BluetoothRawAddress rawAddr = BluetoothRawAddress(*it);
1225 pairedAddr.emplace_back(rawAddr);
1226 }
1227 return NO_ERROR;
1228 }
1229
GetTransportByDeviceType(int32_t transport,const std::string & address)1230 int BluetoothHostServer::GetTransportByDeviceType(int32_t transport, const std::string &address)
1231 {
1232 if (transport == BT_TRANSPORT_NONE) {
1233 int deviceType = GetDeviceType(BT_TRANSPORT_BREDR, address);
1234 if (deviceType == INVALID_TYPE || deviceType == DEVICE_TYPE_LE) {
1235 transport = BT_TRANSPORT_BLE;
1236 } else {
1237 transport = BT_TRANSPORT_BREDR;
1238 }
1239 }
1240 return transport;
1241 }
1242
RemovePair(int32_t transport,const sptr<BluetoothRawAddress> & device)1243 int32_t BluetoothHostServer::RemovePair(int32_t transport, const sptr<BluetoothRawAddress> &device)
1244 {
1245 if (device == nullptr) {
1246 HILOGE("device is nullptr.");
1247 return BT_ERR_INTERNAL_ERROR;
1248 }
1249 HILOGI("addr:%{public}s, transport:%{public}d", GET_ENCRYPT_ADDR(*device), transport);
1250 if (!PermissionUtils::CheckSystemHapApp()) {
1251 HILOGE("check system api failed.");
1252 return BT_ERR_SYSTEM_PERMISSION_FAILED;
1253 }
1254 if (PermissionUtils::VerifyDiscoverBluetoothPermission() == PERMISSION_DENIED) {
1255 HILOGE("check permission failed.");
1256 return BT_ERR_PERMISSION_FAILED;
1257 }
1258 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
1259 auto bleService = IAdapterManager::GetInstance()->GetBleAdapterInterface();
1260 transport = GetTransportByDeviceType(transport, device->GetAddress());
1261 if ((transport == BTTransport::ADAPTER_BREDR) && IsBtEnabled() && classicService) {
1262 if (classicService->RemovePair(*device)) {
1263 return NO_ERROR;
1264 }
1265 } else if ((transport == BTTransport::ADAPTER_BLE) && IsBleEnabled() && bleService) {
1266 if (bleService->RemovePair(*device)) {
1267 return NO_ERROR;
1268 }
1269 } else {
1270 HILOGE("transport invalid or BT/BLE current state is not enabled!");
1271 return BT_ERR_INVALID_STATE;
1272 }
1273 return BT_ERR_INTERNAL_ERROR;
1274 }
1275
RemoveAllPairs()1276 bool BluetoothHostServer::RemoveAllPairs()
1277 {
1278 HILOGI("Enter!");
1279 if (PermissionUtils::VerifyDiscoverBluetoothPermission() == PERMISSION_DENIED) {
1280 HILOGE("check permission failed");
1281 return false;
1282 }
1283 if (BTStateID::STATE_TURN_ON != IAdapterManager::GetInstance()->GetState(BTTransport::ADAPTER_BREDR) &&
1284 BTStateID::STATE_TURN_ON != IAdapterManager::GetInstance()->GetState(BTTransport::ADAPTER_BLE)) {
1285 HILOGW("BT current state is not enabled!");
1286 return false;
1287 }
1288
1289 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
1290 bool ret = true;
1291 if (IsBtEnabled() && classicService) {
1292 ret = classicService->RemoveAllPairs();
1293 if (!ret) {
1294 HILOGE("BREDR RemoveAllPairs failed");
1295 }
1296 }
1297
1298 auto bleService = IAdapterManager::GetInstance()->GetBleAdapterInterface();
1299 if (IsBleEnabled() && bleService) {
1300 ret &= bleService->RemoveAllPairs();
1301 if (!ret) {
1302 HILOGE("BLE RemoveAllPairs failed");
1303 }
1304 }
1305 return ret;
1306 }
1307
GetBleMaxAdvertisingDataLength()1308 int32_t BluetoothHostServer::GetBleMaxAdvertisingDataLength()
1309 {
1310 HILOGI("Enter!");
1311 auto bleService = IAdapterManager::GetInstance()->GetBleAdapterInterface();
1312 if (IsBleEnabled() && bleService) {
1313 return bleService->GetBleMaxAdvertisingDataLength();
1314 } else {
1315 HILOGW("BT current state is not enabled!");
1316 }
1317 return INVALID_VALUE;
1318 }
1319
GetPhonebookPermission(const std::string & address)1320 int32_t BluetoothHostServer::GetPhonebookPermission(const std::string &address)
1321 {
1322 HILOGI("address: %{public}s", GetEncryptAddr(address).c_str());
1323 return (int32_t)IAdapterManager::GetInstance()->GetPhonebookPermission(address);
1324 }
1325
SetPhonebookPermission(const std::string & address,int32_t permission)1326 bool BluetoothHostServer::SetPhonebookPermission(const std::string &address, int32_t permission)
1327 {
1328 HILOGI("address: %{public}s, permission: %{public}d", GetEncryptAddr(address).c_str(), permission);
1329 return IAdapterManager::GetInstance()->SetPhonebookPermission(address, (BTPermissionType)permission);
1330 }
1331
GetMessagePermission(const std::string & address)1332 int32_t BluetoothHostServer::GetMessagePermission(const std::string &address)
1333 {
1334 HILOGI("address: %{public}s", GetEncryptAddr(address).c_str());
1335 return (int32_t)IAdapterManager::GetInstance()->GetMessagePermission(address);
1336 }
1337
SetMessagePermission(const std::string & address,int32_t permission)1338 bool BluetoothHostServer::SetMessagePermission(const std::string &address, int32_t permission)
1339 {
1340 HILOGI("address: %{public}s, permission: %{public}d", GetEncryptAddr(address).c_str(), permission);
1341 return IAdapterManager::GetInstance()->SetMessagePermission(address, (BTPermissionType)permission);
1342 }
1343
GetPowerMode(const std::string & address)1344 int32_t BluetoothHostServer::GetPowerMode(const std::string &address)
1345 {
1346 HILOGI("address: %{public}s", GetEncryptAddr(address).c_str());
1347 return IAdapterManager::GetInstance()->GetPowerMode(address);
1348 }
1349
GetDeviceName(int32_t transport,const std::string & address,std::string & name)1350 int32_t BluetoothHostServer::GetDeviceName(int32_t transport, const std::string &address, std::string &name)
1351 {
1352 if (PermissionUtils::VerifyUseBluetoothPermission() == PERMISSION_DENIED) {
1353 HILOGE("false, check permission failed");
1354 return BT_ERR_PERMISSION_FAILED;
1355 }
1356 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
1357 auto bleService = IAdapterManager::GetInstance()->GetBleAdapterInterface();
1358 RawAddress addr(address);
1359 transport = GetTransportByDeviceType(transport, address);
1360 if ((transport == BT_TRANSPORT_BREDR) && IsBtEnabled() && classicService) {
1361 name = classicService->GetDeviceName(addr);
1362 return NO_ERROR;
1363 } else if ((transport == BT_TRANSPORT_BLE) && IsBleEnabled() && bleService) {
1364 name = bleService->GetDeviceName(addr);
1365 return NO_ERROR;
1366 } else {
1367 HILOGE("transport invalid or BT current state is not enabled!");
1368 return BT_ERR_INVALID_STATE;
1369 }
1370 }
1371
GetDeviceAlias(const std::string & address)1372 std::string BluetoothHostServer::GetDeviceAlias(const std::string &address)
1373 {
1374 HILOGI("address: %{public}s", GetEncryptAddr(address).c_str());
1375 if (PermissionUtils::VerifyUseBluetoothPermission() == PERMISSION_DENIED) {
1376 HILOGE("false, check permission failed");
1377 return INVALID_NAME;
1378 }
1379 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
1380 if (IsBtEnabled() && classicService) {
1381 RawAddress addr(address);
1382 return classicService->GetAliasName(addr);
1383 } else {
1384 HILOGE("BT current state is not enabled");
1385 }
1386 return INVALID_NAME;
1387 }
1388
SetDeviceAlias(const std::string & address,const std::string & aliasName)1389 int32_t BluetoothHostServer::SetDeviceAlias(const std::string &address, const std::string &aliasName)
1390 {
1391 HILOGI("address: %{public}s, aliasName: %{public}s", GetEncryptAddr(address).c_str(), aliasName.c_str());
1392 if (PermissionUtils::VerifyUseBluetoothPermission() == PERMISSION_DENIED) {
1393 HILOGE("false, check permission failed");
1394 return BT_ERR_PERMISSION_FAILED;
1395 }
1396 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
1397 if (IsBtEnabled() && classicService) {
1398 RawAddress addr(address);
1399 return classicService->SetAliasName(addr, aliasName) ? BT_NO_ERROR : BT_ERR_INVALID_PARAM;
1400 } else {
1401 HILOGE("BT current state is not enabled");
1402 }
1403 return BT_ERR_INVALID_STATE;
1404 }
1405
GetRemoteDeviceBatteryInfo(const std::string & address,BluetoothBatteryInfo & batteryInfo)1406 int32_t BluetoothHostServer::GetRemoteDeviceBatteryInfo(const std::string &address,
1407 BluetoothBatteryInfo &batteryInfo)
1408 {
1409 return BT_ERR_INTERNAL_ERROR;
1410 }
1411
GetPairState(int32_t transport,const std::string & address,int32_t & pairState)1412 int32_t BluetoothHostServer::GetPairState(int32_t transport, const std::string &address, int32_t &pairState)
1413 {
1414 HILOGI("transport: %{public}d, address: %{public}s", transport, GetEncryptAddr(address).c_str());
1415 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
1416 auto bleService = IAdapterManager::GetInstance()->GetBleAdapterInterface();
1417 RawAddress addr(address);
1418 if ((transport == BT_TRANSPORT_BREDR) && IsBtEnabled() && classicService) {
1419 pairState = classicService->GetPairState(addr);
1420 } else if ((transport == BT_TRANSPORT_BLE) && IsBleEnabled() && bleService) {
1421 pairState = bleService->GetPairState(addr);
1422 } else {
1423 HILOGE("transport invalid or BT current state is not enabled!");
1424 }
1425 return BT_NO_ERROR;
1426 }
1427
StartPair(int32_t transport,const std::string & address)1428 int32_t BluetoothHostServer::StartPair(int32_t transport, const std::string &address)
1429 {
1430 HILOGI("transport: %{public}d, address: %{public}s", transport, GetEncryptAddr(address).c_str());
1431 if (PermissionUtils::VerifyDiscoverBluetoothPermission() == PERMISSION_DENIED) {
1432 HILOGE("StartPair false, check permission failed");
1433 return BT_ERR_PERMISSION_FAILED;
1434 }
1435 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
1436 auto bleService = IAdapterManager::GetInstance()->GetBleAdapterInterface();
1437 RawAddress addr(address);
1438 transport = GetTransportByDeviceType(transport, address);
1439 if ((transport == BT_TRANSPORT_BREDR) && IsBtEnabled() && classicService) {
1440 if (classicService->StartPair(addr)) {
1441 return NO_ERROR;
1442 }
1443 } else if ((transport == BT_TRANSPORT_BLE) && IsBleEnabled() && bleService) {
1444 if (bleService->StartPair(addr)) {
1445 return NO_ERROR;
1446 }
1447 } else {
1448 HILOGE("transport invalid or BT current state is not enabled!");
1449 return BT_ERR_INVALID_STATE;
1450 }
1451 return BT_ERR_INTERNAL_ERROR;
1452 }
1453
CancelPairing(int32_t transport,const std::string & address)1454 bool BluetoothHostServer::CancelPairing(int32_t transport, const std::string &address)
1455 {
1456 HILOGI("transport: %{public}d, address: %{public}s", transport, GetEncryptAddr(address).c_str());
1457 if (!PermissionUtils::CheckSystemHapApp()) {
1458 HILOGE("check system api failed.");
1459 return BT_ERR_SYSTEM_PERMISSION_FAILED;
1460 }
1461 if (PermissionUtils::VerifyDiscoverBluetoothPermission() == PERMISSION_DENIED) {
1462 HILOGE("false, check permission failed");
1463 return false;
1464 }
1465 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
1466 auto bleService = IAdapterManager::GetInstance()->GetBleAdapterInterface();
1467 RawAddress addr(address);
1468 transport = GetTransportByDeviceType(transport, address);
1469 if ((transport == BT_TRANSPORT_BREDR) && IsBtEnabled() && classicService) {
1470 return classicService->CancelPairing(addr);
1471 } else if ((transport == BT_TRANSPORT_BLE) && IsBleEnabled() && bleService) {
1472 return bleService->CancelPairing(addr);
1473 } else {
1474 HILOGE("transport invalid or BT current state is not enabled!");
1475 }
1476 return false;
1477 }
1478
IsBondedFromLocal(int32_t transport,const std::string & address)1479 bool BluetoothHostServer::IsBondedFromLocal(int32_t transport, const std::string &address)
1480 {
1481 HILOGI("transport: %{public}d, address: %{public}s", transport, GetEncryptAddr(address).c_str());
1482 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
1483 auto bleService = IAdapterManager::GetInstance()->GetBleAdapterInterface();
1484 RawAddress addr(address);
1485 if ((transport == BT_TRANSPORT_BREDR) && IsBtEnabled() && classicService) {
1486 return classicService->IsBondedFromLocal(addr);
1487 } else if ((transport == BT_TRANSPORT_BLE) && IsBleEnabled() && bleService) {
1488 return bleService->IsBondedFromLocal(addr);
1489 } else {
1490 HILOGE("transport invalid or BT current state is not enabled!");
1491 }
1492 return false;
1493 }
1494
IsAclConnected(int32_t transport,const std::string & address)1495 bool BluetoothHostServer::IsAclConnected(int32_t transport, const std::string &address)
1496 {
1497 HILOGI("transport: %{public}d, address: %{public}s", transport, GetEncryptAddr(address).c_str());
1498 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
1499 auto bleService = IAdapterManager::GetInstance()->GetBleAdapterInterface();
1500 RawAddress addr(address);
1501 if ((transport == BT_TRANSPORT_BREDR) && IsBtEnabled() && classicService) {
1502 return classicService->IsAclConnected(addr);
1503 } else if ((transport == BT_TRANSPORT_BLE) && IsBleEnabled() && bleService) {
1504 return bleService->IsAclConnected(addr);
1505 } else {
1506 HILOGE("transport invalid or BT current state is not enabled!");
1507 }
1508 return false;
1509 }
1510
IsAclEncrypted(int32_t transport,const std::string & address)1511 bool BluetoothHostServer::IsAclEncrypted(int32_t transport, const std::string &address)
1512 {
1513 HILOGI("transport: %{public}d, address: %{public}s", transport, GetEncryptAddr(address).c_str());
1514 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
1515 auto bleService = IAdapterManager::GetInstance()->GetBleAdapterInterface();
1516 RawAddress addr(address);
1517 if ((transport == BT_TRANSPORT_BREDR) && IsBtEnabled() && classicService) {
1518 return classicService->IsAclEncrypted(addr);
1519 } else if ((transport == BT_TRANSPORT_BLE) && IsBleEnabled() && bleService) {
1520 return bleService->IsAclEncrypted(addr);
1521 } else {
1522 HILOGE("transport invalid or BT current state is not enabled!");
1523 }
1524 return false;
1525 }
1526
GetDeviceClass(const std::string & address,int32_t & cod)1527 int32_t BluetoothHostServer::GetDeviceClass(const std::string &address, int32_t &cod)
1528 {
1529 HILOGI("address: %{public}s", GetEncryptAddr(address).c_str());
1530 if (PermissionUtils::VerifyUseBluetoothPermission() == PERMISSION_DENIED) {
1531 HILOGE("false, check permission failed");
1532 return BT_ERR_PERMISSION_FAILED;
1533 }
1534 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
1535 if (IsBtEnabled() && classicService) {
1536 RawAddress addr(address);
1537 cod = classicService->GetDeviceClass(addr);
1538 } else {
1539 HILOGE("BT current state is not enabled!");
1540 return BT_ERR_INVALID_STATE;
1541 }
1542 return NO_ERROR;
1543 }
1544
GetDeviceUuids(const std::string & address,std::vector<std::string> & uuids)1545 int32_t BluetoothHostServer::GetDeviceUuids(const std::string &address, std::vector<std::string> &uuids)
1546 {
1547 std::vector<bluetooth::Uuid> parcelUuids;
1548 RawAddress addr(address);
1549 if (!IsBtEnabled()) {
1550 HILOGE("BT current state is not enabled");
1551 return BT_ERR_INVALID_STATE;
1552 }
1553
1554 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
1555 if (classicService) {
1556 parcelUuids = classicService->GetDeviceUuids(addr);
1557 }
1558 for (auto Uuid : parcelUuids) {
1559 uuids.push_back(Uuid.ToString());
1560 }
1561 return NO_ERROR;
1562 }
1563
GetLocalProfileUuids(std::vector<std::string> & uuids)1564 int32_t BluetoothHostServer::GetLocalProfileUuids(std::vector<std::string> &uuids)
1565 {
1566 return NO_ERROR;
1567 }
1568
SetDevicePin(const std::string & address,const std::string & pin)1569 int32_t BluetoothHostServer::SetDevicePin(const std::string &address, const std::string &pin)
1570 {
1571 HILOGI("address: %{public}s, pin: %{public}s", GetEncryptAddr(address).c_str(), pin.c_str());
1572 if (PermissionUtils::VerifyManageBluetoothPermission() == PERMISSION_DENIED) {
1573 HILOGE("false, check permission failed");
1574 return BT_ERR_PERMISSION_FAILED;
1575 }
1576 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
1577 if (IsBtEnabled() && classicService) {
1578 RawAddress addr(address);
1579 if (classicService->SetDevicePin(addr, pin)) {
1580 return NO_ERROR;
1581 }
1582 } else {
1583 HILOGE("BT current state is not enabled!");
1584 return BT_ERR_INVALID_STATE;
1585 }
1586 return BT_ERR_INTERNAL_ERROR;
1587 }
1588
SetDevicePairingConfirmation(int32_t transport,const std::string & address,bool accept)1589 int32_t BluetoothHostServer::SetDevicePairingConfirmation(int32_t transport, const std::string &address, bool accept)
1590 {
1591 HILOGI("transport: %{public}d, address: %{public}s, accept: %{public}d",
1592 transport, GetEncryptAddr(address).c_str(), accept);
1593 if (PermissionUtils::VerifyManageBluetoothPermission() == PERMISSION_DENIED) {
1594 HILOGE("false, check permission failed");
1595 return BT_ERR_PERMISSION_FAILED;
1596 }
1597 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
1598 auto bleService = IAdapterManager::GetInstance()->GetBleAdapterInterface();
1599 RawAddress addr(address);
1600 transport = GetTransportByDeviceType(transport, address);
1601 if ((transport == BT_TRANSPORT_BREDR) && IsBtEnabled() && classicService) {
1602 if (classicService->SetDevicePairingConfirmation(addr, accept)) {
1603 return NO_ERROR;
1604 }
1605 } else if ((transport == BT_TRANSPORT_BLE) && IsBleEnabled() && bleService) {
1606 if (bleService->SetDevicePairingConfirmation(addr, accept)) {
1607 return NO_ERROR;
1608 }
1609 } else {
1610 HILOGE("transport invalid or BT current state is not enabled!");
1611 return BT_ERR_INVALID_STATE;
1612 }
1613 return BT_ERR_INTERNAL_ERROR;
1614 }
1615
SetDevicePasskey(int32_t transport,const std::string & address,int32_t passkey,bool accept)1616 bool BluetoothHostServer::SetDevicePasskey(int32_t transport, const std::string &address, int32_t passkey, bool accept)
1617 {
1618 HILOGI("transport: %{public}d, address: %{public}s, passkey: %{public}d, accept: %{public}d",
1619 transport, GetEncryptAddr(address).c_str(), passkey, accept);
1620 if (PermissionUtils::VerifyManageBluetoothPermission() == PERMISSION_DENIED) {
1621 HILOGE("false, check permission failed");
1622 return false;
1623 }
1624 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
1625 auto bleService = IAdapterManager::GetInstance()->GetBleAdapterInterface();
1626 RawAddress addr(address);
1627 if ((transport == BT_TRANSPORT_BREDR) && IsBtEnabled() && classicService) {
1628 return classicService->SetDevicePasskey(addr, passkey, accept);
1629 } else if ((transport == BT_TRANSPORT_BLE) && IsBleEnabled() && bleService) {
1630 return bleService->SetDevicePasskey(addr, passkey, accept);
1631 } else {
1632 HILOGE("transport invalid or BT current state is not enabled!");
1633 }
1634 return false;
1635 }
1636
PairRequestReply(int32_t transport,const std::string & address,bool accept)1637 bool BluetoothHostServer::PairRequestReply(int32_t transport, const std::string &address, bool accept)
1638 {
1639 HILOGI("transport: %{public}d, address: %{public}s, accept: %{public}d",
1640 transport, GetEncryptAddr(address).c_str(), accept);
1641 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
1642 auto bleService = IAdapterManager::GetInstance()->GetBleAdapterInterface();
1643 RawAddress addr(address);
1644 if ((transport == BT_TRANSPORT_BREDR) && IsBtEnabled() && classicService) {
1645 return classicService->PairRequestReply(addr, accept);
1646 } else if ((transport == BT_TRANSPORT_BLE) && IsBleEnabled() && bleService) {
1647 return bleService->PairRequestReply(addr, accept);
1648 } else {
1649 HILOGE("transport invalid or BT current state is not enabled!");
1650 }
1651 return false;
1652 }
1653
ReadRemoteRssiValue(const std::string & address)1654 bool BluetoothHostServer::ReadRemoteRssiValue(const std::string &address)
1655 {
1656 HILOGI("address: %{public}s", GetEncryptAddr(address).c_str());
1657 if (PermissionUtils::VerifyUseBluetoothPermission() == PERMISSION_DENIED) {
1658 HILOGE("false, check permission failed");
1659 return false;
1660 }
1661 auto bleService = IAdapterManager::GetInstance()->GetBleAdapterInterface();
1662 if (IsBleEnabled() && bleService) {
1663 RawAddress addr(address);
1664 return bleService->ReadRemoteRssiValue(addr);
1665 } else {
1666 HILOGE("BT current state is not enabled!");
1667 }
1668 return false;
1669 }
1670
RegisterRemoteDeviceObserver(const sptr<IBluetoothRemoteDeviceObserver> & observer)1671 void BluetoothHostServer::RegisterRemoteDeviceObserver(const sptr<IBluetoothRemoteDeviceObserver> &observer)
1672 {
1673 HILOGI("Enter!");
1674 if (observer == nullptr) {
1675 HILOGE("observer is nullptr!");
1676 return;
1677 }
1678 pimpl->remoteObserversToken_.EnsureInsert(observer->AsObject(), IPCSkeleton::GetCallingTokenID());
1679 pimpl->remoteObserversPid_.EnsureInsert(observer->AsObject(), IPCSkeleton::GetCallingUid());
1680 auto func = std::bind(&BluetoothHostServer::DeregisterRemoteDeviceObserver,
1681 this, std::placeholders::_1);
1682 pimpl->remoteObservers_.Register(observer, func);
1683 std::lock_guard<std::mutex> lock(pimpl->remoteDeviceObserversMutex);
1684 pimpl->remoteDeviceObservers_.push_back(observer);
1685 }
1686
DeregisterRemoteDeviceObserver(const sptr<IBluetoothRemoteDeviceObserver> & observer)1687 void BluetoothHostServer::DeregisterRemoteDeviceObserver(const sptr<IBluetoothRemoteDeviceObserver> &observer)
1688 {
1689 HILOGI("Enter!");
1690 if (observer == nullptr || pimpl == nullptr) {
1691 HILOGE("observer is nullptr!");
1692 return;
1693 }
1694 {
1695 std::lock_guard<std::mutex> lock(pimpl->remoteDeviceObserversMutex);
1696 for (auto iter = pimpl->remoteDeviceObservers_.begin(); iter != pimpl->remoteDeviceObservers_.end(); ++iter) {
1697 if ((*iter)->AsObject() == observer->AsObject()) {
1698 pimpl->remoteObservers_.Deregister(*iter);
1699 pimpl->remoteDeviceObservers_.erase(iter);
1700 break;
1701 }
1702 }
1703 }
1704 pimpl->remoteObserversToken_.Erase(observer->AsObject());
1705 pimpl->remoteObserversPid_.Erase(observer->AsObject());
1706 }
1707
IsBtEnabled()1708 bool BluetoothHostServer::IsBtEnabled()
1709 {
1710 int32_t state = static_cast<int32_t>(BluetoothState::STATE_OFF);
1711 GetBtState(state);
1712 bool isEnabled = (state == static_cast<int32_t>(BluetoothState::STATE_ON)) ? true : false;
1713 HILOGI("%{public}s", isEnabled ? "true" : "false");
1714 return isEnabled;
1715 }
1716
RegisterBleAdapterObserver(const sptr<IBluetoothHostObserver> & observer)1717 void BluetoothHostServer::RegisterBleAdapterObserver(const sptr<IBluetoothHostObserver> &observer)
1718 {
1719 HILOGI("start.");
1720 if (observer == nullptr) {
1721 HILOGE("observer is nullptr!");
1722 return;
1723 }
1724 pimpl->bleObserversToken_.EnsureInsert(observer->AsObject(), IPCSkeleton::GetCallingTokenID());
1725 pimpl->bleObserversPid_.EnsureInsert(observer->AsObject(), IPCSkeleton::GetCallingUid());
1726 auto func = std::bind(&BluetoothHostServer::DeregisterBleAdapterObserver, this, std::placeholders::_1);
1727 pimpl->bleObservers_.Register(observer, func);
1728 std::lock_guard<std::mutex> lock(pimpl->bleAdapterObserversMutex);
1729 pimpl->bleAdapterObservers_.push_back(observer);
1730 }
1731
DeregisterBleAdapterObserver(const sptr<IBluetoothHostObserver> & observer)1732 void BluetoothHostServer::DeregisterBleAdapterObserver(const sptr<IBluetoothHostObserver> &observer)
1733 {
1734 HILOGI("start.");
1735 if (observer == nullptr || pimpl == nullptr) {
1736 HILOGE("observer is nullptr!");
1737 return;
1738 }
1739 {
1740 std::lock_guard<std::mutex> lock(pimpl->bleAdapterObserversMutex);
1741 for (auto iter = pimpl->bleAdapterObservers_.begin(); iter != pimpl->bleAdapterObservers_.end(); ++iter) {
1742 if ((*iter)->AsObject() == observer->AsObject()) {
1743 pimpl->bleObservers_.Deregister(*iter);
1744 pimpl->bleAdapterObservers_.erase(iter);
1745 break;
1746 }
1747 }
1748 }
1749 pimpl->bleObserversToken_.Erase(observer->AsObject());
1750 pimpl->bleObserversPid_.Erase(observer->AsObject());
1751 }
1752
RegisterBlePeripheralCallback(const sptr<IBluetoothBlePeripheralObserver> & observer)1753 void BluetoothHostServer::RegisterBlePeripheralCallback(const sptr<IBluetoothBlePeripheralObserver> &observer)
1754 {
1755 HILOGI("start.");
1756 if (observer == nullptr) {
1757 HILOGE("observer is nullptr!");
1758 return;
1759 }
1760 pimpl->bleRemoteObserversToken_.EnsureInsert(observer->AsObject(), IPCSkeleton::GetCallingTokenID());
1761 auto func = std::bind(&BluetoothHostServer::DeregisterBlePeripheralCallback, this, std::placeholders::_1);
1762 pimpl->bleRemoteObservers_.Register(observer, func);
1763 std::lock_guard<std::mutex> lock(pimpl->blePeripheralObserversMutex);
1764 pimpl->blePeripheralObservers_.push_back(observer);
1765 }
1766
DeregisterBlePeripheralCallback(const sptr<IBluetoothBlePeripheralObserver> & observer)1767 void BluetoothHostServer::DeregisterBlePeripheralCallback(const sptr<IBluetoothBlePeripheralObserver> &observer)
1768 {
1769 HILOGI("start.");
1770 if (observer == nullptr) {
1771 HILOGE("observer is nullptr!");
1772 return;
1773 }
1774 {
1775 std::lock_guard<std::mutex> lock(pimpl->blePeripheralObserversMutex);
1776 for (auto iter = pimpl->blePeripheralObservers_.begin(); iter != pimpl->blePeripheralObservers_.end(); ++iter) {
1777 if ((*iter)->AsObject() == observer->AsObject()) {
1778 if (pimpl != nullptr) {
1779 pimpl->bleRemoteObservers_.Deregister(*iter);
1780 pimpl->blePeripheralObservers_.erase(iter);
1781 break;
1782 }
1783 }
1784 }
1785 }
1786 pimpl->bleRemoteObserversToken_.Erase(observer->AsObject());
1787 }
1788
Dump(int32_t fd,const std::vector<std::u16string> & args)1789 int32_t BluetoothHostServer::Dump(int32_t fd, const std::vector<std::u16string> &args)
1790 {
1791 HILOGI("fd: %{public}d", fd);
1792 std::vector<std::string> argsInStr8;
1793 std::transform(args.begin(), args.end(), std::back_inserter(argsInStr8), [](const std::u16string &arg) {
1794 return Str16ToStr8(arg);
1795 });
1796
1797 std::string result;
1798 BluetoothHostDumper::BluetoothDump(argsInStr8, result);
1799
1800 if (!SaveStringToFd(fd, result)) {
1801 HILOGE("bluetooth dump save string to fd failed!");
1802 return ERR_INVALID_OPERATION;
1803 }
1804 return ERR_OK;
1805 }
1806
SetFastScan(bool isEnable)1807 int32_t BluetoothHostServer::SetFastScan(bool isEnable)
1808 {
1809 return NO_ERROR;
1810 }
1811
GetRandomAddress(const std::string & realAddr,std::string & randomAddr)1812 int32_t BluetoothHostServer::GetRandomAddress(const std::string &realAddr, std::string &randomAddr)
1813 {
1814 return NO_ERROR;
1815 }
1816
SyncRandomAddress(const std::string & realAddr,const std::string & randomAddr)1817 int32_t BluetoothHostServer::SyncRandomAddress(const std::string &realAddr, const std::string &randomAddr)
1818 {
1819 return NO_ERROR;
1820 }
1821
StartCrediblePair(int32_t transport,const std::string & address)1822 int32_t BluetoothHostServer::StartCrediblePair(int32_t transport, const std::string &address)
1823 {
1824 if (!PermissionUtils::CheckSystemHapApp()) {
1825 HILOGE("check system api failed.");
1826 return BT_ERR_SYSTEM_PERMISSION_FAILED;
1827 }
1828 return NO_ERROR;
1829 }
1830
SatelliteControl(int type,int state)1831 int32_t BluetoothHostServer::SatelliteControl(int type, int state)
1832 {
1833 return BT_ERR_API_NOT_SUPPORT;
1834 }
1835
ConnectAllowedProfiles(const std::string & address)1836 int32_t BluetoothHostServer::ConnectAllowedProfiles(const std::string &address)
1837 {
1838 return BT_ERR_API_NOT_SUPPORT;
1839 }
1840
DisconnectAllowedProfiles(const std::string & address)1841 int32_t BluetoothHostServer::DisconnectAllowedProfiles(const std::string &address)
1842 {
1843 return BT_ERR_API_NOT_SUPPORT;
1844 }
1845
SetDeviceCustomType(const std::string & address,int32_t deviceType)1846 int32_t BluetoothHostServer::SetDeviceCustomType(const std::string &address, int32_t deviceType)
1847 {
1848 return BT_ERR_API_NOT_SUPPORT;
1849 }
1850
GetRemoteDeviceInfo(const std::string & address,std::shared_ptr<BluetoothRemoteDeviceInfo> & deviceInfo,int type)1851 int32_t BluetoothHostServer::GetRemoteDeviceInfo(const std::string &address,
1852 std::shared_ptr<BluetoothRemoteDeviceInfo> &deviceInfo, int type)
1853 {
1854 return BT_ERR_API_NOT_SUPPORT;
1855 }
1856
UpdateVirtualDevice(int32_t action,const std::string & address)1857 void BluetoothHostServer::UpdateVirtualDevice(int32_t action, const std::string &address)
1858 {}
1859
IsSupportVirtualAutoConnect(const std::string & address,bool & outSupport)1860 int32_t BluetoothHostServer::IsSupportVirtualAutoConnect(const std::string &address, bool &outSupport)
1861 {
1862 outSupport = false;
1863 return BT_ERR_API_NOT_SUPPORT;
1864 }
1865
SetVirtualAutoConnectType(const std::string & address,int connType,int businessType)1866 int32_t BluetoothHostServer::SetVirtualAutoConnectType(const std::string &address, int connType, int businessType)
1867 {
1868 return BT_ERR_API_NOT_SUPPORT;
1869 }
1870
SetFastScanLevel(int level)1871 int32_t BluetoothHostServer::SetFastScanLevel(int level)
1872 {
1873 return BT_ERR_API_NOT_SUPPORT;
1874 }
1875
RegisterBtResourceManagerObserver(const sptr<IBluetoothResourceManagerObserver> & observer)1876 void BluetoothHostServer::RegisterBtResourceManagerObserver(const sptr<IBluetoothResourceManagerObserver> &observer)
1877 {}
1878
DeregisterBtResourceManagerObserver(const sptr<IBluetoothResourceManagerObserver> & observer)1879 void BluetoothHostServer::DeregisterBtResourceManagerObserver(const sptr<IBluetoothResourceManagerObserver> &observer)
1880 {}
1881
EnableBluetoothToRestrictMode(void)1882 int32_t BluetoothHostServer::EnableBluetoothToRestrictMode(void)
1883 {
1884 return BT_ERR_API_NOT_SUPPORT;
1885 }
1886 } // namespace Bluetooth
1887 } // namespace OHOS
1888