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