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 "discovery_manager.h"
1779a732c7Sopenharmony_ci
1879a732c7Sopenharmony_ci#include <dlfcn.h>
1979a732c7Sopenharmony_ci#include <securec.h>
2079a732c7Sopenharmony_ci
2179a732c7Sopenharmony_ci#include "softbus_common.h"
2279a732c7Sopenharmony_ci
2379a732c7Sopenharmony_ci#include "dm_anonymous.h"
2479a732c7Sopenharmony_ci#include "dm_constants.h"
2579a732c7Sopenharmony_ci#include "parameter.h"
2679a732c7Sopenharmony_ci
2779a732c7Sopenharmony_cinamespace OHOS {
2879a732c7Sopenharmony_cinamespace DistributedHardware {
2979a732c7Sopenharmony_ciconst int32_t DISCOVERY_TIMEOUT = 120;
3079a732c7Sopenharmony_ciconst uint16_t DM_INVALID_FLAG_ID = 0;
3179a732c7Sopenharmony_ciconstexpr const char* LNN_DISC_CAPABILITY = "capability";
3279a732c7Sopenharmony_ciconst std::string TYPE_MINE = "findDeviceMode";
3379a732c7Sopenharmony_ciconst int32_t DECIMALISM = 10;
3479a732c7Sopenharmony_ci
3579a732c7Sopenharmony_ci#if !(defined(__LITEOS_M__) || defined(LITE_DEVICE))
3679a732c7Sopenharmony_cistatic std::mutex comDependencyLoadLock;
3779a732c7Sopenharmony_ciconstexpr const char* LIB_DM_COMDENPENDENCY_NAME = "libdevicemanagerdependency.z.so";
3879a732c7Sopenharmony_cibool DiscoveryManager::isSoLoaded_ = false;
3979a732c7Sopenharmony_ciIDeviceProfileConnector* DiscoveryManager::dpConnector_ = nullptr;
4079a732c7Sopenharmony_civoid* DiscoveryManager::dpConnectorHandle_ = nullptr;
4179a732c7Sopenharmony_ci#endif
4279a732c7Sopenharmony_ci
4379a732c7Sopenharmony_ciDiscoveryManager::DiscoveryManager(std::shared_ptr<SoftbusListener> softbusListener,
4479a732c7Sopenharmony_ci    std::shared_ptr<IDeviceManagerServiceListener> listener) : softbusListener_(softbusListener), listener_(listener)
4579a732c7Sopenharmony_ci{
4679a732c7Sopenharmony_ci    LOGI("DiscoveryManager constructor.");
4779a732c7Sopenharmony_ci}
4879a732c7Sopenharmony_ci
4979a732c7Sopenharmony_ciDiscoveryManager::~DiscoveryManager()
5079a732c7Sopenharmony_ci{
5179a732c7Sopenharmony_ci#if !(defined(__LITEOS_M__) || defined(LITE_DEVICE))
5279a732c7Sopenharmony_ci    CloseCommonDependencyObj();
5379a732c7Sopenharmony_ci#endif
5479a732c7Sopenharmony_ci    LOGI("DiscoveryManager destructor.");
5579a732c7Sopenharmony_ci}
5679a732c7Sopenharmony_ci
5779a732c7Sopenharmony_ciint32_t DiscoveryManager::EnableDiscoveryListener(const std::string &pkgName,
5879a732c7Sopenharmony_ci    const std::map<std::string, std::string> &discoverParam, const std::map<std::string, std::string> &filterOptions)
5979a732c7Sopenharmony_ci{
6079a732c7Sopenharmony_ci    LOGI("DiscoveryManager::EnableDiscoveryListener begin for pkgName = %{public}s.", pkgName.c_str());
6179a732c7Sopenharmony_ci    if (pkgName.empty()) {
6279a732c7Sopenharmony_ci        LOGE("Invalid parameter, pkgName is empty.");
6379a732c7Sopenharmony_ci        return ERR_DM_INPUT_PARA_INVALID;
6479a732c7Sopenharmony_ci    }
6579a732c7Sopenharmony_ci    DmSubscribeInfo dmSubInfo;
6679a732c7Sopenharmony_ci    dmSubInfo.subscribeId = DM_INVALID_FLAG_ID;
6779a732c7Sopenharmony_ci    dmSubInfo.mode = DmDiscoverMode::DM_DISCOVER_MODE_PASSIVE;
6879a732c7Sopenharmony_ci    dmSubInfo.medium = DmExchangeMedium::DM_BLE;
6979a732c7Sopenharmony_ci    dmSubInfo.freq = DmExchangeFreq::DM_LOW;
7079a732c7Sopenharmony_ci    dmSubInfo.isSameAccount = false;
7179a732c7Sopenharmony_ci    dmSubInfo.isWakeRemote = false;
7279a732c7Sopenharmony_ci    if (strcpy_s(dmSubInfo.capability, DM_MAX_DEVICE_CAPABILITY_LEN, DM_CAPABILITY_APPROACH) != EOK) {
7379a732c7Sopenharmony_ci        LOGE("capability copy err.");
7479a732c7Sopenharmony_ci        return ERR_DM_ENABLE_DISCOVERY_LISTENER_FAILED;
7579a732c7Sopenharmony_ci    }
7679a732c7Sopenharmony_ci    UpdateInfoFreq(discoverParam, dmSubInfo);
7779a732c7Sopenharmony_ci    if (discoverParam.find(PARAM_KEY_META_TYPE) != discoverParam.end()) {
7879a732c7Sopenharmony_ci        std::string metaType = discoverParam.find(PARAM_KEY_META_TYPE)->second;
7979a732c7Sopenharmony_ci        LOGI("EnableDiscoveryListener, input MetaType = %{public}s in discoverParam map.", metaType.c_str());
8079a732c7Sopenharmony_ci    }
8179a732c7Sopenharmony_ci    if (discoverParam.find(PARAM_KEY_SUBSCRIBE_ID) != discoverParam.end()) {
8279a732c7Sopenharmony_ci        dmSubInfo.subscribeId = std::atoi((discoverParam.find(PARAM_KEY_SUBSCRIBE_ID)->second).c_str());
8379a732c7Sopenharmony_ci        {
8479a732c7Sopenharmony_ci            std::lock_guard<std::mutex> autoLock(subIdMapLocks_);
8579a732c7Sopenharmony_ci            pkgName2SubIdMap_[pkgName] = dmSubInfo.subscribeId;
8679a732c7Sopenharmony_ci        }
8779a732c7Sopenharmony_ci    }
8879a732c7Sopenharmony_ci    if (discoverParam.find(PARAM_KEY_DISC_CAPABILITY) != discoverParam.end()) {
8979a732c7Sopenharmony_ci        std::string capability = discoverParam.find(PARAM_KEY_DISC_CAPABILITY)->second;
9079a732c7Sopenharmony_ci        if (strcpy_s(dmSubInfo.capability, DM_MAX_DEVICE_CAPABILITY_LEN, capability.c_str()) != EOK) {
9179a732c7Sopenharmony_ci            LOGI("EnableDiscoveryListener failed, capability copy err.");
9279a732c7Sopenharmony_ci            return ERR_DM_ENABLE_DISCOVERY_LISTENER_FAILED;
9379a732c7Sopenharmony_ci        }
9479a732c7Sopenharmony_ci    }
9579a732c7Sopenharmony_ci    LOGI("EnableDiscoveryListener capability = %{public}s,", std::string(dmSubInfo.capability).c_str());
9679a732c7Sopenharmony_ci    {
9779a732c7Sopenharmony_ci        std::lock_guard<std::mutex> capLock(capabilityMapLocks_);
9879a732c7Sopenharmony_ci        capabilityMap_[pkgName] = std::string(dmSubInfo.capability);
9979a732c7Sopenharmony_ci    }
10079a732c7Sopenharmony_ci
10179a732c7Sopenharmony_ci    int32_t ret = softbusListener_->RefreshSoftbusLNN(DM_PKG_NAME, dmSubInfo, LNN_DISC_CAPABILITY);
10279a732c7Sopenharmony_ci    if (ret != DM_OK) {
10379a732c7Sopenharmony_ci        LOGE("EnableDiscoveryListener failed, softbus refresh lnn ret: %{public}d.", ret);
10479a732c7Sopenharmony_ci        return ret;
10579a732c7Sopenharmony_ci    }
10679a732c7Sopenharmony_ci    softbusListener_->RegisterSoftbusLnnOpsCbk(pkgName, shared_from_this());
10779a732c7Sopenharmony_ci    return DM_OK;
10879a732c7Sopenharmony_ci}
10979a732c7Sopenharmony_ci
11079a732c7Sopenharmony_ciint32_t DiscoveryManager::DisableDiscoveryListener(const std::string &pkgName,
11179a732c7Sopenharmony_ci    const std::map<std::string, std::string> &extraParam)
11279a732c7Sopenharmony_ci{
11379a732c7Sopenharmony_ci    LOGI("DiscoveryManager::DisableDiscoveryListener 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
11979a732c7Sopenharmony_ci    if (extraParam.find(PARAM_KEY_META_TYPE) != extraParam.end()) {
12079a732c7Sopenharmony_ci        LOGI("DisableDiscoveryListener, input MetaType = %{public}s",
12179a732c7Sopenharmony_ci            (extraParam.find(PARAM_KEY_META_TYPE)->second).c_str());
12279a732c7Sopenharmony_ci    }
12379a732c7Sopenharmony_ci    uint16_t subscribeId = DM_INVALID_FLAG_ID;
12479a732c7Sopenharmony_ci    if (extraParam.find(PARAM_KEY_SUBSCRIBE_ID) != extraParam.end()) {
12579a732c7Sopenharmony_ci        subscribeId = std::atoi((extraParam.find(PARAM_KEY_SUBSCRIBE_ID)->second).c_str());
12679a732c7Sopenharmony_ci        {
12779a732c7Sopenharmony_ci            std::lock_guard<std::mutex> autoLock(subIdMapLocks_);
12879a732c7Sopenharmony_ci            pkgName2SubIdMap_.erase(pkgName);
12979a732c7Sopenharmony_ci        }
13079a732c7Sopenharmony_ci    }
13179a732c7Sopenharmony_ci    {
13279a732c7Sopenharmony_ci        std::lock_guard<std::mutex> capLock(capabilityMapLocks_);
13379a732c7Sopenharmony_ci        if (capabilityMap_.find(pkgName) != capabilityMap_.end()) {
13479a732c7Sopenharmony_ci            capabilityMap_.erase(pkgName);
13579a732c7Sopenharmony_ci        }
13679a732c7Sopenharmony_ci    }
13779a732c7Sopenharmony_ci    softbusListener_->UnRegisterSoftbusLnnOpsCbk(pkgName);
13879a732c7Sopenharmony_ci    return softbusListener_->StopRefreshSoftbusLNN(subscribeId);
13979a732c7Sopenharmony_ci}
14079a732c7Sopenharmony_ci
14179a732c7Sopenharmony_ciint32_t DiscoveryManager::StartDiscovering(const std::string &pkgName,
14279a732c7Sopenharmony_ci    const std::map<std::string, std::string> &discoverParam, const std::map<std::string, std::string> &filterOptions)
14379a732c7Sopenharmony_ci{
14479a732c7Sopenharmony_ci    LOGI("DiscoveryManager::StartDiscovering begin for pkgName = %{public}s.", pkgName.c_str());
14579a732c7Sopenharmony_ci    if (pkgName.empty()) {
14679a732c7Sopenharmony_ci        LOGE("Invalid parameter, pkgName is empty.");
14779a732c7Sopenharmony_ci        return ERR_DM_INPUT_PARA_INVALID;
14879a732c7Sopenharmony_ci    }
14979a732c7Sopenharmony_ci    DmSubscribeInfo dmSubInfo;
15079a732c7Sopenharmony_ci    ConfigDiscParam(discoverParam, &dmSubInfo);
15179a732c7Sopenharmony_ci    if (HandleDiscoveryQueue(pkgName, dmSubInfo.subscribeId, filterOptions) != DM_OK) {
15279a732c7Sopenharmony_ci        return ERR_DM_DISCOVERY_REPEATED;
15379a732c7Sopenharmony_ci    }
15479a732c7Sopenharmony_ci
15579a732c7Sopenharmony_ci    bool isStandardMetaNode = true;
15679a732c7Sopenharmony_ci    if (discoverParam.find(PARAM_KEY_META_TYPE) != discoverParam.end()) {
15779a732c7Sopenharmony_ci        MetaNodeType metaType = (MetaNodeType)(std::atoi((discoverParam.find(PARAM_KEY_META_TYPE)->second).c_str()));
15879a732c7Sopenharmony_ci        isStandardMetaNode = (metaType == MetaNodeType::PROXY_TRANSMISION);
15979a732c7Sopenharmony_ci    }
16079a732c7Sopenharmony_ci
16179a732c7Sopenharmony_ci    softbusListener_->RegisterSoftbusLnnOpsCbk(pkgName, shared_from_this());
16279a732c7Sopenharmony_ci    StartDiscoveryTimer(pkgName);
16379a732c7Sopenharmony_ci
16479a732c7Sopenharmony_ci    auto it = filterOptions.find(PARAM_KEY_FILTER_OPTIONS);
16579a732c7Sopenharmony_ci    nlohmann::json jsonObject = nlohmann::json::parse(it->second, nullptr, false);
16679a732c7Sopenharmony_ci    if (!jsonObject.is_discarded() && jsonObject.contains(TYPE_MINE)) {
16779a732c7Sopenharmony_ci        return StartDiscovering4MineLibary(pkgName, dmSubInfo, it->second);
16879a732c7Sopenharmony_ci    }
16979a732c7Sopenharmony_ci
17079a732c7Sopenharmony_ci    int32_t ret = isStandardMetaNode ? StartDiscoveringNoMetaType(pkgName, dmSubInfo, discoverParam) :
17179a732c7Sopenharmony_ci            StartDiscovering4MetaType(pkgName, dmSubInfo, discoverParam);
17279a732c7Sopenharmony_ci    if (ret != DM_OK) {
17379a732c7Sopenharmony_ci        LOGE("StartDiscovering for meta node process failed, ret = %{public}d", ret);
17479a732c7Sopenharmony_ci        return ret;
17579a732c7Sopenharmony_ci    }
17679a732c7Sopenharmony_ci    return ret;
17779a732c7Sopenharmony_ci}
17879a732c7Sopenharmony_ci
17979a732c7Sopenharmony_civoid DiscoveryManager::ConfigDiscParam(const std::map<std::string, std::string> &discoverParam,
18079a732c7Sopenharmony_ci    DmSubscribeInfo *dmSubInfo)
18179a732c7Sopenharmony_ci{
18279a732c7Sopenharmony_ci    LOGI("DiscoveryManager::ConfigDiscParam");
18379a732c7Sopenharmony_ci    if (dmSubInfo == nullptr) {
18479a732c7Sopenharmony_ci        LOGE("ConfigDiscParam failed, dmSubInfo is nullptr.");
18579a732c7Sopenharmony_ci        return;
18679a732c7Sopenharmony_ci    }
18779a732c7Sopenharmony_ci    dmSubInfo->subscribeId = DM_INVALID_FLAG_ID;
18879a732c7Sopenharmony_ci    dmSubInfo->mode = DmDiscoverMode::DM_DISCOVER_MODE_ACTIVE;
18979a732c7Sopenharmony_ci    dmSubInfo->medium = DmExchangeMedium::DM_AUTO;
19079a732c7Sopenharmony_ci    dmSubInfo->freq = DmExchangeFreq::DM_LOW;
19179a732c7Sopenharmony_ci    dmSubInfo->isSameAccount = false;
19279a732c7Sopenharmony_ci    dmSubInfo->isWakeRemote = false;
19379a732c7Sopenharmony_ci    if (discoverParam.find(PARAM_KEY_SUBSCRIBE_ID) != discoverParam.end()) {
19479a732c7Sopenharmony_ci        dmSubInfo->subscribeId = std::atoi((discoverParam.find(PARAM_KEY_SUBSCRIBE_ID)->second).c_str());
19579a732c7Sopenharmony_ci    }
19679a732c7Sopenharmony_ci    if (discoverParam.find(PARAM_KEY_DISC_MEDIUM) != discoverParam.end()) {
19779a732c7Sopenharmony_ci        int32_t medium = std::atoi((discoverParam.find(PARAM_KEY_DISC_MEDIUM)->second).c_str());
19879a732c7Sopenharmony_ci        dmSubInfo->medium = static_cast<DmExchangeMedium>(medium);
19979a732c7Sopenharmony_ci    }
20079a732c7Sopenharmony_ci    if (discoverParam.find(PARAM_KEY_DISC_FREQ) != discoverParam.end()) {
20179a732c7Sopenharmony_ci        int32_t freq = std::atoi((discoverParam.find(PARAM_KEY_DISC_FREQ)->second).c_str());
20279a732c7Sopenharmony_ci        dmSubInfo->freq = static_cast<DmExchangeFreq>(freq);
20379a732c7Sopenharmony_ci    }
20479a732c7Sopenharmony_ci    if (discoverParam.find(PARAM_KEY_DISC_MODE) != discoverParam.end()) {
20579a732c7Sopenharmony_ci        dmSubInfo->mode =
20679a732c7Sopenharmony_ci            static_cast<DmDiscoverMode>(std::atoi((discoverParam.find(PARAM_KEY_DISC_MODE)->second).c_str()));
20779a732c7Sopenharmony_ci    }
20879a732c7Sopenharmony_ci}
20979a732c7Sopenharmony_ci
21079a732c7Sopenharmony_ciint32_t DiscoveryManager::StartDiscovering4MineLibary(const std::string &pkgName, DmSubscribeInfo &dmSubInfo,
21179a732c7Sopenharmony_ci    const std::string &searchJson)
21279a732c7Sopenharmony_ci{
21379a732c7Sopenharmony_ci    if (strcpy_s(dmSubInfo.capability, DM_MAX_DEVICE_CAPABILITY_LEN, DM_CAPABILITY_OSD) != EOK) {
21479a732c7Sopenharmony_ci        LOGE("capability copy err.");
21579a732c7Sopenharmony_ci        return ERR_DM_START_DISCOVERING_FAILED;
21679a732c7Sopenharmony_ci    }
21779a732c7Sopenharmony_ci    LOGI("StartDiscovering for mine meta node process, pkgName = %{public}s, capability = %{public}s",
21879a732c7Sopenharmony_ci        pkgName.c_str(), std::string(dmSubInfo.capability).c_str());
21979a732c7Sopenharmony_ci    {
22079a732c7Sopenharmony_ci        std::lock_guard<std::mutex> capLock(capabilityMapLocks_);
22179a732c7Sopenharmony_ci        capabilityMap_[pkgName] = std::string(dmSubInfo.capability);
22279a732c7Sopenharmony_ci    }
22379a732c7Sopenharmony_ci    int32_t ret = mineSoftbusListener_->RefreshSoftbusLNN(pkgName, searchJson, dmSubInfo);
22479a732c7Sopenharmony_ci    if (ret != DM_OK) {
22579a732c7Sopenharmony_ci        LOGE("StartDiscovering for meta node process failed, ret = %{public}d", ret);
22679a732c7Sopenharmony_ci        return ret;
22779a732c7Sopenharmony_ci    }
22879a732c7Sopenharmony_ci    return ret;
22979a732c7Sopenharmony_ci}
23079a732c7Sopenharmony_ci
23179a732c7Sopenharmony_ciint32_t DiscoveryManager::StartDiscoveringNoMetaType(const std::string &pkgName, DmSubscribeInfo &dmSubInfo,
23279a732c7Sopenharmony_ci    const std::map<std::string, std::string> &param)
23379a732c7Sopenharmony_ci{
23479a732c7Sopenharmony_ci    (void)param;
23579a732c7Sopenharmony_ci    if (strcpy_s(dmSubInfo.capability, DM_MAX_DEVICE_CAPABILITY_LEN, DM_CAPABILITY_OSD) != EOK) {
23679a732c7Sopenharmony_ci        LOGE("capability copy err.");
23779a732c7Sopenharmony_ci        return ERR_DM_START_DISCOVERING_FAILED;
23879a732c7Sopenharmony_ci    }
23979a732c7Sopenharmony_ci    LOGI("StartDiscovering for standard meta node process, pkgName = %{public}s, capability = %{public}s",
24079a732c7Sopenharmony_ci        pkgName.c_str(), std::string(dmSubInfo.capability).c_str());
24179a732c7Sopenharmony_ci
24279a732c7Sopenharmony_ci    {
24379a732c7Sopenharmony_ci        std::lock_guard<std::mutex> capLock(capabilityMapLocks_);
24479a732c7Sopenharmony_ci        capabilityMap_[pkgName] = std::string(dmSubInfo.capability);
24579a732c7Sopenharmony_ci    }
24679a732c7Sopenharmony_ci    int32_t ret = softbusListener_->RefreshSoftbusLNN(DM_PKG_NAME, dmSubInfo, LNN_DISC_CAPABILITY);
24779a732c7Sopenharmony_ci    if (ret != DM_OK) {
24879a732c7Sopenharmony_ci        LOGE("StartDiscoveringNoMetaType failed, softbus refresh lnn ret: %{public}d.", ret);
24979a732c7Sopenharmony_ci    }
25079a732c7Sopenharmony_ci    return ret;
25179a732c7Sopenharmony_ci}
25279a732c7Sopenharmony_ci
25379a732c7Sopenharmony_ciint32_t DiscoveryManager::StartDiscovering4MetaType(const std::string &pkgName, DmSubscribeInfo &dmSubInfo,
25479a732c7Sopenharmony_ci    const std::map<std::string, std::string> &param)
25579a732c7Sopenharmony_ci{
25679a732c7Sopenharmony_ci    LOGI("StartDiscovering for meta node process, input metaType = %{public}s, pkgName = %{public}s",
25779a732c7Sopenharmony_ci         (param.find(PARAM_KEY_META_TYPE)->second).c_str(), pkgName.c_str());
25879a732c7Sopenharmony_ci    MetaNodeType metaType = (MetaNodeType)(std::atoi((param.find(PARAM_KEY_META_TYPE)->second).c_str()));
25979a732c7Sopenharmony_ci    switch (metaType) {
26079a732c7Sopenharmony_ci        case MetaNodeType::PROXY_SHARE:
26179a732c7Sopenharmony_ci            LOGI("StartDiscovering4MetaType for share meta node process.");
26279a732c7Sopenharmony_ci            if (strcpy_s(dmSubInfo.capability, DM_MAX_DEVICE_CAPABILITY_LEN, DM_CAPABILITY_SHARE) != EOK) {
26379a732c7Sopenharmony_ci                LOGE("capability copy error.");
26479a732c7Sopenharmony_ci                return ERR_DM_FAILED;
26579a732c7Sopenharmony_ci            }
26679a732c7Sopenharmony_ci            break;
26779a732c7Sopenharmony_ci        case MetaNodeType::PROXY_WEAR:
26879a732c7Sopenharmony_ci            LOGI("StartDiscovering4MetaType for wear meta node process.");
26979a732c7Sopenharmony_ci            if (strcpy_s(dmSubInfo.capability, DM_MAX_DEVICE_CAPABILITY_LEN, DM_CAPABILITY_WEAR) != EOK) {
27079a732c7Sopenharmony_ci                LOGE("capability copy error.");
27179a732c7Sopenharmony_ci                return ERR_DM_FAILED;
27279a732c7Sopenharmony_ci            }
27379a732c7Sopenharmony_ci            break;
27479a732c7Sopenharmony_ci        case MetaNodeType::PROXY_CASTPLUS:
27579a732c7Sopenharmony_ci            LOGI("StartDiscovering4MetaType for cast_plus meta node process.");
27679a732c7Sopenharmony_ci            if (strcpy_s(dmSubInfo.capability, DM_MAX_DEVICE_CAPABILITY_LEN, DM_CAPABILITY_CASTPLUS) != EOK) {
27779a732c7Sopenharmony_ci                LOGE("capability copy error.");
27879a732c7Sopenharmony_ci                return ERR_DM_FAILED;
27979a732c7Sopenharmony_ci            }
28079a732c7Sopenharmony_ci            break;
28179a732c7Sopenharmony_ci        default:
28279a732c7Sopenharmony_ci            LOGE("StartDiscovering4MetaType failed, unsupport meta type : %{public}d.", metaType);
28379a732c7Sopenharmony_ci            return ERR_DM_UNSUPPORTED_METHOD;
28479a732c7Sopenharmony_ci    }
28579a732c7Sopenharmony_ci
28679a732c7Sopenharmony_ci    std::string customData = "";
28779a732c7Sopenharmony_ci    if (param.find(PARAM_KEY_CUSTOM_DATA) != param.end()) {
28879a732c7Sopenharmony_ci        customData = param.find(PARAM_KEY_CUSTOM_DATA)->second;
28979a732c7Sopenharmony_ci    }
29079a732c7Sopenharmony_ci    LOGI("StartDiscovering4MetaType capability = %{public}s,", std::string(dmSubInfo.capability).c_str());
29179a732c7Sopenharmony_ci    {
29279a732c7Sopenharmony_ci        std::lock_guard<std::mutex> capLock(capabilityMapLocks_);
29379a732c7Sopenharmony_ci        capabilityMap_[pkgName] =std::string(dmSubInfo.capability);
29479a732c7Sopenharmony_ci    }
29579a732c7Sopenharmony_ci
29679a732c7Sopenharmony_ci    int32_t ret = softbusListener_->RefreshSoftbusLNN(DM_PKG_NAME, dmSubInfo, customData);
29779a732c7Sopenharmony_ci    if (ret != DM_OK) {
29879a732c7Sopenharmony_ci        LOGE("StartDiscovering4MetaType failed, softbus refresh lnn ret: %{public}d.", ret);
29979a732c7Sopenharmony_ci    }
30079a732c7Sopenharmony_ci    return ret;
30179a732c7Sopenharmony_ci}
30279a732c7Sopenharmony_ci
30379a732c7Sopenharmony_ciint32_t DiscoveryManager::StopDiscovering(const std::string &pkgName, uint16_t subscribeId)
30479a732c7Sopenharmony_ci{
30579a732c7Sopenharmony_ci    LOGI("DiscoveryManager::StopDiscovering begin for pkgName = %{public}s.", pkgName.c_str());
30679a732c7Sopenharmony_ci    if (pkgName.empty()) {
30779a732c7Sopenharmony_ci        LOGE("Invalid parameter, pkgName is empty.");
30879a732c7Sopenharmony_ci        return ERR_DM_INPUT_PARA_INVALID;
30979a732c7Sopenharmony_ci    }
31079a732c7Sopenharmony_ci    {
31179a732c7Sopenharmony_ci        std::lock_guard<std::mutex> autoLock(locks_);
31279a732c7Sopenharmony_ci        if (pkgNameSet_.find(pkgName) != pkgNameSet_.end()) {
31379a732c7Sopenharmony_ci            pkgNameSet_.erase(pkgName);
31479a732c7Sopenharmony_ci        }
31579a732c7Sopenharmony_ci
31679a732c7Sopenharmony_ci        if (discoveryContextMap_.find(pkgName) != discoveryContextMap_.end()) {
31779a732c7Sopenharmony_ci            discoveryContextMap_.erase(pkgName);
31879a732c7Sopenharmony_ci            timer_->DeleteTimer(pkgName);
31979a732c7Sopenharmony_ci        }
32079a732c7Sopenharmony_ci    }
32179a732c7Sopenharmony_ci    {
32279a732c7Sopenharmony_ci        std::lock_guard<std::mutex> capLock(capabilityMapLocks_);
32379a732c7Sopenharmony_ci        if (capabilityMap_.find(pkgName) != capabilityMap_.end()) {
32479a732c7Sopenharmony_ci            capabilityMap_.erase(pkgName);
32579a732c7Sopenharmony_ci        }
32679a732c7Sopenharmony_ci    }
32779a732c7Sopenharmony_ci    softbusListener_->UnRegisterSoftbusLnnOpsCbk(pkgName);
32879a732c7Sopenharmony_ci#if (defined(MINE_HARMONY))
32979a732c7Sopenharmony_ci    return mineSoftbusListener_->StopRefreshSoftbusLNN(subscribeId);
33079a732c7Sopenharmony_ci#else
33179a732c7Sopenharmony_ci    return softbusListener_->StopRefreshSoftbusLNN(subscribeId);
33279a732c7Sopenharmony_ci#endif
33379a732c7Sopenharmony_ci}
33479a732c7Sopenharmony_ci
33579a732c7Sopenharmony_civoid DiscoveryManager::OnDeviceFound(const std::string &pkgName, const DmDeviceInfo &info, bool isOnline)
33679a732c7Sopenharmony_ci{
33779a732c7Sopenharmony_ci    DeviceFilterPara filterPara;
33879a732c7Sopenharmony_ci    filterPara.isOnline = false;
33979a732c7Sopenharmony_ci    filterPara.range = info.range;
34079a732c7Sopenharmony_ci    filterPara.deviceType = info.deviceTypeId;
34179a732c7Sopenharmony_ci    std::string deviceIdHash = static_cast<std::string>(info.deviceId);
34279a732c7Sopenharmony_ci    if (isOnline && GetDeviceAclParam(pkgName, deviceIdHash, filterPara.isOnline, filterPara.authForm) != DM_OK) {
34379a732c7Sopenharmony_ci        LOGE("The found device get online param failed.");
34479a732c7Sopenharmony_ci    }
34579a732c7Sopenharmony_ci    nlohmann::json jsonObject = nlohmann::json::parse(info.extraData, nullptr, false);
34679a732c7Sopenharmony_ci    if (jsonObject.is_discarded()) {
34779a732c7Sopenharmony_ci        LOGE("OnDeviceFound jsonStr error");
34879a732c7Sopenharmony_ci        return;
34979a732c7Sopenharmony_ci    }
35079a732c7Sopenharmony_ci    if (!IsUint32(jsonObject, PARAM_KEY_DISC_CAPABILITY)) {
35179a732c7Sopenharmony_ci        LOGE("err json string: %{public}s", PARAM_KEY_DISC_CAPABILITY);
35279a732c7Sopenharmony_ci        return;
35379a732c7Sopenharmony_ci    }
35479a732c7Sopenharmony_ci    uint32_t capabilityType = jsonObject[PARAM_KEY_DISC_CAPABILITY].get<uint32_t>();
35579a732c7Sopenharmony_ci    OnDeviceFound(pkgName, capabilityType, info, filterPara);
35679a732c7Sopenharmony_ci}
35779a732c7Sopenharmony_ci
35879a732c7Sopenharmony_civoid DiscoveryManager::OnDeviceFound(const std::string &pkgName, const uint32_t capabilityType,
35979a732c7Sopenharmony_ci    const DmDeviceInfo &info, const DeviceFilterPara &filterPara)
36079a732c7Sopenharmony_ci{
36179a732c7Sopenharmony_ci    bool isIndiscoveryContextMap = false;
36279a732c7Sopenharmony_ci    DiscoveryContext discoveryContext;
36379a732c7Sopenharmony_ci    {
36479a732c7Sopenharmony_ci        std::lock_guard<std::mutex> autoLock(locks_);
36579a732c7Sopenharmony_ci        auto iter = discoveryContextMap_.find(pkgName);
36679a732c7Sopenharmony_ci        isIndiscoveryContextMap = (iter != discoveryContextMap_.end());
36779a732c7Sopenharmony_ci        if (isIndiscoveryContextMap) {
36879a732c7Sopenharmony_ci            discoveryContext = iter->second;
36979a732c7Sopenharmony_ci        }
37079a732c7Sopenharmony_ci    }
37179a732c7Sopenharmony_ci    if (!isIndiscoveryContextMap) {
37279a732c7Sopenharmony_ci        {
37379a732c7Sopenharmony_ci            std::lock_guard<std::mutex> capLock(capabilityMapLocks_);
37479a732c7Sopenharmony_ci            if (capabilityMap_.find(pkgName) == capabilityMap_.end() ||
37579a732c7Sopenharmony_ci                !CompareCapability(capabilityType, capabilityMap_[pkgName])) {
37679a732c7Sopenharmony_ci                return;
37779a732c7Sopenharmony_ci            }
37879a732c7Sopenharmony_ci        }
37979a732c7Sopenharmony_ci        uint16_t subscribeId = 0;
38079a732c7Sopenharmony_ci        {
38179a732c7Sopenharmony_ci            std::lock_guard<std::mutex> autoLock(subIdMapLocks_);
38279a732c7Sopenharmony_ci            subscribeId = pkgName2SubIdMap_[pkgName];
38379a732c7Sopenharmony_ci        }
38479a732c7Sopenharmony_ci        LOGD("OnDeviceFound, pkgName = %{public}s, cabability = %{public}d", pkgName.c_str(), capabilityType);
38579a732c7Sopenharmony_ci        listener_->OnDeviceFound(pkgName, subscribeId, info);
38679a732c7Sopenharmony_ci        return;
38779a732c7Sopenharmony_ci    }
38879a732c7Sopenharmony_ci    DiscoveryFilter filter;
38979a732c7Sopenharmony_ci    if (filter.IsValidDevice(discoveryContext.filterOp, discoveryContext.filters, filterPara)) {
39079a732c7Sopenharmony_ci        {
39179a732c7Sopenharmony_ci            std::lock_guard<std::mutex> capLock(capabilityMapLocks_);
39279a732c7Sopenharmony_ci            if (capabilityMap_.find(pkgName) == capabilityMap_.end() ||
39379a732c7Sopenharmony_ci                !CompareCapability(capabilityType, capabilityMap_[pkgName])) {
39479a732c7Sopenharmony_ci                return;
39579a732c7Sopenharmony_ci            }
39679a732c7Sopenharmony_ci        }
39779a732c7Sopenharmony_ci        LOGD("OnDeviceFound, pkgName = %{public}s, cabability = %{public}d", pkgName.c_str(), capabilityType);
39879a732c7Sopenharmony_ci        listener_->OnDeviceFound(pkgName, discoveryContext.subscribeId, info);
39979a732c7Sopenharmony_ci    }
40079a732c7Sopenharmony_ci}
40179a732c7Sopenharmony_ci
40279a732c7Sopenharmony_cibool DiscoveryManager::CompareCapability(uint32_t capabilityType, const std::string &capabilityStr)
40379a732c7Sopenharmony_ci{
40479a732c7Sopenharmony_ci    for (uint32_t i = 0; i < sizeof(g_capabilityMap) / sizeof(g_capabilityMap[0]); i++) {
40579a732c7Sopenharmony_ci        if (strcmp(capabilityStr.c_str(), g_capabilityMap[i].capability) == 0) {
40679a732c7Sopenharmony_ci            LOGD("capabilityType: %{public}d, capabilityStr: %{public}s", capabilityType, capabilityStr.c_str());
40779a732c7Sopenharmony_ci            return ((capabilityType >> static_cast<uint32_t>(g_capabilityMap[i].bitmap)) & 1);
40879a732c7Sopenharmony_ci        }
40979a732c7Sopenharmony_ci    }
41079a732c7Sopenharmony_ci    return false;
41179a732c7Sopenharmony_ci}
41279a732c7Sopenharmony_ci
41379a732c7Sopenharmony_civoid DiscoveryManager::OnDiscoveringResult(const std::string &pkgName, int32_t subscribeId, int32_t result)
41479a732c7Sopenharmony_ci{
41579a732c7Sopenharmony_ci    LOGI("DiscoveryManager::OnDiscoveringResult, subscribeId = %{public}d, result = %{public}d.", subscribeId, result);
41679a732c7Sopenharmony_ci    if (pkgName.empty() || (listener_ == nullptr)) {
41779a732c7Sopenharmony_ci        LOGE("DiscoveryManager::OnDiscoveringResult failed, IDeviceManagerServiceListener is null.");
41879a732c7Sopenharmony_ci        return;
41979a732c7Sopenharmony_ci    }
42079a732c7Sopenharmony_ci    if (result == 0) {
42179a732c7Sopenharmony_ci        std::lock_guard<std::mutex> autoLock(locks_);
42279a732c7Sopenharmony_ci        discoveryContextMap_[pkgName].subscribeId = (uint32_t)subscribeId;
42379a732c7Sopenharmony_ci        listener_->OnDiscoverySuccess(pkgName, subscribeId);
42479a732c7Sopenharmony_ci        return;
42579a732c7Sopenharmony_ci    }
42679a732c7Sopenharmony_ci    {
42779a732c7Sopenharmony_ci        std::lock_guard<std::mutex> autoLock(locks_);
42879a732c7Sopenharmony_ci        if (pkgNameSet_.find(pkgName) != pkgNameSet_.end()) {
42979a732c7Sopenharmony_ci            pkgNameSet_.erase(pkgName);
43079a732c7Sopenharmony_ci        }
43179a732c7Sopenharmony_ci        if (discoveryContextMap_.find(pkgName) != discoveryContextMap_.end()) {
43279a732c7Sopenharmony_ci            discoveryContextMap_.erase(pkgName);
43379a732c7Sopenharmony_ci            timer_->DeleteTimer(pkgName);
43479a732c7Sopenharmony_ci        }
43579a732c7Sopenharmony_ci    }
43679a732c7Sopenharmony_ci    {
43779a732c7Sopenharmony_ci        std::lock_guard<std::mutex> capLock(capabilityMapLocks_);
43879a732c7Sopenharmony_ci        if (capabilityMap_.find(pkgName) != capabilityMap_.end()) {
43979a732c7Sopenharmony_ci            capabilityMap_.erase(pkgName);
44079a732c7Sopenharmony_ci        }
44179a732c7Sopenharmony_ci    }
44279a732c7Sopenharmony_ci    listener_->OnDiscoveryFailed(pkgName, (uint32_t)subscribeId, result);
44379a732c7Sopenharmony_ci    softbusListener_->StopRefreshSoftbusLNN(subscribeId);
44479a732c7Sopenharmony_ci}
44579a732c7Sopenharmony_ci
44679a732c7Sopenharmony_civoid DiscoveryManager::StartDiscoveryTimer(const std::string &pkgName)
44779a732c7Sopenharmony_ci{
44879a732c7Sopenharmony_ci    if (timer_ == nullptr) {
44979a732c7Sopenharmony_ci        timer_ = std::make_shared<DmTimer>();
45079a732c7Sopenharmony_ci    }
45179a732c7Sopenharmony_ci    timer_->StartTimer(pkgName, DISCOVERY_TIMEOUT,
45279a732c7Sopenharmony_ci        [this] (std::string name) {
45379a732c7Sopenharmony_ci            DiscoveryManager::HandleDiscoveryTimeout(name);
45479a732c7Sopenharmony_ci        });
45579a732c7Sopenharmony_ci}
45679a732c7Sopenharmony_ci
45779a732c7Sopenharmony_ciint32_t DiscoveryManager::HandleDiscoveryQueue(const std::string &pkgName, uint16_t subscribeId,
45879a732c7Sopenharmony_ci    const std::map<std::string, std::string> &filterOps)
45979a732c7Sopenharmony_ci{
46079a732c7Sopenharmony_ci    std::string filterData = "";
46179a732c7Sopenharmony_ci    if (filterOps.find(PARAM_KEY_FILTER_OPTIONS) != filterOps.end()) {
46279a732c7Sopenharmony_ci        filterData = filterOps.find(PARAM_KEY_FILTER_OPTIONS)->second;
46379a732c7Sopenharmony_ci    }
46479a732c7Sopenharmony_ci    DeviceFilterOption dmFilter;
46579a732c7Sopenharmony_ci    if ((dmFilter.TransformToFilter(filterData) != DM_OK) && (dmFilter.TransformFilterOption(filterData) != DM_OK)) {
46679a732c7Sopenharmony_ci        return ERR_DM_INPUT_PARA_INVALID;
46779a732c7Sopenharmony_ci    }
46879a732c7Sopenharmony_ci    {
46979a732c7Sopenharmony_ci        std::lock_guard<std::mutex> autoLock(locks_);
47079a732c7Sopenharmony_ci        if (pkgNameSet_.find(pkgName) == pkgNameSet_.end()) {
47179a732c7Sopenharmony_ci            pkgNameSet_.emplace(pkgName);
47279a732c7Sopenharmony_ci            DiscoveryContext context = {pkgName, filterData, subscribeId, dmFilter.filterOp_, dmFilter.filters_};
47379a732c7Sopenharmony_ci            discoveryContextMap_.emplace(pkgName, context);
47479a732c7Sopenharmony_ci            return DM_OK;
47579a732c7Sopenharmony_ci        } else {
47679a732c7Sopenharmony_ci            LOGE("DiscoveryManager::HandleDiscoveryQueue repeated, pkgName : %{public}s.", pkgName.c_str());
47779a732c7Sopenharmony_ci            return ERR_DM_DISCOVERY_REPEATED;
47879a732c7Sopenharmony_ci        }
47979a732c7Sopenharmony_ci    }
48079a732c7Sopenharmony_ci}
48179a732c7Sopenharmony_ci
48279a732c7Sopenharmony_civoid DiscoveryManager::HandleDiscoveryTimeout(const std::string &pkgName)
48379a732c7Sopenharmony_ci{
48479a732c7Sopenharmony_ci    LOGI("DiscoveryManager::HandleDiscoveryTimeout");
48579a732c7Sopenharmony_ci    uint16_t subscribeId = 0;
48679a732c7Sopenharmony_ci    {
48779a732c7Sopenharmony_ci        std::lock_guard<std::mutex> autoLock(locks_);
48879a732c7Sopenharmony_ci        if (pkgNameSet_.find(pkgName) == pkgNameSet_.end()) {
48979a732c7Sopenharmony_ci            LOGE("HandleDiscoveryTimeout: pkgName: %{public}s is not exist.", pkgName.c_str());
49079a732c7Sopenharmony_ci            return;
49179a732c7Sopenharmony_ci        }
49279a732c7Sopenharmony_ci        auto iter = discoveryContextMap_.find(pkgName);
49379a732c7Sopenharmony_ci        if (iter == discoveryContextMap_.end()) {
49479a732c7Sopenharmony_ci            LOGE("HandleDiscoveryTimeout: subscribeId not found by pkgName %{public}s.",
49579a732c7Sopenharmony_ci                GetAnonyString(pkgName).c_str());
49679a732c7Sopenharmony_ci            return;
49779a732c7Sopenharmony_ci        }
49879a732c7Sopenharmony_ci        subscribeId = discoveryContextMap_[pkgName].subscribeId;
49979a732c7Sopenharmony_ci    }
50079a732c7Sopenharmony_ci    StopDiscovering(pkgName, subscribeId);
50179a732c7Sopenharmony_ci}
50279a732c7Sopenharmony_ci
50379a732c7Sopenharmony_civoid DiscoveryManager::UpdateInfoFreq(
50479a732c7Sopenharmony_ci    const std::map<std::string, std::string> &discoverParam, DmSubscribeInfo &dmSubInfo)
50579a732c7Sopenharmony_ci{
50679a732c7Sopenharmony_ci    if (auto it = discoverParam.find(PARAM_KEY_DISC_FREQ); it != discoverParam.end()) {
50779a732c7Sopenharmony_ci        int32_t freq = StringToInt(it->second, DECIMALISM);
50879a732c7Sopenharmony_ci        if (freq < DmExchangeFreq::DM_LOW || freq > DmExchangeFreq::DM_FREQ_BUTT) {
50979a732c7Sopenharmony_ci            LOGE("Invalid freq value.");
51079a732c7Sopenharmony_ci            return;
51179a732c7Sopenharmony_ci        }
51279a732c7Sopenharmony_ci        dmSubInfo.freq = static_cast<DmExchangeFreq>(freq);
51379a732c7Sopenharmony_ci    }
51479a732c7Sopenharmony_ci}
51579a732c7Sopenharmony_ci
51679a732c7Sopenharmony_ciint32_t DiscoveryManager::GetDeviceAclParam(const std::string &pkgName, std::string deviceId,
51779a732c7Sopenharmony_ci    bool &isOnline, int32_t &authForm)
51879a732c7Sopenharmony_ci{
51979a732c7Sopenharmony_ci#if !(defined(__LITEOS_M__) || defined(LITE_DEVICE))
52079a732c7Sopenharmony_ci    char localDeviceId[DEVICE_UUID_LENGTH];
52179a732c7Sopenharmony_ci    GetDevUdid(localDeviceId, DEVICE_UUID_LENGTH);
52279a732c7Sopenharmony_ci    std::string requestDeviceId = static_cast<std::string>(localDeviceId);
52379a732c7Sopenharmony_ci    DmDiscoveryInfo discoveryInfo;
52479a732c7Sopenharmony_ci    discoveryInfo.pkgname = pkgName;
52579a732c7Sopenharmony_ci    discoveryInfo.localDeviceId = requestDeviceId;
52679a732c7Sopenharmony_ci    discoveryInfo.remoteDeviceIdHash = deviceId;
52779a732c7Sopenharmony_ci    if (DiscoveryManager::IsCommonDependencyReady() && DiscoveryManager::GetCommonDependencyObj() != nullptr) {
52879a732c7Sopenharmony_ci        if (DiscoveryManager::GetCommonDependencyObj()->GetDeviceAclParam(discoveryInfo, isOnline, authForm) != DM_OK) {
52979a732c7Sopenharmony_ci            LOGE("GetDeviceAclParam failed.");
53079a732c7Sopenharmony_ci            return ERR_DM_FAILED;
53179a732c7Sopenharmony_ci        }
53279a732c7Sopenharmony_ci    }
53379a732c7Sopenharmony_ci#endif
53479a732c7Sopenharmony_ci    return DM_OK;
53579a732c7Sopenharmony_ci}
53679a732c7Sopenharmony_ci
53779a732c7Sopenharmony_ci#if !(defined(__LITEOS_M__) || defined(LITE_DEVICE))
53879a732c7Sopenharmony_ciIDeviceProfileConnector* DiscoveryManager::GetCommonDependencyObj()
53979a732c7Sopenharmony_ci{
54079a732c7Sopenharmony_ci    return dpConnector_;
54179a732c7Sopenharmony_ci}
54279a732c7Sopenharmony_ci
54379a732c7Sopenharmony_cibool DiscoveryManager::IsCommonDependencyReady()
54479a732c7Sopenharmony_ci{
54579a732c7Sopenharmony_ci    std::lock_guard<std::mutex> lock(comDependencyLoadLock);
54679a732c7Sopenharmony_ci    if (isSoLoaded_ && dpConnector_ != nullptr && dpConnectorHandle_ != nullptr) {
54779a732c7Sopenharmony_ci        return true;
54879a732c7Sopenharmony_ci    }
54979a732c7Sopenharmony_ci    dpConnectorHandle_ = dlopen(LIB_DM_COMDENPENDENCY_NAME, RTLD_NOW | RTLD_NODELETE);
55079a732c7Sopenharmony_ci    if (dpConnectorHandle_ == nullptr) {
55179a732c7Sopenharmony_ci        LOGE("load libdevicemanagerdependency so failed, errMsg: %{public}s.", dlerror());
55279a732c7Sopenharmony_ci        return false;
55379a732c7Sopenharmony_ci    }
55479a732c7Sopenharmony_ci    dlerror();
55579a732c7Sopenharmony_ci    auto func = (CreateDpConnectorFuncPtr)dlsym(dpConnectorHandle_, "CreateDpConnectorInstance");
55679a732c7Sopenharmony_ci    if (dlerror() != nullptr || func == nullptr) {
55779a732c7Sopenharmony_ci        dlclose(dpConnectorHandle_);
55879a732c7Sopenharmony_ci        LOGE("Create object function is not exist.");
55979a732c7Sopenharmony_ci        return false;
56079a732c7Sopenharmony_ci    }
56179a732c7Sopenharmony_ci    dpConnector_ = func();
56279a732c7Sopenharmony_ci    isSoLoaded_ = true;
56379a732c7Sopenharmony_ci    LOGI("IsCommonDependencyReady success.");
56479a732c7Sopenharmony_ci    return true;
56579a732c7Sopenharmony_ci}
56679a732c7Sopenharmony_ci
56779a732c7Sopenharmony_cibool DiscoveryManager::CloseCommonDependencyObj()
56879a732c7Sopenharmony_ci{
56979a732c7Sopenharmony_ci    LOGI("DiscoveryManager::CloseCommonDependencyObj start.");
57079a732c7Sopenharmony_ci    std::lock_guard<std::mutex> lock(comDependencyLoadLock);
57179a732c7Sopenharmony_ci    if (!isSoLoaded_ && (dpConnector_ == nullptr) && (dpConnectorHandle_ == nullptr)) {
57279a732c7Sopenharmony_ci        return true;
57379a732c7Sopenharmony_ci    }
57479a732c7Sopenharmony_ci
57579a732c7Sopenharmony_ci    int32_t ret = dlclose(dpConnectorHandle_);
57679a732c7Sopenharmony_ci    if (ret != 0) {
57779a732c7Sopenharmony_ci        LOGE("close libdevicemanagerdependency failed ret = %{public}d.", ret);
57879a732c7Sopenharmony_ci        return false;
57979a732c7Sopenharmony_ci    }
58079a732c7Sopenharmony_ci    isSoLoaded_ = false;
58179a732c7Sopenharmony_ci    dpConnector_ = nullptr;
58279a732c7Sopenharmony_ci    dpConnectorHandle_ = nullptr;
58379a732c7Sopenharmony_ci    LOGI("close libdevicemanagerdependency so success.");
58479a732c7Sopenharmony_ci    return true;
58579a732c7Sopenharmony_ci}
58679a732c7Sopenharmony_ci#endif
58779a732c7Sopenharmony_ci
58879a732c7Sopenharmony_civoid DiscoveryManager::ClearDiscoveryCache(const std::string &pkgName)
58979a732c7Sopenharmony_ci{
59079a732c7Sopenharmony_ci    LOGI("PkgName %{public}s.", pkgName.c_str());
59179a732c7Sopenharmony_ci    uint16_t subscribeId = 0;
59279a732c7Sopenharmony_ci    {
59379a732c7Sopenharmony_ci        std::lock_guard<std::mutex> autoLock(locks_);
59479a732c7Sopenharmony_ci        if (pkgNameSet_.find(pkgName) != pkgNameSet_.end()) {
59579a732c7Sopenharmony_ci            LOGI("Erase pkgname %{public}s from pkgNameSet.", pkgName.c_str());
59679a732c7Sopenharmony_ci            pkgNameSet_.erase(pkgName);
59779a732c7Sopenharmony_ci        }
59879a732c7Sopenharmony_ci        if (discoveryContextMap_.find(pkgName) != discoveryContextMap_.end()) {
59979a732c7Sopenharmony_ci            LOGI("Erase pkgname %{public}s from pkgNameSet.", pkgName.c_str());
60079a732c7Sopenharmony_ci            subscribeId = discoveryContextMap_[pkgName].subscribeId;
60179a732c7Sopenharmony_ci            discoveryContextMap_.erase(pkgName);
60279a732c7Sopenharmony_ci        }
60379a732c7Sopenharmony_ci    }
60479a732c7Sopenharmony_ci    {
60579a732c7Sopenharmony_ci        std::lock_guard<std::mutex> capLock(capabilityMapLocks_);
60679a732c7Sopenharmony_ci        if (capabilityMap_.find(pkgName) != capabilityMap_.end()) {
60779a732c7Sopenharmony_ci            capabilityMap_.erase(pkgName);
60879a732c7Sopenharmony_ci        }
60979a732c7Sopenharmony_ci    }
61079a732c7Sopenharmony_ci    {
61179a732c7Sopenharmony_ci        std::lock_guard<std::mutex> autoLock(subIdMapLocks_);
61279a732c7Sopenharmony_ci        if (pkgName2SubIdMap_.find(pkgName) != pkgName2SubIdMap_.end()) {
61379a732c7Sopenharmony_ci            pkgName2SubIdMap_.erase(pkgName);
61479a732c7Sopenharmony_ci        }
61579a732c7Sopenharmony_ci    }
61679a732c7Sopenharmony_ci    CHECK_NULL_VOID(softbusListener_);
61779a732c7Sopenharmony_ci    softbusListener_->UnRegisterSoftbusLnnOpsCbk(pkgName);
61879a732c7Sopenharmony_ci    softbusListener_->StopRefreshSoftbusLNN(subscribeId);
61979a732c7Sopenharmony_ci    CHECK_NULL_VOID(timer_);
62079a732c7Sopenharmony_ci    timer_->DeleteTimer(pkgName);
62179a732c7Sopenharmony_ci}
62279a732c7Sopenharmony_ci} // namespace DistributedHardware
62379a732c7Sopenharmony_ci} // namespace OHOS
624