From 3c40a5d3762298e29b54bba7ed0239a43bf010a9 Mon Sep 17 00:00:00 2001 From: nzy Date: Thu, 7 Nov 2024 15:00:12 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E4=B8=BATS=E4=BE=A7=E6=8F=90=E4=BE=9BGetAb?= =?UTF-8?q?ilityInfo=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: nzy --- .../js_scene_session_manager.cpp | 57 +++++++++++++++++++ .../js_scene_session_manager.h | 2 + .../include/scene_session_manager.h | 2 + .../src/scene_session_manager.cpp | 55 +++++++++++++++++- 4 files changed, 115 insertions(+), 1 deletion(-) diff --git a/window_scene/interfaces/kits/napi/scene_session_manager/js_scene_session_manager.cpp b/window_scene/interfaces/kits/napi/scene_session_manager/js_scene_session_manager.cpp index 75465e8350..13797ef33d 100644 --- a/window_scene/interfaces/kits/napi/scene_session_manager/js_scene_session_manager.cpp +++ b/window_scene/interfaces/kits/napi/scene_session_manager/js_scene_session_manager.cpp @@ -144,6 +144,7 @@ napi_value JsSceneSessionManager::Init(napi_env env, napi_value exportObj) JsSceneSessionManager::InitWithRenderServiceAdded); BindNativeFunction(env, exportObj, "getAllAbilityInfo", moduleName, JsSceneSessionManager::GetAllAbilityInfos); BindNativeFunction(env, exportObj, "getBatchAbilityInfos", moduleName, JsSceneSessionManager::GetBatchAbilityInfos); + BindNativeFunction(env, exportObj, "getAbilityInfo", moduleName, JsSceneSessionManager::GetAbilityInfo); BindNativeFunction(env, exportObj, "getAllWindowVisibilityInfos", moduleName, JsSceneSessionManager::GetAllWindowVisibilityInfos); BindNativeFunction(env, exportObj, "prepareTerminate", moduleName, JsSceneSessionManager::PrepareTerminate); @@ -816,6 +817,13 @@ napi_value JsSceneSessionManager::GetBatchAbilityInfos(napi_env env, napi_callba return (me != nullptr) ? me->OnGetBatchAbilityInfos(env, info) : nullptr; } +napi_value JsSceneSessionManager::GetAbilityInfo(napi_env env, napi_callback_info info) +{ + TLOGD(WmsLogTag::WMS_SCB, "[NAPI]"); + JsSceneSessionManager* me = CheckParamsAndGetThis(env, info); + return (me != nullptr) ? me->OnGetAbilityInfo(env, info) : nullptr; +} + napi_value JsSceneSessionManager::PrepareTerminate(napi_env env, napi_callback_info info) { WLOGFD("[NAPI]"); @@ -1422,6 +1430,55 @@ napi_value JsSceneSessionManager::OnGetBatchAbilityInfos(napi_env env, napi_call return result; } +napi_value JsSceneSessionManager::OnGetAbilityInfo(napi_env env, napi_callback_info info) +{ + size_t argc = DEFAULT_ARG_COUNT; + napi_value argv[DEFAULT_ARG_COUNT] = { nullptr }; + napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr); + if (argc != ARGC_FOUR) { + TLOGE(WmsLogTag::DEFAULT, "[NAPI]Argc is invalid: %{public}zu", argc); + napi_throw(env, CreateJsError(env, static_cast(WSErrorCode::WS_ERROR_INVALID_PARAM), + "Input parameter is missing or invalid")); + return NapiGetUndefined(env); + } + std::string bundleName; + if (!ConvertFromJsValue(env, argv[0], bundleName)) { + TLOGE(WmsLogTag::DEFAULT, "[NAPI]Failed to convert parameter to bundleName"); + napi_throw(env, CreateJsError(env, static_cast(WSErrorCode::WS_ERROR_INVALID_PARAM), + "Input parameter is missing or invalid")); + return NapiGetUndefined(env); + } + std::string moduleName; + if (!ConvertFromJsValue(env, argv[ARG_INDEX_ONE], moduleName)) { + TLOGE(WmsLogTag::DEFAULT, "[NAPI]Failed to convert parameter to moduleName"); + napi_throw(env, CreateJsError(env, static_cast(WSErrorCode::WS_ERROR_INVALID_PARAM), + "Input parameter is missing or invalid")); + return NapiGetUndefined(env); + } + std::string abilityName; + if (!ConvertFromJsValue(env, argv[ARG_INDEX_TWO], abilityName)) { + TLOGE(WmsLogTag::DEFAULT, "[NAPI]Failed to convert parameter to abilityName"); + napi_throw(env, CreateJsError(env, static_cast(WSErrorCode::WS_ERROR_INVALID_PARAM), + "Input parameter is missing or invalid")); + return NapiGetUndefined(env); + } + int32_t userId = 0; + if (!ConvertFromJsValue(env, argv[ARG_INDEX_THREE], userId)) { + TLOGE(WmsLogTag::DEFAULT, "[NAPI]Failed to convert parameter to userId"); + napi_throw(env, CreateJsError(env, static_cast(WSErrorCode::WS_ERROR_INVALID_PARAM), + "Input parameter is missing or invalid")); + return NapiGetUndefined(env); + } + SCBAbilityInfo scbAbilityInfo; + WSErrorCode ret = WS_JS_TO_ERROR_CODE_MAP.at(SceneSessionManager::GetInstance().GetAbilityInfo( + bundleName, moduleName, abilityName, userId, scbAbilityInfo)); + if (ret != WSErrorCode::WS_OK) { + napi_throw(env, CreateJsError(env, static_cast(WSErrorCode::WS_ERROR_STATE_ABNORMALLY), + "System is abnormal")); + } + return CreateSCBAbilityInfo(env, scbAbilityInfo); +} + napi_value JsSceneSessionManager::OnInitUserInfo(napi_env env, napi_callback_info info) { size_t argc = 4; diff --git a/window_scene/interfaces/kits/napi/scene_session_manager/js_scene_session_manager.h b/window_scene/interfaces/kits/napi/scene_session_manager/js_scene_session_manager.h index 650a047946..e11662deab 100644 --- a/window_scene/interfaces/kits/napi/scene_session_manager/js_scene_session_manager.h +++ b/window_scene/interfaces/kits/napi/scene_session_manager/js_scene_session_manager.h @@ -76,6 +76,7 @@ public: static napi_value GetAllWindowVisibilityInfos(napi_env env, napi_callback_info info); static napi_value GetAllAbilityInfos(napi_env env, napi_callback_info info); static napi_value GetBatchAbilityInfos(napi_env env, napi_callback_info info); + static napi_value GetAbilityInfo(napi_env env, napi_callback_info info); static napi_value PrepareTerminate(napi_env env, napi_callback_info info); static napi_value PerfRequestEx(napi_env env, napi_callback_info info); static napi_value UpdateWindowMode(napi_env env, napi_callback_info info); @@ -147,6 +148,7 @@ private: napi_value OnGetAllWindowVisibilityInfos(napi_env env, napi_callback_info info); napi_value OnGetAllAbilityInfos(napi_env env, napi_callback_info info); napi_value OnGetBatchAbilityInfos(napi_env env, napi_callback_info info); + napi_value OnGetAbilityInfo(napi_env env, napi_callback_info info); napi_value OnPrepareTerminate(napi_env env, napi_callback_info info); napi_value OnPerfRequestEx(napi_env env, napi_callback_info info); napi_value OnUpdateWindowMode(napi_env env, napi_callback_info info); diff --git a/window_scene/session_manager/include/scene_session_manager.h b/window_scene/session_manager/include/scene_session_manager.h index d3048602a3..28e856c5c0 100644 --- a/window_scene/session_manager/include/scene_session_manager.h +++ b/window_scene/session_manager/include/scene_session_manager.h @@ -286,6 +286,8 @@ public: std::vector& scbAbilityInfos); WSError GetBatchAbilityInfos(const std::vector& bundleNames, int32_t userId, std::vector& scbAbilityInfos); + WSError GetAbilityInfo(const std::string& bundleName, const std::string& moduleName, + const std::string& abilityName, int32_t userId, SCBAbilityInfo& scbAbilityInfo); WSError PrepareTerminate(int32_t persistentId, bool& isPrepareTerminate); WSError TerminateSessionNew( diff --git a/window_scene/session_manager/src/scene_session_manager.cpp b/window_scene/session_manager/src/scene_session_manager.cpp index 1f1625f23e..4756ec9e2b 100644 --- a/window_scene/session_manager/src/scene_session_manager.cpp +++ b/window_scene/session_manager/src/scene_session_manager.cpp @@ -6741,6 +6741,46 @@ __attribute__((no_sanitize("cfi"))) WSError SceneSessionManager::GetBatchAbility return GetAbilityInfosFromBundleInfo(bundleInfos, scbAbilityInfos); } +WSError SceneSessionManager::GetAbilityInfo(const std::string& bundleName, const std::string& moduleName, + const std::string& abilityName, int32_t userId, SCBAbilityInfo& scbAbilityInfo) +{ + if (bundleMgr_ == nullptr) { + TLOGE(WmsLogTag::DEFAULT, "bundleMgr_ is nullptr"); + return WSError::WS_ERROR_NULLPTR; + } + auto flag = (AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_WITH_APPLICATION | + AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_WITH_PERMISSION | + AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_WITH_METADATA | + static_cast(AppExecFwk::GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_ABILITY) | + static_cast(AppExecFwk::GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_APPLICATION) | + static_cast(AppExecFwk::GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE)); + AppExecFwk::BundleInfo bundleInfo; + if (bundleMgr_->GetBundleInfoV9(bundleName, flag, bundleInfo, userId)) { + TLOGE(WmsLogTag::DEFAULT, "Query ability info from BMS failed, ability:%{public}s", abilityName.c_str()); + return WSError::WS_ERROR_INVALID_PARAM; + } + auto hapModulesList = bundleInfo.hapModuleInfos; + if (hapModulesList.empty()) { + TLOGD(WmsLogTag::DEFAULT, "hapModulesList is empty, ability:%{public}s", abilityName.c_str()); + return WSError::WS_ERROR_INVALID_PARAM; + } + auto sdkVersion = bundleInfo.targetVersion % 100; // %100 to get the real version + for (auto hapModule: hapModulesList) { + auto abilityInfoList = hapModule.abilityInfos; + for (auto abilityInfo : abilityInfoList) { + if (abilityInfo.moduleName == moduleName && abilityInfo.name == abilityName) { + scbAbilityInfo.abilityInfo_ = abilityInfo; + scbAbilityInfo.sdkVersion_ = sdkVersion; + scbAbilityInfo.codePath_ = bundleInfo.applicationInfo.codePath; + GetOrientationFromResourceManager(scbAbilityInfo.abilityInfo_); + return WSError::WS_OK; + } + } + } + TLOGW(WmsLogTag::DEFAULT, "Ability info not found, ability:%{public}s", abilityName.c_str()); + return WSError::WS_ERROR_INVALID_PARAM; +} + WSError SceneSessionManager::GetAbilityInfosFromBundleInfo(std::vector& bundleInfos, std::vector& scbAbilityInfos) { @@ -6755,13 +6795,26 @@ WSError SceneSessionManager::GetAbilityInfosFromBundleInfo(std::vector Date: Thu, 7 Nov 2024 18:40:05 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=A3=80=E8=A7=86?= =?UTF-8?q?=E6=84=8F=E8=A7=812?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: nzy --- .../include/scene_session_manager.h | 2 +- .../src/scene_session_manager.cpp | 30 +++++++++---------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/window_scene/session_manager/include/scene_session_manager.h b/window_scene/session_manager/include/scene_session_manager.h index 28e856c5c0..e5f6de8ac5 100644 --- a/window_scene/session_manager/include/scene_session_manager.h +++ b/window_scene/session_manager/include/scene_session_manager.h @@ -694,7 +694,7 @@ private: void DestroyExtensionSession(const sptr& remoteExtSession); void EraseSceneSessionMapById(int32_t persistentId); void EraseSceneSessionAndMarkDirtyLockFree(int32_t persistentId); - WSError GetAbilityInfosFromBundleInfo(std::vector& bundleInfos, + WSError GetAbilityInfosFromBundleInfo(const std::vector& bundleInfos, std::vector& scbAbilityInfos); void GetOrientationFromResourceManager(AppExecFwk::AbilityInfo& abilityInfo); void UpdatePrivateStateAndNotifyForAllScreens(); diff --git a/window_scene/session_manager/src/scene_session_manager.cpp b/window_scene/session_manager/src/scene_session_manager.cpp index 4756ec9e2b..f257dbee40 100644 --- a/window_scene/session_manager/src/scene_session_manager.cpp +++ b/window_scene/session_manager/src/scene_session_manager.cpp @@ -6748,26 +6748,26 @@ WSError SceneSessionManager::GetAbilityInfo(const std::string& bundleName, const TLOGE(WmsLogTag::DEFAULT, "bundleMgr_ is nullptr"); return WSError::WS_ERROR_NULLPTR; } - auto flag = (AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_WITH_APPLICATION | + auto flags = (AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_WITH_APPLICATION | AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_WITH_PERMISSION | AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_WITH_METADATA | static_cast(AppExecFwk::GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_ABILITY) | static_cast(AppExecFwk::GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_APPLICATION) | static_cast(AppExecFwk::GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE)); AppExecFwk::BundleInfo bundleInfo; - if (bundleMgr_->GetBundleInfoV9(bundleName, flag, bundleInfo, userId)) { + if (bundleMgr_->GetBundleInfoV9(bundleName, flags, bundleInfo, userId)) { TLOGE(WmsLogTag::DEFAULT, "Query ability info from BMS failed, ability:%{public}s", abilityName.c_str()); return WSError::WS_ERROR_INVALID_PARAM; } - auto hapModulesList = bundleInfo.hapModuleInfos; + auto& hapModulesList = bundleInfo.hapModuleInfos; if (hapModulesList.empty()) { TLOGD(WmsLogTag::DEFAULT, "hapModulesList is empty, ability:%{public}s", abilityName.c_str()); return WSError::WS_ERROR_INVALID_PARAM; } - auto sdkVersion = bundleInfo.targetVersion % 100; // %100 to get the real version - for (auto hapModule: hapModulesList) { - auto abilityInfoList = hapModule.abilityInfos; - for (auto abilityInfo : abilityInfoList) { + auto sdkVersion = bundleInfo.targetVersion % 100; // % 100 to get the real version + for (auto& hapModule : hapModulesList) { + auto& abilityInfoList = hapModule.abilityInfos; + for (auto& abilityInfo : abilityInfoList) { if (abilityInfo.moduleName == moduleName && abilityInfo.name == abilityName) { scbAbilityInfo.abilityInfo_ = abilityInfo; scbAbilityInfo.sdkVersion_ = sdkVersion; @@ -6781,15 +6781,15 @@ WSError SceneSessionManager::GetAbilityInfo(const std::string& bundleName, const return WSError::WS_ERROR_INVALID_PARAM; } -WSError SceneSessionManager::GetAbilityInfosFromBundleInfo(std::vector& bundleInfos, +WSError SceneSessionManager::GetAbilityInfosFromBundleInfo(const std::vector& bundleInfos, std::vector& scbAbilityInfos) { if (bundleInfos.empty()) { WLOGFE("bundleInfos is empty"); return WSError::WS_ERROR_INVALID_PARAM; } - for (auto bundleInfo: bundleInfos) { - auto hapModulesList = bundleInfo.hapModuleInfos; + for (auto& bundleInfo : bundleInfos) { + auto& hapModulesList = bundleInfo.hapModuleInfos; auto sdkVersion = bundleInfo.targetVersion % 100; // %100 to get the real version if (hapModulesList.empty()) { WLOGFD("hapModulesList is empty"); @@ -6798,10 +6798,10 @@ WSError SceneSessionManager::GetAbilityInfosFromBundleInfo(std::vectorabilityInfos[0]; scbAbilityInfo.sdkVersion_ = sdkVersion; scbAbilityInfo.codePath_ = bundleInfo.applicationInfo.codePath; GetOrientationFromResourceManager(scbAbilityInfo.abilityInfo_); @@ -6809,9 +6809,9 @@ WSError SceneSessionManager::GetAbilityInfosFromBundleInfo(std::vector