1 /*
2 * Copyright (c) 2025 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "ets_extension_context.h"
17
18 #include "ani_common_configuration.h"
19 #include "common_fun_ani.h"
20 #include "hilog_tag_wrapper.h"
21
22 namespace OHOS {
23 namespace AbilityRuntime {
24
SetExtensionAbilityInfo(ani_env * aniEnv,ani_class contextClass,ani_object contextObj,std::shared_ptr<Context> context,std::shared_ptr<AppExecFwk::AbilityInfo> abilityInfo)25 bool SetExtensionAbilityInfo(ani_env *aniEnv, ani_class contextClass, ani_object contextObj,
26 std::shared_ptr<Context> context, std::shared_ptr<AppExecFwk::AbilityInfo> abilityInfo)
27 {
28 if (aniEnv == nullptr || context == nullptr || abilityInfo == nullptr) {
29 TAG_LOGE(AAFwkTag::CONTEXT, "aniEnv or context or abilityInfo is nullptr");
30 return false;
31 }
32 auto hapModuleInfo = context->GetHapModuleInfo();
33 if (hapModuleInfo == nullptr) {
34 TAG_LOGE(AAFwkTag::CONTEXT, "null hapModuleInfo");
35 return false;
36 }
37 ani_status status = ANI_OK;
38 auto isExist = [&abilityInfo](const AppExecFwk::ExtensionAbilityInfo &info) {
39 TAG_LOGD(AAFwkTag::CONTEXT, "%{public}s, %{public}s", info.bundleName.c_str(), info.name.c_str());
40 return info.bundleName == abilityInfo->bundleName && info.name == abilityInfo->name;
41 };
42 ani_field extensionAbilityInfoField = nullptr;
43 status = aniEnv->Class_FindField(contextClass, "extensionAbilityInfo", &extensionAbilityInfoField);
44 if (status != ANI_OK) {
45 TAG_LOGE(AAFwkTag::CONTEXT, "status: %{public}d", status);
46 return false;
47 }
48 auto infoIter =
49 std::find_if(hapModuleInfo->extensionInfos.begin(), hapModuleInfo->extensionInfos.end(), isExist);
50 if (infoIter == hapModuleInfo->extensionInfos.end()) {
51 TAG_LOGE(AAFwkTag::CONTEXT, "set extensionAbilityInfo fail");
52 return false;
53 }
54 ani_object extAbilityInfoObj = AppExecFwk::CommonFunAni::ConvertExtensionInfo(aniEnv, *infoIter);
55 status = aniEnv->Object_SetField_Ref(
56 contextObj, extensionAbilityInfoField, reinterpret_cast<ani_ref>(extAbilityInfoObj));
57 if (status != ANI_OK) {
58 TAG_LOGE(AAFwkTag::CONTEXT, "status: %{public}d", status);
59 return false;
60 }
61 return true;
62 }
63
SetConfiguration(ani_env * env,ani_class cls,ani_object contextObj,const std::shared_ptr<OHOS::AbilityRuntime::Context> & context)64 bool SetConfiguration(
65 ani_env *env, ani_class cls, ani_object contextObj, const std::shared_ptr<OHOS::AbilityRuntime::Context> &context)
66 {
67 if (env == nullptr || context == nullptr) {
68 TAG_LOGE(AAFwkTag::CONTEXT, "aniEnv or context is nullptr");
69 return false;
70 }
71
72 ani_field field = nullptr;
73 auto configuration = context->GetConfiguration();
74 ani_ref configurationRef = OHOS::AppExecFwk::WrapConfiguration(env, *configuration);
75
76 ani_status status = env->Class_FindField(cls, "config", &field);
77 if (status != ANI_OK) {
78 TAG_LOGE(AAFwkTag::CONTEXT, "status: %{public}d", status);
79 return false;
80 }
81
82 status = env->Object_SetField_Ref(contextObj, field, configurationRef);
83 if (status != ANI_OK) {
84 TAG_LOGE(AAFwkTag::CONTEXT, "status: %{public}d", status);
85 return false;
86 }
87 return true;
88 }
89
CreateEtsExtensionContext(ani_env * aniEnv,ani_class contextClass,ani_object & contextObj,std::shared_ptr<ExtensionContext> context,std::shared_ptr<AppExecFwk::AbilityInfo> abilityInfo)90 void CreateEtsExtensionContext(ani_env *aniEnv, ani_class contextClass, ani_object &contextObj,
91 std::shared_ptr<ExtensionContext> context, std::shared_ptr<AppExecFwk::AbilityInfo> abilityInfo)
92 {
93 TAG_LOGD(AAFwkTag::CONTEXT, "CreateEtsExtensionContext Call");
94 if (aniEnv == nullptr || context == nullptr) {
95 TAG_LOGE(AAFwkTag::CONTEXT, "aniEnv or context is nullptr");
96 return;
97 }
98
99 if (!SetExtensionAbilityInfo(aniEnv, contextClass, contextObj, context, abilityInfo)) {
100 TAG_LOGE(AAFwkTag::CONTEXT, "SetExtensionAbilityInfo fail");
101 return;
102 }
103
104 if (!SetConfiguration(aniEnv, contextClass, contextObj, context)) {
105 TAG_LOGE(AAFwkTag::CONTEXT, "SetConfiguration fail");
106 return;
107 }
108 }
109 } // namespace AbilityRuntime
110 } // namespace OHOS