• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023-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 "js_ability_auto_startup_manager_utils.h"
17 
18 #include "global_constant.h"
19 #include "hilog_tag_wrapper.h"
20 #include "napi_common_util.h"
21 
22 namespace OHOS {
23 namespace AbilityRuntime {
UnwrapAutoStartupInfo(napi_env env,napi_value param,AutoStartupInfo & info)24 bool UnwrapAutoStartupInfo(napi_env env, napi_value param, AutoStartupInfo &info)
25 {
26     if (!IsNormalObject(env, param)) {
27         TAG_LOGE(AAFwkTag::AUTO_STARTUP, "invalid param");
28         return false;
29     }
30 
31     if (!AppExecFwk::UnwrapStringByPropertyName(env, param, "bundleName", info.bundleName)) {
32         TAG_LOGE(AAFwkTag::AUTO_STARTUP, "convert bundleName failed");
33         return false;
34     }
35 
36     if (!AppExecFwk::UnwrapStringByPropertyName(env, param, "abilityName", info.abilityName)) {
37         TAG_LOGE(AAFwkTag::AUTO_STARTUP, "convert abilityName failed");
38         return false;
39     }
40 
41     if (AppExecFwk::IsExistsByPropertyName(env, param, "appCloneIndex")) {
42         if (!AppExecFwk::UnwrapInt32ByPropertyName(env, param, "appCloneIndex", info.appCloneIndex)) {
43             TAG_LOGE(AAFwkTag::AUTO_STARTUP, "convert appCloneIndex failed");
44             return false;
45         }
46     }
47 
48     AppExecFwk::UnwrapStringByPropertyName(env, param, "moduleName", info.moduleName);
49     return true;
50 }
51 
IsNormalObject(napi_env env,napi_value value)52 bool IsNormalObject(napi_env env, napi_value value)
53 {
54     if (value == nullptr) {
55         TAG_LOGE(AAFwkTag::AUTO_STARTUP, "null value");
56         return false;
57     }
58     napi_valuetype type;
59     napi_typeof(env, value, &type);
60     if (type == napi_undefined || type == napi_null) {
61         TAG_LOGE(AAFwkTag::AUTO_STARTUP, "invalid type");
62         return false;
63     }
64     if (type != napi_object) {
65         TAG_LOGE(AAFwkTag::AUTO_STARTUP, "invalid type");
66         return false;
67     }
68     return true;
69 }
70 
CreateJsAutoStartupInfoArray(napi_env env,const std::vector<AutoStartupInfo> & infoList)71 napi_value CreateJsAutoStartupInfoArray(napi_env env, const std::vector<AutoStartupInfo> &infoList)
72 {
73     napi_value arrayObj = nullptr;
74     napi_create_array(env, &arrayObj);
75     for (size_t i = 0; i < infoList.size(); ++i) {
76         auto object = CreateJsAutoStartupInfo(env, infoList.at(i));
77         if (object == nullptr) {
78             TAG_LOGE(AAFwkTag::AUTO_STARTUP, "null obj");
79             return nullptr;
80         }
81 
82         if (napi_set_element(env, arrayObj, i, object) != napi_ok) {
83             TAG_LOGE(AAFwkTag::AUTO_STARTUP, "insert object failed");
84             return nullptr;
85         }
86     }
87 
88     return arrayObj;
89 }
90 
AddBasicProperties(napi_env env,napi_value object,const AutoStartupInfo & info)91 bool AddBasicProperties(napi_env env, napi_value object, const AutoStartupInfo &info)
92 {
93     napi_value bundleName = AppExecFwk::WrapStringToJS(env, info.bundleName);
94     if (bundleName == nullptr) {
95         TAG_LOGE(AAFwkTag::AUTO_STARTUP, "null bundleName");
96         return false;
97     }
98 
99     napi_value abilityName = AppExecFwk::WrapStringToJS(env, info.abilityName);
100     if (abilityName == nullptr) {
101         TAG_LOGE(AAFwkTag::AUTO_STARTUP, "null abilityName");
102         return false;
103     }
104 
105     napi_value moduleName = AppExecFwk::WrapStringToJS(env, info.moduleName);
106     if (moduleName == nullptr) {
107         TAG_LOGE(AAFwkTag::AUTO_STARTUP, "null moduleName");
108         return false;
109     }
110 
111     napi_value abilityTypeName = AppExecFwk::WrapStringToJS(env, info.abilityTypeName);
112     if (abilityTypeName == nullptr) {
113         TAG_LOGE(AAFwkTag::AUTO_STARTUP, "null abilityTypeName");
114         return false;
115     }
116 
117     if (!(AppExecFwk::SetPropertyValueByPropertyName(env, object, "bundleName", bundleName) &&
118         AppExecFwk::SetPropertyValueByPropertyName(env, object, "abilityName", abilityName) &&
119         AppExecFwk::SetPropertyValueByPropertyName(env, object, "moduleName", moduleName) &&
120         AppExecFwk::SetPropertyValueByPropertyName(env, object, "abilityTypeName", abilityTypeName))) {
121         TAG_LOGE(AAFwkTag::AUTO_STARTUP, "failed to set basic properties for js AutoStartupInfo");
122         return false;
123     }
124     if (info.appCloneIndex >= 0 && info.appCloneIndex < GlobalConstant::MAX_APP_CLONE_INDEX) {
125         napi_value appCloneIndex = AppExecFwk::WrapInt32ToJS(env, info.appCloneIndex);
126         if (appCloneIndex == nullptr) {
127             TAG_LOGE(AAFwkTag::AUTO_STARTUP, "null appCloneIndex");
128             return false;
129         }
130         if (!AppExecFwk::SetPropertyValueByPropertyName(env, object, "appCloneIndex", appCloneIndex)) {
131             TAG_LOGE(AAFwkTag::AUTO_STARTUP, "failed to set basic properties for js AutoStartupInfo");
132             return false;
133         }
134     }
135     return true;
136 }
137 
AddReadOnlyProperties(napi_env env,napi_value object,const AutoStartupInfo & info)138 bool AddReadOnlyProperties(napi_env env, napi_value object, const AutoStartupInfo &info)
139 {
140     napi_value userId = AppExecFwk::WrapInt32ToJS(env, info.userId);
141     if (userId == nullptr) {
142         TAG_LOGE(AAFwkTag::AUTO_STARTUP, "null userId");
143         return false;
144     }
145 
146     napi_value setterUserId = AppExecFwk::WrapInt32ToJS(env, info.setterUserId);
147     if (setterUserId == nullptr) {
148         TAG_LOGE(AAFwkTag::AUTO_STARTUP, "null setterUserId");
149         return false;
150     }
151 
152     napi_value canUserModify = AppExecFwk::WrapBoolToJS(env, info.canUserModify);
153     if (canUserModify == nullptr) {
154         TAG_LOGE(AAFwkTag::AUTO_STARTUP, "null canUserModify");
155         return false;
156     }
157 
158     if (!(AppExecFwk::SetPropertyValueByPropertyName(env, object, "userId", userId) &&
159         AppExecFwk::SetPropertyValueByPropertyName(env, object, "setterUserId", setterUserId) &&
160         AppExecFwk::SetPropertyValueByPropertyName(env, object, "canUserModify", canUserModify))) {
161         TAG_LOGE(AAFwkTag::AUTO_STARTUP, "failed to set readonly properties for js AutoStartupInfo");
162         return false;
163     }
164     return true;
165 }
166 
CreateJsAutoStartupInfo(napi_env env,const AutoStartupInfo & info)167 napi_value CreateJsAutoStartupInfo(napi_env env, const AutoStartupInfo &info)
168 {
169     napi_value object = AppExecFwk::CreateJSObject(env);
170     if (object == nullptr) {
171         TAG_LOGE(AAFwkTag::AUTO_STARTUP, "null object");
172         return nullptr;
173     }
174 
175     if (!AddBasicProperties(env, object, info)) {
176         TAG_LOGE(AAFwkTag::AUTO_STARTUP, "failed to add basic properties");
177         return nullptr;
178     }
179 
180     if (!AddReadOnlyProperties(env, object, info)) {
181         TAG_LOGE(AAFwkTag::AUTO_STARTUP, "failed to add readonly properties");
182         return nullptr;
183     }
184     return object;
185 }
186 } // namespace AbilityRuntime
187 } // namespace OHOS