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