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