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