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