195489c19Sopenharmony_ci/*
295489c19Sopenharmony_ci * Copyright (C) 2021 Huawei Device Co., Ltd.
395489c19Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
495489c19Sopenharmony_ci * you may not use this file except in compliance with the License.
595489c19Sopenharmony_ci * You may obtain a copy of the License at
695489c19Sopenharmony_ci *
795489c19Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
895489c19Sopenharmony_ci *
995489c19Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
1095489c19Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
1195489c19Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1295489c19Sopenharmony_ci * See the License for the specific language governing permissions and
1395489c19Sopenharmony_ci * limitations under the License.
1495489c19Sopenharmony_ci */
1595489c19Sopenharmony_ci#include "bluetooth_ble_advertiser.h"
1695489c19Sopenharmony_ci
1795489c19Sopenharmony_ci#include "bluetooth_ble_advertise_callback_stub.h"
1895489c19Sopenharmony_ci#include "bluetooth_def.h"
1995489c19Sopenharmony_ci#include "bluetooth_host.h"
2095489c19Sopenharmony_ci#include "bluetooth_log.h"
2195489c19Sopenharmony_ci#include "bluetooth_observer_map.h"
2295489c19Sopenharmony_ci#include "bluetooth_utils.h"
2395489c19Sopenharmony_ci#include "i_bluetooth_ble_advertiser.h"
2495489c19Sopenharmony_ci#include "iservice_registry.h"
2595489c19Sopenharmony_ci#include "system_ability_definition.h"
2695489c19Sopenharmony_ci#include "securec.h"
2795489c19Sopenharmony_ci
2895489c19Sopenharmony_ci#include <memory>
2995489c19Sopenharmony_ci#include "bluetooth_profile_manager.h"
3095489c19Sopenharmony_ci
3195489c19Sopenharmony_cinamespace OHOS {
3295489c19Sopenharmony_cinamespace Bluetooth {
3395489c19Sopenharmony_ciusing namespace OHOS::bluetooth;
3495489c19Sopenharmony_cistruct BleAdvertiser::impl {
3595489c19Sopenharmony_ci    impl();
3695489c19Sopenharmony_ci    ~impl();
3795489c19Sopenharmony_ci    void Init(std::weak_ptr<BleAdvertiser> advertiser);
3895489c19Sopenharmony_ci    void ConvertBleAdvertiserData(const BleAdvertiserData &data, BluetoothBleAdvertiserData &outData);
3995489c19Sopenharmony_ci    uint32_t GetAdvertiserTotalBytes(const BluetoothBleAdvertiserData &data, bool isFlagsIncluded);
4095489c19Sopenharmony_ci    int32_t CheckAdvertiserSettings(const BleAdvertiserSettings &settings);
4195489c19Sopenharmony_ci    int32_t CheckAdvertiserData(const BluetoothBleAdvertiserSettings &setting,
4295489c19Sopenharmony_ci        const BluetoothBleAdvertiserData &advData, const BluetoothBleAdvertiserData &scanResponse);
4395489c19Sopenharmony_ci
4495489c19Sopenharmony_ci    class BluetoothBleAdvertiserCallbackImp : public BluetoothBleAdvertiseCallbackStub {
4595489c19Sopenharmony_ci    public:
4695489c19Sopenharmony_ci        explicit BluetoothBleAdvertiserCallbackImp(std::weak_ptr<BleAdvertiser> advertiser)
4795489c19Sopenharmony_ci            : advertiser_(advertiser){};
4895489c19Sopenharmony_ci        ~BluetoothBleAdvertiserCallbackImp()
4995489c19Sopenharmony_ci        {}
5095489c19Sopenharmony_ci
5195489c19Sopenharmony_ci        __attribute__((no_sanitize("cfi")))
5295489c19Sopenharmony_ci        void OnStartResultEvent(int32_t result, int32_t advHandle, int32_t opcode) override
5395489c19Sopenharmony_ci        {
5495489c19Sopenharmony_ci            std::shared_ptr<BleAdvertiser> advertiserSptr = advertiser_.lock();
5595489c19Sopenharmony_ci            CHECK_AND_RETURN_LOG(advertiserSptr, "BleAdvertiser is destructed");
5695489c19Sopenharmony_ci
5795489c19Sopenharmony_ci            HILOGD("result: %{public}d, advHandle: %{public}d, opcode: %{public}d", result, advHandle, opcode);
5895489c19Sopenharmony_ci            std::shared_ptr<BleAdvertiseCallback> observer = nullptr;
5995489c19Sopenharmony_ci            if (opcode == bluetooth::BLE_ADV_START_FAILED_OP_CODE) {
6095489c19Sopenharmony_ci                observer = advertiserSptr->pimpl->callbacks_.PopAdvertiserObserver(advHandle);
6195489c19Sopenharmony_ci            } else {
6295489c19Sopenharmony_ci                observer = advertiserSptr->pimpl->callbacks_.GetAdvertiserObserver(advHandle);
6395489c19Sopenharmony_ci            }
6495489c19Sopenharmony_ci
6595489c19Sopenharmony_ci            if (observer != nullptr) {
6695489c19Sopenharmony_ci                observer->OnStartResultEvent(result, advHandle);
6795489c19Sopenharmony_ci            }
6895489c19Sopenharmony_ci        }
6995489c19Sopenharmony_ci
7095489c19Sopenharmony_ci        void OnEnableResultEvent(int32_t result, int32_t advHandle) override
7195489c19Sopenharmony_ci        {
7295489c19Sopenharmony_ci            std::shared_ptr<BleAdvertiser> advertiserSptr = advertiser_.lock();
7395489c19Sopenharmony_ci            CHECK_AND_RETURN_LOG(advertiserSptr, "BleAdvertiser is destructed");
7495489c19Sopenharmony_ci
7595489c19Sopenharmony_ci            HILOGI("result: %{public}d, advHandle: %{public}d", result, advHandle);
7695489c19Sopenharmony_ci            auto observer = advertiserSptr->pimpl->callbacks_.GetAdvertiserObserver(advHandle);
7795489c19Sopenharmony_ci            if (observer != nullptr) {
7895489c19Sopenharmony_ci                observer->OnEnableResultEvent(result, advHandle);
7995489c19Sopenharmony_ci            }
8095489c19Sopenharmony_ci        }
8195489c19Sopenharmony_ci
8295489c19Sopenharmony_ci        void OnDisableResultEvent(int32_t result, int32_t advHandle) override
8395489c19Sopenharmony_ci        {
8495489c19Sopenharmony_ci            std::shared_ptr<BleAdvertiser> advertiserSptr = advertiser_.lock();
8595489c19Sopenharmony_ci            CHECK_AND_RETURN_LOG(advertiserSptr, "BleAdvertiser is destructed");
8695489c19Sopenharmony_ci
8795489c19Sopenharmony_ci            HILOGI("result: %{public}d, advHandle: %{public}d", result, advHandle);
8895489c19Sopenharmony_ci            auto observer = advertiserSptr->pimpl->callbacks_.GetAdvertiserObserver(advHandle);
8995489c19Sopenharmony_ci            if (observer != nullptr) {
9095489c19Sopenharmony_ci                observer->OnDisableResultEvent(result, advHandle);
9195489c19Sopenharmony_ci            }
9295489c19Sopenharmony_ci        }
9395489c19Sopenharmony_ci
9495489c19Sopenharmony_ci        void OnStopResultEvent(int32_t result, int32_t advHandle) override
9595489c19Sopenharmony_ci        {
9695489c19Sopenharmony_ci            std::shared_ptr<BleAdvertiser> advertiserSptr = advertiser_.lock();
9795489c19Sopenharmony_ci            CHECK_AND_RETURN_LOG(advertiserSptr, "BleAdvertiser is destructed");
9895489c19Sopenharmony_ci
9995489c19Sopenharmony_ci            HILOGD("result: %{public}d, advHandle: %{public}d", result, advHandle);
10095489c19Sopenharmony_ci            auto observer = advertiserSptr->pimpl->callbacks_.PopAdvertiserObserver(advHandle);
10195489c19Sopenharmony_ci            if (observer != nullptr) {
10295489c19Sopenharmony_ci                observer->OnStopResultEvent(result, advHandle);
10395489c19Sopenharmony_ci            }
10495489c19Sopenharmony_ci        }
10595489c19Sopenharmony_ci
10695489c19Sopenharmony_ci        void OnAutoStopAdvEvent(int32_t advHandle) override
10795489c19Sopenharmony_ci        {
10895489c19Sopenharmony_ci            std::shared_ptr<BleAdvertiser> advertiserSptr = advertiser_.lock();
10995489c19Sopenharmony_ci            CHECK_AND_RETURN_LOG(advertiserSptr, "BleAdvertiser is destructed");
11095489c19Sopenharmony_ci
11195489c19Sopenharmony_ci            HILOGI("advHandle: %{public}d", advHandle);
11295489c19Sopenharmony_ci            auto observer = advertiserSptr->pimpl->callbacks_.GetAdvertiserObserver(advHandle);
11395489c19Sopenharmony_ci            if (observer != nullptr) {
11495489c19Sopenharmony_ci                advertiserSptr->pimpl->callbacks_.Deregister(observer);
11595489c19Sopenharmony_ci            }
11695489c19Sopenharmony_ci        }
11795489c19Sopenharmony_ci
11895489c19Sopenharmony_ci        void OnSetAdvDataEvent(int32_t result, int32_t advHandle) override
11995489c19Sopenharmony_ci        {
12095489c19Sopenharmony_ci            std::shared_ptr<BleAdvertiser> advertiserSptr = advertiser_.lock();
12195489c19Sopenharmony_ci            CHECK_AND_RETURN_LOG(advertiserSptr, "BleAdvertiser is destructed");
12295489c19Sopenharmony_ci
12395489c19Sopenharmony_ci            HILOGD("result: %{public}d, advHandle: %{public}d", result, advHandle);
12495489c19Sopenharmony_ci            auto observer = advertiserSptr->pimpl->callbacks_.GetAdvertiserObserver(advHandle);
12595489c19Sopenharmony_ci            if (observer) {
12695489c19Sopenharmony_ci                observer->OnSetAdvDataEvent(result);
12795489c19Sopenharmony_ci            }
12895489c19Sopenharmony_ci        }
12995489c19Sopenharmony_ci
13095489c19Sopenharmony_ci    private:
13195489c19Sopenharmony_ci        std::weak_ptr<BleAdvertiser> advertiser_;
13295489c19Sopenharmony_ci        BLUETOOTH_DISALLOW_COPY_AND_ASSIGN(BluetoothBleAdvertiserCallbackImp);
13395489c19Sopenharmony_ci    };
13495489c19Sopenharmony_ci    sptr<BluetoothBleAdvertiserCallbackImp> callbackImp_ = nullptr;
13595489c19Sopenharmony_ci
13695489c19Sopenharmony_ci    BluetoothObserverMap<std::shared_ptr<BleAdvertiseCallback>> callbacks_;
13795489c19Sopenharmony_ci    class BleAdvertiserDeathRecipient;
13895489c19Sopenharmony_ci    sptr<BleAdvertiserDeathRecipient> deathRecipient_ = nullptr;
13995489c19Sopenharmony_ci    int32_t profileRegisterId = 0;
14095489c19Sopenharmony_ci};
14195489c19Sopenharmony_ci
14295489c19Sopenharmony_ciclass BleAdvertiser::impl::BleAdvertiserDeathRecipient final : public IRemoteObject::DeathRecipient {
14395489c19Sopenharmony_cipublic:
14495489c19Sopenharmony_ci    explicit BleAdvertiserDeathRecipient(std::weak_ptr<BleAdvertiser> advertiser) : advertiser_(advertiser) {}
14595489c19Sopenharmony_ci    ~BleAdvertiserDeathRecipient() final = default;
14695489c19Sopenharmony_ci    BLUETOOTH_DISALLOW_COPY_AND_ASSIGN(BleAdvertiserDeathRecipient);
14795489c19Sopenharmony_ci
14895489c19Sopenharmony_ci    void OnRemoteDied(const wptr<IRemoteObject> &remote) final
14995489c19Sopenharmony_ci    {
15095489c19Sopenharmony_ci        HILOGI("enter");
15195489c19Sopenharmony_ci
15295489c19Sopenharmony_ci        std::shared_ptr<BleAdvertiser> advertiserSptr = advertiser_.lock();
15395489c19Sopenharmony_ci        CHECK_AND_RETURN_LOG(advertiserSptr, "BleAdvertiser is destructed");
15495489c19Sopenharmony_ci        advertiserSptr->pimpl->callbacks_.Clear();
15595489c19Sopenharmony_ci    }
15695489c19Sopenharmony_ci
15795489c19Sopenharmony_ciprivate:
15895489c19Sopenharmony_ci    std::weak_ptr<BleAdvertiser> advertiser_;
15995489c19Sopenharmony_ci};
16095489c19Sopenharmony_ci
16195489c19Sopenharmony_ciBleAdvertiser::impl::impl()
16295489c19Sopenharmony_ci{}
16395489c19Sopenharmony_ci
16495489c19Sopenharmony_ciBleAdvertiser::impl::~impl()
16595489c19Sopenharmony_ci{
16695489c19Sopenharmony_ci    HILOGD("start");
16795489c19Sopenharmony_ci    BluetoothProfileManager::GetInstance().DeregisterFunc(profileRegisterId);
16895489c19Sopenharmony_ci    callbacks_.Clear();
16995489c19Sopenharmony_ci    sptr<IBluetoothBleAdvertiser> proxy = GetRemoteProxy<IBluetoothBleAdvertiser>(BLE_ADVERTISER_SERVER);
17095489c19Sopenharmony_ci    CHECK_AND_RETURN_LOG(proxy != nullptr, "failed: no proxy");
17195489c19Sopenharmony_ci    proxy->DeregisterBleAdvertiserCallback(callbackImp_);
17295489c19Sopenharmony_ci    proxy->AsObject()->RemoveDeathRecipient(deathRecipient_);
17395489c19Sopenharmony_ci}
17495489c19Sopenharmony_ci
17595489c19Sopenharmony_ciBleAdvertiser::BleAdvertiser() : pimpl(nullptr)
17695489c19Sopenharmony_ci{
17795489c19Sopenharmony_ci    if (pimpl == nullptr) {
17895489c19Sopenharmony_ci        pimpl = std::make_unique<impl>();
17995489c19Sopenharmony_ci        if (!pimpl) {
18095489c19Sopenharmony_ci            HILOGE("failed, no pimpl");
18195489c19Sopenharmony_ci        }
18295489c19Sopenharmony_ci    }
18395489c19Sopenharmony_ci
18495489c19Sopenharmony_ci    HILOGI("successful");
18595489c19Sopenharmony_ci}
18695489c19Sopenharmony_ci
18795489c19Sopenharmony_ciBleAdvertiser::~BleAdvertiser()
18895489c19Sopenharmony_ci{}
18995489c19Sopenharmony_ci
19095489c19Sopenharmony_civoid BleAdvertiser::impl::Init(std::weak_ptr<BleAdvertiser> advertiser)
19195489c19Sopenharmony_ci{
19295489c19Sopenharmony_ci    callbackImp_ = new BluetoothBleAdvertiserCallbackImp(advertiser);
19395489c19Sopenharmony_ci    profileRegisterId = BluetoothProfileManager::GetInstance().RegisterFunc(BLE_ADVERTISER_SERVER,
19495489c19Sopenharmony_ci        [this, advertiser](sptr<IRemoteObject> remote) {
19595489c19Sopenharmony_ci        sptr<IBluetoothBleAdvertiser> proxy = iface_cast<IBluetoothBleAdvertiser>(remote);
19695489c19Sopenharmony_ci        CHECK_AND_RETURN_LOG(proxy != nullptr, "failed: no proxy");
19795489c19Sopenharmony_ci        proxy->RegisterBleAdvertiserCallback(callbackImp_);
19895489c19Sopenharmony_ci        deathRecipient_ = new BleAdvertiserDeathRecipient(advertiser);
19995489c19Sopenharmony_ci        if (deathRecipient_ != nullptr) {
20095489c19Sopenharmony_ci            proxy->AsObject()->AddDeathRecipient(deathRecipient_);
20195489c19Sopenharmony_ci        }
20295489c19Sopenharmony_ci    });
20395489c19Sopenharmony_ci}
20495489c19Sopenharmony_ci
20595489c19Sopenharmony_cistd::shared_ptr<BleAdvertiser> BleAdvertiser::CreateInstance(void)
20695489c19Sopenharmony_ci{
20795489c19Sopenharmony_ci    auto instance = std::make_shared<BleAdvertiser>(PassKey());
20895489c19Sopenharmony_ci    CHECK_AND_RETURN_LOG_RET(instance, nullptr, "Create BleAdvertiser failed");
20995489c19Sopenharmony_ci
21095489c19Sopenharmony_ci    instance->pimpl->Init(instance);
21195489c19Sopenharmony_ci    return instance;
21295489c19Sopenharmony_ci}
21395489c19Sopenharmony_ci
21495489c19Sopenharmony_civoid BleAdvertiser::impl::ConvertBleAdvertiserData(const BleAdvertiserData &data, BluetoothBleAdvertiserData &outData)
21595489c19Sopenharmony_ci{
21695489c19Sopenharmony_ci    std::map<uint16_t, std::string> manufacturerData = data.GetManufacturerData();
21795489c19Sopenharmony_ci    for (auto iter = manufacturerData.begin(); iter != manufacturerData.end(); iter++) {
21895489c19Sopenharmony_ci        outData.AddManufacturerData(iter->first, iter->second);
21995489c19Sopenharmony_ci    }
22095489c19Sopenharmony_ci    std::map<ParcelUuid, std::string> serviceData = data.GetServiceData();
22195489c19Sopenharmony_ci    for (auto it = serviceData.begin(); it != serviceData.end(); it++) {
22295489c19Sopenharmony_ci        outData.AddServiceData(Uuid::ConvertFromString(it->first.ToString()), it->second);
22395489c19Sopenharmony_ci    }
22495489c19Sopenharmony_ci    std::vector<ParcelUuid> serviceUuids = data.GetServiceUuids();
22595489c19Sopenharmony_ci    for (auto it = serviceUuids.begin(); it != serviceUuids.end(); it++) {
22695489c19Sopenharmony_ci        outData.AddServiceUuid(Uuid::ConvertFromString(it->ToString()));
22795489c19Sopenharmony_ci    }
22895489c19Sopenharmony_ci    outData.SetIncludeDeviceName(data.GetIncludeDeviceName());
22995489c19Sopenharmony_ci    outData.SetIncludeTxPower(data.GetIncludeTxPower());
23095489c19Sopenharmony_ci}
23195489c19Sopenharmony_ci
23295489c19Sopenharmony_ciuint32_t BleAdvertiser::impl::GetAdvertiserTotalBytes(const BluetoothBleAdvertiserData &data, bool isFlagsIncluded)
23395489c19Sopenharmony_ci{
23495489c19Sopenharmony_ci    // If the flag field is contained, the protocol stack adds the flag field, which consists of three bytes.
23595489c19Sopenharmony_ci    uint32_t size = (isFlagsIncluded) ? BLE_ADV_FLAGS_FIELD_LENGTH : 0;
23695489c19Sopenharmony_ci    std::map<uint16_t, std::string> manufacturerData = data.GetManufacturerData();
23795489c19Sopenharmony_ci    for (auto iter = manufacturerData.begin(); iter != manufacturerData.end(); ++iter) {
23895489c19Sopenharmony_ci        size += BLE_ADV_PER_FIELD_OVERHEAD_LENGTH + BLE_ADV_MANUFACTURER_ID_LENGTH + iter->second.length();
23995489c19Sopenharmony_ci    }
24095489c19Sopenharmony_ci
24195489c19Sopenharmony_ci    std::map<Uuid, std::string> serviceData = data.GetServiceData();
24295489c19Sopenharmony_ci    for (auto iter = serviceData.begin(); iter != serviceData.end(); ++iter) {
24395489c19Sopenharmony_ci        size += BLE_ADV_PER_FIELD_OVERHEAD_LENGTH + static_cast<uint32_t>(iter->first.GetUuidType())
24495489c19Sopenharmony_ci        + iter->second.length();
24595489c19Sopenharmony_ci    }
24695489c19Sopenharmony_ci    int num16BitUuids = 0;
24795489c19Sopenharmony_ci    int num32BitUuids = 0;
24895489c19Sopenharmony_ci    int num128BitUuids = 0;
24995489c19Sopenharmony_ci    std::vector<Uuid> serviceUuids = data.GetServiceUuids();
25095489c19Sopenharmony_ci    for (auto iter = serviceUuids.begin(); iter != serviceUuids.end(); ++iter) {
25195489c19Sopenharmony_ci        if (iter->GetUuidType() == Uuid::UUID16_BYTES_TYPE) {
25295489c19Sopenharmony_ci            ++num16BitUuids;
25395489c19Sopenharmony_ci        } else if (iter->GetUuidType() == Uuid::UUID32_BYTES_TYPE) {
25495489c19Sopenharmony_ci            ++num32BitUuids;
25595489c19Sopenharmony_ci        } else {
25695489c19Sopenharmony_ci            ++num128BitUuids;
25795489c19Sopenharmony_ci        }
25895489c19Sopenharmony_ci    }
25995489c19Sopenharmony_ci    if (num16BitUuids != 0) {
26095489c19Sopenharmony_ci        size += BLE_ADV_PER_FIELD_OVERHEAD_LENGTH + static_cast<uint32_t>(num16BitUuids * Uuid::UUID16_BYTES_TYPE);
26195489c19Sopenharmony_ci    }
26295489c19Sopenharmony_ci    if (num32BitUuids != 0) {
26395489c19Sopenharmony_ci        size += BLE_ADV_PER_FIELD_OVERHEAD_LENGTH + static_cast<uint32_t>(num32BitUuids * Uuid::UUID32_BYTES_TYPE);
26495489c19Sopenharmony_ci    }
26595489c19Sopenharmony_ci    if (num128BitUuids != 0) {
26695489c19Sopenharmony_ci        size += BLE_ADV_PER_FIELD_OVERHEAD_LENGTH + static_cast<uint32_t>(num128BitUuids * Uuid::UUID128_BYTES_TYPE);
26795489c19Sopenharmony_ci    }
26895489c19Sopenharmony_ci    if (data.GetIncludeDeviceName()) {
26995489c19Sopenharmony_ci        uint32_t deviceNameLen = BluetoothHost::GetDefaultHost().GetLocalName().length();
27095489c19Sopenharmony_ci        deviceNameLen = (deviceNameLen > DEVICE_NAME_MAX_LEN) ?  DEVICE_NAME_MAX_LEN : deviceNameLen;
27195489c19Sopenharmony_ci        size += BLE_ADV_PER_FIELD_OVERHEAD_LENGTH + deviceNameLen;
27295489c19Sopenharmony_ci    }
27395489c19Sopenharmony_ci    if (data.GetIncludeTxPower()) {
27495489c19Sopenharmony_ci        uint32_t txPowerLen = 3;
27595489c19Sopenharmony_ci        size += BLE_ADV_PER_FIELD_OVERHEAD_LENGTH + txPowerLen;
27695489c19Sopenharmony_ci    }
27795489c19Sopenharmony_ci    return size;
27895489c19Sopenharmony_ci}
27995489c19Sopenharmony_ci
28095489c19Sopenharmony_ciint32_t BleAdvertiser::impl::CheckAdvertiserSettings(const BleAdvertiserSettings &settings)
28195489c19Sopenharmony_ci{
28295489c19Sopenharmony_ci    int8_t txPower = settings.GetTxPower();
28395489c19Sopenharmony_ci    if (txPower < BLE_ADV_TX_POWER_MIN_VALUE || txPower > BLE_ADV_TX_POWER_MAX_VALUE) {
28495489c19Sopenharmony_ci        HILOGE("Illegal txPower argument %{public}d", txPower);
28595489c19Sopenharmony_ci        return BT_ERR_INVALID_PARAM;
28695489c19Sopenharmony_ci    }
28795489c19Sopenharmony_ci
28895489c19Sopenharmony_ci    return BT_NO_ERROR;
28995489c19Sopenharmony_ci}
29095489c19Sopenharmony_ci
29195489c19Sopenharmony_ciint32_t BleAdvertiser::impl::CheckAdvertiserData(const BluetoothBleAdvertiserSettings &setting,
29295489c19Sopenharmony_ci    const BluetoothBleAdvertiserData &advData, const BluetoothBleAdvertiserData &scanResponse)
29395489c19Sopenharmony_ci{
29495489c19Sopenharmony_ci    uint32_t maxSize = BLE_ADV_MAX_LEGACY_ADVERTISING_DATA_BYTES;
29595489c19Sopenharmony_ci    if (!setting.IsLegacyMode()) {
29695489c19Sopenharmony_ci        maxSize = static_cast<uint32_t>(BluetoothHost::GetDefaultHost().GetBleMaxAdvertisingDataLength());
29795489c19Sopenharmony_ci    }
29895489c19Sopenharmony_ci    // If is Connect, flag field is contained in AdvertiserData.
29995489c19Sopenharmony_ci    uint32_t size = GetAdvertiserTotalBytes(advData, setting.IsConnectable());
30095489c19Sopenharmony_ci    if (size > maxSize) {
30195489c19Sopenharmony_ci        HILOGE("bleAdvertiserData size = %{public}d, maxSize = %{public}d", size, maxSize);
30295489c19Sopenharmony_ci        return BT_ERR_INTERNAL_ERROR;
30395489c19Sopenharmony_ci    }
30495489c19Sopenharmony_ci    size = GetAdvertiserTotalBytes(scanResponse, false);
30595489c19Sopenharmony_ci    if (size > maxSize) {
30695489c19Sopenharmony_ci        HILOGE("bleScanResponse size = %{public}d, maxSize = %{public}d,", size, maxSize);
30795489c19Sopenharmony_ci        return BT_ERR_INTERNAL_ERROR;
30895489c19Sopenharmony_ci    }
30995489c19Sopenharmony_ci    return BT_NO_ERROR;
31095489c19Sopenharmony_ci}
31195489c19Sopenharmony_ci
31295489c19Sopenharmony_ciint BleAdvertiser::StartAdvertising(const BleAdvertiserSettings &settings, const BleAdvertiserData &advData,
31395489c19Sopenharmony_ci    const BleAdvertiserData &scanResponse, uint16_t duration, std::shared_ptr<BleAdvertiseCallback> callback)
31495489c19Sopenharmony_ci{
31595489c19Sopenharmony_ci    if (!IS_BLE_ENABLED()) {
31695489c19Sopenharmony_ci        HILOGE("bluetooth is off.");
31795489c19Sopenharmony_ci        return BT_ERR_INVALID_STATE;
31895489c19Sopenharmony_ci    }
31995489c19Sopenharmony_ci    sptr<IBluetoothBleAdvertiser> proxy = GetRemoteProxy<IBluetoothBleAdvertiser>(BLE_ADVERTISER_SERVER);
32095489c19Sopenharmony_ci    CHECK_AND_RETURN_LOG_RET(proxy != nullptr, BT_ERR_INTERNAL_ERROR, "failed: no proxy");
32195489c19Sopenharmony_ci    CHECK_AND_RETURN_LOG_RET(callback != nullptr, BT_ERR_INTERNAL_ERROR, "callback is nullptr");
32295489c19Sopenharmony_ci
32395489c19Sopenharmony_ci    int ret = pimpl->CheckAdvertiserSettings(settings);
32495489c19Sopenharmony_ci    if (ret != BT_NO_ERROR) {
32595489c19Sopenharmony_ci        return ret;
32695489c19Sopenharmony_ci    }
32795489c19Sopenharmony_ci    BluetoothBleAdvertiserSettings setting;
32895489c19Sopenharmony_ci    setting.SetConnectable(settings.IsConnectable());
32995489c19Sopenharmony_ci    setting.SetInterval(settings.GetInterval());
33095489c19Sopenharmony_ci    setting.SetLegacyMode(settings.IsLegacyMode());
33195489c19Sopenharmony_ci    setting.SetTxPower(settings.GetTxPower());
33295489c19Sopenharmony_ci    setting.SetOwnAddr(settings.GetOwnAddr());
33395489c19Sopenharmony_ci    setting.SetOwnAddrType(settings.GetOwnAddrType());
33495489c19Sopenharmony_ci
33595489c19Sopenharmony_ci    BluetoothBleAdvertiserData bleAdvertiserData;
33695489c19Sopenharmony_ci    BluetoothBleAdvertiserData bleScanResponse;
33795489c19Sopenharmony_ci    bleAdvertiserData.SetAdvFlag(advData.GetAdvFlag());
33895489c19Sopenharmony_ci    pimpl->ConvertBleAdvertiserData(advData, bleAdvertiserData);
33995489c19Sopenharmony_ci    pimpl->ConvertBleAdvertiserData(scanResponse, bleScanResponse);
34095489c19Sopenharmony_ci
34195489c19Sopenharmony_ci    ret = pimpl->CheckAdvertiserData(setting, bleAdvertiserData, bleScanResponse);
34295489c19Sopenharmony_ci    if (ret != BT_NO_ERROR) {
34395489c19Sopenharmony_ci        return ret;
34495489c19Sopenharmony_ci    }
34595489c19Sopenharmony_ci
34695489c19Sopenharmony_ci    HILOGD("duration=%{public}d", duration);
34795489c19Sopenharmony_ci    int32_t advHandle = BLE_INVALID_ADVERTISING_HANDLE;
34895489c19Sopenharmony_ci    if (pimpl->callbacks_.IsExistAdvertiserCallback(callback, advHandle)) {
34995489c19Sopenharmony_ci        ret = proxy->StartAdvertising(setting, bleAdvertiserData, bleScanResponse, advHandle, duration, false);
35095489c19Sopenharmony_ci    } else {
35195489c19Sopenharmony_ci        ret = proxy->GetAdvertiserHandle(advHandle);
35295489c19Sopenharmony_ci        if (ret != BT_NO_ERROR || advHandle == BLE_INVALID_ADVERTISING_HANDLE) {
35395489c19Sopenharmony_ci            HILOGE("Invalid advertising handle");
35495489c19Sopenharmony_ci            callback->OnStartResultEvent(BT_ERR_INTERNAL_ERROR, static_cast<int>(BLE_INVALID_ADVERTISING_HANDLE));
35595489c19Sopenharmony_ci            return ret;
35695489c19Sopenharmony_ci        }
35795489c19Sopenharmony_ci        callback->OnGetAdvHandleEvent(0, advHandle);
35895489c19Sopenharmony_ci        pimpl->callbacks_.Register(advHandle, callback);
35995489c19Sopenharmony_ci        ret = proxy->StartAdvertising(setting, bleAdvertiserData, bleScanResponse, advHandle, duration, false);
36095489c19Sopenharmony_ci    }
36195489c19Sopenharmony_ci    return ret;
36295489c19Sopenharmony_ci}
36395489c19Sopenharmony_ci
36495489c19Sopenharmony_ciint BleAdvertiser::StartAdvertising(const BleAdvertiserSettings &settings, const std::vector<uint8_t> &advData,
36595489c19Sopenharmony_ci    const std::vector<uint8_t> &scanResponse, uint16_t duration, std::shared_ptr<BleAdvertiseCallback> callback)
36695489c19Sopenharmony_ci{
36795489c19Sopenharmony_ci    if (!IS_BLE_ENABLED()) {
36895489c19Sopenharmony_ci        HILOGE("bluetooth is off.");
36995489c19Sopenharmony_ci        return BT_ERR_INVALID_STATE;
37095489c19Sopenharmony_ci    }
37195489c19Sopenharmony_ci
37295489c19Sopenharmony_ci    sptr<IBluetoothBleAdvertiser> proxy = GetRemoteProxy<IBluetoothBleAdvertiser>(BLE_ADVERTISER_SERVER);
37395489c19Sopenharmony_ci    CHECK_AND_RETURN_LOG_RET(proxy != nullptr, BT_ERR_INTERNAL_ERROR, "failed: no proxy");
37495489c19Sopenharmony_ci    CHECK_AND_RETURN_LOG_RET(callback != nullptr, BT_ERR_INTERNAL_ERROR, "callback is nullptr");
37595489c19Sopenharmony_ci
37695489c19Sopenharmony_ci    int ret = pimpl->CheckAdvertiserSettings(settings);
37795489c19Sopenharmony_ci    if (ret != BT_NO_ERROR) {
37895489c19Sopenharmony_ci        return ret;
37995489c19Sopenharmony_ci    }
38095489c19Sopenharmony_ci    BluetoothBleAdvertiserSettings setting;
38195489c19Sopenharmony_ci    setting.SetConnectable(settings.IsConnectable());
38295489c19Sopenharmony_ci    setting.SetInterval(settings.GetInterval());
38395489c19Sopenharmony_ci    setting.SetLegacyMode(settings.IsLegacyMode());
38495489c19Sopenharmony_ci    setting.SetTxPower(settings.GetTxPower());
38595489c19Sopenharmony_ci    setting.SetOwnAddr(settings.GetOwnAddr());
38695489c19Sopenharmony_ci    setting.SetOwnAddrType(settings.GetOwnAddrType());
38795489c19Sopenharmony_ci
38895489c19Sopenharmony_ci    BluetoothBleAdvertiserData bleAdvertiserData;
38995489c19Sopenharmony_ci    bleAdvertiserData.SetPayload(std::string(advData.begin(), advData.end()));
39095489c19Sopenharmony_ci    bleAdvertiserData.SetAdvFlag(0);
39195489c19Sopenharmony_ci    BluetoothBleAdvertiserData bleScanResponse;
39295489c19Sopenharmony_ci    bleScanResponse.SetPayload(std::string(scanResponse.begin(), scanResponse.end()));
39395489c19Sopenharmony_ci
39495489c19Sopenharmony_ci    HILOGI("duration=%{public}d", duration);
39595489c19Sopenharmony_ci    int32_t advHandle = BLE_INVALID_ADVERTISING_HANDLE;
39695489c19Sopenharmony_ci    if (pimpl->callbacks_.IsExistAdvertiserCallback(callback, advHandle)) {
39795489c19Sopenharmony_ci        ret = proxy->StartAdvertising(setting, bleAdvertiserData, bleScanResponse, advHandle, duration, true);
39895489c19Sopenharmony_ci    } else {
39995489c19Sopenharmony_ci        ret = proxy->GetAdvertiserHandle(advHandle);
40095489c19Sopenharmony_ci        if (ret != BT_NO_ERROR || advHandle == BLE_INVALID_ADVERTISING_HANDLE) {
40195489c19Sopenharmony_ci            HILOGE("Invalid advertising handle");
40295489c19Sopenharmony_ci            callback->OnStartResultEvent(BT_ERR_INTERNAL_ERROR, BLE_INVALID_ADVERTISING_HANDLE);
40395489c19Sopenharmony_ci            return ret;
40495489c19Sopenharmony_ci        }
40595489c19Sopenharmony_ci        pimpl->callbacks_.Register(advHandle, callback);
40695489c19Sopenharmony_ci        ret = proxy->StartAdvertising(setting, bleAdvertiserData, bleScanResponse, advHandle, duration, true);
40795489c19Sopenharmony_ci    }
40895489c19Sopenharmony_ci    return ret;
40995489c19Sopenharmony_ci}
41095489c19Sopenharmony_ci
41195489c19Sopenharmony_civoid BleAdvertiser::SetAdvertisingData(const std::vector<uint8_t> &advData, const std::vector<uint8_t> &scanResponse,
41295489c19Sopenharmony_ci    std::shared_ptr<BleAdvertiseCallback> callback)
41395489c19Sopenharmony_ci{
41495489c19Sopenharmony_ci    if (!IS_BLE_ENABLED()) {
41595489c19Sopenharmony_ci        HILOGE("bluetooth is off.");
41695489c19Sopenharmony_ci        return;
41795489c19Sopenharmony_ci    }
41895489c19Sopenharmony_ci    sptr<IBluetoothBleAdvertiser> proxy = GetRemoteProxy<IBluetoothBleAdvertiser>(BLE_ADVERTISER_SERVER);
41995489c19Sopenharmony_ci    CHECK_AND_RETURN_LOG(proxy != nullptr, "failed: no proxy");
42095489c19Sopenharmony_ci
42195489c19Sopenharmony_ci    CHECK_AND_RETURN_LOG(callback != nullptr, "callback is nullptr");
42295489c19Sopenharmony_ci
42395489c19Sopenharmony_ci    int advHandle = BLE_INVALID_ADVERTISING_HANDLE;
42495489c19Sopenharmony_ci    if (!pimpl->callbacks_.IsExistAdvertiserCallback(callback, advHandle)) {
42595489c19Sopenharmony_ci        HILOGE("Advertising is not started");
42695489c19Sopenharmony_ci        return;
42795489c19Sopenharmony_ci    }
42895489c19Sopenharmony_ci
42995489c19Sopenharmony_ci    BluetoothBleAdvertiserData bleAdvertiserData;
43095489c19Sopenharmony_ci    bleAdvertiserData.SetPayload(std::string(advData.begin(), advData.end()));
43195489c19Sopenharmony_ci    BluetoothBleAdvertiserData bleScanResponse;
43295489c19Sopenharmony_ci    bleScanResponse.SetPayload(std::string(scanResponse.begin(), scanResponse.end()));
43395489c19Sopenharmony_ci    proxy->SetAdvertisingData(bleAdvertiserData, bleScanResponse, advHandle);
43495489c19Sopenharmony_ci}
43595489c19Sopenharmony_ci
43695489c19Sopenharmony_ciint BleAdvertiser::EnableAdvertising(uint8_t advHandle, uint16_t duration,
43795489c19Sopenharmony_ci    std::shared_ptr<BleAdvertiseCallback> callback)
43895489c19Sopenharmony_ci{
43995489c19Sopenharmony_ci    HILOGI("enter");
44095489c19Sopenharmony_ci    if (!IS_BLE_ENABLED()) {
44195489c19Sopenharmony_ci        HILOGE("bluetooth is off.");
44295489c19Sopenharmony_ci        return BT_ERR_INVALID_STATE;
44395489c19Sopenharmony_ci    }
44495489c19Sopenharmony_ci    sptr<IBluetoothBleAdvertiser> proxy = GetRemoteProxy<IBluetoothBleAdvertiser>(BLE_ADVERTISER_SERVER);
44595489c19Sopenharmony_ci    CHECK_AND_RETURN_LOG_RET(proxy != nullptr, BT_ERR_INTERNAL_ERROR, "failed: no proxy");
44695489c19Sopenharmony_ci
44795489c19Sopenharmony_ci    CHECK_AND_RETURN_LOG_RET(callback != nullptr, BT_ERR_INTERNAL_ERROR, "callback is nullptr");
44895489c19Sopenharmony_ci    uint8_t tmpAdvHandle = pimpl->callbacks_.GetAdvertiserHandle(callback);
44995489c19Sopenharmony_ci    if (tmpAdvHandle == BLE_INVALID_ADVERTISING_HANDLE) {
45095489c19Sopenharmony_ci        HILOGE("Invalid advertising callback");
45195489c19Sopenharmony_ci        return BT_ERR_INTERNAL_ERROR;
45295489c19Sopenharmony_ci    }
45395489c19Sopenharmony_ci
45495489c19Sopenharmony_ci    std::shared_ptr<BleAdvertiseCallback> observer = pimpl->callbacks_.GetAdvertiserObserver(advHandle);
45595489c19Sopenharmony_ci    if (observer == nullptr) {
45695489c19Sopenharmony_ci        HILOGE("Invalid advertising handle");
45795489c19Sopenharmony_ci        return BT_ERR_INTERNAL_ERROR;
45895489c19Sopenharmony_ci    }
45995489c19Sopenharmony_ci
46095489c19Sopenharmony_ci    int ret = proxy->EnableAdvertising(advHandle, duration);
46195489c19Sopenharmony_ci    return ret;
46295489c19Sopenharmony_ci}
46395489c19Sopenharmony_ci
46495489c19Sopenharmony_ciint BleAdvertiser::DisableAdvertising(uint8_t advHandle, std::shared_ptr<BleAdvertiseCallback> callback)
46595489c19Sopenharmony_ci{
46695489c19Sopenharmony_ci    HILOGI("enter");
46795489c19Sopenharmony_ci    if (!IS_BLE_ENABLED()) {
46895489c19Sopenharmony_ci        HILOGE("bluetooth is off.");
46995489c19Sopenharmony_ci        return BT_ERR_INVALID_STATE;
47095489c19Sopenharmony_ci    }
47195489c19Sopenharmony_ci
47295489c19Sopenharmony_ci    sptr<IBluetoothBleAdvertiser> proxy = GetRemoteProxy<IBluetoothBleAdvertiser>(BLE_ADVERTISER_SERVER);
47395489c19Sopenharmony_ci    CHECK_AND_RETURN_LOG_RET(proxy != nullptr, BT_ERR_INTERNAL_ERROR, "failed: no proxy");
47495489c19Sopenharmony_ci    CHECK_AND_RETURN_LOG_RET(callback != nullptr, BT_ERR_INTERNAL_ERROR, "callback is nullptr");
47595489c19Sopenharmony_ci    uint8_t tmpAdvHandle = pimpl->callbacks_.GetAdvertiserHandle(callback);
47695489c19Sopenharmony_ci    if (tmpAdvHandle == BLE_INVALID_ADVERTISING_HANDLE) {
47795489c19Sopenharmony_ci        HILOGE("Invalid advertising callback");
47895489c19Sopenharmony_ci        return BT_ERR_INTERNAL_ERROR;
47995489c19Sopenharmony_ci    }
48095489c19Sopenharmony_ci
48195489c19Sopenharmony_ci    std::shared_ptr<BleAdvertiseCallback> observer = pimpl->callbacks_.GetAdvertiserObserver(advHandle);
48295489c19Sopenharmony_ci    if (observer == nullptr) {
48395489c19Sopenharmony_ci        HILOGE("Invalid advertising handle");
48495489c19Sopenharmony_ci        return BT_ERR_INTERNAL_ERROR;
48595489c19Sopenharmony_ci    }
48695489c19Sopenharmony_ci
48795489c19Sopenharmony_ci    int ret = proxy->DisableAdvertising(advHandle);
48895489c19Sopenharmony_ci    return ret;
48995489c19Sopenharmony_ci}
49095489c19Sopenharmony_ci
49195489c19Sopenharmony_ciint BleAdvertiser::StopAdvertising(std::shared_ptr<BleAdvertiseCallback> callback)
49295489c19Sopenharmony_ci{
49395489c19Sopenharmony_ci    if (!IS_BLE_ENABLED()) {
49495489c19Sopenharmony_ci        HILOGE("bluetooth is off.");
49595489c19Sopenharmony_ci        return BT_ERR_INVALID_STATE;
49695489c19Sopenharmony_ci    }
49795489c19Sopenharmony_ci
49895489c19Sopenharmony_ci    sptr<IBluetoothBleAdvertiser> proxy = GetRemoteProxy<IBluetoothBleAdvertiser>(BLE_ADVERTISER_SERVER);
49995489c19Sopenharmony_ci    CHECK_AND_RETURN_LOG_RET(proxy != nullptr, BT_ERR_INTERNAL_ERROR, "failed: no proxy");
50095489c19Sopenharmony_ci    CHECK_AND_RETURN_LOG_RET(callback != nullptr, BT_ERR_INTERNAL_ERROR, "callback is nullptr");
50195489c19Sopenharmony_ci
50295489c19Sopenharmony_ci    HILOGD("enter");
50395489c19Sopenharmony_ci    uint8_t advHandle = pimpl->callbacks_.GetAdvertiserHandle(callback);
50495489c19Sopenharmony_ci    if (advHandle == BLE_INVALID_ADVERTISING_HANDLE) {
50595489c19Sopenharmony_ci        HILOGE("Invalid advertising handle");
50695489c19Sopenharmony_ci        return BT_ERR_INTERNAL_ERROR;
50795489c19Sopenharmony_ci    }
50895489c19Sopenharmony_ci
50995489c19Sopenharmony_ci    int ret = proxy->StopAdvertising(advHandle);
51095489c19Sopenharmony_ci    return ret;
51195489c19Sopenharmony_ci}
51295489c19Sopenharmony_ci
51395489c19Sopenharmony_civoid BleAdvertiser::Close(std::shared_ptr<BleAdvertiseCallback> callback)
51495489c19Sopenharmony_ci{
51595489c19Sopenharmony_ci    if (!IS_BLE_ENABLED()) {
51695489c19Sopenharmony_ci        HILOGE("BLE is not enabled");
51795489c19Sopenharmony_ci        return;
51895489c19Sopenharmony_ci    }
51995489c19Sopenharmony_ci
52095489c19Sopenharmony_ci    sptr<IBluetoothBleAdvertiser> proxy = GetRemoteProxy<IBluetoothBleAdvertiser>(BLE_ADVERTISER_SERVER);
52195489c19Sopenharmony_ci    CHECK_AND_RETURN_LOG(proxy != nullptr, "proxy is nullptr");
52295489c19Sopenharmony_ci    CHECK_AND_RETURN_LOG(callback != nullptr, "callback is nullptr");
52395489c19Sopenharmony_ci
52495489c19Sopenharmony_ci    HILOGI("enter");
52595489c19Sopenharmony_ci    if (proxy != nullptr) {
52695489c19Sopenharmony_ci        uint8_t advHandle = pimpl->callbacks_.GetAdvertiserHandle(callback);
52795489c19Sopenharmony_ci        if (advHandle != BLE_INVALID_ADVERTISING_HANDLE) {
52895489c19Sopenharmony_ci            proxy->Close(advHandle);
52995489c19Sopenharmony_ci        }
53095489c19Sopenharmony_ci
53195489c19Sopenharmony_ci        std::shared_ptr<BleAdvertiseCallback> observer = pimpl->callbacks_.GetAdvertiserObserver(advHandle);
53295489c19Sopenharmony_ci        if (observer != nullptr) {
53395489c19Sopenharmony_ci            pimpl->callbacks_.Deregister(observer);
53495489c19Sopenharmony_ci        }
53595489c19Sopenharmony_ci    }
53695489c19Sopenharmony_ci}
53795489c19Sopenharmony_ci
53895489c19Sopenharmony_ciuint8_t BleAdvertiser::GetAdvHandle(std::shared_ptr<BleAdvertiseCallback> callback)
53995489c19Sopenharmony_ci{
54095489c19Sopenharmony_ci    if (!BluetoothHost::GetDefaultHost().IsBleEnabled()) {
54195489c19Sopenharmony_ci        HILOGE("BLE is not enabled");
54295489c19Sopenharmony_ci        return BLE_INVALID_ADVERTISING_HANDLE;
54395489c19Sopenharmony_ci    }
54495489c19Sopenharmony_ci    CHECK_AND_RETURN_LOG_RET(callback != nullptr, BLE_INVALID_ADVERTISING_HANDLE, "callback is nullptr");
54595489c19Sopenharmony_ci    return pimpl->callbacks_.GetAdvertiserHandle(callback);
54695489c19Sopenharmony_ci}
54795489c19Sopenharmony_ci
54895489c19Sopenharmony_ciBleAdvertiserData::BleAdvertiserData()
54995489c19Sopenharmony_ci{}
55095489c19Sopenharmony_ci
55195489c19Sopenharmony_ciBleAdvertiserData::~BleAdvertiserData()
55295489c19Sopenharmony_ci{}
55395489c19Sopenharmony_ci
55495489c19Sopenharmony_civoid BleAdvertiserData::AddServiceData(const ParcelUuid &uuid, const std::string &serviceData)
55595489c19Sopenharmony_ci{
55695489c19Sopenharmony_ci    if (serviceData.empty()) {
55795489c19Sopenharmony_ci        HILOGE("serviceData is empty");
55895489c19Sopenharmony_ci        return;
55995489c19Sopenharmony_ci    }
56095489c19Sopenharmony_ci
56195489c19Sopenharmony_ci    serviceData_.insert(std::make_pair(uuid, serviceData));
56295489c19Sopenharmony_ci}
56395489c19Sopenharmony_ci
56495489c19Sopenharmony_civoid BleAdvertiserData::AddManufacturerData(uint16_t manufacturerId, const std::string &data)
56595489c19Sopenharmony_ci{
56695489c19Sopenharmony_ci    if (data.empty()) {
56795489c19Sopenharmony_ci        HILOGE("serviceData is empty");
56895489c19Sopenharmony_ci        return;
56995489c19Sopenharmony_ci    }
57095489c19Sopenharmony_ci
57195489c19Sopenharmony_ci    manufacturerSpecificData_.insert(std::make_pair(manufacturerId, data));
57295489c19Sopenharmony_ci}
57395489c19Sopenharmony_ci
57495489c19Sopenharmony_cistd::map<uint16_t, std::string> BleAdvertiserData::GetManufacturerData() const
57595489c19Sopenharmony_ci{
57695489c19Sopenharmony_ci    return manufacturerSpecificData_;
57795489c19Sopenharmony_ci}
57895489c19Sopenharmony_ci
57995489c19Sopenharmony_civoid BleAdvertiserData::AddServiceUuid(const ParcelUuid &serviceUuid)
58095489c19Sopenharmony_ci{
58195489c19Sopenharmony_ci    serviceUuids_.push_back(serviceUuid);
58295489c19Sopenharmony_ci}
58395489c19Sopenharmony_ci
58495489c19Sopenharmony_cistd::vector<ParcelUuid> BleAdvertiserData::GetServiceUuids() const
58595489c19Sopenharmony_ci{
58695489c19Sopenharmony_ci    return serviceUuids_;
58795489c19Sopenharmony_ci}
58895489c19Sopenharmony_ci
58995489c19Sopenharmony_civoid BleAdvertiserData::SetAdvFlag(uint8_t flag)
59095489c19Sopenharmony_ci{
59195489c19Sopenharmony_ci    advFlag_ = flag;
59295489c19Sopenharmony_ci}
59395489c19Sopenharmony_ci
59495489c19Sopenharmony_ciuint8_t BleAdvertiserData::GetAdvFlag() const
59595489c19Sopenharmony_ci{
59695489c19Sopenharmony_ci    return advFlag_;
59795489c19Sopenharmony_ci}
59895489c19Sopenharmony_ci
59995489c19Sopenharmony_cistd::map<ParcelUuid, std::string> BleAdvertiserData::GetServiceData() const
60095489c19Sopenharmony_ci{
60195489c19Sopenharmony_ci    return serviceData_;
60295489c19Sopenharmony_ci}
60395489c19Sopenharmony_ci
60495489c19Sopenharmony_cibool BleAdvertiserData::GetIncludeDeviceName() const
60595489c19Sopenharmony_ci{
60695489c19Sopenharmony_ci    return includeDeviceName_;
60795489c19Sopenharmony_ci}
60895489c19Sopenharmony_ci
60995489c19Sopenharmony_civoid BleAdvertiserData::SetIncludeDeviceName(bool flag)
61095489c19Sopenharmony_ci{
61195489c19Sopenharmony_ci    includeDeviceName_ = flag;
61295489c19Sopenharmony_ci}
61395489c19Sopenharmony_ci
61495489c19Sopenharmony_cibool BleAdvertiserData::GetIncludeTxPower() const
61595489c19Sopenharmony_ci{
61695489c19Sopenharmony_ci    return includeTxPower_;
61795489c19Sopenharmony_ci}
61895489c19Sopenharmony_ci
61995489c19Sopenharmony_civoid BleAdvertiserData::SetIncludeTxPower(bool flag)
62095489c19Sopenharmony_ci{
62195489c19Sopenharmony_ci    includeTxPower_ = flag;
62295489c19Sopenharmony_ci}
62395489c19Sopenharmony_ci
62495489c19Sopenharmony_ciBleAdvertiserSettings::BleAdvertiserSettings()
62595489c19Sopenharmony_ci{}
62695489c19Sopenharmony_ci
62795489c19Sopenharmony_ciBleAdvertiserSettings::~BleAdvertiserSettings()
62895489c19Sopenharmony_ci{}
62995489c19Sopenharmony_ci
63095489c19Sopenharmony_civoid BleAdvertiserSettings::SetConnectable(bool connectable)
63195489c19Sopenharmony_ci{
63295489c19Sopenharmony_ci    connectable_ = connectable;
63395489c19Sopenharmony_ci}
63495489c19Sopenharmony_ci
63595489c19Sopenharmony_cibool BleAdvertiserSettings::IsConnectable() const
63695489c19Sopenharmony_ci{
63795489c19Sopenharmony_ci    return connectable_;
63895489c19Sopenharmony_ci}
63995489c19Sopenharmony_ci
64095489c19Sopenharmony_civoid BleAdvertiserSettings::SetLegacyMode(bool legacyMode)
64195489c19Sopenharmony_ci{
64295489c19Sopenharmony_ci    legacyMode_ = legacyMode;
64395489c19Sopenharmony_ci}
64495489c19Sopenharmony_ci
64595489c19Sopenharmony_cibool BleAdvertiserSettings::IsLegacyMode() const
64695489c19Sopenharmony_ci{
64795489c19Sopenharmony_ci    return legacyMode_;
64895489c19Sopenharmony_ci}
64995489c19Sopenharmony_ci
65095489c19Sopenharmony_civoid BleAdvertiserSettings::SetInterval(uint16_t interval)
65195489c19Sopenharmony_ci{
65295489c19Sopenharmony_ci    interval_ = interval;
65395489c19Sopenharmony_ci}
65495489c19Sopenharmony_ci
65595489c19Sopenharmony_ciuint16_t BleAdvertiserSettings::GetInterval() const
65695489c19Sopenharmony_ci{
65795489c19Sopenharmony_ci    return interval_;
65895489c19Sopenharmony_ci}
65995489c19Sopenharmony_ci
66095489c19Sopenharmony_civoid BleAdvertiserSettings::SetTxPower(int8_t txPower)
66195489c19Sopenharmony_ci{
66295489c19Sopenharmony_ci    txPower_ = txPower;
66395489c19Sopenharmony_ci}
66495489c19Sopenharmony_ci
66595489c19Sopenharmony_ciint8_t BleAdvertiserSettings::GetTxPower() const
66695489c19Sopenharmony_ci{
66795489c19Sopenharmony_ci    return txPower_;
66895489c19Sopenharmony_ci}
66995489c19Sopenharmony_ci
67095489c19Sopenharmony_ciint BleAdvertiserSettings::GetPrimaryPhy() const
67195489c19Sopenharmony_ci{
67295489c19Sopenharmony_ci    return primaryPhy_;
67395489c19Sopenharmony_ci}
67495489c19Sopenharmony_ci
67595489c19Sopenharmony_civoid BleAdvertiserSettings::SetPrimaryPhy(int primaryPhy)
67695489c19Sopenharmony_ci{
67795489c19Sopenharmony_ci    primaryPhy_ = primaryPhy;
67895489c19Sopenharmony_ci}
67995489c19Sopenharmony_ci
68095489c19Sopenharmony_ciint BleAdvertiserSettings::GetSecondaryPhy() const
68195489c19Sopenharmony_ci{
68295489c19Sopenharmony_ci    return secondaryPhy_;
68395489c19Sopenharmony_ci}
68495489c19Sopenharmony_ci
68595489c19Sopenharmony_civoid BleAdvertiserSettings::SetSecondaryPhy(int secondaryPhy)
68695489c19Sopenharmony_ci{
68795489c19Sopenharmony_ci    secondaryPhy_ = secondaryPhy;
68895489c19Sopenharmony_ci}
68995489c19Sopenharmony_ci
69095489c19Sopenharmony_cistd::array<uint8_t, OHOS_BD_ADDR_LEN> BleAdvertiserSettings::GetOwnAddr() const
69195489c19Sopenharmony_ci{
69295489c19Sopenharmony_ci    return ownAddr_;
69395489c19Sopenharmony_ci}
69495489c19Sopenharmony_ci
69595489c19Sopenharmony_civoid BleAdvertiserSettings::SetOwnAddr(const std::array<uint8_t, OHOS_BD_ADDR_LEN>& addr)
69695489c19Sopenharmony_ci{
69795489c19Sopenharmony_ci    ownAddr_ = addr;
69895489c19Sopenharmony_ci}
69995489c19Sopenharmony_ci
70095489c19Sopenharmony_ciint8_t BleAdvertiserSettings::GetOwnAddrType() const
70195489c19Sopenharmony_ci{
70295489c19Sopenharmony_ci    return ownAddrType_;
70395489c19Sopenharmony_ci}
70495489c19Sopenharmony_ci
70595489c19Sopenharmony_civoid BleAdvertiserSettings::SetOwnAddrType(int8_t addrType)
70695489c19Sopenharmony_ci{
70795489c19Sopenharmony_ci    ownAddrType_ = addrType;
70895489c19Sopenharmony_ci}
70995489c19Sopenharmony_ci}  // namespace Bluetooth
71095489c19Sopenharmony_ci}  // namespace OHOS
711