• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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