diff --git a/frameworks/kits/ability/ability_runtime/include/ability_context.h b/frameworks/kits/ability/ability_runtime/include/ability_context.h index 5b4e07de892a0f9a1bb8ada38e8af6f5965d13c1..fa4baba3feef2330ad37fe287e53b081a13ca08d 100755 --- a/frameworks/kits/ability/ability_runtime/include/ability_context.h +++ b/frameworks/kits/ability/ability_runtime/include/ability_context.h @@ -162,13 +162,6 @@ public: virtual ErrCode TerminateSelf() = 0; - /** - * @brief Obtains token. - * - * @return Returns the token. - */ - virtual sptr GetAbilityToken() = 0; - /** * @brief Requests certain permissions from the system. * This method is called for permission request. This is an asynchronous method. When it is executed, diff --git a/frameworks/kits/ability/ability_runtime/include/ability_context_impl.h b/frameworks/kits/ability/ability_runtime/include/ability_context_impl.h index b35f3092c3b5275c309bbea6f6e76c42ef9bb66f..3fd7ba712e49c01448befffbb0f09531041a9630 100755 --- a/frameworks/kits/ability/ability_runtime/include/ability_context_impl.h +++ b/frameworks/kits/ability/ability_runtime/include/ability_context_impl.h @@ -68,11 +68,14 @@ public: void MinimizeAbility() override; ErrCode TerminateSelf() override; - sptr GetAbilityToken() override; + + sptr GetToken() override; + void RequestPermissionsFromUser(const std::vector &permissions, int requestCode, PermissionRequestTask &&task) override; void OnRequestPermissionsFromUserResult( int requestCode, const std::vector &permissions, const std::vector &grantResults) override; + ErrCode RestoreWindowStage(void* contentStorage) override; /** @@ -97,7 +100,7 @@ public: * * @param token The token represents ability. */ - inline void SetToken(const sptr &token) + void SetToken(const sptr &token) override { token_ = token; } diff --git a/frameworks/kits/ability/ability_runtime/src/ability_context_impl.cpp b/frameworks/kits/ability/ability_runtime/src/ability_context_impl.cpp index 1095c4478a704727fb474d387d40bf49c8b4a0e5..5199fdd7abc11b2f604a476741d73eaf51cc0fcb 100755 --- a/frameworks/kits/ability/ability_runtime/src/ability_context_impl.cpp +++ b/frameworks/kits/ability/ability_runtime/src/ability_context_impl.cpp @@ -276,7 +276,7 @@ ErrCode AbilityContextImpl::TerminateSelf() return err; } -sptr AbilityContextImpl::GetAbilityToken() +sptr AbilityContextImpl::GetToken() { return token_; } diff --git a/frameworks/kits/ability/native/include/data_ability_helper.h b/frameworks/kits/ability/native/include/data_ability_helper.h index d5b5c4c05a978e95f4f92441aa6db36fd34753ad..373531beb72ac84058119a89198251b4bfd064b5 100644 --- a/frameworks/kits/ability/native/include/data_ability_helper.h +++ b/frameworks/kits/ability/native/include/data_ability_helper.h @@ -21,6 +21,7 @@ #include #include "context.h" +#include "foundation/aafwk/standard/frameworks/kits/appkit/native/ability_runtime/context/context.h" #include "uri.h" using Uri = OHOS::Uri; @@ -61,6 +62,17 @@ public: static std::shared_ptr Creator( const std::shared_ptr &context, const std::shared_ptr &uri); + /** + * @brief Creates a DataAbilityHelper instance with the Uri specified based on the given Context. + * + * @param context Indicates the Context object on OHOS. + * @param uri Indicates the database table or disk file to operate. + * + * @return Returns the created DataAbilityHelper instance with a specified Uri. + */ + static std::shared_ptr Creator( + const std::shared_ptr &context, const std::shared_ptr &uri); + /** * @brief You can use this method to specify the Uri of the data to operate and set the binding relationship * between the ability using the Data template (Data ability for short) and the associated client process in @@ -76,6 +88,21 @@ public: static std::shared_ptr Creator( const std::shared_ptr &context, const std::shared_ptr &uri, const bool tryBind); + /** + * @brief You can use this method to specify the Uri of the data to operate and set the binding relationship + * between the ability using the Data template (Data ability for short) and the associated client process in + * a DataAbilityHelper instance. + * + * @param context Indicates the Context object on OHOS. + * @param uri Indicates the database table or disk file to operate. + * @param tryBind Specifies whether the exit of the corresponding Data ability process causes the exit of the + * client process. + * + * @return Returns the created DataAbilityHelper instance. + */ + static std::shared_ptr Creator(const std::shared_ptr &context, + const std::shared_ptr &uri, const bool tryBind); + /** * @brief Creates a DataAbilityHelper instance without specifying the Uri based. * @@ -280,6 +307,8 @@ public: private: DataAbilityHelper(const std::shared_ptr &context, const std::shared_ptr &uri, const sptr &dataAbilityProxy, bool tryBind = false); + DataAbilityHelper(const std::shared_ptr &context, const std::shared_ptr &uri, + const sptr &dataAbilityProxy, bool tryBind = false); DataAbilityHelper(const std::shared_ptr &context); DataAbilityHelper(const sptr &token, const std::shared_ptr &uri, const sptr &dataAbilityProxy); diff --git a/frameworks/kits/ability/native/src/data_ability_helper.cpp b/frameworks/kits/ability/native/src/data_ability_helper.cpp index 4d1d99882b857148c1b67a65a9eb664852e4183b..7b1bf5fc64695d39a62a211c15b99127db8b17b8 100644 --- a/frameworks/kits/ability/native/src/data_ability_helper.cpp +++ b/frameworks/kits/ability/native/src/data_ability_helper.cpp @@ -43,6 +43,17 @@ DataAbilityHelper::DataAbilityHelper(const std::shared_ptr &context, co APP_LOGI("DataAbilityHelper::DataAbilityHelper end"); } +DataAbilityHelper::DataAbilityHelper(const std::shared_ptr &context, + const std::shared_ptr &uri, const sptr &dataAbilityProxy, bool tryBind) +{ + APP_LOGI("DataAbilityHelper::DataAbilityHelper start"); + token_ = context->GetToken(); + uri_ = uri; + tryBind_ = tryBind; + dataAbilityProxy_ = dataAbilityProxy; + APP_LOGI("DataAbilityHelper::DataAbilityHelper end"); +} + DataAbilityHelper::DataAbilityHelper(const std::shared_ptr &context) { APP_LOGI("DataAbilityHelper::DataAbilityHelper only with context start"); @@ -143,6 +154,21 @@ std::shared_ptr DataAbilityHelper::Creator( return DataAbilityHelper::Creator(context, uri, false); } +/** + * @brief Creates a DataAbilityHelper instance with the Uri specified based on the given Context. + * + * @param context Indicates the Context object on OHOS. + * @param uri Indicates the database table or disk file to operate. + * + * @return Returns the created DataAbilityHelper instance with a specified Uri. + */ +std::shared_ptr DataAbilityHelper::Creator( + const std::shared_ptr &context, const std::shared_ptr &uri) +{ + APP_LOGI("DataAbilityHelper::Creator with context uri called."); + return DataAbilityHelper::Creator(context, uri, false); +} + /** * @brief You can use this method to specify the Uri of the data to operate and set the binding relationship * between the ability using the Data template (Data ability for short) and the associated client process in @@ -196,6 +222,59 @@ std::shared_ptr DataAbilityHelper::Creator( return std::shared_ptr(ptrDataAbilityHelper); } +/** + * @brief You can use this method to specify the Uri of the data to operate and set the binding relationship + * between the ability using the Data template (Data ability for short) and the associated client process in + * a DataAbilityHelper instance. + * + * @param context Indicates the Context object on OHOS. + * @param uri Indicates the database table or disk file to operate. + * @param tryBind Specifies whether the exit of the corresponding Data ability process causes the exit of the + * client process. + * + * @return Returns the created DataAbilityHelper instance. + */ +std::shared_ptr DataAbilityHelper::Creator( + const std::shared_ptr &context, const std::shared_ptr &uri, const bool tryBind) +{ + APP_LOGI("DataAbilityHelper::Creator with context uri tryBind called start."); + if (context == nullptr) { + APP_LOGE("DataAbilityHelper::Creator (context, uri, tryBind) failed, context == nullptr"); + return nullptr; + } + + if (uri == nullptr) { + APP_LOGE("DataAbilityHelper::Creator (context, uri, tryBind) failed, uri == nullptr"); + return nullptr; + } + + if (uri->GetScheme() != SchemeOhos) { + APP_LOGE("DataAbilityHelper::Creator (context, uri, tryBind) failed, the Scheme is not dataability, Scheme: " + "%{public}s", + uri->GetScheme().c_str()); + return nullptr; + } + + APP_LOGI("DataAbilityHelper::Creator before AcquireDataAbility."); + sptr dataAbilityProxy = + AbilityManagerClient::GetInstance()->AcquireDataAbility(*uri.get(), tryBind, context->GetToken()); + if (dataAbilityProxy == nullptr) { + APP_LOGE("DataAbilityHelper::Creator failed get dataAbilityProxy"); + return nullptr; + } + APP_LOGI("DataAbilityHelper::Creator after AcquireDataAbility."); + + DataAbilityHelper *ptrDataAbilityHelper = + new (std::nothrow) DataAbilityHelper(context, uri, dataAbilityProxy, tryBind); + if (ptrDataAbilityHelper == nullptr) { + APP_LOGE("DataAbilityHelper::Creator (context, uri, tryBind) failed, create DataAbilityHelper failed"); + return nullptr; + } + + APP_LOGI("DataAbilityHelper::Creator with context uri tryBind called end."); + return std::shared_ptr(ptrDataAbilityHelper); +} + /** * @brief Creates a DataAbilityHelper instance without specifying the Uri based. * diff --git a/frameworks/kits/appkit/BUILD.gn b/frameworks/kits/appkit/BUILD.gn index e6700a943478dc924c04d57fc4baf4141bc9acf2..03461d12943c0170dcf4cc64af6309c651f66a74 100644 --- a/frameworks/kits/appkit/BUILD.gn +++ b/frameworks/kits/appkit/BUILD.gn @@ -29,6 +29,7 @@ config("appkit_config") { "${aafwk_path}/frameworks/kits/ability/native/include", "${aafwk_path}/interfaces/innerkits/want/include/ohos/aafwk/content", "//third_party/json/include", + "//foundation/communication/ipc/interfaces/innerkits/ipc_core/include", ] } diff --git a/frameworks/kits/appkit/native/ability_delegator/src/ability_delegator.cpp b/frameworks/kits/appkit/native/ability_delegator/src/ability_delegator.cpp index d6df6d49117545f3c21e3e3f3d0a5e5ac8e7cc79..1d64a9fa3c8bd0d2b0eccc082864fcb31c8fa126 100644 --- a/frameworks/kits/appkit/native/ability_delegator/src/ability_delegator.cpp +++ b/frameworks/kits/appkit/native/ability_delegator/src/ability_delegator.cpp @@ -552,7 +552,7 @@ sptr AbilityDelegator::GetAbilityToken(const std::shared_ptrGetAbilityToken(); + return abilityContext->GetToken(); } std::optional AbilityDelegator::DoesPropertyExist(const sptr &token) diff --git a/frameworks/kits/appkit/native/ability_runtime/context/context.h b/frameworks/kits/appkit/native/ability_runtime/context/context.h index c2ae9a9b18a3f28bd11808a288f15de618f3d119..743fcecbf3cbdfcd781ae30a1d2381dd898b1557 100755 --- a/frameworks/kits/appkit/native/ability_runtime/context/context.h +++ b/frameworks/kits/appkit/native/ability_runtime/context/context.h @@ -22,8 +22,11 @@ #include "application_info.h" #include "bindable.h" #include "hap_module_info.h" +#include "foundation/communication/ipc/interfaces/innerkits/ipc_core/include/iremote_object.h" #include "resource_manager.h" +using IRemoteObject = OHOS::IRemoteObject; + namespace OHOS { namespace AbilityRuntime { class Context : public Bindable { @@ -137,6 +140,20 @@ public: */ virtual std::string GetDistributedFilesDir() = 0; + /** + * @brief Obtains token. + * + * @return Returns the token. + */ + virtual sptr GetToken() = 0; + + /** + * @brief Attachs ability's token. + * + * @param token The token represents ability. + */ + virtual void SetToken(const sptr &token) = 0; + /** * @brief Switch file area * diff --git a/frameworks/kits/appkit/native/ability_runtime/context/context_impl.cpp b/frameworks/kits/appkit/native/ability_runtime/context/context_impl.cpp index b3d253f3870c187d23e3148342aa65986ce86625..9d63b23a1e5c9ff1d200a16d4b983d7a03679d37 100644 --- a/frameworks/kits/appkit/native/ability_runtime/context/context_impl.cpp +++ b/frameworks/kits/appkit/native/ability_runtime/context/context_impl.cpp @@ -376,5 +376,19 @@ void ContextImpl::InitAppContext() std::lock_guard lock(Context::contextMutex_); Context::appContext_ = shared_from_this(); } + +void ContextImpl::SetToken(const sptr &token) +{ + if (token == nullptr) { + HILOG_DEBUG("ContextImpl::SetToken failed, application is nullptr"); + return; + } + token_ = token; +} + +sptr ContextImpl::GetToken() +{ + return token_; +} } // namespace AbilityRuntime } // namespace OHOS \ No newline at end of file diff --git a/frameworks/kits/appkit/native/ability_runtime/context/context_impl.h b/frameworks/kits/appkit/native/ability_runtime/context/context_impl.h index a6de5ba025b26f6606de409160b1c1e8cb7100c4..4ea39334fa01b9c4594367ac71de43b33deb5750 100644 --- a/frameworks/kits/appkit/native/ability_runtime/context/context_impl.h +++ b/frameworks/kits/appkit/native/ability_runtime/context/context_impl.h @@ -181,6 +181,24 @@ public: * @brief Set application context */ void InitAppContext(); + + /** + * @brief Set the token witch the app launched. + * + * @param token The token which the is launched by app. + */ + void SetToken(const sptr &token) override; + + /** + * @brief Get the token witch the app launched. + * + * @return token The token which the is launched by app. + */ + sptr GetToken() override; + +protected: + sptr token_; + private: static const int64_t CONTEXT_CREATE_BY_SYSTEM_APP; static const std::string CONTEXT_DATA_APP; diff --git a/frameworks/kits/appkit/native/ability_runtime/extension_context.cpp b/frameworks/kits/appkit/native/ability_runtime/extension_context.cpp index 1f939d4f4928006f7141de58b4b1b2b494ecced3..21343fae80daea56e77726819a3e463f95086c47 100644 --- a/frameworks/kits/appkit/native/ability_runtime/extension_context.cpp +++ b/frameworks/kits/appkit/native/ability_runtime/extension_context.cpp @@ -21,20 +21,6 @@ namespace OHOS { namespace AbilityRuntime { const size_t ExtensionContext::CONTEXT_TYPE_ID(std::hash {} ("ExtensionContext")); -void ExtensionContext::SetToken(const sptr &token) -{ - if (token == nullptr) { - HILOG_DEBUG("ExtensionContext::SetToken failed, application is nullptr"); - return; - } - token_ = token; -} - -sptr ExtensionContext::GetToken() const -{ - return token_; -} - void ExtensionContext::SetAbilityInfo(const std::shared_ptr &abilityInfo) { if (abilityInfo == nullptr) { diff --git a/frameworks/kits/appkit/native/ability_runtime/extension_context.h b/frameworks/kits/appkit/native/ability_runtime/extension_context.h index 8be6220924adfe0e3a665d03e707fc693607e02d..ebf812bd141be3784d918ffa1d32676300347bc8 100644 --- a/frameworks/kits/appkit/native/ability_runtime/extension_context.h +++ b/frameworks/kits/appkit/native/ability_runtime/extension_context.h @@ -18,7 +18,6 @@ #include "ability_info.h" #include "context_impl.h" -#include "iremote_object.h" namespace OHOS { namespace AbilityRuntime { @@ -31,20 +30,6 @@ public: ExtensionContext() = default; virtual ~ExtensionContext() = default; - /** - * @brief Set the token witch the app launched. - * - * @param token The token which the is launched by app. - */ - void SetToken(const sptr &token); - - /** - * @brief Get the token witch the app launched. - * - * @return token The token which the is launched by app. - */ - sptr GetToken() const; - /** * @brief Obtains information about the current ability. * The returned information includes the class name, bundle name, and other information about the current ability. @@ -68,7 +53,6 @@ protected: return contextTypeId == CONTEXT_TYPE_ID || Context::IsContext(contextTypeId); } - sptr token_; private: std::shared_ptr abilityInfo_; }; diff --git a/interfaces/innerkits/napi_base_context/src/napi_base_context.cpp b/interfaces/innerkits/napi_base_context/src/napi_base_context.cpp index e386b3c6eefaf5594ca99c3ed189189d7766d0fe..47b3f9d34ff8109d3b1d8fdf795e556158444235 100644 --- a/interfaces/innerkits/napi_base_context/src/napi_base_context.cpp +++ b/interfaces/innerkits/napi_base_context/src/napi_base_context.cpp @@ -25,33 +25,6 @@ namespace OHOS { namespace AbilityRuntime { -namespace { -napi_status GetStageModeContextClassObject(napi_env env, napi_value& classObject) -{ - static thread_local napi_ref contextClassObjectRef = {0}; - - napi_status ret = napi_get_reference_value(env, contextClassObjectRef, &classObject); - if (ret == napi_ok) { - return napi_ok; - } - - napi_value global; - OHOS_CALL_NAPI_RETURN(napi_get_global(env, &global)); - - napi_value requireNapi; - OHOS_CALL_NAPI_RETURN(napi_get_named_property(env, global, "requireNapi", &requireNapi)); - - napi_value className; - OHOS_CALL_NAPI_RETURN(napi_create_string_utf8(env, "application.Context", NAPI_AUTO_LENGTH, &className)); - - OHOS_CALL_NAPI_RETURN(napi_call_function(env, global, requireNapi, 1, &className, &classObject)); - - // Ignore return value - napi_create_reference(env, classObject, 1, &contextClassObjectRef); - return napi_ok; -} -} // namespace - napi_value* GetFAModeContextClassObject() { static thread_local napi_value contextClassObject = {0}; @@ -66,23 +39,6 @@ napi_status IsStageContext(napi_env env, napi_value object, bool& stageMode) bool value = false; OHOS_CALL_NAPI_RETURN(napi_get_value_bool(env, boolValue, &value)); - napi_value classObject; - if (value) { - OHOS_CALL_NAPI_RETURN(GetStageModeContextClassObject(env, classObject)); - } else { - napi_value* clsObjPtr = GetFAModeContextClassObject(); - if (clsObjPtr == nullptr) { - return napi_generic_failure; - } - classObject = *clsObjPtr; - } - - bool result = false; - OHOS_CALL_NAPI_RETURN(napi_instanceof(env, object, classObject, &result)); - if (!result) { - return napi_generic_failure; - } - stageMode = value; return napi_ok; } diff --git a/interfaces/kits/napi/aafwk/featureAbility/BUILD.gn b/interfaces/kits/napi/aafwk/featureAbility/BUILD.gn index 9c89997fc34495f54a619db5469ce74116e9cbaa..aba4e97bab37c9690808522133e976bbc3157e82 100644 --- a/interfaces/kits/napi/aafwk/featureAbility/BUILD.gn +++ b/interfaces/kits/napi/aafwk/featureAbility/BUILD.gn @@ -56,6 +56,7 @@ ohos_shared_library("featureability") { external_deps = [ "ability_runtime:ability_manager", "ability_runtime:app_manager", + "ability_runtime:napi_base_context", "ability_runtime:want", "bundle_framework:appexecfwk_base", "bundle_framework:appexecfwk_core", diff --git a/interfaces/kits/napi/aafwk/featureAbility/feature_ability.cpp b/interfaces/kits/napi/aafwk/featureAbility/feature_ability.cpp index 2223343c1a152cb59c07c94517dfd9efa7d5761a..2c4f15aafefcc5a29ca60cffe3ab83b9c6afc440 100644 --- a/interfaces/kits/napi/aafwk/featureAbility/feature_ability.cpp +++ b/interfaces/kits/napi/aafwk/featureAbility/feature_ability.cpp @@ -1281,7 +1281,7 @@ void GetDataAbilityHelperAsyncCompleteCB(napi_env env, napi_status status, void NAPI_CALL_RETURN_VOID(env, napi_get_reference_value(env, dataAbilityHelperCB->uri, &uri)); NAPI_CALL_RETURN_VOID(env, napi_get_reference_value(env, dataAbilityHelperCB->cbBase.cbInfo.callback, &callback)); NAPI_CALL_RETURN_VOID( - env, napi_new_instance(env, *(GetGlobalDataAbilityHelper()), 1, &uri, &dataAbilityHelperCB->result)); + env, napi_new_instance(env, GetGlobalDataAbilityHelper(env), 1, &uri, &dataAbilityHelperCB->result)); if (IsTypeForNapiValue(env, dataAbilityHelperCB->result, napi_object)) { result[PARAM1] = dataAbilityHelperCB->result; } else { @@ -1308,7 +1308,7 @@ void GetDataAbilityHelperPromiseCompleteCB(napi_env env, napi_status status, voi napi_value result = nullptr; NAPI_CALL_RETURN_VOID(env, napi_get_reference_value(env, dataAbilityHelperCB->uri, &uri)); NAPI_CALL_RETURN_VOID( - env, napi_new_instance(env, *(GetGlobalDataAbilityHelper()), 1, &uri, &dataAbilityHelperCB->result)); + env, napi_new_instance(env, GetGlobalDataAbilityHelper(env), 1, &uri, &dataAbilityHelperCB->result)); if (IsTypeForNapiValue(env, dataAbilityHelperCB->result, napi_object)) { result = dataAbilityHelperCB->result; NAPI_CALL_RETURN_VOID(env, napi_resolve_deferred(env, dataAbilityHelperCB->cbBase.deferred, result)); diff --git a/interfaces/kits/napi/aafwk/featureAbility/napi_data_ability_helper.cpp b/interfaces/kits/napi/aafwk/featureAbility/napi_data_ability_helper.cpp index 9de7d8016eb84eba9c6484bdc6394e2428d999df..3e6eee3d2647b240b6ada64f5c56f2f37db3f25d 100644 --- a/interfaces/kits/napi/aafwk/featureAbility/napi_data_ability_helper.cpp +++ b/interfaces/kits/napi/aafwk/featureAbility/napi_data_ability_helper.cpp @@ -27,6 +27,7 @@ #include "data_ability_result.h" #include "hilog_wrapper.h" #include "message_parcel.h" +#include "napi_base_context.h" #include "napi_data_ability_operation.h" #include "napi_data_ability_predicates.h" #include "napi_rdb_predicates.h" @@ -68,6 +69,8 @@ napi_value DataAbilityHelperInit(napi_env env, napi_value exports) DECLARE_NAPI_FUNCTION("release", NAPI_Release), DECLARE_NAPI_FUNCTION("executeBatch", NAPI_ExecuteBatch), }; + + napi_value constructor; NAPI_CALL(env, napi_define_class(env, "dataAbilityHelper", @@ -76,7 +79,8 @@ napi_value DataAbilityHelperInit(napi_env env, napi_value exports) nullptr, sizeof(properties) / sizeof(*properties), properties, - GetGlobalDataAbilityHelper())); + &constructor)); + NAPI_CALL(env, SaveGlobalDataAbilityHelper(env, constructor)); g_dataAbilityHelperList.clear(); return exports; } @@ -84,27 +88,49 @@ napi_value DataAbilityHelperInit(napi_env env, napi_value exports) napi_value DataAbilityHelperConstructor(napi_env env, napi_callback_info info) { HILOG_INFO("%{public}s,called", __func__); - size_t argc = 1; - napi_value argv[1] = {nullptr}; + size_t argc = ARGS_TWO; + napi_value argv[ARGS_TWO] = {nullptr}; napi_value thisVar = nullptr; auto& dataAbilityHelperStatus = GetDataAbilityHelperStatus(); NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr)); NAPI_ASSERT(env, argc > 0, "Wrong number of arguments"); - std::string strUri = NapiValueToStringUtf8(env, argv[0]); - - napi_value global = nullptr; - NAPI_CALL(env, napi_get_global(env, &global)); - napi_value abilityObj = nullptr; - NAPI_CALL(env, napi_get_named_property(env, global, "ability", &abilityObj)); + std::shared_ptr dataAbilityHelper = nullptr; + bool stageMode = false; + napi_status status = OHOS::AbilityRuntime::IsStageContext(env, argv[0], stageMode); + if (status != napi_ok) { + HILOG_INFO("argv[0] is not a context"); + auto ability = OHOS::AbilityRuntime::GetCurrentAbility(env); + if (ability == nullptr) { + HILOG_ERROR("Failed to get native context instance"); + return nullptr; + } + std::string strUri = NapiValueToStringUtf8(env, argv[0]); + HILOG_INFO("FA Model: ability = %{public}p strUri = %{public}s", ability, strUri.c_str()); + dataAbilityHelper = DataAbilityHelper::Creator(ability->GetContext(), std::make_shared(strUri)); + } else { + HILOG_INFO("argv[0] is a context"); + if (stageMode) { + auto context = OHOS::AbilityRuntime::GetStageModeContext(env, argv[0]); + if (context == nullptr) { + HILOG_ERROR("Failed to get native context instance"); + return nullptr; + } + std::string strUri = NapiValueToStringUtf8(env, argv[PARAM1]); + HILOG_INFO("Stage Model: context = %{public}p strUri = %{public}s", context.get(), strUri.c_str()); + dataAbilityHelper = DataAbilityHelper::Creator(context, std::make_shared(strUri)); + } else { + auto ability = OHOS::AbilityRuntime::GetCurrentAbility(env); + if (ability == nullptr) { + HILOG_ERROR("Failed to get native context instance"); + return nullptr; + } + std::string strUri = NapiValueToStringUtf8(env, argv[PARAM1]); + HILOG_INFO("FA Model: ability = %{public}p strUri = %{public}s", ability, strUri.c_str()); + dataAbilityHelper = DataAbilityHelper::Creator(ability->GetContext(), std::make_shared(strUri)); + } + } - Ability *ability = nullptr; - NAPI_CALL(env, napi_get_value_external(env, abilityObj, (void **)&ability)); - - HILOG_INFO("ability = %{public}p strUri = %{public}s", ability, strUri.c_str()); - HILOG_INFO("dataAbilityHelperList.size = %{public}zu", g_dataAbilityHelperList.size()); - std::shared_ptr dataAbilityHelper = - DataAbilityHelper::Creator(ability->GetContext(), std::make_shared(strUri)); if (dataAbilityHelper == nullptr) { HILOG_INFO("%{public}s, dataAbilityHelper is nullptr", __func__); dataAbilityHelperStatus = false; diff --git a/interfaces/kits/napi/aafwk/inner/napi_common/napi_common_ability.cpp b/interfaces/kits/napi/aafwk/inner/napi_common/napi_common_ability.cpp index 13da15752555ca0e4e9a484864219297266a38c7..717535d072f4baba6c93998871b2e8ceb1c8e4fe 100644 --- a/interfaces/kits/napi/aafwk/inner/napi_common/napi_common_ability.cpp +++ b/interfaces/kits/napi/aafwk/inner/napi_common/napi_common_ability.cpp @@ -27,8 +27,9 @@ namespace OHOS { namespace AppExecFwk { -napi_value thread_local g_dataAbilityHelper; -bool thread_local g_dataAbilityHelperStatus = false; +napi_ref thread_local g_dataAbilityHelper; +bool thread_local g_dataAbilityHelperStatus = false; + using NAPICreateJsRemoteObject = napi_value (*)(napi_env env, const sptr target); napi_value *GetGlobalClassContext(void) @@ -36,11 +37,18 @@ napi_value *GetGlobalClassContext(void) return AbilityRuntime::GetFAModeContextClassObject(); } -napi_value *GetGlobalDataAbilityHelper(void) +napi_status SaveGlobalDataAbilityHelper(napi_env env, napi_value constructor) { - return &g_dataAbilityHelper; + return napi_create_reference(env, constructor, 1, &g_dataAbilityHelper); } +napi_value GetGlobalDataAbilityHelper(napi_env env) +{ + napi_value constructor; + NAPI_CALL(env, napi_get_reference_value(env, g_dataAbilityHelper, &constructor)); + return constructor; +} + bool& GetDataAbilityHelperStatus() { return g_dataAbilityHelperStatus; @@ -3383,23 +3391,8 @@ napi_value NAPI_AcquireDataAbilityHelperCommon(napi_env env, napi_callback_info return WrapVoidToJS(env); } - napi_value global = nullptr; - napi_get_global(env, &global); - napi_value abilityObj = nullptr; - napi_get_named_property(env, global, "ability", &abilityObj); - Ability *ability = nullptr; - napi_get_value_external(env, abilityObj, (void **)&ability); - if (ability == nullptr) { - HILOG_ERROR("%{public}s, ability == nullptr", __func__); - if (dataAbilityHelperCB != nullptr) { - delete dataAbilityHelperCB; - dataAbilityHelperCB = nullptr; - } - return WrapVoidToJS(env); - } - dataAbilityHelperCB->cbBase.cbInfo.env = env; - dataAbilityHelperCB->cbBase.ability = ability; + dataAbilityHelperCB->cbBase.ability = nullptr; // temporary value assignment dataAbilityHelperCB->cbBase.errCode = NAPI_ERR_NO_ERROR; dataAbilityHelperCB->cbBase.abilityType = abilityType; napi_value ret = AcquireDataAbilityHelperWrap(env, info, dataAbilityHelperCB); @@ -3431,30 +3424,49 @@ napi_value AcquireDataAbilityHelperWrap(napi_env env, napi_callback_info info, D return nullptr; } - size_t requireArgc = ARGS_ONE; - size_t argc = ARGS_ONE; - napi_value args[ARGS_ONE] = {nullptr}; + size_t requireArgc = ARGS_TWO; + size_t argc = ARGS_TWO; + napi_value args[ARGS_TWO] = {nullptr}; NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, nullptr, nullptr)); if (argc > requireArgc) { HILOG_ERROR("%{public}s, Wrong argument count.", __func__); return nullptr; } + size_t uriIndex = PARAM0; + bool stageMode = false; + napi_status status = OHOS::AbilityRuntime::IsStageContext(env, args[0], stageMode); + if (status != napi_ok) { + HILOG_INFO("argv[0] is not a context, FA Model"); + } else { + uriIndex = PARAM1; + HILOG_INFO("argv[0] is a context, Stage Model: %{public}d", stageMode); + } + + if (!stageMode) { + auto ability = OHOS::AbilityRuntime::GetCurrentAbility(env); + if (ability == nullptr) { + HILOG_ERROR("Failed to get native context instance"); + return nullptr; + } + dataAbilityHelperCB->cbBase.ability = ability; + + if (!CheckAbilityType(&dataAbilityHelperCB->cbBase)) { + dataAbilityHelperCB->cbBase.errCode = NAPI_ERR_ABILITY_TYPE_INVALID; + HILOG_ERROR("%{public}s ability type invalid.", __func__); + return nullptr; + } + } + napi_valuetype valuetype = napi_undefined; - NAPI_CALL(env, napi_typeof(env, args[PARAM0], &valuetype)); + NAPI_CALL(env, napi_typeof(env, args[uriIndex], &valuetype)); if (valuetype != napi_string) { HILOG_ERROR("%{public}s, Wrong argument type.", __func__); return nullptr; } - if (!CheckAbilityType(&dataAbilityHelperCB->cbBase)) { - dataAbilityHelperCB->cbBase.errCode = NAPI_ERR_ABILITY_TYPE_INVALID; - HILOG_ERROR("%{public}s ability type invalid.", __func__); - return nullptr; - } - napi_value result = nullptr; - NAPI_CALL(env, napi_new_instance(env, *(GetGlobalDataAbilityHelper()), 1, &args[PARAM0], &result)); + NAPI_CALL(env, napi_new_instance(env, GetGlobalDataAbilityHelper(env), uriIndex + 1, &args[PARAM0], &result)); if (!IsTypeForNapiValue(env, result, napi_object)) { HILOG_ERROR("%{public}s, IsTypeForNapiValue isn`t object", __func__); diff --git a/interfaces/kits/napi/aafwk/inner/napi_common/napi_common_ability.h b/interfaces/kits/napi/aafwk/inner/napi_common/napi_common_ability.h index 963241e98ad7911f462aa19cb9ed7c881eb94dbb..293bf2024146ca05df5f83b876d0294ebecf9d18 100644 --- a/interfaces/kits/napi/aafwk/inner/napi_common/napi_common_ability.h +++ b/interfaces/kits/napi/aafwk/inner/napi_common/napi_common_ability.h @@ -25,8 +25,11 @@ namespace AppExecFwk { const std::int32_t STR_MAX_SIZE = 128; napi_value *GetGlobalClassContext(void); -napi_value *GetGlobalDataAbilityHelper(void); + +napi_status SaveGlobalDataAbilityHelper(napi_env env, napi_value constructor); +napi_value GetGlobalDataAbilityHelper(napi_env env); bool& GetDataAbilityHelperStatus(); + void SaveAppInfo(AppInfo_ &appInfo, const ApplicationInfo &appInfoOrg); napi_value WrapAppInfo(napi_env env, const AppInfo_ &appInfo); diff --git a/interfaces/kits/napi/aafwk/particleAbility/BUILD.gn b/interfaces/kits/napi/aafwk/particleAbility/BUILD.gn index f84c7f39300841b82ba3ce7952abe4846a19a675..e740320e542e53fa88349319d74f9c82bf7154fe 100644 --- a/interfaces/kits/napi/aafwk/particleAbility/BUILD.gn +++ b/interfaces/kits/napi/aafwk/particleAbility/BUILD.gn @@ -55,6 +55,7 @@ ohos_shared_library("particleability") { external_deps = [ "ability_runtime:ability_manager", "ability_runtime:app_manager", + "ability_runtime:napi_base_context", "ability_runtime:want", "bundle_framework:appexecfwk_base", "bundle_framework:appexecfwk_core",