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