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