1 /*
2 * Copyright (c) 2022-2023 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 #include "bundle_manager.h"
16
17 #include <string>
18
19 #include "app_log_wrapper.h"
20 #include "bundle_errors.h"
21 #include "bundle_mgr_client.h"
22 #include "bundle_mgr_interface.h"
23 #include "bundle_mgr_proxy.h"
24 #include "business_error.h"
25 #include "bundle_constants.h"
26 #include "common_func.h"
27 #include "hap_module_info.h"
28 #ifdef BUNDLE_FRAMEWORK_GET_ABILITY_ICON_ENABLED
29 #include "image_source.h"
30 #include "pixel_map_napi.h"
31 #endif
32 #include "ipc_skeleton.h"
33 #include "napi_arg.h"
34 #include "napi_constants.h"
35
36 namespace OHOS {
37 namespace AppExecFwk {
38 namespace {
39 constexpr const char* MODULE_NAME = "moduleName";
40 constexpr const char* ABILITY_NAME = "abilityName";
41 constexpr const char* METADATA_NAME = "metadataName";
42 constexpr const char* BUNDLE_NAME = "bundleName";
43 constexpr const char* ABILITY_INFO = "abilityInfo";
44 constexpr const char* IS_ENABLE = "isEnable";
45 constexpr const char* USER_ID = "userId";
46 constexpr const char* BUNDLE_FLAGS = "bundleFlags";
47 constexpr const char* APP_FLAGS = "appFlags";
48 constexpr const char* CALLBACK = "callback";
49 constexpr const char* STRING_TYPE = "napi_string";
50 constexpr const char* FUNCTION_TYPE = "napi_function";
51 constexpr const char* NUMBER_TYPE = "napi_number";
52 constexpr const char* WRONG_PARAM_TYPE = "BusinessError 401: Wrong param type";
53 constexpr const char* GET_LAUNCH_WANT_FOR_BUNDLE = "GetLaunchWantForBundle";
54 const std::string GET_BUNDLE_ARCHIVE_INFO = "GetBundleArchiveInfo";
55 const std::string GET_BUNDLE_NAME_BY_UID = "GetBundleNameByUid";
56 const std::string QUERY_ABILITY_INFOS = "QueryAbilityInfos";
57 const std::string QUERY_EXTENSION_INFOS = "QueryExtensionInfos";
58 const std::string GET_BUNDLE_INFO = "GetBundleInfo";
59 const std::string GET_BUNDLE_INFOS = "GetBundleInfos";
60 const std::string GET_APPLICATION_INFO = "GetApplicationInfo";
61 const std::string GET_APPLICATION_INFOS = "GetApplicationInfos";
62 const std::string GET_PERMISSION_DEF = "GetPermissionDef";
63 const std::string PERMISSION_NAME = "permissionName";
64 const std::string BUNDLE_PERMISSIONS = "ohos.permission.GET_BUNDLE_INFO or ohos.permission.GET_BUNDLE_INFO_PRIVILEGED";
65 const std::string PARAM_TYPE_CHECK_ERROR = "param type check error";
66 const std::string PARAM_TYPE_CHECK_ERROR_WITH_POS = "param type check error, error position : ";
67 const std::string GET_BUNDLE_INFO_SYNC = "GetBundleInfoSync";
68 const std::string GET_APPLICATION_INFO_SYNC = "GetApplicationInfoSync";
69 const std::string INVALID_WANT_ERROR =
70 "implicit query condition, at least one query param(action entities uri type) non-empty.";
71 } // namespace
72 using namespace OHOS::AAFwk;
73 static std::unordered_map<Query, napi_ref, QueryHash> cache;
74 namespace {
75 const std::string PARAMETER_BUNDLE_NAME = "bundleName";
76 }
77
InnerGetBundleArchiveInfo(std::string & hapFilePath,int32_t flags,BundleInfo & bundleInfo)78 static ErrCode InnerGetBundleArchiveInfo(std::string &hapFilePath, int32_t flags, BundleInfo &bundleInfo)
79 {
80 auto iBundleMgr = CommonFunc::GetBundleMgr();
81 if (iBundleMgr == nullptr) {
82 APP_LOGE("iBundleMgr is null");
83 return ERROR_BUNDLE_SERVICE_EXCEPTION;
84 }
85 ErrCode ret = iBundleMgr->GetBundleArchiveInfoV9(hapFilePath, flags, bundleInfo);
86 APP_LOGD("GetBundleArchiveInfoV9 ErrCode : %{public}d", ret);
87 return CommonFunc::ConvertErrCode(ret);
88 }
89
GetBundleArchiveInfoExec(napi_env env,void * data)90 void GetBundleArchiveInfoExec(napi_env env, void *data)
91 {
92 GetBundleArchiveInfoCallbackInfo *asyncCallbackInfo = reinterpret_cast<GetBundleArchiveInfoCallbackInfo *>(data);
93 if (asyncCallbackInfo == nullptr) {
94 APP_LOGE("asyncCallbackInfo is null");
95 return;
96 }
97 asyncCallbackInfo->err = InnerGetBundleArchiveInfo(
98 asyncCallbackInfo->hapFilePath, asyncCallbackInfo->flags, asyncCallbackInfo->bundleInfo);
99 }
100
GetBundleArchiveInfoComplete(napi_env env,napi_status status,void * data)101 void GetBundleArchiveInfoComplete(napi_env env, napi_status status, void *data)
102 {
103 GetBundleArchiveInfoCallbackInfo *asyncCallbackInfo = reinterpret_cast<GetBundleArchiveInfoCallbackInfo *>(data);
104 if (asyncCallbackInfo == nullptr) {
105 APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
106 return;
107 }
108 std::unique_ptr<GetBundleArchiveInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
109 napi_value result[ARGS_SIZE_TWO] = {0};
110 if (asyncCallbackInfo->err == NO_ERROR) {
111 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
112 NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &result[ARGS_POS_ONE]));
113 CommonFunc::ConvertBundleInfo(env,
114 asyncCallbackInfo->bundleInfo, result[ARGS_POS_ONE], asyncCallbackInfo->flags);
115 } else {
116 result[ARGS_POS_ZERO] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
117 GET_BUNDLE_ARCHIVE_INFO, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
118 }
119 if (asyncCallbackInfo->deferred) {
120 if (asyncCallbackInfo->err == NO_ERROR) {
121 NAPI_CALL_RETURN_VOID(env, napi_resolve_deferred(env, asyncCallbackInfo->deferred, result[ARGS_POS_ONE]));
122 } else {
123 NAPI_CALL_RETURN_VOID(env, napi_reject_deferred(env, asyncCallbackInfo->deferred, result[ARGS_POS_ZERO]));
124 }
125 } else {
126 napi_value callback = nullptr;
127 napi_value placeHolder = nullptr;
128 NAPI_CALL_RETURN_VOID(env, napi_get_reference_value(env, asyncCallbackInfo->callback, &callback));
129 NAPI_CALL_RETURN_VOID(env, napi_call_function(env, nullptr, callback,
130 sizeof(result) / sizeof(result[ARGS_POS_ZERO]), result, &placeHolder));
131 }
132 }
133
GetBundleArchiveInfo(napi_env env,napi_callback_info info)134 napi_value GetBundleArchiveInfo(napi_env env, napi_callback_info info)
135 {
136 APP_LOGD("begin to GetBundleArchiveInfo");
137 NapiArg args(env, info);
138 GetBundleArchiveInfoCallbackInfo *asyncCallbackInfo = new (std::nothrow) GetBundleArchiveInfoCallbackInfo(env);
139 if (asyncCallbackInfo == nullptr) {
140 APP_LOGE("asyncCallbackInfo is null");
141 return nullptr;
142 }
143 std::unique_ptr<GetBundleArchiveInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
144 if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_THREE)) {
145 APP_LOGE("param count invalid.");
146 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
147 return nullptr;
148 }
149 for (size_t i = 0; i < args.GetMaxArgc(); ++i) {
150 napi_valuetype valueType = napi_undefined;
151 napi_typeof(env, args[i], &valueType);
152 if ((i == ARGS_POS_ZERO) && (valueType == napi_string)) {
153 if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->hapFilePath)) {
154 APP_LOGE("hapFilePath %{public}s invalid!", asyncCallbackInfo->hapFilePath.c_str());
155 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
156 return nullptr;
157 }
158 } else if ((i == ARGS_POS_ONE) && (valueType == napi_number)) {
159 CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->flags);
160 } else if (i == ARGS_POS_TWO) {
161 if (valueType == napi_function) {
162 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
163 }
164 break;
165 } else {
166 APP_LOGE("param check error");
167 std::string errMsg = PARAM_TYPE_CHECK_ERROR_WITH_POS + std::to_string(i + 1);
168 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, errMsg);
169 return nullptr;
170 }
171 }
172 auto promise = CommonFunc::AsyncCallNativeMethod<GetBundleArchiveInfoCallbackInfo>(
173 env, asyncCallbackInfo, GET_BUNDLE_ARCHIVE_INFO, GetBundleArchiveInfoExec, GetBundleArchiveInfoComplete);
174 callbackPtr.release();
175 APP_LOGD("call GetBundleArchiveInfo done");
176 return promise;
177 }
178
InnerGetBundleNameByUid(int32_t uid,std::string & bundleName)179 static ErrCode InnerGetBundleNameByUid(int32_t uid, std::string &bundleName)
180 {
181 auto iBundleMgr = CommonFunc::GetBundleMgr();
182 if (iBundleMgr == nullptr) {
183 APP_LOGE("iBundleMgr is null");
184 return ERROR_BUNDLE_SERVICE_EXCEPTION;
185 }
186 ErrCode ret = iBundleMgr->GetNameForUid(uid, bundleName);
187 APP_LOGD("GetNameForUid ErrCode : %{public}d", ret);
188 return CommonFunc::ConvertErrCode(ret);
189 }
190
InnerGetApplicationInfo(const std::string & bundleName,int32_t flags,int32_t userId,ApplicationInfo & appInfo)191 static ErrCode InnerGetApplicationInfo(const std::string &bundleName, int32_t flags,
192 int32_t userId, ApplicationInfo &appInfo)
193 {
194 auto iBundleMgr = CommonFunc::GetBundleMgr();
195 if (iBundleMgr == nullptr) {
196 APP_LOGE("iBundleMgr is null");
197 return ERROR_BUNDLE_SERVICE_EXCEPTION;
198 }
199 ErrCode ret = iBundleMgr->GetApplicationInfoV9(bundleName, flags, userId, appInfo);
200 return CommonFunc::ConvertErrCode(ret);
201 }
202
InnerGetApplicationInfos(int32_t flags,int32_t userId,std::vector<ApplicationInfo> & appInfos)203 static ErrCode InnerGetApplicationInfos(int32_t flags,
204 int32_t userId, std::vector<ApplicationInfo> &appInfos)
205 {
206 auto iBundleMgr = CommonFunc::GetBundleMgr();
207 if (iBundleMgr == nullptr) {
208 APP_LOGE("iBundleMgr is null");
209 return ERROR_BUNDLE_SERVICE_EXCEPTION;
210 }
211 ErrCode ret = iBundleMgr->GetApplicationInfosV9(flags, userId, appInfos);
212 return CommonFunc::ConvertErrCode(ret);
213 }
214
ProcessApplicationInfos(napi_env env,napi_value result,const std::vector<ApplicationInfo> & appInfos)215 static void ProcessApplicationInfos(
216 napi_env env, napi_value result, const std::vector<ApplicationInfo> &appInfos)
217 {
218 if (appInfos.size() == 0) {
219 APP_LOGD("appInfos is null");
220 return;
221 }
222 size_t index = 0;
223 for (const auto &item : appInfos) {
224 APP_LOGD("name{%s}, bundleName{%s} ", item.name.c_str(), item.bundleName.c_str());
225 napi_value objAppInfo;
226 NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &objAppInfo));
227 CommonFunc::ConvertApplicationInfo(env, objAppInfo, item);
228 NAPI_CALL_RETURN_VOID(env, napi_set_element(env, result, index, objAppInfo));
229 index++;
230 }
231 }
232
GetBundleNameByUidExec(napi_env env,void * data)233 void GetBundleNameByUidExec(napi_env env, void *data)
234 {
235 GetBundleNameByUidCallbackInfo *asyncCallbackInfo = reinterpret_cast<GetBundleNameByUidCallbackInfo *>(data);
236 if (asyncCallbackInfo == nullptr) {
237 APP_LOGE("asyncCallbackInfo is null");
238 return;
239 }
240 asyncCallbackInfo->err = InnerGetBundleNameByUid(asyncCallbackInfo->uid, asyncCallbackInfo->bundleName);
241 }
242
GetBundleNameByUidComplete(napi_env env,napi_status status,void * data)243 void GetBundleNameByUidComplete(napi_env env, napi_status status, void *data)
244 {
245 GetBundleNameByUidCallbackInfo *asyncCallbackInfo = reinterpret_cast<GetBundleNameByUidCallbackInfo *>(data);
246 if (asyncCallbackInfo == nullptr) {
247 APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
248 return;
249 }
250 std::unique_ptr<GetBundleNameByUidCallbackInfo> callbackPtr {asyncCallbackInfo};
251 napi_value result[2] = {0};
252 if (asyncCallbackInfo->err == NO_ERROR) {
253 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
254 NAPI_CALL_RETURN_VOID(env,
255 napi_create_string_utf8(env, asyncCallbackInfo->bundleName.c_str(), NAPI_AUTO_LENGTH, &result[1]));
256 } else {
257 result[0] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
258 GET_BUNDLE_NAME_BY_UID, BUNDLE_PERMISSIONS);
259 }
260 if (asyncCallbackInfo->deferred) {
261 if (asyncCallbackInfo->err == NO_ERROR) {
262 NAPI_CALL_RETURN_VOID(env, napi_resolve_deferred(env, asyncCallbackInfo->deferred, result[1]));
263 } else {
264 NAPI_CALL_RETURN_VOID(env, napi_reject_deferred(env, asyncCallbackInfo->deferred, result[0]));
265 }
266 } else {
267 napi_value callback = nullptr;
268 napi_value placeHolder = nullptr;
269 NAPI_CALL_RETURN_VOID(env, napi_get_reference_value(env, asyncCallbackInfo->callback, &callback));
270 NAPI_CALL_RETURN_VOID(env, napi_call_function(env, nullptr, callback,
271 sizeof(result) / sizeof(result[0]), result, &placeHolder));
272 }
273 }
274
GetApplicationInfoComplete(napi_env env,napi_status status,void * data)275 void GetApplicationInfoComplete(napi_env env, napi_status status, void *data)
276 {
277 ApplicationInfoCallbackInfo *asyncCallbackInfo =
278 reinterpret_cast<ApplicationInfoCallbackInfo *>(data);
279 if (asyncCallbackInfo == nullptr) {
280 APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
281 return;
282 }
283 std::unique_ptr<ApplicationInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
284 napi_value result[CALLBACK_PARAM_SIZE] = {0};
285 if (asyncCallbackInfo->err == NO_ERROR) {
286 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
287 NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &result[ARGS_POS_ONE]));
288 CommonFunc::ConvertApplicationInfo(env, result[ARGS_POS_ONE], asyncCallbackInfo->appInfo);
289 } else {
290 result[ARGS_POS_ZERO] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
291 GET_APPLICATION_INFO, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
292 }
293 if (asyncCallbackInfo->deferred) {
294 if (asyncCallbackInfo->err == NO_ERROR) {
295 NAPI_CALL_RETURN_VOID(env, napi_resolve_deferred(env, asyncCallbackInfo->deferred, result[ARGS_POS_ONE]));
296 } else {
297 NAPI_CALL_RETURN_VOID(env, napi_reject_deferred(env, asyncCallbackInfo->deferred, result[ARGS_POS_ZERO]));
298 }
299 } else {
300 napi_value callback = nullptr;
301 napi_value placeHolder = nullptr;
302 NAPI_CALL_RETURN_VOID(env, napi_get_reference_value(env, asyncCallbackInfo->callback, &callback));
303 NAPI_CALL_RETURN_VOID(env, napi_call_function(env, nullptr, callback,
304 sizeof(result) / sizeof(result[ARGS_POS_ZERO]), result, &placeHolder));
305 }
306 }
307
GetApplicationInfosComplete(napi_env env,napi_status status,void * data)308 void GetApplicationInfosComplete(napi_env env, napi_status status, void *data)
309 {
310 ApplicationInfosCallbackInfo *asyncCallbackInfo =
311 reinterpret_cast<ApplicationInfosCallbackInfo *>(data);
312 if (asyncCallbackInfo == nullptr) {
313 APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
314 return;
315 }
316 std::unique_ptr<ApplicationInfosCallbackInfo> callbackPtr {asyncCallbackInfo};
317 napi_value result[CALLBACK_PARAM_SIZE] = {0};
318 if (asyncCallbackInfo->err == NO_ERROR) {
319 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
320 NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &result[ARGS_POS_ONE]));
321 ProcessApplicationInfos(env, result[ARGS_POS_ONE], asyncCallbackInfo->appInfos);
322 } else {
323 result[ARGS_POS_ZERO] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
324 GET_APPLICATION_INFOS, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
325 }
326 if (asyncCallbackInfo->deferred) {
327 if (asyncCallbackInfo->err == NO_ERROR) {
328 NAPI_CALL_RETURN_VOID(env, napi_resolve_deferred(env, asyncCallbackInfo->deferred, result[ARGS_POS_ONE]));
329 } else {
330 NAPI_CALL_RETURN_VOID(env, napi_reject_deferred(env, asyncCallbackInfo->deferred, result[ARGS_POS_ZERO]));
331 }
332 } else {
333 napi_value callback = nullptr;
334 napi_value placeHolder = nullptr;
335 NAPI_CALL_RETURN_VOID(env, napi_get_reference_value(env, asyncCallbackInfo->callback, &callback));
336 NAPI_CALL_RETURN_VOID(env, napi_call_function(env, nullptr, callback,
337 sizeof(result) / sizeof(result[ARGS_POS_ZERO]), result, &placeHolder));
338 }
339 }
340
GetApplicationInfoExec(napi_env env,void * data)341 void GetApplicationInfoExec(napi_env env, void *data)
342 {
343 ApplicationInfoCallbackInfo *asyncCallbackInfo = reinterpret_cast<ApplicationInfoCallbackInfo *>(data);
344 if (asyncCallbackInfo == nullptr) {
345 APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
346 return;
347 }
348 asyncCallbackInfo->err = InnerGetApplicationInfo(asyncCallbackInfo->bundleName,
349 asyncCallbackInfo->flags, asyncCallbackInfo->userId, asyncCallbackInfo->appInfo);
350 }
351
GetApplicationInfosExec(napi_env env,void * data)352 void GetApplicationInfosExec(napi_env env, void *data)
353 {
354 ApplicationInfosCallbackInfo *asyncCallbackInfo = reinterpret_cast<ApplicationInfosCallbackInfo *>(data);
355 if (asyncCallbackInfo == nullptr) {
356 APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
357 return;
358 }
359 asyncCallbackInfo->err = InnerGetApplicationInfos(asyncCallbackInfo->flags,
360 asyncCallbackInfo->userId, asyncCallbackInfo->appInfos);
361 }
362
GetBundleNameByUid(napi_env env,napi_callback_info info)363 napi_value GetBundleNameByUid(napi_env env, napi_callback_info info)
364 {
365 APP_LOGD("begin to GetBundleNameByUid");
366 NapiArg args(env, info);
367 GetBundleNameByUidCallbackInfo *asyncCallbackInfo = new (std::nothrow) GetBundleNameByUidCallbackInfo(env);
368 if (asyncCallbackInfo == nullptr) {
369 APP_LOGE("asyncCallbackInfo is null");
370 return nullptr;
371 }
372 std::unique_ptr<GetBundleNameByUidCallbackInfo> callbackPtr {asyncCallbackInfo};
373 if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_TWO)) {
374 APP_LOGE("param count invalid.");
375 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
376 return nullptr;
377 }
378 for (size_t i = 0; i < args.GetMaxArgc(); ++i) {
379 napi_valuetype valueType = napi_undefined;
380 napi_typeof(env, args[i], &valueType);
381 if ((i == ARGS_POS_ZERO) && (valueType == napi_number)) {
382 CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->uid);
383 } else if (i == ARGS_POS_ONE) {
384 if (valueType == napi_function) {
385 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
386 }
387 break;
388 } else {
389 APP_LOGE("param check error");
390 std::string errMsg = PARAM_TYPE_CHECK_ERROR_WITH_POS + std::to_string(i + 1);
391 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, errMsg);
392 return nullptr;
393 }
394 }
395 auto promise = CommonFunc::AsyncCallNativeMethod<GetBundleNameByUidCallbackInfo>(
396 env, asyncCallbackInfo, GET_BUNDLE_NAME_BY_UID, GetBundleNameByUidExec, GetBundleNameByUidComplete);
397 callbackPtr.release();
398 APP_LOGD("call GetBundleNameByUid done");
399 return promise;
400 }
401
GetApplicationInfo(napi_env env,napi_callback_info info)402 napi_value GetApplicationInfo(napi_env env, napi_callback_info info)
403 {
404 APP_LOGD("NAPI_GetApplicationInfo called");
405 NapiArg args(env, info);
406 ApplicationInfoCallbackInfo *asyncCallbackInfo = new (std::nothrow) ApplicationInfoCallbackInfo(env);
407 if (asyncCallbackInfo == nullptr) {
408 APP_LOGE("asyncCallbackInfo is null.");
409 return nullptr;
410 }
411 std::unique_ptr<ApplicationInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
412 if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_FOUR)) {
413 APP_LOGE("param count invalid.");
414 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
415 return nullptr;
416 }
417 asyncCallbackInfo->userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
418 if (args.GetMaxArgc() < ARGS_SIZE_TWO) {
419 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
420 return nullptr;
421 }
422 for (size_t i = 0; i < args.GetMaxArgc(); i++) {
423 napi_valuetype valueType = napi_undefined;
424 napi_typeof(env, args[i], &valueType);
425 if (i == ARGS_POS_ZERO) {
426 if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->bundleName)) {
427 APP_LOGE("appId %{public}s invalid!", asyncCallbackInfo->bundleName.c_str());
428 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
429 return nullptr;
430 }
431 } else if (i == ARGS_SIZE_ONE) {
432 if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->flags)) {
433 APP_LOGE("Flags %{public}d invalid!", asyncCallbackInfo->flags);
434 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, APP_FLAGS, TYPE_NUMBER);
435 return nullptr;
436 }
437 } else if (i == ARGS_SIZE_TWO) {
438 if (valueType == napi_function) {
439 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
440 break;
441 }
442 if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->userId)) {
443 APP_LOGE("userId %{public}d invalid!", asyncCallbackInfo->userId);
444 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, USER_ID, TYPE_NUMBER);
445 return nullptr;
446 }
447 } else if (i == ARGS_SIZE_THREE) {
448 if (valueType == napi_function) {
449 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
450 }
451 break;
452 } else {
453 APP_LOGE("param check error");
454 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
455 return nullptr;
456 }
457 }
458 auto promise = CommonFunc::AsyncCallNativeMethod<ApplicationInfoCallbackInfo>(
459 env, asyncCallbackInfo, GET_APPLICATION_INFO, GetApplicationInfoExec, GetApplicationInfoComplete);
460 callbackPtr.release();
461 APP_LOGD("call NAPI_GetApplicationInfo done.");
462 return promise;
463 }
464
GetApplicationInfos(napi_env env,napi_callback_info info)465 napi_value GetApplicationInfos(napi_env env, napi_callback_info info)
466 {
467 APP_LOGD("NAPI_GetApplicationInfos called");
468 NapiArg args(env, info);
469 ApplicationInfosCallbackInfo *asyncCallbackInfo = new (std::nothrow) ApplicationInfosCallbackInfo(env);
470 if (asyncCallbackInfo == nullptr) {
471 APP_LOGE("asyncCallbackInfo is null.");
472 return nullptr;
473 }
474 std::unique_ptr<ApplicationInfosCallbackInfo> callbackPtr {asyncCallbackInfo};
475 if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_THREE)) {
476 APP_LOGE("param count invalid.");
477 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
478 return nullptr;
479 }
480 asyncCallbackInfo->userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
481 if (args.GetMaxArgc() < ARGS_SIZE_ONE) {
482 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
483 return nullptr;
484 }
485 for (size_t i = 0; i < args.GetMaxArgc(); ++i) {
486 napi_valuetype valueType = napi_undefined;
487 napi_typeof(env, args[i], &valueType);
488 if (i == ARGS_POS_ZERO) {
489 if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->flags)) {
490 APP_LOGE("Flags %{public}d invalid!", asyncCallbackInfo->flags);
491 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, APP_FLAGS, TYPE_NUMBER);
492 return nullptr;
493 }
494 } else if (i == ARGS_POS_ONE) {
495 if (valueType == napi_function) {
496 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
497 break;
498 }
499 if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->userId)) {
500 APP_LOGE("userId %{public}d invalid!", asyncCallbackInfo->userId);
501 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, USER_ID, TYPE_NUMBER);
502 return nullptr;
503 }
504 } else if (i == ARGS_POS_TWO) {
505 if (valueType == napi_function) {
506 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
507 }
508 break;
509 } else {
510 APP_LOGE("param check error");
511 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
512 return nullptr;
513 }
514 }
515 auto promise = CommonFunc::AsyncCallNativeMethod<ApplicationInfosCallbackInfo>(
516 env, asyncCallbackInfo, GET_APPLICATION_INFOS, GetApplicationInfosExec, GetApplicationInfosComplete);
517 callbackPtr.release();
518 APP_LOGD("call NAPI_GetApplicationInfos done.");
519 return promise;
520 }
521
InnerQueryAbilityInfos(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos)522 static ErrCode InnerQueryAbilityInfos(const Want &want,
523 int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos)
524 {
525 auto iBundleMgr = CommonFunc::GetBundleMgr();
526 if (iBundleMgr == nullptr) {
527 APP_LOGE("iBundleMgr is null");
528 return ERROR_BUNDLE_SERVICE_EXCEPTION;
529 }
530 ErrCode ret = iBundleMgr->QueryAbilityInfosV9(want, flags, userId, abilityInfos);
531 APP_LOGD("QueryAbilityInfosV9 ErrCode : %{public}d", ret);
532 return CommonFunc::ConvertErrCode(ret);
533 }
534
InnerSetApplicationEnabled(const std::string & bundleName,bool & isEnable)535 static ErrCode InnerSetApplicationEnabled(const std::string &bundleName, bool &isEnable)
536 {
537 auto bundleMgr = CommonFunc::GetBundleMgr();
538 if (bundleMgr == nullptr) {
539 APP_LOGE("CommonFunc::GetBundleMgr failed.");
540 return ERROR_BUNDLE_SERVICE_EXCEPTION;
541 }
542 ErrCode ret = bundleMgr->SetApplicationEnabled(bundleName, isEnable);
543 return CommonFunc::ConvertErrCode(ret);
544 }
545
InnerIsApplicationEnabled(const std::string & bundleName,bool & isEnable)546 static ErrCode InnerIsApplicationEnabled(const std::string &bundleName, bool &isEnable)
547 {
548 auto bundleMgr = CommonFunc::GetBundleMgr();
549 if (bundleMgr == nullptr) {
550 APP_LOGE("CommonFunc::GetBundleMgr failed.");
551 return ERROR_BUNDLE_SERVICE_EXCEPTION;
552 }
553 ErrCode ret = bundleMgr->IsApplicationEnabled(bundleName, isEnable);
554 return CommonFunc::ConvertErrCode(ret);
555 }
556
InnerSetAbilityEnabled(const AbilityInfo & abilityInfo,bool & isEnable)557 static ErrCode InnerSetAbilityEnabled(const AbilityInfo &abilityInfo, bool &isEnable)
558 {
559 auto bundleMgr = CommonFunc::GetBundleMgr();
560 if (bundleMgr == nullptr) {
561 APP_LOGE("CommonFunc::GetBundleMgr failed.");
562 return ERROR_BUNDLE_SERVICE_EXCEPTION;
563 }
564 ErrCode ret = bundleMgr->SetAbilityEnabled(abilityInfo, isEnable);
565 return CommonFunc::ConvertErrCode(ret);
566 }
567
InnerIsAbilityEnabled(const AbilityInfo & abilityInfo,bool & isEnable)568 static ErrCode InnerIsAbilityEnabled(const AbilityInfo &abilityInfo, bool &isEnable)
569 {
570 auto bundleMgr = CommonFunc::GetBundleMgr();
571 if (bundleMgr == nullptr) {
572 APP_LOGE("CommonFunc::GetBundleMgr failed.");
573 return ERROR_BUNDLE_SERVICE_EXCEPTION;
574 }
575 ErrCode ret = bundleMgr->IsAbilityEnabled(abilityInfo, isEnable);
576 return CommonFunc::ConvertErrCode(ret);
577 }
578
InnerGetAbilityLabel(const std::string & bundleName,const std::string & moduleName,const std::string & abilityName,std::string & abilityLabel)579 static ErrCode InnerGetAbilityLabel(const std::string &bundleName, const std::string &moduleName,
580 const std::string &abilityName, std::string &abilityLabel)
581 {
582 auto bundleMgr = CommonFunc::GetBundleMgr();
583 if (bundleMgr == nullptr) {
584 APP_LOGE("CommonFunc::GetBundleMgr failed.");
585 return ERROR_SYSTEM_ABILITY_NOT_FOUND;
586 }
587 ErrCode ret = bundleMgr->GetAbilityLabel(bundleName, moduleName, abilityName, abilityLabel);
588 return CommonFunc::ConvertErrCode(ret);
589 }
590
591 #ifdef BUNDLE_FRAMEWORK_GET_ABILITY_ICON_ENABLED
LoadImageFile(const uint8_t * data,size_t len)592 static std::shared_ptr<Media::PixelMap> LoadImageFile(const uint8_t *data, size_t len)
593 {
594 APP_LOGD("begin LoadImageFile");
595 uint32_t errorCode = 0;
596 Media::SourceOptions opts;
597 std::unique_ptr<Media::ImageSource> imageSource = Media::ImageSource::CreateImageSource(data, len, opts, errorCode);
598 if (errorCode != 0) {
599 APP_LOGE("failed to create image source err is %{public}d", errorCode);
600 return nullptr;
601 }
602
603 Media::DecodeOptions decodeOpts;
604 auto pixelMapPtr = imageSource->CreatePixelMap(decodeOpts, errorCode);
605 if (errorCode != 0) {
606 APP_LOGE("failed to create pixelmap err %{public}d", errorCode);
607 return nullptr;
608 }
609 APP_LOGD("LoadImageFile finish");
610 return std::shared_ptr<Media::PixelMap>(std::move(pixelMapPtr));
611 }
612
InnerGetAbilityIcon(const std::string & bundleName,const std::string & moduleName,const std::string & abilityName,std::shared_ptr<Media::PixelMap> & pixelMap)613 static ErrCode InnerGetAbilityIcon(const std::string &bundleName, const std::string &moduleName,
614 const std::string &abilityName, std::shared_ptr<Media::PixelMap> &pixelMap)
615 {
616 auto bundleMgr = CommonFunc::GetBundleMgr();
617 if (bundleMgr == nullptr) {
618 APP_LOGE("CommonFunc::GetBundleMgr failed.");
619 return ERROR_SYSTEM_ABILITY_NOT_FOUND;
620 }
621 if (bundleName.empty() || moduleName.empty() || abilityName.empty()) {
622 APP_LOGE("GetAbilityIcon check param failed.");
623 return ERROR_PARAM_CHECK_ERROR;
624 }
625 std::unique_ptr<uint8_t[]> mediaDataPtr = nullptr;
626 size_t len = 0;
627 ErrCode ret = bundleMgr->GetMediaData(bundleName, moduleName, abilityName, mediaDataPtr, len);
628 if (ret != ERR_OK) {
629 APP_LOGE("get media data failed");
630 return CommonFunc::ConvertErrCode(ret);
631 }
632 if (mediaDataPtr == nullptr || len == 0) {
633 return ERROR_BUNDLE_SERVICE_EXCEPTION;
634 }
635 auto pixelMapPtr = LoadImageFile(mediaDataPtr.get(), len);
636 if (pixelMapPtr == nullptr) {
637 APP_LOGE("loadImageFile failed");
638 return ERROR_BUNDLE_SERVICE_EXCEPTION;
639 }
640 pixelMap = std::move(pixelMapPtr);
641 return SUCCESS;
642 }
643 #endif
644
CheckAbilityInfoCache(napi_env env,const Query & query,const AbilityCallbackInfo * info,napi_value jsObject)645 static void CheckAbilityInfoCache(
646 napi_env env, const Query &query, const AbilityCallbackInfo *info, napi_value jsObject)
647 {
648 if (info == nullptr) {
649 return;
650 }
651
652 ElementName element = info->want.GetElement();
653 if (element.GetBundleName().empty() || element.GetAbilityName().empty()) {
654 return;
655 }
656
657 uint32_t explicitQueryResultLen = 1;
658 if (info->abilityInfos.size() != explicitQueryResultLen ||
659 info->abilityInfos[0].uid != IPCSkeleton::GetCallingUid()) {
660 return;
661 }
662
663 napi_ref cacheAbilityInfo = nullptr;
664 NAPI_CALL_RETURN_VOID(env, napi_create_reference(env, jsObject, NAPI_RETURN_ONE, &cacheAbilityInfo));
665 cache[query] = cacheAbilityInfo;
666 }
667
QueryAbilityInfosExec(napi_env env,void * data)668 void QueryAbilityInfosExec(napi_env env, void *data)
669 {
670 AbilityCallbackInfo *asyncCallbackInfo = reinterpret_cast<AbilityCallbackInfo *>(data);
671 if (asyncCallbackInfo == nullptr) {
672 APP_LOGE("asyncCallbackInfo is null");
673 return;
674 }
675
676 auto item = cache.find(Query(asyncCallbackInfo->want.ToString(),
677 QUERY_ABILITY_INFOS, asyncCallbackInfo->flags, asyncCallbackInfo->userId, env));
678 if (item != cache.end()) {
679 asyncCallbackInfo->isSavedInCache = true;
680 APP_LOGD("has cache, no need to query from host.");
681 return;
682 }
683
684 asyncCallbackInfo->err = InnerQueryAbilityInfos(asyncCallbackInfo->want, asyncCallbackInfo->flags,
685 asyncCallbackInfo->userId, asyncCallbackInfo->abilityInfos);
686 }
687
QueryAbilityInfosComplete(napi_env env,napi_status status,void * data)688 void QueryAbilityInfosComplete(napi_env env, napi_status status, void *data)
689 {
690 AbilityCallbackInfo *asyncCallbackInfo = reinterpret_cast<AbilityCallbackInfo *>(data);
691 if (asyncCallbackInfo == nullptr) {
692 APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
693 return;
694 }
695 std::unique_ptr<AbilityCallbackInfo> callbackPtr {asyncCallbackInfo};
696 napi_value result[2] = {0};
697 if (asyncCallbackInfo->err == NO_ERROR) {
698 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
699 if (asyncCallbackInfo->isSavedInCache) {
700 auto item = cache.find(Query(asyncCallbackInfo->want.ToString(),
701 QUERY_ABILITY_INFOS, asyncCallbackInfo->flags, asyncCallbackInfo->userId, env));
702 if (item == cache.end()) {
703 APP_LOGE("cannot find result in cache in %{public}s", __func__);
704 return;
705 }
706 NAPI_CALL_RETURN_VOID(env, napi_get_reference_value(env, item->second, &result[1]));
707 } else {
708 NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &result[1]));
709 CommonFunc::ConvertAbilityInfos(env, asyncCallbackInfo->abilityInfos, result[1]);
710 Query query(asyncCallbackInfo->want.ToString(),
711 QUERY_ABILITY_INFOS, asyncCallbackInfo->flags, asyncCallbackInfo->userId, env);
712 CheckAbilityInfoCache(env, query, asyncCallbackInfo, result[1]);
713 }
714 } else {
715 result[0] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
716 QUERY_ABILITY_INFOS, BUNDLE_PERMISSIONS);
717 }
718 if (asyncCallbackInfo->deferred) {
719 if (asyncCallbackInfo->err == NO_ERROR) {
720 NAPI_CALL_RETURN_VOID(env, napi_resolve_deferred(env, asyncCallbackInfo->deferred, result[1]));
721 } else {
722 NAPI_CALL_RETURN_VOID(env, napi_reject_deferred(env, asyncCallbackInfo->deferred, result[0]));
723 }
724 } else {
725 napi_value callback = nullptr;
726 napi_value placeHolder = nullptr;
727 NAPI_CALL_RETURN_VOID(env, napi_get_reference_value(env, asyncCallbackInfo->callback, &callback));
728 NAPI_CALL_RETURN_VOID(env, napi_call_function(env, nullptr, callback,
729 sizeof(result) / sizeof(result[0]), result, &placeHolder));
730 }
731 }
732
QueryAbilityInfos(napi_env env,napi_callback_info info)733 napi_value QueryAbilityInfos(napi_env env, napi_callback_info info)
734 {
735 APP_LOGD("begin to QueryAbilityInfos");
736 NapiArg args(env, info);
737 AbilityCallbackInfo *asyncCallbackInfo = new (std::nothrow) AbilityCallbackInfo(env);
738 if (asyncCallbackInfo == nullptr) {
739 APP_LOGE("asyncCallbackInfo is null");
740 return nullptr;
741 }
742 asyncCallbackInfo->userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
743 std::unique_ptr<AbilityCallbackInfo> callbackPtr {asyncCallbackInfo};
744 if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_FOUR)) {
745 APP_LOGE("param count invalid.");
746 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
747 return nullptr;
748 }
749 for (size_t i = 0; i < args.GetMaxArgc(); ++i) {
750 napi_valuetype valueType = napi_undefined;
751 napi_typeof(env, args[i], &valueType);
752 if ((i == ARGS_POS_ZERO) && (valueType == napi_object)) {
753 if (!CommonFunc::ParseWantPerformance(env, args[i], asyncCallbackInfo->want)) {
754 APP_LOGE("invalid want");
755 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, INVALID_WANT_ERROR);
756 return nullptr;
757 }
758 } else if ((i == ARGS_POS_ONE) && (valueType == napi_number)) {
759 CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->flags);
760 } else if (i == ARGS_POS_TWO) {
761 if (valueType == napi_number) {
762 CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->userId);
763 } else if (valueType == napi_function) {
764 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
765 break;
766 } else {
767 APP_LOGE("param check error");
768 std::string errMsg = PARAM_TYPE_CHECK_ERROR_WITH_POS + std::to_string(i + 1);
769 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, errMsg);
770 return nullptr;
771 }
772 } else if (i == ARGS_POS_THREE) {
773 if (valueType == napi_function) {
774 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
775 }
776 break;
777 } else {
778 APP_LOGE("param check error");
779 std::string errMsg = PARAM_TYPE_CHECK_ERROR_WITH_POS + std::to_string(i + 1);
780 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, errMsg);
781 return nullptr;
782 }
783 }
784 auto promise = CommonFunc::AsyncCallNativeMethod<AbilityCallbackInfo>(
785 env, asyncCallbackInfo, QUERY_ABILITY_INFOS, QueryAbilityInfosExec, QueryAbilityInfosComplete);
786 callbackPtr.release();
787 APP_LOGD("call QueryAbilityInfos done");
788 return promise;
789 }
790
InnerQueryExtensionInfos(ExtensionCallbackInfo * info)791 static ErrCode InnerQueryExtensionInfos(ExtensionCallbackInfo *info)
792 {
793 if (info == nullptr) {
794 APP_LOGE("ExtensionCallbackInfo is null");
795 return ERROR_BUNDLE_SERVICE_EXCEPTION;
796 }
797 auto iBundleMgr = CommonFunc::GetBundleMgr();
798 if (iBundleMgr == nullptr) {
799 APP_LOGE("iBundleMgr is null");
800 return ERROR_BUNDLE_SERVICE_EXCEPTION;
801 }
802 ErrCode ret = ERR_OK;
803 if (info->extensionAbilityType == static_cast<int32_t>(ExtensionAbilityType::UNSPECIFIED)) {
804 APP_LOGD("query extensionAbilityInfo without type");
805 ret = iBundleMgr->QueryExtensionAbilityInfosV9(info->want, info->flags, info->userId, info->extensionInfos);
806 } else {
807 ExtensionAbilityType type = static_cast<ExtensionAbilityType>(info->extensionAbilityType);
808 APP_LOGD("query extensionAbilityInfo with type %{public}d", info->extensionAbilityType);
809 ret = iBundleMgr->QueryExtensionAbilityInfosV9(
810 info->want, type, info->flags, info->userId, info->extensionInfos);
811 }
812 APP_LOGD("QueryExtensionAbilityInfosV9 ErrCode : %{public}d", ret);
813 return CommonFunc::ConvertErrCode(ret);
814 }
815
QueryExtensionInfosExec(napi_env env,void * data)816 void QueryExtensionInfosExec(napi_env env, void *data)
817 {
818 ExtensionCallbackInfo *asyncCallbackInfo = reinterpret_cast<ExtensionCallbackInfo *>(data);
819 if (asyncCallbackInfo == nullptr) {
820 APP_LOGE("asyncCallbackInfo is null");
821 return;
822 }
823 asyncCallbackInfo->err = InnerQueryExtensionInfos(asyncCallbackInfo);
824 }
825
QueryExtensionInfosComplete(napi_env env,napi_status status,void * data)826 void QueryExtensionInfosComplete(napi_env env, napi_status status, void *data)
827 {
828 ExtensionCallbackInfo *asyncCallbackInfo = reinterpret_cast<ExtensionCallbackInfo *>(data);
829 if (asyncCallbackInfo == nullptr) {
830 APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
831 return;
832 }
833 std::unique_ptr<ExtensionCallbackInfo> callbackPtr {asyncCallbackInfo};
834 napi_value result[2] = {0};
835 if (asyncCallbackInfo->err == NO_ERROR) {
836 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
837 NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &result[1]));
838 CommonFunc::ConvertExtensionInfos(env, asyncCallbackInfo->extensionInfos, result[1]);
839 } else {
840 result[0] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
841 QUERY_EXTENSION_INFOS, BUNDLE_PERMISSIONS);
842 }
843 if (asyncCallbackInfo->deferred) {
844 if (asyncCallbackInfo->err == NO_ERROR) {
845 NAPI_CALL_RETURN_VOID(env, napi_resolve_deferred(env, asyncCallbackInfo->deferred, result[1]));
846 } else {
847 NAPI_CALL_RETURN_VOID(env, napi_reject_deferred(env, asyncCallbackInfo->deferred, result[0]));
848 }
849 } else {
850 napi_value callback = nullptr;
851 napi_value placeHolder = nullptr;
852 NAPI_CALL_RETURN_VOID(env, napi_get_reference_value(env, asyncCallbackInfo->callback, &callback));
853 NAPI_CALL_RETURN_VOID(env, napi_call_function(env, nullptr, callback,
854 sizeof(result) / sizeof(result[0]), result, &placeHolder));
855 }
856 }
857
QueryExtensionInfos(napi_env env,napi_callback_info info)858 napi_value QueryExtensionInfos(napi_env env, napi_callback_info info)
859 {
860 APP_LOGD("begin to QueryExtensionInfos");
861 NapiArg args(env, info);
862 ExtensionCallbackInfo *asyncCallbackInfo = new (std::nothrow) ExtensionCallbackInfo(env);
863 if (asyncCallbackInfo == nullptr) {
864 APP_LOGE("asyncCallbackInfo is null");
865 return nullptr;
866 }
867 asyncCallbackInfo->userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
868 std::unique_ptr<ExtensionCallbackInfo> callbackPtr {asyncCallbackInfo};
869 if (!args.Init(ARGS_SIZE_THREE, ARGS_SIZE_FIVE)) {
870 APP_LOGE("param count invalid");
871 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
872 return nullptr;
873 }
874 for (size_t i = 0; i < args.GetMaxArgc(); ++i) {
875 napi_valuetype valueType = napi_undefined;
876 napi_typeof(env, args[i], &valueType);
877 if ((i == ARGS_POS_ZERO) && (valueType == napi_object)) {
878 if (!CommonFunc::ParseWant(env, args[i], asyncCallbackInfo->want)) {
879 APP_LOGE("invalid want");
880 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, INVALID_WANT_ERROR);
881 return nullptr;
882 }
883 } else if ((i == ARGS_POS_ONE) && (valueType == napi_number)) {
884 CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->extensionAbilityType);
885 } else if ((i == ARGS_POS_TWO) && (valueType == napi_number)) {
886 CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->flags);
887 } else if (i == ARGS_POS_THREE) {
888 if (valueType == napi_number) {
889 CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->userId);
890 } else if (valueType == napi_function) {
891 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
892 break;
893 } else {
894 APP_LOGE("param check error");
895 std::string errMsg = PARAM_TYPE_CHECK_ERROR_WITH_POS + std::to_string(i + 1);
896 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, errMsg);
897 return nullptr;
898 }
899 } else if (i == ARGS_POS_FOUR) {
900 if (valueType == napi_function) {
901 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
902 }
903 break;
904 } else {
905 APP_LOGE("param check error");
906 std::string errMsg = PARAM_TYPE_CHECK_ERROR_WITH_POS + std::to_string(i + 1);
907 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, errMsg);
908 return nullptr;
909 }
910 }
911 auto promise = CommonFunc::AsyncCallNativeMethod<ExtensionCallbackInfo>(
912 env, asyncCallbackInfo, QUERY_EXTENSION_INFOS, QueryExtensionInfosExec, QueryExtensionInfosComplete);
913 callbackPtr.release();
914 APP_LOGD("call QueryExtensionInfos done");
915 return promise;
916 }
917
CreateAbilityFlagObject(napi_env env,napi_value value)918 void CreateAbilityFlagObject(napi_env env, napi_value value)
919 {
920 napi_value nGetAbilityInfoDefault;
921 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
922 GetAbilityInfoFlag::GET_ABILITY_INFO_DEFAULT), &nGetAbilityInfoDefault));
923 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_ABILITY_INFO_DEFAULT",
924 nGetAbilityInfoDefault));
925
926 napi_value nGetAbilityInfoWithPermission;
927 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
928 GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_PERMISSION), &nGetAbilityInfoWithPermission));
929 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_ABILITY_INFO_WITH_PERMISSION",
930 nGetAbilityInfoWithPermission));
931
932 napi_value nGetAbilityInfoWithApplication;
933 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
934 GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_APPLICATION), &nGetAbilityInfoWithApplication));
935 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_ABILITY_INFO_WITH_APPLICATION",
936 nGetAbilityInfoWithApplication));
937
938 napi_value nGetAbilityInfoWithMetadata;
939 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
940 GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_METADATA), &nGetAbilityInfoWithMetadata));
941 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_ABILITY_INFO_WITH_METADATA",
942 nGetAbilityInfoWithMetadata));
943
944 napi_value nGetAbilityInfoWithDisabled;
945 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
946 GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_DISABLE), &nGetAbilityInfoWithDisabled));
947 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_ABILITY_INFO_WITH_DISABLE",
948 nGetAbilityInfoWithDisabled));
949
950 napi_value nGetAbilityInfOnlySystemApp;
951 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
952 GetAbilityInfoFlag::GET_ABILITY_INFO_ONLY_SYSTEM_APP), &nGetAbilityInfOnlySystemApp));
953 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_ABILITY_INFO_ONLY_SYSTEM_APP",
954 nGetAbilityInfOnlySystemApp));
955 }
956
957
GetAbilityLabelExec(napi_env env,void * data)958 void GetAbilityLabelExec(napi_env env, void *data)
959 {
960 AbilityLabelCallbackInfo *asyncCallbackInfo = reinterpret_cast<AbilityLabelCallbackInfo *>(data);
961 if (asyncCallbackInfo == nullptr) {
962 APP_LOGE("%{public}s, asyncCallbackInfo == nullptr.", __func__);
963 return;
964 }
965 asyncCallbackInfo->err = InnerGetAbilityLabel(asyncCallbackInfo->bundleName,
966 asyncCallbackInfo->moduleName, asyncCallbackInfo->abilityName, asyncCallbackInfo->abilityLabel);
967 }
968
GetAbilityLabelComplete(napi_env env,napi_status status,void * data)969 void GetAbilityLabelComplete(napi_env env, napi_status status, void *data)
970 {
971 AbilityLabelCallbackInfo *asyncCallbackInfo = reinterpret_cast<AbilityLabelCallbackInfo *>(data);
972 if (asyncCallbackInfo == nullptr) {
973 APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
974 return;
975 }
976 std::unique_ptr<AbilityLabelCallbackInfo> callbackPtr {asyncCallbackInfo};
977 napi_value result[2] = {0};
978 if (asyncCallbackInfo->err == NO_ERROR) {
979 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
980 NAPI_CALL_RETURN_VOID(env, napi_create_string_utf8(env, asyncCallbackInfo->abilityLabel.c_str(),
981 NAPI_AUTO_LENGTH, &result[1]));
982 } else {
983 APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
984 result[0] = BusinessError::CreateCommonError(
985 env, asyncCallbackInfo->err, "GetAbilityLabel", Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
986 }
987 if (asyncCallbackInfo->deferred) {
988 if (asyncCallbackInfo->err == NO_ERROR) {
989 NAPI_CALL_RETURN_VOID(env, napi_resolve_deferred(env, asyncCallbackInfo->deferred, result[1]));
990 } else {
991 NAPI_CALL_RETURN_VOID(env, napi_reject_deferred(env, asyncCallbackInfo->deferred, result[0]));
992 }
993 } else {
994 napi_value callback = nullptr;
995 napi_value placeHolder = nullptr;
996 NAPI_CALL_RETURN_VOID(env, napi_get_reference_value(env, asyncCallbackInfo->callback, &callback));
997 NAPI_CALL_RETURN_VOID(env, napi_call_function(env, nullptr, callback,
998 sizeof(result) / sizeof(result[0]), result, &placeHolder));
999 }
1000 }
1001
GetAbilityLabel(napi_env env,napi_callback_info info)1002 napi_value GetAbilityLabel(napi_env env, napi_callback_info info)
1003 {
1004 APP_LOGD("begin to GetAbilityLabel");
1005 #ifdef GLOBAL_RESMGR_ENABLE
1006 NapiArg args(env, info);
1007 AbilityLabelCallbackInfo *asyncCallbackInfo = new (std::nothrow) AbilityLabelCallbackInfo(env);
1008 if (asyncCallbackInfo == nullptr) {
1009 APP_LOGE("asyncCallbackInfo is null.");
1010 return nullptr;
1011 }
1012 std::unique_ptr<AbilityLabelCallbackInfo> callbackPtr {asyncCallbackInfo};
1013 if (!args.Init(ARGS_SIZE_THREE, ARGS_SIZE_FOUR)) {
1014 APP_LOGE("Napi func init failed");
1015 return nullptr;
1016 }
1017 if (args.GetMaxArgc() >= ARGS_SIZE_THREE) {
1018 if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], asyncCallbackInfo->bundleName)) {
1019 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
1020 return nullptr;
1021 }
1022 if (!CommonFunc::ParseString(env, args[ARGS_POS_ONE], asyncCallbackInfo->moduleName)) {
1023 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, MODULE_NAME, TYPE_STRING);
1024 return nullptr;
1025 }
1026 if (!CommonFunc::ParseString(env, args[ARGS_POS_TWO], asyncCallbackInfo->abilityName)) {
1027 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, ABILITY_NAME, TYPE_STRING);
1028 return nullptr;
1029 }
1030 if (args.GetMaxArgc() == ARGS_SIZE_FOUR) {
1031 napi_valuetype valueType = napi_undefined;
1032 napi_typeof(env, args[ARGS_POS_THREE], &valueType);
1033 if (valueType == napi_function) {
1034 NAPI_CALL(env, napi_create_reference(env, args[ARGS_POS_THREE],
1035 NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
1036 }
1037 }
1038 } else {
1039 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1040 return nullptr;
1041 }
1042 auto promise = CommonFunc::AsyncCallNativeMethod<AbilityLabelCallbackInfo>(
1043 env, asyncCallbackInfo, "GetAbilityLabel", GetAbilityLabelExec, GetAbilityLabelComplete);
1044 callbackPtr.release();
1045 APP_LOGD("call GetAbilityLabel done.");
1046 return promise;
1047 #else
1048 APP_LOGE("SystemCapability.BundleManager.BundleFramework.Resource not supported.");
1049 napi_value error = BusinessError::CreateCommonError(env, ERROR_SYSTEM_ABILITY_NOT_FOUND, "getAbilityLabel");
1050 napi_throw(env, error);
1051 return nullptr;
1052 #endif
1053 }
1054
1055 #ifdef BUNDLE_FRAMEWORK_GET_ABILITY_ICON_ENABLED
GetAbilityIconExec(napi_env env,void * data)1056 void GetAbilityIconExec(napi_env env, void *data)
1057 {
1058 AbilityIconCallbackInfo *asyncCallbackInfo = reinterpret_cast<AbilityIconCallbackInfo *>(data);
1059 if (asyncCallbackInfo == nullptr) {
1060 APP_LOGE("%{public}s, asyncCallbackInfo == nullptr.", __func__);
1061 return;
1062 }
1063 asyncCallbackInfo->err = InnerGetAbilityIcon(asyncCallbackInfo->bundleName,
1064 asyncCallbackInfo->moduleName, asyncCallbackInfo->abilityName, asyncCallbackInfo->pixelMap);
1065 }
1066
GetAbilityIconComplete(napi_env env,napi_status status,void * data)1067 void GetAbilityIconComplete(napi_env env, napi_status status, void *data)
1068 {
1069 AbilityIconCallbackInfo *asyncCallbackInfo = reinterpret_cast<AbilityIconCallbackInfo *>(data);
1070 if (asyncCallbackInfo == nullptr) {
1071 APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
1072 return;
1073 }
1074 std::unique_ptr<AbilityIconCallbackInfo> callbackPtr {asyncCallbackInfo};
1075 napi_value result[2] = {0};
1076 if (asyncCallbackInfo->err == NO_ERROR) {
1077 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
1078 napi_value exports = nullptr;
1079 Media::PixelMapNapi::Init(env, exports);
1080 result[1] = Media::PixelMapNapi::CreatePixelMap(env, asyncCallbackInfo->pixelMap);
1081 } else {
1082 APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
1083 result[0] = BusinessError::CreateCommonError(
1084 env, asyncCallbackInfo->err, "GetAbilityIcon", Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
1085 }
1086 if (asyncCallbackInfo->deferred) {
1087 if (asyncCallbackInfo->err == NO_ERROR) {
1088 NAPI_CALL_RETURN_VOID(env, napi_resolve_deferred(env, asyncCallbackInfo->deferred, result[1]));
1089 } else {
1090 NAPI_CALL_RETURN_VOID(env, napi_reject_deferred(env, asyncCallbackInfo->deferred, result[0]));
1091 }
1092 } else {
1093 napi_value callback = nullptr;
1094 napi_value placeHolder = nullptr;
1095 NAPI_CALL_RETURN_VOID(env, napi_get_reference_value(env, asyncCallbackInfo->callback, &callback));
1096 NAPI_CALL_RETURN_VOID(env, napi_call_function(env, nullptr, callback,
1097 sizeof(result) / sizeof(result[0]), result, &placeHolder));
1098 }
1099 }
1100 #endif
1101
GetAbilityIcon(napi_env env,napi_callback_info info)1102 napi_value GetAbilityIcon(napi_env env, napi_callback_info info)
1103 {
1104 APP_LOGD("begin to GetAbilityIcon");
1105 #ifdef BUNDLE_FRAMEWORK_GET_ABILITY_ICON_ENABLED
1106 NapiArg args(env, info);
1107 AbilityIconCallbackInfo *asyncCallbackInfo = new (std::nothrow) AbilityIconCallbackInfo(env);
1108 if (asyncCallbackInfo == nullptr) {
1109 APP_LOGE("asyncCallbackInfo is null.");
1110 return nullptr;
1111 }
1112 std::unique_ptr<AbilityIconCallbackInfo> callbackPtr {asyncCallbackInfo};
1113 if (!args.Init(ARGS_SIZE_THREE, ARGS_SIZE_FOUR)) {
1114 APP_LOGE("Napi func init failed");
1115 return nullptr;
1116 }
1117
1118 if (args.GetMaxArgc() >= ARGS_SIZE_THREE) {
1119 if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], asyncCallbackInfo->bundleName)) {
1120 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
1121 return nullptr;
1122 }
1123 if (!CommonFunc::ParseString(env, args[ARGS_POS_ONE], asyncCallbackInfo->moduleName)) {
1124 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, MODULE_NAME, TYPE_STRING);
1125 return nullptr;
1126 }
1127 if (!CommonFunc::ParseString(env, args[ARGS_POS_TWO], asyncCallbackInfo->abilityName)) {
1128 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, ABILITY_NAME, TYPE_STRING);
1129 return nullptr;
1130 }
1131 if (args.GetMaxArgc() == ARGS_SIZE_FOUR) {
1132 napi_valuetype valueType = napi_undefined;
1133 napi_typeof(env, args[ARGS_POS_THREE], &valueType);
1134 if (valueType == napi_function) {
1135 NAPI_CALL(env, napi_create_reference(env, args[ARGS_POS_THREE],
1136 NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
1137 }
1138 }
1139 } else {
1140 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1141 return nullptr;
1142 }
1143 auto promise = CommonFunc::AsyncCallNativeMethod<AbilityIconCallbackInfo>(
1144 env, asyncCallbackInfo, "GetAbilityIcon", GetAbilityIconExec, GetAbilityIconComplete);
1145 callbackPtr.release();
1146 APP_LOGD("call GetAbilityIcon done.");
1147 return promise;
1148 #else
1149 APP_LOGE("SystemCapability.BundleManager.BundleFramework.Resource not supported.");
1150 napi_value error = BusinessError::CreateCommonError(env, ERROR_SYSTEM_ABILITY_NOT_FOUND, "getAbilityIcon");
1151 napi_throw(env, error);
1152 return nullptr;
1153 #endif
1154 }
1155
SetApplicationEnabledExec(napi_env env,void * data)1156 void SetApplicationEnabledExec(napi_env env, void *data)
1157 {
1158 ApplicationEnableCallbackInfo *asyncCallbackInfo = reinterpret_cast<ApplicationEnableCallbackInfo *>(data);
1159 if (asyncCallbackInfo == nullptr) {
1160 APP_LOGE("%{public}s, asyncCallbackInfo == nullptr.", __func__);
1161 return;
1162 }
1163 asyncCallbackInfo->err = InnerSetApplicationEnabled(asyncCallbackInfo->bundleName,
1164 asyncCallbackInfo->isEnable);
1165 }
1166
SetApplicationEnabledComplete(napi_env env,napi_status status,void * data)1167 void SetApplicationEnabledComplete(napi_env env, napi_status status, void *data)
1168 {
1169 ApplicationEnableCallbackInfo *asyncCallbackInfo = reinterpret_cast<ApplicationEnableCallbackInfo *>(data);
1170 if (asyncCallbackInfo == nullptr) {
1171 APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
1172 return;
1173 }
1174 std::unique_ptr<ApplicationEnableCallbackInfo> callbackPtr {asyncCallbackInfo};
1175 napi_value result[1] = {0};
1176 if (asyncCallbackInfo->err == NO_ERROR) {
1177 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
1178 } else {
1179 APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
1180 result[0] = BusinessError::CreateCommonError(
1181 env, asyncCallbackInfo->err, "SetApplicationEnabled", Constants::PERMISSION_CHANGE_ABILITY_ENABLED_STATE);
1182 }
1183 if (asyncCallbackInfo->deferred) {
1184 if (asyncCallbackInfo->err == NO_ERROR) {
1185 NAPI_CALL_RETURN_VOID(env, napi_resolve_deferred(env, asyncCallbackInfo->deferred, result[0]));
1186 } else {
1187 NAPI_CALL_RETURN_VOID(env, napi_reject_deferred(env, asyncCallbackInfo->deferred, result[0]));
1188 }
1189 } else {
1190 napi_value callback = nullptr;
1191 napi_value placeHolder = nullptr;
1192 NAPI_CALL_RETURN_VOID(env, napi_get_reference_value(env, asyncCallbackInfo->callback, &callback));
1193 NAPI_CALL_RETURN_VOID(env, napi_call_function(env, nullptr, callback,
1194 sizeof(result) / sizeof(result[0]), result, &placeHolder));
1195 }
1196 }
1197
SetApplicationEnabled(napi_env env,napi_callback_info info)1198 napi_value SetApplicationEnabled(napi_env env, napi_callback_info info)
1199 {
1200 APP_LOGD("begin to SetApplicationEnabled");
1201 NapiArg args(env, info);
1202 ApplicationEnableCallbackInfo *asyncCallbackInfo = new (std::nothrow) ApplicationEnableCallbackInfo(env);
1203 if (asyncCallbackInfo == nullptr) {
1204 APP_LOGE("asyncCallbackInfo is null.");
1205 return nullptr;
1206 }
1207 std::unique_ptr<ApplicationEnableCallbackInfo> callbackPtr {asyncCallbackInfo};
1208 if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_THREE)) {
1209 APP_LOGE("Napi func init failed");
1210 return nullptr;
1211 }
1212 if (args.GetMaxArgc() >= ARGS_SIZE_TWO) {
1213 if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], asyncCallbackInfo->bundleName)) {
1214 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
1215 return nullptr;
1216 }
1217 if (!CommonFunc::ParseBool(env, args[ARGS_POS_ONE], asyncCallbackInfo->isEnable)) {
1218 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, IS_ENABLE, TYPE_BOOLEAN);
1219 return nullptr;
1220 }
1221 if (args.GetMaxArgc() == ARGS_SIZE_THREE) {
1222 napi_valuetype valueType = napi_undefined;
1223 napi_typeof(env, args[ARGS_POS_TWO], &valueType);
1224 if (valueType == napi_function) {
1225 NAPI_CALL(env, napi_create_reference(env, args[ARGS_POS_TWO],
1226 NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
1227 }
1228 }
1229 } else {
1230 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1231 return nullptr;
1232 }
1233 auto promise = CommonFunc::AsyncCallNativeMethod<ApplicationEnableCallbackInfo>(
1234 env, asyncCallbackInfo, "SetApplicationEnabled", SetApplicationEnabledExec, SetApplicationEnabledComplete);
1235 callbackPtr.release();
1236 APP_LOGD("call SetApplicationEnabled done.");
1237 return promise;
1238 }
1239
SetAbilityEnabledExec(napi_env env,void * data)1240 void SetAbilityEnabledExec(napi_env env, void *data)
1241 {
1242 AbilityEnableCallbackInfo *asyncCallbackInfo = reinterpret_cast<AbilityEnableCallbackInfo *>(data);
1243 if (asyncCallbackInfo == nullptr) {
1244 APP_LOGE("%{public}s, asyncCallbackInfo == nullptr.", __func__);
1245 return;
1246 }
1247 asyncCallbackInfo->err = InnerSetAbilityEnabled(asyncCallbackInfo->abilityInfo,
1248 asyncCallbackInfo->isEnable);
1249 }
1250
SetAbilityEnabledComplete(napi_env env,napi_status status,void * data)1251 void SetAbilityEnabledComplete(napi_env env, napi_status status, void *data)
1252 {
1253 AbilityEnableCallbackInfo *asyncCallbackInfo = reinterpret_cast<AbilityEnableCallbackInfo *>(data);
1254 if (asyncCallbackInfo == nullptr) {
1255 APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
1256 return;
1257 }
1258 std::unique_ptr<AbilityEnableCallbackInfo> callbackPtr {asyncCallbackInfo};
1259 napi_value result[1] = {0};
1260 if (asyncCallbackInfo->err == NO_ERROR) {
1261 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
1262 } else {
1263 APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
1264 result[0] = BusinessError::CreateCommonError(
1265 env, asyncCallbackInfo->err, "SetAbilityEnabled", Constants::PERMISSION_CHANGE_ABILITY_ENABLED_STATE);
1266 }
1267 if (asyncCallbackInfo->deferred) {
1268 if (asyncCallbackInfo->err == NO_ERROR) {
1269 NAPI_CALL_RETURN_VOID(env, napi_resolve_deferred(env, asyncCallbackInfo->deferred, result[0]));
1270 } else {
1271 NAPI_CALL_RETURN_VOID(env, napi_reject_deferred(env, asyncCallbackInfo->deferred, result[0]));
1272 }
1273 } else {
1274 napi_value callback = nullptr;
1275 napi_value placeHolder = nullptr;
1276 NAPI_CALL_RETURN_VOID(env, napi_get_reference_value(env, asyncCallbackInfo->callback, &callback));
1277 NAPI_CALL_RETURN_VOID(env, napi_call_function(env, nullptr, callback,
1278 sizeof(result) / sizeof(result[0]), result, &placeHolder));
1279 }
1280 }
1281
SetAbilityEnabled(napi_env env,napi_callback_info info)1282 napi_value SetAbilityEnabled(napi_env env, napi_callback_info info)
1283 {
1284 APP_LOGD("begin to SetAbilityEnabled");
1285 NapiArg args(env, info);
1286 AbilityEnableCallbackInfo *asyncCallbackInfo = new (std::nothrow) AbilityEnableCallbackInfo(env);
1287 if (asyncCallbackInfo == nullptr) {
1288 APP_LOGE("asyncCallbackInfo is null.");
1289 return nullptr;
1290 }
1291 std::unique_ptr<AbilityEnableCallbackInfo> callbackPtr {asyncCallbackInfo};
1292 if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_THREE)) {
1293 APP_LOGE("Napi func init failed");
1294 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1295 return nullptr;
1296 }
1297 if (args.GetMaxArgc() >= ARGS_SIZE_TWO) {
1298 if (!CommonFunc::ParseAbilityInfo(env, args[ARGS_POS_ZERO], asyncCallbackInfo->abilityInfo)) {
1299 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, ABILITY_INFO, TYPE_OBJECT);
1300 return nullptr;
1301 }
1302 if (!CommonFunc::ParseBool(env, args[ARGS_POS_ONE], asyncCallbackInfo->isEnable)) {
1303 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, IS_ENABLE, TYPE_BOOLEAN);
1304 return nullptr;
1305 }
1306 if (args.GetMaxArgc() == ARGS_SIZE_THREE) {
1307 napi_valuetype valueType = napi_undefined;
1308 napi_typeof(env, args[ARGS_POS_TWO], &valueType);
1309 if (valueType == napi_function) {
1310 NAPI_CALL(env, napi_create_reference(env, args[ARGS_POS_TWO],
1311 NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
1312 }
1313 }
1314 } else {
1315 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1316 return nullptr;
1317 }
1318 auto promise = CommonFunc::AsyncCallNativeMethod<AbilityEnableCallbackInfo>(
1319 env, asyncCallbackInfo, "SetAbilityEnabled", SetAbilityEnabledExec, SetAbilityEnabledComplete);
1320 callbackPtr.release();
1321 APP_LOGD("call SetAbilityEnabled done.");
1322 return promise;
1323 }
1324
IsApplicationEnabledExec(napi_env env,void * data)1325 void IsApplicationEnabledExec(napi_env env, void *data)
1326 {
1327 ApplicationEnableCallbackInfo *asyncCallbackInfo = reinterpret_cast<ApplicationEnableCallbackInfo *>(data);
1328 if (asyncCallbackInfo == nullptr) {
1329 APP_LOGE("%{public}s, asyncCallbackInfo == nullptr.", __func__);
1330 return;
1331 }
1332 asyncCallbackInfo->err = InnerIsApplicationEnabled(asyncCallbackInfo->bundleName,
1333 asyncCallbackInfo->isEnable);
1334 }
1335
IsApplicationEnabledComplete(napi_env env,napi_status status,void * data)1336 void IsApplicationEnabledComplete(napi_env env, napi_status status, void *data)
1337 {
1338 ApplicationEnableCallbackInfo *asyncCallbackInfo = reinterpret_cast<ApplicationEnableCallbackInfo *>(data);
1339 if (asyncCallbackInfo == nullptr) {
1340 APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
1341 return;
1342 }
1343 std::unique_ptr<ApplicationEnableCallbackInfo> callbackPtr {asyncCallbackInfo};
1344 napi_value result[ARGS_POS_TWO] = {0};
1345 if (asyncCallbackInfo->err == NO_ERROR) {
1346 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
1347 NAPI_CALL_RETURN_VOID(env, napi_get_boolean(env, asyncCallbackInfo->isEnable, &result[ARGS_POS_ONE]));
1348 } else {
1349 APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
1350 result[0] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err, "", "");
1351 }
1352 if (asyncCallbackInfo->deferred) {
1353 if (asyncCallbackInfo->err == NO_ERROR) {
1354 NAPI_CALL_RETURN_VOID(env, napi_resolve_deferred(env, asyncCallbackInfo->deferred, result[ARGS_POS_ONE]));
1355 } else {
1356 NAPI_CALL_RETURN_VOID(env, napi_reject_deferred(env, asyncCallbackInfo->deferred, result[0]));
1357 }
1358 } else {
1359 napi_value callback = nullptr;
1360 napi_value placeHolder = nullptr;
1361 NAPI_CALL_RETURN_VOID(env, napi_get_reference_value(env, asyncCallbackInfo->callback, &callback));
1362 NAPI_CALL_RETURN_VOID(env, napi_call_function(env, nullptr, callback,
1363 sizeof(result) / sizeof(result[0]), result, &placeHolder));
1364 }
1365 }
1366
IsApplicationEnabled(napi_env env,napi_callback_info info)1367 napi_value IsApplicationEnabled(napi_env env, napi_callback_info info)
1368 {
1369 APP_LOGD("begin to IsApplicationEnabled");
1370 NapiArg args(env, info);
1371 ApplicationEnableCallbackInfo *asyncCallbackInfo = new (std::nothrow) ApplicationEnableCallbackInfo(env);
1372 if (asyncCallbackInfo == nullptr) {
1373 APP_LOGE("asyncCallbackInfo is null.");
1374 return nullptr;
1375 }
1376 std::unique_ptr<ApplicationEnableCallbackInfo> callbackPtr {asyncCallbackInfo};
1377 if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_TWO)) {
1378 APP_LOGE("Napi func init failed");
1379 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1380 return nullptr;
1381 }
1382 if (args.GetMaxArgc() >= ARGS_SIZE_ONE) {
1383 if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], asyncCallbackInfo->bundleName)) {
1384 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
1385 return nullptr;
1386 }
1387 if (args.GetMaxArgc() == ARGS_POS_TWO) {
1388 napi_valuetype valueType = napi_undefined;
1389 napi_typeof(env, args[ARGS_POS_ONE], &valueType);
1390 if (valueType == napi_function) {
1391 NAPI_CALL(env, napi_create_reference(env, args[ARGS_POS_ONE],
1392 NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
1393 }
1394 }
1395 } else {
1396 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1397 return nullptr;
1398 }
1399 auto promise = CommonFunc::AsyncCallNativeMethod<ApplicationEnableCallbackInfo>(
1400 env, asyncCallbackInfo, "IsSetApplicationEnabled", IsApplicationEnabledExec, IsApplicationEnabledComplete);
1401 callbackPtr.release();
1402 APP_LOGD("call IsSetApplicationEnabled done.");
1403 return promise;
1404 }
1405
IsAbilityEnabledExec(napi_env env,void * data)1406 void IsAbilityEnabledExec(napi_env env, void *data)
1407 {
1408 AbilityEnableCallbackInfo *asyncCallbackInfo = reinterpret_cast<AbilityEnableCallbackInfo *>(data);
1409 if (asyncCallbackInfo == nullptr) {
1410 APP_LOGE("%{public}s, asyncCallbackInfo == nullptr.", __func__);
1411 return;
1412 }
1413 asyncCallbackInfo->err = InnerIsAbilityEnabled(asyncCallbackInfo->abilityInfo,
1414 asyncCallbackInfo->isEnable);
1415 }
1416
IsAbilityEnabledComplete(napi_env env,napi_status status,void * data)1417 void IsAbilityEnabledComplete(napi_env env, napi_status status, void *data)
1418 {
1419 AbilityEnableCallbackInfo *asyncCallbackInfo = reinterpret_cast<AbilityEnableCallbackInfo *>(data);
1420 if (asyncCallbackInfo == nullptr) {
1421 APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
1422 return;
1423 }
1424 std::unique_ptr<AbilityEnableCallbackInfo> callbackPtr {asyncCallbackInfo};
1425 napi_value result[ARGS_POS_TWO] = {0};
1426 if (asyncCallbackInfo->err == NO_ERROR) {
1427 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
1428 NAPI_CALL_RETURN_VOID(env, napi_get_boolean(env, asyncCallbackInfo->isEnable, &result[ARGS_POS_ONE]));
1429 } else {
1430 APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
1431 result[0] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err, "", "");
1432 }
1433 if (asyncCallbackInfo->deferred) {
1434 if (asyncCallbackInfo->err == NO_ERROR) {
1435 NAPI_CALL_RETURN_VOID(env, napi_resolve_deferred(env, asyncCallbackInfo->deferred, result[ARGS_POS_ONE]));
1436 } else {
1437 NAPI_CALL_RETURN_VOID(env, napi_reject_deferred(env, asyncCallbackInfo->deferred, result[0]));
1438 }
1439 } else {
1440 napi_value callback = nullptr;
1441 napi_value placeHolder = nullptr;
1442 NAPI_CALL_RETURN_VOID(env, napi_get_reference_value(env, asyncCallbackInfo->callback, &callback));
1443 NAPI_CALL_RETURN_VOID(env, napi_call_function(env, nullptr, callback,
1444 sizeof(result) / sizeof(result[0]), result, &placeHolder));
1445 }
1446 }
1447
IsAbilityEnabled(napi_env env,napi_callback_info info)1448 napi_value IsAbilityEnabled(napi_env env, napi_callback_info info)
1449 {
1450 APP_LOGI("begin to IsAbilityEnabled");
1451 NapiArg args(env, info);
1452 AbilityEnableCallbackInfo *asyncCallbackInfo = new (std::nothrow) AbilityEnableCallbackInfo(env);
1453 if (asyncCallbackInfo == nullptr) {
1454 APP_LOGE("asyncCallbackInfo is null.");
1455 return nullptr;
1456 }
1457 std::unique_ptr<AbilityEnableCallbackInfo> callbackPtr {asyncCallbackInfo};
1458 if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_TWO)) {
1459 APP_LOGE("Napi func init failed");
1460 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1461 return nullptr;
1462 }
1463 if (args.GetMaxArgc() >= ARGS_SIZE_ONE) {
1464 if (!CommonFunc::ParseAbilityInfo(env, args[ARGS_POS_ZERO], asyncCallbackInfo->abilityInfo)) {
1465 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, ABILITY_INFO, TYPE_OBJECT);
1466 return nullptr;
1467 }
1468 if (args.GetMaxArgc() == ARGS_SIZE_TWO) {
1469 napi_valuetype valueType = napi_undefined;
1470 napi_typeof(env, args[ARGS_POS_ONE], &valueType);
1471 if (valueType == napi_function) {
1472 NAPI_CALL(env, napi_create_reference(env, args[ARGS_POS_ONE],
1473 NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
1474 }
1475 }
1476 } else {
1477 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1478 return nullptr;
1479 }
1480 auto promise = CommonFunc::AsyncCallNativeMethod<AbilityEnableCallbackInfo>(
1481 env, asyncCallbackInfo, "IsAbilityEnabled", IsAbilityEnabledExec, IsAbilityEnabledComplete);
1482 callbackPtr.release();
1483 APP_LOGD("call SetAbilityEnabled done.");
1484 return promise;
1485 }
1486
InnerCleanBundleCacheCallback(const std::string & bundleName,const OHOS::sptr<CleanCacheCallback> & cleanCacheCallback)1487 static ErrCode InnerCleanBundleCacheCallback(
1488 const std::string& bundleName, const OHOS::sptr<CleanCacheCallback>& cleanCacheCallback)
1489 {
1490 if (cleanCacheCallback == nullptr) {
1491 APP_LOGE("callback nullptr");
1492 return ERROR_BUNDLE_SERVICE_EXCEPTION;
1493 }
1494 auto iBundleMgr = CommonFunc::GetBundleMgr();
1495 if (iBundleMgr == nullptr) {
1496 APP_LOGE("can not get iBundleMgr");
1497 return ERROR_BUNDLE_SERVICE_EXCEPTION;
1498 }
1499 int32_t userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
1500 ErrCode result = iBundleMgr->CleanBundleCacheFiles(bundleName, cleanCacheCallback, userId);
1501 if (result != ERR_OK) {
1502 APP_LOGE("CleanBundleDataFiles call error");
1503 }
1504 return CommonFunc::ConvertErrCode(result);
1505 }
1506
CleanBundleCacheFilesExec(napi_env env,void * data)1507 void CleanBundleCacheFilesExec(napi_env env, void *data)
1508 {
1509 CleanBundleCacheCallbackInfo* asyncCallbackInfo = reinterpret_cast<CleanBundleCacheCallbackInfo*>(data);
1510 if (asyncCallbackInfo == nullptr) {
1511 APP_LOGE("error CleanBundleCacheCallbackInfo is nullptr");
1512 return;
1513 }
1514 if (asyncCallbackInfo->cleanCacheCallback == nullptr) {
1515 asyncCallbackInfo->cleanCacheCallback = new (std::nothrow) CleanCacheCallback();
1516 }
1517 asyncCallbackInfo->err =
1518 InnerCleanBundleCacheCallback(asyncCallbackInfo->bundleName, asyncCallbackInfo->cleanCacheCallback);
1519 }
1520
CleanBundleCacheFilesComplete(napi_env env,napi_status status,void * data)1521 void CleanBundleCacheFilesComplete(napi_env env, napi_status status, void *data)
1522 {
1523 CleanBundleCacheCallbackInfo* asyncCallbackInfo = reinterpret_cast<CleanBundleCacheCallbackInfo*>(data);
1524 std::unique_ptr<CleanBundleCacheCallbackInfo> callbackPtr {asyncCallbackInfo};
1525 napi_value result[1] = { 0 };
1526 if ((asyncCallbackInfo->err == NO_ERROR) && (asyncCallbackInfo->cleanCacheCallback != nullptr)) {
1527 // wait for OnCleanCacheFinished
1528 uv_sem_wait(&(asyncCallbackInfo->cleanCacheCallback->uvSem_));
1529 asyncCallbackInfo->err = asyncCallbackInfo->cleanCacheCallback->GetErr() ?
1530 NO_ERROR : ERROR_BUNDLE_SERVICE_EXCEPTION;
1531 }
1532 // implement callback or promise
1533 if (asyncCallbackInfo->err == NO_ERROR) {
1534 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
1535 } else {
1536 result[0] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
1537 "CleanBundleCacheFiles", Constants::PERMISSION_REMOVECACHEFILE);
1538 }
1539 if (asyncCallbackInfo->deferred) {
1540 if (asyncCallbackInfo->err == NO_ERROR) {
1541 NAPI_CALL_RETURN_VOID(env, napi_resolve_deferred(env, asyncCallbackInfo->deferred, result[0]));
1542 } else {
1543 NAPI_CALL_RETURN_VOID(env, napi_reject_deferred(env, asyncCallbackInfo->deferred, result[0]));
1544 }
1545 } else {
1546 napi_value callback = nullptr;
1547 napi_value placeHolder = nullptr;
1548 NAPI_CALL_RETURN_VOID(env, napi_get_reference_value(env, asyncCallbackInfo->callback, &callback));
1549 NAPI_CALL_RETURN_VOID(env, napi_call_function(env, nullptr, callback,
1550 sizeof(result) / sizeof(result[0]), result, &placeHolder));
1551 }
1552 }
1553
CleanBundleCacheFiles(napi_env env,napi_callback_info info)1554 napi_value CleanBundleCacheFiles(napi_env env, napi_callback_info info)
1555 {
1556 APP_LOGD("napi begin to CleanBundleCacheFiles");
1557 NapiArg args(env, info);
1558 CleanBundleCacheCallbackInfo *asyncCallbackInfo = new (std::nothrow) CleanBundleCacheCallbackInfo(env);
1559 if (asyncCallbackInfo == nullptr) {
1560 APP_LOGE("CleanBundleCacheFiles asyncCallbackInfo is null.");
1561 return nullptr;
1562 }
1563 std::unique_ptr<CleanBundleCacheCallbackInfo> callbackPtr {asyncCallbackInfo};
1564 if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_TWO)) {
1565 APP_LOGE("CleanBundleCacheFiles napi func init failed");
1566 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1567 return nullptr;
1568 }
1569 size_t maxArgc = args.GetMaxArgc();
1570 if (maxArgc >= ARGS_SIZE_ONE) {
1571 if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], asyncCallbackInfo->bundleName)) {
1572 APP_LOGE("CleanBundleCacheFiles bundleName is not a string!");
1573 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, PARAMETER_BUNDLE_NAME, TYPE_STRING);
1574 return nullptr;
1575 }
1576 if (maxArgc >= ARGS_SIZE_TWO) {
1577 napi_valuetype valueType = napi_undefined;
1578 napi_typeof(env, args[ARGS_POS_ONE], &valueType);
1579 if (valueType == napi_function) {
1580 NAPI_CALL(env, napi_create_reference(env, args[ARGS_POS_ONE],
1581 NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
1582 }
1583 }
1584 } else {
1585 APP_LOGE("param error.");
1586 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1587 return nullptr;
1588 }
1589 auto promise = CommonFunc::AsyncCallNativeMethod<CleanBundleCacheCallbackInfo>(
1590 env, asyncCallbackInfo, "CleanBundleCacheFiles", CleanBundleCacheFilesExec, CleanBundleCacheFilesComplete);
1591 callbackPtr.release();
1592 APP_LOGD("napi call CleanBundleCacheFiles done");
1593 return promise;
1594 }
1595
InnerGetLaunchWantForBundleExec(const std::string & bundleName,Want & want,int32_t userId)1596 static ErrCode InnerGetLaunchWantForBundleExec(
1597 const std::string& bundleName, Want &want, int32_t userId)
1598 {
1599 auto iBundleMgr = CommonFunc::GetBundleMgr();
1600 if (iBundleMgr == nullptr) {
1601 APP_LOGE("can not get iBundleMgr");
1602 return ERROR_BUNDLE_SERVICE_EXCEPTION;
1603 }
1604
1605 ErrCode result = iBundleMgr->GetLaunchWantForBundle(bundleName, want, userId);
1606 if (result != ERR_OK) {
1607 APP_LOGE("GetLaunchWantForBundle call error");
1608 }
1609
1610 return CommonFunc::ConvertErrCode(result);
1611 }
1612
GetLaunchWantForBundleExec(napi_env env,void * data)1613 void GetLaunchWantForBundleExec(napi_env env, void *data)
1614 {
1615 LaunchWantCallbackInfo* asyncCallbackInfo = reinterpret_cast<LaunchWantCallbackInfo*>(data);
1616 if (asyncCallbackInfo == nullptr) {
1617 APP_LOGE("error LaunchWantCallbackInfo is nullptr");
1618 return;
1619 }
1620
1621 asyncCallbackInfo->err = InnerGetLaunchWantForBundleExec(
1622 asyncCallbackInfo->bundleName, asyncCallbackInfo->want, asyncCallbackInfo->userId);
1623 }
1624
GetLaunchWantForBundleComplete(napi_env env,napi_status status,void * data)1625 void GetLaunchWantForBundleComplete(napi_env env, napi_status status, void *data)
1626 {
1627 LaunchWantCallbackInfo *asyncCallbackInfo = reinterpret_cast<LaunchWantCallbackInfo *>(data);
1628 if (asyncCallbackInfo == nullptr) {
1629 APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
1630 return;
1631 }
1632
1633 std::unique_ptr<LaunchWantCallbackInfo> callbackPtr {asyncCallbackInfo};
1634 napi_value result[ARGS_POS_TWO] = {0};
1635 if (asyncCallbackInfo->err == NO_ERROR) {
1636 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
1637 NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &result[1]));
1638 CommonFunc::ConvertWantInfo(env, result[1], asyncCallbackInfo->want);
1639 } else {
1640 result[0] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err, GET_LAUNCH_WANT_FOR_BUNDLE,
1641 BUNDLE_PERMISSIONS);
1642 }
1643
1644 if (asyncCallbackInfo->deferred) {
1645 if (asyncCallbackInfo->err == NO_ERROR) {
1646 NAPI_CALL_RETURN_VOID(env, napi_resolve_deferred(env, asyncCallbackInfo->deferred, result[1]));
1647 } else {
1648 NAPI_CALL_RETURN_VOID(env, napi_reject_deferred(env, asyncCallbackInfo->deferred, result[0]));
1649 }
1650 } else {
1651 napi_value callback = nullptr;
1652 napi_value placeHolder = nullptr;
1653 NAPI_CALL_RETURN_VOID(env, napi_get_reference_value(env, asyncCallbackInfo->callback, &callback));
1654 NAPI_CALL_RETURN_VOID(env, napi_call_function(env, nullptr, callback,
1655 sizeof(result) / sizeof(result[0]), result, &placeHolder));
1656 }
1657 }
1658
GetLaunchWantForBundle(napi_env env,napi_callback_info info)1659 napi_value GetLaunchWantForBundle(napi_env env, napi_callback_info info)
1660 {
1661 APP_LOGD("napi begin to GetLaunchWantForBundle");
1662 NapiArg args(env, info);
1663 LaunchWantCallbackInfo *asyncCallbackInfo = new (std::nothrow) LaunchWantCallbackInfo(env);
1664 if (asyncCallbackInfo == nullptr) {
1665 APP_LOGE("GetLaunchWantForBundle asyncCallbackInfo is null.");
1666 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1667 return nullptr;
1668 }
1669
1670 std::unique_ptr<LaunchWantCallbackInfo> callbackPtr {asyncCallbackInfo};
1671 if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_THREE)) {
1672 APP_LOGE("GetLaunchWantForBundle napi func init failed");
1673 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1674 return nullptr;
1675 }
1676 size_t maxArgc = args.GetMaxArgc();
1677 for (size_t i = 0; i < maxArgc; ++i) {
1678 napi_valuetype valueType = napi_undefined;
1679 napi_typeof(env, args[i], &valueType);
1680 if (i == ARGS_POS_ZERO) {
1681 if (valueType != napi_string) {
1682 APP_LOGE("GetLaunchWantForBundle bundleName is not a string!");
1683 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, STRING_TYPE);
1684 return nullptr;
1685 }
1686 CommonFunc::ParseString(env, args[i], asyncCallbackInfo->bundleName);
1687 } else if (i == ARGS_POS_ONE) {
1688 if (valueType == napi_number) {
1689 if (CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->userId) == nullptr) {
1690 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, USER_ID, NUMBER_TYPE);
1691 return nullptr;
1692 }
1693 } else if (valueType == napi_function) {
1694 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
1695 } else {
1696 APP_LOGE("GetLaunchWantForBundle param check error");
1697 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, WRONG_PARAM_TYPE);
1698 return nullptr;
1699 }
1700 } else if (i == ARGS_POS_TWO) {
1701 if (valueType == napi_function) {
1702 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
1703 } else {
1704 APP_LOGE("GetLaunchWantForBundle param check error");
1705 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, CALLBACK, FUNCTION_TYPE);
1706 return nullptr;
1707 }
1708 } else {
1709 APP_LOGE("GetLaunchWantForBundle arg err!");
1710 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1711 return nullptr;
1712 }
1713 }
1714 auto promise = CommonFunc::AsyncCallNativeMethod<LaunchWantCallbackInfo>(
1715 env, asyncCallbackInfo, "GetLaunchWantForBundle", GetLaunchWantForBundleExec, GetLaunchWantForBundleComplete);
1716 callbackPtr.release();
1717 APP_LOGD("napi call GetLaunchWantForBundle done");
1718 return promise;
1719 }
1720
GetAbilityFromBundleInfo(const BundleInfo & bundleInfo,const std::string & abilityName,const std::string & moduleName,AbilityInfo & targetAbilityInfo)1721 ErrCode GetAbilityFromBundleInfo(const BundleInfo& bundleInfo, const std::string& abilityName,
1722 const std::string& moduleName, AbilityInfo& targetAbilityInfo)
1723 {
1724 bool ifExists = false;
1725 for (const auto& hapModuleInfo : bundleInfo.hapModuleInfos) {
1726 auto it = find_if(std::begin(hapModuleInfo.abilityInfos),
1727 std::end(hapModuleInfo.abilityInfos), [abilityName, moduleName](AbilityInfo abilityInfo) {
1728 return abilityInfo.name == abilityName && abilityInfo.moduleName == moduleName;
1729 });
1730 if (it != hapModuleInfo.abilityInfos.end()) {
1731 ifExists = true;
1732 targetAbilityInfo = *it;
1733 break;
1734 }
1735 if (ifExists) {
1736 break;
1737 }
1738 }
1739 if (!ifExists) {
1740 APP_LOGE("ability not exist");
1741 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
1742 }
1743 return ERR_OK;
1744 }
1745
GetExtensionFromBundleInfo(const BundleInfo & bundleInfo,const std::string & abilityName,const std::string & moduleName,ExtensionAbilityInfo & targetExtensionInfo)1746 ErrCode GetExtensionFromBundleInfo(const BundleInfo& bundleInfo, const std::string& abilityName,
1747 const std::string& moduleName, ExtensionAbilityInfo& targetExtensionInfo)
1748 {
1749 bool ifExists = false;
1750 for (const auto& hapModuleInfo : bundleInfo.hapModuleInfos) {
1751 auto it = find_if(std::begin(hapModuleInfo.extensionInfos),
1752 std::end(hapModuleInfo.extensionInfos), [abilityName, moduleName](ExtensionAbilityInfo extensionInfo) {
1753 return extensionInfo.name == abilityName && extensionInfo.moduleName == moduleName;
1754 });
1755 if (it != hapModuleInfo.extensionInfos.end()) {
1756 ifExists = true;
1757 targetExtensionInfo = *it;
1758 break;
1759 }
1760 if (ifExists) {
1761 break;
1762 }
1763 }
1764 if (!ifExists) {
1765 APP_LOGE("ability not exist");
1766 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
1767 }
1768 return ERR_OK;
1769 }
1770
InnerGetProfile(GetProfileCallbackInfo & info)1771 static ErrCode InnerGetProfile(GetProfileCallbackInfo &info)
1772 {
1773 auto iBundleMgr = CommonFunc::GetBundleMgr();
1774 if (iBundleMgr == nullptr) {
1775 APP_LOGE("can not get iBundleMgr");
1776 return ERROR_BUNDLE_SERVICE_EXCEPTION;
1777 }
1778
1779 if (info.abilityName.empty()) {
1780 APP_LOGE("InnerGetProfile failed due to empty abilityName");
1781 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
1782 }
1783
1784 if (info.moduleName.empty()) {
1785 APP_LOGE("InnerGetProfile failed due to empty moduleName");
1786 return ERR_BUNDLE_MANAGER_MODULE_NOT_EXIST;
1787 }
1788 auto baseFlag = static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE) +
1789 static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_METADATA);
1790 ErrCode result;
1791 BundleMgrClient client;
1792 BundleInfo bundleInfo;
1793 if (info.type == ProfileType::ABILITY_PROFILE) {
1794 auto getAbilityFlag = baseFlag +
1795 static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_ABILITY);
1796 result = iBundleMgr->GetBundleInfoForSelf(getAbilityFlag, bundleInfo);
1797 if (result != ERR_OK) {
1798 APP_LOGE("GetBundleInfoForSelf failed");
1799 return result;
1800 }
1801 AbilityInfo targetAbilityInfo;
1802 result = GetAbilityFromBundleInfo(
1803 bundleInfo, info.abilityName, info.moduleName, targetAbilityInfo);
1804 if (result != ERR_OK) {
1805 return result;
1806 }
1807 if (!client.GetProfileFromAbility(targetAbilityInfo, info.metadataName, info.profileVec)) {
1808 APP_LOGE("GetProfileFromExtension failed");
1809 return ERR_BUNDLE_MANAGER_PROFILE_NOT_EXIST;
1810 }
1811 return ERR_OK;
1812 }
1813
1814 if (info.type == ProfileType::EXTENSION_PROFILE) {
1815 auto getExtensionFlag = baseFlag +
1816 static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_EXTENSION_ABILITY);
1817 result = iBundleMgr->GetBundleInfoForSelf(getExtensionFlag, bundleInfo);
1818 if (result != ERR_OK) {
1819 APP_LOGE("GetBundleInfoForSelf failed");
1820 return result;
1821 }
1822
1823 ExtensionAbilityInfo targetExtensionInfo;
1824 result = GetExtensionFromBundleInfo(
1825 bundleInfo, info.abilityName, info.moduleName, targetExtensionInfo);
1826 if (result != ERR_OK) {
1827 return result;
1828 }
1829 if (!client.GetProfileFromExtension(targetExtensionInfo, info.metadataName, info.profileVec)) {
1830 APP_LOGE("GetProfileFromExtension failed");
1831 return ERR_BUNDLE_MANAGER_PROFILE_NOT_EXIST;
1832 }
1833 return ERR_OK;
1834 }
1835
1836 APP_LOGE("InnerGetProfile failed due to type is invalid");
1837 return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
1838 }
1839
GetProfileExec(napi_env env,void * data)1840 void GetProfileExec(napi_env env, void *data)
1841 {
1842 GetProfileCallbackInfo* asyncCallbackInfo = reinterpret_cast<GetProfileCallbackInfo*>(data);
1843 if (asyncCallbackInfo == nullptr) {
1844 APP_LOGE("error GetProfileCallbackInfo is nullptr");
1845 return;
1846 }
1847
1848 ErrCode result = InnerGetProfile(*asyncCallbackInfo);
1849 asyncCallbackInfo->err = CommonFunc::ConvertErrCode(result);
1850 }
1851
GetProfileComplete(napi_env env,napi_status status,void * data)1852 void GetProfileComplete(napi_env env, napi_status status, void *data)
1853 {
1854 GetProfileCallbackInfo *asyncCallbackInfo = reinterpret_cast<GetProfileCallbackInfo *>(data);
1855 if (asyncCallbackInfo == nullptr) {
1856 APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
1857 return;
1858 }
1859
1860 std::unique_ptr<GetProfileCallbackInfo> callbackPtr {asyncCallbackInfo};
1861 napi_value result[ARGS_POS_TWO] = {0};
1862 if (asyncCallbackInfo->err == NO_ERROR) {
1863 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
1864 NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &result[1]));
1865 CommonFunc::ConvertStringArrays(env, asyncCallbackInfo->profileVec, result[1]);
1866 } else {
1867 result[0] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err, "", "");
1868 }
1869
1870 if (asyncCallbackInfo->deferred) {
1871 if (asyncCallbackInfo->err == NO_ERROR) {
1872 NAPI_CALL_RETURN_VOID(env, napi_resolve_deferred(env, asyncCallbackInfo->deferred, result[1]));
1873 } else {
1874 NAPI_CALL_RETURN_VOID(env, napi_reject_deferred(env, asyncCallbackInfo->deferred, result[0]));
1875 }
1876 } else {
1877 napi_value callback = nullptr;
1878 napi_value placeHolder = nullptr;
1879 NAPI_CALL_RETURN_VOID(env, napi_get_reference_value(env, asyncCallbackInfo->callback, &callback));
1880 NAPI_CALL_RETURN_VOID(env, napi_call_function(env, nullptr, callback,
1881 sizeof(result) / sizeof(result[0]), result, &placeHolder));
1882 }
1883 }
1884
GetProfile(napi_env env,napi_callback_info info,const ProfileType & profileType)1885 napi_value GetProfile(napi_env env, napi_callback_info info, const ProfileType &profileType)
1886 {
1887 APP_LOGD("napi begin to GetProfile");
1888 NapiArg args(env, info);
1889 GetProfileCallbackInfo *asyncCallbackInfo = new (std::nothrow) GetProfileCallbackInfo(env);
1890 if (asyncCallbackInfo == nullptr) {
1891 APP_LOGE("GetProfile asyncCallbackInfo is null.");
1892 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1893 return nullptr;
1894 }
1895
1896 asyncCallbackInfo->type = profileType;
1897 std::unique_ptr<GetProfileCallbackInfo> callbackPtr {asyncCallbackInfo};
1898 if (!args.Init(ARGS_POS_TWO, ARGS_SIZE_FOUR)) {
1899 APP_LOGE("GetProfile napi func init failed");
1900 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1901 return nullptr;
1902 }
1903 size_t maxArgc = args.GetMaxArgc();
1904 for (size_t i = 0; i < maxArgc; ++i) {
1905 napi_valuetype valueType = napi_undefined;
1906 napi_typeof(env, args[i], &valueType);
1907 if (i == ARGS_POS_ZERO) {
1908 if (valueType != napi_string) {
1909 APP_LOGE("GetProfile moduleName is not a string!");
1910 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, MODULE_NAME, STRING_TYPE);
1911 return nullptr;
1912 }
1913 CommonFunc::ParseString(env, args[i], asyncCallbackInfo->moduleName);
1914 } else if (i == ARGS_POS_ONE) {
1915 if (valueType != napi_string) {
1916 APP_LOGE("GetProfile abilityName is not a string!");
1917 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, ABILITY_NAME, STRING_TYPE);
1918 return nullptr;
1919 }
1920 CommonFunc::ParseString(env, args[i], asyncCallbackInfo->abilityName);
1921 } else if (i == ARGS_POS_TWO) {
1922 if (valueType != napi_string) {
1923 APP_LOGE("GetProfile metaData name is not a string!");
1924 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, METADATA_NAME, STRING_TYPE);
1925 return nullptr;
1926 }
1927 CommonFunc::ParseString(env, args[i], asyncCallbackInfo->metadataName);
1928 } else if (i == ARGS_POS_THREE) {
1929 if (valueType != napi_function) {
1930 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, CALLBACK, FUNCTION_TYPE);
1931 return nullptr;
1932 }
1933 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
1934 break;
1935 } else {
1936 APP_LOGE("GetProfile arg err!");
1937 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1938 return nullptr;
1939 }
1940 }
1941 auto promise = CommonFunc::AsyncCallNativeMethod<GetProfileCallbackInfo>(
1942 env, asyncCallbackInfo, "GetProfile", GetProfileExec, GetProfileComplete);
1943 callbackPtr.release();
1944 APP_LOGD("napi call GetProfile done");
1945 return promise;
1946 }
1947
GetProfileByAbility(napi_env env,napi_callback_info info)1948 napi_value GetProfileByAbility(napi_env env, napi_callback_info info)
1949 {
1950 APP_LOGD("napi begin to GetProfileByAbility");
1951 return GetProfile(env, info, ProfileType::ABILITY_PROFILE);
1952 }
1953
GetProfileByExAbility(napi_env env,napi_callback_info info)1954 napi_value GetProfileByExAbility(napi_env env, napi_callback_info info)
1955 {
1956 APP_LOGD("napi begin to GetProfileByExAbility");
1957 return GetProfile(env, info, ProfileType::EXTENSION_PROFILE);
1958 }
1959
CreateExtensionAbilityFlagObject(napi_env env,napi_value value)1960 void CreateExtensionAbilityFlagObject(napi_env env, napi_value value)
1961 {
1962 napi_value nGetExtensionAbilityInfoDefault;
1963 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
1964 GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_DEFAULT), &nGetExtensionAbilityInfoDefault));
1965 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_EXTENSION_ABILITY_INFO_DEFAULT",
1966 nGetExtensionAbilityInfoDefault));
1967
1968 napi_value nGetExtensionAbilityInfoWithPermission;
1969 NAPI_CALL_RETURN_VOID(env,
1970 napi_create_int32(env, static_cast<int32_t>(
1971 GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_PERMISSION),
1972 &nGetExtensionAbilityInfoWithPermission));
1973 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_EXTENSION_ABILITY_INFO_WITH_PERMISSION",
1974 nGetExtensionAbilityInfoWithPermission));
1975
1976 napi_value nGetExtensionAbilityInfoWithApplication;
1977 NAPI_CALL_RETURN_VOID(env,
1978 napi_create_int32(env, static_cast<int32_t>(
1979 GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_APPLICATION),
1980 &nGetExtensionAbilityInfoWithApplication));
1981 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_EXTENSION_ABILITY_INFO_WITH_APPLICATION",
1982 nGetExtensionAbilityInfoWithApplication));
1983
1984 napi_value nGetExtensionAbilityInfoWithMetadata;
1985 NAPI_CALL_RETURN_VOID(env,
1986 napi_create_int32(env, static_cast<int32_t>(
1987 GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_METADATA),
1988 &nGetExtensionAbilityInfoWithMetadata));
1989 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_EXTENSION_ABILITY_INFO_WITH_METADATA",
1990 nGetExtensionAbilityInfoWithMetadata));
1991 }
1992
CreateExtensionAbilityTypeObject(napi_env env,napi_value value)1993 void CreateExtensionAbilityTypeObject(napi_env env, napi_value value)
1994 {
1995 napi_value nForm;
1996 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::FORM), &nForm));
1997 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "FORM", nForm));
1998
1999 napi_value nWorkSchedule;
2000 NAPI_CALL_RETURN_VOID(env,
2001 napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::WORK_SCHEDULER), &nWorkSchedule));
2002 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "WORK_SCHEDULER", nWorkSchedule));
2003
2004 napi_value nInputMethod;
2005 NAPI_CALL_RETURN_VOID(env,
2006 napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::INPUTMETHOD), &nInputMethod));
2007 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "INPUT_METHOD", nInputMethod));
2008
2009 napi_value nService;
2010 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::SERVICE), &nService));
2011 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SERVICE", nService));
2012
2013 napi_value nAccessibility;
2014 NAPI_CALL_RETURN_VOID(env,
2015 napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::ACCESSIBILITY), &nAccessibility));
2016 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "ACCESSIBILITY", nAccessibility));
2017
2018 napi_value nDataShare;
2019 NAPI_CALL_RETURN_VOID(env,
2020 napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::DATASHARE), &nDataShare));
2021 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "DATA_SHARE", nDataShare));
2022
2023 napi_value nFileShare;
2024 NAPI_CALL_RETURN_VOID(env,
2025 napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::FILESHARE), &nFileShare));
2026 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "FILE_SHARE", nFileShare));
2027
2028 napi_value nStaticSubscriber;
2029 NAPI_CALL_RETURN_VOID(env,
2030 napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::STATICSUBSCRIBER), &nStaticSubscriber));
2031 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "STATIC_SUBSCRIBER", nStaticSubscriber));
2032
2033 napi_value nWallpaper;
2034 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
2035 static_cast<int32_t>(ExtensionAbilityType::WALLPAPER), &nWallpaper));
2036 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "WALLPAPER", nWallpaper));
2037
2038 napi_value nBackup;
2039 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
2040 static_cast<int32_t>(ExtensionAbilityType::BACKUP), &nBackup));
2041 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "BACKUP", nBackup));
2042
2043 napi_value nWindow;
2044 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
2045 static_cast<int32_t>(ExtensionAbilityType::WINDOW), &nWindow));
2046 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "WINDOW", nWindow));
2047
2048 napi_value nEnterpriseAdmin;
2049 NAPI_CALL_RETURN_VOID(env,
2050 napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::ENTERPRISE_ADMIN), &nEnterpriseAdmin));
2051 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "ENTERPRISE_ADMIN", nEnterpriseAdmin));
2052
2053 napi_value nTHUMBNAIL;
2054 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
2055 static_cast<int32_t>(ExtensionAbilityType::THUMBNAIL), &nTHUMBNAIL));
2056 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "THUMBNAIL", nTHUMBNAIL));
2057
2058 napi_value nPREVIEW;
2059 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
2060 static_cast<int32_t>(ExtensionAbilityType::PREVIEW), &nPREVIEW));
2061 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "PREVIEW", nPREVIEW));
2062
2063 napi_value nUnspecified;
2064 NAPI_CALL_RETURN_VOID(env,
2065 napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::UNSPECIFIED), &nUnspecified));
2066 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "UNSPECIFIED", nUnspecified));
2067 }
2068
CreateApplicationFlagObject(napi_env env,napi_value value)2069 void CreateApplicationFlagObject(napi_env env, napi_value value)
2070 {
2071 napi_value nGetApplicationInfoDefault;
2072 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
2073 GetApplicationFlag::GET_APPLICATION_INFO_DEFAULT), &nGetApplicationInfoDefault));
2074 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_APPLICATION_INFO_DEFAULT",
2075 nGetApplicationInfoDefault));
2076
2077 napi_value nGetApplicationInfoWithPermission;
2078 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
2079 GetApplicationFlag::GET_APPLICATION_INFO_WITH_PERMISSION), &nGetApplicationInfoWithPermission));
2080 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_APPLICATION_INFO_WITH_PERMISSION",
2081 nGetApplicationInfoWithPermission));
2082
2083 napi_value nGetApplicationInfoWithMetadata;
2084 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
2085 GetApplicationFlag::GET_APPLICATION_INFO_WITH_METADATA), &nGetApplicationInfoWithMetadata));
2086 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_APPLICATION_INFO_WITH_METADATA",
2087 nGetApplicationInfoWithMetadata));
2088
2089 napi_value nGetApplicationInfoWithDisable;
2090 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
2091 GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE), &nGetApplicationInfoWithDisable));
2092 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_APPLICATION_INFO_WITH_DISABLE",
2093 nGetApplicationInfoWithDisable));
2094 }
2095
InnerGetPermissionDef(const std::string & permissionName,PermissionDef & permissionDef)2096 static ErrCode InnerGetPermissionDef(const std::string &permissionName, PermissionDef &permissionDef)
2097 {
2098 auto iBundleMgr = CommonFunc::GetBundleMgr();
2099 if (iBundleMgr == nullptr) {
2100 APP_LOGE("can not get iBundleMgr");
2101 return ERROR_BUNDLE_SERVICE_EXCEPTION;
2102 }
2103 ErrCode ret = iBundleMgr->GetPermissionDef(permissionName, permissionDef);
2104 return CommonFunc::ConvertErrCode(ret);
2105 }
2106
GetPermissionDefExec(napi_env env,void * data)2107 void GetPermissionDefExec(napi_env env, void *data)
2108 {
2109 AsyncPermissionDefineCallbackInfo *asyncCallbackInfo = reinterpret_cast<AsyncPermissionDefineCallbackInfo *>(data);
2110 if (asyncCallbackInfo == nullptr) {
2111 APP_LOGE("%{public}s, asyncCallbackInfo == nullptr.", __func__);
2112 return;
2113 }
2114 if (asyncCallbackInfo->err == NO_ERROR) {
2115 asyncCallbackInfo->err = InnerGetPermissionDef(asyncCallbackInfo->permissionName,
2116 asyncCallbackInfo->permissionDef);
2117 }
2118 }
2119
GetPermissionDefComplete(napi_env env,napi_status status,void * data)2120 void GetPermissionDefComplete(napi_env env, napi_status status, void *data)
2121 {
2122 AsyncPermissionDefineCallbackInfo *asyncCallbackInfo = reinterpret_cast<AsyncPermissionDefineCallbackInfo *>(data);
2123 if (asyncCallbackInfo == nullptr) {
2124 APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
2125 return;
2126 }
2127 std::unique_ptr<AsyncPermissionDefineCallbackInfo> callbackPtr {asyncCallbackInfo};
2128 napi_value result[ARGS_SIZE_TWO] = {0};
2129 if (asyncCallbackInfo->err == NO_ERROR) {
2130 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
2131 NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &result[ARGS_POS_ONE]));
2132 CommonFunc::ConvertPermissionDef(env, result[ARGS_POS_ONE], asyncCallbackInfo->permissionDef);
2133 } else {
2134 result[0] = BusinessError::CreateCommonError(
2135 env, asyncCallbackInfo->err, GET_PERMISSION_DEF, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
2136 }
2137 if (asyncCallbackInfo->deferred) {
2138 if (asyncCallbackInfo->err == NO_ERROR) {
2139 NAPI_CALL_RETURN_VOID(env, napi_resolve_deferred(env, asyncCallbackInfo->deferred, result[ARGS_POS_ONE]));
2140 } else {
2141 NAPI_CALL_RETURN_VOID(env, napi_reject_deferred(env, asyncCallbackInfo->deferred, result[ARGS_POS_ZERO]));
2142 }
2143 } else {
2144 napi_value callback = nullptr;
2145 napi_value placeHolder = nullptr;
2146 NAPI_CALL_RETURN_VOID(env, napi_get_reference_value(env, asyncCallbackInfo->callback, &callback));
2147 NAPI_CALL_RETURN_VOID(env, napi_call_function(env, nullptr, callback,
2148 sizeof(result) / sizeof(result[ARGS_POS_ZERO]), result, &placeHolder));
2149 }
2150 }
2151
2152 /**
2153 * Promise and async callback
2154 */
GetPermissionDef(napi_env env,napi_callback_info info)2155 napi_value GetPermissionDef(napi_env env, napi_callback_info info)
2156 {
2157 APP_LOGD("GetPermissionDef called");
2158 NapiArg args(env, info);
2159 AsyncPermissionDefineCallbackInfo *asyncCallbackInfo = new (std::nothrow) AsyncPermissionDefineCallbackInfo(env);
2160 if (asyncCallbackInfo == nullptr) {
2161 APP_LOGE("asyncCallbackInfo is null.");
2162 return nullptr;
2163 }
2164 std::unique_ptr<AsyncPermissionDefineCallbackInfo> callbackPtr {asyncCallbackInfo};
2165 if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_TWO)) {
2166 APP_LOGE("param count invalid");
2167 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2168 return nullptr;
2169 }
2170 for (size_t i = 0; i < args.GetMaxArgc(); ++i) {
2171 napi_valuetype valuetype = napi_undefined;
2172 NAPI_CALL(env, napi_typeof(env, args[i], &valuetype));
2173 if (i == ARGS_POS_ZERO) {
2174 if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->permissionName)) {
2175 APP_LOGE("permissionName invalid!");
2176 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, PERMISSION_NAME, TYPE_STRING);
2177 return nullptr;
2178 }
2179 } else if (i == ARGS_POS_ONE) {
2180 if (valuetype == napi_function) {
2181 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
2182 } else {
2183 APP_LOGD("GetPermissionDef extra arg ignored");
2184 }
2185 } else {
2186 APP_LOGE("GetPermissionDef arg err!");
2187 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR);
2188 return nullptr;
2189 }
2190 }
2191
2192 auto promise = CommonFunc::AsyncCallNativeMethod<AsyncPermissionDefineCallbackInfo>(
2193 env, asyncCallbackInfo, "GetPermissionDef", GetPermissionDefExec, GetPermissionDefComplete);
2194 callbackPtr.release();
2195 return promise;
2196 }
2197
CheckToCache(napi_env env,int32_t uid,int32_t callingUid,const Query & query,napi_value jsObject)2198 static void CheckToCache(napi_env env, int32_t uid, int32_t callingUid, const Query &query, napi_value jsObject)
2199 {
2200 if (uid != callingUid) {
2201 APP_LOGE("uid %{public}d and callingUid %{public}d not equal", uid, callingUid);
2202 return;
2203 }
2204 APP_LOGD("put applicationInfo to cache");
2205 napi_ref cacheApplicationInfo = nullptr;
2206 NAPI_CALL_RETURN_VOID(env, napi_create_reference(env, jsObject, NAPI_RETURN_ONE, &cacheApplicationInfo));
2207 cache[query] = cacheApplicationInfo;
2208 }
2209
GetApplicationInfoSync(napi_env env,napi_callback_info info)2210 napi_value GetApplicationInfoSync(napi_env env, napi_callback_info info)
2211 {
2212 APP_LOGD("NAPI GetApplicationInfoSync call");
2213 NapiArg args(env, info);
2214 if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_THREE)) {
2215 APP_LOGE("param count invalid");
2216 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2217 return nullptr;
2218 }
2219 std::string bundleName;
2220 int32_t flags = 0;
2221 int32_t userId = Constants::UNSPECIFIED_USERID;
2222 for (size_t i = 0; i < args.GetArgc(); ++i) {
2223 napi_valuetype valueType = napi_undefined;
2224 napi_typeof(env, args[i], &valueType);
2225 if (i == ARGS_POS_ZERO) {
2226 if (!CommonFunc::ParseString(env, args[i], bundleName)) {
2227 APP_LOGE("bundleName %{public}s invalid", bundleName.c_str());
2228 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
2229 return nullptr;
2230 }
2231 } else if (i == ARGS_POS_ONE) {
2232 if (!CommonFunc::ParseInt(env, args[i], flags)) {
2233 APP_LOGE("parseInt failed");
2234 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, APP_FLAGS, TYPE_NUMBER);
2235 return nullptr;
2236 }
2237 } else if (i == ARGS_POS_TWO) {
2238 if (!CommonFunc::ParseInt(env, args[i], userId)) {
2239 APP_LOGE("parseInt failed");
2240 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, USER_ID, TYPE_NUMBER);
2241 return nullptr;
2242 }
2243 } else {
2244 APP_LOGE("parameter is invalid");
2245 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
2246 return nullptr;
2247 }
2248 }
2249 if (bundleName.size() == 0) {
2250 napi_value businessError = BusinessError::CreateCommonError(
2251 env, ERROR_BUNDLE_NOT_EXIST, GET_BUNDLE_INFO_SYNC, BUNDLE_PERMISSIONS);
2252 napi_throw(env, businessError);
2253 return nullptr;
2254 }
2255 if (userId == Constants::UNSPECIFIED_USERID) {
2256 userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
2257 }
2258 napi_value nApplicationInfo = nullptr;
2259 auto item = cache.find(Query(bundleName, GET_APPLICATION_INFO, flags, userId, env));
2260 if (item != cache.end()) {
2261 APP_LOGD("getApplicationInfo param from cache");
2262 NAPI_CALL(env,
2263 napi_get_reference_value(env, item->second, &nApplicationInfo));
2264 return nApplicationInfo;
2265 }
2266 auto iBundleMgr = CommonFunc::GetBundleMgr();
2267 if (iBundleMgr == nullptr) {
2268 APP_LOGE("can not get iBundleMgr");
2269 return nullptr;
2270 }
2271 AppExecFwk::ApplicationInfo appInfo;
2272 ErrCode ret = CommonFunc::ConvertErrCode(
2273 iBundleMgr->GetApplicationInfoV9(bundleName, flags, userId, appInfo));
2274 if (ret != NO_ERROR) {
2275 APP_LOGE("GetApplicationInfo failed");
2276 napi_value businessError = BusinessError::CreateCommonError(
2277 env, ret, GET_BUNDLE_INFO_SYNC, BUNDLE_PERMISSIONS);
2278 napi_throw(env, businessError);
2279 return nullptr;
2280 }
2281 NAPI_CALL(env, napi_create_object(env, &nApplicationInfo));
2282 CommonFunc::ConvertApplicationInfo(env, nApplicationInfo, appInfo);
2283 Query query(bundleName, GET_APPLICATION_INFO, flags, userId, env);
2284 CheckToCache(env, appInfo.uid, IPCSkeleton::GetCallingUid(), query, nApplicationInfo);
2285 return nApplicationInfo;
2286 }
2287
GetBundleInfoSync(napi_env env,napi_callback_info info)2288 napi_value GetBundleInfoSync(napi_env env, napi_callback_info info)
2289 {
2290 APP_LOGD("NAPI GetBundleInfoSync call");
2291 NapiArg args(env, info);
2292 if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_THREE)) {
2293 APP_LOGE("param count invalid");
2294 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2295 return nullptr;
2296 }
2297 std::string bundleName;
2298 int32_t flags = 0;
2299 int32_t userId = Constants::UNSPECIFIED_USERID;
2300 for (size_t i = 0; i < args.GetArgc(); ++i) {
2301 napi_valuetype valueType = napi_undefined;
2302 NAPI_CALL(env, napi_typeof(env, args[i], &valueType));
2303 if (i == ARGS_POS_ZERO) {
2304 if (!CommonFunc::ParseString(env, args[i], bundleName)) {
2305 APP_LOGE("bundleName %{public}s invalid", bundleName.c_str());
2306 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
2307 return nullptr;
2308 }
2309 } else if (i == ARGS_POS_ONE) {
2310 if (!CommonFunc::ParseInt(env, args[i], flags)) {
2311 APP_LOGE("parseInt failed");
2312 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_FLAGS, TYPE_NUMBER);
2313 return nullptr;
2314 }
2315 } else if (i == ARGS_POS_TWO) {
2316 if ((valueType == napi_number) && (!CommonFunc::ParseInt(env, args[i], userId))) {
2317 APP_LOGE("parseInt failed");
2318 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, USER_ID, TYPE_NUMBER);
2319 return nullptr;
2320 }
2321 } else {
2322 APP_LOGE("parameter is invalid");
2323 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
2324 return nullptr;
2325 }
2326 }
2327 if (bundleName.size() == 0) {
2328 napi_value businessError = BusinessError::CreateCommonError(
2329 env, ERROR_BUNDLE_NOT_EXIST, GET_BUNDLE_INFO_SYNC, BUNDLE_PERMISSIONS);
2330 napi_throw(env, businessError);
2331 return nullptr;
2332 }
2333 if (userId == Constants::UNSPECIFIED_USERID) {
2334 userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
2335 }
2336 napi_value nBundleInfo = nullptr;
2337 auto item = cache.find(Query(bundleName, GET_BUNDLE_INFO, flags, userId, env));
2338 if (item != cache.end()) {
2339 APP_LOGD("GetBundleInfo param from cache");
2340 NAPI_CALL(env,
2341 napi_get_reference_value(env, item->second, &nBundleInfo));
2342 return nBundleInfo;
2343 }
2344 auto iBundleMgr = CommonFunc::GetBundleMgr();
2345 if (iBundleMgr == nullptr) {
2346 APP_LOGE("BundleMgr is null");
2347 return nullptr;
2348 }
2349 BundleInfo bundleInfo;
2350 ErrCode ret = CommonFunc::ConvertErrCode(iBundleMgr->GetBundleInfoV9(bundleName, flags, bundleInfo, userId));
2351 if (ret != NO_ERROR) {
2352 APP_LOGE("GetBundleInfo failed");
2353 napi_value businessError = BusinessError::CreateCommonError(
2354 env, ret, GET_BUNDLE_INFO_SYNC, BUNDLE_PERMISSIONS);
2355 napi_throw(env, businessError);
2356 return nullptr;
2357 }
2358 NAPI_CALL(env, napi_create_object(env, &nBundleInfo));
2359 CommonFunc::ConvertBundleInfo(env, bundleInfo, nBundleInfo, flags);
2360 Query query(bundleName, GET_BUNDLE_INFO, flags, userId, env);
2361 CheckToCache(env, bundleInfo.uid, IPCSkeleton::GetCallingUid(), query, nBundleInfo);
2362 return nBundleInfo;
2363 }
2364
InnerGetBundleInfos(int32_t flags,int32_t userId,std::vector<BundleInfo> & bundleInfos)2365 static ErrCode InnerGetBundleInfos(int32_t flags,
2366 int32_t userId, std::vector<BundleInfo> &bundleInfos)
2367 {
2368 auto iBundleMgr = CommonFunc::GetBundleMgr();
2369 if (iBundleMgr == nullptr) {
2370 APP_LOGE("iBundleMgr is null");
2371 return ERROR_BUNDLE_SERVICE_EXCEPTION;
2372 }
2373 ErrCode ret = iBundleMgr->GetBundleInfosV9(flags, bundleInfos, userId);
2374 return CommonFunc::ConvertErrCode(ret);
2375 }
2376
CreateBundleFlagObject(napi_env env,napi_value value)2377 void CreateBundleFlagObject(napi_env env, napi_value value)
2378 {
2379 napi_value nBundleInfoDefault;
2380 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_DEFAULT),
2381 &nBundleInfoDefault));
2382 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_DEFAULT",
2383 nBundleInfoDefault));
2384
2385 napi_value nGetBundleInfoWithApplication;
2386 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
2387 GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_APPLICATION), &nGetBundleInfoWithApplication));
2388 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_APPLICATION",
2389 nGetBundleInfoWithApplication));
2390
2391 napi_value nGetBundleInfoWithHapModule;
2392 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
2393 GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE), &nGetBundleInfoWithHapModule));
2394 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_HAP_MODULE",
2395 nGetBundleInfoWithHapModule));
2396
2397 napi_value nGetBundleInfoWithAbility;
2398 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
2399 GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_ABILITY), &nGetBundleInfoWithAbility));
2400 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_ABILITY",
2401 nGetBundleInfoWithAbility));
2402
2403 napi_value nGetBundleInfoWithExtensionAbility;
2404 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
2405 GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_EXTENSION_ABILITY), &nGetBundleInfoWithExtensionAbility));
2406 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_EXTENSION_ABILITY",
2407 nGetBundleInfoWithExtensionAbility));
2408
2409 napi_value nGetBundleInfoWithRequestedPermission;
2410 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
2411 GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_REQUESTED_PERMISSION), &nGetBundleInfoWithRequestedPermission));
2412 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_REQUESTED_PERMISSION",
2413 nGetBundleInfoWithRequestedPermission));
2414
2415 napi_value nGetBundleInfoWithMetadata;
2416 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
2417 GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_METADATA), &nGetBundleInfoWithMetadata));
2418 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_METADATA",
2419 nGetBundleInfoWithMetadata));
2420
2421 napi_value nGetBundleInfoWithDisable;
2422 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
2423 GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_DISABLE), &nGetBundleInfoWithDisable));
2424 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_DISABLE",
2425 nGetBundleInfoWithDisable));
2426
2427 napi_value nGetBundleInfoWithSignatureInfo;
2428 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
2429 GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_SIGNATURE_INFO), &nGetBundleInfoWithSignatureInfo));
2430 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_SIGNATURE_INFO",
2431 nGetBundleInfoWithSignatureInfo));
2432 }
2433
InnerGetBundleInfo(const std::string & bundleName,int32_t flags,int32_t userId,BundleInfo & bundleInfo)2434 static ErrCode InnerGetBundleInfo(const std::string &bundleName, int32_t flags,
2435 int32_t userId, BundleInfo &bundleInfo)
2436 {
2437 auto iBundleMgr = CommonFunc::GetBundleMgr();
2438 if (iBundleMgr == nullptr) {
2439 APP_LOGE("iBundleMgr is null");
2440 return ERROR_BUNDLE_SERVICE_EXCEPTION;
2441 }
2442 ErrCode ret = iBundleMgr->GetBundleInfoV9(bundleName, flags, bundleInfo, userId);
2443 return CommonFunc::ConvertErrCode(ret);
2444 }
2445
InnerGetBundleInfoForSelf(int32_t flags,BundleInfo & bundleInfo)2446 static ErrCode InnerGetBundleInfoForSelf(int32_t flags, BundleInfo &bundleInfo)
2447 {
2448 auto iBundleMgr = CommonFunc::GetBundleMgr();
2449 if (iBundleMgr == nullptr) {
2450 APP_LOGE("iBundleMgr is null");
2451 return ERROR_BUNDLE_SERVICE_EXCEPTION;
2452 }
2453 ErrCode ret = iBundleMgr->GetBundleInfoForSelf(flags, bundleInfo);
2454 return CommonFunc::ConvertErrCode(ret);
2455 }
2456
ProcessBundleInfos(napi_env env,napi_value result,const std::vector<BundleInfo> & bundleInfos,int32_t flags)2457 static void ProcessBundleInfos(
2458 napi_env env, napi_value result, const std::vector<BundleInfo> &bundleInfos, int32_t flags)
2459 {
2460 if (bundleInfos.size() == 0) {
2461 APP_LOGD("bundleInfos is null");
2462 return;
2463 }
2464 size_t index = 0;
2465 for (const auto &item : bundleInfos) {
2466 APP_LOGD("name{%s}, bundleName{%s} ", item.name.c_str(), item.name.c_str());
2467 napi_value objBundleInfo;
2468 NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &objBundleInfo));
2469 CommonFunc::ConvertBundleInfo(env, item, objBundleInfo, flags);
2470 NAPI_CALL_RETURN_VOID(env, napi_set_element(env, result, index, objBundleInfo));
2471 index++;
2472 }
2473 }
2474
GetBundleInfosComplete(napi_env env,napi_status status,void * data)2475 void GetBundleInfosComplete(napi_env env, napi_status status, void *data)
2476 {
2477 BundleInfosCallbackInfo *asyncCallbackInfo =
2478 reinterpret_cast<BundleInfosCallbackInfo *>(data);
2479 if (asyncCallbackInfo == nullptr) {
2480 APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
2481 return;
2482 }
2483 std::unique_ptr<BundleInfosCallbackInfo> callbackPtr {asyncCallbackInfo};
2484 napi_value result[CALLBACK_PARAM_SIZE] = {0};
2485 if (asyncCallbackInfo->err == NO_ERROR) {
2486 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
2487 NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &result[ARGS_POS_ONE]));
2488 ProcessBundleInfos(env, result[ARGS_POS_ONE], asyncCallbackInfo->bundleInfos, asyncCallbackInfo->flags);
2489 } else {
2490 result[ARGS_POS_ZERO] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
2491 GET_BUNDLE_INFOS, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
2492 }
2493 if (asyncCallbackInfo->deferred) {
2494 if (asyncCallbackInfo->err == NO_ERROR) {
2495 NAPI_CALL_RETURN_VOID(env, napi_resolve_deferred(env, asyncCallbackInfo->deferred, result[1]));
2496 } else {
2497 NAPI_CALL_RETURN_VOID(env, napi_reject_deferred(env, asyncCallbackInfo->deferred, result[0]));
2498 }
2499 } else {
2500 napi_value callback = nullptr;
2501 napi_value placeHolder = nullptr;
2502 NAPI_CALL_RETURN_VOID(env, napi_get_reference_value(env, asyncCallbackInfo->callback, &callback));
2503 NAPI_CALL_RETURN_VOID(env, napi_call_function(env, nullptr, callback,
2504 sizeof(result) / sizeof(result[ARGS_POS_ZERO]), result, &placeHolder));
2505 }
2506 }
2507
GetBundleInfoComplete(napi_env env,napi_status status,void * data)2508 void GetBundleInfoComplete(napi_env env, napi_status status, void *data)
2509 {
2510 BundleInfoCallbackInfo *asyncCallbackInfo =
2511 reinterpret_cast<BundleInfoCallbackInfo *>(data);
2512 if (asyncCallbackInfo == nullptr) {
2513 APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
2514 return;
2515 }
2516 std::unique_ptr<BundleInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
2517 napi_value result[CALLBACK_PARAM_SIZE] = {0};
2518 if (asyncCallbackInfo->err == NO_ERROR) {
2519 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
2520 NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &result[ARGS_POS_ONE]));
2521 CommonFunc::ConvertBundleInfo(env,
2522 asyncCallbackInfo->bundleInfo, result[ARGS_POS_ONE], asyncCallbackInfo->flags);
2523 } else {
2524 result[ARGS_POS_ZERO] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
2525 GET_BUNDLE_INFO, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
2526 }
2527 if (asyncCallbackInfo->deferred) {
2528 if (asyncCallbackInfo->err == NO_ERROR) {
2529 NAPI_CALL_RETURN_VOID(env, napi_resolve_deferred(env, asyncCallbackInfo->deferred, result[1]));
2530 } else {
2531 NAPI_CALL_RETURN_VOID(env, napi_reject_deferred(env, asyncCallbackInfo->deferred, result[0]));
2532 }
2533 } else {
2534 napi_value callback = nullptr;
2535 napi_value placeHolder = nullptr;
2536 NAPI_CALL_RETURN_VOID(env, napi_get_reference_value(env, asyncCallbackInfo->callback, &callback));
2537 NAPI_CALL_RETURN_VOID(env, napi_call_function(env, nullptr, callback,
2538 sizeof(result) / sizeof(result[ARGS_POS_ZERO]), result, &placeHolder));
2539 }
2540 }
2541
GetBundleInfoExec(napi_env env,void * data)2542 void GetBundleInfoExec(napi_env env, void *data)
2543 {
2544 BundleInfoCallbackInfo *asyncCallbackInfo = reinterpret_cast<BundleInfoCallbackInfo *>(data);
2545 if (asyncCallbackInfo == nullptr) {
2546 APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
2547 return;
2548 }
2549 if (asyncCallbackInfo->err == NO_ERROR) {
2550 asyncCallbackInfo->err = InnerGetBundleInfo(asyncCallbackInfo->bundleName,
2551 asyncCallbackInfo->flags, asyncCallbackInfo->userId, asyncCallbackInfo->bundleInfo);
2552 }
2553 }
2554
GetBundleInfoForSelfExec(napi_env env,void * data)2555 void GetBundleInfoForSelfExec(napi_env env, void *data)
2556 {
2557 BundleInfoCallbackInfo *asyncCallbackInfo = reinterpret_cast<BundleInfoCallbackInfo *>(data);
2558 if (asyncCallbackInfo == nullptr) {
2559 APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
2560 return;
2561 }
2562 if (asyncCallbackInfo->err == NO_ERROR) {
2563 asyncCallbackInfo->err = InnerGetBundleInfoForSelf(
2564 asyncCallbackInfo->flags, asyncCallbackInfo->bundleInfo);
2565 }
2566 }
2567
GetBundleInfo(napi_env env,napi_callback_info info)2568 napi_value GetBundleInfo(napi_env env, napi_callback_info info)
2569 {
2570 APP_LOGD("NAPI_GetBundleInfo called");
2571 NapiArg args(env, info);
2572 BundleInfoCallbackInfo *asyncCallbackInfo = new (std::nothrow) BundleInfoCallbackInfo(env);
2573 if (asyncCallbackInfo == nullptr) {
2574 APP_LOGE("asyncCallbackInfo is null.");
2575 return nullptr;
2576 }
2577 std::unique_ptr<BundleInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
2578 if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_FOUR)) {
2579 APP_LOGE("param count invalid.");
2580 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2581 return nullptr;
2582 }
2583 asyncCallbackInfo->userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
2584 if (args.GetMaxArgc() < ARGS_SIZE_TWO) {
2585 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2586 return nullptr;
2587 }
2588 for (size_t i = 0; i < args.GetMaxArgc(); i++) {
2589 napi_valuetype valueType = napi_undefined;
2590 napi_typeof(env, args[i], &valueType);
2591 if (i == ARGS_POS_ZERO) {
2592 if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->bundleName)) {
2593 APP_LOGE("appId %{public}s invalid!", asyncCallbackInfo->bundleName.c_str());
2594 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
2595 return nullptr;
2596 }
2597 } else if (i == ARGS_POS_ONE) {
2598 if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->flags)) {
2599 APP_LOGE("Flags %{public}d invalid!", asyncCallbackInfo->flags);
2600 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_FLAGS, TYPE_NUMBER);
2601 return nullptr;
2602 }
2603 } else if (i == ARGS_POS_TWO) {
2604 if (valueType == napi_function) {
2605 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
2606 break;
2607 }
2608 if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->userId)) {
2609 APP_LOGE("userId %{public}d invalid!", asyncCallbackInfo->userId);
2610 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, USER_ID, TYPE_NUMBER);
2611 return nullptr;
2612 }
2613 } else if (i == ARGS_POS_THREE) {
2614 if (valueType == napi_function) {
2615 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
2616 }
2617 break;
2618 } else {
2619 APP_LOGE("param check error");
2620 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
2621 return nullptr;
2622 }
2623 }
2624 auto promise = CommonFunc::AsyncCallNativeMethod<BundleInfoCallbackInfo>(
2625 env, asyncCallbackInfo, GET_BUNDLE_INFO, GetBundleInfoExec, GetBundleInfoComplete);
2626 callbackPtr.release();
2627 APP_LOGD("call NAPI_GetBundleInfo done.");
2628 return promise;
2629 }
2630
GetBundleInfosExec(napi_env env,void * data)2631 void GetBundleInfosExec(napi_env env, void *data)
2632 {
2633 BundleInfosCallbackInfo *asyncCallbackInfo = reinterpret_cast<BundleInfosCallbackInfo *>(data);
2634 if (asyncCallbackInfo == nullptr) {
2635 APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
2636 return;
2637 }
2638 asyncCallbackInfo->err = InnerGetBundleInfos(asyncCallbackInfo->flags,
2639 asyncCallbackInfo->userId, asyncCallbackInfo->bundleInfos);
2640 }
2641
GetBundleInfos(napi_env env,napi_callback_info info)2642 napi_value GetBundleInfos(napi_env env, napi_callback_info info)
2643 {
2644 APP_LOGD("NAPI_GetBundleInfos called");
2645 NapiArg args(env, info);
2646 BundleInfosCallbackInfo *asyncCallbackInfo = new (std::nothrow) BundleInfosCallbackInfo(env);
2647 if (asyncCallbackInfo == nullptr) {
2648 APP_LOGE("asyncCallbackInfo is null.");
2649 return nullptr;
2650 }
2651 std::unique_ptr<BundleInfosCallbackInfo> callbackPtr {asyncCallbackInfo};
2652 if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_THREE)) {
2653 APP_LOGE("param count invalid.");
2654 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2655 return nullptr;
2656 }
2657 asyncCallbackInfo->userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
2658 if (args.GetMaxArgc() < ARGS_SIZE_ONE) {
2659 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2660 return nullptr;
2661 }
2662 for (size_t i = 0; i < args.GetMaxArgc(); ++i) {
2663 napi_valuetype valueType = napi_undefined;
2664 napi_typeof(env, args[i], &valueType);
2665 if (i == ARGS_POS_ZERO) {
2666 if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->flags)) {
2667 APP_LOGE("Flags %{public}d invalid!", asyncCallbackInfo->flags);
2668 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_FLAGS, TYPE_NUMBER);
2669 return nullptr;
2670 }
2671 } else if (i == ARGS_POS_ONE) {
2672 if (valueType == napi_function) {
2673 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
2674 break;
2675 }
2676 if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->userId)) {
2677 APP_LOGE("userId %{public}d invalid!", asyncCallbackInfo->userId);
2678 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, USER_ID, TYPE_NUMBER);
2679 return nullptr;
2680 }
2681 } else if ((i == ARGS_POS_TWO) && (valueType == napi_function)) {
2682 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
2683 break;
2684 } else {
2685 APP_LOGE("param check error");
2686 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
2687 return nullptr;
2688 }
2689 }
2690 auto promise = CommonFunc::AsyncCallNativeMethod<BundleInfosCallbackInfo>(
2691 env, asyncCallbackInfo, GET_BUNDLE_INFOS, GetBundleInfosExec, GetBundleInfosComplete);
2692 callbackPtr.release();
2693 APP_LOGD("call NAPI_GetBundleInfos done.");
2694 return promise;
2695 }
2696
GetBundleInfoForSelf(napi_env env,napi_callback_info info)2697 napi_value GetBundleInfoForSelf(napi_env env, napi_callback_info info)
2698 {
2699 APP_LOGD("GetBundleInfoForSelf called");
2700 NapiArg args(env, info);
2701 BundleInfoCallbackInfo *asyncCallbackInfo = new (std::nothrow) BundleInfoCallbackInfo(env);
2702 if (asyncCallbackInfo == nullptr) {
2703 APP_LOGE("asyncCallbackInfo is null.");
2704 return nullptr;
2705 }
2706 std::unique_ptr<BundleInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
2707 if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_TWO)) {
2708 APP_LOGE("param count invalid.");
2709 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2710 return nullptr;
2711 }
2712 for (size_t i = 0; i < args.GetArgc(); ++i) {
2713 napi_valuetype valueType = napi_undefined;
2714 napi_typeof(env, args[i], &valueType);
2715 if (i == ARGS_POS_ZERO) {
2716 if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->flags)) {
2717 APP_LOGE("Flags invalid!");
2718 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_FLAGS, TYPE_NUMBER);
2719 return nullptr;
2720 }
2721 } else if (i == ARGS_POS_ONE) {
2722 if (valueType == napi_function) {
2723 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
2724 }
2725 } else {
2726 APP_LOGE("param check error");
2727 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
2728 return nullptr;
2729 }
2730 }
2731 auto promise = CommonFunc::AsyncCallNativeMethod<BundleInfoCallbackInfo>(
2732 env, asyncCallbackInfo, "GetBundleInfoForSelf", GetBundleInfoForSelfExec, GetBundleInfoComplete);
2733 callbackPtr.release();
2734 APP_LOGD("call GetBundleInfoForSelf done.");
2735 return promise;
2736 }
2737
CreatePermissionGrantStateObject(napi_env env,napi_value value)2738 void CreatePermissionGrantStateObject(napi_env env, napi_value value)
2739 {
2740 napi_value nPermissionDenied;
2741 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, -1, &nPermissionDenied));
2742 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "PERMISSION_DENIED",
2743 nPermissionDenied));
2744
2745 napi_value nPermissionGranted;
2746 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, 0, &nPermissionGranted));
2747 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "PERMISSION_GRANTED",
2748 nPermissionGranted));
2749 }
2750
CreateAbilityTypeObject(napi_env env,napi_value value)2751 void CreateAbilityTypeObject(napi_env env, napi_value value)
2752 {
2753 napi_value nUnknow;
2754 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(AbilityType::UNKNOWN), &nUnknow));
2755 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "UNKNOWN", nUnknow));
2756 napi_value nPage;
2757 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(AbilityType::PAGE), &nPage));
2758 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "PAGE", nPage));
2759 napi_value nService;
2760 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(AbilityType::SERVICE), &nService));
2761 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SERVICE", nService));
2762 napi_value nData;
2763 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(AbilityType::DATA), &nData));
2764 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "DATA", nData));
2765 }
2766
CreateBundleTypeObject(napi_env env,napi_value value)2767 void CreateBundleTypeObject(napi_env env, napi_value value)
2768 {
2769 napi_value nApp;
2770 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(BundleType::APP), &nApp));
2771 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "APP", nApp));
2772 napi_value nAtomicService;
2773 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
2774 static_cast<int32_t>(BundleType::ATOMIC_SERVICE), &nAtomicService));
2775 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "ATOMIC_SERVICE", nAtomicService));
2776 }
2777
CreateDisplayOrientationObject(napi_env env,napi_value value)2778 void CreateDisplayOrientationObject(napi_env env, napi_value value)
2779 {
2780 napi_value nUnspecified;
2781 NAPI_CALL_RETURN_VOID(
2782 env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::UNSPECIFIED), &nUnspecified));
2783 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "UNSPECIFIED", nUnspecified));
2784 napi_value nLandscape;
2785 NAPI_CALL_RETURN_VOID(
2786 env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::LANDSCAPE), &nLandscape));
2787 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "LANDSCAPE", nLandscape));
2788 napi_value nPortrait;
2789 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::PORTRAIT), &nPortrait));
2790 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "PORTRAIT", nPortrait));
2791 napi_value nFollowrecent;
2792 NAPI_CALL_RETURN_VOID(
2793 env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::FOLLOWRECENT), &nFollowrecent));
2794 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "FOLLOW_RECENT", nFollowrecent));
2795 napi_value nReverseLandscape;
2796 NAPI_CALL_RETURN_VOID(
2797 env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::LANDSCAPE_INVERTED), &nReverseLandscape));
2798 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "LANDSCAPE_INVERTED", nReverseLandscape));
2799 napi_value nReversePortrait;
2800 NAPI_CALL_RETURN_VOID(
2801 env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::PORTRAIT_INVERTED), &nReversePortrait));
2802 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "PORTRAIT_INVERTED", nReversePortrait));
2803 napi_value nAutoRotation;
2804 NAPI_CALL_RETURN_VOID(
2805 env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::AUTO_ROTATION), &nAutoRotation));
2806 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "AUTO_ROTATION", nAutoRotation));
2807 napi_value nAutoRotationLandscape;
2808 NAPI_CALL_RETURN_VOID(
2809 env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::AUTO_ROTATION_LANDSCAPE),
2810 &nAutoRotationLandscape));
2811 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "AUTO_ROTATION_LANDSCAPE", nAutoRotationLandscape));
2812 napi_value nAutoRotationPortrait;
2813 NAPI_CALL_RETURN_VOID(
2814 env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::AUTO_ROTATION_PORTRAIT),
2815 &nAutoRotationPortrait));
2816 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "AUTO_ROTATION_PORTRAIT", nAutoRotationPortrait));
2817 napi_value nAutoRotationRestricted;
2818 NAPI_CALL_RETURN_VOID(
2819 env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::AUTO_ROTATION_RESTRICTED),
2820 &nAutoRotationRestricted));
2821 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "AUTO_ROTATION_RESTRICTED",
2822 nAutoRotationRestricted));
2823 napi_value nAutoRotationLandscapeRestricted;
2824 NAPI_CALL_RETURN_VOID(
2825 env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::AUTO_ROTATION_LANDSCAPE_RESTRICTED),
2826 &nAutoRotationLandscapeRestricted));
2827 NAPI_CALL_RETURN_VOID(env,
2828 napi_set_named_property(env, value, "AUTO_ROTATION_LANDSCAPE_RESTRICTED", nAutoRotationLandscapeRestricted));
2829 napi_value nAutoRotationPortraitRestricted;
2830 NAPI_CALL_RETURN_VOID(
2831 env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::AUTO_ROTATION_PORTRAIT_RESTRICTED),
2832 &nAutoRotationPortraitRestricted));
2833 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "AUTO_ROTATION_PORTRAIT_RESTRICTED",
2834 nAutoRotationPortraitRestricted));
2835 napi_value nLocked;
2836 NAPI_CALL_RETURN_VOID(
2837 env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::LOCKED), &nLocked));
2838 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "LOCKED", nLocked));
2839 }
2840
CreateLaunchTypeObject(napi_env env,napi_value value)2841 void CreateLaunchTypeObject(napi_env env, napi_value value)
2842 {
2843 napi_value nSingleton;
2844 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(LaunchMode::SINGLETON), &nSingleton));
2845 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SINGLETON", nSingleton));
2846 napi_value nStandard;
2847 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(LaunchMode::STANDARD), &nStandard));
2848 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "STANDARD", nStandard));
2849 napi_value nMultiton;
2850 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(LaunchMode::STANDARD), &nMultiton));
2851 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "MULTITON", nMultiton));
2852 napi_value nSpecified;
2853 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(LaunchMode::SPECIFIED), &nSpecified));
2854 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SPECIFIED", nSpecified));
2855 }
2856
CreateSupportWindowModesObject(napi_env env,napi_value value)2857 void CreateSupportWindowModesObject(napi_env env, napi_value value)
2858 {
2859 napi_value nFullscreen;
2860 NAPI_CALL_RETURN_VOID(env,
2861 napi_create_int32(env, static_cast<int32_t>(SupportWindowMode::FULLSCREEN), &nFullscreen));
2862 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "FULL_SCREEN", nFullscreen));
2863
2864 napi_value nSplit;
2865 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(SupportWindowMode::SPLIT), &nSplit));
2866 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SPLIT", nSplit));
2867
2868 napi_value nFloat;
2869 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(SupportWindowMode::FLOATING), &nFloat));
2870 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "FLOATING", nFloat));
2871 }
2872
CreateModuleTypeObject(napi_env env,napi_value value)2873 void CreateModuleTypeObject(napi_env env, napi_value value)
2874 {
2875 napi_value nUnknown;
2876 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(ModuleType::UNKNOWN), &nUnknown));
2877 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "UNKNOWN", nUnknown));
2878
2879 napi_value nEntry;
2880 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(ModuleType::ENTRY), &nEntry));
2881 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "ENTRY", nEntry));
2882
2883 napi_value nFeature;
2884 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(ModuleType::FEATURE), &nFeature));
2885 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "FEATURE", nFeature));
2886
2887 napi_value nShared;
2888 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(ModuleType::SHARED), &nShared));
2889 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SHARED", nShared));
2890 }
2891 }
2892 }