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