• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
OnChangeAdvResultEvent(int32_t result,int32_t advHandle)135         void OnChangeAdvResultEvent(int32_t result, int32_t advHandle) override
136         {
137             std::shared_ptr<BleAdvertiser> advertiserSptr = advertiser_.lock();
138             CHECK_AND_RETURN_LOG(advertiserSptr, "BleAdvertiser is destructed");
139 
140             HILOGI("result: %{public}d, advHandle: %{public}d", result, advHandle);
141             auto observer = advertiserSptr->pimpl->callbacks_.GetAdvertiserObserver(advHandle);
142             if (observer != nullptr) {
143                 observer->OnChangeAdvResultEvent(result, advHandle);
144             }
145         }
146 
147     private:
148         std::weak_ptr<BleAdvertiser> advertiser_;
149         BLUETOOTH_DISALLOW_COPY_AND_ASSIGN(BluetoothBleAdvertiserCallbackImp);
150     };
151     sptr<BluetoothBleAdvertiserCallbackImp> callbackImp_ = nullptr;
152 
153     BluetoothObserverMap<std::shared_ptr<BleAdvertiseCallback>> callbacks_;
154     class BleAdvertiserDeathRecipient;
155     sptr<BleAdvertiserDeathRecipient> deathRecipient_ = nullptr;
156     int32_t profileRegisterId = 0;
157 };
158 
159 class BleAdvertiser::impl::BleAdvertiserDeathRecipient final : public IRemoteObject::DeathRecipient {
160 public:
BleAdvertiserDeathRecipient(std::weak_ptr<BleAdvertiser> advertiser)161     explicit BleAdvertiserDeathRecipient(std::weak_ptr<BleAdvertiser> advertiser) : advertiser_(advertiser) {}
162     ~BleAdvertiserDeathRecipient() final = default;
163     BLUETOOTH_DISALLOW_COPY_AND_ASSIGN(BleAdvertiserDeathRecipient);
164 
OnRemoteDied(const wptr<IRemoteObject> & remote)165     void OnRemoteDied(const wptr<IRemoteObject> &remote) final
166     {
167         HILOGI("enter");
168 
169         std::shared_ptr<BleAdvertiser> advertiserSptr = advertiser_.lock();
170         CHECK_AND_RETURN_LOG(advertiserSptr, "BleAdvertiser is destructed");
171         advertiserSptr->pimpl->callbacks_.Clear();
172     }
173 
174 private:
175     std::weak_ptr<BleAdvertiser> advertiser_;
176 };
177 
impl()178 BleAdvertiser::impl::impl()
179 {}
180 
~impl()181 BleAdvertiser::impl::~impl()
182 {
183     HILOGD("start");
184     BluetoothProfileManager::GetInstance().DeregisterFunc(profileRegisterId);
185     callbacks_.Clear();
186     sptr<IBluetoothBleAdvertiser> proxy = GetRemoteProxy<IBluetoothBleAdvertiser>(BLE_ADVERTISER_SERVER);
187     CHECK_AND_RETURN_LOG(proxy != nullptr, "failed: no proxy");
188     proxy->DeregisterBleAdvertiserCallback(callbackImp_);
189     proxy->AsObject()->RemoveDeathRecipient(deathRecipient_);
190 }
191 
BleAdvertiser()192 BleAdvertiser::BleAdvertiser() : pimpl(nullptr)
193 {
194     if (pimpl == nullptr) {
195         pimpl = std::make_unique<impl>();
196         if (!pimpl) {
197             HILOGE("failed, no pimpl");
198         }
199     }
200 
201     HILOGI("successful");
202 }
203 
~BleAdvertiser()204 BleAdvertiser::~BleAdvertiser()
205 {}
206 
Init(std::weak_ptr<BleAdvertiser> advertiser)207 void BleAdvertiser::impl::Init(std::weak_ptr<BleAdvertiser> advertiser)
208 {
209     callbackImp_ = new BluetoothBleAdvertiserCallbackImp(advertiser);
210     profileRegisterId = BluetoothProfileManager::GetInstance().RegisterFunc(BLE_ADVERTISER_SERVER,
211         [this, advertiser](sptr<IRemoteObject> remote) {
212         sptr<IBluetoothBleAdvertiser> proxy = iface_cast<IBluetoothBleAdvertiser>(remote);
213         CHECK_AND_RETURN_LOG(proxy != nullptr, "failed: no proxy");
214         proxy->RegisterBleAdvertiserCallback(callbackImp_);
215         deathRecipient_ = new BleAdvertiserDeathRecipient(advertiser);
216         if (deathRecipient_ != nullptr) {
217             proxy->AsObject()->AddDeathRecipient(deathRecipient_);
218         }
219     });
220 }
221 
CreateInstance(void)222 std::shared_ptr<BleAdvertiser> BleAdvertiser::CreateInstance(void)
223 {
224     auto instance = std::make_shared<BleAdvertiser>(PassKey());
225     CHECK_AND_RETURN_LOG_RET(instance, nullptr, "Create BleAdvertiser failed");
226 
227     instance->pimpl->Init(instance);
228     return instance;
229 }
230 
ConvertBleAdvertiserData(const BleAdvertiserData & data,BluetoothBleAdvertiserData & outData)231 void BleAdvertiser::impl::ConvertBleAdvertiserData(const BleAdvertiserData &data, BluetoothBleAdvertiserData &outData)
232 {
233     std::map<uint16_t, std::string> manufacturerData = data.GetManufacturerData();
234     for (auto iter = manufacturerData.begin(); iter != manufacturerData.end(); iter++) {
235         outData.AddManufacturerData(iter->first, iter->second);
236     }
237     std::map<ParcelUuid, std::string> serviceData = data.GetServiceData();
238     for (auto it = serviceData.begin(); it != serviceData.end(); it++) {
239         outData.AddServiceData(Uuid::ConvertFromString(it->first.ToString()), it->second);
240     }
241     std::vector<ParcelUuid> serviceUuids = data.GetServiceUuids();
242     for (auto it = serviceUuids.begin(); it != serviceUuids.end(); it++) {
243         outData.AddServiceUuid(Uuid::ConvertFromString(it->ToString()));
244     }
245     outData.SetIncludeDeviceName(data.GetIncludeDeviceName());
246     outData.SetIncludeTxPower(data.GetIncludeTxPower());
247 }
248 
GetAdvertiserTotalBytes(const BluetoothBleAdvertiserData & data,bool isFlagsIncluded)249 uint32_t BleAdvertiser::impl::GetAdvertiserTotalBytes(const BluetoothBleAdvertiserData &data, bool isFlagsIncluded)
250 {
251     // If the flag field is contained, the protocol stack adds the flag field, which consists of three bytes.
252     uint32_t size = (isFlagsIncluded) ? BLE_ADV_FLAGS_FIELD_LENGTH : 0;
253     std::map<uint16_t, std::string> manufacturerData = data.GetManufacturerData();
254     for (auto iter = manufacturerData.begin(); iter != manufacturerData.end(); ++iter) {
255         size += BLE_ADV_PER_FIELD_OVERHEAD_LENGTH + BLE_ADV_MANUFACTURER_ID_LENGTH + iter->second.length();
256     }
257 
258     std::map<Uuid, std::string> serviceData = data.GetServiceData();
259     for (auto iter = serviceData.begin(); iter != serviceData.end(); ++iter) {
260         size += BLE_ADV_PER_FIELD_OVERHEAD_LENGTH + static_cast<uint32_t>(iter->first.GetUuidType())
261         + iter->second.length();
262     }
263     int num16BitUuids = 0;
264     int num32BitUuids = 0;
265     int num128BitUuids = 0;
266     std::vector<Uuid> serviceUuids = data.GetServiceUuids();
267     for (auto iter = serviceUuids.begin(); iter != serviceUuids.end(); ++iter) {
268         if (iter->GetUuidType() == Uuid::UUID16_BYTES_TYPE) {
269             ++num16BitUuids;
270         } else if (iter->GetUuidType() == Uuid::UUID32_BYTES_TYPE) {
271             ++num32BitUuids;
272         } else {
273             ++num128BitUuids;
274         }
275     }
276     if (num16BitUuids != 0) {
277         size += BLE_ADV_PER_FIELD_OVERHEAD_LENGTH + static_cast<uint32_t>(num16BitUuids * Uuid::UUID16_BYTES_TYPE);
278     }
279     if (num32BitUuids != 0) {
280         size += BLE_ADV_PER_FIELD_OVERHEAD_LENGTH + static_cast<uint32_t>(num32BitUuids * Uuid::UUID32_BYTES_TYPE);
281     }
282     if (num128BitUuids != 0) {
283         size += BLE_ADV_PER_FIELD_OVERHEAD_LENGTH + static_cast<uint32_t>(num128BitUuids * Uuid::UUID128_BYTES_TYPE);
284     }
285     if (data.GetIncludeDeviceName()) {
286         uint32_t deviceNameLen = BluetoothHost::GetDefaultHost().GetLocalName().length();
287         deviceNameLen = (deviceNameLen > DEVICE_NAME_MAX_LEN) ?  DEVICE_NAME_MAX_LEN : deviceNameLen;
288         size += BLE_ADV_PER_FIELD_OVERHEAD_LENGTH + deviceNameLen;
289     }
290     if (data.GetIncludeTxPower()) {
291         uint32_t txPowerLen = 3;
292         size += BLE_ADV_PER_FIELD_OVERHEAD_LENGTH + txPowerLen;
293     }
294     return size;
295 }
296 
CheckAdvertiserSettings(const BleAdvertiserSettings & settings)297 int32_t BleAdvertiser::impl::CheckAdvertiserSettings(const BleAdvertiserSettings &settings)
298 {
299     int8_t txPower = settings.GetTxPower();
300     if (txPower < BLE_ADV_TX_POWER_MIN_VALUE || txPower > BLE_ADV_TX_POWER_MAX_VALUE) {
301         HILOGE("Illegal txPower argument %{public}d", txPower);
302         return BT_ERR_INVALID_PARAM;
303     }
304 
305     return BT_NO_ERROR;
306 }
307 
CheckAdvertiserData(const BluetoothBleAdvertiserSettings & setting,const BluetoothBleAdvertiserData & advData,const BluetoothBleAdvertiserData & scanResponse)308 int32_t BleAdvertiser::impl::CheckAdvertiserData(const BluetoothBleAdvertiserSettings &setting,
309     const BluetoothBleAdvertiserData &advData, const BluetoothBleAdvertiserData &scanResponse)
310 {
311     uint32_t maxSize = BLE_ADV_MAX_LEGACY_ADVERTISING_DATA_BYTES;
312     if (!setting.IsLegacyMode()) {
313         maxSize = static_cast<uint32_t>(BluetoothHost::GetDefaultHost().GetBleMaxAdvertisingDataLength());
314     }
315     // If is Connect, flag field is contained in AdvertiserData.
316     uint32_t size = GetAdvertiserTotalBytes(advData, setting.IsConnectable());
317     if (size > maxSize) {
318         HILOGE("bleAdvertiserData size = %{public}d, maxSize = %{public}d", size, maxSize);
319         return BT_ERR_BLE_ADV_DATA_EXCEED_LIMIT;
320     }
321     size = GetAdvertiserTotalBytes(scanResponse, false);
322     if (size > maxSize) {
323         HILOGE("bleScanResponse size = %{public}d, maxSize = %{public}d,", size, maxSize);
324         return BT_ERR_BLE_ADV_DATA_EXCEED_LIMIT;
325     }
326     return BT_NO_ERROR;
327 }
328 
StartAdvertising(const BleAdvertiserSettings & settings,const BleAdvertiserData & advData,const BleAdvertiserData & scanResponse,uint16_t duration,std::shared_ptr<BleAdvertiseCallback> callback)329 int BleAdvertiser::StartAdvertising(const BleAdvertiserSettings &settings, const BleAdvertiserData &advData,
330     const BleAdvertiserData &scanResponse, uint16_t duration, std::shared_ptr<BleAdvertiseCallback> callback)
331 {
332     if (!IS_BLE_ENABLED()) {
333         HILOGE("bluetooth is off.");
334         return BT_ERR_INVALID_STATE;
335     }
336     sptr<IBluetoothBleAdvertiser> proxy = GetRemoteProxy<IBluetoothBleAdvertiser>(BLE_ADVERTISER_SERVER);
337     CHECK_AND_RETURN_LOG_RET(proxy != nullptr, BT_ERR_INTERNAL_ERROR, "failed: no proxy");
338     CHECK_AND_RETURN_LOG_RET(callback != nullptr, BT_ERR_INTERNAL_ERROR, "callback is nullptr");
339 
340     int ret = pimpl->CheckAdvertiserSettings(settings);
341     if (ret != BT_NO_ERROR) {
342         return ret;
343     }
344     BluetoothBleAdvertiserSettings setting;
345     setting.SetConnectable(settings.IsConnectable());
346     setting.SetInterval(settings.GetInterval());
347     setting.SetLegacyMode(settings.IsLegacyMode());
348     setting.SetTxPower(settings.GetTxPower());
349     setting.SetOwnAddr(settings.GetOwnAddr());
350     setting.SetOwnAddrType(settings.GetOwnAddrType());
351 
352     BluetoothBleAdvertiserData bleAdvertiserData;
353     BluetoothBleAdvertiserData bleScanResponse;
354     bleAdvertiserData.SetAdvFlag(advData.GetAdvFlag());
355     pimpl->ConvertBleAdvertiserData(advData, bleAdvertiserData);
356     pimpl->ConvertBleAdvertiserData(scanResponse, bleScanResponse);
357 
358     ret = pimpl->CheckAdvertiserData(setting, bleAdvertiserData, bleScanResponse);
359     if (ret != BT_NO_ERROR) {
360         return ret;
361     }
362 
363     HILOGD("duration=%{public}d", duration);
364     int32_t advHandle = BLE_INVALID_ADVERTISING_HANDLE;
365     if (pimpl->callbacks_.IsExistAdvertiserCallback(callback, advHandle)) {
366         ret = proxy->StartAdvertising(setting, bleAdvertiserData, bleScanResponse, advHandle, duration, false);
367     } else {
368         ret = proxy->GetAdvertiserHandle(advHandle, pimpl->callbackImp_);
369         // ret will be BT_ERR_MAX_RESOURCES or BT_ERR_INTERNAL_ERROR.
370         if (ret != BT_NO_ERROR || advHandle == BLE_INVALID_ADVERTISING_HANDLE) {
371             if (ret == BT_ERR_MAX_RESOURCES) {
372                 HILOGE("The number of adv handle reaches the maximum.");
373                 callback->OnStartResultEvent(BT_ERR_MAX_RESOURCES, static_cast<int>(BLE_INVALID_ADVERTISING_HANDLE));
374                 return ret;
375             }
376             HILOGE("Invalid advertising handle");
377             callback->OnStartResultEvent(BT_ERR_INTERNAL_ERROR, static_cast<int>(BLE_INVALID_ADVERTISING_HANDLE));
378             return ret;
379         }
380         callback->OnGetAdvHandleEvent(0, advHandle);
381         pimpl->callbacks_.Register(advHandle, callback);
382         ret = proxy->StartAdvertising(setting, bleAdvertiserData, bleScanResponse, advHandle, duration, false);
383     }
384     return ret;
385 }
386 
StartAdvertising(const BleAdvertiserSettings & settings,const std::vector<uint8_t> & advData,const std::vector<uint8_t> & scanResponse,uint16_t duration,std::shared_ptr<BleAdvertiseCallback> callback)387 int BleAdvertiser::StartAdvertising(const BleAdvertiserSettings &settings, const std::vector<uint8_t> &advData,
388     const std::vector<uint8_t> &scanResponse, uint16_t duration, std::shared_ptr<BleAdvertiseCallback> callback)
389 {
390     if (!IS_BLE_ENABLED()) {
391         HILOGE("bluetooth is off.");
392         return BT_ERR_INVALID_STATE;
393     }
394 
395     sptr<IBluetoothBleAdvertiser> proxy = GetRemoteProxy<IBluetoothBleAdvertiser>(BLE_ADVERTISER_SERVER);
396     CHECK_AND_RETURN_LOG_RET(proxy != nullptr, BT_ERR_INTERNAL_ERROR, "failed: no proxy");
397     CHECK_AND_RETURN_LOG_RET(callback != nullptr, BT_ERR_INTERNAL_ERROR, "callback is nullptr");
398 
399     int ret = pimpl->CheckAdvertiserSettings(settings);
400     if (ret != BT_NO_ERROR) {
401         return ret;
402     }
403     BluetoothBleAdvertiserSettings setting;
404     setting.SetConnectable(settings.IsConnectable());
405     setting.SetInterval(settings.GetInterval());
406     setting.SetLegacyMode(settings.IsLegacyMode());
407     setting.SetTxPower(settings.GetTxPower());
408     setting.SetOwnAddr(settings.GetOwnAddr());
409     setting.SetOwnAddrType(settings.GetOwnAddrType());
410 
411     BluetoothBleAdvertiserData bleAdvertiserData;
412     bleAdvertiserData.SetPayload(std::string(advData.begin(), advData.end()));
413     bleAdvertiserData.SetAdvFlag(0);
414     BluetoothBleAdvertiserData bleScanResponse;
415     bleScanResponse.SetPayload(std::string(scanResponse.begin(), scanResponse.end()));
416 
417     HILOGD("duration=%{public}d", duration);
418     int32_t advHandle = BLE_INVALID_ADVERTISING_HANDLE;
419     if (pimpl->callbacks_.IsExistAdvertiserCallback(callback, advHandle)) {
420         ret = proxy->StartAdvertising(setting, bleAdvertiserData, bleScanResponse, advHandle, duration, true);
421     } else {
422         ret = proxy->GetAdvertiserHandle(advHandle, pimpl->callbackImp_);
423         if (ret != BT_NO_ERROR || advHandle == BLE_INVALID_ADVERTISING_HANDLE) {
424             HILOGE("Invalid advertising handle");
425             callback->OnStartResultEvent(BT_ERR_INTERNAL_ERROR, BLE_INVALID_ADVERTISING_HANDLE);
426             return ret;
427         }
428         pimpl->callbacks_.Register(advHandle, callback);
429         ret = proxy->StartAdvertising(setting, bleAdvertiserData, bleScanResponse, advHandle, duration, true);
430     }
431     return ret;
432 }
433 
SetAdvertisingData(const std::vector<uint8_t> & advData,const std::vector<uint8_t> & scanResponse,std::shared_ptr<BleAdvertiseCallback> callback)434 void BleAdvertiser::SetAdvertisingData(const std::vector<uint8_t> &advData, const std::vector<uint8_t> &scanResponse,
435     std::shared_ptr<BleAdvertiseCallback> callback)
436 {
437     if (!IS_BLE_ENABLED()) {
438         HILOGE("bluetooth is off.");
439         return;
440     }
441     sptr<IBluetoothBleAdvertiser> proxy = GetRemoteProxy<IBluetoothBleAdvertiser>(BLE_ADVERTISER_SERVER);
442     CHECK_AND_RETURN_LOG(proxy != nullptr, "failed: no proxy");
443 
444     CHECK_AND_RETURN_LOG(callback != nullptr, "callback is nullptr");
445 
446     int advHandle = BLE_INVALID_ADVERTISING_HANDLE;
447     if (!pimpl->callbacks_.IsExistAdvertiserCallback(callback, advHandle)) {
448         HILOGE("Advertising is not started");
449         return;
450     }
451 
452     BluetoothBleAdvertiserData bleAdvertiserData;
453     bleAdvertiserData.SetPayload(std::string(advData.begin(), advData.end()));
454     BluetoothBleAdvertiserData bleScanResponse;
455     bleScanResponse.SetPayload(std::string(scanResponse.begin(), scanResponse.end()));
456     proxy->SetAdvertisingData(bleAdvertiserData, bleScanResponse, advHandle);
457 }
458 
ChangeAdvertisingParams(uint8_t advHandle,const BleAdvertiserSettings & settings)459 int BleAdvertiser::ChangeAdvertisingParams(uint8_t advHandle, const BleAdvertiserSettings &settings)
460 {
461     CHECK_AND_RETURN_LOG_RET(IS_BLE_ENABLED(), BT_ERR_INVALID_STATE, "bluetooth is off.");
462     sptr<IBluetoothBleAdvertiser> proxy = GetRemoteProxy<IBluetoothBleAdvertiser>(BLE_ADVERTISER_SERVER);
463     CHECK_AND_RETURN_LOG_RET(proxy != nullptr, BT_ERR_INTERNAL_ERROR, "failed: no proxy");
464 
465     int ret = pimpl->CheckAdvertiserSettings(settings);
466     if (ret != BT_NO_ERROR) {
467         HILOGE("check settings err:%{public}d", ret);
468         return ret;
469     }
470     BluetoothBleAdvertiserSettings setting;
471     setting.SetConnectable(settings.IsConnectable());
472     setting.SetInterval(settings.GetInterval());
473     setting.SetLegacyMode(settings.IsLegacyMode());
474     setting.SetTxPower(settings.GetTxPower());
475     setting.SetOwnAddr(settings.GetOwnAddr());
476     setting.SetOwnAddrType(settings.GetOwnAddrType());
477     return proxy->ChangeAdvertisingParams(advHandle, setting);
478 }
479 
EnableAdvertising(uint8_t advHandle,uint16_t duration,std::shared_ptr<BleAdvertiseCallback> callback)480 int BleAdvertiser::EnableAdvertising(uint8_t advHandle, uint16_t duration,
481     std::shared_ptr<BleAdvertiseCallback> callback)
482 {
483     HILOGI("enter");
484     if (!IS_BLE_ENABLED()) {
485         HILOGE("bluetooth is off.");
486         return BT_ERR_INVALID_STATE;
487     }
488     sptr<IBluetoothBleAdvertiser> proxy = GetRemoteProxy<IBluetoothBleAdvertiser>(BLE_ADVERTISER_SERVER);
489     CHECK_AND_RETURN_LOG_RET(proxy != nullptr, BT_ERR_INTERNAL_ERROR, "failed: no proxy");
490 
491     CHECK_AND_RETURN_LOG_RET(callback != nullptr, BT_ERR_INTERNAL_ERROR, "callback is nullptr");
492     uint8_t tmpAdvHandle = pimpl->callbacks_.GetAdvertiserHandle(callback);
493     if (tmpAdvHandle == BLE_INVALID_ADVERTISING_HANDLE) {
494         HILOGE("Invalid advertising callback");
495         return BT_ERR_BLE_INVALID_ADV_ID;
496     }
497 
498     std::shared_ptr<BleAdvertiseCallback> observer = pimpl->callbacks_.GetAdvertiserObserver(advHandle);
499     if (observer == nullptr) {
500         HILOGE("Invalid advertising handle");
501         return BT_ERR_INTERNAL_ERROR;
502     }
503 
504     int ret = proxy->EnableAdvertising(advHandle, duration);
505     return ret;
506 }
507 
DisableAdvertising(uint8_t advHandle,std::shared_ptr<BleAdvertiseCallback> callback)508 int BleAdvertiser::DisableAdvertising(uint8_t advHandle, std::shared_ptr<BleAdvertiseCallback> callback)
509 {
510     HILOGI("enter");
511     if (!IS_BLE_ENABLED()) {
512         HILOGE("bluetooth is off.");
513         return BT_ERR_INVALID_STATE;
514     }
515 
516     sptr<IBluetoothBleAdvertiser> proxy = GetRemoteProxy<IBluetoothBleAdvertiser>(BLE_ADVERTISER_SERVER);
517     CHECK_AND_RETURN_LOG_RET(proxy != nullptr, BT_ERR_INTERNAL_ERROR, "failed: no proxy");
518     CHECK_AND_RETURN_LOG_RET(callback != nullptr, BT_ERR_INTERNAL_ERROR, "callback is nullptr");
519     uint8_t tmpAdvHandle = pimpl->callbacks_.GetAdvertiserHandle(callback);
520     if (tmpAdvHandle == BLE_INVALID_ADVERTISING_HANDLE) {
521         HILOGE("Invalid advertising callback");
522         return BT_ERR_BLE_INVALID_ADV_ID;
523     }
524 
525     std::shared_ptr<BleAdvertiseCallback> observer = pimpl->callbacks_.GetAdvertiserObserver(advHandle);
526     if (observer == nullptr) {
527         HILOGE("Invalid advertising handle");
528         return BT_ERR_INTERNAL_ERROR;
529     }
530 
531     int ret = proxy->DisableAdvertising(advHandle);
532     return ret;
533 }
534 
StopAdvertising(std::shared_ptr<BleAdvertiseCallback> callback)535 int BleAdvertiser::StopAdvertising(std::shared_ptr<BleAdvertiseCallback> callback)
536 {
537     if (!IS_BLE_ENABLED()) {
538         HILOGE("bluetooth is off.");
539         return BT_ERR_INVALID_STATE;
540     }
541 
542     sptr<IBluetoothBleAdvertiser> proxy = GetRemoteProxy<IBluetoothBleAdvertiser>(BLE_ADVERTISER_SERVER);
543     CHECK_AND_RETURN_LOG_RET(proxy != nullptr, BT_ERR_INTERNAL_ERROR, "failed: no proxy");
544     CHECK_AND_RETURN_LOG_RET(callback != nullptr, BT_ERR_INTERNAL_ERROR, "callback is nullptr");
545 
546     HILOGD("enter");
547     uint8_t advHandle = pimpl->callbacks_.GetAdvertiserHandle(callback);
548     if (advHandle == BLE_INVALID_ADVERTISING_HANDLE) {
549         HILOGE("Invalid advertising handle");
550         return BT_ERR_BLE_INVALID_ADV_ID;
551     }
552 
553     int ret = proxy->StopAdvertising(advHandle);
554     return ret;
555 }
556 
Close(std::shared_ptr<BleAdvertiseCallback> callback)557 void BleAdvertiser::Close(std::shared_ptr<BleAdvertiseCallback> callback)
558 {
559     if (!IS_BLE_ENABLED()) {
560         HILOGE("BLE is not enabled");
561         return;
562     }
563 
564     sptr<IBluetoothBleAdvertiser> proxy = GetRemoteProxy<IBluetoothBleAdvertiser>(BLE_ADVERTISER_SERVER);
565     CHECK_AND_RETURN_LOG(proxy != nullptr, "proxy is nullptr");
566     CHECK_AND_RETURN_LOG(callback != nullptr, "callback is nullptr");
567 
568     HILOGI("enter");
569     if (proxy != nullptr) {
570         uint8_t advHandle = pimpl->callbacks_.GetAdvertiserHandle(callback);
571         if (advHandle != BLE_INVALID_ADVERTISING_HANDLE) {
572             proxy->Close(advHandle);
573         }
574 
575         std::shared_ptr<BleAdvertiseCallback> observer = pimpl->callbacks_.GetAdvertiserObserver(advHandle);
576         if (observer != nullptr) {
577             pimpl->callbacks_.Deregister(observer);
578         }
579     }
580 }
581 
GetAdvHandle(std::shared_ptr<BleAdvertiseCallback> callback)582 uint8_t BleAdvertiser::GetAdvHandle(std::shared_ptr<BleAdvertiseCallback> callback)
583 {
584     if (!BluetoothHost::GetDefaultHost().IsBleEnabled()) {
585         HILOGE("BLE is not enabled");
586         return BLE_INVALID_ADVERTISING_HANDLE;
587     }
588     CHECK_AND_RETURN_LOG_RET(callback != nullptr, BLE_INVALID_ADVERTISING_HANDLE, "callback is nullptr");
589     return pimpl->callbacks_.GetAdvertiserHandle(callback);
590 }
591 
GetAdvObserver(uint32_t advHandle)592 std::shared_ptr<BleAdvertiseCallback> BleAdvertiser::GetAdvObserver(uint32_t advHandle)
593 {
594     if (!BluetoothHost::GetDefaultHost().IsBleEnabled()) {
595         HILOGE("BLE is not enabled");
596         return nullptr;
597     }
598     return pimpl->callbacks_.GetAdvertiserObserver(advHandle);
599 }
600 
GetAdvObservers()601 std::vector<std::shared_ptr<BleAdvertiseCallback>> BleAdvertiser::GetAdvObservers()
602 {
603     if (!BluetoothHost::GetDefaultHost().IsBleEnabled()) {
604         HILOGE("BLE is not enabled");
605         return {};
606     }
607     return pimpl->callbacks_.GetAdvertiserObservers();
608 }
609 
BleAdvertiserData()610 BleAdvertiserData::BleAdvertiserData()
611 {}
612 
~BleAdvertiserData()613 BleAdvertiserData::~BleAdvertiserData()
614 {}
615 
AddServiceData(const ParcelUuid & uuid,const std::string & serviceData)616 void BleAdvertiserData::AddServiceData(const ParcelUuid &uuid, const std::string &serviceData)
617 {
618     if (serviceData.empty()) {
619         HILOGE("serviceData is empty");
620         return;
621     }
622 
623     serviceData_.insert(std::make_pair(uuid, serviceData));
624 }
625 
AddManufacturerData(uint16_t manufacturerId,const std::string & data)626 void BleAdvertiserData::AddManufacturerData(uint16_t manufacturerId, const std::string &data)
627 {
628     if (data.empty()) {
629         HILOGE("serviceData is empty");
630         return;
631     }
632 
633     manufacturerSpecificData_.insert(std::make_pair(manufacturerId, data));
634 }
635 
GetManufacturerData() const636 std::map<uint16_t, std::string> BleAdvertiserData::GetManufacturerData() const
637 {
638     return manufacturerSpecificData_;
639 }
640 
AddServiceUuid(const ParcelUuid & serviceUuid)641 void BleAdvertiserData::AddServiceUuid(const ParcelUuid &serviceUuid)
642 {
643     serviceUuids_.push_back(serviceUuid);
644 }
645 
GetServiceUuids() const646 std::vector<ParcelUuid> BleAdvertiserData::GetServiceUuids() const
647 {
648     return serviceUuids_;
649 }
650 
SetAdvFlag(uint8_t flag)651 void BleAdvertiserData::SetAdvFlag(uint8_t flag)
652 {
653     advFlag_ = flag;
654 }
655 
GetAdvFlag() const656 uint8_t BleAdvertiserData::GetAdvFlag() const
657 {
658     return advFlag_;
659 }
660 
GetServiceData() const661 std::map<ParcelUuid, std::string> BleAdvertiserData::GetServiceData() const
662 {
663     return serviceData_;
664 }
665 
GetIncludeDeviceName() const666 bool BleAdvertiserData::GetIncludeDeviceName() const
667 {
668     return includeDeviceName_;
669 }
670 
SetIncludeDeviceName(bool flag)671 void BleAdvertiserData::SetIncludeDeviceName(bool flag)
672 {
673     includeDeviceName_ = flag;
674 }
675 
GetIncludeTxPower() const676 bool BleAdvertiserData::GetIncludeTxPower() const
677 {
678     return includeTxPower_;
679 }
680 
SetIncludeTxPower(bool flag)681 void BleAdvertiserData::SetIncludeTxPower(bool flag)
682 {
683     includeTxPower_ = flag;
684 }
685 
BleAdvertiserSettings()686 BleAdvertiserSettings::BleAdvertiserSettings()
687 {}
688 
~BleAdvertiserSettings()689 BleAdvertiserSettings::~BleAdvertiserSettings()
690 {}
691 
SetConnectable(bool connectable)692 void BleAdvertiserSettings::SetConnectable(bool connectable)
693 {
694     connectable_ = connectable;
695 }
696 
IsConnectable() const697 bool BleAdvertiserSettings::IsConnectable() const
698 {
699     return connectable_;
700 }
701 
SetLegacyMode(bool legacyMode)702 void BleAdvertiserSettings::SetLegacyMode(bool legacyMode)
703 {
704     legacyMode_ = legacyMode;
705 }
706 
IsLegacyMode() const707 bool BleAdvertiserSettings::IsLegacyMode() const
708 {
709     return legacyMode_;
710 }
711 
SetInterval(uint16_t interval)712 void BleAdvertiserSettings::SetInterval(uint16_t interval)
713 {
714     interval_ = interval;
715 }
716 
GetInterval() const717 uint16_t BleAdvertiserSettings::GetInterval() const
718 {
719     return interval_;
720 }
721 
SetTxPower(int8_t txPower)722 void BleAdvertiserSettings::SetTxPower(int8_t txPower)
723 {
724     txPower_ = txPower;
725 }
726 
GetTxPower() const727 int8_t BleAdvertiserSettings::GetTxPower() const
728 {
729     return txPower_;
730 }
731 
GetPrimaryPhy() const732 int BleAdvertiserSettings::GetPrimaryPhy() const
733 {
734     return primaryPhy_;
735 }
736 
SetPrimaryPhy(int primaryPhy)737 void BleAdvertiserSettings::SetPrimaryPhy(int primaryPhy)
738 {
739     primaryPhy_ = primaryPhy;
740 }
741 
GetSecondaryPhy() const742 int BleAdvertiserSettings::GetSecondaryPhy() const
743 {
744     return secondaryPhy_;
745 }
746 
SetSecondaryPhy(int secondaryPhy)747 void BleAdvertiserSettings::SetSecondaryPhy(int secondaryPhy)
748 {
749     secondaryPhy_ = secondaryPhy;
750 }
751 
GetOwnAddr() const752 std::array<uint8_t, OHOS_BD_ADDR_LEN> BleAdvertiserSettings::GetOwnAddr() const
753 {
754     return ownAddr_;
755 }
756 
SetOwnAddr(const std::array<uint8_t,OHOS_BD_ADDR_LEN> & addr)757 void BleAdvertiserSettings::SetOwnAddr(const std::array<uint8_t, OHOS_BD_ADDR_LEN>& addr)
758 {
759     ownAddr_ = addr;
760 }
761 
GetOwnAddrType() const762 int8_t BleAdvertiserSettings::GetOwnAddrType() const
763 {
764     return ownAddrType_;
765 }
766 
SetOwnAddrType(int8_t addrType)767 void BleAdvertiserSettings::SetOwnAddrType(int8_t addrType)
768 {
769     ownAddrType_ = addrType;
770 }
771 }  // namespace Bluetooth
772 }  // namespace OHOS
773