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
BleAdvertiserData()553 BleAdvertiserData::BleAdvertiserData()
554 {}
555
~BleAdvertiserData()556 BleAdvertiserData::~BleAdvertiserData()
557 {}
558
AddServiceData(const ParcelUuid & uuid,const std::string & serviceData)559 void BleAdvertiserData::AddServiceData(const ParcelUuid &uuid, const std::string &serviceData)
560 {
561 if (serviceData.empty()) {
562 HILOGE("serviceData is empty");
563 return;
564 }
565
566 serviceData_.insert(std::make_pair(uuid, serviceData));
567 }
568
AddManufacturerData(uint16_t manufacturerId,const std::string & data)569 void BleAdvertiserData::AddManufacturerData(uint16_t manufacturerId, const std::string &data)
570 {
571 if (data.empty()) {
572 HILOGE("serviceData is empty");
573 return;
574 }
575
576 manufacturerSpecificData_.insert(std::make_pair(manufacturerId, data));
577 }
578
GetManufacturerData() const579 std::map<uint16_t, std::string> BleAdvertiserData::GetManufacturerData() const
580 {
581 return manufacturerSpecificData_;
582 }
583
AddServiceUuid(const ParcelUuid & serviceUuid)584 void BleAdvertiserData::AddServiceUuid(const ParcelUuid &serviceUuid)
585 {
586 serviceUuids_.push_back(serviceUuid);
587 }
588
GetServiceUuids() const589 std::vector<ParcelUuid> BleAdvertiserData::GetServiceUuids() const
590 {
591 return serviceUuids_;
592 }
593
SetAdvFlag(uint8_t flag)594 void BleAdvertiserData::SetAdvFlag(uint8_t flag)
595 {
596 advFlag_ = flag;
597 }
598
GetAdvFlag() const599 uint8_t BleAdvertiserData::GetAdvFlag() const
600 {
601 return advFlag_;
602 }
603
GetServiceData() const604 std::map<ParcelUuid, std::string> BleAdvertiserData::GetServiceData() const
605 {
606 return serviceData_;
607 }
608
GetIncludeDeviceName() const609 bool BleAdvertiserData::GetIncludeDeviceName() const
610 {
611 return includeDeviceName_;
612 }
613
SetIncludeDeviceName(bool flag)614 void BleAdvertiserData::SetIncludeDeviceName(bool flag)
615 {
616 includeDeviceName_ = flag;
617 }
618
GetIncludeTxPower() const619 bool BleAdvertiserData::GetIncludeTxPower() const
620 {
621 return includeTxPower_;
622 }
623
SetIncludeTxPower(bool flag)624 void BleAdvertiserData::SetIncludeTxPower(bool flag)
625 {
626 includeTxPower_ = flag;
627 }
628
BleAdvertiserSettings()629 BleAdvertiserSettings::BleAdvertiserSettings()
630 {}
631
~BleAdvertiserSettings()632 BleAdvertiserSettings::~BleAdvertiserSettings()
633 {}
634
SetConnectable(bool connectable)635 void BleAdvertiserSettings::SetConnectable(bool connectable)
636 {
637 connectable_ = connectable;
638 }
639
IsConnectable() const640 bool BleAdvertiserSettings::IsConnectable() const
641 {
642 return connectable_;
643 }
644
SetLegacyMode(bool legacyMode)645 void BleAdvertiserSettings::SetLegacyMode(bool legacyMode)
646 {
647 legacyMode_ = legacyMode;
648 }
649
IsLegacyMode() const650 bool BleAdvertiserSettings::IsLegacyMode() const
651 {
652 return legacyMode_;
653 }
654
SetInterval(uint16_t interval)655 void BleAdvertiserSettings::SetInterval(uint16_t interval)
656 {
657 interval_ = interval;
658 }
659
GetInterval() const660 uint16_t BleAdvertiserSettings::GetInterval() const
661 {
662 return interval_;
663 }
664
SetTxPower(int8_t txPower)665 void BleAdvertiserSettings::SetTxPower(int8_t txPower)
666 {
667 txPower_ = txPower;
668 }
669
GetTxPower() const670 int8_t BleAdvertiserSettings::GetTxPower() const
671 {
672 return txPower_;
673 }
674
GetPrimaryPhy() const675 int BleAdvertiserSettings::GetPrimaryPhy() const
676 {
677 return primaryPhy_;
678 }
679
SetPrimaryPhy(int primaryPhy)680 void BleAdvertiserSettings::SetPrimaryPhy(int primaryPhy)
681 {
682 primaryPhy_ = primaryPhy;
683 }
684
GetSecondaryPhy() const685 int BleAdvertiserSettings::GetSecondaryPhy() const
686 {
687 return secondaryPhy_;
688 }
689
SetSecondaryPhy(int secondaryPhy)690 void BleAdvertiserSettings::SetSecondaryPhy(int secondaryPhy)
691 {
692 secondaryPhy_ = secondaryPhy;
693 }
694
GetOwnAddr() const695 std::array<uint8_t, OHOS_BD_ADDR_LEN> BleAdvertiserSettings::GetOwnAddr() const
696 {
697 return ownAddr_;
698 }
699
SetOwnAddr(const std::array<uint8_t,OHOS_BD_ADDR_LEN> & addr)700 void BleAdvertiserSettings::SetOwnAddr(const std::array<uint8_t, OHOS_BD_ADDR_LEN>& addr)
701 {
702 ownAddr_ = addr;
703 }
704
GetOwnAddrType() const705 int8_t BleAdvertiserSettings::GetOwnAddrType() const
706 {
707 return ownAddrType_;
708 }
709
SetOwnAddrType(int8_t addrType)710 void BleAdvertiserSettings::SetOwnAddrType(int8_t addrType)
711 {
712 ownAddrType_ = addrType;
713 }
714 } // namespace Bluetooth
715 } // namespace OHOS
716