diff --git a/interfaces/inner_kits/native_cpp/src/device_manager_impl.cpp b/interfaces/inner_kits/native_cpp/src/device_manager_impl.cpp index 4afabf43886eaf2669e10d428407046b6cec6ede..f3b9a003b966c5bddbb32eb586f1ccd8dd66b60a 100644 --- a/interfaces/inner_kits/native_cpp/src/device_manager_impl.cpp +++ b/interfaces/inner_kits/native_cpp/src/device_manager_impl.cpp @@ -549,20 +549,18 @@ int32_t DeviceManagerImpl::StopDiscovering(const std::string &pkgName, if (discoverParam.find(PARAM_KEY_SUBSCRIBE_ID) != discoverParam.end()) { subscribeId = std::atoi((discoverParam.find(PARAM_KEY_SUBSCRIBE_ID)->second).c_str()); } - if (subscribeId == DM_INVALID_FLAG_ID) { - subscribeId = GetSubscribeIdFromMap(pkgName); - } + std::string pkgNameTemp = ComposeStr(pkgName, subscribeId); + subscribeId = GetSubscribeIdFromMap(pkgNameTemp); if (subscribeId == DM_INVALID_FLAG_ID) { LOGE("DeviceManagerImpl::StopDiscovering failed: cannot find pkgName in cache map."); return ERR_DM_INPUT_PARA_INVALID; } - std::string discoveryFlag = ComposeStr(pkgName, subscribeId); discoverParam.emplace(PARAM_KEY_SUBSCRIBE_ID, std::to_string(subscribeId)); std::string discParaStr = ConvertMapToJsonString(discoverParam); std::shared_ptr req = std::make_shared(); std::shared_ptr rsp = std::make_shared(); - req->SetPkgName(discoveryFlag); + req->SetPkgName(pkgNameTemp); req->SetFirstParam(discParaStr); int32_t ret = ipcClientProxy_->SendRequest(STOP_DISCOVERING, req, rsp); if (ret != DM_OK) { @@ -574,7 +572,7 @@ int32_t DeviceManagerImpl::StopDiscovering(const std::string &pkgName, LOGE("StopDiscovering error: Failed with ret %{public}d", ret); return ret; } - RemoveDiscoveryCallback(discoveryFlag); + RemoveDiscoveryCallback(pkgNameTemp); LOGI("Completed"); return DM_OK; } @@ -1672,8 +1670,8 @@ int32_t DeviceManagerImpl::UnRegisterDiscoveryCallback(const std::string &pkgNam return ERR_DM_INPUT_PARA_INVALID; } LOGI("Start, pkgName: %{public}s", pkgName.c_str()); - std::string discoveryFlag = ComposeStr(pkgName, DM_INVALID_FLAG_ID); - uint16_t subscribeId = RemoveDiscoveryCallback(discoveryFlag); + std::string pkgNameTemp = ComposeStr(pkgName, DM_INVALID_FLAG_ID); + uint16_t subscribeId = GetSubscribeIdFromMap(pkgNameTemp); if (subscribeId == DM_INVALID_FLAG_ID) { DmRadarHelper::GetInstance().ReportDmBehavior( pkgName, "UnRegisterDiscoveryCallback", ERR_DM_INPUT_PARA_INVALID); @@ -1686,21 +1684,22 @@ int32_t DeviceManagerImpl::UnRegisterDiscoveryCallback(const std::string &pkgNam std::shared_ptr req = std::make_shared(); std::shared_ptr rsp = std::make_shared(); - req->SetPkgName(discoveryFlag); + req->SetPkgName(pkgNameTemp); req->SetFirstParam(extraParaStr); int32_t ret = ipcClientProxy_->SendRequest(UNREGISTER_DISCOVERY_CALLBACK, req, rsp); if (ret != DM_OK) { - DmRadarHelper::GetInstance().ReportDmBehavior(discoveryFlag, "UnRegisterDiscoveryCallback", ret); + DmRadarHelper::GetInstance().ReportDmBehavior(pkgNameTemp, "UnRegisterDiscoveryCallback", ret); LOGE("UnRegisterDiscoveryCallback error: Send Request failed ret: %{public}d", ret); return ERR_DM_IPC_SEND_REQUEST_FAILED; } ret = rsp->GetErrCode(); if (ret != DM_OK) { - DmRadarHelper::GetInstance().ReportDmBehavior(discoveryFlag, "UnRegisterDiscoveryCallback", ret); + DmRadarHelper::GetInstance().ReportDmBehavior(pkgNameTemp, "UnRegisterDiscoveryCallback", ret); LOGE("UnRegisterDiscoveryCallback error: Failed with ret %{public}d", ret); return ret; } - DmRadarHelper::GetInstance().ReportDmBehavior(discoveryFlag, "UnRegisterDiscoveryCallback", DM_OK); + RemoveDiscoveryCallback(pkgNameTemp); + DmRadarHelper::GetInstance().ReportDmBehavior(pkgNameTemp, "UnRegisterDiscoveryCallback", DM_OK); LOGI("Completed"); return DM_OK; } @@ -1893,22 +1892,21 @@ uint16_t DeviceManagerImpl::AddDiscoveryCallback(const std::string &pkgName, if (discoverParam.find(PARAM_KEY_SUBSCRIBE_ID) != discoverParam.end()) { subscribeId = std::atoi((discoverParam.find(PARAM_KEY_SUBSCRIBE_ID)->second).c_str()); } - if (subscribeId == DM_INVALID_FLAG_ID) { - subscribeId = GetSubscribeIdFromMap(pkgName); - } - if (subscribeId == DM_INVALID_FLAG_ID) { - subscribeId = GenRandUint(DM_MIN_RANDOM, DM_MAX_RANDOM); - } - std::string discoveryFlag = ComposeStr(pkgName, subscribeId); + std::string pkgNameTemp = ComposeStr(pkgName, subscribeId); { std::lock_guard autoLock(subMapLock); - auto iter = pkgName2SubIdMap_.find(discoveryFlag); - if (iter == pkgName2SubIdMap_.end()) { - pkgName2SubIdMap_[discoveryFlag] = subscribeId; + auto item = pkgName2SubIdMap_.find(pkgNameTemp); + if (item == pkgName2SubIdMap_.end() && subscribeId == DM_INVALID_FLAG_ID) { + subscribeId = GenRandUint(DM_MIN_RANDOM, DM_MAX_RANDOM); + pkgName2SubIdMap_[pkgNameTemp] = subscribeId; + } else if (item == pkgName2SubIdMap_.end() && subscribeId != DM_INVALID_FLAG_ID) { + pkgName2SubIdMap_[pkgNameTemp] = subscribeId; + } else if (item != pkgName2SubIdMap_.end()) { + subscribeId = pkgName2SubIdMap_[pkgNameTemp]; } } - DeviceManagerNotify::GetInstance().RegisterDiscoveryCallback(discoveryFlag, subscribeId, callback); - DmRadarHelper::GetInstance().ReportDmBehavior(discoveryFlag, "AddDiscoveryCallback", DM_OK); + DeviceManagerNotify::GetInstance().RegisterDiscoveryCallback(pkgNameTemp, subscribeId, callback); + DmRadarHelper::GetInstance().ReportDmBehavior(pkgNameTemp, "AddDiscoveryCallback", DM_OK); return subscribeId; } @@ -2406,10 +2404,8 @@ uint16_t DeviceManagerImpl::GetSubscribeIdFromMap(const std::string &pkgName) { { std::lock_guard autoLock(subMapLock); - for (auto &item : pkgName2SubIdMap_) { - if (item.first.find(pkgName) == 0) { - return GetSubscribeId(item.first); - } + if (pkgName2SubIdMap_.find(pkgName) != pkgName2SubIdMap_.end()) { + return pkgName2SubIdMap_[pkgName]; } } return DM_INVALID_FLAG_ID; diff --git a/interfaces/inner_kits/native_cpp/src/notify/device_manager_notify.cpp b/interfaces/inner_kits/native_cpp/src/notify/device_manager_notify.cpp index e25133b4eca8b8e89695be5171ffd97a0a9a5d26..db1110f6ee1299989cafc7a170fe0ba1b925c222 100644 --- a/interfaces/inner_kits/native_cpp/src/notify/device_manager_notify.cpp +++ b/interfaces/inner_kits/native_cpp/src/notify/device_manager_notify.cpp @@ -194,10 +194,16 @@ void DeviceManagerNotify::UnRegisterPackageCallback(const std::string &pkgName) std::lock_guard autoLock(lock_); deviceStateCallback_.erase(pkgName); deviceStatusCallback_.erase(pkgName); - deviceDiscoveryCallbacks_.erase(pkgName); devicePublishCallbacks_.erase(pkgName); authenticateCallback_.erase(pkgName); dmInitCallback_.erase(pkgName); + for (auto it = deviceDiscoveryCallbacks_.begin(); it != alreadyOnlinePkgName_.end();) { + if (it->first.find(pkgName) != std::string::npos) { + it = deviceDiscoveryCallbacks_.erase(it); + } else { + ++it; + } + } } void DeviceManagerNotify::RegisterDeviceManagerFaCallback(const std::string &pkgName,