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> ¶m) 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> ¶m) 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