• 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_INTERNAL_ERROR;
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_INTERNAL_ERROR;
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         if (ret != BT_NO_ERROR || advHandle == BLE_INVALID_ADVERTISING_HANDLE) {
370             HILOGE("Invalid advertising handle");
371             callback->OnStartResultEvent(BT_ERR_INTERNAL_ERROR, static_cast<int>(BLE_INVALID_ADVERTISING_HANDLE));
372             return ret;
373         }
374         callback->OnGetAdvHandleEvent(0, advHandle);
375         pimpl->callbacks_.Register(advHandle, callback);
376         ret = proxy->StartAdvertising(setting, bleAdvertiserData, bleScanResponse, advHandle, duration, false);
377     }
378     return ret;
379 }
380 
StartAdvertising(const BleAdvertiserSettings & settings,const std::vector<uint8_t> & advData,const std::vector<uint8_t> & scanResponse,uint16_t duration,std::shared_ptr<BleAdvertiseCallback> callback)381 int BleAdvertiser::StartAdvertising(const BleAdvertiserSettings &settings, const std::vector<uint8_t> &advData,
382     const std::vector<uint8_t> &scanResponse, uint16_t duration, std::shared_ptr<BleAdvertiseCallback> callback)
383 {
384     if (!IS_BLE_ENABLED()) {
385         HILOGE("bluetooth is off.");
386         return BT_ERR_INVALID_STATE;
387     }
388 
389     sptr<IBluetoothBleAdvertiser> proxy = GetRemoteProxy<IBluetoothBleAdvertiser>(BLE_ADVERTISER_SERVER);
390     CHECK_AND_RETURN_LOG_RET(proxy != nullptr, BT_ERR_INTERNAL_ERROR, "failed: no proxy");
391     CHECK_AND_RETURN_LOG_RET(callback != nullptr, BT_ERR_INTERNAL_ERROR, "callback is nullptr");
392 
393     int ret = pimpl->CheckAdvertiserSettings(settings);
394     if (ret != BT_NO_ERROR) {
395         return ret;
396     }
397     BluetoothBleAdvertiserSettings setting;
398     setting.SetConnectable(settings.IsConnectable());
399     setting.SetInterval(settings.GetInterval());
400     setting.SetLegacyMode(settings.IsLegacyMode());
401     setting.SetTxPower(settings.GetTxPower());
402     setting.SetOwnAddr(settings.GetOwnAddr());
403     setting.SetOwnAddrType(settings.GetOwnAddrType());
404 
405     BluetoothBleAdvertiserData bleAdvertiserData;
406     bleAdvertiserData.SetPayload(std::string(advData.begin(), advData.end()));
407     bleAdvertiserData.SetAdvFlag(0);
408     BluetoothBleAdvertiserData bleScanResponse;
409     bleScanResponse.SetPayload(std::string(scanResponse.begin(), scanResponse.end()));
410 
411     HILOGI("duration=%{public}d", duration);
412     int32_t advHandle = BLE_INVALID_ADVERTISING_HANDLE;
413     if (pimpl->callbacks_.IsExistAdvertiserCallback(callback, advHandle)) {
414         ret = proxy->StartAdvertising(setting, bleAdvertiserData, bleScanResponse, advHandle, duration, true);
415     } else {
416         ret = proxy->GetAdvertiserHandle(advHandle, pimpl->callbackImp_);
417         if (ret != BT_NO_ERROR || advHandle == BLE_INVALID_ADVERTISING_HANDLE) {
418             HILOGE("Invalid advertising handle");
419             callback->OnStartResultEvent(BT_ERR_INTERNAL_ERROR, BLE_INVALID_ADVERTISING_HANDLE);
420             return ret;
421         }
422         pimpl->callbacks_.Register(advHandle, callback);
423         ret = proxy->StartAdvertising(setting, bleAdvertiserData, bleScanResponse, advHandle, duration, true);
424     }
425     return ret;
426 }
427 
SetAdvertisingData(const std::vector<uint8_t> & advData,const std::vector<uint8_t> & scanResponse,std::shared_ptr<BleAdvertiseCallback> callback)428 void BleAdvertiser::SetAdvertisingData(const std::vector<uint8_t> &advData, const std::vector<uint8_t> &scanResponse,
429     std::shared_ptr<BleAdvertiseCallback> callback)
430 {
431     if (!IS_BLE_ENABLED()) {
432         HILOGE("bluetooth is off.");
433         return;
434     }
435     sptr<IBluetoothBleAdvertiser> proxy = GetRemoteProxy<IBluetoothBleAdvertiser>(BLE_ADVERTISER_SERVER);
436     CHECK_AND_RETURN_LOG(proxy != nullptr, "failed: no proxy");
437 
438     CHECK_AND_RETURN_LOG(callback != nullptr, "callback is nullptr");
439 
440     int advHandle = BLE_INVALID_ADVERTISING_HANDLE;
441     if (!pimpl->callbacks_.IsExistAdvertiserCallback(callback, advHandle)) {
442         HILOGE("Advertising is not started");
443         return;
444     }
445 
446     BluetoothBleAdvertiserData bleAdvertiserData;
447     bleAdvertiserData.SetPayload(std::string(advData.begin(), advData.end()));
448     BluetoothBleAdvertiserData bleScanResponse;
449     bleScanResponse.SetPayload(std::string(scanResponse.begin(), scanResponse.end()));
450     proxy->SetAdvertisingData(bleAdvertiserData, bleScanResponse, advHandle);
451 }
452 
ChangeAdvertisingParams(uint8_t advHandle,const BleAdvertiserSettings & settings)453 int BleAdvertiser::ChangeAdvertisingParams(uint8_t advHandle, const BleAdvertiserSettings &settings)
454 {
455     CHECK_AND_RETURN_LOG_RET(IS_BLE_ENABLED(), BT_ERR_INVALID_STATE, "bluetooth is off.");
456     sptr<IBluetoothBleAdvertiser> proxy = GetRemoteProxy<IBluetoothBleAdvertiser>(BLE_ADVERTISER_SERVER);
457     CHECK_AND_RETURN_LOG_RET(proxy != nullptr, BT_ERR_INTERNAL_ERROR, "failed: no proxy");
458 
459     int ret = pimpl->CheckAdvertiserSettings(settings);
460     if (ret != BT_NO_ERROR) {
461         HILOGE("check settings err:%{public}d", ret);
462         return ret;
463     }
464     BluetoothBleAdvertiserSettings setting;
465     setting.SetConnectable(settings.IsConnectable());
466     setting.SetInterval(settings.GetInterval());
467     setting.SetLegacyMode(settings.IsLegacyMode());
468     setting.SetTxPower(settings.GetTxPower());
469     setting.SetOwnAddr(settings.GetOwnAddr());
470     setting.SetOwnAddrType(settings.GetOwnAddrType());
471     return proxy->ChangeAdvertisingParams(advHandle, setting);
472 }
473 
EnableAdvertising(uint8_t advHandle,uint16_t duration,std::shared_ptr<BleAdvertiseCallback> callback)474 int BleAdvertiser::EnableAdvertising(uint8_t advHandle, uint16_t duration,
475     std::shared_ptr<BleAdvertiseCallback> callback)
476 {
477     HILOGI("enter");
478     if (!IS_BLE_ENABLED()) {
479         HILOGE("bluetooth is off.");
480         return BT_ERR_INVALID_STATE;
481     }
482     sptr<IBluetoothBleAdvertiser> proxy = GetRemoteProxy<IBluetoothBleAdvertiser>(BLE_ADVERTISER_SERVER);
483     CHECK_AND_RETURN_LOG_RET(proxy != nullptr, BT_ERR_INTERNAL_ERROR, "failed: no proxy");
484 
485     CHECK_AND_RETURN_LOG_RET(callback != nullptr, BT_ERR_INTERNAL_ERROR, "callback is nullptr");
486     uint8_t tmpAdvHandle = pimpl->callbacks_.GetAdvertiserHandle(callback);
487     if (tmpAdvHandle == BLE_INVALID_ADVERTISING_HANDLE) {
488         HILOGE("Invalid advertising callback");
489         return BT_ERR_INTERNAL_ERROR;
490     }
491 
492     std::shared_ptr<BleAdvertiseCallback> observer = pimpl->callbacks_.GetAdvertiserObserver(advHandle);
493     if (observer == nullptr) {
494         HILOGE("Invalid advertising handle");
495         return BT_ERR_INTERNAL_ERROR;
496     }
497 
498     int ret = proxy->EnableAdvertising(advHandle, duration);
499     return ret;
500 }
501 
DisableAdvertising(uint8_t advHandle,std::shared_ptr<BleAdvertiseCallback> callback)502 int BleAdvertiser::DisableAdvertising(uint8_t advHandle, std::shared_ptr<BleAdvertiseCallback> callback)
503 {
504     HILOGI("enter");
505     if (!IS_BLE_ENABLED()) {
506         HILOGE("bluetooth is off.");
507         return BT_ERR_INVALID_STATE;
508     }
509 
510     sptr<IBluetoothBleAdvertiser> proxy = GetRemoteProxy<IBluetoothBleAdvertiser>(BLE_ADVERTISER_SERVER);
511     CHECK_AND_RETURN_LOG_RET(proxy != nullptr, BT_ERR_INTERNAL_ERROR, "failed: no proxy");
512     CHECK_AND_RETURN_LOG_RET(callback != nullptr, BT_ERR_INTERNAL_ERROR, "callback is nullptr");
513     uint8_t tmpAdvHandle = pimpl->callbacks_.GetAdvertiserHandle(callback);
514     if (tmpAdvHandle == BLE_INVALID_ADVERTISING_HANDLE) {
515         HILOGE("Invalid advertising callback");
516         return BT_ERR_INTERNAL_ERROR;
517     }
518 
519     std::shared_ptr<BleAdvertiseCallback> observer = pimpl->callbacks_.GetAdvertiserObserver(advHandle);
520     if (observer == nullptr) {
521         HILOGE("Invalid advertising handle");
522         return BT_ERR_INTERNAL_ERROR;
523     }
524 
525     int ret = proxy->DisableAdvertising(advHandle);
526     return ret;
527 }
528 
StopAdvertising(std::shared_ptr<BleAdvertiseCallback> callback)529 int BleAdvertiser::StopAdvertising(std::shared_ptr<BleAdvertiseCallback> callback)
530 {
531     if (!IS_BLE_ENABLED()) {
532         HILOGE("bluetooth is off.");
533         return BT_ERR_INVALID_STATE;
534     }
535 
536     sptr<IBluetoothBleAdvertiser> proxy = GetRemoteProxy<IBluetoothBleAdvertiser>(BLE_ADVERTISER_SERVER);
537     CHECK_AND_RETURN_LOG_RET(proxy != nullptr, BT_ERR_INTERNAL_ERROR, "failed: no proxy");
538     CHECK_AND_RETURN_LOG_RET(callback != nullptr, BT_ERR_INTERNAL_ERROR, "callback is nullptr");
539 
540     HILOGD("enter");
541     uint8_t advHandle = pimpl->callbacks_.GetAdvertiserHandle(callback);
542     if (advHandle == BLE_INVALID_ADVERTISING_HANDLE) {
543         HILOGE("Invalid advertising handle");
544         return BT_ERR_INTERNAL_ERROR;
545     }
546 
547     int ret = proxy->StopAdvertising(advHandle);
548     return ret;
549 }
550 
Close(std::shared_ptr<BleAdvertiseCallback> callback)551 void BleAdvertiser::Close(std::shared_ptr<BleAdvertiseCallback> callback)
552 {
553     if (!IS_BLE_ENABLED()) {
554         HILOGE("BLE is not enabled");
555         return;
556     }
557 
558     sptr<IBluetoothBleAdvertiser> proxy = GetRemoteProxy<IBluetoothBleAdvertiser>(BLE_ADVERTISER_SERVER);
559     CHECK_AND_RETURN_LOG(proxy != nullptr, "proxy is nullptr");
560     CHECK_AND_RETURN_LOG(callback != nullptr, "callback is nullptr");
561 
562     HILOGI("enter");
563     if (proxy != nullptr) {
564         uint8_t advHandle = pimpl->callbacks_.GetAdvertiserHandle(callback);
565         if (advHandle != BLE_INVALID_ADVERTISING_HANDLE) {
566             proxy->Close(advHandle);
567         }
568 
569         std::shared_ptr<BleAdvertiseCallback> observer = pimpl->callbacks_.GetAdvertiserObserver(advHandle);
570         if (observer != nullptr) {
571             pimpl->callbacks_.Deregister(observer);
572         }
573     }
574 }
575 
GetAdvHandle(std::shared_ptr<BleAdvertiseCallback> callback)576 uint8_t BleAdvertiser::GetAdvHandle(std::shared_ptr<BleAdvertiseCallback> callback)
577 {
578     if (!BluetoothHost::GetDefaultHost().IsBleEnabled()) {
579         HILOGE("BLE is not enabled");
580         return BLE_INVALID_ADVERTISING_HANDLE;
581     }
582     CHECK_AND_RETURN_LOG_RET(callback != nullptr, BLE_INVALID_ADVERTISING_HANDLE, "callback is nullptr");
583     return pimpl->callbacks_.GetAdvertiserHandle(callback);
584 }
585 
GetAdvObserver(uint32_t advHandle)586 std::shared_ptr<BleAdvertiseCallback> BleAdvertiser::GetAdvObserver(uint32_t advHandle)
587 {
588     if (!BluetoothHost::GetDefaultHost().IsBleEnabled()) {
589         HILOGE("BLE is not enabled");
590         return nullptr;
591     }
592     return pimpl->callbacks_.GetAdvertiserObserver(advHandle);
593 }
594 
GetAdvObservers()595 std::vector<std::shared_ptr<BleAdvertiseCallback>> BleAdvertiser::GetAdvObservers()
596 {
597     if (!BluetoothHost::GetDefaultHost().IsBleEnabled()) {
598         HILOGE("BLE is not enabled");
599         return {};
600     }
601     return pimpl->callbacks_.GetAdvertiserObservers();
602 }
603 
BleAdvertiserData()604 BleAdvertiserData::BleAdvertiserData()
605 {}
606 
~BleAdvertiserData()607 BleAdvertiserData::~BleAdvertiserData()
608 {}
609 
AddServiceData(const ParcelUuid & uuid,const std::string & serviceData)610 void BleAdvertiserData::AddServiceData(const ParcelUuid &uuid, const std::string &serviceData)
611 {
612     if (serviceData.empty()) {
613         HILOGE("serviceData is empty");
614         return;
615     }
616 
617     serviceData_.insert(std::make_pair(uuid, serviceData));
618 }
619 
AddManufacturerData(uint16_t manufacturerId,const std::string & data)620 void BleAdvertiserData::AddManufacturerData(uint16_t manufacturerId, const std::string &data)
621 {
622     if (data.empty()) {
623         HILOGE("serviceData is empty");
624         return;
625     }
626 
627     manufacturerSpecificData_.insert(std::make_pair(manufacturerId, data));
628 }
629 
GetManufacturerData() const630 std::map<uint16_t, std::string> BleAdvertiserData::GetManufacturerData() const
631 {
632     return manufacturerSpecificData_;
633 }
634 
AddServiceUuid(const ParcelUuid & serviceUuid)635 void BleAdvertiserData::AddServiceUuid(const ParcelUuid &serviceUuid)
636 {
637     serviceUuids_.push_back(serviceUuid);
638 }
639 
GetServiceUuids() const640 std::vector<ParcelUuid> BleAdvertiserData::GetServiceUuids() const
641 {
642     return serviceUuids_;
643 }
644 
SetAdvFlag(uint8_t flag)645 void BleAdvertiserData::SetAdvFlag(uint8_t flag)
646 {
647     advFlag_ = flag;
648 }
649 
GetAdvFlag() const650 uint8_t BleAdvertiserData::GetAdvFlag() const
651 {
652     return advFlag_;
653 }
654 
GetServiceData() const655 std::map<ParcelUuid, std::string> BleAdvertiserData::GetServiceData() const
656 {
657     return serviceData_;
658 }
659 
GetIncludeDeviceName() const660 bool BleAdvertiserData::GetIncludeDeviceName() const
661 {
662     return includeDeviceName_;
663 }
664 
SetIncludeDeviceName(bool flag)665 void BleAdvertiserData::SetIncludeDeviceName(bool flag)
666 {
667     includeDeviceName_ = flag;
668 }
669 
GetIncludeTxPower() const670 bool BleAdvertiserData::GetIncludeTxPower() const
671 {
672     return includeTxPower_;
673 }
674 
SetIncludeTxPower(bool flag)675 void BleAdvertiserData::SetIncludeTxPower(bool flag)
676 {
677     includeTxPower_ = flag;
678 }
679 
BleAdvertiserSettings()680 BleAdvertiserSettings::BleAdvertiserSettings()
681 {}
682 
~BleAdvertiserSettings()683 BleAdvertiserSettings::~BleAdvertiserSettings()
684 {}
685 
SetConnectable(bool connectable)686 void BleAdvertiserSettings::SetConnectable(bool connectable)
687 {
688     connectable_ = connectable;
689 }
690 
IsConnectable() const691 bool BleAdvertiserSettings::IsConnectable() const
692 {
693     return connectable_;
694 }
695 
SetLegacyMode(bool legacyMode)696 void BleAdvertiserSettings::SetLegacyMode(bool legacyMode)
697 {
698     legacyMode_ = legacyMode;
699 }
700 
IsLegacyMode() const701 bool BleAdvertiserSettings::IsLegacyMode() const
702 {
703     return legacyMode_;
704 }
705 
SetInterval(uint16_t interval)706 void BleAdvertiserSettings::SetInterval(uint16_t interval)
707 {
708     interval_ = interval;
709 }
710 
GetInterval() const711 uint16_t BleAdvertiserSettings::GetInterval() const
712 {
713     return interval_;
714 }
715 
SetTxPower(int8_t txPower)716 void BleAdvertiserSettings::SetTxPower(int8_t txPower)
717 {
718     txPower_ = txPower;
719 }
720 
GetTxPower() const721 int8_t BleAdvertiserSettings::GetTxPower() const
722 {
723     return txPower_;
724 }
725 
GetPrimaryPhy() const726 int BleAdvertiserSettings::GetPrimaryPhy() const
727 {
728     return primaryPhy_;
729 }
730 
SetPrimaryPhy(int primaryPhy)731 void BleAdvertiserSettings::SetPrimaryPhy(int primaryPhy)
732 {
733     primaryPhy_ = primaryPhy;
734 }
735 
GetSecondaryPhy() const736 int BleAdvertiserSettings::GetSecondaryPhy() const
737 {
738     return secondaryPhy_;
739 }
740 
SetSecondaryPhy(int secondaryPhy)741 void BleAdvertiserSettings::SetSecondaryPhy(int secondaryPhy)
742 {
743     secondaryPhy_ = secondaryPhy;
744 }
745 
GetOwnAddr() const746 std::array<uint8_t, OHOS_BD_ADDR_LEN> BleAdvertiserSettings::GetOwnAddr() const
747 {
748     return ownAddr_;
749 }
750 
SetOwnAddr(const std::array<uint8_t,OHOS_BD_ADDR_LEN> & addr)751 void BleAdvertiserSettings::SetOwnAddr(const std::array<uint8_t, OHOS_BD_ADDR_LEN>& addr)
752 {
753     ownAddr_ = addr;
754 }
755 
GetOwnAddrType() const756 int8_t BleAdvertiserSettings::GetOwnAddrType() const
757 {
758     return ownAddrType_;
759 }
760 
SetOwnAddrType(int8_t addrType)761 void BleAdvertiserSettings::SetOwnAddrType(int8_t addrType)
762 {
763     ownAddrType_ = addrType;
764 }
765 }  // namespace Bluetooth
766 }  // namespace OHOS
767