diff --git a/frameworks/kits/ability/ability_runtime/include/ability_context.h b/frameworks/kits/ability/ability_runtime/include/ability_context.h index 86592c74abc94c1f4a98df23e025ee5c776f8558..4d6b157fba321b299f68fd5e55cee4dbfc15cba4 100644 --- a/frameworks/kits/ability/ability_runtime/include/ability_context.h +++ b/frameworks/kits/ability/ability_runtime/include/ability_context.h @@ -108,13 +108,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 cbf3e44ade40ea76eeaa0615a61d9f3f19a3d334..dfd261fbce0883e6a25401a6c0d9296bda05aecd 100644 --- a/frameworks/kits/ability/ability_runtime/include/ability_context_impl.h +++ b/frameworks/kits/ability/ability_runtime/include/ability_context_impl.h @@ -57,7 +57,7 @@ public: void MinimizeAbility() override; ErrCode TerminateSelf() override; - sptr GetAbilityToken() override; + sptr GetToken() override; void RequestPermissionsFromUser(const std::vector &permissions, int requestCode) override; ErrCode RestoreWindowStage(void* contentStorage) override; @@ -83,7 +83,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 6e812396a4e185aa5e036cb9b75b5916222a9f7b..ae8b095823a634b80d5b287092e5833e61506ca2 100644 --- a/frameworks/kits/ability/ability_runtime/src/ability_context_impl.cpp +++ b/frameworks/kits/ability/ability_runtime/src/ability_context_impl.cpp @@ -209,7 +209,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..f48d6bb775d6db861a31af4ae3f42064f47c8c3d 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 DataAbilityHelper::Creator( + const std::shared_ptr &context, const std::shared_ptr &uri, const bool tryBind); + /** * @brief Creates a DataAbilityHelper instance without specifying the Uri based. * diff --git a/frameworks/kits/ability/native/src/data_ability_helper.cpp b/frameworks/kits/ability/native/src/data_ability_helper.cpp index 4d1d99882b857148c1b67a65a9eb664852e4183b..591dff09231ed77431b78678284c1012f1b7fb9c 100644 --- a/frameworks/kits/ability/native/src/data_ability_helper.cpp +++ b/frameworks/kits/ability/native/src/data_ability_helper.cpp @@ -43,6 +43,18 @@ 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(); + //context_ = std::weak_ptr(context); + 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 +155,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 +223,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 e6e6681578232aa887dc331817227ae94172a94c..408404ed0e81f42d70c83afab3fe09255336473d 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_runtime/context/context.h b/frameworks/kits/appkit/native/ability_runtime/context/context.h index c2ae9a9b18a3f28bd11808a288f15de618f3d119..e4809ec037a8c06b42d34eb4231b58cae2d7ad5a 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 "iremote_object.h" #include "resource_manager.h" +using IRemoteObject = OHOS::IRemoteObject; + namespace OHOS { namespace AbilityRuntime { class Context : public Bindable { @@ -144,6 +147,20 @@ public: */ virtual void SwitchArea(int mode) = 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 Getting derived class * 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 9654f279e157c315f2fac8ce295636949faca9ff..a5c161460c1650e5178cb7303fbdbb4a539ac459 100755 --- a/frameworks/kits/appkit/native/ability_runtime/context/context_impl.cpp +++ b/frameworks/kits/appkit/native/ability_runtime/context/context_impl.cpp @@ -351,5 +351,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() const +{ + 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 4658e7fb5a2c5eb181b09623f6771e9ca3eb9217..e6398fb1616b7b2ca582986d0e65382b3a1e998a 100755 --- 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,21 @@ 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); + + /** + * @brief Get the token witch the app launched. + * + * @return token The token which the is launched by app. + */ + sptr GetToken() const; + private: static const int64_t CONTEXT_CREATE_BY_SYSTEM_APP; static const std::string CONTEXT_DATA_APP; @@ -210,6 +225,7 @@ private: std::string GetCurrentAccountId() const; void SetFlags(int64_t flags); + sptr token_; std::shared_ptr applicationInfo_ = nullptr; std::shared_ptr parentContext_ = nullptr; std::shared_ptr resourceManager_ = nullptr; diff --git a/frameworks/kits/appkit/native/ability_runtime/extension_context.cpp b/frameworks/kits/appkit/native/ability_runtime/extension_context.cpp index d64192e9d85a942da4e9318703bc97285480ec3f..c1d6f111464b1ffed9ced469695a4f40c0179102 100644 --- a/frameworks/kits/appkit/native/ability_runtime/extension_context.cpp +++ b/frameworks/kits/appkit/native/ability_runtime/extension_context.cpp @@ -20,19 +20,5 @@ 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_; -} } // namespace AbilityRuntime } // namespace OHOS \ No newline at end of file diff --git a/frameworks/kits/appkit/native/ability_runtime/extension_context.h b/frameworks/kits/appkit/native/ability_runtime/extension_context.h index 085db979931321a6409e1708f621c36b648d23fe..de6d56c36bdb2d1a019100d7d532e711b5bf1c38 100644 --- a/frameworks/kits/appkit/native/ability_runtime/extension_context.h +++ b/frameworks/kits/appkit/native/ability_runtime/extension_context.h @@ -17,7 +17,6 @@ #define EXTENSION_CONTEXT_H #include "context_impl.h" -#include "iremote_object.h" namespace OHOS { namespace AbilityRuntime { @@ -30,20 +29,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; - using SelfType = ExtensionContext; static const size_t CONTEXT_TYPE_ID; @@ -53,7 +38,6 @@ protected: return contextTypeId == CONTEXT_TYPE_ID || Context::IsContext(contextTypeId); } - sptr token_; private: }; } // namespace AbilityRuntime 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 8e57a49036a5a8bd97b156629de7b68c58a14146..8b92b907b820e7b0552dbd7781fdc4ac1ec59f2a 100644 --- a/interfaces/kits/napi/aafwk/featureAbility/napi_data_ability_helper.cpp +++ b/interfaces/kits/napi/aafwk/featureAbility/napi_data_ability_helper.cpp @@ -84,30 +84,46 @@ 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 = 2; + napi_value argv[2] = {nullptr}; napi_value thisVar = nullptr; 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)); + auto IsStageModel = [=](Ability* &ability) -> bool { + napi_value global = nullptr; + if (napi_get_global(env, &global) != ERR_OK) { + return true; + } + napi_value abilityObj = nullptr; + if (napi_get_named_property(env, global, "ability", &abilityObj) != ERR_OK) { + return true; + } + if (napi_get_value_external(env, abilityObj, (void **)&ability) != ERR_OK || ability == nullptr) { + return true; + } + return false; + }; Ability *ability = nullptr; - NAPI_CALL(env, napi_get_value_external(env, abilityObj, (void **)&ability)); + bool stageModel = IsStageModel(ability); + std::shared_ptr dataAbilityHelper = nullptr; + if (stageModel) { + OHOS::AbilityRuntime::Context context = static_cast(argv[0]); + std::string strUri = NapiValueToStringUtf8(env, argv[1]); + HILOG_INFO("Stage Model: context = %{public}p strUri = %{public}s", strUri.c_str()); + dataAbilityHelper = DataAbilityHelper::Creator(&context, std::make_shared(strUri)); + } else { + 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)); + } - 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__); return nullptr; } + HILOG_INFO("dataAbilityHelper = %{public}p", dataAbilityHelper.get()); g_dataAbilityHelperList.emplace_back(dataAbilityHelper); HILOG_INFO("dataAbilityHelperList.size = %{public}zu", g_dataAbilityHelperList.size());