From f4d79272aeed1a875966fe746e531292c69fb15a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8F=B2=E6=99=93=E6=99=93?= Date: Mon, 24 Feb 2025 20:37:28 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E5=8F=91=E5=B8=83publishId=E7=BB=9F?= =?UTF-8?q?=E4=B8=80=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 史晓晓 --- .../include/advertise/advertise_manager.h | 9 ++- .../service/include/device_manager_service.h | 1 + .../src/advertise/advertise_manager.cpp | 75 +++++++++++++++++-- .../service/src/device_manager_service.cpp | 6 ++ .../src/ipc/standard/ipc_server_stub.cpp | 1 + 5 files changed, 86 insertions(+), 6 deletions(-) diff --git a/services/service/include/advertise/advertise_manager.h b/services/service/include/advertise/advertise_manager.h index e9aa5ad4a..8e0066a79 100644 --- a/services/service/include/advertise/advertise_manager.h +++ b/services/service/include/advertise/advertise_manager.h @@ -28,14 +28,21 @@ 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 AddPublishId(const std::string &pkgName, int32_t publishId); + int32_t RemovePublishId(const std::string &pkgName, int32_t publishId); private: std::shared_ptr timer_; std::shared_ptr softbusListener_; + + std::mutex pubMapLock; + std::map> pkgName2PubIdMap_; }; } // namespace DistributedHardware } // namespace OHOS diff --git a/services/service/include/device_manager_service.h b/services/service/include/device_manager_service.h index b4ad67f6a..ab34dcdbd 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 172f0565b..b481af447 100644 --- a/services/service/src/advertise/advertise_manager.cpp +++ b/services/service/src/advertise/advertise_manager.cpp @@ -15,6 +15,8 @@ #include "advertise_manager.h" +#include + #include "dm_constants.h" #include "dm_log.h" #include "dm_publish_info.h" @@ -23,6 +25,17 @@ namespace OHOS { namespace DistributedHardware { const int32_t AUTO_STOP_ADVERTISE_DEFAULT_TIME = 120; const std::string AUTO_STOP_ADVERTISE_TASK = "AutoStopAdvertisingTask"; +const uint16_t DM_MIN_RANDOM = 1; +const uint16_t DM_MAX_RANDOM = 65535; +const uint16_t DM_INVALID_FLAG_ID = 0; + +uint16_t GenRandUint(uint16_t randMin, uint16_t randMax) +{ + std::random_device randDevice; + std::mt19937 genRand(randDevice()); + std::uniform_int_distribution disRand(randMin, randMax); + return disRand(genRand); +} AdvertiseManager::AdvertiseManager(std::shared_ptr softbusListener) : softbusListener_(softbusListener) { @@ -43,7 +56,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; @@ -81,7 +94,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."); @@ -97,7 +110,9 @@ 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()); + int32_t publishId = std::atoi((advertiseParam.find(PARAM_KEY_PUBLISH_ID)->second).c_str()); + LOGI("PublishId=%{public}d", publishId); + dmPubInfo->publishId = AddPublishId(pkgName, publishId); } if (advertiseParam.find(PARAM_KEY_DISC_MODE) != advertiseParam.end()) { dmPubInfo->mode = @@ -117,12 +132,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 = RemovePublishId(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, @@ -131,5 +152,49 @@ 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::AddPublishId(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]); + } + if (pkgName2PubIdMap_.find(pkgName) == pkgName2PubIdMap_.end()) { + pkgName2PubIdMap_[pkgName] = std::map(); + } + tempPublishId = GenRandUint(DM_MIN_RANDOM, DM_MAX_RANDOM); + pkgName2PubIdMap_[pkgName][publishId] = tempPublishId; + } + return tempPublishId; +} + +int32_t AdvertiseManager::RemovePublishId(const std::string &pkgName, int32_t publishId) +{ + uint16_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); + } + 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; + } + 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 e60267060..1840ffe11 100644 --- a/services/service/src/device_manager_service.cpp +++ b/services/service/src/device_manager_service.cpp @@ -2916,5 +2916,11 @@ std::vector DeviceManagerService::GetDeviceNamePrefixs() } return dmServiceImplExtResident_->GetDeviceNamePrefixs(); } + +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 e9076897b..c01017e48 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) -- Gitee From beb63c362d7c3a5c0a38643c6d4e3639c9647298 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8F=B2=E6=99=93=E6=99=93?= Date: Tue, 25 Feb 2025 10:59:37 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E4=BF=AE=E6=94=B9ut?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 史晓晓 --- test/unittest/UTTest_device_manager_service.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/test/unittest/UTTest_device_manager_service.cpp b/test/unittest/UTTest_device_manager_service.cpp index 4e37e0fa6..11428534c 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(); } -- Gitee