179a732c7Sopenharmony_ci/*
279a732c7Sopenharmony_ci * Copyright (c) 2022-2024 Huawei Device Co., Ltd.
379a732c7Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
479a732c7Sopenharmony_ci * you may not use this file except in compliance with the License.
579a732c7Sopenharmony_ci * You may obtain a copy of the License at
679a732c7Sopenharmony_ci *
779a732c7Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0
879a732c7Sopenharmony_ci *
979a732c7Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
1079a732c7Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
1179a732c7Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1279a732c7Sopenharmony_ci * See the License for the specific language governing permissions and
1379a732c7Sopenharmony_ci * limitations under the License.
1479a732c7Sopenharmony_ci */
1579a732c7Sopenharmony_ci
1679a732c7Sopenharmony_ci#include "advertise_manager.h"
1779a732c7Sopenharmony_ci
1879a732c7Sopenharmony_ci#include "dm_constants.h"
1979a732c7Sopenharmony_ci#include "dm_log.h"
2079a732c7Sopenharmony_ci#include "dm_publish_info.h"
2179a732c7Sopenharmony_ci
2279a732c7Sopenharmony_cinamespace OHOS {
2379a732c7Sopenharmony_cinamespace DistributedHardware {
2479a732c7Sopenharmony_ciconst int32_t AUTO_STOP_ADVERTISE_DEFAULT_TIME = 120;
2579a732c7Sopenharmony_ciconst std::string AUTO_STOP_ADVERTISE_TASK = "AutoStopAdvertisingTask";
2679a732c7Sopenharmony_ci
2779a732c7Sopenharmony_ciAdvertiseManager::AdvertiseManager(std::shared_ptr<SoftbusListener> softbusListener) : softbusListener_(softbusListener)
2879a732c7Sopenharmony_ci{
2979a732c7Sopenharmony_ci    LOGI("AdvertiseManager constructor.");
3079a732c7Sopenharmony_ci}
3179a732c7Sopenharmony_ci
3279a732c7Sopenharmony_ciAdvertiseManager::~AdvertiseManager()
3379a732c7Sopenharmony_ci{
3479a732c7Sopenharmony_ci    LOGI("AdvertiseManager destructor.");
3579a732c7Sopenharmony_ci}
3679a732c7Sopenharmony_ci
3779a732c7Sopenharmony_ciint32_t AdvertiseManager::StartAdvertising(const std::string &pkgName,
3879a732c7Sopenharmony_ci    const std::map<std::string, std::string> &advertiseParam)
3979a732c7Sopenharmony_ci{
4079a732c7Sopenharmony_ci    LOGI("AdvertiseManager::StartAdvertising begin for pkgName = %{public}s.", pkgName.c_str());
4179a732c7Sopenharmony_ci    if (pkgName.empty()) {
4279a732c7Sopenharmony_ci        LOGE("Invalid parameter, pkgName is empty.");
4379a732c7Sopenharmony_ci        return ERR_DM_INPUT_PARA_INVALID;
4479a732c7Sopenharmony_ci    }
4579a732c7Sopenharmony_ci    DmPublishInfo dmPubInfo;
4679a732c7Sopenharmony_ci    ConfigAdvParam(advertiseParam, &dmPubInfo);
4779a732c7Sopenharmony_ci    std::string capability = DM_CAPABILITY_OSD;
4879a732c7Sopenharmony_ci    if (advertiseParam.find(PARAM_KEY_DISC_CAPABILITY) != advertiseParam.end()) {
4979a732c7Sopenharmony_ci        capability = advertiseParam.find(PARAM_KEY_DISC_CAPABILITY)->second;
5079a732c7Sopenharmony_ci    }
5179a732c7Sopenharmony_ci    if (capability == DM_CAPABILITY_APPROACH || capability == DM_CAPABILITY_TOUCH) {
5279a732c7Sopenharmony_ci        dmPubInfo.mode = DmDiscoverMode::DM_DISCOVER_MODE_ACTIVE;
5379a732c7Sopenharmony_ci    }
5479a732c7Sopenharmony_ci    std::string customData = "";
5579a732c7Sopenharmony_ci    if (advertiseParam.find(PARAM_KEY_CUSTOM_DATA) != advertiseParam.end()) {
5679a732c7Sopenharmony_ci        customData = advertiseParam.find(PARAM_KEY_CUSTOM_DATA)->second;
5779a732c7Sopenharmony_ci    }
5879a732c7Sopenharmony_ci
5979a732c7Sopenharmony_ci    int32_t ret = softbusListener_->PublishSoftbusLNN(dmPubInfo, capability, customData);
6079a732c7Sopenharmony_ci    if (ret != DM_OK) {
6179a732c7Sopenharmony_ci        LOGE("StartAdvertising failed, softbus publish lnn ret: %{public}d", ret);
6279a732c7Sopenharmony_ci        return ret;
6379a732c7Sopenharmony_ci    }
6479a732c7Sopenharmony_ci
6579a732c7Sopenharmony_ci    if (advertiseParam.find(PARAM_KEY_AUTO_STOP_ADVERTISE) != advertiseParam.end()) {
6679a732c7Sopenharmony_ci        int32_t stopTime = std::atoi((advertiseParam.find(PARAM_KEY_AUTO_STOP_ADVERTISE)->second).c_str());
6779a732c7Sopenharmony_ci        if ((stopTime <= 0) || (stopTime > AUTO_STOP_ADVERTISE_DEFAULT_TIME)) {
6879a732c7Sopenharmony_ci            LOGE("StartAdvertising error, invalid input auto stop advertise time: %{public}d", stopTime);
6979a732c7Sopenharmony_ci            return DM_OK;
7079a732c7Sopenharmony_ci        }
7179a732c7Sopenharmony_ci        if (timer_ == nullptr) {
7279a732c7Sopenharmony_ci            timer_ = std::make_shared<DmTimer>();
7379a732c7Sopenharmony_ci        }
7479a732c7Sopenharmony_ci        int32_t publishId = dmPubInfo.publishId;
7579a732c7Sopenharmony_ci        timer_->StartTimer(std::string(AUTO_STOP_ADVERTISE_TASK), stopTime,
7679a732c7Sopenharmony_ci            [this, pkgName, publishId] (std::string name) {
7779a732c7Sopenharmony_ci                AdvertiseManager::HandleAutoStopAdvertise(name, pkgName, publishId);
7879a732c7Sopenharmony_ci            });
7979a732c7Sopenharmony_ci    }
8079a732c7Sopenharmony_ci    return DM_OK;
8179a732c7Sopenharmony_ci}
8279a732c7Sopenharmony_ci
8379a732c7Sopenharmony_civoid AdvertiseManager::ConfigAdvParam(const std::map<std::string, std::string> &advertiseParam,
8479a732c7Sopenharmony_ci    DmPublishInfo *dmPubInfo)
8579a732c7Sopenharmony_ci{
8679a732c7Sopenharmony_ci    if (dmPubInfo == nullptr) {
8779a732c7Sopenharmony_ci        LOGE("ConfigAdvParam failed, dmPubInfo is nullptr.");
8879a732c7Sopenharmony_ci        return;
8979a732c7Sopenharmony_ci    }
9079a732c7Sopenharmony_ci    dmPubInfo->publishId = -1;
9179a732c7Sopenharmony_ci    dmPubInfo->mode = DmDiscoverMode::DM_DISCOVER_MODE_PASSIVE;
9279a732c7Sopenharmony_ci    dmPubInfo->freq = DmExchangeFreq::DM_LOW;
9379a732c7Sopenharmony_ci    dmPubInfo->ranging = true;
9479a732c7Sopenharmony_ci
9579a732c7Sopenharmony_ci    if (advertiseParam.find(PARAM_KEY_META_TYPE) != advertiseParam.end()) {
9679a732c7Sopenharmony_ci        LOGI("StartAdvertising input MetaType=%{public}s", (advertiseParam.find(PARAM_KEY_META_TYPE)->second).c_str());
9779a732c7Sopenharmony_ci    }
9879a732c7Sopenharmony_ci    if (advertiseParam.find(PARAM_KEY_PUBLISH_ID) != advertiseParam.end()) {
9979a732c7Sopenharmony_ci        dmPubInfo->publishId = std::atoi((advertiseParam.find(PARAM_KEY_PUBLISH_ID)->second).c_str());
10079a732c7Sopenharmony_ci    }
10179a732c7Sopenharmony_ci    if (advertiseParam.find(PARAM_KEY_DISC_MODE) != advertiseParam.end()) {
10279a732c7Sopenharmony_ci        dmPubInfo->mode =
10379a732c7Sopenharmony_ci            static_cast<DmDiscoverMode>(std::atoi((advertiseParam.find(PARAM_KEY_DISC_MODE)->second).c_str()));
10479a732c7Sopenharmony_ci    }
10579a732c7Sopenharmony_ci    if (advertiseParam.find(PARAM_KEY_DISC_FREQ) != advertiseParam.end()) {
10679a732c7Sopenharmony_ci        dmPubInfo->freq =
10779a732c7Sopenharmony_ci            static_cast<DmExchangeFreq>(std::atoi((advertiseParam.find(PARAM_KEY_DISC_FREQ)->second).c_str()));
10879a732c7Sopenharmony_ci    }
10979a732c7Sopenharmony_ci}
11079a732c7Sopenharmony_ci
11179a732c7Sopenharmony_ciint32_t AdvertiseManager::StopAdvertising(const std::string &pkgName, int32_t publishId)
11279a732c7Sopenharmony_ci{
11379a732c7Sopenharmony_ci    LOGI("AdvertiseManager::StopDiscovering begin for pkgName = %{public}s.", pkgName.c_str());
11479a732c7Sopenharmony_ci    if (pkgName.empty()) {
11579a732c7Sopenharmony_ci        LOGE("Invalid parameter, pkgName is empty.");
11679a732c7Sopenharmony_ci        return ERR_DM_INPUT_PARA_INVALID;
11779a732c7Sopenharmony_ci    }
11879a732c7Sopenharmony_ci    return softbusListener_->StopPublishSoftbusLNN(publishId);
11979a732c7Sopenharmony_ci}
12079a732c7Sopenharmony_ci
12179a732c7Sopenharmony_civoid AdvertiseManager::HandleAutoStopAdvertise(const std::string &timerName, const std::string &pkgName,
12279a732c7Sopenharmony_ci    int32_t publishId)
12379a732c7Sopenharmony_ci{
12479a732c7Sopenharmony_ci    LOGI("HandleAutoStopAdvertise, auto stop advertise task timeout, timerName=%{public}s", timerName.c_str());
12579a732c7Sopenharmony_ci    StopAdvertising(pkgName, publishId);
12679a732c7Sopenharmony_ci}
12779a732c7Sopenharmony_ci} // namespace DistributedHardware
12879a732c7Sopenharmony_ci} // namespace OHOS
129