diff --git a/services/service/include/advertise/advertise_manager.h b/services/service/include/advertise/advertise_manager.h index e9aa5ad4aff82634ca66de95c19505bc37c8733e..c20f77d32372956332f67e6785bf63e9fbed7dd1 100644 --- a/services/service/include/advertise/advertise_manager.h +++ b/services/service/include/advertise/advertise_manager.h @@ -28,14 +28,22 @@ public: int32_t StartAdvertising(const std::string &pkgName, const std::map &advertiseParam); int32_t StopAdvertising(const std::string &pkgName, int32_t publishId); + void ClearPulishIdCache(const std::string &pkgName); private: void HandleAutoStopAdvertise(const std::string &timerName, const std::string &pkgName, int32_t publishId); - void ConfigAdvParam(const std::map &advertiseParam, DmPublishInfo *dmPubInfo); + void ConfigAdvParam(const std::map &advertiseParam, DmPublishInfo *dmPubInfo, + const std::string &pkgName); + int32_t GenInnerPublishId(const std::string &pkgName, int32_t publishId); + int32_t GetAndRemoveInnerPublishId(const std::string &pkgName, int32_t publishId); private: std::shared_ptr timer_; std::shared_ptr softbusListener_; + + std::mutex pubMapLock_; + std::map> pkgName2PubIdMap_; + std::set publishIdSet_; }; } // namespace DistributedHardware } // namespace OHOS diff --git a/services/service/include/device_manager_service.h b/services/service/include/device_manager_service.h index 3e9718169fd5f8f52e37f84c0f94ee3ac76978d2..6b70ff2d96c189ea33c048830c5cf1ee519d567b 100644 --- a/services/service/include/device_manager_service.h +++ b/services/service/include/device_manager_service.h @@ -230,6 +230,7 @@ public: int32_t UpdateServiceInfo(const DMServiceInfo &serviceInfo); int32_t GetServiceInfoById(int64_t serviceId, DMServiceInfo &serviceInfo); int32_t GetCallerServiceInfos(std::vector &serviceInfos); + void ClearPulishIdCache(const std::string &pkgName); private: bool IsDMServiceImplReady(); diff --git a/services/service/src/advertise/advertise_manager.cpp b/services/service/src/advertise/advertise_manager.cpp index ef2abd1e938ad5b2b6af1b31ee8a9d267f1515db..b5205258ce9c0fff47ab8c28ca6d83fbdb31f756 100644 --- a/services/service/src/advertise/advertise_manager.cpp +++ b/services/service/src/advertise/advertise_manager.cpp @@ -18,11 +18,15 @@ #include "dm_constants.h" #include "dm_log.h" #include "dm_publish_info.h" +#include "dm_random.h" namespace OHOS { namespace DistributedHardware { const int32_t AUTO_STOP_ADVERTISE_DEFAULT_TIME = 120; const std::string AUTO_STOP_ADVERTISE_TASK = "AutoStopAdvertisingTask"; +const int32_t DM_MIN_RANDOM = 1; +const int32_t DM_MAX_RANDOM = INT32_MAX; +const int32_t DM_INVALID_FLAG_ID = 0; AdvertiseManager::AdvertiseManager(std::shared_ptr softbusListener) : softbusListener_(softbusListener) { @@ -43,7 +47,7 @@ int32_t AdvertiseManager::StartAdvertising(const std::string &pkgName, return ERR_DM_INPUT_PARA_INVALID; } DmPublishInfo dmPubInfo; - ConfigAdvParam(advertiseParam, &dmPubInfo); + ConfigAdvParam(advertiseParam, &dmPubInfo, pkgName); std::string capability = DM_CAPABILITY_OSD; if (advertiseParam.find(PARAM_KEY_DISC_CAPABILITY) != advertiseParam.end()) { capability = advertiseParam.find(PARAM_KEY_DISC_CAPABILITY)->second; @@ -84,7 +88,7 @@ int32_t AdvertiseManager::StartAdvertising(const std::string &pkgName, } void AdvertiseManager::ConfigAdvParam(const std::map &advertiseParam, - DmPublishInfo *dmPubInfo) + DmPublishInfo *dmPubInfo, const std::string &pkgName) { if (dmPubInfo == nullptr) { LOGE("ConfigAdvParam failed, dmPubInfo is nullptr."); @@ -100,7 +104,11 @@ void AdvertiseManager::ConfigAdvParam(const std::map & LOGI("StartAdvertising input MetaType=%{public}s", (advertiseParam.find(PARAM_KEY_META_TYPE)->second).c_str()); } if (advertiseParam.find(PARAM_KEY_PUBLISH_ID) != advertiseParam.end()) { - dmPubInfo->publishId = std::atoi((advertiseParam.find(PARAM_KEY_PUBLISH_ID)->second).c_str()); + if (IsNumberString(advertiseParam.find(PARAM_KEY_PUBLISH_ID)->second)) { + int32_t publishId = std::atoi((advertiseParam.find(PARAM_KEY_PUBLISH_ID)->second).c_str()); + LOGI("PublishId=%{public}d", publishId); + dmPubInfo->publishId = GenInnerPublishId(pkgName, publishId); + } } if (advertiseParam.find(PARAM_KEY_DISC_MODE) != advertiseParam.end()) { dmPubInfo->mode = @@ -120,12 +128,18 @@ void AdvertiseManager::ConfigAdvParam(const std::map & int32_t AdvertiseManager::StopAdvertising(const std::string &pkgName, int32_t publishId) { - LOGI("AdvertiseManager::StopDiscovering begin for pkgName = %{public}s.", pkgName.c_str()); + LOGI("AdvertiseManager::StopDiscovering begin for pkgName = %{public}s, publishId = %{public}d.", pkgName.c_str(), + publishId); if (pkgName.empty()) { LOGE("Invalid parameter, pkgName is empty."); return ERR_DM_INPUT_PARA_INVALID; } - return softbusListener_->StopPublishSoftbusLNN(publishId); + int32_t tempPublishId = GetAndRemoveInnerPublishId(pkgName, publishId); + if (tempPublishId == DM_INVALID_FLAG_ID) { + LOGE("Failed: cannot find pkgName in cache map."); + return ERR_DM_INPUT_PARA_INVALID; + } + return softbusListener_->StopPublishSoftbusLNN(tempPublishId); } void AdvertiseManager::HandleAutoStopAdvertise(const std::string &timerName, const std::string &pkgName, @@ -134,5 +148,66 @@ void AdvertiseManager::HandleAutoStopAdvertise(const std::string &timerName, con LOGI("HandleAutoStopAdvertise, auto stop advertise task timeout, timerName=%{public}s", timerName.c_str()); StopAdvertising(pkgName, publishId); } + +int32_t AdvertiseManager::GenInnerPublishId(const std::string &pkgName, int32_t publishId) +{ + int32_t tempPublishId = DM_INVALID_FLAG_ID; + { + std::lock_guard autoLock(pubMapLock_); + if (pkgName2PubIdMap_[pkgName].find(publishId) != pkgName2PubIdMap_[pkgName].end()) { + softbusListener_->StopPublishSoftbusLNN(pkgName2PubIdMap_[pkgName][publishId]); + publishIdSet_.erase(pkgName2PubIdMap_[pkgName][publishId]); + } + if (pkgName2PubIdMap_.find(pkgName) == pkgName2PubIdMap_.end()) { + pkgName2PubIdMap_[pkgName] = std::map(); + } + bool isExist = false; + do { + tempPublishId = GenRandInt(DM_MIN_RANDOM, DM_MAX_RANDOM); + if (publishIdSet_.find(tempPublishId) != publishIdSet_.end()) { + LOGE("The tempPublishId: %{public}d is exist.", tempPublishId); + isExist = true; + } else { + isExist = false; + } + } while (isExist); + publishIdSet_.emplace(tempPublishId); + pkgName2PubIdMap_[pkgName][publishId] = tempPublishId; + } + return tempPublishId; +} + +int32_t AdvertiseManager::GetAndRemoveInnerPublishId(const std::string &pkgName, int32_t publishId) +{ + int32_t tempPublishId = DM_INVALID_FLAG_ID; + { + std::lock_guard autoLock(pubMapLock_); + if (pkgName2PubIdMap_.find(pkgName) != pkgName2PubIdMap_.end() && + pkgName2PubIdMap_[pkgName].find(publishId) != pkgName2PubIdMap_[pkgName].end()) { + tempPublishId = pkgName2PubIdMap_[pkgName][publishId]; + pkgName2PubIdMap_[pkgName].erase(publishId); + publishIdSet_.erase(tempPublishId); + } + if (pkgName2PubIdMap_[pkgName].empty()) { + pkgName2PubIdMap_.erase(pkgName); + } + } + return tempPublishId; +} + +void AdvertiseManager::ClearPulishIdCache(const std::string &pkgName) +{ + LOGI("Begin for pkgName = %{public}s.", pkgName.c_str()); + if (pkgName.empty()) { + LOGE("Invalid parameter, pkgName is empty."); + return; + } + std::lock_guard autoLock(pubMapLock_); + for (auto iter : pkgName2PubIdMap_[pkgName]) { + softbusListener_->StopPublishSoftbusLNN(iter.second); + publishIdSet_.erase(iter.second); + } + pkgName2PubIdMap_.erase(pkgName); +} } // namespace DistributedHardware } // namespace OHOS diff --git a/services/service/src/device_manager_service.cpp b/services/service/src/device_manager_service.cpp index 3b8184201a8afe4742b3b72644f0436d1dabe0b8..00ba428730b8f433ae731fb3af4767e7348c8828 100644 --- a/services/service/src/device_manager_service.cpp +++ b/services/service/src/device_manager_service.cpp @@ -2951,5 +2951,11 @@ void DeviceManagerService::AddHmlInfoToBindParam(int32_t actionId, std::string & bindParam = std::string(str); cJSON_Delete(bindParamObj); } + +void DeviceManagerService::ClearPulishIdCache(const std::string &pkgName) +{ + CHECK_NULL_VOID(advertiseMgr_); + advertiseMgr_->ClearPulishIdCache(pkgName); +} } // namespace DistributedHardware } // namespace OHOS \ No newline at end of file diff --git a/services/service/src/ipc/standard/ipc_server_stub.cpp b/services/service/src/ipc/standard/ipc_server_stub.cpp index 04eafcf97e6a3a7bc70f39a2cf45ecc1d0044c36..6a1d4209db767402382532be3834c8b9c49e249c 100644 --- a/services/service/src/ipc/standard/ipc_server_stub.cpp +++ b/services/service/src/ipc/standard/ipc_server_stub.cpp @@ -355,6 +355,7 @@ void AppDeathRecipient::OnRemoteDied(const wptr &remote) IpcServerStub::GetInstance().UnRegisterDeviceManagerListener(processInfo); DeviceManagerService::GetInstance().ClearDiscoveryCache(processInfo); DeviceManagerServiceNotify::GetInstance().ClearDiedProcessCallback(processInfo); + DeviceManagerService::GetInstance().ClearPulishIdCache(processInfo.pkgName); } void IpcServerStub::AddSystemSA(const std::string &pkgName) diff --git a/test/unittest/UTTest_device_manager_service.cpp b/test/unittest/UTTest_device_manager_service.cpp index 4e37e0fa6e6dcf5a54369a7dbd2b6ae5e4c782d2..11428534c283b3a89fd4cdf7b3a4eee4fababb30 100644 --- a/test/unittest/UTTest_device_manager_service.cpp +++ b/test/unittest/UTTest_device_manager_service.cpp @@ -200,7 +200,7 @@ HWTEST_F(DeviceManagerServiceTest, PublishDeviceDiscovery_004, testing::ext::Tes int ret = DeviceManagerService::GetInstance().PublishDeviceDiscovery(pkgName, publishInfo); pkgName = "1com.ohos.test1"; ret = DeviceManagerService::GetInstance().PublishDeviceDiscovery(pkgName, publishInfo); - EXPECT_TRUE(ret == SOFTBUS_IPC_ERR || ret == SOFTBUS_DISCOVER_MANAGER_DUPLICATE_PARAM); + EXPECT_TRUE(ret == SOFTBUS_IPC_ERR || ret == SOFTBUS_DISCOVER_MANAGER_DUPLICATE_PARAM || ret == DM_OK); DeviceManagerService::GetInstance().UninitDMServiceListener(); } @@ -246,7 +246,8 @@ HWTEST_F(DeviceManagerServiceTest, UnPublishDeviceDiscovery_003, testing::ext::T int32_t publishId = 1; DeviceManagerService::GetInstance().InitDMServiceListener(); int ret = DeviceManagerService::GetInstance().UnPublishDeviceDiscovery(pkgName, publishId); - EXPECT_TRUE(ret == SOFTBUS_DISCOVER_COAP_STOP_PUBLISH_FAIL || ret == SOFTBUS_ERR); + EXPECT_TRUE(ret == SOFTBUS_DISCOVER_COAP_STOP_PUBLISH_FAIL || ret == SOFTBUS_ERR || + ret == ERR_DM_INPUT_PARA_INVALID); DeviceManagerService::GetInstance().UninitDMServiceListener(); } @@ -1908,7 +1909,8 @@ HWTEST_F(DeviceManagerServiceTest, StopAdvertising_004, testing::ext::TestSize.L std::map advertiseParam; DeviceManagerService::GetInstance().InitDMServiceListener(); int32_t ret = DeviceManagerService::GetInstance().StopAdvertising(pkgName, advertiseParam); - EXPECT_TRUE(ret == SOFTBUS_DISCOVER_COAP_STOP_PUBLISH_FAIL || ret == SOFTBUS_ERR); + EXPECT_TRUE(ret == SOFTBUS_DISCOVER_COAP_STOP_PUBLISH_FAIL || ret == SOFTBUS_ERR || + ret == ERR_DM_INPUT_PARA_INVALID); DeviceManagerService::GetInstance().UninitDMServiceListener(); }