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