1 /*
2  * Copyright (C) 2021 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 #ifndef LOG_TAG
16 #define LOG_TAG "bt_fwk_ble_advertiser"
17 #endif
18 
19 #include "bluetooth_ble_advertiser.h"
20 
21 #include "bluetooth_ble_advertise_callback_stub.h"
22 #include "bluetooth_def.h"
23 #include "bluetooth_host.h"
24 #include "bluetooth_log.h"
25 #include "bluetooth_observer_map.h"
26 #include "bluetooth_utils.h"
27 #include "i_bluetooth_ble_advertiser.h"
28 #include "iservice_registry.h"
29 #include "system_ability_definition.h"
30 #include "securec.h"
31 
32 #include <memory>
33 #include "bluetooth_profile_manager.h"
34 
35 namespace OHOS {
36 namespace Bluetooth {
37 using namespace OHOS::bluetooth;
38 struct BleAdvertiser::impl {
39     impl();
40     ~impl();
41     void Init(std::weak_ptr<BleAdvertiser> advertiser);
42     void ConvertBleAdvertiserData(const BleAdvertiserData &data, BluetoothBleAdvertiserData &outData);
43     uint32_t GetAdvertiserTotalBytes(const BluetoothBleAdvertiserData &data, bool isFlagsIncluded);
44     int32_t CheckAdvertiserSettings(const BleAdvertiserSettings &settings);
45     int32_t CheckAdvertiserData(const BluetoothBleAdvertiserSettings &setting,
46         const BluetoothBleAdvertiserData &advData, const BluetoothBleAdvertiserData &scanResponse);
47 
48     class BluetoothBleAdvertiserCallbackImp : public BluetoothBleAdvertiseCallbackStub {
49     public:
BluetoothBleAdvertiserCallbackImp(std::weak_ptr<BleAdvertiser> advertiser)50         explicit BluetoothBleAdvertiserCallbackImp(std::weak_ptr<BleAdvertiser> advertiser)
51             : advertiser_(advertiser){};
~BluetoothBleAdvertiserCallbackImp()52         ~BluetoothBleAdvertiserCallbackImp()
53         {}
54 
55         __attribute__((no_sanitize("cfi")))
OnStartResultEvent(int32_t result,int32_t advHandle,int32_t opcode)56         void OnStartResultEvent(int32_t result, int32_t advHandle, int32_t opcode) override
57         {
58             std::shared_ptr<BleAdvertiser> advertiserSptr = advertiser_.lock();
59             CHECK_AND_RETURN_LOG(advertiserSptr, "BleAdvertiser is destructed");
60 
61             HILOGD("result: %{public}d, advHandle: %{public}d, opcode: %{public}d", result, advHandle, opcode);
62             std::shared_ptr<BleAdvertiseCallback> observer = nullptr;
63             if (opcode == bluetooth::BLE_ADV_START_FAILED_OP_CODE) {
64                 observer = advertiserSptr->pimpl->callbacks_.PopAdvertiserObserver(advHandle);
65             } else {
66                 observer = advertiserSptr->pimpl->callbacks_.GetAdvertiserObserver(advHandle);
67             }
68 
69             if (observer != nullptr) {
70                 observer->OnStartResultEvent(result, advHandle);
71             }
72         }
73 
OnEnableResultEvent(int32_t result,int32_t advHandle)74         void OnEnableResultEvent(int32_t result, int32_t advHandle) override
75         {
76             std::shared_ptr<BleAdvertiser> advertiserSptr = advertiser_.lock();
77             CHECK_AND_RETURN_LOG(advertiserSptr, "BleAdvertiser is destructed");
78 
79             HILOGI("result: %{public}d, advHandle: %{public}d", result, advHandle);
80             auto observer = advertiserSptr->pimpl->callbacks_.GetAdvertiserObserver(advHandle);
81             if (observer != nullptr) {
82                 observer->OnEnableResultEvent(result, advHandle);
83             }
84         }
85 
OnDisableResultEvent(int32_t result,int32_t advHandle)86         void OnDisableResultEvent(int32_t result, int32_t advHandle) override
87         {
88             std::shared_ptr<BleAdvertiser> advertiserSptr = advertiser_.lock();
89             CHECK_AND_RETURN_LOG(advertiserSptr, "BleAdvertiser is destructed");
90 
91             HILOGI("result: %{public}d, advHandle: %{public}d", result, advHandle);
92             auto observer = advertiserSptr->pimpl->callbacks_.GetAdvertiserObserver(advHandle);
93             if (observer != nullptr) {
94                 observer->OnDisableResultEvent(result, advHandle);
95             }
96         }
97 
98         __attribute__((no_sanitize("cfi")))
OnStopResultEvent(int32_t result,int32_t advHandle)99         void OnStopResultEvent(int32_t result, int32_t advHandle) override
100         {
101             std::shared_ptr<BleAdvertiser> advertiserSptr = advertiser_.lock();
102             CHECK_AND_RETURN_LOG(advertiserSptr, "BleAdvertiser is destructed");
103 
104             HILOGD("result: %{public}d, advHandle: %{public}d", result, advHandle);
105             auto observer = advertiserSptr->pimpl->callbacks_.PopAdvertiserObserver(advHandle);
106             if (observer != nullptr) {
107                 observer->OnStopResultEvent(result, advHandle);
108             }
109         }
110 
OnAutoStopAdvEvent(int32_t advHandle)111         void OnAutoStopAdvEvent(int32_t advHandle) override
112         {
113             std::shared_ptr<BleAdvertiser> advertiserSptr = advertiser_.lock();
114             CHECK_AND_RETURN_LOG(advertiserSptr, "BleAdvertiser is destructed");
115 
116             HILOGI("advHandle: %{public}d", advHandle);
117             auto observer = advertiserSptr->pimpl->callbacks_.GetAdvertiserObserver(advHandle);
118             if (observer != nullptr) {
119                 advertiserSptr->pimpl->callbacks_.Deregister(observer);
120             }
121         }
122 
OnSetAdvDataEvent(int32_t result,int32_t advHandle)123         void OnSetAdvDataEvent(int32_t result, int32_t advHandle) override
124         {
125             std::shared_ptr<BleAdvertiser> advertiserSptr = advertiser_.lock();
126             CHECK_AND_RETURN_LOG(advertiserSptr, "BleAdvertiser is destructed");
127 
128             HILOGD("result: %{public}d, advHandle: %{public}d", result, advHandle);
129             auto observer = advertiserSptr->pimpl->callbacks_.GetAdvertiserObserver(advHandle);
130             if (observer) {
131                 observer->OnSetAdvDataEvent(result);
132             }
133         }
134 
135     private:
136         std::weak_ptr<BleAdvertiser> advertiser_;
137         BLUETOOTH_DISALLOW_COPY_AND_ASSIGN(BluetoothBleAdvertiserCallbackImp);
138     };
139     sptr<BluetoothBleAdvertiserCallbackImp> callbackImp_ = nullptr;
140 
141     BluetoothObserverMap<std::shared_ptr<BleAdvertiseCallback>> callbacks_;
142     class BleAdvertiserDeathRecipient;
143     sptr<BleAdvertiserDeathRecipient> deathRecipient_ = nullptr;
144     int32_t profileRegisterId = 0;
145 };
146 
147 class BleAdvertiser::impl::BleAdvertiserDeathRecipient final : public IRemoteObject::DeathRecipient {
148 public:
BleAdvertiserDeathRecipient(std::weak_ptr<BleAdvertiser> advertiser)149     explicit BleAdvertiserDeathRecipient(std::weak_ptr<BleAdvertiser> advertiser) : advertiser_(advertiser) {}
150     ~BleAdvertiserDeathRecipient() final = default;
151     BLUETOOTH_DISALLOW_COPY_AND_ASSIGN(BleAdvertiserDeathRecipient);
152 
OnRemoteDied(const wptr<IRemoteObject> & remote)153     void OnRemoteDied(const wptr<IRemoteObject> &remote) final
154     {
155         HILOGI("enter");
156 
157         std::shared_ptr<BleAdvertiser> advertiserSptr = advertiser_.lock();
158         CHECK_AND_RETURN_LOG(advertiserSptr, "BleAdvertiser is destructed");
159         advertiserSptr->pimpl->callbacks_.Clear();
160     }
161 
162 private:
163     std::weak_ptr<BleAdvertiser> advertiser_;
164 };
165 
impl()166 BleAdvertiser::impl::impl()
167 {}
168 
~impl()169 BleAdvertiser::impl::~impl()
170 {
171     HILOGD("start");
172     BluetoothProfileManager::GetInstance().DeregisterFunc(profileRegisterId);
173     callbacks_.Clear();
174     sptr<IBluetoothBleAdvertiser> proxy = GetRemoteProxy<IBluetoothBleAdvertiser>(BLE_ADVERTISER_SERVER);
175     CHECK_AND_RETURN_LOG(proxy != nullptr, "failed: no proxy");
176     proxy->DeregisterBleAdvertiserCallback(callbackImp_);
177     proxy->AsObject()->RemoveDeathRecipient(deathRecipient_);
178 }
179 
BleAdvertiser()180 BleAdvertiser::BleAdvertiser() : pimpl(nullptr)
181 {
182     if (pimpl == nullptr) {
183         pimpl = std::make_unique<impl>();
184         if (!pimpl) {
185             HILOGE("failed, no pimpl");
186         }
187     }
188 
189     HILOGI("successful");
190 }
191 
~BleAdvertiser()192 BleAdvertiser::~BleAdvertiser()
193 {}
194 
Init(std::weak_ptr<BleAdvertiser> advertiser)195 void BleAdvertiser::impl::Init(std::weak_ptr<BleAdvertiser> advertiser)
196 {
197     callbackImp_ = new BluetoothBleAdvertiserCallbackImp(advertiser);
198     profileRegisterId = BluetoothProfileManager::GetInstance().RegisterFunc(BLE_ADVERTISER_SERVER,
199         [this, advertiser](sptr<IRemoteObject> remote) {
200         sptr<IBluetoothBleAdvertiser> proxy = iface_cast<IBluetoothBleAdvertiser>(remote);
201         CHECK_AND_RETURN_LOG(proxy != nullptr, "failed: no proxy");
202         proxy->RegisterBleAdvertiserCallback(callbackImp_);
203         deathRecipient_ = new BleAdvertiserDeathRecipient(advertiser);
204         if (deathRecipient_ != nullptr) {
205             proxy->AsObject()->AddDeathRecipient(deathRecipient_);
206         }
207     });
208 }
209 
CreateInstance(void)210 std::shared_ptr<BleAdvertiser> BleAdvertiser::CreateInstance(void)
211 {
212     auto instance = std::make_shared<BleAdvertiser>(PassKey());
213     CHECK_AND_RETURN_LOG_RET(instance, nullptr, "Create BleAdvertiser failed");
214 
215     instance->pimpl->Init(instance);
216     return instance;
217 }
218 
ConvertBleAdvertiserData(const BleAdvertiserData & data,BluetoothBleAdvertiserData & outData)219 void BleAdvertiser::impl::ConvertBleAdvertiserData(const BleAdvertiserData &data, BluetoothBleAdvertiserData &outData)
220 {
221     std::map<uint16_t, std::string> manufacturerData = data.GetManufacturerData();
222     for (auto iter = manufacturerData.begin(); iter != manufacturerData.end(); iter++) {
223         outData.AddManufacturerData(iter->first, iter->second);
224     }
225     std::map<ParcelUuid, std::string> serviceData = data.GetServiceData();
226     for (auto it = serviceData.begin(); it != serviceData.end(); it++) {
227         outData.AddServiceData(Uuid::ConvertFromString(it->first.ToString()), it->second);
228     }
229     std::vector<ParcelUuid> serviceUuids = data.GetServiceUuids();
230     for (auto it = serviceUuids.begin(); it != serviceUuids.end(); it++) {
231         outData.AddServiceUuid(Uuid::ConvertFromString(it->ToString()));
232     }
233     outData.SetIncludeDeviceName(data.GetIncludeDeviceName());
234     outData.SetIncludeTxPower(data.GetIncludeTxPower());
235 }
236 
GetAdvertiserTotalBytes(const BluetoothBleAdvertiserData & data,bool isFlagsIncluded)237 uint32_t BleAdvertiser::impl::GetAdvertiserTotalBytes(const BluetoothBleAdvertiserData &data, bool isFlagsIncluded)
238 {
239     // If the flag field is contained, the protocol stack adds the flag field, which consists of three bytes.
240     uint32_t size = (isFlagsIncluded) ? BLE_ADV_FLAGS_FIELD_LENGTH : 0;
241     std::map<uint16_t, std::string> manufacturerData = data.GetManufacturerData();
242     for (auto iter = manufacturerData.begin(); iter != manufacturerData.end(); ++iter) {
243         size += BLE_ADV_PER_FIELD_OVERHEAD_LENGTH + BLE_ADV_MANUFACTURER_ID_LENGTH + iter->second.length();
244     }
245 
246     std::map<Uuid, std::string> serviceData = data.GetServiceData();
247     for (auto iter = serviceData.begin(); iter != serviceData.end(); ++iter) {
248         size += BLE_ADV_PER_FIELD_OVERHEAD_LENGTH + static_cast<uint32_t>(iter->first.GetUuidType())
249         + iter->second.length();
250     }
251     int num16BitUuids = 0;
252     int num32BitUuids = 0;
253     int num128BitUuids = 0;
254     std::vector<Uuid> serviceUuids = data.GetServiceUuids();
255     for (auto iter = serviceUuids.begin(); iter != serviceUuids.end(); ++iter) {
256         if (iter->GetUuidType() == Uuid::UUID16_BYTES_TYPE) {
257             ++num16BitUuids;
258         } else if (iter->GetUuidType() == Uuid::UUID32_BYTES_TYPE) {
259             ++num32BitUuids;
260         } else {
261             ++num128BitUuids;
262         }
263     }
264     if (num16BitUuids != 0) {
265         size += BLE_ADV_PER_FIELD_OVERHEAD_LENGTH + static_cast<uint32_t>(num16BitUuids * Uuid::UUID16_BYTES_TYPE);
266     }
267     if (num32BitUuids != 0) {
268         size += BLE_ADV_PER_FIELD_OVERHEAD_LENGTH + static_cast<uint32_t>(num32BitUuids * Uuid::UUID32_BYTES_TYPE);
269     }
270     if (num128BitUuids != 0) {
271         size += BLE_ADV_PER_FIELD_OVERHEAD_LENGTH + static_cast<uint32_t>(num128BitUuids * Uuid::UUID128_BYTES_TYPE);
272     }
273     if (data.GetIncludeDeviceName()) {
274         uint32_t deviceNameLen = BluetoothHost::GetDefaultHost().GetLocalName().length();
275         deviceNameLen = (deviceNameLen > DEVICE_NAME_MAX_LEN) ?  DEVICE_NAME_MAX_LEN : deviceNameLen;
276         size += BLE_ADV_PER_FIELD_OVERHEAD_LENGTH + deviceNameLen;
277     }
278     if (data.GetIncludeTxPower()) {
279         uint32_t txPowerLen = 3;
280         size += BLE_ADV_PER_FIELD_OVERHEAD_LENGTH + txPowerLen;
281     }
282     return size;
283 }
284 
CheckAdvertiserSettings(const BleAdvertiserSettings & settings)285 int32_t BleAdvertiser::impl::CheckAdvertiserSettings(const BleAdvertiserSettings &settings)
286 {
287     int8_t txPower = settings.GetTxPower();
288     if (txPower < BLE_ADV_TX_POWER_MIN_VALUE || txPower > BLE_ADV_TX_POWER_MAX_VALUE) {
289         HILOGE("Illegal txPower argument %{public}d", txPower);
290         return BT_ERR_INVALID_PARAM;
291     }
292 
293     return BT_NO_ERROR;
294 }
295 
CheckAdvertiserData(const BluetoothBleAdvertiserSettings & setting,const BluetoothBleAdvertiserData & advData,const BluetoothBleAdvertiserData & scanResponse)296 int32_t BleAdvertiser::impl::CheckAdvertiserData(const BluetoothBleAdvertiserSettings &setting,
297     const BluetoothBleAdvertiserData &advData, const BluetoothBleAdvertiserData &scanResponse)
298 {
299     uint32_t maxSize = BLE_ADV_MAX_LEGACY_ADVERTISING_DATA_BYTES;
300     if (!setting.IsLegacyMode()) {
301         maxSize = static_cast<uint32_t>(BluetoothHost::GetDefaultHost().GetBleMaxAdvertisingDataLength());
302     }
303     // If is Connect, flag field is contained in AdvertiserData.
304     uint32_t size = GetAdvertiserTotalBytes(advData, setting.IsConnectable());
305     if (size > maxSize) {
306         HILOGE("bleAdvertiserData size = %{public}d, maxSize = %{public}d", size, maxSize);
307         return BT_ERR_INTERNAL_ERROR;
308     }
309     size = GetAdvertiserTotalBytes(scanResponse, false);
310     if (size > maxSize) {
311         HILOGE("bleScanResponse size = %{public}d, maxSize = %{public}d,", size, maxSize);
312         return BT_ERR_INTERNAL_ERROR;
313     }
314     return BT_NO_ERROR;
315 }
316 
StartAdvertising(const BleAdvertiserSettings & settings,const BleAdvertiserData & advData,const BleAdvertiserData & scanResponse,uint16_t duration,std::shared_ptr<BleAdvertiseCallback> callback)317 int BleAdvertiser::StartAdvertising(const BleAdvertiserSettings &settings, const BleAdvertiserData &advData,
318     const BleAdvertiserData &scanResponse, uint16_t duration, std::shared_ptr<BleAdvertiseCallback> callback)
319 {
320     if (!IS_BLE_ENABLED()) {
321         HILOGE("bluetooth is off.");
322         return BT_ERR_INVALID_STATE;
323     }
324     sptr<IBluetoothBleAdvertiser> proxy = GetRemoteProxy<IBluetoothBleAdvertiser>(BLE_ADVERTISER_SERVER);
325     CHECK_AND_RETURN_LOG_RET(proxy != nullptr, BT_ERR_INTERNAL_ERROR, "failed: no proxy");
326     CHECK_AND_RETURN_LOG_RET(callback != nullptr, BT_ERR_INTERNAL_ERROR, "callback is nullptr");
327 
328     int ret = pimpl->CheckAdvertiserSettings(settings);
329     if (ret != BT_NO_ERROR) {
330         return ret;
331     }
332     BluetoothBleAdvertiserSettings setting;
333     setting.SetConnectable(settings.IsConnectable());
334     setting.SetInterval(settings.GetInterval());
335     setting.SetLegacyMode(settings.IsLegacyMode());
336     setting.SetTxPower(settings.GetTxPower());
337     setting.SetOwnAddr(settings.GetOwnAddr());
338     setting.SetOwnAddrType(settings.GetOwnAddrType());
339 
340     BluetoothBleAdvertiserData bleAdvertiserData;
341     BluetoothBleAdvertiserData bleScanResponse;
342     bleAdvertiserData.SetAdvFlag(advData.GetAdvFlag());
343     pimpl->ConvertBleAdvertiserData(advData, bleAdvertiserData);
344     pimpl->ConvertBleAdvertiserData(scanResponse, bleScanResponse);
345 
346     ret = pimpl->CheckAdvertiserData(setting, bleAdvertiserData, bleScanResponse);
347     if (ret != BT_NO_ERROR) {
348         return ret;
349     }
350 
351     HILOGD("duration=%{public}d", duration);
352     int32_t advHandle = BLE_INVALID_ADVERTISING_HANDLE;
353     if (pimpl->callbacks_.IsExistAdvertiserCallback(callback, advHandle)) {
354         ret = proxy->StartAdvertising(setting, bleAdvertiserData, bleScanResponse, advHandle, duration, false);
355     } else {
356         ret = proxy->GetAdvertiserHandle(advHandle);
357         if (ret != BT_NO_ERROR || advHandle == BLE_INVALID_ADVERTISING_HANDLE) {
358             HILOGE("Invalid advertising handle");
359             callback->OnStartResultEvent(BT_ERR_INTERNAL_ERROR, static_cast<int>(BLE_INVALID_ADVERTISING_HANDLE));
360             return ret;
361         }
362         callback->OnGetAdvHandleEvent(0, advHandle);
363         pimpl->callbacks_.Register(advHandle, callback);
364         ret = proxy->StartAdvertising(setting, bleAdvertiserData, bleScanResponse, advHandle, duration, false);
365     }
366     return ret;
367 }
368 
StartAdvertising(const BleAdvertiserSettings & settings,const std::vector<uint8_t> & advData,const std::vector<uint8_t> & scanResponse,uint16_t duration,std::shared_ptr<BleAdvertiseCallback> callback)369 int BleAdvertiser::StartAdvertising(const BleAdvertiserSettings &settings, const std::vector<uint8_t> &advData,
370     const std::vector<uint8_t> &scanResponse, uint16_t duration, std::shared_ptr<BleAdvertiseCallback> callback)
371 {
372     if (!IS_BLE_ENABLED()) {
373         HILOGE("bluetooth is off.");
374         return BT_ERR_INVALID_STATE;
375     }
376 
377     sptr<IBluetoothBleAdvertiser> proxy = GetRemoteProxy<IBluetoothBleAdvertiser>(BLE_ADVERTISER_SERVER);
378     CHECK_AND_RETURN_LOG_RET(proxy != nullptr, BT_ERR_INTERNAL_ERROR, "failed: no proxy");
379     CHECK_AND_RETURN_LOG_RET(callback != nullptr, BT_ERR_INTERNAL_ERROR, "callback is nullptr");
380 
381     int ret = pimpl->CheckAdvertiserSettings(settings);
382     if (ret != BT_NO_ERROR) {
383         return ret;
384     }
385     BluetoothBleAdvertiserSettings setting;
386     setting.SetConnectable(settings.IsConnectable());
387     setting.SetInterval(settings.GetInterval());
388     setting.SetLegacyMode(settings.IsLegacyMode());
389     setting.SetTxPower(settings.GetTxPower());
390     setting.SetOwnAddr(settings.GetOwnAddr());
391     setting.SetOwnAddrType(settings.GetOwnAddrType());
392 
393     BluetoothBleAdvertiserData bleAdvertiserData;
394     bleAdvertiserData.SetPayload(std::string(advData.begin(), advData.end()));
395     bleAdvertiserData.SetAdvFlag(0);
396     BluetoothBleAdvertiserData bleScanResponse;
397     bleScanResponse.SetPayload(std::string(scanResponse.begin(), scanResponse.end()));
398 
399     HILOGI("duration=%{public}d", duration);
400     int32_t advHandle = BLE_INVALID_ADVERTISING_HANDLE;
401     if (pimpl->callbacks_.IsExistAdvertiserCallback(callback, advHandle)) {
402         ret = proxy->StartAdvertising(setting, bleAdvertiserData, bleScanResponse, advHandle, duration, true);
403     } else {
404         ret = proxy->GetAdvertiserHandle(advHandle);
405         if (ret != BT_NO_ERROR || advHandle == BLE_INVALID_ADVERTISING_HANDLE) {
406             HILOGE("Invalid advertising handle");
407             callback->OnStartResultEvent(BT_ERR_INTERNAL_ERROR, BLE_INVALID_ADVERTISING_HANDLE);
408             return ret;
409         }
410         pimpl->callbacks_.Register(advHandle, callback);
411         ret = proxy->StartAdvertising(setting, bleAdvertiserData, bleScanResponse, advHandle, duration, true);
412     }
413     return ret;
414 }
415 
SetAdvertisingData(const std::vector<uint8_t> & advData,const std::vector<uint8_t> & scanResponse,std::shared_ptr<BleAdvertiseCallback> callback)416 void BleAdvertiser::SetAdvertisingData(const std::vector<uint8_t> &advData, const std::vector<uint8_t> &scanResponse,
417     std::shared_ptr<BleAdvertiseCallback> callback)
418 {
419     if (!IS_BLE_ENABLED()) {
420         HILOGE("bluetooth is off.");
421         return;
422     }
423     sptr<IBluetoothBleAdvertiser> proxy = GetRemoteProxy<IBluetoothBleAdvertiser>(BLE_ADVERTISER_SERVER);
424     CHECK_AND_RETURN_LOG(proxy != nullptr, "failed: no proxy");
425 
426     CHECK_AND_RETURN_LOG(callback != nullptr, "callback is nullptr");
427 
428     int advHandle = BLE_INVALID_ADVERTISING_HANDLE;
429     if (!pimpl->callbacks_.IsExistAdvertiserCallback(callback, advHandle)) {
430         HILOGE("Advertising is not started");
431         return;
432     }
433 
434     BluetoothBleAdvertiserData bleAdvertiserData;
435     bleAdvertiserData.SetPayload(std::string(advData.begin(), advData.end()));
436     BluetoothBleAdvertiserData bleScanResponse;
437     bleScanResponse.SetPayload(std::string(scanResponse.begin(), scanResponse.end()));
438     proxy->SetAdvertisingData(bleAdvertiserData, bleScanResponse, advHandle);
439 }
440 
EnableAdvertising(uint8_t advHandle,uint16_t duration,std::shared_ptr<BleAdvertiseCallback> callback)441 int BleAdvertiser::EnableAdvertising(uint8_t advHandle, uint16_t duration,
442     std::shared_ptr<BleAdvertiseCallback> callback)
443 {
444     HILOGI("enter");
445     if (!IS_BLE_ENABLED()) {
446         HILOGE("bluetooth is off.");
447         return BT_ERR_INVALID_STATE;
448     }
449     sptr<IBluetoothBleAdvertiser> proxy = GetRemoteProxy<IBluetoothBleAdvertiser>(BLE_ADVERTISER_SERVER);
450     CHECK_AND_RETURN_LOG_RET(proxy != nullptr, BT_ERR_INTERNAL_ERROR, "failed: no proxy");
451 
452     CHECK_AND_RETURN_LOG_RET(callback != nullptr, BT_ERR_INTERNAL_ERROR, "callback is nullptr");
453     uint8_t tmpAdvHandle = pimpl->callbacks_.GetAdvertiserHandle(callback);
454     if (tmpAdvHandle == BLE_INVALID_ADVERTISING_HANDLE) {
455         HILOGE("Invalid advertising callback");
456         return BT_ERR_INTERNAL_ERROR;
457     }
458 
459     std::shared_ptr<BleAdvertiseCallback> observer = pimpl->callbacks_.GetAdvertiserObserver(advHandle);
460     if (observer == nullptr) {
461         HILOGE("Invalid advertising handle");
462         return BT_ERR_INTERNAL_ERROR;
463     }
464 
465     int ret = proxy->EnableAdvertising(advHandle, duration);
466     return ret;
467 }
468 
DisableAdvertising(uint8_t advHandle,std::shared_ptr<BleAdvertiseCallback> callback)469 int BleAdvertiser::DisableAdvertising(uint8_t advHandle, std::shared_ptr<BleAdvertiseCallback> callback)
470 {
471     HILOGI("enter");
472     if (!IS_BLE_ENABLED()) {
473         HILOGE("bluetooth is off.");
474         return BT_ERR_INVALID_STATE;
475     }
476 
477     sptr<IBluetoothBleAdvertiser> proxy = GetRemoteProxy<IBluetoothBleAdvertiser>(BLE_ADVERTISER_SERVER);
478     CHECK_AND_RETURN_LOG_RET(proxy != nullptr, BT_ERR_INTERNAL_ERROR, "failed: no proxy");
479     CHECK_AND_RETURN_LOG_RET(callback != nullptr, BT_ERR_INTERNAL_ERROR, "callback is nullptr");
480     uint8_t tmpAdvHandle = pimpl->callbacks_.GetAdvertiserHandle(callback);
481     if (tmpAdvHandle == BLE_INVALID_ADVERTISING_HANDLE) {
482         HILOGE("Invalid advertising callback");
483         return BT_ERR_INTERNAL_ERROR;
484     }
485 
486     std::shared_ptr<BleAdvertiseCallback> observer = pimpl->callbacks_.GetAdvertiserObserver(advHandle);
487     if (observer == nullptr) {
488         HILOGE("Invalid advertising handle");
489         return BT_ERR_INTERNAL_ERROR;
490     }
491 
492     int ret = proxy->DisableAdvertising(advHandle);
493     return ret;
494 }
495 
StopAdvertising(std::shared_ptr<BleAdvertiseCallback> callback)496 int BleAdvertiser::StopAdvertising(std::shared_ptr<BleAdvertiseCallback> callback)
497 {
498     if (!IS_BLE_ENABLED()) {
499         HILOGE("bluetooth is off.");
500         return BT_ERR_INVALID_STATE;
501     }
502 
503     sptr<IBluetoothBleAdvertiser> proxy = GetRemoteProxy<IBluetoothBleAdvertiser>(BLE_ADVERTISER_SERVER);
504     CHECK_AND_RETURN_LOG_RET(proxy != nullptr, BT_ERR_INTERNAL_ERROR, "failed: no proxy");
505     CHECK_AND_RETURN_LOG_RET(callback != nullptr, BT_ERR_INTERNAL_ERROR, "callback is nullptr");
506 
507     HILOGD("enter");
508     uint8_t advHandle = pimpl->callbacks_.GetAdvertiserHandle(callback);
509     if (advHandle == BLE_INVALID_ADVERTISING_HANDLE) {
510         HILOGE("Invalid advertising handle");
511         return BT_ERR_INTERNAL_ERROR;
512     }
513 
514     int ret = proxy->StopAdvertising(advHandle);
515     return ret;
516 }
517 
Close(std::shared_ptr<BleAdvertiseCallback> callback)518 void BleAdvertiser::Close(std::shared_ptr<BleAdvertiseCallback> callback)
519 {
520     if (!IS_BLE_ENABLED()) {
521         HILOGE("BLE is not enabled");
522         return;
523     }
524 
525     sptr<IBluetoothBleAdvertiser> proxy = GetRemoteProxy<IBluetoothBleAdvertiser>(BLE_ADVERTISER_SERVER);
526     CHECK_AND_RETURN_LOG(proxy != nullptr, "proxy is nullptr");
527     CHECK_AND_RETURN_LOG(callback != nullptr, "callback is nullptr");
528 
529     HILOGI("enter");
530     if (proxy != nullptr) {
531         uint8_t advHandle = pimpl->callbacks_.GetAdvertiserHandle(callback);
532         if (advHandle != BLE_INVALID_ADVERTISING_HANDLE) {
533             proxy->Close(advHandle);
534         }
535 
536         std::shared_ptr<BleAdvertiseCallback> observer = pimpl->callbacks_.GetAdvertiserObserver(advHandle);
537         if (observer != nullptr) {
538             pimpl->callbacks_.Deregister(observer);
539         }
540     }
541 }
542 
GetAdvHandle(std::shared_ptr<BleAdvertiseCallback> callback)543 uint8_t BleAdvertiser::GetAdvHandle(std::shared_ptr<BleAdvertiseCallback> callback)
544 {
545     if (!BluetoothHost::GetDefaultHost().IsBleEnabled()) {
546         HILOGE("BLE is not enabled");
547         return BLE_INVALID_ADVERTISING_HANDLE;
548     }
549     CHECK_AND_RETURN_LOG_RET(callback != nullptr, BLE_INVALID_ADVERTISING_HANDLE, "callback is nullptr");
550     return pimpl->callbacks_.GetAdvertiserHandle(callback);
551 }
552 
BleAdvertiserData()553 BleAdvertiserData::BleAdvertiserData()
554 {}
555 
~BleAdvertiserData()556 BleAdvertiserData::~BleAdvertiserData()
557 {}
558 
AddServiceData(const ParcelUuid & uuid,const std::string & serviceData)559 void BleAdvertiserData::AddServiceData(const ParcelUuid &uuid, const std::string &serviceData)
560 {
561     if (serviceData.empty()) {
562         HILOGE("serviceData is empty");
563         return;
564     }
565 
566     serviceData_.insert(std::make_pair(uuid, serviceData));
567 }
568 
AddManufacturerData(uint16_t manufacturerId,const std::string & data)569 void BleAdvertiserData::AddManufacturerData(uint16_t manufacturerId, const std::string &data)
570 {
571     if (data.empty()) {
572         HILOGE("serviceData is empty");
573         return;
574     }
575 
576     manufacturerSpecificData_.insert(std::make_pair(manufacturerId, data));
577 }
578 
GetManufacturerData() const579 std::map<uint16_t, std::string> BleAdvertiserData::GetManufacturerData() const
580 {
581     return manufacturerSpecificData_;
582 }
583 
AddServiceUuid(const ParcelUuid & serviceUuid)584 void BleAdvertiserData::AddServiceUuid(const ParcelUuid &serviceUuid)
585 {
586     serviceUuids_.push_back(serviceUuid);
587 }
588 
GetServiceUuids() const589 std::vector<ParcelUuid> BleAdvertiserData::GetServiceUuids() const
590 {
591     return serviceUuids_;
592 }
593 
SetAdvFlag(uint8_t flag)594 void BleAdvertiserData::SetAdvFlag(uint8_t flag)
595 {
596     advFlag_ = flag;
597 }
598 
GetAdvFlag() const599 uint8_t BleAdvertiserData::GetAdvFlag() const
600 {
601     return advFlag_;
602 }
603 
GetServiceData() const604 std::map<ParcelUuid, std::string> BleAdvertiserData::GetServiceData() const
605 {
606     return serviceData_;
607 }
608 
GetIncludeDeviceName() const609 bool BleAdvertiserData::GetIncludeDeviceName() const
610 {
611     return includeDeviceName_;
612 }
613 
SetIncludeDeviceName(bool flag)614 void BleAdvertiserData::SetIncludeDeviceName(bool flag)
615 {
616     includeDeviceName_ = flag;
617 }
618 
GetIncludeTxPower() const619 bool BleAdvertiserData::GetIncludeTxPower() const
620 {
621     return includeTxPower_;
622 }
623 
SetIncludeTxPower(bool flag)624 void BleAdvertiserData::SetIncludeTxPower(bool flag)
625 {
626     includeTxPower_ = flag;
627 }
628 
BleAdvertiserSettings()629 BleAdvertiserSettings::BleAdvertiserSettings()
630 {}
631 
~BleAdvertiserSettings()632 BleAdvertiserSettings::~BleAdvertiserSettings()
633 {}
634 
SetConnectable(bool connectable)635 void BleAdvertiserSettings::SetConnectable(bool connectable)
636 {
637     connectable_ = connectable;
638 }
639 
IsConnectable() const640 bool BleAdvertiserSettings::IsConnectable() const
641 {
642     return connectable_;
643 }
644 
SetLegacyMode(bool legacyMode)645 void BleAdvertiserSettings::SetLegacyMode(bool legacyMode)
646 {
647     legacyMode_ = legacyMode;
648 }
649 
IsLegacyMode() const650 bool BleAdvertiserSettings::IsLegacyMode() const
651 {
652     return legacyMode_;
653 }
654 
SetInterval(uint16_t interval)655 void BleAdvertiserSettings::SetInterval(uint16_t interval)
656 {
657     interval_ = interval;
658 }
659 
GetInterval() const660 uint16_t BleAdvertiserSettings::GetInterval() const
661 {
662     return interval_;
663 }
664 
SetTxPower(int8_t txPower)665 void BleAdvertiserSettings::SetTxPower(int8_t txPower)
666 {
667     txPower_ = txPower;
668 }
669 
GetTxPower() const670 int8_t BleAdvertiserSettings::GetTxPower() const
671 {
672     return txPower_;
673 }
674 
GetPrimaryPhy() const675 int BleAdvertiserSettings::GetPrimaryPhy() const
676 {
677     return primaryPhy_;
678 }
679 
SetPrimaryPhy(int primaryPhy)680 void BleAdvertiserSettings::SetPrimaryPhy(int primaryPhy)
681 {
682     primaryPhy_ = primaryPhy;
683 }
684 
GetSecondaryPhy() const685 int BleAdvertiserSettings::GetSecondaryPhy() const
686 {
687     return secondaryPhy_;
688 }
689 
SetSecondaryPhy(int secondaryPhy)690 void BleAdvertiserSettings::SetSecondaryPhy(int secondaryPhy)
691 {
692     secondaryPhy_ = secondaryPhy;
693 }
694 
GetOwnAddr() const695 std::array<uint8_t, OHOS_BD_ADDR_LEN> BleAdvertiserSettings::GetOwnAddr() const
696 {
697     return ownAddr_;
698 }
699 
SetOwnAddr(const std::array<uint8_t,OHOS_BD_ADDR_LEN> & addr)700 void BleAdvertiserSettings::SetOwnAddr(const std::array<uint8_t, OHOS_BD_ADDR_LEN>& addr)
701 {
702     ownAddr_ = addr;
703 }
704 
GetOwnAddrType() const705 int8_t BleAdvertiserSettings::GetOwnAddrType() const
706 {
707     return ownAddrType_;
708 }
709 
SetOwnAddrType(int8_t addrType)710 void BleAdvertiserSettings::SetOwnAddrType(int8_t addrType)
711 {
712     ownAddrType_ = addrType;
713 }
714 }  // namespace Bluetooth
715 }  // namespace OHOS
716