From 5809ab23697e21cddfb8f3010cd08cb255566740 Mon Sep 17 00:00:00 2001 From: lizhuojun Date: Sat, 4 Jan 2025 15:32:46 +0800 Subject: [PATCH] udmf support progress Signed-off-by: lizhuojun --- .../permission/uri_permission_manager.cpp | 5 +- .../udmf/permission/uri_permission_manager.h | 3 +- .../service/udmf/store/runtime_store.cpp | 2 +- .../service/udmf/udmf_service_impl.cpp | 71 +++++++++++-------- .../service/udmf/udmf_service_impl.h | 8 +-- .../service/udmf/udmf_service_stub.cpp | 13 +++- .../service/udmf/udmf_service_stub.h | 4 +- 7 files changed, 62 insertions(+), 44 deletions(-) diff --git a/services/distributeddataservice/service/udmf/permission/uri_permission_manager.cpp b/services/distributeddataservice/service/udmf/permission/uri_permission_manager.cpp index 01007bdd1..23c2685b4 100644 --- a/services/distributeddataservice/service/udmf/permission/uri_permission_manager.cpp +++ b/services/distributeddataservice/service/udmf/permission/uri_permission_manager.cpp @@ -30,8 +30,8 @@ UriPermissionManager &UriPermissionManager::GetInstance() return instance; } -Status UriPermissionManager::GrantUriPermission( - const std::vector &allUri, uint32_t tokenId, const std::string &queryKey, uint32_t &completeCount) +Status UriPermissionManager::GrantUriPermission(const std::vector &allUri, uint32_t tokenId, + const std::string &queryKey) { std::string bundleName; if (!PreProcessUtils::GetHapBundleNameByToken(tokenId, bundleName)) { @@ -60,7 +60,6 @@ Status UriPermissionManager::GrantUriPermission( status, queryKey.c_str(), instIndex); return E_NO_PERMISSION; } - completeCount = std::min(allUri.size(), index + GRANT_URI_PERMISSION_MAX_SIZE); } ZLOGI("GrantUriPermission end, url size:%{public}zu, queryKey:%{public}s.", allUri.size(), queryKey.c_str()); return E_OK; diff --git a/services/distributeddataservice/service/udmf/permission/uri_permission_manager.h b/services/distributeddataservice/service/udmf/permission/uri_permission_manager.h index 389e0e063..2be3212fc 100644 --- a/services/distributeddataservice/service/udmf/permission/uri_permission_manager.h +++ b/services/distributeddataservice/service/udmf/permission/uri_permission_manager.h @@ -29,8 +29,7 @@ namespace UDMF { class UriPermissionManager { public: static UriPermissionManager &GetInstance(); - Status GrantUriPermission(const std::vector &allUri, uint32_t tokenId, - const std::string &queryKey, uint32_t &completeCount); + Status GrantUriPermission(const std::vector &allUri, uint32_t tokenId, const std::string &queryKey); private: UriPermissionManager() {} diff --git a/services/distributeddataservice/service/udmf/store/runtime_store.cpp b/services/distributeddataservice/service/udmf/store/runtime_store.cpp index dcce95fbe..ff3fe1678 100644 --- a/services/distributeddataservice/service/udmf/store/runtime_store.cpp +++ b/services/distributeddataservice/service/udmf/store/runtime_store.cpp @@ -305,7 +305,7 @@ Status RuntimeStore::Sync(const std::vector &devices, ProcessCallba void RuntimeStore::NotifySyncProcss(const DevSyncProcessMap &processMap, ProcessCallback callback, const DevNameMap &deviceNameMap) { - AsyncProcessInfo processInfo{ASYNC_IDLE, ASYNC_IDLE, "", 0, 0, 0, 0, 0}; + AsyncProcessInfo processInfo; for (const auto &[originDeviceId, syncProcess] : processMap) { // only one device processInfo.srcDevName = deviceNameMap.at(originDeviceId); processInfo.syncId = syncProcess.syncId; diff --git a/services/distributeddataservice/service/udmf/udmf_service_impl.cpp b/services/distributeddataservice/service/udmf/udmf_service_impl.cpp index 0670c150d..47f27229d 100644 --- a/services/distributeddataservice/service/udmf/udmf_service_impl.cpp +++ b/services/distributeddataservice/service/udmf/udmf_service_impl.cpp @@ -151,11 +151,6 @@ int32_t UdmfServiceImpl::SaveData(CustomOption &option, UnifiedData &unifiedData return E_DB_ERROR; } - if (!UnifiedDataUtils::IsPersist(intention) && store->Clear() != E_OK) { - ZLOGE("Clear store failed, intention: %{public}s.", intention.c_str()); - return E_DB_ERROR; - } - if (store->Put(unifiedData) != E_OK) { ZLOGE("Put unified data failed, intention: %{public}s.", intention.c_str()); return E_DB_ERROR; @@ -296,10 +291,7 @@ int32_t UdmfServiceImpl::ProcessUri(const QueryOption &query, UnifiedData &unifi ZLOGW("No need to grant uri permissions, queryKey=%{public}s.", query.key.c_str()); return E_OK; } - asyncProcessInfo_.permStatus = ASYNC_RUNNING; - asyncProcessInfo_.permTotal = allUri.size(); - if (UriPermissionManager::GetInstance().GrantUriPermission(allUri, query.tokenId, query.key, - asyncProcessInfo_.permFnished) != E_OK) { + if (UriPermissionManager::GetInstance().GrantUriPermission(allUri, query.tokenId, query.key) != E_OK) { ZLOGE("GrantUriPermission fail, bundleName=%{public}s, key=%{public}s.", bundleName.c_str(), query.key.c_str()); return E_NO_PERMISSION; @@ -549,7 +541,7 @@ int32_t UdmfServiceImpl::Sync(const QueryOption &query, const std::vector 0) { - syncingDevName_ = DistributedData::DeviceManagerAdapter::GetInstance().GetDeviceInfo(devices[0]).deviceName; - } - auto callback = [this](AsyncProcessInfo &syncInfo) { - asyncProcessInfo_.syncId = syncInfo.syncId; - asyncProcessInfo_.syncStatus = syncInfo.syncStatus; - asyncProcessInfo_.syncTotal = syncInfo.syncTotal; - asyncProcessInfo_.syncFinished = syncInfo.syncFinished; - asyncProcessInfo_.srcDevName = syncInfo.srcDevName; - if (asyncProcessInfo_.syncStatus != ASYNC_RUNNING) { - syncingData_ = false; + auto callback = [this, query](AsyncProcessInfo &syncInfo) { + if (query.key.empty()) { + return; } + syncInfo.businessUdKey = query.key; + std::lock_guard lock(mutex_); + asyncProcessInfoMap_.insert_or_assign(syncInfo.businessUdKey, syncInfo); ZLOGD("store.Sync: name=%{public}s, id=%{public}u, status=%{public}u, total=%{public}u, finish=%{public}u", syncInfo.srcDevName.c_str(), syncInfo.syncId, syncInfo.syncStatus, syncInfo.syncTotal, syncInfo.syncFinished); @@ -577,7 +563,6 @@ int32_t UdmfServiceImpl::Sync(const QueryOption &query, const std::vectorSync(devices, callback) != E_OK) { - syncingData_ = false; ZLOGE("Store sync failed, intention: %{public}s.", key.intention.c_str()); RadarReporterAdapter::ReportFail(std::string(__FUNCTION__), BizScene::SYNC_DATA, SyncDataStage::SYNC_END, StageRes::FAILED, E_DB_ERROR, BizState::DFX_END); @@ -667,7 +652,7 @@ int32_t UdmfServiceImpl::GetAppShareOption(const std::string &intention, int32_t std::string appShareOption; int32_t ret = store->GetLocal(std::to_string(accessTokenIDEx), appShareOption); if (ret != E_OK) { - ZLOGE("GetAppShareOption empty, intention: %{public}s.", intention.c_str()); + ZLOGW("GetAppShareOption empty, intention: %{public}s.", intention.c_str()); return ret; } ZLOGI("GetAppShareOption, intention: %{public}s, appShareOption:%{public}s.", @@ -756,17 +741,35 @@ int32_t UdmfServiceImpl::OnBind(const BindInfo &bindInfo) int32_t UdmfServiceImpl::ObtainAsynProcess(AsyncProcessInfo &processInfo) { - processInfo = asyncProcessInfo_; - if (syncingData_ && processInfo.syncStatus != ASYNC_RUNNING) { - processInfo.syncStatus = ASYNC_RUNNING; - processInfo.srcDevName = syncingDevName_; + if (processInfo.businessUdKey.empty()) { + return E_INVALID_PARAMETERS; + } + std::lock_guard lock(mutex_); + if (asyncProcessInfoMap_.empty()) { + processInfo.syncStatus = AsyncTaskStatus::ASYNC_SUCCESS; + processInfo.srcDevName = "Local"; + return E_OK; } + auto it = asyncProcessInfoMap_.find(processInfo.businessUdKey); + if (it == asyncProcessInfoMap_.end()) { + processInfo.syncStatus = AsyncTaskStatus::ASYNC_SUCCESS; + processInfo.srcDevName = "Local"; + return E_OK; + } + auto asyncProcessInfo = asyncProcessInfoMap_.at(processInfo.businessUdKey); + processInfo.syncStatus = asyncProcessInfo.syncStatus; + processInfo.srcDevName = asyncProcessInfo.srcDevName; return E_OK; } -int32_t UdmfServiceImpl::ClearAsynProcess() +int32_t UdmfServiceImpl::ClearAsynProcessByKey(const std::string & businessUdKey) { - (void)memset_s(&asyncProcessInfo_, sizeof(asyncProcessInfo_), 0, sizeof(asyncProcessInfo_)); + ZLOGI("ClearAsynProcessByKey begin."); + std::lock_guard lock(mutex_); + if (asyncProcessInfoMap_.find(businessUdKey) == asyncProcessInfoMap_.end()) { + return E_OK; + } + asyncProcessInfoMap_.erase(businessUdKey); return E_OK; } @@ -825,5 +828,13 @@ bool UdmfServiceImpl::IsBundleNameWhitelisted(const std::string &bundleName) { return std::find(std::begin(WHITE_LIST), std::end(WHITE_LIST), bundleName) != std::end(WHITE_LIST); } + +void UdmfServiceImpl::RegisterAsyncProcessInfo(const std::string &businessUdKey) +{ + AsyncProcessInfo info; + std::lock_guard lock(mutex_); + asyncProcessInfoMap_.insert_or_assign(businessUdKey, std::move(info)); +} + } // namespace UDMF } // namespace OHOS \ No newline at end of file diff --git a/services/distributeddataservice/service/udmf/udmf_service_impl.h b/services/distributeddataservice/service/udmf/udmf_service_impl.h index dd2a46ff8..844d9fd11 100644 --- a/services/distributeddataservice/service/udmf/udmf_service_impl.h +++ b/services/distributeddataservice/service/udmf/udmf_service_impl.h @@ -53,7 +53,7 @@ public: int32_t OnInitialize() override; int32_t OnBind(const BindInfo &bindInfo) override; int32_t ObtainAsynProcess(AsyncProcessInfo &processInfo) override; - int32_t ClearAsynProcess() override; + int32_t ClearAsynProcessByKey(const std::string &businessUdKey) override; int32_t ResolveAutoLaunch(const std::string &identifier, DBLaunchParam ¶m) override; private: int32_t SaveData(CustomOption &option, UnifiedData &unifiedData, std::string &key); @@ -65,6 +65,7 @@ private: int32_t ProcessCrossDeviceData(UnifiedData &unifiedData, std::vector &uris); bool VerifyPermission(const std::string &permission, uint32_t callerTokenId); bool IsBundleNameWhitelisted(const std::string &bundleName); + void RegisterAsyncProcessInfo(const std::string &businessUdKey); class Factory { public: @@ -78,9 +79,8 @@ private: std::map privilegeCache_; std::shared_ptr executors_; - AsyncProcessInfo asyncProcessInfo_{}; - bool syncingData_{false}; - std::string syncingDevName_; + std::mutex mutex_; + std::unordered_map asyncProcessInfoMap_; }; } // namespace UDMF } // namespace OHOS diff --git a/services/distributeddataservice/service/udmf/udmf_service_stub.cpp b/services/distributeddataservice/service/udmf/udmf_service_stub.cpp index 010806bf4..84fde1e45 100644 --- a/services/distributeddataservice/service/udmf/udmf_service_stub.cpp +++ b/services/distributeddataservice/service/udmf/udmf_service_stub.cpp @@ -270,6 +270,10 @@ int32_t UdmfServiceStub::OnObtainAsynProcess(MessageParcel &data, MessageParcel { ZLOGD("start"); AsyncProcessInfo processInfo; + if (!ITypesUtil::Unmarshal(data, processInfo)) { + ZLOGE("Unmarshal processInfo failed"); + return E_READ_PARCEL_ERROR; + } int32_t status = ObtainAsynProcess(processInfo); if (!ITypesUtil::Marshal(reply, status, processInfo)) { ZLOGE("Marshal status or processInfo failed, status: %{public}d", status); @@ -278,10 +282,15 @@ int32_t UdmfServiceStub::OnObtainAsynProcess(MessageParcel &data, MessageParcel return E_OK; } -int32_t UdmfServiceStub::OnClearAsynProcess(MessageParcel &data, MessageParcel &reply) +int32_t UdmfServiceStub::OnClearAsynProcessByKey(MessageParcel &data, MessageParcel &reply) { ZLOGD("start"); - int32_t status = ClearAsynProcess(); + std::string businessUdKey; + if (!ITypesUtil::Unmarshal(data, businessUdKey)) { + ZLOGE("Unmarshal businessUdKey failed!"); + return E_READ_PARCEL_ERROR; + } + int32_t status = ClearAsynProcessByKey(businessUdKey); if (!ITypesUtil::Marshal(reply, status)) { ZLOGE("Marshal status failed, status: %{public}d", status); return E_WRITE_PARCEL_ERROR; diff --git a/services/distributeddataservice/service/udmf/udmf_service_stub.h b/services/distributeddataservice/service/udmf/udmf_service_stub.h index e3a66a588..b027b1184 100644 --- a/services/distributeddataservice/service/udmf/udmf_service_stub.h +++ b/services/distributeddataservice/service/udmf/udmf_service_stub.h @@ -49,7 +49,7 @@ private: int32_t OnGetAppShareOption(MessageParcel &data, MessageParcel &reply); int32_t OnRemoveAppShareOption(MessageParcel &data, MessageParcel &reply); int32_t OnObtainAsynProcess(MessageParcel &data, MessageParcel &reply); - int32_t OnClearAsynProcess(MessageParcel &data, MessageParcel &reply); + int32_t OnClearAsynProcessByKey(MessageParcel &data, MessageParcel &reply); using Handler = int32_t (UdmfServiceStub::*)(MessageParcel &data, MessageParcel &reply); static constexpr Handler HANDLERS[static_cast(UdmfServiceInterfaceCode::CODE_BUTT)] = { @@ -66,7 +66,7 @@ private: &UdmfServiceStub::OnGetAppShareOption, &UdmfServiceStub::OnRemoveAppShareOption, &UdmfServiceStub::OnObtainAsynProcess, - &UdmfServiceStub::OnClearAsynProcess + &UdmfServiceStub::OnClearAsynProcessByKey }; }; } // namespace UDMF -- Gitee