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