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
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
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
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
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
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
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
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
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
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
338 void OnAclStateChanged(const RawAddress &device, int state, unsigned int reason) override
339 {
340 return;
341 }
342
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
GetBtState(int32_t &state)802 int32_t BluetoothHostServer::GetBtState(int32_t &state)
803 {
804 state = IAdapterManager::GetInstance()->GetState(bluetooth::BTTransport::ADAPTER_BREDR);
805 HILOGI("state: %{public}d", state);
806 return NO_ERROR;
807 }
808
GetProfile(const std::string &name)809 sptr<IRemoteObject> BluetoothHostServer::GetProfile(const std::string &name)
810 {
811 HILOGI("seraching %{public}s ", name.c_str());
812 sptr<IRemoteObject> object = nullptr;
813 if (pimpl->servers_.Find(name, object)) {
814 return object;
815 }
816 return object;
817 }
818
GetBleRemote(const std::string &name)819 sptr<IRemoteObject> BluetoothHostServer::GetBleRemote(const std::string &name)
820 {
821 HILOGI("GetBleRemote %{public}s ", name.c_str());
822 sptr<IRemoteObject> object = nullptr;
823 if (pimpl->bleServers_.Find(name, object)) {
824 return object;
825 }
826 return object;
827 }
828
829 // Fac_Res_CODE
BluetoothFactoryReset()830 int32_t BluetoothHostServer::BluetoothFactoryReset()
831 {
832 bool ret = IAdapterManager::GetInstance()->FactoryReset();
833 return ret ? BT_NO_ERROR : BT_ERR_INTERNAL_ERROR;
834 }
835
GetDeviceType(int32_t transport, const std::string &address)836 int32_t BluetoothHostServer::GetDeviceType(int32_t transport, const std::string &address)
837 {
838 HILOGI("transport: %{public}d, address: %{public}s", transport, GetEncryptAddr(address).c_str());
839 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
840 auto bleService = IAdapterManager::GetInstance()->GetBleAdapterInterface();
841 RawAddress addr(address);
842 if ((transport == BTTransport::ADAPTER_BREDR) && IsBtEnabled() && classicService) {
843 return classicService->GetDeviceType(addr);
844 } else if ((transport == BTTransport::ADAPTER_BLE) && IsBleEnabled() && bleService) {
845 return bleService->GetDeviceType(addr);
846 } else {
847 HILOGE("transport invalid or BT current state is not enabled!");
848 }
849 return INVALID_VALUE;
850 }
851
GetLocalAddress(std::string &addr)852 int32_t BluetoothHostServer::GetLocalAddress(std::string &addr)
853 {
854 HILOGI("Enter!");
855 if (PermissionUtils::VerifyAccessBluetoothPermission() == PERMISSION_DENIED) {
856 HILOGE("false, check Access permission failed");
857 return BT_ERR_PERMISSION_FAILED;
858 }
859 if (PermissionUtils::VerifyGetBluetoothLocalMacPermission() == PERMISSION_DENIED) {
860 HILOGE("false, check GetLocalMac permission failed");
861 return BT_ERR_PERMISSION_FAILED;
862 }
863 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
864 auto bleService = IAdapterManager::GetInstance()->GetBleAdapterInterface();
865 if (IsBtEnabled() && classicService) {
866 addr = classicService->GetLocalAddress();
867 return NO_ERROR;
868 } else if (IsBleEnabled() && bleService) {
869 addr = bleService->GetLocalAddress();
870 return NO_ERROR;
871 } else {
872 HILOGW("BT current state is not enabled!");
873 return BT_ERR_INVALID_STATE;
874 }
875 }
876
EnableBle()877 int32_t BluetoothHostServer::EnableBle()
878 {
879 HILOGI("Enter!");
880 if (IAdapterManager::GetInstance()->Enable(BTTransport::ADAPTER_BLE)) {
881 return NO_ERROR;
882 }
883 return BT_ERR_INTERNAL_ERROR;
884 }
885
DisableBle()886 int32_t BluetoothHostServer::DisableBle()
887 {
888 HILOGI("Enter!");
889 if (IAdapterManager::GetInstance()->Disable(BTTransport::ADAPTER_BLE)) {
890 return NO_ERROR;
891 }
892 return BT_ERR_INTERNAL_ERROR;
893 }
894
IsBrEnabled()895 bool BluetoothHostServer::IsBrEnabled()
896 {
897 return IsBtEnabled();
898 }
899
IsBleEnabled()900 bool BluetoothHostServer::IsBleEnabled()
901 {
902 return IAdapterManager::GetInstance()->GetState(BTTransport::ADAPTER_BLE) == BTStateID::STATE_TURN_ON;
903 }
904
GetProfileList()905 std::vector<uint32_t> BluetoothHostServer::GetProfileList()
906 {
907 HILOGI("Enter!");
908 return IProfileManager::GetInstance()->GetProfileServicesList();
909 }
910
GetMaxNumConnectedAudioDevices()911 int32_t BluetoothHostServer::GetMaxNumConnectedAudioDevices()
912 {
913 HILOGI("Enter!");
914 return IAdapterManager::GetInstance()->GetMaxNumConnectedAudioDevices();
915 }
916
GetBtConnectionState(int32_t &state)917 int32_t BluetoothHostServer::GetBtConnectionState(int32_t &state)
918 {
919 if (PermissionUtils::VerifyUseBluetoothPermission() == PERMISSION_DENIED) {
920 HILOGE("false, check permission failed");
921 return BT_ERR_PERMISSION_FAILED;
922 }
923 if (IsBtEnabled()) {
924 state = (int32_t)IAdapterManager::GetInstance()->GetAdapterConnectState();
925 HILOGI("state: %{public}d", state);
926 return NO_ERROR;
927 } else {
928 HILOGW("BT current state is not enabled!");
929 return BT_ERR_INVALID_STATE;
930 }
931 }
932
GetBtProfileConnState(uint32_t profileId, int &state)933 int32_t BluetoothHostServer::GetBtProfileConnState(uint32_t profileId, int &state)
934 {
935 HILOGI("Enter!");
936 if (PermissionUtils::VerifyUseBluetoothPermission() == PERMISSION_DENIED) {
937 HILOGE("false, check permission failed");
938 return BT_ERR_PERMISSION_FAILED;
939 }
940 if (IsBtEnabled()) {
941 state = (int32_t)IProfileManager::GetInstance()->GetProfileServiceConnectState(profileId);
942 return NO_ERROR;
943 } else {
944 HILOGW("BT current state is not enabled!");
945 return BT_ERR_INVALID_STATE;
946 }
947 }
948
GetLocalSupportedUuids(std::vector<std::string> &uuids)949 void BluetoothHostServer::GetLocalSupportedUuids(std::vector<std::string> &uuids)
950 {
951 HILOGI("Enter!");
952 IProfileManager::GetInstance()->GetProfileServicesSupportedUuids(uuids);
953 }
954
GetLocalDeviceClass()955 int32_t BluetoothHostServer::GetLocalDeviceClass()
956 {
957 HILOGI("Enter!");
958 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
959 if (IsBtEnabled() && classicService) {
960 return classicService->GetLocalDeviceClass();
961 } else {
962 HILOGW("BT current state is not enabled!");
963 }
964 return 0;
965 }
966
SetLocalDeviceClass(const int32_t &deviceClass)967 bool BluetoothHostServer::SetLocalDeviceClass(const int32_t &deviceClass)
968 {
969 HILOGI("Enter!");
970 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
971 if (IsBtEnabled() && classicService) {
972 return classicService->SetLocalDeviceClass(deviceClass);
973 } else {
974 HILOGW("BT current state is not enabled!");
975 }
976 return false;
977 }
978
GetLocalName(std::string &name)979 int32_t BluetoothHostServer::GetLocalName(std::string &name)
980 {
981 HILOGI("Enter!");
982 if (PermissionUtils::VerifyUseBluetoothPermission() == PERMISSION_DENIED) {
983 HILOGE("false, check permission failed");
984 return BT_ERR_PERMISSION_FAILED;
985 }
986 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
987 auto bleService = IAdapterManager::GetInstance()->GetBleAdapterInterface();
988 if (IsBtEnabled() && classicService) {
989 name = classicService->GetLocalName();
990 return NO_ERROR;
991 } else if (IsBleEnabled() && bleService) {
992 name = bleService->GetLocalName();
993 return NO_ERROR;
994 } else {
995 HILOGW("BT current state is not enabled!");
996 return BT_ERR_INVALID_STATE;
997 }
998 }
999
SetLocalName(const std::string &name)1000 int32_t BluetoothHostServer::SetLocalName(const std::string &name)
1001 {
1002 HILOGI("name: %{public}s", name.c_str());
1003 int api12 = 12;
1004 if (!PermissionUtils::CheckSystemHapApp() && PermissionUtils::GetApiVersion() >= api12) {
1005 return BT_ERR_API_NOT_SUPPORT;
1006 }
1007 if (PermissionUtils::VerifyDiscoverBluetoothPermission() == PERMISSION_DENIED) {
1008 HILOGE("false, check permission failed");
1009 return BT_ERR_PERMISSION_FAILED;
1010 }
1011 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
1012 auto bleService = IAdapterManager::GetInstance()->GetBleAdapterInterface();
1013 if (IsBtEnabled() && classicService) {
1014 bool ret = classicService->SetLocalName(name);
1015 if (ret && (IsBleEnabled() && bleService)) {
1016 if (bleService->SetLocalName(name)) {
1017 return NO_ERROR;
1018 }
1019 } else {
1020 HILOGE("failed!");
1021 return BT_ERR_INTERNAL_ERROR;
1022 }
1023 } else if (IsBleEnabled() && bleService) {
1024 if (bleService->SetLocalName(name)) {
1025 return NO_ERROR;
1026 }
1027 } else {
1028 HILOGW("BT current state is not enabled!");
1029 return BT_ERR_INVALID_STATE;
1030 }
1031 return BT_ERR_INTERNAL_ERROR;
1032 }
1033
GetBtScanMode(int32_t &scanMode)1034 int32_t BluetoothHostServer::GetBtScanMode(int32_t &scanMode)
1035 {
1036 HILOGI("Enter!");
1037 if (PermissionUtils::VerifyUseBluetoothPermission() == PERMISSION_DENIED) {
1038 HILOGE("false, check permission failed");
1039 return BT_ERR_PERMISSION_FAILED;
1040 }
1041 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
1042 if (IsBtEnabled() && classicService) {
1043 scanMode = classicService->GetBtScanMode();
1044 return NO_ERROR;
1045 } else {
1046 HILOGW("BT current state is not enabled!");
1047 return BT_ERR_INVALID_STATE;
1048 }
1049 }
1050
SetBtScanMode(int32_t mode, int32_t duration)1051 int32_t BluetoothHostServer::SetBtScanMode(int32_t mode, int32_t duration)
1052 {
1053 HILOGI("mode: %{public}d, duration: %{public}d", mode, duration);
1054 if (PermissionUtils::VerifyUseBluetoothPermission() == PERMISSION_DENIED) {
1055 HILOGE("false, check permission failed");
1056 return BT_ERR_PERMISSION_FAILED;
1057 }
1058 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
1059 if (IsBtEnabled() && classicService) {
1060 if (classicService->SetBtScanMode(mode, duration)) {
1061 return NO_ERROR;
1062 }
1063 } else {
1064 HILOGW("BT current state is not enabled!");
1065 return BT_ERR_INVALID_STATE;
1066 }
1067 return BT_ERR_INTERNAL_ERROR;
1068 }
1069
GetBondableMode(int32_t transport)1070 int32_t BluetoothHostServer::GetBondableMode(int32_t transport)
1071 {
1072 HILOGI("transport: %{public}d", transport);
1073 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
1074 auto bleService = IAdapterManager::GetInstance()->GetBleAdapterInterface();
1075 if ((transport == BTTransport::ADAPTER_BREDR) && IsBtEnabled() && classicService) {
1076 return classicService->GetBondableMode();
1077 } else if ((transport == BTTransport::ADAPTER_BLE) && IsBleEnabled() && bleService) {
1078 return bleService->GetBondableMode();
1079 } else {
1080 HILOGE("Parameter::transport invalid or BT current state is not enabled!");
1081 }
1082 return BONDABLE_MODE_OFF;
1083 }
1084
SetBondableMode(int32_t transport, int32_t mode)1085 bool BluetoothHostServer::SetBondableMode(int32_t transport, int32_t mode)
1086 {
1087 HILOGI("transport: %{public}d, mode: %{public}d", transport, mode);
1088 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
1089 auto bleService = IAdapterManager::GetInstance()->GetBleAdapterInterface();
1090 if ((transport == BTTransport::ADAPTER_BREDR) && IsBtEnabled() && classicService) {
1091 return classicService->SetBondableMode(mode);
1092 } else if ((transport == BTTransport::ADAPTER_BLE) && IsBleEnabled() && bleService) {
1093 return bleService->SetBondableMode(mode);
1094 } else {
1095 HILOGE("Parameter::transport invalid or BT current state is not enabled!");
1096 }
1097 return false;
1098 }
1099
StartBtDiscovery()1100 int32_t BluetoothHostServer::StartBtDiscovery()
1101 {
1102 HILOGI("Enter!");
1103 if (PermissionUtils::VerifyDiscoverBluetoothPermission() == PERMISSION_DENIED) {
1104 HILOGE("false, check permission failed");
1105 return BT_ERR_PERMISSION_FAILED;
1106 }
1107 if (PermissionUtils::VerifyApproximatelyPermission() == PERMISSION_DENIED &&
1108 PermissionUtils::VerifyLocationPermission() == PERMISSION_DENIED) {
1109 HILOGE("No location permission");
1110 return BT_ERR_PERMISSION_FAILED;
1111 }
1112 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
1113 if (IsBtEnabled() && classicService) {
1114 if (classicService->StartBtDiscovery()) {
1115 return NO_ERROR;
1116 }
1117 } else {
1118 HILOGW("BT current state is not enabled!");
1119 return BT_ERR_INVALID_STATE;
1120 }
1121 return BT_ERR_INTERNAL_ERROR;
1122 }
1123
CancelBtDiscovery()1124 int32_t BluetoothHostServer::CancelBtDiscovery()
1125 {
1126 HILOGI("Enter!");
1127 if (PermissionUtils::VerifyDiscoverBluetoothPermission() == PERMISSION_DENIED) {
1128 HILOGE("false, check permission failed");
1129 return BT_ERR_PERMISSION_FAILED;
1130 }
1131 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
1132 if (IsBtEnabled() && classicService) {
1133 if (classicService->CancelBtDiscovery()) {
1134 return NO_ERROR;
1135 }
1136 } else {
1137 HILOGW("BT current state is not enabled!");
1138 return BT_ERR_INVALID_STATE;
1139 }
1140 return BT_ERR_INTERNAL_ERROR;
1141 }
1142
IsBtDiscovering(bool &isDisCovering, int32_t transport)1143 int32_t BluetoothHostServer::IsBtDiscovering(bool &isDisCovering, int32_t transport)
1144 {
1145 HILOGI("transport: %{public}d", transport);
1146 if (PermissionUtils::VerifyAccessBluetoothPermission() == PERMISSION_DENIED) {
1147 HILOGE("false, check permission failed");
1148 return BT_ERR_PERMISSION_FAILED;
1149 }
1150 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
1151 auto bleService = IAdapterManager::GetInstance()->GetBleAdapterInterface();
1152 if ((transport == BTTransport::ADAPTER_BREDR) && IsBtEnabled() && classicService) {
1153 isDisCovering = classicService->IsBtDiscovering();
1154 } else if ((transport == BTTransport::ADAPTER_BLE) && IsBleEnabled() && bleService) {
1155 isDisCovering = bleService->IsBtDiscovering();
1156 } else {
1157 HILOGE("Parameter::transport invalid or BT current state is not enabled!");
1158 return BT_ERR_INVALID_STATE;
1159 }
1160 return BT_NO_ERROR;
1161 }
1162
GetBtDiscoveryEndMillis()1163 long BluetoothHostServer::GetBtDiscoveryEndMillis()
1164 {
1165 HILOGI("Enter!");
1166 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
1167 if (IsBtEnabled() && classicService) {
1168 return classicService->GetBtDiscoveryEndMillis();
1169 } else {
1170 HILOGW("BT current state is not enabled!");
1171 }
1172 return INVALID_VALUE;
1173 }
1174
GetPairedDevices(std::vector<BluetoothRawAddress> &pairedAddr)1175 int32_t BluetoothHostServer::GetPairedDevices(std::vector<BluetoothRawAddress> &pairedAddr)
1176 {
1177 HILOGI("GetPairedDevices");
1178 if (PermissionUtils::VerifyUseBluetoothPermission() == PERMISSION_DENIED) {
1179 HILOGE("false, check permission failed");
1180 return BT_ERR_SYSTEM_PERMISSION_FAILED;
1181 }
1182 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
1183 auto bleService = IAdapterManager::GetInstance()->GetBleAdapterInterface();
1184 std::vector<RawAddress> rawAddrVec;
1185 if (IsBtEnabled() && classicService) {
1186 rawAddrVec = classicService->GetPairedDevices();
1187 } else {
1188 HILOGE("transport invalid or BT current state is not enabled!");
1189 return BT_ERR_INVALID_STATE;
1190 }
1191 for (auto it = rawAddrVec.begin(); it != rawAddrVec.end(); ++it) {
1192 BluetoothRawAddress rawAddr = BluetoothRawAddress(*it);
1193 pairedAddr.emplace_back(rawAddr);
1194 }
1195 if (IsBleEnabled() && bleService) {
1196 rawAddrVec = bleService->GetPairedDevices();
1197 } else {
1198 HILOGE("transport invalid or BT current state is not enabled!");
1199 return BT_ERR_INVALID_STATE;
1200 }
1201
1202 for (auto it = rawAddrVec.begin(); it != rawAddrVec.end(); ++it) {
1203 BluetoothRawAddress rawAddr = BluetoothRawAddress(*it);
1204 pairedAddr.emplace_back(rawAddr);
1205 }
1206 return NO_ERROR;
1207 }
1208
GetTransportByDeviceType(int32_t transport, const std::string &address)1209 int BluetoothHostServer::GetTransportByDeviceType(int32_t transport, const std::string &address)
1210 {
1211 if (transport == BT_TRANSPORT_NONE) {
1212 int deviceType = GetDeviceType(BT_TRANSPORT_BREDR, address);
1213 if (deviceType == INVALID_TYPE || deviceType == DEVICE_TYPE_LE) {
1214 transport = BT_TRANSPORT_BLE;
1215 } else {
1216 transport = BT_TRANSPORT_BREDR;
1217 }
1218 }
1219 return transport;
1220 }
1221
RemovePair(int32_t transport, const sptr<BluetoothRawAddress> &device)1222 int32_t BluetoothHostServer::RemovePair(int32_t transport, const sptr<BluetoothRawAddress> &device)
1223 {
1224 if (device == nullptr) {
1225 HILOGE("device is nullptr.");
1226 return BT_ERR_INTERNAL_ERROR;
1227 }
1228 HILOGI("addr:%{public}s, transport:%{public}d", GET_ENCRYPT_ADDR(*device), transport);
1229 if (!PermissionUtils::CheckSystemHapApp()) {
1230 HILOGE("check system api failed.");
1231 return BT_ERR_SYSTEM_PERMISSION_FAILED;
1232 }
1233 if (PermissionUtils::VerifyDiscoverBluetoothPermission() == PERMISSION_DENIED) {
1234 HILOGE("check permission failed.");
1235 return BT_ERR_PERMISSION_FAILED;
1236 }
1237 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
1238 auto bleService = IAdapterManager::GetInstance()->GetBleAdapterInterface();
1239 transport = GetTransportByDeviceType(transport, device->GetAddress());
1240 if ((transport == BTTransport::ADAPTER_BREDR) && IsBtEnabled() && classicService) {
1241 if (classicService->RemovePair(*device)) {
1242 return NO_ERROR;
1243 }
1244 } else if ((transport == BTTransport::ADAPTER_BLE) && IsBleEnabled() && bleService) {
1245 if (bleService->RemovePair(*device)) {
1246 return NO_ERROR;
1247 }
1248 } else {
1249 HILOGE("transport invalid or BT/BLE current state is not enabled!");
1250 return BT_ERR_INVALID_STATE;
1251 }
1252 return BT_ERR_INTERNAL_ERROR;
1253 }
1254
RemoveAllPairs()1255 bool BluetoothHostServer::RemoveAllPairs()
1256 {
1257 HILOGI("Enter!");
1258 if (PermissionUtils::VerifyDiscoverBluetoothPermission() == PERMISSION_DENIED) {
1259 HILOGE("check permission failed");
1260 return false;
1261 }
1262 if (BTStateID::STATE_TURN_ON != IAdapterManager::GetInstance()->GetState(BTTransport::ADAPTER_BREDR) &&
1263 BTStateID::STATE_TURN_ON != IAdapterManager::GetInstance()->GetState(BTTransport::ADAPTER_BLE)) {
1264 HILOGW("BT current state is not enabled!");
1265 return false;
1266 }
1267
1268 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
1269 bool ret = true;
1270 if (IsBtEnabled() && classicService) {
1271 ret = classicService->RemoveAllPairs();
1272 if (!ret) {
1273 HILOGE("BREDR RemoveAllPairs failed");
1274 }
1275 }
1276
1277 auto bleService = IAdapterManager::GetInstance()->GetBleAdapterInterface();
1278 if (IsBleEnabled() && bleService) {
1279 ret &= bleService->RemoveAllPairs();
1280 if (!ret) {
1281 HILOGE("BLE RemoveAllPairs failed");
1282 }
1283 }
1284 return ret;
1285 }
1286
GetBleMaxAdvertisingDataLength()1287 int32_t BluetoothHostServer::GetBleMaxAdvertisingDataLength()
1288 {
1289 HILOGI("Enter!");
1290 auto bleService = IAdapterManager::GetInstance()->GetBleAdapterInterface();
1291 if (IsBleEnabled() && bleService) {
1292 return bleService->GetBleMaxAdvertisingDataLength();
1293 } else {
1294 HILOGW("BT current state is not enabled!");
1295 }
1296 return INVALID_VALUE;
1297 }
1298
GetPhonebookPermission(const std::string &address)1299 int32_t BluetoothHostServer::GetPhonebookPermission(const std::string &address)
1300 {
1301 HILOGI("address: %{public}s", GetEncryptAddr(address).c_str());
1302 return (int32_t)IAdapterManager::GetInstance()->GetPhonebookPermission(address);
1303 }
1304
SetPhonebookPermission(const std::string &address, int32_t permission)1305 bool BluetoothHostServer::SetPhonebookPermission(const std::string &address, int32_t permission)
1306 {
1307 HILOGI("address: %{public}s, permission: %{public}d", GetEncryptAddr(address).c_str(), permission);
1308 return IAdapterManager::GetInstance()->SetPhonebookPermission(address, (BTPermissionType)permission);
1309 }
1310
GetMessagePermission(const std::string &address)1311 int32_t BluetoothHostServer::GetMessagePermission(const std::string &address)
1312 {
1313 HILOGI("address: %{public}s", GetEncryptAddr(address).c_str());
1314 return (int32_t)IAdapterManager::GetInstance()->GetMessagePermission(address);
1315 }
1316
SetMessagePermission(const std::string &address, int32_t permission)1317 bool BluetoothHostServer::SetMessagePermission(const std::string &address, int32_t permission)
1318 {
1319 HILOGI("address: %{public}s, permission: %{public}d", GetEncryptAddr(address).c_str(), permission);
1320 return IAdapterManager::GetInstance()->SetMessagePermission(address, (BTPermissionType)permission);
1321 }
1322
GetPowerMode(const std::string &address)1323 int32_t BluetoothHostServer::GetPowerMode(const std::string &address)
1324 {
1325 HILOGI("address: %{public}s", GetEncryptAddr(address).c_str());
1326 return IAdapterManager::GetInstance()->GetPowerMode(address);
1327 }
1328
GetDeviceName(int32_t transport, const std::string &address, std::string &name)1329 int32_t BluetoothHostServer::GetDeviceName(int32_t transport, const std::string &address, std::string &name)
1330 {
1331 if (PermissionUtils::VerifyUseBluetoothPermission() == PERMISSION_DENIED) {
1332 HILOGE("false, check permission failed");
1333 return BT_ERR_PERMISSION_FAILED;
1334 }
1335 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
1336 auto bleService = IAdapterManager::GetInstance()->GetBleAdapterInterface();
1337 RawAddress addr(address);
1338 transport = GetTransportByDeviceType(transport, address);
1339 if ((transport == BT_TRANSPORT_BREDR) && IsBtEnabled() && classicService) {
1340 name = classicService->GetDeviceName(addr);
1341 return NO_ERROR;
1342 } else if ((transport == BT_TRANSPORT_BLE) && IsBleEnabled() && bleService) {
1343 name = bleService->GetDeviceName(addr);
1344 return NO_ERROR;
1345 } else {
1346 HILOGE("transport invalid or BT current state is not enabled!");
1347 return BT_ERR_INVALID_STATE;
1348 }
1349 }
1350
GetDeviceAlias(const std::string &address)1351 std::string BluetoothHostServer::GetDeviceAlias(const std::string &address)
1352 {
1353 HILOGI("address: %{public}s", GetEncryptAddr(address).c_str());
1354 if (PermissionUtils::VerifyUseBluetoothPermission() == PERMISSION_DENIED) {
1355 HILOGE("false, check permission failed");
1356 return INVALID_NAME;
1357 }
1358 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
1359 if (IsBtEnabled() && classicService) {
1360 RawAddress addr(address);
1361 return classicService->GetAliasName(addr);
1362 } else {
1363 HILOGE("BT current state is not enabled");
1364 }
1365 return INVALID_NAME;
1366 }
1367
SetDeviceAlias(const std::string &address, const std::string &aliasName)1368 int32_t BluetoothHostServer::SetDeviceAlias(const std::string &address, const std::string &aliasName)
1369 {
1370 HILOGI("address: %{public}s, aliasName: %{public}s", GetEncryptAddr(address).c_str(), aliasName.c_str());
1371 if (PermissionUtils::VerifyUseBluetoothPermission() == PERMISSION_DENIED) {
1372 HILOGE("false, check permission failed");
1373 return BT_ERR_PERMISSION_FAILED;
1374 }
1375 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
1376 if (IsBtEnabled() && classicService) {
1377 RawAddress addr(address);
1378 return classicService->SetAliasName(addr, aliasName) ? BT_NO_ERROR : BT_ERR_INVALID_PARAM;
1379 } else {
1380 HILOGE("BT current state is not enabled");
1381 }
1382 return BT_ERR_INVALID_STATE;
1383 }
1384
GetRemoteDeviceBatteryInfo(const std::string &address, BluetoothBatteryInfo &batteryInfo)1385 int32_t BluetoothHostServer::GetRemoteDeviceBatteryInfo(const std::string &address,
1386 BluetoothBatteryInfo &batteryInfo)
1387 {
1388 return BT_ERR_INTERNAL_ERROR;
1389 }
1390
GetPairState(int32_t transport, const std::string &address, int32_t &pairState)1391 int32_t BluetoothHostServer::GetPairState(int32_t transport, const std::string &address, int32_t &pairState)
1392 {
1393 HILOGI("transport: %{public}d, address: %{public}s", transport, GetEncryptAddr(address).c_str());
1394 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
1395 auto bleService = IAdapterManager::GetInstance()->GetBleAdapterInterface();
1396 RawAddress addr(address);
1397 if ((transport == BT_TRANSPORT_BREDR) && IsBtEnabled() && classicService) {
1398 pairState = classicService->GetPairState(addr);
1399 } else if ((transport == BT_TRANSPORT_BLE) && IsBleEnabled() && bleService) {
1400 pairState = bleService->GetPairState(addr);
1401 } else {
1402 HILOGE("transport invalid or BT current state is not enabled!");
1403 }
1404 return BT_NO_ERROR;
1405 }
1406
StartPair(int32_t transport, const std::string &address)1407 int32_t BluetoothHostServer::StartPair(int32_t transport, const std::string &address)
1408 {
1409 HILOGI("transport: %{public}d, address: %{public}s", transport, GetEncryptAddr(address).c_str());
1410 if (PermissionUtils::VerifyDiscoverBluetoothPermission() == PERMISSION_DENIED) {
1411 HILOGE("StartPair false, check permission failed");
1412 return BT_ERR_PERMISSION_FAILED;
1413 }
1414 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
1415 auto bleService = IAdapterManager::GetInstance()->GetBleAdapterInterface();
1416 RawAddress addr(address);
1417 transport = GetTransportByDeviceType(transport, address);
1418 if ((transport == BT_TRANSPORT_BREDR) && IsBtEnabled() && classicService) {
1419 if (classicService->StartPair(addr)) {
1420 return NO_ERROR;
1421 }
1422 } else if ((transport == BT_TRANSPORT_BLE) && IsBleEnabled() && bleService) {
1423 if (bleService->StartPair(addr)) {
1424 return NO_ERROR;
1425 }
1426 } else {
1427 HILOGE("transport invalid or BT current state is not enabled!");
1428 return BT_ERR_INVALID_STATE;
1429 }
1430 return BT_ERR_INTERNAL_ERROR;
1431 }
1432
CancelPairing(int32_t transport, const std::string &address)1433 bool BluetoothHostServer::CancelPairing(int32_t transport, const std::string &address)
1434 {
1435 HILOGI("transport: %{public}d, address: %{public}s", transport, GetEncryptAddr(address).c_str());
1436 if (!PermissionUtils::CheckSystemHapApp()) {
1437 HILOGE("check system api failed.");
1438 return BT_ERR_SYSTEM_PERMISSION_FAILED;
1439 }
1440 if (PermissionUtils::VerifyDiscoverBluetoothPermission() == PERMISSION_DENIED) {
1441 HILOGE("false, check permission failed");
1442 return false;
1443 }
1444 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
1445 auto bleService = IAdapterManager::GetInstance()->GetBleAdapterInterface();
1446 RawAddress addr(address);
1447 transport = GetTransportByDeviceType(transport, address);
1448 if ((transport == BT_TRANSPORT_BREDR) && IsBtEnabled() && classicService) {
1449 return classicService->CancelPairing(addr);
1450 } else if ((transport == BT_TRANSPORT_BLE) && IsBleEnabled() && bleService) {
1451 return bleService->CancelPairing(addr);
1452 } else {
1453 HILOGE("transport invalid or BT current state is not enabled!");
1454 }
1455 return false;
1456 }
1457
IsBondedFromLocal(int32_t transport, const std::string &address)1458 bool BluetoothHostServer::IsBondedFromLocal(int32_t transport, const std::string &address)
1459 {
1460 HILOGI("transport: %{public}d, address: %{public}s", transport, GetEncryptAddr(address).c_str());
1461 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
1462 auto bleService = IAdapterManager::GetInstance()->GetBleAdapterInterface();
1463 RawAddress addr(address);
1464 if ((transport == BT_TRANSPORT_BREDR) && IsBtEnabled() && classicService) {
1465 return classicService->IsBondedFromLocal(addr);
1466 } else if ((transport == BT_TRANSPORT_BLE) && IsBleEnabled() && bleService) {
1467 return bleService->IsBondedFromLocal(addr);
1468 } else {
1469 HILOGE("transport invalid or BT current state is not enabled!");
1470 }
1471 return false;
1472 }
1473
IsAclConnected(int32_t transport, const std::string &address)1474 bool BluetoothHostServer::IsAclConnected(int32_t transport, const std::string &address)
1475 {
1476 HILOGI("transport: %{public}d, address: %{public}s", transport, GetEncryptAddr(address).c_str());
1477 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
1478 auto bleService = IAdapterManager::GetInstance()->GetBleAdapterInterface();
1479 RawAddress addr(address);
1480 if ((transport == BT_TRANSPORT_BREDR) && IsBtEnabled() && classicService) {
1481 return classicService->IsAclConnected(addr);
1482 } else if ((transport == BT_TRANSPORT_BLE) && IsBleEnabled() && bleService) {
1483 return bleService->IsAclConnected(addr);
1484 } else {
1485 HILOGE("transport invalid or BT current state is not enabled!");
1486 }
1487 return false;
1488 }
1489
IsAclEncrypted(int32_t transport, const std::string &address)1490 bool BluetoothHostServer::IsAclEncrypted(int32_t transport, const std::string &address)
1491 {
1492 HILOGI("transport: %{public}d, address: %{public}s", transport, GetEncryptAddr(address).c_str());
1493 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
1494 auto bleService = IAdapterManager::GetInstance()->GetBleAdapterInterface();
1495 RawAddress addr(address);
1496 if ((transport == BT_TRANSPORT_BREDR) && IsBtEnabled() && classicService) {
1497 return classicService->IsAclEncrypted(addr);
1498 } else if ((transport == BT_TRANSPORT_BLE) && IsBleEnabled() && bleService) {
1499 return bleService->IsAclEncrypted(addr);
1500 } else {
1501 HILOGE("transport invalid or BT current state is not enabled!");
1502 }
1503 return false;
1504 }
1505
GetDeviceClass(const std::string &address, int32_t &cod)1506 int32_t BluetoothHostServer::GetDeviceClass(const std::string &address, int32_t &cod)
1507 {
1508 HILOGI("address: %{public}s", GetEncryptAddr(address).c_str());
1509 if (PermissionUtils::VerifyUseBluetoothPermission() == PERMISSION_DENIED) {
1510 HILOGE("false, check permission failed");
1511 return BT_ERR_PERMISSION_FAILED;
1512 }
1513 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
1514 if (IsBtEnabled() && classicService) {
1515 RawAddress addr(address);
1516 cod = classicService->GetDeviceClass(addr);
1517 } else {
1518 HILOGE("BT current state is not enabled!");
1519 return BT_ERR_INVALID_STATE;
1520 }
1521 return NO_ERROR;
1522 }
1523
GetDeviceUuids(const std::string &address, std::vector<std::string> &uuids)1524 int32_t BluetoothHostServer::GetDeviceUuids(const std::string &address, std::vector<std::string> &uuids)
1525 {
1526 std::vector<bluetooth::Uuid> parcelUuids;
1527 RawAddress addr(address);
1528 if (!IsBtEnabled()) {
1529 HILOGE("BT current state is not enabled");
1530 return BT_ERR_INVALID_STATE;
1531 }
1532
1533 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
1534 if (classicService) {
1535 parcelUuids = classicService->GetDeviceUuids(addr);
1536 }
1537 for (auto Uuid : parcelUuids) {
1538 uuids.push_back(Uuid.ToString());
1539 }
1540 return NO_ERROR;
1541 }
1542
GetLocalProfileUuids(std::vector<std::string> &uuids)1543 int32_t BluetoothHostServer::GetLocalProfileUuids(std::vector<std::string> &uuids)
1544 {
1545 return NO_ERROR;
1546 }
1547
SetDevicePin(const std::string &address, const std::string &pin)1548 int32_t BluetoothHostServer::SetDevicePin(const std::string &address, const std::string &pin)
1549 {
1550 HILOGI("address: %{public}s, pin: %{public}s", GetEncryptAddr(address).c_str(), pin.c_str());
1551 if (PermissionUtils::VerifyManageBluetoothPermission() == PERMISSION_DENIED) {
1552 HILOGE("false, check permission failed");
1553 return BT_ERR_PERMISSION_FAILED;
1554 }
1555 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
1556 if (IsBtEnabled() && classicService) {
1557 RawAddress addr(address);
1558 if (classicService->SetDevicePin(addr, pin)) {
1559 return NO_ERROR;
1560 }
1561 } else {
1562 HILOGE("BT current state is not enabled!");
1563 return BT_ERR_INVALID_STATE;
1564 }
1565 return BT_ERR_INTERNAL_ERROR;
1566 }
1567
SetDevicePairingConfirmation(int32_t transport, const std::string &address, bool accept)1568 int32_t BluetoothHostServer::SetDevicePairingConfirmation(int32_t transport, const std::string &address, bool accept)
1569 {
1570 HILOGI("transport: %{public}d, address: %{public}s, accept: %{public}d",
1571 transport, GetEncryptAddr(address).c_str(), accept);
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 auto bleService = IAdapterManager::GetInstance()->GetBleAdapterInterface();
1578 RawAddress addr(address);
1579 transport = GetTransportByDeviceType(transport, address);
1580 if ((transport == BT_TRANSPORT_BREDR) && IsBtEnabled() && classicService) {
1581 if (classicService->SetDevicePairingConfirmation(addr, accept)) {
1582 return NO_ERROR;
1583 }
1584 } else if ((transport == BT_TRANSPORT_BLE) && IsBleEnabled() && bleService) {
1585 if (bleService->SetDevicePairingConfirmation(addr, accept)) {
1586 return NO_ERROR;
1587 }
1588 } else {
1589 HILOGE("transport invalid or BT current state is not enabled!");
1590 return BT_ERR_INVALID_STATE;
1591 }
1592 return BT_ERR_INTERNAL_ERROR;
1593 }
1594
SetDevicePasskey(int32_t transport, const std::string &address, int32_t passkey, bool accept)1595 bool BluetoothHostServer::SetDevicePasskey(int32_t transport, const std::string &address, int32_t passkey, bool accept)
1596 {
1597 HILOGI("transport: %{public}d, address: %{public}s, passkey: %{public}d, accept: %{public}d",
1598 transport, GetEncryptAddr(address).c_str(), passkey, accept);
1599 if (PermissionUtils::VerifyManageBluetoothPermission() == PERMISSION_DENIED) {
1600 HILOGE("false, check permission failed");
1601 return false;
1602 }
1603 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
1604 auto bleService = IAdapterManager::GetInstance()->GetBleAdapterInterface();
1605 RawAddress addr(address);
1606 if ((transport == BT_TRANSPORT_BREDR) && IsBtEnabled() && classicService) {
1607 return classicService->SetDevicePasskey(addr, passkey, accept);
1608 } else if ((transport == BT_TRANSPORT_BLE) && IsBleEnabled() && bleService) {
1609 return bleService->SetDevicePasskey(addr, passkey, accept);
1610 } else {
1611 HILOGE("transport invalid or BT current state is not enabled!");
1612 }
1613 return false;
1614 }
1615
PairRequestReply(int32_t transport, const std::string &address, bool accept)1616 bool BluetoothHostServer::PairRequestReply(int32_t transport, const std::string &address, bool accept)
1617 {
1618 HILOGI("transport: %{public}d, address: %{public}s, accept: %{public}d",
1619 transport, GetEncryptAddr(address).c_str(), accept);
1620 auto classicService = IAdapterManager::GetInstance()->GetClassicAdapterInterface();
1621 auto bleService = IAdapterManager::GetInstance()->GetBleAdapterInterface();
1622 RawAddress addr(address);
1623 if ((transport == BT_TRANSPORT_BREDR) && IsBtEnabled() && classicService) {
1624 return classicService->PairRequestReply(addr, accept);
1625 } else if ((transport == BT_TRANSPORT_BLE) && IsBleEnabled() && bleService) {
1626 return bleService->PairRequestReply(addr, accept);
1627 } else {
1628 HILOGE("transport invalid or BT current state is not enabled!");
1629 }
1630 return false;
1631 }
1632
ReadRemoteRssiValue(const std::string &address)1633 bool BluetoothHostServer::ReadRemoteRssiValue(const std::string &address)
1634 {
1635 HILOGI("address: %{public}s", GetEncryptAddr(address).c_str());
1636 if (PermissionUtils::VerifyUseBluetoothPermission() == PERMISSION_DENIED) {
1637 HILOGE("false, check permission failed");
1638 return false;
1639 }
1640 auto bleService = IAdapterManager::GetInstance()->GetBleAdapterInterface();
1641 if (IsBleEnabled() && bleService) {
1642 RawAddress addr(address);
1643 return bleService->ReadRemoteRssiValue(addr);
1644 } else {
1645 HILOGE("BT current state is not enabled!");
1646 }
1647 return false;
1648 }
1649
RegisterRemoteDeviceObserver(const sptr<IBluetoothRemoteDeviceObserver> &observer)1650 void BluetoothHostServer::RegisterRemoteDeviceObserver(const sptr<IBluetoothRemoteDeviceObserver> &observer)
1651 {
1652 HILOGI("Enter!");
1653 if (observer == nullptr) {
1654 HILOGE("observer is nullptr!");
1655 return;
1656 }
1657 pimpl->remoteObserversToken_.EnsureInsert(observer->AsObject(), IPCSkeleton::GetCallingTokenID());
1658 pimpl->remoteObserversPid_.EnsureInsert(observer->AsObject(), IPCSkeleton::GetCallingUid());
1659 auto func = std::bind(&BluetoothHostServer::DeregisterRemoteDeviceObserver,
1660 this, std::placeholders::_1);
1661 pimpl->remoteObservers_.Register(observer, func);
1662 std::lock_guard<std::mutex> lock(pimpl->remoteDeviceObserversMutex);
1663 pimpl->remoteDeviceObservers_.push_back(observer);
1664 }
1665
DeregisterRemoteDeviceObserver(const sptr<IBluetoothRemoteDeviceObserver> &observer)1666 void BluetoothHostServer::DeregisterRemoteDeviceObserver(const sptr<IBluetoothRemoteDeviceObserver> &observer)
1667 {
1668 HILOGI("Enter!");
1669 if (observer == nullptr || pimpl == nullptr) {
1670 HILOGE("observer is nullptr!");
1671 return;
1672 }
1673 {
1674 std::lock_guard<std::mutex> lock(pimpl->remoteDeviceObserversMutex);
1675 for (auto iter = pimpl->remoteDeviceObservers_.begin(); iter != pimpl->remoteDeviceObservers_.end(); ++iter) {
1676 if ((*iter)->AsObject() == observer->AsObject()) {
1677 pimpl->remoteObservers_.Deregister(*iter);
1678 pimpl->remoteDeviceObservers_.erase(iter);
1679 break;
1680 }
1681 }
1682 }
1683 pimpl->remoteObserversToken_.Erase(observer->AsObject());
1684 pimpl->remoteObserversPid_.Erase(observer->AsObject());
1685 }
1686
IsBtEnabled()1687 bool BluetoothHostServer::IsBtEnabled()
1688 {
1689 int32_t state = bluetooth::BTStateID::STATE_TURN_OFF;
1690 GetBtState(state);
1691 bool isEnabled = (state == static_cast<int32_t>(bluetooth::BTStateID::STATE_TURN_ON)) ? true : false;
1692 HILOGI("%{public}s", isEnabled ? "true" : "false");
1693 return isEnabled;
1694 }
1695
RegisterBleAdapterObserver(const sptr<IBluetoothHostObserver> &observer)1696 void BluetoothHostServer::RegisterBleAdapterObserver(const sptr<IBluetoothHostObserver> &observer)
1697 {
1698 HILOGI("start.");
1699 if (observer == nullptr) {
1700 HILOGE("observer is nullptr!");
1701 return;
1702 }
1703 pimpl->bleObserversToken_.EnsureInsert(observer->AsObject(), IPCSkeleton::GetCallingTokenID());
1704 pimpl->bleObserversPid_.EnsureInsert(observer->AsObject(), IPCSkeleton::GetCallingUid());
1705 auto func = std::bind(&BluetoothHostServer::DeregisterBleAdapterObserver, this, std::placeholders::_1);
1706 pimpl->bleObservers_.Register(observer, func);
1707 std::lock_guard<std::mutex> lock(pimpl->bleAdapterObserversMutex);
1708 pimpl->bleAdapterObservers_.push_back(observer);
1709 }
1710
DeregisterBleAdapterObserver(const sptr<IBluetoothHostObserver> &observer)1711 void BluetoothHostServer::DeregisterBleAdapterObserver(const sptr<IBluetoothHostObserver> &observer)
1712 {
1713 HILOGI("start.");
1714 if (observer == nullptr || pimpl == nullptr) {
1715 HILOGE("observer is nullptr!");
1716 return;
1717 }
1718 {
1719 std::lock_guard<std::mutex> lock(pimpl->bleAdapterObserversMutex);
1720 for (auto iter = pimpl->bleAdapterObservers_.begin(); iter != pimpl->bleAdapterObservers_.end(); ++iter) {
1721 if ((*iter)->AsObject() == observer->AsObject()) {
1722 pimpl->bleObservers_.Deregister(*iter);
1723 pimpl->bleAdapterObservers_.erase(iter);
1724 break;
1725 }
1726 }
1727 }
1728 pimpl->bleObserversToken_.Erase(observer->AsObject());
1729 pimpl->bleObserversPid_.Erase(observer->AsObject());
1730 }
1731
RegisterBlePeripheralCallback(const sptr<IBluetoothBlePeripheralObserver> &observer)1732 void BluetoothHostServer::RegisterBlePeripheralCallback(const sptr<IBluetoothBlePeripheralObserver> &observer)
1733 {
1734 HILOGI("start.");
1735 if (observer == nullptr) {
1736 HILOGE("observer is nullptr!");
1737 return;
1738 }
1739 pimpl->bleRemoteObserversToken_.EnsureInsert(observer->AsObject(), IPCSkeleton::GetCallingTokenID());
1740 auto func = std::bind(&BluetoothHostServer::DeregisterBlePeripheralCallback, this, std::placeholders::_1);
1741 pimpl->bleRemoteObservers_.Register(observer, func);
1742 std::lock_guard<std::mutex> lock(pimpl->blePeripheralObserversMutex);
1743 pimpl->blePeripheralObservers_.push_back(observer);
1744 }
1745
DeregisterBlePeripheralCallback(const sptr<IBluetoothBlePeripheralObserver> &observer)1746 void BluetoothHostServer::DeregisterBlePeripheralCallback(const sptr<IBluetoothBlePeripheralObserver> &observer)
1747 {
1748 HILOGI("start.");
1749 if (observer == nullptr) {
1750 HILOGE("observer is nullptr!");
1751 return;
1752 }
1753 {
1754 std::lock_guard<std::mutex> lock(pimpl->blePeripheralObserversMutex);
1755 for (auto iter = pimpl->blePeripheralObservers_.begin(); iter != pimpl->blePeripheralObservers_.end(); ++iter) {
1756 if ((*iter)->AsObject() == observer->AsObject()) {
1757 if (pimpl != nullptr) {
1758 pimpl->bleRemoteObservers_.Deregister(*iter);
1759 pimpl->blePeripheralObservers_.erase(iter);
1760 break;
1761 }
1762 }
1763 }
1764 }
1765 pimpl->bleRemoteObserversToken_.Erase(observer->AsObject());
1766 }
1767
Dump(int32_t fd, const std::vector<std::u16string> &args)1768 int32_t BluetoothHostServer::Dump(int32_t fd, const std::vector<std::u16string> &args)
1769 {
1770 HILOGI("fd: %{public}d", fd);
1771 std::vector<std::string> argsInStr8;
1772 std::transform(args.begin(), args.end(), std::back_inserter(argsInStr8), [](const std::u16string &arg) {
1773 return Str16ToStr8(arg);
1774 });
1775
1776 std::string result;
1777 BluetoothHostDumper::BluetoothDump(argsInStr8, result);
1778
1779 if (!SaveStringToFd(fd, result)) {
1780 HILOGE("bluetooth dump save string to fd failed!");
1781 return ERR_INVALID_OPERATION;
1782 }
1783 return ERR_OK;
1784 }
1785
SetFastScan(bool isEnable)1786 int32_t BluetoothHostServer::SetFastScan(bool isEnable)
1787 {
1788 return NO_ERROR;
1789 }
1790
GetRandomAddress(const std::string &realAddr, std::string &randomAddr)1791 int32_t BluetoothHostServer::GetRandomAddress(const std::string &realAddr, std::string &randomAddr)
1792 {
1793 return NO_ERROR;
1794 }
1795
SyncRandomAddress(const std::string &realAddr, const std::string &randomAddr)1796 int32_t BluetoothHostServer::SyncRandomAddress(const std::string &realAddr, const std::string &randomAddr)
1797 {
1798 return NO_ERROR;
1799 }
1800
StartCrediblePair(int32_t transport, const std::string &address)1801 int32_t BluetoothHostServer::StartCrediblePair(int32_t transport, const std::string &address)
1802 {
1803 if (!PermissionUtils::CheckSystemHapApp()) {
1804 HILOGE("check system api failed.");
1805 return BT_ERR_SYSTEM_PERMISSION_FAILED;
1806 }
1807 return NO_ERROR;
1808 }
1809
SatelliteControl(int type, int state)1810 int32_t BluetoothHostServer::SatelliteControl(int type, int state)
1811 {
1812 return BT_ERR_API_NOT_SUPPORT;
1813 }
1814
ConnectAllowedProfiles(const std::string &address)1815 int32_t BluetoothHostServer::ConnectAllowedProfiles(const std::string &address)
1816 {
1817 return BT_ERR_API_NOT_SUPPORT;
1818 }
1819
DisconnectAllowedProfiles(const std::string &address)1820 int32_t BluetoothHostServer::DisconnectAllowedProfiles(const std::string &address)
1821 {
1822 return BT_ERR_API_NOT_SUPPORT;
1823 }
1824
SetDeviceCustomType(const std::string &address, int32_t deviceType)1825 int32_t BluetoothHostServer::SetDeviceCustomType(const std::string &address, int32_t deviceType)
1826 {
1827 return BT_ERR_API_NOT_SUPPORT;
1828 }
1829
GetRemoteDeviceInfo(const std::string &address, std::shared_ptr<BluetoothRemoteDeviceInfo> &deviceInfo, int type)1830 int32_t BluetoothHostServer::GetRemoteDeviceInfo(const std::string &address,
1831 std::shared_ptr<BluetoothRemoteDeviceInfo> &deviceInfo, int type)
1832 {
1833 return BT_ERR_API_NOT_SUPPORT;
1834 }
1835
RegisterBtResourceManagerObserver(const sptr<IBluetoothResourceManagerObserver> &observer)1836 void BluetoothHostServer::RegisterBtResourceManagerObserver(const sptr<IBluetoothResourceManagerObserver> &observer)
1837 {}
1838
DeregisterBtResourceManagerObserver(const sptr<IBluetoothResourceManagerObserver> &observer)1839 void BluetoothHostServer::DeregisterBtResourceManagerObserver(const sptr<IBluetoothResourceManagerObserver> &observer)
1840 {}
1841
UpdateVirtualDevice(int32_t action, const std::string &address)1842 void BluetoothHostServer::UpdateVirtualDevice(int32_t action, const std::string &address)
1843 {}
1844
IsSupportVirtualAutoConnect(const std::string &address, bool &outSupport)1845 int32_t BluetoothHostServer::IsSupportVirtualAutoConnect(const std::string &address, bool &outSupport)
1846 {
1847 outSupport = false;
1848 return BT_ERR_API_NOT_SUPPORT;
1849 }
1850
SetVirtualAutoConnectType(const std::string &address, int connType, int businessType)1851 int32_t BluetoothHostServer::SetVirtualAutoConnectType(const std::string &address, int connType, int businessType)
1852 {
1853 return BT_ERR_API_NOT_SUPPORT;
1854 }
1855
SetFastScanLevel(int level)1856 int32_t BluetoothHostServer::SetFastScanLevel(int level)
1857 {
1858 return BT_ERR_API_NOT_SUPPORT;
1859 }
1860
EnableBluetoothToRestrictMode(void)1861 int32_t BluetoothHostServer::EnableBluetoothToRestrictMode(void)
1862 {
1863 return BT_ERR_API_NOT_SUPPORT;
1864 }
1865 } // namespace Bluetooth
1866 } // namespace OHOS
1867