• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-2025 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #include "bundle_manager.h"
16 
17 #include <shared_mutex>
18 #include <string>
19 
20 #include "app_log_wrapper.h"
21 #include "app_log_tag_wrapper.h"
22 #include "bundle_errors.h"
23 #include "bundle_manager_helper.h"
24 #include "bundle_manager_sync.h"
25 #include "bundle_mgr_client.h"
26 #include "bundle_mgr_interface.h"
27 #include "bundle_mgr_proxy.h"
28 #include "business_error.h"
29 #include "bundle_constants.h"
30 #include "common_func.h"
31 #include "hap_module_info.h"
32 #include "plugin/plugin_bundle_info.h"
33 #include "verify_manager_client.h"
34 #ifdef BUNDLE_FRAMEWORK_GET_ABILITY_ICON_ENABLED
35 #include "image_source.h"
36 #include "pixel_map_napi.h"
37 #endif
38 #include "ipc_skeleton.h"
39 #include "napi_arg.h"
40 #include "napi_common_want.h"
41 #include "napi_constants.h"
42 
43 namespace OHOS {
44 namespace AppExecFwk {
45 namespace {
46 constexpr const char* IS_ENABLE = "isEnable";
47 constexpr const char* STRING_TYPE = "napi_string";
48 constexpr const char* ICON_ID = "iconId";
49 constexpr const char* LABEL_ID = "labelId";
50 constexpr const char* STATE = "state";
51 const std::string PARAM_TYPE_CHECK_ERROR_WITH_POS = "param type check error, error position : ";
52 constexpr const char* UNSPECIFIED = "UNSPECIFIED";
53 constexpr const char* MULTI_INSTANCE = "MULTI_INSTANCE";
54 constexpr const char* APP_CLONE = "APP_CLONE";
55 } // namespace
56 using namespace OHOS::AAFwk;
57 static std::shared_ptr<ClearCacheListener> g_clearCacheListener;
58 static std::mutex g_clearCacheListenerMutex;
59 static std::unordered_map<Query, napi_ref, QueryHash> cache;
60 static std::string g_ownBundleName;
61 static std::mutex g_ownBundleNameMutex;
62 static std::shared_mutex g_cacheMutex;
63 static std::set<int32_t> g_supportedProfileList = { 1 };
64 static std::map<int32_t, std::string> appDistributionTypeMap = {
65     { ENUM_ONE, Constants::APP_DISTRIBUTION_TYPE_APP_GALLERY },
66     { ENUM_TWO, Constants::APP_DISTRIBUTION_TYPE_ENTERPRISE },
67     { ENUM_THREE, Constants::APP_DISTRIBUTION_TYPE_ENTERPRISE_NORMAL },
68     { ENUM_FOUR, Constants::APP_DISTRIBUTION_TYPE_ENTERPRISE_MDM },
69     { ENUM_FIVE, Constants::APP_DISTRIBUTION_TYPE_OS_INTEGRATION },
70     { ENUM_SIX, Constants::APP_DISTRIBUTION_TYPE_CROWDTESTING },
71     { ENUM_SEVEN, Constants::APP_DISTRIBUTION_TYPE_NONE },
72 };
73 namespace {
74 const std::string PARAMETER_BUNDLE_NAME = "bundleName";
75 
ParseBundleOption(napi_env env,napi_value value,BundleOption & option)76 bool ParseBundleOption(napi_env env, napi_value value, BundleOption& option)
77 {
78     option.isDefault = true;
79     napi_valuetype valueType = napi_undefined;
80     napi_typeof(env, value, &valueType);
81     if (valueType != napi_object) {
82         return false;
83     }
84     napi_value prop = nullptr;
85     napi_get_named_property(env, value, USER_ID, &prop);
86     if (CommonFunc::ParseInt(env, prop, option.userId)) {
87         option.isDefault = false;
88         if (option.userId < 0) {
89             option.userId = Constants::INVALID_USERID;
90         }
91     }
92     prop = nullptr;
93     napi_get_named_property(env, value, APP_INDEX, &prop);
94     if (CommonFunc::ParseInt(env, prop, option.appIndex)) {
95         option.isDefault = false;
96     }
97     if (!option.isDefault && (option.userId == Constants::UNSPECIFIED_USERID)) {
98         option.userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
99     }
100     return !option.isDefault;
101 }
102 }
103 
HandleCleanEnv(void * data)104 void ClearCacheListener::HandleCleanEnv(void *data)
105 {
106     std::unique_lock<std::shared_mutex> lock(g_cacheMutex);
107     cache.clear();
108 }
109 
ClearCacheListener(const EventFwk::CommonEventSubscribeInfo & subscribeInfo)110 ClearCacheListener::ClearCacheListener(const EventFwk::CommonEventSubscribeInfo &subscribeInfo)
111     : EventFwk::CommonEventSubscriber(subscribeInfo)
112 {}
113 
OnReceiveEvent(const EventFwk::CommonEventData & data)114 void ClearCacheListener::OnReceiveEvent(const EventFwk::CommonEventData &data)
115 {
116     std::unique_lock<std::shared_mutex> lock(g_cacheMutex);
117     cache.clear();
118 }
119 
RegisterClearCacheListener()120 void RegisterClearCacheListener()
121 {
122     std::lock_guard<std::mutex> lock(g_clearCacheListenerMutex);
123     if (g_clearCacheListener != nullptr) {
124         return;
125     }
126     APP_LOGD("register clear cache listener");
127     EventFwk::MatchingSkills matchingSkills;
128     matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_PACKAGE_ADDED);
129     matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_PACKAGE_CHANGED);
130     matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_PACKAGE_REMOVED);
131     EventFwk::CommonEventSubscribeInfo subscribeInfo(matchingSkills);
132     g_clearCacheListener = std::make_shared<ClearCacheListener>(subscribeInfo);
133     (void)EventFwk::CommonEventManager::SubscribeCommonEvent(g_clearCacheListener);
134 }
135 
GetBundleArchiveInfoExec(napi_env env,void * data)136 void GetBundleArchiveInfoExec(napi_env env, void *data)
137 {
138     GetBundleArchiveInfoCallbackInfo *asyncCallbackInfo = reinterpret_cast<GetBundleArchiveInfoCallbackInfo *>(data);
139     if (asyncCallbackInfo == nullptr) {
140         APP_LOGE("asyncCallbackInfo is null");
141         return;
142     }
143     asyncCallbackInfo->err = BundleManagerHelper::InnerGetBundleArchiveInfo(
144         asyncCallbackInfo->hapFilePath, asyncCallbackInfo->flags, asyncCallbackInfo->bundleInfo);
145 }
146 
GetBundleArchiveInfoComplete(napi_env env,napi_status status,void * data)147 void GetBundleArchiveInfoComplete(napi_env env, napi_status status, void *data)
148 {
149     GetBundleArchiveInfoCallbackInfo *asyncCallbackInfo = reinterpret_cast<GetBundleArchiveInfoCallbackInfo *>(data);
150     if (asyncCallbackInfo == nullptr) {
151         APP_LOGE("asyncCallbackInfo is null");
152         return;
153     }
154     std::unique_ptr<GetBundleArchiveInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
155     napi_value result[ARGS_SIZE_TWO] = {0};
156     if (asyncCallbackInfo->err == NO_ERROR) {
157         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
158         NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &result[ARGS_POS_ONE]));
159         CommonFunc::ConvertBundleInfo(env,
160             asyncCallbackInfo->bundleInfo, result[ARGS_POS_ONE], asyncCallbackInfo->flags);
161     } else {
162         result[ARGS_POS_ZERO] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
163             GET_BUNDLE_ARCHIVE_INFO, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
164     }
165     CommonFunc::NapiReturnDeferred<GetBundleArchiveInfoCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
166 }
167 
GetBundleArchiveInfo(napi_env env,napi_callback_info info)168 napi_value GetBundleArchiveInfo(napi_env env, napi_callback_info info)
169 {
170     APP_LOGD("begin to GetBundleArchiveInfo");
171     NapiArg args(env, info);
172     GetBundleArchiveInfoCallbackInfo *asyncCallbackInfo = new (std::nothrow) GetBundleArchiveInfoCallbackInfo(env);
173     if (asyncCallbackInfo == nullptr) {
174         APP_LOGE("asyncCallbackInfo is null");
175         return nullptr;
176     }
177     std::unique_ptr<GetBundleArchiveInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
178     if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_THREE)) {
179         APP_LOGE("param count invalid");
180         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
181         return nullptr;
182     }
183     for (size_t i = 0; i < args.GetMaxArgc(); ++i) {
184         napi_valuetype valueType = napi_undefined;
185         napi_typeof(env, args[i], &valueType);
186         if ((i == ARGS_POS_ZERO) && (valueType == napi_string)) {
187             if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->hapFilePath)) {
188                 APP_LOGE("hapFilePath %{public}s invalid", asyncCallbackInfo->hapFilePath.c_str());
189                 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
190                 return nullptr;
191             }
192         } else if ((i == ARGS_POS_ONE) && (valueType == napi_number)) {
193             CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->flags);
194         } else if (i == ARGS_POS_TWO) {
195             if (valueType == napi_function) {
196                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
197             }
198             break;
199         } else {
200             APP_LOGE("param check error");
201             std::string errMsg = PARAM_TYPE_CHECK_ERROR_WITH_POS + std::to_string(i + 1);
202             BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, errMsg);
203             return nullptr;
204         }
205     }
206     auto promise = CommonFunc::AsyncCallNativeMethod<GetBundleArchiveInfoCallbackInfo>(
207         env, asyncCallbackInfo, GET_BUNDLE_ARCHIVE_INFO, GetBundleArchiveInfoExec, GetBundleArchiveInfoComplete);
208     callbackPtr.release();
209     APP_LOGD("call GetBundleArchiveInfo done");
210     return promise;
211 }
212 
InnerGetApplicationInfo(const std::string & bundleName,int32_t flags,int32_t userId,ApplicationInfo & appInfo)213 static ErrCode InnerGetApplicationInfo(const std::string &bundleName, int32_t flags,
214     int32_t userId, ApplicationInfo &appInfo)
215 {
216     auto iBundleMgr = CommonFunc::GetBundleMgr();
217     if (iBundleMgr == nullptr) {
218         APP_LOGE("iBundleMgr is null");
219         return ERROR_BUNDLE_SERVICE_EXCEPTION;
220     }
221     ErrCode ret = iBundleMgr->GetApplicationInfoV9(bundleName, flags, userId, appInfo);
222     return CommonFunc::ConvertErrCode(ret);
223 }
224 
InnerGetApplicationInfos(int32_t flags,int32_t userId,std::vector<ApplicationInfo> & appInfos)225 static ErrCode InnerGetApplicationInfos(int32_t flags,
226     int32_t userId, std::vector<ApplicationInfo> &appInfos)
227 {
228     auto iBundleMgr = CommonFunc::GetBundleMgr();
229     if (iBundleMgr == nullptr) {
230         APP_LOGE("iBundleMgr is null");
231         return ERROR_BUNDLE_SERVICE_EXCEPTION;
232     }
233     ErrCode ret = iBundleMgr->GetApplicationInfosV9(flags, userId, appInfos);
234     return CommonFunc::ConvertErrCode(ret);
235 }
236 
ProcessApplicationInfos(napi_env env,napi_value result,const std::vector<ApplicationInfo> & appInfos)237 static void ProcessApplicationInfos(
238     napi_env env, napi_value result, const std::vector<ApplicationInfo> &appInfos)
239 {
240     if (appInfos.empty()) {
241         APP_LOGD("appInfos is null");
242         return;
243     }
244     size_t index = 0;
245     for (const auto &item : appInfos) {
246         APP_LOGD("name: %{public}s, bundleName: %{public}s ", item.name.c_str(), item.bundleName.c_str());
247         napi_value objAppInfo;
248         NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &objAppInfo));
249         CommonFunc::ConvertApplicationInfo(env, objAppInfo, item);
250         NAPI_CALL_RETURN_VOID(env, napi_set_element(env, result, index, objAppInfo));
251         index++;
252     }
253 }
254 
GetBundleNameByUidExec(napi_env env,void * data)255 void GetBundleNameByUidExec(napi_env env, void *data)
256 {
257     GetBundleNameByUidCallbackInfo *asyncCallbackInfo = reinterpret_cast<GetBundleNameByUidCallbackInfo *>(data);
258     if (asyncCallbackInfo == nullptr) {
259         APP_LOGE("asyncCallbackInfo is null");
260         return;
261     }
262     bool queryOwn = (asyncCallbackInfo->uid == IPCSkeleton::GetCallingUid());
263     if (queryOwn) {
264         std::lock_guard<std::mutex> lock(g_ownBundleNameMutex);
265         if (!g_ownBundleName.empty()) {
266             APP_LOGD("query own bundleName, has cache, no need to query from host");
267             int32_t appIndex = 0;
268             CommonFunc::GetBundleNameAndIndexByName(g_ownBundleName, asyncCallbackInfo->bundleName, appIndex);
269             asyncCallbackInfo->err = NO_ERROR;
270             return;
271         }
272     }
273     int32_t appIndex = 0;
274     asyncCallbackInfo->err = BundleManagerHelper::InnerGetAppCloneIdentity(
275         asyncCallbackInfo->uid, asyncCallbackInfo->bundleName, appIndex);
276     std::lock_guard<std::mutex> lock(g_ownBundleNameMutex);
277     if ((asyncCallbackInfo->err == NO_ERROR) && queryOwn && g_ownBundleName.empty()) {
278         g_ownBundleName = asyncCallbackInfo->bundleName;
279         if (appIndex > 0) {
280             g_ownBundleName = CommonFunc::GetCloneBundleIdKey(asyncCallbackInfo->bundleName, appIndex);
281         }
282         APP_LOGD("put own bundleName = %{public}s to cache", g_ownBundleName.c_str());
283     }
284 }
285 
GetBundleNameByUidComplete(napi_env env,napi_status status,void * data)286 void GetBundleNameByUidComplete(napi_env env, napi_status status, void *data)
287 {
288     GetBundleNameByUidCallbackInfo *asyncCallbackInfo = reinterpret_cast<GetBundleNameByUidCallbackInfo *>(data);
289     if (asyncCallbackInfo == nullptr) {
290         APP_LOGE("asyncCallbackInfo is null");
291         return;
292     }
293     std::unique_ptr<GetBundleNameByUidCallbackInfo> callbackPtr {asyncCallbackInfo};
294     napi_value result[2] = {0};
295     if (asyncCallbackInfo->err == NO_ERROR) {
296         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
297         NAPI_CALL_RETURN_VOID(env,
298             napi_create_string_utf8(env, asyncCallbackInfo->bundleName.c_str(), NAPI_AUTO_LENGTH, &result[1]));
299     } else {
300         result[0] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
301             GET_BUNDLE_NAME_BY_UID, BUNDLE_PERMISSIONS);
302     }
303     CommonFunc::NapiReturnDeferred<GetBundleNameByUidCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
304 }
305 
GetAppCloneIdentityExec(napi_env env,void * data)306 void GetAppCloneIdentityExec(napi_env env, void *data)
307 {
308     GetAppCloneIdentityCallbackInfo *asyncCallbackInfo = reinterpret_cast<GetAppCloneIdentityCallbackInfo *>(data);
309     if (asyncCallbackInfo == nullptr) {
310         APP_LOGE("asyncCallbackInfo is null");
311         return;
312     }
313     bool queryOwn = (asyncCallbackInfo->uid == IPCSkeleton::GetCallingUid());
314     if (queryOwn) {
315         std::lock_guard<std::mutex> lock(g_ownBundleNameMutex);
316         if (!g_ownBundleName.empty()) {
317             APP_LOGD("query own bundleName and appIndex, has cache, no need to query from host");
318             CommonFunc::GetBundleNameAndIndexByName(
319                 g_ownBundleName, asyncCallbackInfo->bundleName, asyncCallbackInfo->appIndex);
320             asyncCallbackInfo->err = NO_ERROR;
321             return;
322         }
323     }
324     asyncCallbackInfo->err = BundleManagerHelper::InnerGetAppCloneIdentity(
325         asyncCallbackInfo->uid, asyncCallbackInfo->bundleName, asyncCallbackInfo->appIndex);
326     std::lock_guard<std::mutex> lock(g_ownBundleNameMutex);
327     if ((asyncCallbackInfo->err == NO_ERROR) && queryOwn && g_ownBundleName.empty()) {
328         g_ownBundleName = asyncCallbackInfo->bundleName;
329         if (asyncCallbackInfo->appIndex > 0) {
330             g_ownBundleName = CommonFunc::GetCloneBundleIdKey(
331                 asyncCallbackInfo->bundleName, asyncCallbackInfo->appIndex);
332         }
333         APP_LOGD("put own bundleName = %{public}s to cache", g_ownBundleName.c_str());
334     }
335 }
336 
GetAppCloneIdentityComplete(napi_env env,napi_status status,void * data)337 void GetAppCloneIdentityComplete(napi_env env, napi_status status, void *data)
338 {
339     GetAppCloneIdentityCallbackInfo *asyncCallbackInfo = reinterpret_cast<GetAppCloneIdentityCallbackInfo *>(data);
340     if (asyncCallbackInfo == nullptr) {
341         APP_LOGE("asyncCallbackInfo is null");
342         return;
343     }
344     std::unique_ptr<GetAppCloneIdentityCallbackInfo> callbackPtr {asyncCallbackInfo};
345     napi_value result[CALLBACK_PARAM_SIZE] = {0};
346     if (asyncCallbackInfo->err == SUCCESS) {
347         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
348         NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &result[ARGS_POS_ONE]));
349 
350         napi_value nName;
351         NAPI_CALL_RETURN_VOID(env, napi_create_string_utf8(env, asyncCallbackInfo->bundleName.c_str(),
352             NAPI_AUTO_LENGTH, &nName));
353         NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, result[ARGS_POS_ONE], BUNDLE_NAME, nName));
354 
355         napi_value nAppIndex;
356         NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, asyncCallbackInfo->appIndex, &nAppIndex));
357         NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, result[ARGS_POS_ONE], APP_INDEX, nAppIndex));
358     } else {
359         result[ARGS_POS_ZERO] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
360             GET_APP_CLONE_IDENTITY, APP_CLONE_IDENTITY_PERMISSIONS);
361     }
362     CommonFunc::NapiReturnDeferred<GetAppCloneIdentityCallbackInfo>(
363         env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
364 }
365 
GetApplicationInfoComplete(napi_env env,napi_status status,void * data)366 void GetApplicationInfoComplete(napi_env env, napi_status status, void *data)
367 {
368     ApplicationInfoCallbackInfo *asyncCallbackInfo =
369         reinterpret_cast<ApplicationInfoCallbackInfo *>(data);
370     if (asyncCallbackInfo == nullptr) {
371         APP_LOGE("asyncCallbackInfo is null");
372         return;
373     }
374     std::unique_ptr<ApplicationInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
375     napi_value result[CALLBACK_PARAM_SIZE] = {0};
376     if (asyncCallbackInfo->err == NO_ERROR) {
377         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
378         NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &result[ARGS_POS_ONE]));
379         CommonFunc::ConvertApplicationInfo(env, result[ARGS_POS_ONE], asyncCallbackInfo->appInfo);
380     } else {
381         result[ARGS_POS_ZERO] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
382             GET_APPLICATION_INFO, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
383     }
384     CommonFunc::NapiReturnDeferred<ApplicationInfoCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
385 }
386 
GetApplicationInfosComplete(napi_env env,napi_status status,void * data)387 void GetApplicationInfosComplete(napi_env env, napi_status status, void *data)
388 {
389     ApplicationInfosCallbackInfo *asyncCallbackInfo =
390         reinterpret_cast<ApplicationInfosCallbackInfo *>(data);
391     if (asyncCallbackInfo == nullptr) {
392         APP_LOGE("asyncCallbackInfo is null");
393         return;
394     }
395     std::unique_ptr<ApplicationInfosCallbackInfo> callbackPtr {asyncCallbackInfo};
396     napi_value result[CALLBACK_PARAM_SIZE] = {0};
397     if (asyncCallbackInfo->err == NO_ERROR) {
398         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
399         NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &result[ARGS_POS_ONE]));
400         ProcessApplicationInfos(env, result[ARGS_POS_ONE], asyncCallbackInfo->appInfos);
401     } else {
402         result[ARGS_POS_ZERO] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
403             GET_APPLICATION_INFOS, Constants::PERMISSION_GET_INSTALLED_BUNDLE_LIST);
404     }
405     CommonFunc::NapiReturnDeferred<ApplicationInfosCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
406 }
407 
GetApplicationInfoExec(napi_env env,void * data)408 void GetApplicationInfoExec(napi_env env, void *data)
409 {
410     ApplicationInfoCallbackInfo *asyncCallbackInfo = reinterpret_cast<ApplicationInfoCallbackInfo *>(data);
411     if (asyncCallbackInfo == nullptr) {
412         APP_LOGE("asyncCallbackInfo is null");
413         return;
414     }
415     asyncCallbackInfo->err = InnerGetApplicationInfo(asyncCallbackInfo->bundleName,
416         asyncCallbackInfo->flags, asyncCallbackInfo->userId, asyncCallbackInfo->appInfo);
417 }
418 
GetApplicationInfosExec(napi_env env,void * data)419 void GetApplicationInfosExec(napi_env env, void *data)
420 {
421     ApplicationInfosCallbackInfo *asyncCallbackInfo = reinterpret_cast<ApplicationInfosCallbackInfo *>(data);
422     if (asyncCallbackInfo == nullptr) {
423         APP_LOGE("asyncCallbackInfo is null");
424         return;
425     }
426     asyncCallbackInfo->err = InnerGetApplicationInfos(asyncCallbackInfo->flags,
427         asyncCallbackInfo->userId, asyncCallbackInfo->appInfos);
428 }
429 
GetBundleNameByUid(napi_env env,napi_callback_info info)430 napi_value GetBundleNameByUid(napi_env env, napi_callback_info info)
431 {
432     APP_LOGD("begin to GetBundleNameByUid");
433     NapiArg args(env, info);
434     GetBundleNameByUidCallbackInfo *asyncCallbackInfo = new (std::nothrow) GetBundleNameByUidCallbackInfo(env);
435     if (asyncCallbackInfo == nullptr) {
436         APP_LOGE("asyncCallbackInfo is null");
437         return nullptr;
438     }
439     std::unique_ptr<GetBundleNameByUidCallbackInfo> callbackPtr {asyncCallbackInfo};
440     if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_TWO)) {
441         APP_LOGE("param count invalid");
442         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
443         return nullptr;
444     }
445     for (size_t i = 0; i < args.GetMaxArgc(); ++i) {
446         napi_valuetype valueType = napi_undefined;
447         napi_typeof(env, args[i], &valueType);
448         if ((i == ARGS_POS_ZERO) && (valueType == napi_number)) {
449             CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->uid);
450         } else if (i == ARGS_POS_ONE) {
451             if (valueType == napi_function) {
452                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
453             }
454             break;
455         } else {
456             APP_LOGE("param check error");
457             std::string errMsg = PARAM_TYPE_CHECK_ERROR_WITH_POS + std::to_string(i + 1);
458             BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, errMsg);
459             return nullptr;
460         }
461     }
462     auto promise = CommonFunc::AsyncCallNativeMethod<GetBundleNameByUidCallbackInfo>(
463         env, asyncCallbackInfo, GET_BUNDLE_NAME_BY_UID, GetBundleNameByUidExec, GetBundleNameByUidComplete);
464     callbackPtr.release();
465     APP_LOGD("call GetBundleNameByUid done");
466     return promise;
467 }
468 
GetAppCloneIdentity(napi_env env,napi_callback_info info)469 napi_value GetAppCloneIdentity(napi_env env, napi_callback_info info)
470 {
471     APP_LOGD("begin to GetAppCloneIdentity");
472     NapiArg args(env, info);
473     GetAppCloneIdentityCallbackInfo *asyncCallbackInfo = new (std::nothrow) GetAppCloneIdentityCallbackInfo(env);
474     if (asyncCallbackInfo == nullptr) {
475         APP_LOGE("asyncCallbackInfo is null");
476         return nullptr;
477     }
478     std::unique_ptr<GetAppCloneIdentityCallbackInfo> callbackPtr {asyncCallbackInfo};
479     if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_ONE)) {
480         APP_LOGE("param count invalid");
481         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
482         return nullptr;
483     }
484     if (!CommonFunc::ParseInt(env, args[ARGS_POS_ZERO], asyncCallbackInfo->uid)) {
485         APP_LOGW("parse uid failed");
486         BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, "uid", TYPE_NUMBER);
487         return nullptr;
488     }
489     auto promise = CommonFunc::AsyncCallNativeMethod<GetAppCloneIdentityCallbackInfo>(env, asyncCallbackInfo,
490         GET_APP_CLONE_IDENTITY, GetAppCloneIdentityExec, GetAppCloneIdentityComplete);
491     callbackPtr.release();
492     APP_LOGD("call GetAppCloneIdentity done");
493     return promise;
494 }
495 
GetAllBundleCacheSizeExec(napi_env env,void * data)496 void GetAllBundleCacheSizeExec(napi_env env, void *data)
497 {
498     GetAllBundleCacheCallbackInfo *asyncCallbackInfo = reinterpret_cast<GetAllBundleCacheCallbackInfo *>(data);
499     if (asyncCallbackInfo == nullptr) {
500         APP_LOGE("asyncCallbackInfo is null");
501         return;
502     }
503 
504     asyncCallbackInfo->cacheCallback = new (std::nothrow) ProcessCacheCallbackHost();
505     if (asyncCallbackInfo->cacheCallback == nullptr) {
506         APP_LOGE("cacheCallback is null");
507         return;
508     }
509 
510     auto iBundleMgr = CommonFunc::GetBundleMgr();
511     if (iBundleMgr == nullptr) {
512         APP_LOGE("can not get iBundleMgr");
513         asyncCallbackInfo->err = CommonFunc::ConvertErrCode(ERROR_BUNDLE_SERVICE_EXCEPTION);
514         return;
515     }
516 
517     asyncCallbackInfo->err =
518         CommonFunc::ConvertErrCode(iBundleMgr->GetAllBundleCacheStat(asyncCallbackInfo->cacheCallback));
519 
520     APP_LOGI("GetAllBundleCacheStat call, result is %{public}d", asyncCallbackInfo->err);
521     if ((asyncCallbackInfo->err == NO_ERROR) && (asyncCallbackInfo->cacheCallback != nullptr)) {
522         // wait for GetAllBundleCacheStat
523         APP_LOGI("GetAllBundleCacheStat exec wait");
524         asyncCallbackInfo->cacheSize = asyncCallbackInfo->cacheCallback->GetCacheStat();
525     }
526     APP_LOGI("GetAllBundleCacheStat exec end");
527 }
528 
GetAllBundleCacheSizeComplete(napi_env env,napi_status status,void * data)529 void GetAllBundleCacheSizeComplete(napi_env env, napi_status status, void *data)
530 {
531     GetAllBundleCacheCallbackInfo *asyncCallbackInfo = reinterpret_cast<GetAllBundleCacheCallbackInfo *>(data);
532     if (asyncCallbackInfo == nullptr) {
533         APP_LOGE("asyncCallbackInfo is null");
534         return;
535     }
536     std::unique_ptr<GetAllBundleCacheCallbackInfo> callbackPtr{ asyncCallbackInfo };
537     napi_value result[ARGS_POS_TWO] = { 0 };
538     if (asyncCallbackInfo->cacheSize > uint64_t(INT64_MAX)) {
539         APP_LOGW("value out of range for int64");
540         asyncCallbackInfo->cacheSize = uint64_t(INT64_MAX);
541     }
542     if (asyncCallbackInfo->err == NO_ERROR) {
543         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
544         NAPI_CALL_RETURN_VOID(
545             env, napi_create_int64(env, static_cast<int64_t>(asyncCallbackInfo->cacheSize), &result[ARGS_POS_ONE]));
546     } else {
547         APP_LOGE("GetAllBundleCacheSizeComplete failed");
548         result[0] = BusinessError::CreateCommonError(
549             env, asyncCallbackInfo->err, GET_ALL_BUNDLE_CACHE_SIZE, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
550     }
551     CommonFunc::NapiReturnDeferred<GetAllBundleCacheCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
552 }
553 
GetAllBundleCacheSize(napi_env env,napi_callback_info info)554 napi_value GetAllBundleCacheSize(napi_env env, napi_callback_info info)
555 {
556     APP_LOGI("begin to GetAllBundleCacheSize");
557     GetAllBundleCacheCallbackInfo *asyncCallbackInfo = new (std::nothrow) GetAllBundleCacheCallbackInfo(env);
558     if (asyncCallbackInfo == nullptr) {
559         APP_LOGE("asyncCallbackInfo is null");
560         return nullptr;
561     }
562 
563     std::unique_ptr<GetAllBundleCacheCallbackInfo> callbackPtr{ asyncCallbackInfo };
564     auto promise = CommonFunc::AsyncCallNativeMethod<GetAllBundleCacheCallbackInfo>(
565         env, asyncCallbackInfo, GET_ALL_BUNDLE_CACHE_SIZE, GetAllBundleCacheSizeExec, GetAllBundleCacheSizeComplete);
566     callbackPtr.release();
567     APP_LOGI("call GetAllBundleCacheSize done");
568     return promise;
569 }
570 
CleanAllBundleCacheSizeExec(napi_env env,void * data)571 void CleanAllBundleCacheSizeExec(napi_env env, void *data)
572 {
573     CleanAllBundleCacheCallbackInfo *asyncCallbackInfo = reinterpret_cast<CleanAllBundleCacheCallbackInfo *>(data);
574     if (asyncCallbackInfo == nullptr) {
575         APP_LOGE("asyncCallbackInfo is null");
576         return;
577     }
578 
579     asyncCallbackInfo->cacheCallback = new (std::nothrow) ProcessCacheCallbackHost();
580     if (asyncCallbackInfo->cacheCallback == nullptr) {
581         APP_LOGE("cacheCallback is null");
582         return;
583     }
584 
585     auto iBundleMgr = CommonFunc::GetBundleMgr();
586     if (iBundleMgr == nullptr) {
587         APP_LOGE("can not get iBundleMgr");
588         asyncCallbackInfo->err = CommonFunc::ConvertErrCode(ERROR_BUNDLE_SERVICE_EXCEPTION);
589         return;
590     }
591 
592     asyncCallbackInfo->err =
593         CommonFunc::ConvertErrCode(iBundleMgr->CleanAllBundleCache(asyncCallbackInfo->cacheCallback));
594 
595     APP_LOGI("CleanAllBundleCache call, result is %{public}d", asyncCallbackInfo->err);
596     if ((asyncCallbackInfo->err == NO_ERROR) && (asyncCallbackInfo->cacheCallback != nullptr)) {
597         // wait for CleanAllBundleCache
598         APP_LOGI("CleanAllBundleCache exec wait");
599         auto result = asyncCallbackInfo->cacheCallback->GetCleanRet();
600         if (result != 0) {
601             APP_LOGE("CleanAllBundleCache exec failed, result is %{public}d", result);
602         }
603     }
604     APP_LOGI("CleanAllBundleCache exec end");
605 }
606 
CleanAllBundleCacheComplete(napi_env env,napi_status status,void * data)607 void CleanAllBundleCacheComplete(napi_env env, napi_status status, void *data)
608 {
609     CleanAllBundleCacheCallbackInfo *asyncCallbackInfo = reinterpret_cast<CleanAllBundleCacheCallbackInfo *>(data);
610     if (asyncCallbackInfo == nullptr) {
611         APP_LOGE("asyncCallbackInfo is null");
612         return;
613     }
614     std::unique_ptr<CleanAllBundleCacheCallbackInfo> callbackPtr{ asyncCallbackInfo };
615     napi_value result[ARGS_SIZE_ONE] = { 0 };
616     if (asyncCallbackInfo->err == NO_ERROR) {
617         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
618     } else {
619         APP_LOGE("asyncCallbackInfo is null");
620         result[0] = BusinessError::CreateCommonError(
621             env, asyncCallbackInfo->err, CLEAN_ALL_BUNDLE_CACHE, Constants::PERMISSION_REMOVECACHEFILE);
622     }
623     CommonFunc::NapiReturnDeferred<CleanAllBundleCacheCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_ONE);
624 }
625 
CleanAllBundleCache(napi_env env,napi_callback_info info)626 napi_value CleanAllBundleCache(napi_env env, napi_callback_info info)
627 {
628     APP_LOGD("begin to CleanAllBundleCache");
629 
630     CleanAllBundleCacheCallbackInfo *asyncCallbackInfo = new (std::nothrow) CleanAllBundleCacheCallbackInfo(env);
631     if (asyncCallbackInfo == nullptr) {
632         APP_LOGE("asyncCallbackInfo is null");
633         return nullptr;
634     }
635     std::unique_ptr<CleanAllBundleCacheCallbackInfo> callbackPtr{ asyncCallbackInfo };
636     auto promise = CommonFunc::AsyncCallNativeMethod<CleanAllBundleCacheCallbackInfo>(
637         env, asyncCallbackInfo, CLEAN_ALL_BUNDLE_CACHE, CleanAllBundleCacheSizeExec, CleanAllBundleCacheComplete);
638     callbackPtr.release();
639     APP_LOGD("call CleanAllBundleCache done");
640     return promise;
641 }
642 
GetLaunchWant(napi_env env,napi_callback_info info)643 napi_value GetLaunchWant(napi_env env, napi_callback_info info)
644 {
645     APP_LOGD("NAPI GetLaunchWant call");
646     auto iBundleMgr = CommonFunc::GetBundleMgr();
647     if (iBundleMgr == nullptr) {
648         APP_LOGE("can not get iBundleMgr");
649         BusinessError::ThrowError(env, ERROR_BUNDLE_SERVICE_EXCEPTION, ERR_MSG_BUNDLE_SERVICE_EXCEPTION);
650         return nullptr;
651     }
652     OHOS::AAFwk::Want want;
653     ErrCode ret = CommonFunc::ConvertErrCode(iBundleMgr->GetLaunchWant(want));
654     if (ret != NO_ERROR) {
655         APP_LOGE("GetLaunchWant failed");
656         BusinessError::ThrowError(env, ERROR_GET_LAUNCH_WANT_INVALID, ERR_MSG_LAUNCH_WANT_INVALID);
657         return nullptr;
658     }
659     ElementName elementName = want.GetElement();
660     if (elementName.GetBundleName().empty() || elementName.GetAbilityName().empty()) {
661         APP_LOGE("bundleName or abilityName is empty");
662         BusinessError::ThrowError(env, ERROR_GET_LAUNCH_WANT_INVALID, ERR_MSG_LAUNCH_WANT_INVALID);
663         return nullptr;
664     }
665     napi_value nWant = nullptr;
666     NAPI_CALL(env, napi_create_object(env, &nWant));
667     CommonFunc::ConvertWantInfo(env, nWant, want);
668     APP_LOGD("call GetLaunchWant done");
669     return nWant;
670 }
671 
GetApplicationInfo(napi_env env,napi_callback_info info)672 napi_value GetApplicationInfo(napi_env env, napi_callback_info info)
673 {
674     APP_LOGD("NAPI_GetApplicationInfo called");
675     NapiArg args(env, info);
676     ApplicationInfoCallbackInfo *asyncCallbackInfo = new (std::nothrow) ApplicationInfoCallbackInfo(env);
677     if (asyncCallbackInfo == nullptr) {
678         APP_LOGE("asyncCallbackInfo is null");
679         return nullptr;
680     }
681     std::unique_ptr<ApplicationInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
682     if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_FOUR)) {
683         APP_LOGE("param count invalid");
684         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
685         return nullptr;
686     }
687     asyncCallbackInfo->userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
688     if (args.GetMaxArgc() < ARGS_SIZE_TWO) {
689         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
690         return nullptr;
691     }
692     for (size_t i = 0; i < args.GetMaxArgc(); i++) {
693         napi_valuetype valueType = napi_undefined;
694         napi_typeof(env, args[i], &valueType);
695         if (i == ARGS_POS_ZERO) {
696             if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->bundleName)) {
697                 APP_LOGW("appId %{public}s invalid", asyncCallbackInfo->bundleName.c_str());
698                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
699                 return nullptr;
700             }
701         } else if (i == ARGS_SIZE_ONE) {
702             if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->flags)) {
703                 APP_LOGE("Flags %{public}d invalid", asyncCallbackInfo->flags);
704                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, APP_FLAGS, TYPE_NUMBER);
705                 return nullptr;
706             }
707         } else if (i == ARGS_SIZE_TWO) {
708             if (valueType == napi_function) {
709                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
710                 break;
711             }
712             if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->userId)) {
713                 APP_LOGW("Parse userId failed, set this parameter to the caller userId");
714             }
715         } else if (i == ARGS_SIZE_THREE) {
716             if (valueType == napi_function) {
717                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
718             }
719             break;
720         } else {
721             APP_LOGE("param check error");
722             BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
723             return nullptr;
724         }
725     }
726     auto promise = CommonFunc::AsyncCallNativeMethod<ApplicationInfoCallbackInfo>(
727         env, asyncCallbackInfo, GET_APPLICATION_INFO, GetApplicationInfoExec, GetApplicationInfoComplete);
728     callbackPtr.release();
729     APP_LOGD("call NAPI_GetApplicationInfo done");
730     return promise;
731 }
732 
GetApplicationInfos(napi_env env,napi_callback_info info)733 napi_value GetApplicationInfos(napi_env env, napi_callback_info info)
734 {
735     APP_LOGD("NAPI_GetApplicationInfos called");
736     NapiArg args(env, info);
737     ApplicationInfosCallbackInfo *asyncCallbackInfo = new (std::nothrow) ApplicationInfosCallbackInfo(env);
738     if (asyncCallbackInfo == nullptr) {
739         APP_LOGE("asyncCallbackInfo is null");
740         return nullptr;
741     }
742     std::unique_ptr<ApplicationInfosCallbackInfo> callbackPtr {asyncCallbackInfo};
743     if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_THREE)) {
744         APP_LOGE("param count invalid");
745         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
746         return nullptr;
747     }
748     asyncCallbackInfo->userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
749     if (args.GetMaxArgc() < ARGS_SIZE_ONE) {
750         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
751         return nullptr;
752     }
753     for (size_t i = 0; i < args.GetMaxArgc(); ++i) {
754         napi_valuetype valueType = napi_undefined;
755         napi_typeof(env, args[i], &valueType);
756         if (i == ARGS_POS_ZERO) {
757             if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->flags)) {
758                 APP_LOGE("Flags %{public}d invalid", asyncCallbackInfo->flags);
759                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, APP_FLAGS, TYPE_NUMBER);
760                 return nullptr;
761             }
762         } else if (i == ARGS_POS_ONE) {
763             if (valueType == napi_function) {
764                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
765                 break;
766             }
767             if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->userId)) {
768                 APP_LOGW("Parse userId failed, set this parameter to the caller userId");
769             }
770         } else if (i == ARGS_POS_TWO) {
771             if (valueType == napi_function) {
772                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
773             }
774             break;
775         } else {
776             APP_LOGE("param check error");
777             BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
778             return nullptr;
779         }
780     }
781     auto promise = CommonFunc::AsyncCallNativeMethod<ApplicationInfosCallbackInfo>(
782         env, asyncCallbackInfo, GET_APPLICATION_INFOS, GetApplicationInfosExec, GetApplicationInfosComplete);
783     callbackPtr.release();
784     APP_LOGD("call NAPI_GetApplicationInfos done");
785     return promise;
786 }
787 
InnerQueryAbilityInfos(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos)788 static ErrCode InnerQueryAbilityInfos(const Want &want,
789     int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos)
790 {
791     auto iBundleMgr = CommonFunc::GetBundleMgr();
792     if (iBundleMgr == nullptr) {
793         APP_LOGE("iBundleMgr is null");
794         return ERROR_BUNDLE_SERVICE_EXCEPTION;
795     }
796     ErrCode ret = iBundleMgr->QueryAbilityInfosV9(want, flags, userId, abilityInfos);
797     APP_LOGD("QueryAbilityInfosV9 ErrCode : %{public}d", ret);
798     return CommonFunc::ConvertErrCode(ret);
799 }
800 
InnerIsApplicationEnabled(const std::string & bundleName,bool & isEnable,int32_t appIndex)801 static ErrCode InnerIsApplicationEnabled(const std::string &bundleName, bool &isEnable, int32_t appIndex)
802 {
803     auto bundleMgr = CommonFunc::GetBundleMgr();
804     if (bundleMgr == nullptr) {
805         APP_LOGE("CommonFunc::GetBundleMgr failed");
806         return ERROR_BUNDLE_SERVICE_EXCEPTION;
807     }
808     ErrCode ret = ERR_OK;
809     if (appIndex != 0) {
810         ret = bundleMgr->IsCloneApplicationEnabled(bundleName, appIndex, isEnable);
811     } else {
812         ret = bundleMgr->IsApplicationEnabled(bundleName, isEnable);
813     }
814     return CommonFunc::ConvertErrCode(ret);
815 }
816 
InnerGetAbilityLabel(const std::string & bundleName,const std::string & moduleName,const std::string & abilityName,std::string & abilityLabel)817 static ErrCode InnerGetAbilityLabel(const std::string &bundleName, const std::string &moduleName,
818     const std::string &abilityName, std::string &abilityLabel)
819 {
820     auto bundleMgr = CommonFunc::GetBundleMgr();
821     if (bundleMgr == nullptr) {
822         APP_LOGE("CommonFunc::GetBundleMgr failed");
823         return ERROR_SYSTEM_ABILITY_NOT_FOUND;
824     }
825     ErrCode ret = bundleMgr->GetAbilityLabel(bundleName, moduleName, abilityName, abilityLabel);
826     return CommonFunc::ConvertErrCode(ret);
827 }
828 
829 #ifdef BUNDLE_FRAMEWORK_GET_ABILITY_ICON_ENABLED
LoadImageFile(const uint8_t * data,size_t len)830 static std::shared_ptr<Media::PixelMap> LoadImageFile(const uint8_t *data, size_t len)
831 {
832     APP_LOGD("begin LoadImageFile");
833     uint32_t errorCode = 0;
834     Media::SourceOptions opts;
835     std::unique_ptr<Media::ImageSource> imageSource = Media::ImageSource::CreateImageSource(data, len, opts, errorCode);
836     if ((errorCode != 0) || (imageSource == nullptr)) {
837         APP_LOGE("failed to create image source err is %{public}d", errorCode);
838         return nullptr;
839     }
840 
841     Media::DecodeOptions decodeOpts;
842     auto pixelMapPtr = imageSource->CreatePixelMap(decodeOpts, errorCode);
843     if (errorCode != 0) {
844         APP_LOGE("failed to create pixelmap err %{public}d", errorCode);
845         return nullptr;
846     }
847     APP_LOGD("LoadImageFile finish");
848     return std::shared_ptr<Media::PixelMap>(std::move(pixelMapPtr));
849 }
850 
InnerGetAbilityIcon(const std::string & bundleName,const std::string & moduleName,const std::string & abilityName,std::shared_ptr<Media::PixelMap> & pixelMap)851 static ErrCode InnerGetAbilityIcon(const std::string &bundleName, const std::string &moduleName,
852     const std::string &abilityName, std::shared_ptr<Media::PixelMap> &pixelMap)
853 {
854     auto bundleMgr = CommonFunc::GetBundleMgr();
855     if (bundleMgr == nullptr) {
856         APP_LOGE("CommonFunc::GetBundleMgr failed");
857         return ERROR_SYSTEM_ABILITY_NOT_FOUND;
858     }
859     if (bundleName.empty() || moduleName.empty() || abilityName.empty()) {
860         APP_LOGE("GetAbilityIcon check param failed");
861         return ERROR_PARAM_CHECK_ERROR;
862     }
863     std::unique_ptr<uint8_t[]> mediaDataPtr = nullptr;
864     size_t len = 0;
865     ErrCode ret = bundleMgr->GetMediaData(bundleName, moduleName, abilityName, mediaDataPtr, len);
866     if (ret != ERR_OK) {
867         APP_LOGE("get media data failed, bundleName is %{public}s", bundleName.c_str());
868         return CommonFunc::ConvertErrCode(ret);
869     }
870     if (mediaDataPtr == nullptr || len == 0) {
871         return ERROR_BUNDLE_SERVICE_EXCEPTION;
872     }
873     auto pixelMapPtr = LoadImageFile(mediaDataPtr.get(), len);
874     if (pixelMapPtr == nullptr) {
875         APP_LOGE("loadImageFile failed");
876         return ERROR_BUNDLE_SERVICE_EXCEPTION;
877     }
878     pixelMap = std::move(pixelMapPtr);
879     return SUCCESS;
880 }
881 #endif
882 
CheckAbilityInfoCache(napi_env env,const Query & query,const OHOS::AAFwk::Want & want,std::vector<AbilityInfo> abilityInfos,napi_value jsObject)883 static void CheckAbilityInfoCache(napi_env env, const Query &query,
884     const OHOS::AAFwk::Want &want, std::vector<AbilityInfo> abilityInfos,  napi_value jsObject)
885 {
886     ElementName element = want.GetElement();
887     if (element.GetBundleName().empty() || element.GetAbilityName().empty()) {
888         return;
889     }
890 
891     uint32_t explicitQueryResultLen = 1;
892     if (abilityInfos.size() != explicitQueryResultLen ||
893         abilityInfos[0].uid != IPCSkeleton::GetCallingUid()) {
894         return;
895     }
896 
897     napi_ref cacheAbilityInfo = nullptr;
898     NAPI_CALL_RETURN_VOID(env, napi_create_reference(env, jsObject, NAPI_RETURN_ONE, &cacheAbilityInfo));
899     std::unique_lock<std::shared_mutex> lock(g_cacheMutex);
900     cache[query] = cacheAbilityInfo;
901 }
902 
CheckAbilityInfoCache(napi_env env,const Query & query,const AbilityCallbackInfo * info,napi_value jsObject)903 static void CheckAbilityInfoCache(
904     napi_env env, const Query &query, const AbilityCallbackInfo *info, napi_value jsObject)
905 {
906     if (info == nullptr) {
907         return;
908     }
909     CheckAbilityInfoCache(env, query, info->want, info->abilityInfos, jsObject);
910 }
911 
CheckBatchAbilityInfoCache(napi_env env,const Query & query,const std::vector<OHOS::AAFwk::Want> & wants,std::vector<AbilityInfo> abilityInfos,napi_value jsObject)912 static void CheckBatchAbilityInfoCache(napi_env env, const Query &query,
913     const std::vector<OHOS::AAFwk::Want> &wants, std::vector<AbilityInfo> abilityInfos,  napi_value jsObject)
914 {
915     for (size_t i = 0; i < wants.size(); i++) {
916         ElementName element = wants[i].GetElement();
917         if (element.GetBundleName().empty() || element.GetAbilityName().empty()) {
918             return;
919         }
920     }
921 
922     uint32_t explicitQueryResultLen = 1;
923     if (abilityInfos.size() != explicitQueryResultLen ||
924         (abilityInfos.size() > 0 && abilityInfos[0].uid != IPCSkeleton::GetCallingUid())) {
925         return;
926     }
927 
928     napi_ref cacheAbilityInfo = nullptr;
929     NAPI_CALL_RETURN_VOID(env, napi_create_reference(env, jsObject, NAPI_RETURN_ONE, &cacheAbilityInfo));
930     std::unique_lock<std::shared_mutex> lock(g_cacheMutex);
931     cache[query] = cacheAbilityInfo;
932 }
933 
CheckBatchAbilityInfoCache(napi_env env,const Query & query,const BatchAbilityCallbackInfo * info,napi_value jsObject)934 static void CheckBatchAbilityInfoCache(
935     napi_env env, const Query &query, const BatchAbilityCallbackInfo *info, napi_value jsObject)
936 {
937     if (info == nullptr) {
938         return;
939     }
940     CheckBatchAbilityInfoCache(env, query, info->wants, info->abilityInfos, jsObject);
941 }
942 
QueryAbilityInfosExec(napi_env env,void * data)943 void QueryAbilityInfosExec(napi_env env, void *data)
944 {
945     AbilityCallbackInfo *asyncCallbackInfo = reinterpret_cast<AbilityCallbackInfo *>(data);
946     if (asyncCallbackInfo == nullptr) {
947         APP_LOGE("asyncCallbackInfo is null");
948         return;
949     }
950     {
951         std::shared_lock<std::shared_mutex> lock(g_cacheMutex);
952         auto item = cache.find(Query(asyncCallbackInfo->want.ToString(),
953             QUERY_ABILITY_INFOS, asyncCallbackInfo->flags, asyncCallbackInfo->userId, env));
954         if (item != cache.end()) {
955             asyncCallbackInfo->isSavedInCache = true;
956             APP_LOGD("has cache, no need to query from host");
957             return;
958         }
959     }
960     asyncCallbackInfo->err = InnerQueryAbilityInfos(asyncCallbackInfo->want, asyncCallbackInfo->flags,
961         asyncCallbackInfo->userId, asyncCallbackInfo->abilityInfos);
962 }
963 
QueryAbilityInfosComplete(napi_env env,napi_status status,void * data)964 void QueryAbilityInfosComplete(napi_env env, napi_status status, void *data)
965 {
966     APP_LOGI_NOFUNC("QueryAbilityInfosComplete begin");
967     AbilityCallbackInfo *asyncCallbackInfo = reinterpret_cast<AbilityCallbackInfo *>(data);
968     if (asyncCallbackInfo == nullptr) {
969         APP_LOGE("asyncCallbackInfo is null");
970         return;
971     }
972     std::unique_ptr<AbilityCallbackInfo> callbackPtr {asyncCallbackInfo};
973     napi_value result[2] = {0};
974     if (asyncCallbackInfo->err == NO_ERROR) {
975         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
976         if (asyncCallbackInfo->isSavedInCache) {
977             std::shared_lock<std::shared_mutex> lock(g_cacheMutex);
978             auto item = cache.find(Query(asyncCallbackInfo->want.ToString(),
979                 QUERY_ABILITY_INFOS, asyncCallbackInfo->flags, asyncCallbackInfo->userId, env));
980             if (item == cache.end()) {
981                 APP_LOGE("cannot find result in cache");
982                 return;
983             }
984             NAPI_CALL_RETURN_VOID(env, napi_get_reference_value(env, item->second, &result[1]));
985         } else {
986             NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &result[1]));
987             CommonFunc::ConvertAbilityInfos(env, asyncCallbackInfo->abilityInfos, result[1]);
988             Query query(asyncCallbackInfo->want.ToString(),
989                 QUERY_ABILITY_INFOS, asyncCallbackInfo->flags, asyncCallbackInfo->userId, env);
990             CheckAbilityInfoCache(env, query, asyncCallbackInfo, result[1]);
991         }
992     } else {
993         result[0] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
994             QUERY_ABILITY_INFOS, BUNDLE_PERMISSIONS);
995     }
996     APP_LOGI_NOFUNC("QueryAbilityInfosComplete before return");
997     CommonFunc::NapiReturnDeferred<AbilityCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
998 }
999 
QueryAbilityInfos(napi_env env,napi_callback_info info)1000 napi_value QueryAbilityInfos(napi_env env, napi_callback_info info)
1001 {
1002     APP_LOGI_NOFUNC("napi QueryAbilityInfos");
1003     NapiArg args(env, info);
1004     if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_FOUR)) {
1005         APP_LOGE("param count invalid");
1006         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1007         return nullptr;
1008     }
1009     if (IsArray(env, args[0])) {
1010         return BatchQueryAbilityInfos(env, info);
1011     }
1012     AbilityCallbackInfo *asyncCallbackInfo = new (std::nothrow) AbilityCallbackInfo(env);
1013     if (asyncCallbackInfo == nullptr) {
1014         APP_LOGE("asyncCallbackInfo is null");
1015         return nullptr;
1016     }
1017     asyncCallbackInfo->userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
1018     std::unique_ptr<AbilityCallbackInfo> callbackPtr {asyncCallbackInfo};
1019     for (size_t i = 0; i < args.GetMaxArgc(); ++i) {
1020         napi_valuetype valueType = napi_undefined;
1021         napi_typeof(env, args[i], &valueType);
1022         if ((i == ARGS_POS_ZERO) && (valueType == napi_object)) {
1023             // parse want with parameter
1024             if (!ParseWantWithParameter(env, args[i], asyncCallbackInfo->want)) {
1025                 APP_LOGE("invalid want");
1026                 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, INVALID_WANT_ERROR);
1027                 return nullptr;
1028             }
1029         } else if ((i == ARGS_POS_ONE) && (valueType == napi_number)) {
1030             CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->flags);
1031         } else if (i == ARGS_POS_TWO) {
1032             if (valueType == napi_function) {
1033                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
1034                 break;
1035             }
1036             if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->userId)) {
1037                 APP_LOGW("Parse userId failed, set this parameter to the caller userId");
1038             }
1039         } else if (i == ARGS_POS_THREE) {
1040             if (valueType == napi_function) {
1041                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
1042             }
1043             break;
1044         } else {
1045             APP_LOGE("param check error");
1046             std::string errMsg = PARAM_TYPE_CHECK_ERROR_WITH_POS + std::to_string(i + 1);
1047             BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, errMsg);
1048             return nullptr;
1049         }
1050     }
1051     auto promise = CommonFunc::AsyncCallNativeMethod<AbilityCallbackInfo>(
1052         env, asyncCallbackInfo, QUERY_ABILITY_INFOS, QueryAbilityInfosExec, QueryAbilityInfosComplete);
1053     callbackPtr.release();
1054     APP_LOGI_NOFUNC("napi QueryAbilityInfos end");
1055     return promise;
1056 }
1057 
GetAllPluginInfoExec(napi_env env,void * data)1058 void GetAllPluginInfoExec(napi_env env, void *data)
1059 {
1060     PluginCallbackInfo *asyncCallbackInfo = reinterpret_cast<PluginCallbackInfo *>(data);
1061     if (asyncCallbackInfo == nullptr) {
1062         APP_LOGE("asyncCallbackInfo is null");
1063         return;
1064     }
1065     asyncCallbackInfo->err = BundleManagerHelper::InnerGetAllPluginInfo(asyncCallbackInfo->hostBundleName,
1066         asyncCallbackInfo->userId, asyncCallbackInfo->pluginBundleInfos);
1067 }
1068 
ProcessPluginInfos(napi_env env,napi_value result,const std::vector<PluginBundleInfo> & pluginBundleInfos)1069 static void ProcessPluginInfos(
1070     napi_env env, napi_value result, const std::vector<PluginBundleInfo> &pluginBundleInfos)
1071 {
1072     if (pluginBundleInfos.empty()) {
1073         APP_LOGD("pluginBundleInfos is null");
1074         return;
1075     }
1076     size_t index = 0;
1077     for (const auto &item : pluginBundleInfos) {
1078         napi_value objPluginInfo;
1079         NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &objPluginInfo));
1080         CommonFunc::ConvertPluginBundleInfo(env, item, objPluginInfo);
1081         NAPI_CALL_RETURN_VOID(env, napi_set_element(env, result, index, objPluginInfo));
1082         index++;
1083     }
1084 }
1085 
GetAllPluginInfoComplete(napi_env env,napi_status status,void * data)1086 void GetAllPluginInfoComplete(napi_env env, napi_status status, void *data)
1087 {
1088     APP_LOGI("GetAllPluginInfoComplete begin");
1089     PluginCallbackInfo *asyncCallbackInfo = reinterpret_cast<PluginCallbackInfo *>(data);
1090     if (asyncCallbackInfo == nullptr) {
1091         APP_LOGE("asyncCallbackInfo is null");
1092         return;
1093     }
1094     std::unique_ptr<PluginCallbackInfo> callbackPtr {asyncCallbackInfo};
1095     napi_value result[CALLBACK_PARAM_SIZE] = {0};
1096     if (asyncCallbackInfo->err == NO_ERROR) {
1097         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
1098         NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &result[ARGS_POS_ONE]));
1099         ProcessPluginInfos(env, result[ARGS_POS_ONE], asyncCallbackInfo->pluginBundleInfos);
1100     } else {
1101         result[ARGS_POS_ZERO] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
1102             GET_ALL_PLUGIN_INFO, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
1103     }
1104     CommonFunc::NapiReturnDeferred<PluginCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
1105 }
1106 
GetAllPluginInfo(napi_env env,napi_callback_info info)1107 napi_value GetAllPluginInfo(napi_env env, napi_callback_info info)
1108 {
1109     APP_LOGI("napi GetAllPluginInfo begin");
1110     NapiArg args(env, info);
1111     PluginCallbackInfo *asyncCallbackInfo = new (std::nothrow) PluginCallbackInfo(env);
1112     if (asyncCallbackInfo == nullptr) {
1113         APP_LOGE("asyncCallbackInfo is null");
1114         return nullptr;
1115     }
1116     std::unique_ptr<PluginCallbackInfo> callbackPtr {asyncCallbackInfo};
1117     if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_TWO)) {
1118         APP_LOGE("param count invalid");
1119         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1120         return nullptr;
1121     }
1122     asyncCallbackInfo->userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
1123     for (size_t i = 0; i < args.GetMaxArgc(); ++i) {
1124         napi_valuetype valueType = napi_undefined;
1125         napi_typeof(env, args[i], &valueType);
1126         if (i == ARGS_POS_ZERO) {
1127             if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->hostBundleName)) {
1128                 APP_LOGE("parse hostBundleName failed");
1129                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, HOST_BUNDLE_NAME, TYPE_STRING);
1130                 return nullptr;
1131             }
1132         } else if (i == ARGS_SIZE_ONE) {
1133             if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->userId)) {
1134                 APP_LOGW("Parse userId failed, set this parameter to the caller userId");
1135             }
1136         } else {
1137             APP_LOGE("param check error");
1138             BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
1139             return nullptr;
1140         }
1141     }
1142     auto promise = CommonFunc::AsyncCallNativeMethod<PluginCallbackInfo>(
1143         env, asyncCallbackInfo, GET_ALL_PLUGIN_INFO, GetAllPluginInfoExec, GetAllPluginInfoComplete);
1144     callbackPtr.release();
1145     APP_LOGI_NOFUNC("napi GetAllPluginInfo end");
1146     return promise;
1147 }
1148 
BatchQueryAbilityInfosExec(napi_env env,void * data)1149 void BatchQueryAbilityInfosExec(napi_env env, void *data)
1150 {
1151     BatchAbilityCallbackInfo *asyncCallbackInfo = reinterpret_cast<BatchAbilityCallbackInfo *>(data);
1152     if (asyncCallbackInfo == nullptr) {
1153         APP_LOGE("asyncCallbackInfo is null");
1154         return;
1155     }
1156     {
1157         std::shared_lock<std::shared_mutex> lock(g_cacheMutex);
1158         std::string bundleNames = "[";
1159         for (uint32_t i = 0; i < asyncCallbackInfo->wants.size(); i++) {
1160             bundleNames += ((i > 0) ? "," : "");
1161             bundleNames += asyncCallbackInfo->wants[i].ToString();
1162         }
1163         bundleNames += "]";
1164         auto item = cache.find(Query(bundleNames,
1165             BATCH_QUERY_ABILITY_INFOS, asyncCallbackInfo->flags, asyncCallbackInfo->userId, env));
1166         if (item != cache.end()) {
1167             asyncCallbackInfo->isSavedInCache = true;
1168             APP_LOGE("has cache, no need to query from host");
1169             return;
1170         }
1171     }
1172     asyncCallbackInfo->err = BundleManagerHelper::InnerBatchQueryAbilityInfos(
1173         asyncCallbackInfo->wants, asyncCallbackInfo->flags,
1174         asyncCallbackInfo->userId, asyncCallbackInfo->abilityInfos);
1175 }
1176 
BatchQueryAbilityInfosComplete(napi_env env,napi_status status,void * data)1177 void BatchQueryAbilityInfosComplete(napi_env env, napi_status status, void *data)
1178 {
1179     BatchAbilityCallbackInfo *asyncCallbackInfo = reinterpret_cast<BatchAbilityCallbackInfo *>(data);
1180     if (asyncCallbackInfo == nullptr) {
1181         APP_LOGE("asyncCallbackInfo is null");
1182         return;
1183     }
1184     std::unique_ptr<BatchAbilityCallbackInfo> callbackPtr {asyncCallbackInfo};
1185     napi_value result[2] = {0};
1186     if (asyncCallbackInfo->err == NO_ERROR) {
1187         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
1188         if (asyncCallbackInfo->isSavedInCache) {
1189             std::shared_lock<std::shared_mutex> lock(g_cacheMutex);
1190             std::string bundleNames = "[";
1191             for (uint32_t i = 0; i < asyncCallbackInfo->wants.size(); i++) {
1192                 bundleNames += ((i > 0) ? "," : "");
1193                 bundleNames += asyncCallbackInfo->wants[i].ToString();
1194             }
1195             bundleNames += "]";
1196             auto item = cache.find(Query(bundleNames,
1197                 BATCH_QUERY_ABILITY_INFOS, asyncCallbackInfo->flags, asyncCallbackInfo->userId, env));
1198             if (item == cache.end()) {
1199                 APP_LOGE("cannot find result in cache");
1200                 return;
1201             }
1202             NAPI_CALL_RETURN_VOID(env, napi_get_reference_value(env, item->second, &result[1]));
1203         } else {
1204             NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &result[1]));
1205             CommonFunc::ConvertAbilityInfos(env, asyncCallbackInfo->abilityInfos, result[1]);
1206             std::string bundleNames = "[";
1207             for (uint32_t i = 0; i < asyncCallbackInfo->wants.size(); i++) {
1208                 bundleNames += ((i > 0) ? "," : "");
1209                 bundleNames += asyncCallbackInfo->wants[i].ToString();
1210             }
1211             bundleNames += "]";
1212             Query query(bundleNames,
1213                 BATCH_QUERY_ABILITY_INFOS, asyncCallbackInfo->flags, asyncCallbackInfo->userId, env);
1214             CheckBatchAbilityInfoCache(env, query, asyncCallbackInfo, result[1]);
1215         }
1216     } else {
1217         result[0] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
1218             BATCH_QUERY_ABILITY_INFOS, BUNDLE_PERMISSIONS);
1219     }
1220     APP_LOGI("before return");
1221     CommonFunc::NapiReturnDeferred<BatchAbilityCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
1222 }
1223 
BatchQueryAbilityInfos(napi_env env,napi_callback_info info)1224 napi_value BatchQueryAbilityInfos(napi_env env, napi_callback_info info)
1225 {
1226     APP_LOGI("begin to BatchQueryAbilityInfos");
1227     NapiArg args(env, info);
1228     BatchAbilityCallbackInfo *asyncCallbackInfo = new (std::nothrow) BatchAbilityCallbackInfo(env);
1229     if (asyncCallbackInfo == nullptr) {
1230         APP_LOGE("asyncCallbackInfo is null");
1231         return nullptr;
1232     }
1233     asyncCallbackInfo->userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
1234     std::unique_ptr<BatchAbilityCallbackInfo> callbackPtr {asyncCallbackInfo};
1235     if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_THREE)) {
1236         APP_LOGE("param count invalid");
1237         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1238         return nullptr;
1239     }
1240     for (size_t i = 0; i < args.GetMaxArgc(); ++i) {
1241         napi_valuetype valueType = napi_undefined;
1242         napi_typeof(env, args[i], &valueType);
1243         if ((i == ARGS_POS_ZERO) && (valueType == napi_object)) {
1244             // parse want with parameter
1245             if (!ParseWantListWithParameter(env, args[i], asyncCallbackInfo->wants)) {
1246                 APP_LOGE("invalid wants");
1247                 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, INVALID_WANT_ERROR);
1248                 return nullptr;
1249             }
1250         } else if ((i == ARGS_POS_ONE) && (valueType == napi_number)) {
1251             CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->flags);
1252         } else if (i == ARGS_POS_TWO) {
1253             if (valueType == napi_function) {
1254                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
1255                 break;
1256             }
1257             if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->userId)) {
1258                 APP_LOGW("Parse userId failed, set this parameter to the caller userId");
1259             }
1260         } else {
1261             APP_LOGE("param check error");
1262             std::string errMsg = PARAM_TYPE_CHECK_ERROR_WITH_POS + std::to_string(i + 1);
1263             BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, errMsg);
1264             return nullptr;
1265         }
1266     }
1267     auto promise = CommonFunc::AsyncCallNativeMethod<BatchAbilityCallbackInfo>(
1268         env, asyncCallbackInfo, BATCH_QUERY_ABILITY_INFOS, BatchQueryAbilityInfosExec, BatchQueryAbilityInfosComplete);
1269     callbackPtr.release();
1270     APP_LOGI("call BatchQueryAbilityInfos done");
1271     return promise;
1272 }
1273 
ParamsProcessQueryAbilityInfosSync(napi_env env,napi_callback_info info,OHOS::AAFwk::Want & want,int32_t & abilityFlags,int32_t & userId)1274 ErrCode ParamsProcessQueryAbilityInfosSync(napi_env env, napi_callback_info info,
1275     OHOS::AAFwk::Want& want, int32_t& abilityFlags, int32_t& userId)
1276 {
1277     NapiArg args(env, info);
1278     if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_THREE)) {
1279         APP_LOGE("param count invalid");
1280         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1281         return ERROR_PARAM_CHECK_ERROR;
1282     }
1283     for (size_t i = 0; i < args.GetMaxArgc(); ++i) {
1284         napi_valuetype valueType = napi_undefined;
1285         napi_typeof(env, args[i], &valueType);
1286         if (i == ARGS_POS_ZERO) {
1287             // parse want with parameter
1288             if (!ParseWantWithParameter(env, args[i], want)) {
1289                 APP_LOGE("invalid want");
1290                 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, INVALID_WANT_ERROR);
1291                 return ERROR_PARAM_CHECK_ERROR;
1292             }
1293         } else if (i == ARGS_POS_ONE) {
1294             if (!CommonFunc::ParseInt(env, args[i], abilityFlags)) {
1295                 APP_LOGE("abilityFlags %{public}d invalid", abilityFlags);
1296                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, ABILITY_FLAGS, TYPE_NUMBER);
1297                 return ERROR_PARAM_CHECK_ERROR;
1298             }
1299         } else if (i == ARGS_POS_TWO) {
1300             if (!CommonFunc::ParseInt(env, args[i], userId)) {
1301                 APP_LOGW("Parse userId failed, set this parameter to the caller userId");
1302             }
1303         } else {
1304             APP_LOGE("parameter is invalid");
1305             BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
1306             return ERROR_PARAM_CHECK_ERROR;
1307         }
1308     }
1309     if (userId == Constants::UNSPECIFIED_USERID) {
1310         userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
1311     }
1312     return ERR_OK;
1313 }
1314 
QueryAbilityInfosSync(napi_env env,napi_callback_info info)1315 napi_value QueryAbilityInfosSync(napi_env env, napi_callback_info info)
1316 {
1317     APP_LOGD("NAPI QueryAbilityInfosSync call");
1318     OHOS::AAFwk::Want want;
1319     int32_t abilityFlags = 0;
1320     int32_t userId = Constants::UNSPECIFIED_USERID;
1321     if (ParamsProcessQueryAbilityInfosSync(env, info, want, abilityFlags, userId) != ERR_OK) {
1322         APP_LOGE("paramsProcess is invalid");
1323         BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
1324         return nullptr;
1325     }
1326     napi_value nAbilityInfos = nullptr;
1327     {
1328         std::shared_lock<std::shared_mutex> lock(g_cacheMutex);
1329         auto item = cache.find(Query(want.ToString(),
1330             QUERY_ABILITY_INFOS_SYNC, abilityFlags, userId, env));
1331         if (item != cache.end()) {
1332             APP_LOGD("QueryAbilityInfosSync param from cache");
1333             NAPI_CALL(env,
1334                 napi_get_reference_value(env, item->second, &nAbilityInfos));
1335             return nAbilityInfos;
1336         }
1337     }
1338     auto iBundleMgr = CommonFunc::GetBundleMgr();
1339     if (iBundleMgr == nullptr) {
1340         APP_LOGE("can not get iBundleMgr");
1341         BusinessError::ThrowError(env, ERROR_BUNDLE_SERVICE_EXCEPTION, ERR_MSG_BUNDLE_SERVICE_EXCEPTION);
1342         return nullptr;
1343     }
1344     std::vector<AbilityInfo> abilityInfos;
1345     ErrCode ret = CommonFunc::ConvertErrCode(
1346         iBundleMgr->QueryAbilityInfosV9(want, abilityFlags, userId, abilityInfos));
1347     if (ret != NO_ERROR) {
1348         APP_LOGE("QueryAbilityInfosV9 failed");
1349         napi_value businessError = BusinessError::CreateCommonError(
1350             env, ret, QUERY_ABILITY_INFOS_SYNC, BUNDLE_PERMISSIONS);
1351         napi_throw(env, businessError);
1352         return nullptr;
1353     }
1354     NAPI_CALL(env, napi_create_array(env, &nAbilityInfos));
1355     CommonFunc::ConvertAbilityInfos(env, abilityInfos, nAbilityInfos);
1356     Query query(want.ToString(),
1357                 QUERY_ABILITY_INFOS_SYNC, abilityFlags, userId, env);
1358     CheckAbilityInfoCache(env, query, want, abilityInfos, nAbilityInfos);
1359     APP_LOGD("call QueryAbilityInfosSync done");
1360     return nAbilityInfos;
1361 }
1362 
InnerQueryExtensionInfos(ExtensionCallbackInfo * info)1363 static ErrCode InnerQueryExtensionInfos(ExtensionCallbackInfo *info)
1364 {
1365     if (info == nullptr) {
1366         APP_LOGE("ExtensionCallbackInfo is null");
1367         return ERROR_BUNDLE_SERVICE_EXCEPTION;
1368     }
1369     auto iBundleMgr = CommonFunc::GetBundleMgr();
1370     if (iBundleMgr == nullptr) {
1371         APP_LOGE("iBundleMgr is null");
1372         return ERROR_BUNDLE_SERVICE_EXCEPTION;
1373     }
1374     ErrCode ret = ERR_OK;
1375     if (info->extensionAbilityType == static_cast<int32_t>(ExtensionAbilityType::UNSPECIFIED)) {
1376         APP_LOGD("query extensionAbilityInfo without type");
1377         ret = iBundleMgr->QueryExtensionAbilityInfosV9(info->want, info->flags, info->userId, info->extensionInfos);
1378     } else {
1379         ExtensionAbilityType type = static_cast<ExtensionAbilityType>(info->extensionAbilityType);
1380         APP_LOGD("query extensionAbilityInfo with type %{public}d", info->extensionAbilityType);
1381         ret = iBundleMgr->QueryExtensionAbilityInfosV9(
1382             info->want, type, info->flags, info->userId, info->extensionInfos);
1383     }
1384     APP_LOGD("QueryExtensionAbilityInfosV9 ErrCode : %{public}d", ret);
1385     return CommonFunc::ConvertErrCode(ret);
1386 }
1387 
HandleExtensionCache(napi_env env,const Query & query,const ExtensionCallbackInfo * info,napi_value jsObject)1388 static void HandleExtensionCache(
1389     napi_env env, const Query &query, const ExtensionCallbackInfo *info, napi_value jsObject)
1390 {
1391     if (info == nullptr) {
1392         return;
1393     }
1394 
1395     ElementName element = info->want.GetElement();
1396     if (element.GetBundleName().empty() || element.GetAbilityName().empty()) {
1397         return;
1398     }
1399 
1400     uint32_t explicitQueryResultLen = 1;
1401     if (info->extensionInfos.size() != explicitQueryResultLen ||
1402         info->extensionInfos[0].uid != IPCSkeleton::GetCallingUid()) {
1403         return;
1404     }
1405 
1406     napi_ref cacheExtensionInfo = nullptr;
1407     NAPI_CALL_RETURN_VOID(env, napi_create_reference(env, jsObject, NAPI_RETURN_ONE, &cacheExtensionInfo));
1408     std::unique_lock<std::shared_mutex> lock(g_cacheMutex);
1409     cache[query] = cacheExtensionInfo;
1410 }
1411 
QueryExtensionInfosExec(napi_env env,void * data)1412 void QueryExtensionInfosExec(napi_env env, void *data)
1413 {
1414     ExtensionCallbackInfo *asyncCallbackInfo = reinterpret_cast<ExtensionCallbackInfo *>(data);
1415     if (asyncCallbackInfo == nullptr) {
1416         APP_LOGE("asyncCallbackInfo is null");
1417         return;
1418     }
1419     {
1420         std::shared_lock<std::shared_mutex> lock(g_cacheMutex);
1421         std::string key = asyncCallbackInfo->want.ToString() + std::to_string(asyncCallbackInfo->extensionAbilityType);
1422         auto item = cache.find(
1423             Query(key, QUERY_EXTENSION_INFOS, asyncCallbackInfo->flags, asyncCallbackInfo->userId, env));
1424         if (item != cache.end()) {
1425             asyncCallbackInfo->isSavedInCache = true;
1426             APP_LOGD("extension has cache, no need to query from host");
1427             return;
1428         }
1429     }
1430     asyncCallbackInfo->err = InnerQueryExtensionInfos(asyncCallbackInfo);
1431 }
1432 
QueryExtensionInfosComplete(napi_env env,napi_status status,void * data)1433 void QueryExtensionInfosComplete(napi_env env, napi_status status, void *data)
1434 {
1435     ExtensionCallbackInfo *asyncCallbackInfo = reinterpret_cast<ExtensionCallbackInfo *>(data);
1436     if (asyncCallbackInfo == nullptr) {
1437         APP_LOGE("asyncCallbackInfo is null");
1438         return;
1439     }
1440     std::unique_ptr<ExtensionCallbackInfo> callbackPtr {asyncCallbackInfo};
1441     napi_value result[2] = {0};
1442     if (asyncCallbackInfo->err == NO_ERROR) {
1443         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
1444         NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &result[1]));
1445         std::string key = asyncCallbackInfo->want.ToString() + std::to_string(asyncCallbackInfo->extensionAbilityType);
1446         Query query(key, QUERY_EXTENSION_INFOS, asyncCallbackInfo->flags, asyncCallbackInfo->userId, env);
1447         if (asyncCallbackInfo->isSavedInCache) {
1448             // get from cache
1449             std::shared_lock<std::shared_mutex> lock(g_cacheMutex);
1450             auto item = cache.find(query);
1451             if (item != cache.end()) {
1452                 NAPI_CALL_RETURN_VOID(env, napi_get_reference_value(env, item->second, &result[1]));
1453             } else {
1454                 APP_LOGE("extension not in cache");
1455                 asyncCallbackInfo->isSavedInCache = false;
1456             }
1457         } else {
1458             CommonFunc::ConvertExtensionInfos(env, asyncCallbackInfo->extensionInfos, result[1]);
1459             // optionally save to cache
1460             HandleExtensionCache(env, query, asyncCallbackInfo, result[1]);
1461         }
1462     } else {
1463         result[0] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
1464             QUERY_EXTENSION_INFOS, BUNDLE_PERMISSIONS);
1465     }
1466     CommonFunc::NapiReturnDeferred<ExtensionCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
1467 }
1468 
QueryExtensionInfos(napi_env env,napi_callback_info info)1469 napi_value QueryExtensionInfos(napi_env env, napi_callback_info info)
1470 {
1471     APP_LOGD("begin to QueryExtensionInfos");
1472     NapiArg args(env, info);
1473     ExtensionCallbackInfo *asyncCallbackInfo = new (std::nothrow) ExtensionCallbackInfo(env);
1474     if (asyncCallbackInfo == nullptr) {
1475         APP_LOGE("asyncCallbackInfo is null");
1476         return nullptr;
1477     }
1478     asyncCallbackInfo->userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
1479     std::unique_ptr<ExtensionCallbackInfo> callbackPtr {asyncCallbackInfo};
1480     if (!args.Init(ARGS_SIZE_THREE, ARGS_SIZE_FIVE)) {
1481         APP_LOGE("param count invalid");
1482         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1483         return nullptr;
1484     }
1485     for (size_t i = 0; i < args.GetMaxArgc(); ++i) {
1486         napi_valuetype valueType = napi_undefined;
1487         napi_typeof(env, args[i], &valueType);
1488         if ((i == ARGS_POS_ZERO) && (valueType == napi_object)) {
1489             // parse want with parameter
1490             if (!ParseWantWithParameter(env, args[i], asyncCallbackInfo->want)) {
1491                 APP_LOGE("invalid want");
1492                 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, INVALID_WANT_ERROR);
1493                 return nullptr;
1494             }
1495         } else if ((i == ARGS_POS_ONE) && (valueType == napi_number)) {
1496             CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->extensionAbilityType);
1497         } else if ((i == ARGS_POS_TWO) && (valueType == napi_number)) {
1498             CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->flags);
1499         } else if (i == ARGS_POS_THREE) {
1500             if (valueType == napi_function) {
1501                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
1502                 break;
1503             }
1504             if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->userId)) {
1505                 APP_LOGW("Parse userId failed, set this parameter to the caller userId");
1506             }
1507         } else if (i == ARGS_POS_FOUR) {
1508             if (valueType == napi_function) {
1509                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
1510             }
1511             break;
1512         } else {
1513             APP_LOGE("param check error");
1514             std::string errMsg = PARAM_TYPE_CHECK_ERROR_WITH_POS + std::to_string(i + 1);
1515             BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, errMsg);
1516             return nullptr;
1517         }
1518     }
1519     auto promise = CommonFunc::AsyncCallNativeMethod<ExtensionCallbackInfo>(
1520         env, asyncCallbackInfo, QUERY_EXTENSION_INFOS, QueryExtensionInfosExec, QueryExtensionInfosComplete);
1521     callbackPtr.release();
1522     APP_LOGD("call QueryExtensionInfos done");
1523     return promise;
1524 }
1525 
CreateAbilityFlagObject(napi_env env,napi_value value)1526 void CreateAbilityFlagObject(napi_env env, napi_value value)
1527 {
1528     napi_value nGetAbilityInfoDefault;
1529     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
1530         GetAbilityInfoFlag::GET_ABILITY_INFO_DEFAULT), &nGetAbilityInfoDefault));
1531     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_ABILITY_INFO_DEFAULT",
1532         nGetAbilityInfoDefault));
1533 
1534     napi_value nGetAbilityInfoWithPermission;
1535     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
1536         GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_PERMISSION), &nGetAbilityInfoWithPermission));
1537     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_ABILITY_INFO_WITH_PERMISSION",
1538         nGetAbilityInfoWithPermission));
1539 
1540     napi_value nGetAbilityInfoWithApplication;
1541     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
1542         GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_APPLICATION), &nGetAbilityInfoWithApplication));
1543     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_ABILITY_INFO_WITH_APPLICATION",
1544         nGetAbilityInfoWithApplication));
1545 
1546     napi_value nGetAbilityInfoWithMetadata;
1547     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
1548         GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_METADATA), &nGetAbilityInfoWithMetadata));
1549     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_ABILITY_INFO_WITH_METADATA",
1550         nGetAbilityInfoWithMetadata));
1551 
1552     napi_value nGetAbilityInfoWithDisabled;
1553     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
1554         GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_DISABLE), &nGetAbilityInfoWithDisabled));
1555     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_ABILITY_INFO_WITH_DISABLE",
1556         nGetAbilityInfoWithDisabled));
1557 
1558     napi_value nGetAbilityInfOnlySystemApp;
1559     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
1560         GetAbilityInfoFlag::GET_ABILITY_INFO_ONLY_SYSTEM_APP), &nGetAbilityInfOnlySystemApp));
1561     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_ABILITY_INFO_ONLY_SYSTEM_APP",
1562         nGetAbilityInfOnlySystemApp));
1563 
1564     napi_value nGetAbilityInfoWithSkill;
1565     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
1566         GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_SKILL), &nGetAbilityInfoWithSkill));
1567     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_ABILITY_INFO_WITH_SKILL",
1568         nGetAbilityInfoWithSkill));
1569 
1570     napi_value nGetAbilityInfoWithAppLinking;
1571     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
1572         GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_APP_LINKING), &nGetAbilityInfoWithAppLinking));
1573     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_ABILITY_INFO_WITH_APP_LINKING",
1574         nGetAbilityInfoWithAppLinking));
1575 }
1576 
GetAbilityLabelExec(napi_env env,void * data)1577 void GetAbilityLabelExec(napi_env env, void *data)
1578 {
1579     AbilityLabelCallbackInfo *asyncCallbackInfo = reinterpret_cast<AbilityLabelCallbackInfo *>(data);
1580     if (asyncCallbackInfo == nullptr) {
1581         APP_LOGE("asyncCallbackInfo is nullptr");
1582         return;
1583     }
1584     asyncCallbackInfo->err = InnerGetAbilityLabel(asyncCallbackInfo->bundleName,
1585         asyncCallbackInfo->moduleName, asyncCallbackInfo->abilityName, asyncCallbackInfo->abilityLabel);
1586 }
1587 
GetAbilityLabelComplete(napi_env env,napi_status status,void * data)1588 void GetAbilityLabelComplete(napi_env env, napi_status status, void *data)
1589 {
1590     AbilityLabelCallbackInfo *asyncCallbackInfo = reinterpret_cast<AbilityLabelCallbackInfo *>(data);
1591     if (asyncCallbackInfo == nullptr) {
1592         APP_LOGE("asyncCallbackInfo is null");
1593         return;
1594     }
1595     std::unique_ptr<AbilityLabelCallbackInfo> callbackPtr {asyncCallbackInfo};
1596     napi_value result[2] = {0};
1597     if (asyncCallbackInfo->err == NO_ERROR) {
1598         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
1599         NAPI_CALL_RETURN_VOID(env, napi_create_string_utf8(env, asyncCallbackInfo->abilityLabel.c_str(),
1600             NAPI_AUTO_LENGTH, &result[1]));
1601     } else {
1602         APP_LOGE("asyncCallbackInfo is null");
1603         result[0] = BusinessError::CreateCommonError(
1604             env, asyncCallbackInfo->err, "GetAbilityLabel", Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
1605     }
1606     CommonFunc::NapiReturnDeferred<AbilityLabelCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
1607 }
1608 
GetAbilityLabel(napi_env env,napi_callback_info info)1609 napi_value GetAbilityLabel(napi_env env, napi_callback_info info)
1610 {
1611     APP_LOGD("begin to GetAbilityLabel");
1612 #ifdef GLOBAL_RESMGR_ENABLE
1613     NapiArg args(env, info);
1614     AbilityLabelCallbackInfo *asyncCallbackInfo = new (std::nothrow) AbilityLabelCallbackInfo(env);
1615     if (asyncCallbackInfo == nullptr) {
1616         APP_LOGE("asyncCallbackInfo is null");
1617         return nullptr;
1618     }
1619     std::unique_ptr<AbilityLabelCallbackInfo> callbackPtr {asyncCallbackInfo};
1620     if (!args.Init(ARGS_SIZE_THREE, ARGS_SIZE_FOUR)) {
1621         APP_LOGE("Napi func init failed");
1622         return nullptr;
1623     }
1624     if (args.GetMaxArgc() >= ARGS_SIZE_THREE) {
1625         if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], asyncCallbackInfo->bundleName)) {
1626             BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
1627             return nullptr;
1628         }
1629         if (!CommonFunc::ParseString(env, args[ARGS_POS_ONE], asyncCallbackInfo->moduleName)) {
1630             BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, MODULE_NAME, TYPE_STRING);
1631             return nullptr;
1632         }
1633         if (!CommonFunc::ParseString(env, args[ARGS_POS_TWO], asyncCallbackInfo->abilityName)) {
1634             BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, ABILITY_NAME, TYPE_STRING);
1635             return nullptr;
1636         }
1637         if (args.GetMaxArgc() == ARGS_SIZE_FOUR) {
1638             napi_valuetype valueType = napi_undefined;
1639             napi_typeof(env, args[ARGS_POS_THREE], &valueType);
1640             if (valueType == napi_function) {
1641                 NAPI_CALL(env, napi_create_reference(env, args[ARGS_POS_THREE],
1642                     NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
1643             }
1644         }
1645     } else {
1646         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1647         return nullptr;
1648     }
1649     auto promise = CommonFunc::AsyncCallNativeMethod<AbilityLabelCallbackInfo>(
1650         env, asyncCallbackInfo, "GetAbilityLabel", GetAbilityLabelExec, GetAbilityLabelComplete);
1651     callbackPtr.release();
1652     APP_LOGD("call GetAbilityLabel done");
1653     return promise;
1654 #else
1655     APP_LOGE("SystemCapability.BundleManager.BundleFramework.Resource not supported");
1656     napi_value error = BusinessError::CreateCommonError(env, ERROR_SYSTEM_ABILITY_NOT_FOUND, "getAbilityLabel");
1657     napi_throw(env, error);
1658     return nullptr;
1659 #endif
1660 }
1661 
1662 #ifdef BUNDLE_FRAMEWORK_GET_ABILITY_ICON_ENABLED
GetAbilityIconExec(napi_env env,void * data)1663 void GetAbilityIconExec(napi_env env, void *data)
1664 {
1665     AbilityIconCallbackInfo *asyncCallbackInfo = reinterpret_cast<AbilityIconCallbackInfo *>(data);
1666     if (asyncCallbackInfo == nullptr) {
1667         APP_LOGE("asyncCallbackInfo is nullptr");
1668         return;
1669     }
1670     asyncCallbackInfo->err = InnerGetAbilityIcon(asyncCallbackInfo->bundleName,
1671         asyncCallbackInfo->moduleName, asyncCallbackInfo->abilityName, asyncCallbackInfo->pixelMap);
1672 }
1673 
GetAbilityIconComplete(napi_env env,napi_status status,void * data)1674 void GetAbilityIconComplete(napi_env env, napi_status status, void *data)
1675 {
1676     AbilityIconCallbackInfo *asyncCallbackInfo = reinterpret_cast<AbilityIconCallbackInfo *>(data);
1677     if (asyncCallbackInfo == nullptr) {
1678         APP_LOGE("asyncCallbackInfo is null");
1679         return;
1680     }
1681     std::unique_ptr<AbilityIconCallbackInfo> callbackPtr {asyncCallbackInfo};
1682     napi_value result[2] = {0};
1683     if (asyncCallbackInfo->err == NO_ERROR) {
1684         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
1685         result[1] = Media::PixelMapNapi::CreatePixelMap(env, asyncCallbackInfo->pixelMap);
1686     } else {
1687         APP_LOGE("asyncCallbackInfo is null");
1688         result[0] = BusinessError::CreateCommonError(
1689             env, asyncCallbackInfo->err, "GetAbilityIcon", Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
1690     }
1691     CommonFunc::NapiReturnDeferred<AbilityIconCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
1692 }
1693 #endif
1694 
GetAbilityIcon(napi_env env,napi_callback_info info)1695 napi_value GetAbilityIcon(napi_env env, napi_callback_info info)
1696 {
1697     APP_LOGD("begin to GetAbilityIcon");
1698 #ifdef BUNDLE_FRAMEWORK_GET_ABILITY_ICON_ENABLED
1699     NapiArg args(env, info);
1700     AbilityIconCallbackInfo *asyncCallbackInfo = new (std::nothrow) AbilityIconCallbackInfo(env);
1701     if (asyncCallbackInfo == nullptr) {
1702         APP_LOGE("asyncCallbackInfo is null");
1703         return nullptr;
1704     }
1705     std::unique_ptr<AbilityIconCallbackInfo> callbackPtr {asyncCallbackInfo};
1706     if (!args.Init(ARGS_SIZE_THREE, ARGS_SIZE_FOUR)) {
1707         APP_LOGE("Napi func init failed");
1708         return nullptr;
1709     }
1710 
1711     if (args.GetMaxArgc() >= ARGS_SIZE_THREE) {
1712         if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], asyncCallbackInfo->bundleName)) {
1713             BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
1714             return nullptr;
1715         }
1716         if (!CommonFunc::ParseString(env, args[ARGS_POS_ONE], asyncCallbackInfo->moduleName)) {
1717             BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, MODULE_NAME, TYPE_STRING);
1718             return nullptr;
1719         }
1720         if (!CommonFunc::ParseString(env, args[ARGS_POS_TWO], asyncCallbackInfo->abilityName)) {
1721             BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, ABILITY_NAME, TYPE_STRING);
1722             return nullptr;
1723         }
1724         if (args.GetMaxArgc() == ARGS_SIZE_FOUR) {
1725             napi_valuetype valueType = napi_undefined;
1726             napi_typeof(env, args[ARGS_POS_THREE], &valueType);
1727             if (valueType == napi_function) {
1728                 NAPI_CALL(env, napi_create_reference(env, args[ARGS_POS_THREE],
1729                     NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
1730             }
1731         }
1732     } else {
1733         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1734         return nullptr;
1735     }
1736     auto promise = CommonFunc::AsyncCallNativeMethod<AbilityIconCallbackInfo>(
1737         env, asyncCallbackInfo, "GetAbilityIcon", GetAbilityIconExec, GetAbilityIconComplete);
1738     callbackPtr.release();
1739     APP_LOGD("call GetAbilityIcon done");
1740     return promise;
1741 #else
1742     APP_LOGE("SystemCapability.BundleManager.BundleFramework.Resource not supported");
1743     napi_value error = BusinessError::CreateCommonError(env, ERROR_SYSTEM_ABILITY_NOT_FOUND, "getAbilityIcon");
1744     napi_throw(env, error);
1745     return nullptr;
1746 #endif
1747 }
1748 
SetApplicationEnabledExec(napi_env env,void * data)1749 void SetApplicationEnabledExec(napi_env env, void *data)
1750 {
1751     ApplicationEnableCallbackInfo *asyncCallbackInfo = reinterpret_cast<ApplicationEnableCallbackInfo *>(data);
1752     if (asyncCallbackInfo == nullptr) {
1753         APP_LOGE("asyncCallbackInfo is nullptr");
1754         return;
1755     }
1756     asyncCallbackInfo->err = BundleManagerHelper::InnerSetApplicationEnabled(asyncCallbackInfo->bundleName,
1757         asyncCallbackInfo->isEnable, asyncCallbackInfo->appIndex);
1758 }
1759 
SetApplicationEnabledComplete(napi_env env,napi_status status,void * data)1760 void SetApplicationEnabledComplete(napi_env env, napi_status status, void *data)
1761 {
1762     ApplicationEnableCallbackInfo *asyncCallbackInfo = reinterpret_cast<ApplicationEnableCallbackInfo *>(data);
1763     if (asyncCallbackInfo == nullptr) {
1764         APP_LOGE("asyncCallbackInfo is null");
1765         return;
1766     }
1767     std::unique_ptr<ApplicationEnableCallbackInfo> callbackPtr {asyncCallbackInfo};
1768     napi_value result[1] = {0};
1769     if (asyncCallbackInfo->err == NO_ERROR) {
1770         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
1771     } else {
1772         APP_LOGE("asyncCallbackInfo is null");
1773         result[0] = BusinessError::CreateCommonError(
1774             env, asyncCallbackInfo->err, "SetApplicationEnabled", Constants::PERMISSION_CHANGE_ABILITY_ENABLED_STATE);
1775     }
1776     CommonFunc::NapiReturnDeferred<ApplicationEnableCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_ONE);
1777 }
1778 
ParseBundleName(napi_env env,const napi_value & value,std::string & bundleName)1779 bool ParseBundleName(napi_env env, const napi_value& value, std::string& bundleName)
1780 {
1781     if (!CommonFunc::ParseString(env, value, bundleName)) {
1782         APP_LOGE("parse bundleName failed");
1783         BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
1784         return false;
1785     }
1786     return true;
1787 }
1788 
ParseAppIndex(napi_env env,const napi_value & value,int32_t & appIndex)1789 bool ParseAppIndex(napi_env env, const napi_value& value, int32_t& appIndex)
1790 {
1791     if (!CommonFunc::ParseInt(env, value, appIndex)) {
1792         APP_LOGE("parse appIndex failed");
1793         BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, APP_INDEX, TYPE_NUMBER);
1794         return false;
1795     }
1796     return true;
1797 }
1798 
ParseIsEnable(napi_env env,const napi_value & value,bool & isEnabled)1799 bool ParseIsEnable(napi_env env, const napi_value& value, bool& isEnabled)
1800 {
1801     if (!CommonFunc::ParseBool(env, value, isEnabled)) {
1802         APP_LOGE("parse isEnabled failed");
1803         BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, IS_ENABLE, TYPE_BOOLEAN);
1804         return false;
1805     }
1806     return true;
1807 }
1808 
HandleSetApplicationEnabledArg(napi_env env,napi_value arg,size_t index,ApplicationEnableCallbackInfo * asyncCallbackInfo,bool & callCloneFunc)1809 bool HandleSetApplicationEnabledArg(
1810     napi_env env, napi_value arg, size_t index, ApplicationEnableCallbackInfo *asyncCallbackInfo,
1811     bool& callCloneFunc)
1812 {
1813     napi_valuetype valueType = napi_undefined;
1814     napi_typeof(env, arg, &valueType);
1815 
1816     if (index == ARGS_POS_ZERO) {
1817         return ParseBundleName(env, arg, asyncCallbackInfo->bundleName);
1818     } else if (index == ARGS_POS_ONE) {
1819         if (valueType == napi_number) {
1820             callCloneFunc = true;
1821             return ParseAppIndex(env, arg, asyncCallbackInfo->appIndex);
1822         } else if (valueType == napi_boolean) {
1823             return ParseIsEnable(env, arg, asyncCallbackInfo->isEnable);
1824         } else {
1825             APP_LOGE("parse isEnable failed");
1826             BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, IS_ENABLE, TYPE_BOOLEAN);
1827             return false;
1828         }
1829     } else if (index == ARGS_POS_TWO) {
1830         if (callCloneFunc && valueType != napi_boolean) {
1831             APP_LOGE("parse isEnable failed");
1832             BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, IS_ENABLE, TYPE_BOOLEAN);
1833             return false;
1834         }
1835         if (valueType == napi_boolean && !CommonFunc::ParseBool(env, arg, asyncCallbackInfo->isEnable)) {
1836             APP_LOGE("parse isEnable failed");
1837             BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, IS_ENABLE, TYPE_BOOLEAN);
1838             return false;
1839         }
1840     } else {
1841         APP_LOGE("param check error");
1842         BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
1843         return false;
1844     }
1845     return true;
1846 }
1847 
SetApplicationEnabled(napi_env env,napi_callback_info info)1848 napi_value SetApplicationEnabled(napi_env env, napi_callback_info info)
1849 {
1850     APP_LOGD("begin to SetApplicationEnabled");
1851     NapiArg args(env, info);
1852     ApplicationEnableCallbackInfo *asyncCallbackInfo = new (std::nothrow) ApplicationEnableCallbackInfo(env);
1853     if (asyncCallbackInfo == nullptr) {
1854         APP_LOGE("asyncCallbackInfo is null");
1855         return nullptr;
1856     }
1857     std::unique_ptr<ApplicationEnableCallbackInfo> callbackPtr {asyncCallbackInfo};
1858     if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_THREE)) {
1859         APP_LOGE("Napi func init failed");
1860         return nullptr;
1861     }
1862     bool callCloneFunc = false;
1863     for (size_t i = 0; i < args.GetMaxArgc(); ++i) {
1864         if (!HandleSetApplicationEnabledArg(env, args[i], i, asyncCallbackInfo, callCloneFunc)) {
1865             return nullptr;
1866         }
1867         if (i == ARGS_POS_TWO) {
1868             napi_valuetype valueType = napi_undefined;
1869             napi_typeof(env, args[i], &valueType);
1870             if (valueType == napi_function) {
1871                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
1872             }
1873         }
1874     }
1875     if (callCloneFunc && (args.GetMaxArgc() == ARGS_SIZE_TWO)) {
1876         APP_LOGE("params are too few for clone app");
1877         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1878         return nullptr;
1879     }
1880 
1881     auto promise = CommonFunc::AsyncCallNativeMethod<ApplicationEnableCallbackInfo>(
1882         env, asyncCallbackInfo, "SetApplicationEnabled", SetApplicationEnabledExec, SetApplicationEnabledComplete);
1883     callbackPtr.release();
1884     APP_LOGD("call SetApplicationEnabled done");
1885     return promise;
1886 }
1887 
SetAbilityEnabledExec(napi_env env,void * data)1888 void SetAbilityEnabledExec(napi_env env, void *data)
1889 {
1890     AbilityEnableCallbackInfo *asyncCallbackInfo = reinterpret_cast<AbilityEnableCallbackInfo *>(data);
1891     if (asyncCallbackInfo == nullptr) {
1892         APP_LOGE("asyncCallbackInfo is nullptr");
1893         return;
1894     }
1895     asyncCallbackInfo->err = BundleManagerHelper::InnerSetAbilityEnabled(asyncCallbackInfo->abilityInfo,
1896         asyncCallbackInfo->isEnable, asyncCallbackInfo->appIndex);
1897 }
1898 
SetAbilityEnabledComplete(napi_env env,napi_status status,void * data)1899 void SetAbilityEnabledComplete(napi_env env, napi_status status, void *data)
1900 {
1901     AbilityEnableCallbackInfo *asyncCallbackInfo = reinterpret_cast<AbilityEnableCallbackInfo *>(data);
1902     if (asyncCallbackInfo == nullptr) {
1903         APP_LOGE("asyncCallbackInfo is null");
1904         return;
1905     }
1906     std::unique_ptr<AbilityEnableCallbackInfo> callbackPtr {asyncCallbackInfo};
1907     napi_value result[1] = {0};
1908     if (asyncCallbackInfo->err == NO_ERROR) {
1909         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
1910     } else {
1911         APP_LOGE("asyncCallbackInfo is null");
1912         result[0] = BusinessError::CreateCommonError(
1913             env, asyncCallbackInfo->err, "SetAbilityEnabled", Constants::PERMISSION_CHANGE_ABILITY_ENABLED_STATE);
1914     }
1915     CommonFunc::NapiReturnDeferred<AbilityEnableCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_ONE);
1916 }
1917 
HandleSetAbilityEnabledArg(napi_env env,napi_value arg,size_t index,AbilityEnableCallbackInfo * asyncCallbackInfo,bool & callCloneFunc)1918 bool HandleSetAbilityEnabledArg(napi_env env, napi_value arg, size_t index,
1919     AbilityEnableCallbackInfo *asyncCallbackInfo, bool& callCloneFunc)
1920 {
1921     napi_valuetype valueType = napi_undefined;
1922     napi_typeof(env, arg, &valueType);
1923 
1924     if (index == ARGS_POS_ZERO) {
1925         if (!CommonFunc::ParseAbilityInfo(env, arg, asyncCallbackInfo->abilityInfo)) {
1926             BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, ABILITY_INFO, TYPE_OBJECT);
1927             return false;
1928         }
1929     } else if (index == ARGS_POS_ONE) {
1930         if (valueType == napi_number) {
1931             callCloneFunc = true;
1932             return ParseAppIndex(env, arg, asyncCallbackInfo->appIndex);
1933         } else if (valueType == napi_boolean) {
1934             return ParseIsEnable(env, arg, asyncCallbackInfo->isEnable);
1935         } else {
1936             APP_LOGE("parse isEnable failed");
1937             BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, IS_ENABLE, TYPE_BOOLEAN);
1938             return false;
1939         }
1940     } else if (index == ARGS_POS_TWO) {
1941         if (callCloneFunc && valueType != napi_boolean) {
1942             APP_LOGE("parse isEnable failed");
1943             BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, IS_ENABLE, TYPE_BOOLEAN);
1944             return false;
1945         }
1946         if (valueType == napi_boolean && !CommonFunc::ParseBool(env, arg, asyncCallbackInfo->isEnable)) {
1947             APP_LOGE("parse isEnable failed");
1948             BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, IS_ENABLE, TYPE_BOOLEAN);
1949             return false;
1950         }
1951     } else {
1952         APP_LOGE("param check error");
1953         BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
1954         return false;
1955     }
1956     return true;
1957 }
1958 
SetAbilityEnabled(napi_env env,napi_callback_info info)1959 napi_value SetAbilityEnabled(napi_env env, napi_callback_info info)
1960 {
1961     APP_LOGD("begin to SetAbilityEnabled");
1962     NapiArg args(env, info);
1963     AbilityEnableCallbackInfo *asyncCallbackInfo = new (std::nothrow) AbilityEnableCallbackInfo(env);
1964     if (asyncCallbackInfo == nullptr) {
1965         APP_LOGE("asyncCallbackInfo is null");
1966         return nullptr;
1967     }
1968     std::unique_ptr<AbilityEnableCallbackInfo> callbackPtr {asyncCallbackInfo};
1969     if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_THREE)) {
1970         APP_LOGE("Napi func init failed");
1971         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1972         return nullptr;
1973     }
1974     bool callCloneFunc = false;
1975     for (size_t i = 0; i < args.GetMaxArgc(); ++i) {
1976         if (!HandleSetAbilityEnabledArg(env, args[i], i, asyncCallbackInfo, callCloneFunc)) {
1977             return nullptr;
1978         }
1979         if (i == ARGS_POS_TWO) {
1980             napi_valuetype valueType = napi_undefined;
1981             napi_typeof(env, args[i], &valueType);
1982             if (valueType == napi_function) {
1983                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
1984             }
1985         }
1986     }
1987     if (callCloneFunc && (args.GetMaxArgc() == ARGS_SIZE_TWO)) {
1988         APP_LOGE("params are too few for clone app");
1989         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1990         return nullptr;
1991     }
1992     auto promise = CommonFunc::AsyncCallNativeMethod<AbilityEnableCallbackInfo>(
1993         env, asyncCallbackInfo, "SetAbilityEnabled", SetAbilityEnabledExec, SetAbilityEnabledComplete);
1994     callbackPtr.release();
1995     APP_LOGD("call SetAbilityEnabled done");
1996     return promise;
1997 }
1998 
IsApplicationEnabledExec(napi_env env,void * data)1999 void IsApplicationEnabledExec(napi_env env, void *data)
2000 {
2001     ApplicationEnableCallbackInfo *asyncCallbackInfo = reinterpret_cast<ApplicationEnableCallbackInfo *>(data);
2002     if (asyncCallbackInfo == nullptr) {
2003         APP_LOGE("asyncCallbackInfo is nullptr");
2004         return;
2005     }
2006     asyncCallbackInfo->err = InnerIsApplicationEnabled(asyncCallbackInfo->bundleName,
2007         asyncCallbackInfo->isEnable, asyncCallbackInfo->appIndex);
2008 }
2009 
IsApplicationEnabledComplete(napi_env env,napi_status status,void * data)2010 void IsApplicationEnabledComplete(napi_env env, napi_status status, void *data)
2011 {
2012     ApplicationEnableCallbackInfo *asyncCallbackInfo = reinterpret_cast<ApplicationEnableCallbackInfo *>(data);
2013     if (asyncCallbackInfo == nullptr) {
2014         APP_LOGE("asyncCallbackInfo is null");
2015         return;
2016     }
2017     std::unique_ptr<ApplicationEnableCallbackInfo> callbackPtr {asyncCallbackInfo};
2018     napi_value result[ARGS_POS_TWO] = {0};
2019     if (asyncCallbackInfo->err == NO_ERROR) {
2020         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
2021         NAPI_CALL_RETURN_VOID(env, napi_get_boolean(env, asyncCallbackInfo->isEnable, &result[ARGS_POS_ONE]));
2022     } else {
2023         if (asyncCallbackInfo->bundleName.empty()) {
2024             APP_LOGW("bundleName is empty");
2025             result[0] = BusinessError::CreateError(env, ERROR_PARAM_CHECK_ERROR, PARAM_BUNDLENAME_EMPTY_ERROR);
2026         } else {
2027             result[0] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err, "", "");
2028         }
2029     }
2030     CommonFunc::NapiReturnDeferred<ApplicationEnableCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
2031 }
2032 
HandleIsApplicationEnabledArg(napi_env env,napi_value arg,size_t index,ApplicationEnableCallbackInfo * asyncCallbackInfo)2033 bool HandleIsApplicationEnabledArg(napi_env env, napi_value arg, size_t index,
2034     ApplicationEnableCallbackInfo *asyncCallbackInfo)
2035 {
2036     napi_valuetype valueType = napi_undefined;
2037     napi_typeof(env, arg, &valueType);
2038 
2039     if (index == ARGS_POS_ZERO) {
2040         return ParseBundleName(env, arg, asyncCallbackInfo->bundleName);
2041     } else if (index == ARGS_POS_ONE) {
2042         if (valueType == napi_number) {
2043             return ParseAppIndex(env, arg, asyncCallbackInfo->appIndex);
2044         }
2045     } else {
2046         APP_LOGE("param check error");
2047         BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
2048         return false;
2049     }
2050     return true;
2051 }
2052 
IsApplicationEnabled(napi_env env,napi_callback_info info)2053 napi_value IsApplicationEnabled(napi_env env, napi_callback_info info)
2054 {
2055     APP_LOGD("begin to IsApplicationEnabled");
2056     NapiArg args(env, info);
2057     ApplicationEnableCallbackInfo *asyncCallbackInfo = new (std::nothrow) ApplicationEnableCallbackInfo(env);
2058     if (asyncCallbackInfo == nullptr) {
2059         APP_LOGE("asyncCallbackInfo is null");
2060         return nullptr;
2061     }
2062     std::unique_ptr<ApplicationEnableCallbackInfo> callbackPtr {asyncCallbackInfo};
2063     if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_TWO)) {
2064         APP_LOGE("Napi func init failed");
2065         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2066         return nullptr;
2067     }
2068     for (size_t i = 0; i < args.GetMaxArgc(); ++i) {
2069         if (!HandleIsApplicationEnabledArg(env, args[i], i, asyncCallbackInfo)) {
2070             return nullptr;
2071         }
2072         if (i == ARGS_POS_ONE) {
2073             napi_valuetype valueType = napi_undefined;
2074             napi_typeof(env, args[i], &valueType);
2075             if (valueType == napi_function) {
2076                 NAPI_CALL(env, napi_create_reference(env, args[ARGS_POS_ONE],
2077                     NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
2078             }
2079         }
2080     }
2081     auto promise = CommonFunc::AsyncCallNativeMethod<ApplicationEnableCallbackInfo>(
2082         env, asyncCallbackInfo, "IsSetApplicationEnabled", IsApplicationEnabledExec, IsApplicationEnabledComplete);
2083     callbackPtr.release();
2084     APP_LOGD("call IsSetApplicationEnabled done");
2085     return promise;
2086 }
2087 
IsAbilityEnabledExec(napi_env env,void * data)2088 void IsAbilityEnabledExec(napi_env env, void *data)
2089 {
2090     AbilityEnableCallbackInfo *asyncCallbackInfo = reinterpret_cast<AbilityEnableCallbackInfo *>(data);
2091     if (asyncCallbackInfo == nullptr) {
2092         APP_LOGE("asyncCallbackInfo is nullptr");
2093         return;
2094     }
2095     asyncCallbackInfo->err = BundleManagerHelper::InnerIsAbilityEnabled(asyncCallbackInfo->abilityInfo,
2096         asyncCallbackInfo->isEnable, asyncCallbackInfo->appIndex);
2097 }
2098 
IsAbilityEnabledComplete(napi_env env,napi_status status,void * data)2099 void IsAbilityEnabledComplete(napi_env env, napi_status status, void *data)
2100 {
2101     AbilityEnableCallbackInfo *asyncCallbackInfo = reinterpret_cast<AbilityEnableCallbackInfo *>(data);
2102     if (asyncCallbackInfo == nullptr) {
2103         APP_LOGE("asyncCallbackInfo is null");
2104         return;
2105     }
2106     std::unique_ptr<AbilityEnableCallbackInfo> callbackPtr {asyncCallbackInfo};
2107     napi_value result[ARGS_POS_TWO] = {0};
2108     if (asyncCallbackInfo->err == NO_ERROR) {
2109         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
2110         NAPI_CALL_RETURN_VOID(env, napi_get_boolean(env, asyncCallbackInfo->isEnable, &result[ARGS_POS_ONE]));
2111     } else {
2112         APP_LOGE("asyncCallbackInfo is null");
2113         result[0] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err, "", "");
2114     }
2115     CommonFunc::NapiReturnDeferred<AbilityEnableCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
2116 }
2117 
HandleIsAbilityEnabledArg(napi_env env,napi_value arg,size_t index,AbilityEnableCallbackInfo * asyncCallbackInfo)2118 bool HandleIsAbilityEnabledArg(napi_env env, napi_value arg, size_t index,
2119     AbilityEnableCallbackInfo *asyncCallbackInfo)
2120 {
2121     napi_valuetype valueType = napi_undefined;
2122     napi_typeof(env, arg, &valueType);
2123 
2124     if (index == ARGS_POS_ZERO) {
2125         if (!CommonFunc::ParseAbilityInfo(env, arg, asyncCallbackInfo->abilityInfo)) {
2126             BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, ABILITY_INFO, TYPE_OBJECT);
2127             return false;
2128         }
2129     } else if (index == ARGS_POS_ONE) {
2130         if (valueType == napi_number) {
2131             return ParseAppIndex(env, arg, asyncCallbackInfo->appIndex);
2132         }
2133     } else {
2134         APP_LOGE("param check error");
2135         BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
2136         return false;
2137     }
2138     return true;
2139 }
2140 
IsAbilityEnabled(napi_env env,napi_callback_info info)2141 napi_value IsAbilityEnabled(napi_env env, napi_callback_info info)
2142 {
2143     APP_LOGI("begin to IsAbilityEnabled");
2144     NapiArg args(env, info);
2145     AbilityEnableCallbackInfo *asyncCallbackInfo = new (std::nothrow) AbilityEnableCallbackInfo(env);
2146     if (asyncCallbackInfo == nullptr) {
2147         APP_LOGE("asyncCallbackInfo is null");
2148         return nullptr;
2149     }
2150     std::unique_ptr<AbilityEnableCallbackInfo> callbackPtr {asyncCallbackInfo};
2151     if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_TWO)) {
2152         APP_LOGE("Napi func init failed");
2153         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2154         return nullptr;
2155     }
2156     for (size_t i = 0; i < args.GetMaxArgc(); ++i) {
2157         if (!HandleIsAbilityEnabledArg(env, args[i], i, asyncCallbackInfo)) {
2158             return nullptr;
2159         }
2160         if (i == ARGS_POS_ONE) {
2161             napi_valuetype valueType = napi_undefined;
2162             napi_typeof(env, args[i], &valueType);
2163             if (valueType == napi_function) {
2164                 NAPI_CALL(env, napi_create_reference(env, args[ARGS_POS_ONE],
2165                     NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
2166             }
2167         }
2168     }
2169 
2170     auto promise = CommonFunc::AsyncCallNativeMethod<AbilityEnableCallbackInfo>(
2171         env, asyncCallbackInfo, "IsAbilityEnabled", IsAbilityEnabledExec, IsAbilityEnabledComplete);
2172     callbackPtr.release();
2173     APP_LOGD("call SetAbilityEnabled done");
2174     return promise;
2175 }
2176 
CleanBundleCacheFilesExec(napi_env env,void * data)2177 void CleanBundleCacheFilesExec(napi_env env, void *data)
2178 {
2179     CleanBundleCacheCallbackInfo* asyncCallbackInfo = reinterpret_cast<CleanBundleCacheCallbackInfo*>(data);
2180     if (asyncCallbackInfo == nullptr) {
2181         APP_LOGE("error CleanBundleCacheCallbackInfo is nullptr");
2182         return;
2183     }
2184     if (asyncCallbackInfo->cleanCacheCallback == nullptr) {
2185         asyncCallbackInfo->cleanCacheCallback = new (std::nothrow) CleanCacheCallback();
2186     }
2187     asyncCallbackInfo->err = BundleManagerHelper::InnerCleanBundleCacheCallback(
2188         asyncCallbackInfo->bundleName, asyncCallbackInfo->appIndex, asyncCallbackInfo->cleanCacheCallback);
2189     if ((asyncCallbackInfo->err == NO_ERROR) && (asyncCallbackInfo->cleanCacheCallback != nullptr)) {
2190         // wait for OnCleanCacheFinished
2191         APP_LOGI("clean exec wait");
2192         if (asyncCallbackInfo->cleanCacheCallback->WaitForCompletion()) {
2193             asyncCallbackInfo->err = asyncCallbackInfo->cleanCacheCallback->GetErr() ?
2194                 NO_ERROR : ERROR_BUNDLE_SERVICE_EXCEPTION;
2195         } else {
2196             APP_LOGI("clean exec timeout");
2197             asyncCallbackInfo->err = ERROR_BUNDLE_SERVICE_EXCEPTION;
2198         }
2199     }
2200     APP_LOGI("clean exec end");
2201 }
2202 
CleanBundleCacheFilesComplete(napi_env env,napi_status status,void * data)2203 void CleanBundleCacheFilesComplete(napi_env env, napi_status status, void *data)
2204 {
2205     CleanBundleCacheCallbackInfo* asyncCallbackInfo = reinterpret_cast<CleanBundleCacheCallbackInfo*>(data);
2206     std::unique_ptr<CleanBundleCacheCallbackInfo> callbackPtr {asyncCallbackInfo};
2207     napi_value result[1] = { 0 };
2208     // implement callback or promise
2209     if (asyncCallbackInfo->err == NO_ERROR) {
2210         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
2211     } else {
2212         result[0] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
2213             CLEAN_BUNDLE_CACHE_FILES, Constants::PERMISSION_REMOVECACHEFILE);
2214     }
2215     CommonFunc::NapiReturnDeferred<CleanBundleCacheCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_ONE);
2216 }
2217 
ParseCleanBundleCacheFilesAppIndex(napi_env env,napi_value args,int32_t & appIndex)2218 bool ParseCleanBundleCacheFilesAppIndex(napi_env env, napi_value args, int32_t &appIndex)
2219 {
2220     if (!CommonFunc::ParseInt(env, args, appIndex)) {
2221         APP_LOGE("parse appIndex failed");
2222         BusinessError::ThrowParameterTypeError(env, ERROR_INVALID_APPINDEX, APP_INDEX, TYPE_NUMBER);
2223         return false;
2224     }
2225     if (appIndex < Constants::MAIN_APP_INDEX || appIndex > Constants::CLONE_APP_INDEX_MAX) {
2226         APP_LOGE("appIndex: %{public}d not in valid range", appIndex);
2227         BusinessError::ThrowParameterTypeError(env, ERROR_INVALID_APPINDEX, APP_INDEX, TYPE_NUMBER);
2228         return false;
2229     }
2230     return true;
2231 }
2232 
CleanBundleCacheFiles(napi_env env,napi_callback_info info)2233 napi_value CleanBundleCacheFiles(napi_env env, napi_callback_info info)
2234 {
2235     APP_LOGD("napi begin to CleanBundleCacheFiles");
2236     NapiArg args(env, info);
2237     CleanBundleCacheCallbackInfo *asyncCallbackInfo = new (std::nothrow) CleanBundleCacheCallbackInfo(env);
2238     if (asyncCallbackInfo == nullptr) {
2239         APP_LOGE("CleanBundleCacheFiles asyncCallbackInfo is null");
2240         return nullptr;
2241     }
2242     std::unique_ptr<CleanBundleCacheCallbackInfo> callbackPtr {asyncCallbackInfo};
2243     if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_TWO)) {
2244         APP_LOGE("CleanBundleCacheFiles napi func init failed");
2245         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2246         return nullptr;
2247     }
2248     size_t maxArgc = args.GetMaxArgc();
2249     if (maxArgc < ARGS_SIZE_ONE) {
2250         APP_LOGE("param error");
2251         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2252         return nullptr;
2253     }
2254     if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], asyncCallbackInfo->bundleName)) {
2255         APP_LOGE("CleanBundleCacheFiles bundleName is not a string");
2256         BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, PARAMETER_BUNDLE_NAME, TYPE_STRING);
2257         return nullptr;
2258     }
2259     if (maxArgc >= ARGS_SIZE_TWO) {
2260         napi_valuetype valueType = napi_undefined;
2261         napi_typeof(env, args[ARGS_POS_ONE], &valueType);
2262         if (valueType == napi_function) {
2263             NAPI_CALL(
2264                 env, napi_create_reference(env, args[ARGS_POS_ONE], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
2265         } else if (valueType == napi_number) {
2266             if (!ParseCleanBundleCacheFilesAppIndex(env, args[ARGS_POS_ONE], asyncCallbackInfo->appIndex)) {
2267                 return nullptr;
2268             }
2269         }
2270     }
2271 
2272     auto promise = CommonFunc::AsyncCallNativeMethod<CleanBundleCacheCallbackInfo>(
2273         env, asyncCallbackInfo, "CleanBundleCacheFiles", CleanBundleCacheFilesExec, CleanBundleCacheFilesComplete);
2274     callbackPtr.release();
2275     APP_LOGD("napi call CleanBundleCacheFiles done");
2276     return promise;
2277 }
2278 
VerifyExec(napi_env env,void * data)2279 void VerifyExec(napi_env env, void *data)
2280 {
2281     VerifyCallbackInfo* asyncCallbackInfo = reinterpret_cast<VerifyCallbackInfo*>(data);
2282     if (asyncCallbackInfo == nullptr) {
2283         APP_LOGE("error VerifyCallbackInfo is nullptr");
2284         return;
2285     }
2286 
2287     asyncCallbackInfo->err = BundleManagerHelper::InnerVerify(asyncCallbackInfo->abcPaths, asyncCallbackInfo->flag);
2288 }
2289 
VerifyComplete(napi_env env,napi_status status,void * data)2290 void VerifyComplete(napi_env env, napi_status status, void *data)
2291 {
2292     VerifyCallbackInfo *asyncCallbackInfo = reinterpret_cast<VerifyCallbackInfo *>(data);
2293     if (asyncCallbackInfo == nullptr) {
2294         APP_LOGE("asyncCallbackInfo is null");
2295         return;
2296     }
2297 
2298     std::unique_ptr<VerifyCallbackInfo> callbackPtr {asyncCallbackInfo};
2299     napi_value result[ARGS_POS_TWO] = {0};
2300     if (asyncCallbackInfo->err == NO_ERROR) {
2301         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
2302     } else {
2303         result[0] = BusinessError::CreateCommonError(
2304             env, asyncCallbackInfo->err, VERIFY_ABC, Constants::PERMISSION_RUN_DYN_CODE);
2305     }
2306 
2307     CommonFunc::NapiReturnDeferred<VerifyCallbackInfo>(
2308         env, asyncCallbackInfo, result, ARGS_SIZE_ONE);
2309 }
2310 
VerifyAbc(napi_env env,napi_callback_info info)2311 napi_value VerifyAbc(napi_env env, napi_callback_info info)
2312 {
2313     APP_LOGD("napi call VerifyAbc called");
2314     NapiArg args(env, info);
2315     VerifyCallbackInfo *asyncCallbackInfo = new (std::nothrow) VerifyCallbackInfo(env);
2316     if (asyncCallbackInfo == nullptr) {
2317         APP_LOGE("VerifyCallbackInfo asyncCallbackInfo is null");
2318         return nullptr;
2319     }
2320 
2321     std::unique_ptr<VerifyCallbackInfo> callbackPtr {asyncCallbackInfo};
2322     if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_THREE)) {
2323         APP_LOGE("VerifyCallbackInfo napi func init failed");
2324         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2325         return nullptr;
2326     }
2327 
2328     if (!CommonFunc::ParseStringArray(env, asyncCallbackInfo->abcPaths, args[ARGS_POS_ZERO])) {
2329         APP_LOGE("ParseStringArray invalid");
2330         BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, VERIFY_ABC, TYPE_ARRAY);
2331         return nullptr;
2332     }
2333 
2334     if (!CommonFunc::ParseBool(env, args[ARGS_POS_ONE], asyncCallbackInfo->flag)) {
2335         APP_LOGE("ParseBool invalid");
2336         BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, VERIFY_ABC, TYPE_BOOLEAN);
2337         return nullptr;
2338     }
2339 
2340     size_t maxArgc = args.GetMaxArgc();
2341     if (maxArgc > ARGS_SIZE_TWO) {
2342         napi_valuetype valueType = napi_undefined;
2343         napi_typeof(env, args[ARGS_SIZE_TWO], &valueType);
2344         if (valueType == napi_function) {
2345             NAPI_CALL(env, napi_create_reference(env, args[ARGS_SIZE_TWO],
2346                 NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
2347         }
2348     }
2349     auto promise = CommonFunc::AsyncCallNativeMethod<VerifyCallbackInfo>(
2350         env, asyncCallbackInfo, "VerifyAbc", VerifyExec, VerifyComplete);
2351     callbackPtr.release();
2352     APP_LOGD("napi call VerifyAbc done");
2353     return promise;
2354 }
2355 
GetExtResourceExec(napi_env env,void * data)2356 void GetExtResourceExec(napi_env env, void *data)
2357 {
2358     DynamicIconCallbackInfo *asyncCallbackInfo = reinterpret_cast<DynamicIconCallbackInfo *>(data);
2359     if (asyncCallbackInfo == nullptr) {
2360         APP_LOGE("asyncCallbackInfo is null");
2361         return;
2362     }
2363     asyncCallbackInfo->err = BundleManagerHelper::InnerGetExtResource(
2364         asyncCallbackInfo->bundleName, asyncCallbackInfo->moduleNames);
2365 }
2366 
SetStrArrayToNapiObj(napi_env env,napi_value result,const std::vector<std::string> & strArray)2367 static void SetStrArrayToNapiObj(
2368     napi_env env, napi_value result, const std::vector<std::string> &strArray)
2369 {
2370     if (strArray.size() == 0) {
2371         APP_LOGD("bundleInfos is null");
2372         return;
2373     }
2374     size_t index = 0;
2375     for (const auto &item : strArray) {
2376         APP_LOGD("item: %{public}s ", item.c_str());
2377         napi_value itemStr;
2378         NAPI_CALL_RETURN_VOID(env, napi_create_string_utf8(
2379             env, item.c_str(), NAPI_AUTO_LENGTH, &itemStr));
2380         NAPI_CALL_RETURN_VOID(env, napi_set_element(env, result, index, itemStr));
2381         index++;
2382     }
2383 }
2384 
GetExtResourceComplete(napi_env env,napi_status status,void * data)2385 void GetExtResourceComplete(napi_env env, napi_status status, void *data)
2386 {
2387     DynamicIconCallbackInfo *asyncCallbackInfo = reinterpret_cast<DynamicIconCallbackInfo *>(data);
2388     if (asyncCallbackInfo == nullptr) {
2389         APP_LOGE("asyncCallbackInfo is null");
2390         return;
2391     }
2392 
2393     std::unique_ptr<DynamicIconCallbackInfo> callbackPtr {asyncCallbackInfo};
2394     napi_value result[ARGS_POS_TWO] = {0};
2395     if (asyncCallbackInfo->err == NO_ERROR) {
2396         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
2397         NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &result[ARGS_POS_ONE]));
2398         SetStrArrayToNapiObj(env, result[ARGS_POS_ONE], asyncCallbackInfo->moduleNames);
2399     } else {
2400         result[0] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
2401             GET_EXT_RESOURCE, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
2402     }
2403 
2404     CommonFunc::NapiReturnDeferred<DynamicIconCallbackInfo>(
2405         env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
2406 }
2407 
GetExtResource(napi_env env,napi_callback_info info)2408 napi_value GetExtResource(napi_env env, napi_callback_info info)
2409 {
2410     APP_LOGD("GetExtResource called");
2411     NapiArg args(env, info);
2412     DynamicIconCallbackInfo *asyncCallbackInfo = new (std::nothrow) DynamicIconCallbackInfo(env);
2413     if (asyncCallbackInfo == nullptr) {
2414         APP_LOGE("asyncCallbackInfo is null");
2415         return nullptr;
2416     }
2417     std::unique_ptr<DynamicIconCallbackInfo> callbackPtr {asyncCallbackInfo};
2418     if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_ONE)) {
2419         APP_LOGE("param count invalid");
2420         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2421         return nullptr;
2422     }
2423 
2424     if (!CommonFunc::ParseString(env, args[0], asyncCallbackInfo->bundleName)) {
2425         APP_LOGE("bundleName invalid");
2426         BusinessError::ThrowParameterTypeError(
2427             env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
2428         return nullptr;
2429     }
2430     auto promise = CommonFunc::AsyncCallNativeMethod<DynamicIconCallbackInfo>(
2431         env, asyncCallbackInfo, "GetExtResource", GetExtResourceExec, GetExtResourceComplete);
2432     callbackPtr.release();
2433     APP_LOGD("call GetExtResource done");
2434     return promise;
2435 }
2436 
EnableDynamicIconExec(napi_env env,void * data)2437 void EnableDynamicIconExec(napi_env env, void *data)
2438 {
2439     DynamicIconCallbackInfo *asyncCallbackInfo = reinterpret_cast<DynamicIconCallbackInfo *>(data);
2440     if (asyncCallbackInfo == nullptr) {
2441         APP_LOGE("asyncCallbackInfo is null");
2442         return;
2443     }
2444     asyncCallbackInfo->err = BundleManagerHelper::InnerEnableDynamicIcon(
2445         asyncCallbackInfo->bundleName, asyncCallbackInfo->moduleName,
2446         asyncCallbackInfo->option.appIndex, asyncCallbackInfo->option.userId, asyncCallbackInfo->option.isDefault);
2447 }
2448 
EnableDynamicIconComplete(napi_env env,napi_status status,void * data)2449 void EnableDynamicIconComplete(napi_env env, napi_status status, void *data)
2450 {
2451     DynamicIconCallbackInfo *asyncCallbackInfo = reinterpret_cast<DynamicIconCallbackInfo *>(data);
2452     if (asyncCallbackInfo == nullptr) {
2453         APP_LOGE("asyncCallbackInfo is null");
2454         return;
2455     }
2456 
2457     std::unique_ptr<DynamicIconCallbackInfo> callbackPtr {asyncCallbackInfo};
2458     napi_value result[ARGS_POS_TWO] = {0};
2459     if (asyncCallbackInfo->err == NO_ERROR) {
2460         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
2461     } else {
2462         result[0] = BusinessError::CreateCommonError(env,
2463             asyncCallbackInfo->err, ENABLE_DYNAMIC_ICON, asyncCallbackInfo->option.isDefault ?
2464             Constants::PERMISSION_ACCESS_DYNAMIC_ICON : BUNDLE_ENABLE_AND_DISABLE_ALL_DYNAMIC_PERMISSIONS);
2465     }
2466 
2467     CommonFunc::NapiReturnDeferred<DynamicIconCallbackInfo>(
2468         env, asyncCallbackInfo, result, ARGS_SIZE_ONE);
2469 }
2470 
EnableDynamicIcon(napi_env env,napi_callback_info info)2471 napi_value EnableDynamicIcon(napi_env env, napi_callback_info info)
2472 {
2473     APP_LOGD("EnableDynamicIcon called");
2474     NapiArg args(env, info);
2475     DynamicIconCallbackInfo *asyncCallbackInfo = new (std::nothrow) DynamicIconCallbackInfo(env);
2476     if (asyncCallbackInfo == nullptr) {
2477         APP_LOGE("asyncCallbackInfo is null");
2478         return nullptr;
2479     }
2480     std::unique_ptr<DynamicIconCallbackInfo> callbackPtr {asyncCallbackInfo};
2481     if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_THREE)) {
2482         APP_LOGE("param count invalid");
2483         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2484         return nullptr;
2485     }
2486     for (size_t i = 0; i < args.GetMaxArgc(); ++i) {
2487         napi_valuetype valueType = napi_undefined;
2488         napi_typeof(env, args[i], &valueType);
2489         if (i == ARGS_POS_ZERO) {
2490             if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->bundleName)) {
2491                 APP_LOGE("bundleName invalid");
2492                 BusinessError::ThrowParameterTypeError(
2493                     env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
2494                 return nullptr;
2495             }
2496         } else if (i == ARGS_POS_ONE) {
2497             if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->moduleName)) {
2498                 APP_LOGE("moduleName invalid");
2499                 BusinessError::ThrowParameterTypeError(
2500                     env, ERROR_PARAM_CHECK_ERROR, MODULE_NAME, TYPE_STRING);
2501                 return nullptr;
2502             }
2503         } else if (i == ARGS_POS_TWO) {
2504             if (!ParseBundleOption(env, args[i], asyncCallbackInfo->option)) {
2505                 APP_LOGW("param bundleOption invalid");
2506             }
2507         }
2508     }
2509     auto promise = CommonFunc::AsyncCallNativeMethod<DynamicIconCallbackInfo>(
2510         env, asyncCallbackInfo, "EnableDynamicIcon", EnableDynamicIconExec, EnableDynamicIconComplete);
2511     callbackPtr.release();
2512     APP_LOGD("call EnableDynamicIcon done");
2513     return promise;
2514 }
2515 
DisableDynamicIconExec(napi_env env,void * data)2516 void DisableDynamicIconExec(napi_env env, void *data)
2517 {
2518     DynamicIconCallbackInfo *asyncCallbackInfo = reinterpret_cast<DynamicIconCallbackInfo *>(data);
2519     if (asyncCallbackInfo == nullptr) {
2520         APP_LOGE("asyncCallbackInfo is null");
2521         return;
2522     }
2523     asyncCallbackInfo->err = BundleManagerHelper::InnerDisableDynamicIcon(asyncCallbackInfo->bundleName,
2524         asyncCallbackInfo->option.appIndex, asyncCallbackInfo->option.userId, asyncCallbackInfo->option.isDefault);
2525 }
2526 
DisableDynamicIconComplete(napi_env env,napi_status status,void * data)2527 void DisableDynamicIconComplete(napi_env env, napi_status status, void *data)
2528 {
2529     DynamicIconCallbackInfo *asyncCallbackInfo = reinterpret_cast<DynamicIconCallbackInfo *>(data);
2530     if (asyncCallbackInfo == nullptr) {
2531         APP_LOGE("asyncCallbackInfo is null");
2532         return;
2533     }
2534 
2535     std::unique_ptr<DynamicIconCallbackInfo> callbackPtr {asyncCallbackInfo};
2536     napi_value result[ARGS_POS_TWO] = {0};
2537     if (asyncCallbackInfo->err == NO_ERROR) {
2538         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
2539     } else {
2540         result[0] = BusinessError::CreateCommonError(
2541             env, asyncCallbackInfo->err, DISABLE_DYNAMIC_ICON, asyncCallbackInfo->option.isDefault ?
2542             Constants::PERMISSION_ACCESS_DYNAMIC_ICON : BUNDLE_ENABLE_AND_DISABLE_ALL_DYNAMIC_PERMISSIONS);
2543     }
2544 
2545     CommonFunc::NapiReturnDeferred<DynamicIconCallbackInfo>(
2546         env, asyncCallbackInfo, result, ARGS_SIZE_ONE);
2547 }
2548 
DisableDynamicIcon(napi_env env,napi_callback_info info)2549 napi_value DisableDynamicIcon(napi_env env, napi_callback_info info)
2550 {
2551     APP_LOGD("DisableDynamicIcon called");
2552     NapiArg args(env, info);
2553     DynamicIconCallbackInfo *asyncCallbackInfo = new (std::nothrow) DynamicIconCallbackInfo(env);
2554     if (asyncCallbackInfo == nullptr) {
2555         APP_LOGE("asyncCallbackInfo is null");
2556         return nullptr;
2557     }
2558     std::unique_ptr<DynamicIconCallbackInfo> callbackPtr {asyncCallbackInfo};
2559     if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_TWO)) {
2560         APP_LOGE("param count invalid");
2561         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2562         return nullptr;
2563     }
2564 
2565     if (!CommonFunc::ParseString(env, args[0], asyncCallbackInfo->bundleName)) {
2566         APP_LOGE("bundleName invalid");
2567         BusinessError::ThrowParameterTypeError(
2568             env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
2569         return nullptr;
2570     }
2571     if (args.GetMaxArgc() > ARGS_SIZE_ONE) {
2572         if (!ParseBundleOption(env, args[ARGS_SIZE_ONE], asyncCallbackInfo->option)) {
2573             APP_LOGW("param bundleOption invalid");
2574         }
2575     }
2576     auto promise = CommonFunc::AsyncCallNativeMethod<DynamicIconCallbackInfo>(
2577         env, asyncCallbackInfo, "DisableDynamicIcon", DisableDynamicIconExec, DisableDynamicIconComplete);
2578     callbackPtr.release();
2579     APP_LOGD("call DisableDynamicIcon done");
2580     return promise;
2581 }
2582 
GetDynamicIconExec(napi_env env,void * data)2583 void GetDynamicIconExec(napi_env env, void *data)
2584 {
2585     DynamicIconCallbackInfo *asyncCallbackInfo = reinterpret_cast<DynamicIconCallbackInfo *>(data);
2586     if (asyncCallbackInfo == nullptr) {
2587         APP_LOGE("asyncCallbackInfo is null");
2588         return;
2589     }
2590     asyncCallbackInfo->err = BundleManagerHelper::InnerGetDynamicIcon(
2591         asyncCallbackInfo->bundleName, asyncCallbackInfo->moduleName);
2592 }
2593 
GetDynamicIconComplete(napi_env env,napi_status status,void * data)2594 void GetDynamicIconComplete(napi_env env, napi_status status, void *data)
2595 {
2596     DynamicIconCallbackInfo *asyncCallbackInfo = reinterpret_cast<DynamicIconCallbackInfo *>(data);
2597     if (asyncCallbackInfo == nullptr) {
2598         APP_LOGE("asyncCallbackInfo is null");
2599         return;
2600     }
2601 
2602     std::unique_ptr<DynamicIconCallbackInfo> callbackPtr {asyncCallbackInfo};
2603     napi_value result[ARGS_POS_TWO] = {0};
2604     if (asyncCallbackInfo->err == NO_ERROR) {
2605         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
2606         NAPI_CALL_RETURN_VOID(env, napi_create_string_utf8(env,
2607             asyncCallbackInfo->moduleName.c_str(), NAPI_AUTO_LENGTH, &result[ARGS_POS_ONE]));
2608     } else {
2609         result[0] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
2610             GET_DYNAMIC_ICON, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
2611     }
2612 
2613     CommonFunc::NapiReturnDeferred<DynamicIconCallbackInfo>(
2614         env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
2615 }
2616 
GetDynamicIcon(napi_env env,napi_callback_info info)2617 napi_value GetDynamicIcon(napi_env env, napi_callback_info info)
2618 {
2619     APP_LOGD("GetDynamicIcon called");
2620     NapiArg args(env, info);
2621     DynamicIconCallbackInfo *asyncCallbackInfo = new (std::nothrow) DynamicIconCallbackInfo(env);
2622     if (asyncCallbackInfo == nullptr) {
2623         APP_LOGE("asyncCallbackInfo is null");
2624         return nullptr;
2625     }
2626     std::unique_ptr<DynamicIconCallbackInfo> callbackPtr {asyncCallbackInfo};
2627     if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_ONE)) {
2628         APP_LOGE("param count invalid");
2629         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2630         return nullptr;
2631     }
2632 
2633     if (!CommonFunc::ParseString(env, args[0], asyncCallbackInfo->bundleName)) {
2634         APP_LOGE("bundleName invalid");
2635         BusinessError::ThrowParameterTypeError(
2636             env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
2637         return nullptr;
2638     }
2639 
2640     auto promise = CommonFunc::AsyncCallNativeMethod<DynamicIconCallbackInfo>(
2641         env, asyncCallbackInfo, GET_DYNAMIC_ICON, GetDynamicIconExec, GetDynamicIconComplete);
2642     callbackPtr.release();
2643     APP_LOGD("call GetDynamicIcon done");
2644     return promise;
2645 }
2646 
DeleteAbcExec(napi_env env,void * data)2647 void DeleteAbcExec(napi_env env, void *data)
2648 {
2649     VerifyCallbackInfo* asyncCallbackInfo = reinterpret_cast<VerifyCallbackInfo*>(data);
2650     if (asyncCallbackInfo == nullptr) {
2651         APP_LOGE("error VerifyCallbackInfo is nullptr");
2652         return;
2653     }
2654 
2655     asyncCallbackInfo->err = BundleManagerHelper::InnerDeleteAbc(asyncCallbackInfo->deletePath);
2656 }
2657 
DeleteAbcComplete(napi_env env,napi_status status,void * data)2658 void DeleteAbcComplete(napi_env env, napi_status status, void *data)
2659 {
2660     VerifyCallbackInfo *asyncCallbackInfo = reinterpret_cast<VerifyCallbackInfo *>(data);
2661     if (asyncCallbackInfo == nullptr) {
2662         APP_LOGE("asyncCallbackInfo is null");
2663         return;
2664     }
2665 
2666     std::unique_ptr<VerifyCallbackInfo> callbackPtr {asyncCallbackInfo};
2667     napi_value result[ARGS_POS_TWO] = {0};
2668     if (asyncCallbackInfo->err == NO_ERROR) {
2669         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
2670     } else {
2671         result[0] = BusinessError::CreateCommonError(
2672             env, asyncCallbackInfo->err, DELETE_ABC, Constants::PERMISSION_RUN_DYN_CODE);
2673     }
2674 
2675     CommonFunc::NapiReturnDeferred<VerifyCallbackInfo>(
2676         env, asyncCallbackInfo, result, ARGS_SIZE_ONE);
2677 }
2678 
DeleteAbc(napi_env env,napi_callback_info info)2679 napi_value DeleteAbc(napi_env env, napi_callback_info info)
2680 {
2681     APP_LOGD("napi call DeleteAbc called");
2682     NapiArg args(env, info);
2683     VerifyCallbackInfo *asyncCallbackInfo = new (std::nothrow) VerifyCallbackInfo(env);
2684     if (asyncCallbackInfo == nullptr) {
2685         APP_LOGE("VerifyCallbackInfo asyncCallbackInfo is null");
2686         return nullptr;
2687     }
2688 
2689     std::unique_ptr<VerifyCallbackInfo> callbackPtr {asyncCallbackInfo};
2690     if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_ONE)) {
2691         APP_LOGE("VerifyCallbackInfo napi func init failed");
2692         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2693         return nullptr;
2694     }
2695 
2696     if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], asyncCallbackInfo->deletePath)) {
2697         APP_LOGE("CleanBundleCacheFiles deletePath is not a string");
2698         BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, DELETE_ABC, TYPE_STRING);
2699         return nullptr;
2700     }
2701 
2702     auto promise = CommonFunc::AsyncCallNativeMethod<VerifyCallbackInfo>(
2703         env, asyncCallbackInfo, "DeleteAbc", DeleteAbcExec, DeleteAbcComplete);
2704     callbackPtr.release();
2705     APP_LOGD("napi call DeleteAbc done");
2706     return promise;
2707 }
2708 
InnerGetLaunchWantForBundleExec(const std::string & bundleName,Want & want,int32_t userId)2709 static ErrCode InnerGetLaunchWantForBundleExec(
2710     const std::string& bundleName, Want &want, int32_t userId)
2711 {
2712     auto iBundleMgr = CommonFunc::GetBundleMgr();
2713     if (iBundleMgr == nullptr) {
2714         APP_LOGE("can not get iBundleMgr");
2715         return ERROR_BUNDLE_SERVICE_EXCEPTION;
2716     }
2717 
2718     ErrCode result = iBundleMgr->GetLaunchWantForBundle(bundleName, want, userId);
2719     if (result != ERR_OK) {
2720         APP_LOGE("GetLaunchWantForBundle call error, bundleName is %{public}s, userId is %{public}d",
2721             bundleName.c_str(), userId);
2722     }
2723 
2724     return CommonFunc::ConvertErrCode(result);
2725 }
2726 
GetLaunchWantForBundleExec(napi_env env,void * data)2727 void GetLaunchWantForBundleExec(napi_env env, void *data)
2728 {
2729     LaunchWantCallbackInfo* asyncCallbackInfo = reinterpret_cast<LaunchWantCallbackInfo*>(data);
2730     if (asyncCallbackInfo == nullptr) {
2731         APP_LOGE("error LaunchWantCallbackInfo is nullptr");
2732         return;
2733     }
2734 
2735     asyncCallbackInfo->err = InnerGetLaunchWantForBundleExec(
2736         asyncCallbackInfo->bundleName, asyncCallbackInfo->want, asyncCallbackInfo->userId);
2737 }
2738 
GetLaunchWantForBundleComplete(napi_env env,napi_status status,void * data)2739 void GetLaunchWantForBundleComplete(napi_env env, napi_status status, void *data)
2740 {
2741     LaunchWantCallbackInfo *asyncCallbackInfo = reinterpret_cast<LaunchWantCallbackInfo *>(data);
2742     if (asyncCallbackInfo == nullptr) {
2743         APP_LOGE("asyncCallbackInfo is null");
2744         return;
2745     }
2746 
2747     std::unique_ptr<LaunchWantCallbackInfo> callbackPtr {asyncCallbackInfo};
2748     napi_value result[ARGS_POS_TWO] = {0};
2749     if (asyncCallbackInfo->err == NO_ERROR) {
2750         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
2751         NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &result[1]));
2752         CommonFunc::ConvertWantInfo(env, result[1], asyncCallbackInfo->want);
2753     } else {
2754         result[0] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err, GET_LAUNCH_WANT_FOR_BUNDLE,
2755             Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
2756     }
2757 
2758     CommonFunc::NapiReturnDeferred<LaunchWantCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
2759 }
2760 
GetLaunchWantForBundle(napi_env env,napi_callback_info info)2761 napi_value GetLaunchWantForBundle(napi_env env, napi_callback_info info)
2762 {
2763     APP_LOGD("napi begin to GetLaunchWantForBundle");
2764     NapiArg args(env, info);
2765     LaunchWantCallbackInfo *asyncCallbackInfo = new (std::nothrow) LaunchWantCallbackInfo(env);
2766     if (asyncCallbackInfo == nullptr) {
2767         APP_LOGE("GetLaunchWantForBundle asyncCallbackInfo is null");
2768         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2769         return nullptr;
2770     }
2771     asyncCallbackInfo->userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
2772     std::unique_ptr<LaunchWantCallbackInfo> callbackPtr {asyncCallbackInfo};
2773     if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_THREE)) {
2774         APP_LOGE("GetLaunchWantForBundle napi func init failed");
2775         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2776         return nullptr;
2777     }
2778     size_t maxArgc = args.GetMaxArgc();
2779     for (size_t i = 0; i < maxArgc; ++i) {
2780         napi_valuetype valueType = napi_undefined;
2781         napi_typeof(env, args[i], &valueType);
2782         if (i == ARGS_POS_ZERO) {
2783             if (valueType != napi_string) {
2784                 APP_LOGE("GetLaunchWantForBundle bundleName is not a string");
2785                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, STRING_TYPE);
2786                 return nullptr;
2787             }
2788             CommonFunc::ParseString(env, args[i], asyncCallbackInfo->bundleName);
2789             if (asyncCallbackInfo->bundleName.size() == 0) {
2790                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, STRING_TYPE);
2791                 return nullptr;
2792             }
2793         } else if (i == ARGS_POS_ONE) {
2794             if (valueType == napi_function) {
2795                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
2796                 break;
2797             }
2798             if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->userId)) {
2799                 APP_LOGW("Parse userId failed, set this parameter to the caller userId");
2800             }
2801         } else if (i == ARGS_POS_TWO) {
2802             if (valueType == napi_function) {
2803                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
2804                 break;
2805             }
2806         } else {
2807             APP_LOGE("GetLaunchWantForBundle arg err");
2808             BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2809             return nullptr;
2810         }
2811     }
2812     auto promise = CommonFunc::AsyncCallNativeMethod<LaunchWantCallbackInfo>(
2813         env, asyncCallbackInfo, "GetLaunchWantForBundle", GetLaunchWantForBundleExec, GetLaunchWantForBundleComplete);
2814     callbackPtr.release();
2815     APP_LOGD("napi call GetLaunchWantForBundle done");
2816     return promise;
2817 }
2818 
InnerGetProfile(GetProfileCallbackInfo & info)2819 static ErrCode InnerGetProfile(GetProfileCallbackInfo &info)
2820 {
2821     auto iBundleMgr = CommonFunc::GetBundleMgr();
2822     if (iBundleMgr == nullptr) {
2823         APP_LOGE("can not get iBundleMgr");
2824         return ERROR_BUNDLE_SERVICE_EXCEPTION;
2825     }
2826 
2827     if (info.abilityName.empty()) {
2828         APP_LOGE("InnerGetProfile failed due to empty abilityName");
2829         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
2830     }
2831 
2832     if (info.moduleName.empty()) {
2833         APP_LOGE("InnerGetProfile failed due to empty moduleName");
2834         return ERR_BUNDLE_MANAGER_MODULE_NOT_EXIST;
2835     }
2836     auto baseFlag = static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE) +
2837            static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_METADATA) +
2838            static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_DISABLE);
2839     ErrCode result;
2840     BundleMgrClient client;
2841     BundleInfo bundleInfo;
2842     if (info.type == AbilityProfileType::ABILITY_PROFILE) {
2843         auto getAbilityFlag = baseFlag +
2844             static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_ABILITY);
2845         result = iBundleMgr->GetBundleInfoForSelf(getAbilityFlag, bundleInfo);
2846         if (result != ERR_OK) {
2847             APP_LOGE("GetBundleInfoForSelf failed");
2848             return result;
2849         }
2850         AbilityInfo targetAbilityInfo;
2851         result = BundleManagerHelper::GetAbilityFromBundleInfo(
2852             bundleInfo, info.abilityName, info.moduleName, targetAbilityInfo);
2853         if (result != ERR_OK) {
2854             return result;
2855         }
2856         if (!client.GetProfileFromAbility(targetAbilityInfo, info.metadataName, info.profileVec)) {
2857             APP_LOGE("GetProfileFromExtension failed");
2858             return ERR_BUNDLE_MANAGER_PROFILE_NOT_EXIST;
2859         }
2860         return ERR_OK;
2861     }
2862 
2863     if (info.type == AbilityProfileType::EXTENSION_PROFILE) {
2864         auto getExtensionFlag = baseFlag +
2865             static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_EXTENSION_ABILITY);
2866         result = iBundleMgr->GetBundleInfoForSelf(getExtensionFlag, bundleInfo);
2867         if (result != ERR_OK) {
2868             APP_LOGE("GetBundleInfoForSelf failed");
2869             return result;
2870         }
2871 
2872         ExtensionAbilityInfo targetExtensionInfo;
2873         result = BundleManagerHelper::GetExtensionFromBundleInfo(
2874             bundleInfo, info.abilityName, info.moduleName, targetExtensionInfo);
2875         if (result != ERR_OK) {
2876             return result;
2877         }
2878         if (!client.GetProfileFromExtension(targetExtensionInfo, info.metadataName, info.profileVec)) {
2879             APP_LOGE("GetProfileFromExtension failed");
2880             return ERR_BUNDLE_MANAGER_PROFILE_NOT_EXIST;
2881         }
2882         return ERR_OK;
2883     }
2884 
2885     APP_LOGE("InnerGetProfile failed due to type is invalid");
2886     return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
2887 }
2888 
GetProfileExec(napi_env env,void * data)2889 void GetProfileExec(napi_env env, void *data)
2890 {
2891     GetProfileCallbackInfo* asyncCallbackInfo = reinterpret_cast<GetProfileCallbackInfo*>(data);
2892     if (asyncCallbackInfo == nullptr) {
2893         APP_LOGE("error GetProfileCallbackInfo is nullptr");
2894         return;
2895     }
2896 
2897     ErrCode result = InnerGetProfile(*asyncCallbackInfo);
2898     asyncCallbackInfo->err = CommonFunc::ConvertErrCode(result);
2899 }
2900 
GetProfileComplete(napi_env env,napi_status status,void * data)2901 void GetProfileComplete(napi_env env, napi_status status, void *data)
2902 {
2903     GetProfileCallbackInfo *asyncCallbackInfo = reinterpret_cast<GetProfileCallbackInfo *>(data);
2904     if (asyncCallbackInfo == nullptr) {
2905         APP_LOGE("asyncCallbackInfo is null");
2906         return;
2907     }
2908 
2909     std::unique_ptr<GetProfileCallbackInfo> callbackPtr {asyncCallbackInfo};
2910     napi_value result[ARGS_POS_TWO] = {0};
2911     if (asyncCallbackInfo->err == NO_ERROR) {
2912         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
2913         NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &result[1]));
2914         CommonFunc::ConvertStringArrays(env, asyncCallbackInfo->profileVec, result[1]);
2915     } else {
2916         result[0] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err, "", "");
2917     }
2918 
2919     CommonFunc::NapiReturnDeferred<GetProfileCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
2920 }
2921 
GetProfile(napi_env env,napi_callback_info info,const AbilityProfileType & profileType)2922 napi_value GetProfile(napi_env env, napi_callback_info info, const AbilityProfileType &profileType)
2923 {
2924     APP_LOGD("napi begin to GetProfile");
2925     NapiArg args(env, info);
2926     GetProfileCallbackInfo *asyncCallbackInfo = new (std::nothrow) GetProfileCallbackInfo(env);
2927     if (asyncCallbackInfo == nullptr) {
2928         APP_LOGE("GetProfile asyncCallbackInfo is null");
2929         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2930         return nullptr;
2931     }
2932 
2933     asyncCallbackInfo->type = profileType;
2934     std::unique_ptr<GetProfileCallbackInfo> callbackPtr {asyncCallbackInfo};
2935     if (!args.Init(ARGS_POS_TWO, ARGS_SIZE_FOUR)) {
2936         APP_LOGE("GetProfile napi func init failed");
2937         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2938         return nullptr;
2939     }
2940     size_t maxArgc = args.GetMaxArgc();
2941     for (size_t i = 0; i < maxArgc; ++i) {
2942         napi_valuetype valueType = napi_undefined;
2943         napi_typeof(env, args[i], &valueType);
2944         if (i == ARGS_POS_ZERO) {
2945             if (valueType != napi_string) {
2946                 APP_LOGE("GetProfile moduleName is not a string");
2947                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, MODULE_NAME, STRING_TYPE);
2948                 return nullptr;
2949             }
2950             CommonFunc::ParseString(env, args[i], asyncCallbackInfo->moduleName);
2951         } else if (i == ARGS_POS_ONE) {
2952             if (valueType != napi_string) {
2953                 APP_LOGE("GetProfile abilityName is not a string");
2954                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, ABILITY_NAME, STRING_TYPE);
2955                 return nullptr;
2956             }
2957             CommonFunc::ParseString(env, args[i], asyncCallbackInfo->abilityName);
2958         } else if (i == ARGS_POS_TWO) {
2959             if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->metadataName)) {
2960                 APP_LOGW("Parse metadataName failed, The default value is undefined");
2961             }
2962         } else if (i == ARGS_POS_THREE) {
2963             if (valueType == napi_function) {
2964                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
2965                 break;
2966             }
2967         } else {
2968             APP_LOGE("GetProfile arg err");
2969             BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2970             return nullptr;
2971         }
2972     }
2973     auto promise = CommonFunc::AsyncCallNativeMethod<GetProfileCallbackInfo>(
2974         env, asyncCallbackInfo, "GetProfile", GetProfileExec, GetProfileComplete);
2975     callbackPtr.release();
2976     APP_LOGD("napi call GetProfile done");
2977     return promise;
2978 }
2979 
GetProfileByAbility(napi_env env,napi_callback_info info)2980 napi_value GetProfileByAbility(napi_env env, napi_callback_info info)
2981 {
2982     APP_LOGD("napi begin to GetProfileByAbility");
2983     return GetProfile(env, info, AbilityProfileType::ABILITY_PROFILE);
2984 }
2985 
GetProfileByExAbility(napi_env env,napi_callback_info info)2986 napi_value GetProfileByExAbility(napi_env env, napi_callback_info info)
2987 {
2988     APP_LOGD("napi begin to GetProfileByExAbility");
2989     return GetProfile(env, info, AbilityProfileType::EXTENSION_PROFILE);
2990 }
2991 
CreateExtensionAbilityFlagObject(napi_env env,napi_value value)2992 void CreateExtensionAbilityFlagObject(napi_env env, napi_value value)
2993 {
2994     napi_value nGetExtensionAbilityInfoDefault;
2995     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
2996         GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_DEFAULT), &nGetExtensionAbilityInfoDefault));
2997     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_EXTENSION_ABILITY_INFO_DEFAULT",
2998         nGetExtensionAbilityInfoDefault));
2999 
3000     napi_value nGetExtensionAbilityInfoWithPermission;
3001     NAPI_CALL_RETURN_VOID(env,
3002         napi_create_int32(env, static_cast<int32_t>(
3003             GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_PERMISSION),
3004             &nGetExtensionAbilityInfoWithPermission));
3005     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_EXTENSION_ABILITY_INFO_WITH_PERMISSION",
3006         nGetExtensionAbilityInfoWithPermission));
3007 
3008     napi_value nGetExtensionAbilityInfoWithApplication;
3009     NAPI_CALL_RETURN_VOID(env,
3010         napi_create_int32(env, static_cast<int32_t>(
3011             GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_APPLICATION),
3012             &nGetExtensionAbilityInfoWithApplication));
3013     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_EXTENSION_ABILITY_INFO_WITH_APPLICATION",
3014         nGetExtensionAbilityInfoWithApplication));
3015 
3016     napi_value nGetExtensionAbilityInfoWithMetadata;
3017     NAPI_CALL_RETURN_VOID(env,
3018         napi_create_int32(env, static_cast<int32_t>(
3019             GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_METADATA),
3020             &nGetExtensionAbilityInfoWithMetadata));
3021     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_EXTENSION_ABILITY_INFO_WITH_METADATA",
3022         nGetExtensionAbilityInfoWithMetadata));
3023 
3024     napi_value nGetExtensionAbilityInfoWithSkill;
3025     NAPI_CALL_RETURN_VOID(env,
3026         napi_create_int32(env, static_cast<int32_t>(
3027             GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_SKILL),
3028             &nGetExtensionAbilityInfoWithSkill));
3029     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_EXTENSION_ABILITY_INFO_WITH_SKILL",
3030         nGetExtensionAbilityInfoWithSkill));
3031 }
3032 
CreateExtensionAbilityTypeObject(napi_env env,napi_value value)3033 void CreateExtensionAbilityTypeObject(napi_env env, napi_value value)
3034 {
3035     napi_value nForm;
3036     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::FORM), &nForm));
3037     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "FORM", nForm));
3038 
3039     napi_value nWorkSchedule;
3040     NAPI_CALL_RETURN_VOID(env,
3041         napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::WORK_SCHEDULER), &nWorkSchedule));
3042     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "WORK_SCHEDULER", nWorkSchedule));
3043 
3044     napi_value nInputMethod;
3045     NAPI_CALL_RETURN_VOID(env,
3046         napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::INPUTMETHOD), &nInputMethod));
3047     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "INPUT_METHOD", nInputMethod));
3048 
3049     napi_value nService;
3050     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::SERVICE), &nService));
3051     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SERVICE", nService));
3052 
3053     napi_value nAccessibility;
3054     NAPI_CALL_RETURN_VOID(env,
3055         napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::ACCESSIBILITY), &nAccessibility));
3056     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "ACCESSIBILITY", nAccessibility));
3057 
3058     napi_value nDataShare;
3059     NAPI_CALL_RETURN_VOID(env,
3060         napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::DATASHARE), &nDataShare));
3061     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "DATA_SHARE", nDataShare));
3062 
3063     napi_value nFileShare;
3064     NAPI_CALL_RETURN_VOID(env,
3065         napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::FILESHARE), &nFileShare));
3066     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "FILE_SHARE", nFileShare));
3067 
3068     napi_value nStaticSubscriber;
3069     NAPI_CALL_RETURN_VOID(env,
3070         napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::STATICSUBSCRIBER), &nStaticSubscriber));
3071     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "STATIC_SUBSCRIBER", nStaticSubscriber));
3072 
3073     napi_value nWallpaper;
3074     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3075         static_cast<int32_t>(ExtensionAbilityType::WALLPAPER), &nWallpaper));
3076     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "WALLPAPER", nWallpaper));
3077 
3078     napi_value nBackup;
3079     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3080         static_cast<int32_t>(ExtensionAbilityType::BACKUP), &nBackup));
3081     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "BACKUP", nBackup));
3082 
3083     napi_value nDistributed;
3084     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3085         static_cast<int32_t>(ExtensionAbilityType::DISTRIBUTED), &nDistributed));
3086     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "DISTRIBUTED", nDistributed));
3087 
3088     napi_value nAppService;
3089     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3090         static_cast<int32_t>(ExtensionAbilityType::APP_SERVICE), &nAppService));
3091     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "APP_SERVICE", nAppService));
3092 
3093     napi_value nSelection;
3094     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3095         static_cast<int32_t>(ExtensionAbilityType::SELECTION), &nSelection));
3096     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SELECTION", nSelection));
3097 
3098     napi_value nWindow;
3099     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3100         static_cast<int32_t>(ExtensionAbilityType::WINDOW), &nWindow));
3101     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "WINDOW", nWindow));
3102 
3103     napi_value nEnterpriseAdmin;
3104     NAPI_CALL_RETURN_VOID(env,
3105         napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::ENTERPRISE_ADMIN), &nEnterpriseAdmin));
3106     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "ENTERPRISE_ADMIN", nEnterpriseAdmin));
3107 
3108     napi_value nTHUMBNAIL;
3109     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3110         static_cast<int32_t>(ExtensionAbilityType::THUMBNAIL), &nTHUMBNAIL));
3111     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "THUMBNAIL", nTHUMBNAIL));
3112 
3113     napi_value nPREVIEW;
3114     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3115         static_cast<int32_t>(ExtensionAbilityType::PREVIEW), &nPREVIEW));
3116     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "PREVIEW", nPREVIEW));
3117 
3118     napi_value nPrint;
3119     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3120         static_cast<int32_t>(ExtensionAbilityType::PRINT), &nPrint));
3121     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "PRINT", nPrint));
3122 
3123     napi_value nShare;
3124     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3125         static_cast<int32_t>(ExtensionAbilityType::SHARE), &nShare));
3126     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SHARE", nShare));
3127 
3128     napi_value nAction;
3129     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3130         static_cast<int32_t>(ExtensionAbilityType::ACTION), &nAction));
3131     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "ACTION", nAction));
3132 
3133     napi_value nAdsService;
3134     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3135         static_cast<int32_t>(ExtensionAbilityType::ADS_SERVICE), &nAdsService));
3136     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "ADS_SERVICE", nAdsService));
3137 
3138     napi_value nEmbeddedUI;
3139     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3140         static_cast<int32_t>(ExtensionAbilityType::EMBEDDED_UI), &nEmbeddedUI));
3141     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "EMBEDDED_UI", nEmbeddedUI));
3142 
3143     napi_value nfence;
3144     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3145         static_cast<int32_t>(ExtensionAbilityType::FENCE), &nfence));
3146     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "FENCE", nfence));
3147 
3148     napi_value nInsightIntentUI;
3149     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3150         static_cast<int32_t>(ExtensionAbilityType::INSIGHT_INTENT_UI), &nInsightIntentUI));
3151     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "INSIGHT_INTENT_UI", nInsightIntentUI));
3152 
3153     napi_value nAuthorization;
3154     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3155         static_cast<int32_t>(ExtensionAbilityType::APP_ACCOUNT_AUTHORIZATION), &nAuthorization));
3156     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "APP_ACCOUNT_AUTHORIZATION", nAuthorization));
3157 
3158     napi_value nUI;
3159     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3160         static_cast<int32_t>(ExtensionAbilityType::UI), &nUI));
3161     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "UI", nUI));
3162 
3163     napi_value nPush;
3164     NAPI_CALL_RETURN_VOID(env,
3165         napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::PUSH), &nPush));
3166     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "PUSH", nPush));
3167 
3168     napi_value nDriver;
3169     NAPI_CALL_RETURN_VOID(env,
3170         napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::DRIVER), &nDriver));
3171     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "DRIVER", nDriver));
3172 
3173     napi_value nUnspecified;
3174     NAPI_CALL_RETURN_VOID(env,
3175         napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::UNSPECIFIED), &nUnspecified));
3176     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "UNSPECIFIED", nUnspecified));
3177 
3178     napi_value nRemoteNotification;
3179     NAPI_CALL_RETURN_VOID(env,
3180         napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::REMOTE_NOTIFICATION), &nRemoteNotification));
3181     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "REMOTE_NOTIFICATION", nRemoteNotification));
3182 
3183     napi_value nRemoteLocation;
3184     NAPI_CALL_RETURN_VOID(env,
3185         napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::REMOTE_LOCATION), &nRemoteLocation));
3186     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "REMOTE_LOCATION", nRemoteLocation));
3187 
3188     napi_value nVoip;
3189     NAPI_CALL_RETURN_VOID(env,
3190         napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::VOIP), &nVoip));
3191     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "VOIP", nVoip));
3192 
3193     napi_value nSysDialogUserAuth;
3194     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3195         static_cast<int32_t>(ExtensionAbilityType::SYSDIALOG_USERAUTH), &nSysDialogUserAuth));
3196     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SYSDIALOG_USERAUTH", nSysDialogUserAuth));
3197 
3198     napi_value nSysDialogCommon;
3199     NAPI_CALL_RETURN_VOID(env,
3200         napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::SYSDIALOG_COMMON), &nSysDialogCommon));
3201     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SYSDIALOG_COMMON", nSysDialogCommon));
3202 
3203     napi_value nMediaControl;
3204     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3205         static_cast<int32_t>(ExtensionAbilityType::SYSPICKER_MEDIACONTROL), &nMediaControl));
3206     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SYSPICKER_MEDIACONTROL", nMediaControl));
3207 
3208     napi_value nSysDialogAtomicServicePanel;
3209     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3210         static_cast<int32_t>(ExtensionAbilityType::SYSDIALOG_ATOMICSERVICEPANEL), &nSysDialogAtomicServicePanel));
3211     NAPI_CALL_RETURN_VOID(env,
3212         napi_set_named_property(env, value, "SYSDIALOG_ATOMICSERVICEPANEL", nSysDialogAtomicServicePanel));
3213 
3214     napi_value nSysDialogPower;
3215     NAPI_CALL_RETURN_VOID(env,
3216         napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::SYSDIALOG_POWER), &nSysDialogPower));
3217     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SYSDIALOG_POWER", nSysDialogPower));
3218 
3219     napi_value nSysPickerShare;
3220     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3221         static_cast<int32_t>(ExtensionAbilityType::SYSPICKER_SHARE), &nSysPickerShare));
3222     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SYSPICKER_SHARE", nSysPickerShare));
3223 
3224     napi_value nSysHmsAccount;
3225     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3226         static_cast<int32_t>(ExtensionAbilityType::HMS_ACCOUNT), &nSysHmsAccount));
3227     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "HMS_ACCOUNT", nSysHmsAccount));
3228 
3229     napi_value nSysDialogMeetimeCall;
3230     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3231         static_cast<int32_t>(ExtensionAbilityType::SYSDIALOG_MEETIMECALL), &nSysDialogMeetimeCall));
3232     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SYSDIALOG_MEETIMECALL", nSysDialogMeetimeCall));
3233 
3234     napi_value nSysDialogMeetimeContact;
3235     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3236         static_cast<int32_t>(ExtensionAbilityType::SYSDIALOG_MEETIMECONTACT), &nSysDialogMeetimeContact));
3237     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SYSDIALOG_MEETIMECONTACT",
3238         nSysDialogMeetimeContact));
3239 
3240     napi_value nSysDialogMeetimeMessage;
3241     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3242         static_cast<int32_t>(ExtensionAbilityType::SYSDIALOG_MEETIMEMESSAGE), &nSysDialogMeetimeMessage));
3243     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SYSDIALOG_MEETIMEMESSAGE",
3244         nSysDialogMeetimeMessage));
3245 
3246     napi_value nSysPickerMeetimeContact;
3247     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3248         static_cast<int32_t>(ExtensionAbilityType::SYSPICKER_MEETIMECONTACT), &nSysPickerMeetimeContact));
3249     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SYSPICKER_MEETIMECONTACT",
3250         nSysPickerMeetimeContact));
3251 
3252     napi_value nSysPickerMeetimeCallLog;
3253     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3254         static_cast<int32_t>(ExtensionAbilityType::SYSPICKER_MEETIMECALLLOG), &nSysPickerMeetimeCallLog));
3255     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SYSPICKER_MEETIMECALLLOG",
3256         nSysPickerMeetimeCallLog));
3257 
3258     napi_value nAds;
3259     NAPI_CALL_RETURN_VOID(env,
3260         napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::ADS), &nAds));
3261     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "ADS", nAds));
3262 
3263     napi_value nSysCommonUI;
3264     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3265         static_cast<int32_t>(ExtensionAbilityType::SYS_COMMON_UI), &nSysCommonUI));
3266     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SYS_COMMON_UI", nSysCommonUI));
3267 
3268     napi_value nPhotoEditor;
3269     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3270         static_cast<int32_t>(ExtensionAbilityType::PHOTO_EDITOR), &nPhotoEditor));
3271     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "PHOTO_EDITOR", nPhotoEditor));
3272 
3273     napi_value nCallerInfoQuery;
3274     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3275         static_cast<int32_t>(ExtensionAbilityType::CALLER_INFO_QUERY), &nCallerInfoQuery));
3276     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "CALLER_INFO_QUERY", nCallerInfoQuery));
3277 
3278     napi_value nAssetAcceleration;
3279     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3280         static_cast<int32_t>(ExtensionAbilityType::ASSET_ACCELERATION), &nAssetAcceleration));
3281     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "ASSET_ACCELERATION", nAssetAcceleration));
3282 
3283     napi_value nFormEdit;
3284     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3285         static_cast<int32_t>(ExtensionAbilityType::FORM_EDIT), &nFormEdit));
3286     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "FORM_EDIT", nFormEdit));
3287 
3288     napi_value nLiveForm;
3289     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3290         static_cast<int32_t>(ExtensionAbilityType::LIVE_FORM), &nLiveForm));
3291     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "LIVE_FORM", nLiveForm));
3292 }
3293 
CreateApplicationFlagObject(napi_env env,napi_value value)3294 void CreateApplicationFlagObject(napi_env env, napi_value value)
3295 {
3296     napi_value nGetApplicationInfoDefault;
3297     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3298         GetApplicationFlag::GET_APPLICATION_INFO_DEFAULT), &nGetApplicationInfoDefault));
3299     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_APPLICATION_INFO_DEFAULT",
3300         nGetApplicationInfoDefault));
3301 
3302     napi_value nGetApplicationInfoWithPermission;
3303     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3304         GetApplicationFlag::GET_APPLICATION_INFO_WITH_PERMISSION), &nGetApplicationInfoWithPermission));
3305     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_APPLICATION_INFO_WITH_PERMISSION",
3306         nGetApplicationInfoWithPermission));
3307 
3308     napi_value nGetApplicationInfoWithMetadata;
3309     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3310         GetApplicationFlag::GET_APPLICATION_INFO_WITH_METADATA), &nGetApplicationInfoWithMetadata));
3311     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_APPLICATION_INFO_WITH_METADATA",
3312         nGetApplicationInfoWithMetadata));
3313 
3314     napi_value nGetApplicationInfoWithDisable;
3315     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3316         GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE), &nGetApplicationInfoWithDisable));
3317     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_APPLICATION_INFO_WITH_DISABLE",
3318         nGetApplicationInfoWithDisable));
3319 }
3320 
CreateApplicationInfoFlagObject(napi_env env,napi_value value)3321 void CreateApplicationInfoFlagObject(napi_env env, napi_value value)
3322 {
3323     napi_value nApplicationInfoFlagInstalled;
3324     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3325         ApplicationInfoFlag::FLAG_INSTALLED), &nApplicationInfoFlagInstalled));
3326     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "FLAG_INSTALLED",
3327         nApplicationInfoFlagInstalled));
3328 
3329     napi_value nApplicationInfoFlagOtherInstalled;
3330     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3331         ApplicationInfoFlag::FLAG_OTHER_INSTALLED), &nApplicationInfoFlagOtherInstalled));
3332     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "FLAG_OTHER_INSTALLED",
3333         nApplicationInfoFlagOtherInstalled));
3334 
3335     napi_value nApplicationInfoFlagPreinstalledApp;
3336     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3337         ApplicationInfoFlag::FLAG_PREINSTALLED_APP), &nApplicationInfoFlagPreinstalledApp));
3338     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "FLAG_PREINSTALLED_APP",
3339         nApplicationInfoFlagPreinstalledApp));
3340 
3341     napi_value nApplicationInfoFlagPreinstalledAppUpdate;
3342     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3343         ApplicationInfoFlag::FLAG_PREINSTALLED_APP_UPDATE), &nApplicationInfoFlagPreinstalledAppUpdate));
3344     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "FLAG_PREINSTALLED_APP_UPDATE",
3345         nApplicationInfoFlagPreinstalledAppUpdate));
3346 }
3347 
CreateAppDistributionTypeObject(napi_env env,napi_value value)3348 void CreateAppDistributionTypeObject(napi_env env, napi_value value)
3349 {
3350     napi_value nAppGallery;
3351     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, ENUM_ONE, &nAppGallery));
3352     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "APP_GALLERY", nAppGallery));
3353 
3354     napi_value nEnterprise;
3355     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, ENUM_TWO, &nEnterprise));
3356     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "ENTERPRISE", nEnterprise));
3357 
3358     napi_value nEnterPriseNormal;
3359     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, ENUM_THREE, &nEnterPriseNormal));
3360     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "ENTERPRISE_NORMAL", nEnterPriseNormal));
3361 
3362     napi_value nEnterPriseMdm;
3363     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, ENUM_FOUR, &nEnterPriseMdm));
3364     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "ENTERPRISE_MDM", nEnterPriseMdm));
3365 
3366     napi_value nOsIntegration;
3367     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, ENUM_FIVE, &nOsIntegration));
3368     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "OS_INTEGRATION", nOsIntegration));
3369 
3370     napi_value nCrowdTesting;
3371     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, ENUM_SIX, &nCrowdTesting));
3372     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "CROWDTESTING", nCrowdTesting));
3373 
3374     napi_value nNone;
3375     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, ENUM_SEVEN, &nNone));
3376     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "NONE", nNone));
3377 }
3378 
GetPermissionDefExec(napi_env env,void * data)3379 void GetPermissionDefExec(napi_env env, void *data)
3380 {
3381     AsyncPermissionDefineCallbackInfo *asyncCallbackInfo = reinterpret_cast<AsyncPermissionDefineCallbackInfo *>(data);
3382     if (asyncCallbackInfo == nullptr) {
3383         APP_LOGE("asyncCallbackInfo is nullptr");
3384         return;
3385     }
3386     if (asyncCallbackInfo->err == NO_ERROR) {
3387         asyncCallbackInfo->err = BundleManagerHelper::InnerGetPermissionDef(asyncCallbackInfo->permissionName,
3388             asyncCallbackInfo->permissionDef);
3389     }
3390 }
3391 
GetPermissionDefComplete(napi_env env,napi_status status,void * data)3392 void GetPermissionDefComplete(napi_env env, napi_status status, void *data)
3393 {
3394     AsyncPermissionDefineCallbackInfo *asyncCallbackInfo = reinterpret_cast<AsyncPermissionDefineCallbackInfo *>(data);
3395     if (asyncCallbackInfo == nullptr) {
3396         APP_LOGE("asyncCallbackInfo is null");
3397         return;
3398     }
3399     std::unique_ptr<AsyncPermissionDefineCallbackInfo> callbackPtr {asyncCallbackInfo};
3400     napi_value result[ARGS_SIZE_TWO] = {0};
3401     if (asyncCallbackInfo->err == NO_ERROR) {
3402         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
3403         NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &result[ARGS_POS_ONE]));
3404         CommonFunc::ConvertPermissionDef(env, result[ARGS_POS_ONE], asyncCallbackInfo->permissionDef);
3405     } else {
3406         result[0] = BusinessError::CreateCommonError(
3407             env, asyncCallbackInfo->err, GET_PERMISSION_DEF, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
3408     }
3409     CommonFunc::NapiReturnDeferred<AsyncPermissionDefineCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
3410 }
3411 
3412 /**
3413  * Promise and async callback
3414  */
GetPermissionDef(napi_env env,napi_callback_info info)3415 napi_value GetPermissionDef(napi_env env, napi_callback_info info)
3416 {
3417     APP_LOGD("GetPermissionDef called");
3418     NapiArg args(env, info);
3419     AsyncPermissionDefineCallbackInfo *asyncCallbackInfo = new (std::nothrow) AsyncPermissionDefineCallbackInfo(env);
3420     if (asyncCallbackInfo == nullptr) {
3421         APP_LOGE("asyncCallbackInfo is null");
3422         return nullptr;
3423     }
3424     std::unique_ptr<AsyncPermissionDefineCallbackInfo> callbackPtr {asyncCallbackInfo};
3425     if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_TWO)) {
3426         APP_LOGE("param count invalid");
3427         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
3428         return nullptr;
3429     }
3430     for (size_t i = 0; i < args.GetMaxArgc(); ++i) {
3431         napi_valuetype valuetype = napi_undefined;
3432         NAPI_CALL(env, napi_typeof(env, args[i], &valuetype));
3433         if (i == ARGS_POS_ZERO) {
3434             if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->permissionName)) {
3435                 APP_LOGE("permissionName invalid");
3436                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, PERMISSION_NAME, TYPE_STRING);
3437                 return nullptr;
3438             }
3439         } else if (i == ARGS_POS_ONE) {
3440             if (valuetype == napi_function) {
3441                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
3442             } else {
3443                 APP_LOGD("GetPermissionDef extra arg ignored");
3444             }
3445         } else {
3446             APP_LOGE("GetPermissionDef arg err");
3447             BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR);
3448             return nullptr;
3449         }
3450     }
3451 
3452     auto promise = CommonFunc::AsyncCallNativeMethod<AsyncPermissionDefineCallbackInfo>(
3453         env, asyncCallbackInfo, "GetPermissionDef", GetPermissionDefExec, GetPermissionDefComplete);
3454     callbackPtr.release();
3455     return promise;
3456 }
3457 
CheckToCache(napi_env env,int32_t uid,int32_t callingUid,const Query & query,napi_value jsObject)3458 static void CheckToCache(napi_env env, int32_t uid, int32_t callingUid, const Query &query, napi_value jsObject)
3459 {
3460     if (uid != callingUid) {
3461         APP_LOGD("uid %{public}d and callingUid %{public}d not equal", uid, callingUid);
3462         return;
3463     }
3464     napi_ref cacheApplicationInfo = nullptr;
3465     NAPI_CALL_RETURN_VOID(env, napi_create_reference(env, jsObject, NAPI_RETURN_ONE, &cacheApplicationInfo));
3466     std::unique_lock<std::shared_mutex> lock(g_cacheMutex);
3467     cache[query] = cacheApplicationInfo;
3468 }
3469 
GetApplicationInfoSync(napi_env env,napi_callback_info info)3470 napi_value GetApplicationInfoSync(napi_env env, napi_callback_info info)
3471 {
3472     APP_LOGD("NAPI GetApplicationInfoSync call");
3473     NapiArg args(env, info);
3474     if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_THREE)) {
3475         APP_LOGE("param count invalid");
3476         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
3477         return nullptr;
3478     }
3479     std::string bundleName;
3480     int32_t flags = 0;
3481     int32_t userId = Constants::UNSPECIFIED_USERID;
3482     for (size_t i = 0; i < args.GetArgc(); ++i) {
3483         napi_valuetype valueType = napi_undefined;
3484         napi_typeof(env, args[i], &valueType);
3485         if (i == ARGS_POS_ZERO) {
3486             if (!CommonFunc::ParseString(env, args[i], bundleName)) {
3487                 APP_LOGE("bundleName %{public}s invalid", bundleName.c_str());
3488                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
3489                 return nullptr;
3490             }
3491         } else if (i == ARGS_POS_ONE) {
3492             if (!CommonFunc::ParseInt(env, args[i], flags)) {
3493                 APP_LOGE("parseInt failed");
3494                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, APP_FLAGS, TYPE_NUMBER);
3495                 return nullptr;
3496             }
3497         } else if (i == ARGS_POS_TWO) {
3498             if (!CommonFunc::ParseInt(env, args[i], userId)) {
3499                 APP_LOGW("userId parseInt failed");
3500             }
3501         } else {
3502             APP_LOGE("parameter is invalid");
3503             BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
3504             return nullptr;
3505         }
3506     }
3507     if (bundleName.size() == 0) {
3508         napi_value businessError = BusinessError::CreateCommonError(
3509             env, ERROR_BUNDLE_NOT_EXIST, GET_BUNDLE_INFO_SYNC, BUNDLE_PERMISSIONS);
3510         napi_throw(env, businessError);
3511         return nullptr;
3512     }
3513     if (userId == Constants::UNSPECIFIED_USERID) {
3514         userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
3515     }
3516     napi_value nApplicationInfo = nullptr;
3517     {
3518         std::shared_lock<std::shared_mutex> lock(g_cacheMutex);
3519         auto item = cache.find(Query(bundleName, GET_APPLICATION_INFO, flags, userId, env));
3520         if (item != cache.end()) {
3521             APP_LOGD("getApplicationInfo param from cache");
3522             NAPI_CALL(env,
3523                 napi_get_reference_value(env, item->second, &nApplicationInfo));
3524             return nApplicationInfo;
3525         }
3526     }
3527     auto iBundleMgr = CommonFunc::GetBundleMgr();
3528     if (iBundleMgr == nullptr) {
3529         APP_LOGE("can not get iBundleMgr");
3530         return nullptr;
3531     }
3532     AppExecFwk::ApplicationInfo appInfo;
3533     ErrCode ret = CommonFunc::ConvertErrCode(
3534         iBundleMgr->GetApplicationInfoV9(bundleName, flags, userId, appInfo));
3535     if (ret != NO_ERROR) {
3536         APP_LOGE_NOFUNC("GetApplicationInfo failed -n:%{public}s -f: %{public}d -u: %{public}d",
3537             bundleName.c_str(), flags, userId);
3538         napi_value businessError = BusinessError::CreateCommonError(
3539             env, ret, GET_BUNDLE_INFO_SYNC, BUNDLE_PERMISSIONS);
3540         napi_throw(env, businessError);
3541         return nullptr;
3542     }
3543     NAPI_CALL(env, napi_create_object(env, &nApplicationInfo));
3544     CommonFunc::ConvertApplicationInfo(env, nApplicationInfo, appInfo);
3545     Query query(bundleName, GET_APPLICATION_INFO, flags, userId, env);
3546     CheckToCache(env, appInfo.uid, IPCSkeleton::GetCallingUid(), query, nApplicationInfo);
3547     return nApplicationInfo;
3548 }
3549 
GetBundleInfoSync(napi_env env,napi_callback_info info)3550 napi_value GetBundleInfoSync(napi_env env, napi_callback_info info)
3551 {
3552     APP_LOGD("NAPI GetBundleInfoSync call");
3553     NapiArg args(env, info);
3554     if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_THREE)) {
3555         APP_LOGE("param count invalid");
3556         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
3557         return nullptr;
3558     }
3559     std::string bundleName;
3560     int32_t flags = 0;
3561     int32_t userId = Constants::UNSPECIFIED_USERID;
3562     for (size_t i = 0; i < args.GetArgc(); ++i) {
3563         napi_valuetype valueType = napi_undefined;
3564         NAPI_CALL(env, napi_typeof(env, args[i], &valueType));
3565         if (i == ARGS_POS_ZERO) {
3566             if (!CommonFunc::ParseString(env, args[i], bundleName)) {
3567                 APP_LOGE("bundleName %{public}s invalid", bundleName.c_str());
3568                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
3569                 return nullptr;
3570             }
3571         } else if (i == ARGS_POS_ONE) {
3572             if (!CommonFunc::ParseInt(env, args[i], flags)) {
3573                 APP_LOGE("parseInt failed");
3574                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_FLAGS, TYPE_NUMBER);
3575                 return nullptr;
3576             }
3577         } else if (i == ARGS_POS_TWO) {
3578             if ((valueType == napi_number) && (!CommonFunc::ParseInt(env, args[i], userId))) {
3579                 APP_LOGE("parseInt failed");
3580                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, USER_ID, TYPE_NUMBER);
3581                 return nullptr;
3582             }
3583         } else {
3584             APP_LOGE("parameter is invalid");
3585             BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
3586             return nullptr;
3587         }
3588     }
3589     if (bundleName.size() == 0) {
3590         napi_value businessError = BusinessError::CreateCommonError(
3591             env, ERROR_BUNDLE_NOT_EXIST, GET_BUNDLE_INFO_SYNC, BUNDLE_PERMISSIONS);
3592         napi_throw(env, businessError);
3593         return nullptr;
3594     }
3595     if (userId == Constants::UNSPECIFIED_USERID) {
3596         userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
3597     }
3598     napi_value nBundleInfo = nullptr;
3599     {
3600         std::shared_lock<std::shared_mutex> lock(g_cacheMutex);
3601         auto item = cache.find(Query(bundleName, GET_BUNDLE_INFO, flags, userId, env));
3602         if (item != cache.end()) {
3603             APP_LOGD("GetBundleInfo param from cache");
3604             NAPI_CALL(env,
3605                 napi_get_reference_value(env, item->second, &nBundleInfo));
3606             return nBundleInfo;
3607         }
3608     }
3609     auto iBundleMgr = CommonFunc::GetBundleMgr();
3610     if (iBundleMgr == nullptr) {
3611         APP_LOGE("BundleMgr is null");
3612         return nullptr;
3613     }
3614     BundleInfo bundleInfo;
3615     ErrCode ret = CommonFunc::ConvertErrCode(iBundleMgr->GetBundleInfoV9(bundleName, flags, bundleInfo, userId));
3616     if (ret != NO_ERROR) {
3617         APP_LOGD("GetBundleInfoV9 failed -n %{public}s -f %{public}d -u %{public}d",
3618             bundleName.c_str(), flags, userId);
3619         napi_value businessError = BusinessError::CreateCommonError(
3620             env, ret, GET_BUNDLE_INFO_SYNC, BUNDLE_PERMISSIONS);
3621         napi_throw(env, businessError);
3622         return nullptr;
3623     }
3624     NAPI_CALL(env, napi_create_object(env,  &nBundleInfo));
3625     CommonFunc::ConvertBundleInfo(env, bundleInfo, nBundleInfo, flags);
3626     if (!CommonFunc::CheckBundleFlagWithPermission(flags)) {
3627         Query query(bundleName, GET_BUNDLE_INFO, flags, userId, env);
3628         CheckToCache(env, bundleInfo.uid, IPCSkeleton::GetCallingUid(), query, nBundleInfo);
3629     }
3630     return nBundleInfo;
3631 }
3632 
InnerGetBundleInfos(int32_t flags,int32_t userId,std::vector<BundleInfo> & bundleInfos)3633 static ErrCode InnerGetBundleInfos(int32_t flags,
3634     int32_t userId, std::vector<BundleInfo> &bundleInfos)
3635 {
3636     auto iBundleMgr = CommonFunc::GetBundleMgr();
3637     if (iBundleMgr == nullptr) {
3638         APP_LOGE("iBundleMgr is null");
3639         return ERROR_BUNDLE_SERVICE_EXCEPTION;
3640     }
3641     ErrCode ret = iBundleMgr->GetBundleInfosV9(flags, bundleInfos, userId);
3642     return CommonFunc::ConvertErrCode(ret);
3643 }
3644 
CreateBundleFlagObject(napi_env env,napi_value value)3645 void CreateBundleFlagObject(napi_env env, napi_value value)
3646 {
3647     napi_value nBundleInfoDefault;
3648     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_DEFAULT),
3649         &nBundleInfoDefault));
3650     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_DEFAULT",
3651         nBundleInfoDefault));
3652 
3653     napi_value nGetBundleInfoWithApplication;
3654     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3655         GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_APPLICATION), &nGetBundleInfoWithApplication));
3656     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_APPLICATION",
3657         nGetBundleInfoWithApplication));
3658 
3659     napi_value nGetBundleInfoWithHapModule;
3660     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3661         GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE), &nGetBundleInfoWithHapModule));
3662     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_HAP_MODULE",
3663         nGetBundleInfoWithHapModule));
3664 
3665     napi_value nGetBundleInfoWithAbility;
3666     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3667         GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_ABILITY), &nGetBundleInfoWithAbility));
3668     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_ABILITY",
3669         nGetBundleInfoWithAbility));
3670 
3671     napi_value nGetBundleInfoWithExtensionAbility;
3672     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3673         GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_EXTENSION_ABILITY), &nGetBundleInfoWithExtensionAbility));
3674     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_EXTENSION_ABILITY",
3675         nGetBundleInfoWithExtensionAbility));
3676 
3677     napi_value nGetBundleInfoWithRequestedPermission;
3678     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3679         GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_REQUESTED_PERMISSION), &nGetBundleInfoWithRequestedPermission));
3680     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_REQUESTED_PERMISSION",
3681         nGetBundleInfoWithRequestedPermission));
3682 
3683     napi_value nGetBundleInfoWithMetadata;
3684     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3685         GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_METADATA), &nGetBundleInfoWithMetadata));
3686     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_METADATA",
3687         nGetBundleInfoWithMetadata));
3688 
3689     napi_value nGetBundleInfoWithDisable;
3690     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3691         GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_DISABLE), &nGetBundleInfoWithDisable));
3692     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_DISABLE",
3693         nGetBundleInfoWithDisable));
3694 
3695     napi_value nGetBundleInfoWithSignatureInfo;
3696     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3697         GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_SIGNATURE_INFO), &nGetBundleInfoWithSignatureInfo));
3698     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_SIGNATURE_INFO",
3699         nGetBundleInfoWithSignatureInfo));
3700 
3701     napi_value nGetBundleInfoWithMenu;
3702     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3703         GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_MENU), &nGetBundleInfoWithMenu));
3704     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_MENU",
3705         nGetBundleInfoWithMenu));
3706 
3707     napi_value nGetBundleInfoWithRouterMap;
3708     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3709         GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_ROUTER_MAP), &nGetBundleInfoWithRouterMap));
3710     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_ROUTER_MAP",
3711         nGetBundleInfoWithRouterMap));
3712 
3713     napi_value nGetBundleInfoWithSkill;
3714     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3715         GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_SKILL), &nGetBundleInfoWithSkill));
3716     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_SKILL",
3717         nGetBundleInfoWithSkill));
3718 
3719     napi_value nGetBundleInfoOnlyWithLauncherAbility;
3720     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3721         GetBundleInfoFlag::GET_BUNDLE_INFO_ONLY_WITH_LAUNCHER_ABILITY), &nGetBundleInfoOnlyWithLauncherAbility));
3722     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_ONLY_WITH_LAUNCHER_ABILITY",
3723         nGetBundleInfoOnlyWithLauncherAbility));
3724 
3725     napi_value nGetBundleInfoExcludeClone;
3726     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3727         GetBundleInfoFlag::GET_BUNDLE_INFO_EXCLUDE_CLONE), &nGetBundleInfoExcludeClone));
3728     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_EXCLUDE_CLONE",
3729         nGetBundleInfoExcludeClone));
3730     napi_value nGetBundleInfoOfAnyUser;
3731     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3732         GetBundleInfoFlag::GET_BUNDLE_INFO_OF_ANY_USER), &nGetBundleInfoOfAnyUser));
3733     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_OF_ANY_USER",
3734         nGetBundleInfoOfAnyUser));
3735 
3736     napi_value nGetBundleInfoWithCloudKit;
3737     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3738         GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_CLOUD_KIT), &nGetBundleInfoWithCloudKit));
3739     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_CLOUD_KIT",
3740         nGetBundleInfoWithCloudKit));
3741 }
3742 
InnerGetBundleInfo(const std::string & bundleName,int32_t flags,int32_t userId,BundleInfo & bundleInfo)3743 static ErrCode InnerGetBundleInfo(const std::string &bundleName, int32_t flags,
3744     int32_t userId, BundleInfo &bundleInfo)
3745 {
3746     auto iBundleMgr = CommonFunc::GetBundleMgr();
3747     if (iBundleMgr == nullptr) {
3748         APP_LOGE("iBundleMgr is null");
3749         return ERROR_BUNDLE_SERVICE_EXCEPTION;
3750     }
3751     ErrCode ret = iBundleMgr->GetBundleInfoV9(bundleName, flags, bundleInfo, userId);
3752     return CommonFunc::ConvertErrCode(ret);
3753 }
3754 
InnerGetBundleInfoForSelf(int32_t flags,BundleInfo & bundleInfo)3755 static ErrCode InnerGetBundleInfoForSelf(int32_t flags, BundleInfo &bundleInfo)
3756 {
3757     auto iBundleMgr = CommonFunc::GetBundleMgr();
3758     if (iBundleMgr == nullptr) {
3759         APP_LOGE("iBundleMgr is null");
3760         return ERROR_BUNDLE_SERVICE_EXCEPTION;
3761     }
3762     ErrCode ret = iBundleMgr->GetBundleInfoForSelf(flags, bundleInfo);
3763     return CommonFunc::ConvertErrCode(ret);
3764 }
3765 
ProcessBundleInfos(napi_env env,napi_value result,const std::vector<BundleInfo> & bundleInfos,int32_t flags)3766 static void ProcessBundleInfos(
3767     napi_env env, napi_value result, const std::vector<BundleInfo> &bundleInfos, int32_t flags)
3768 {
3769     if (bundleInfos.size() == 0) {
3770         APP_LOGD("bundleInfos is null");
3771         return;
3772     }
3773     size_t index = 0;
3774     for (const auto &item : bundleInfos) {
3775         APP_LOGD("name: %{public}s ", item.name.c_str());
3776         napi_value objBundleInfo;
3777         NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &objBundleInfo));
3778         CommonFunc::ConvertBundleInfo(env, item, objBundleInfo, flags);
3779         NAPI_CALL_RETURN_VOID(env, napi_set_element(env, result, index, objBundleInfo));
3780         index++;
3781     }
3782 }
3783 
GetBundleInfosComplete(napi_env env,napi_status status,void * data)3784 void GetBundleInfosComplete(napi_env env, napi_status status, void *data)
3785 {
3786     BundleInfosCallbackInfo *asyncCallbackInfo =
3787         reinterpret_cast<BundleInfosCallbackInfo *>(data);
3788     if (asyncCallbackInfo == nullptr) {
3789         APP_LOGE("asyncCallbackInfo is null");
3790         return;
3791     }
3792     std::unique_ptr<BundleInfosCallbackInfo> callbackPtr {asyncCallbackInfo};
3793     napi_value result[CALLBACK_PARAM_SIZE] = {0};
3794     if (asyncCallbackInfo->err == NO_ERROR) {
3795         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
3796         NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &result[ARGS_POS_ONE]));
3797         ProcessBundleInfos(env, result[ARGS_POS_ONE], asyncCallbackInfo->bundleInfos, asyncCallbackInfo->flags);
3798     } else {
3799         result[ARGS_POS_ZERO] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
3800             GET_BUNDLE_INFOS, Constants::PERMISSION_GET_INSTALLED_BUNDLE_LIST);
3801     }
3802     CommonFunc::NapiReturnDeferred<BundleInfosCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
3803 }
3804 
GetBundleInfoComplete(napi_env env,napi_status status,void * data)3805 void GetBundleInfoComplete(napi_env env, napi_status status, void *data)
3806 {
3807     BundleInfoCallbackInfo *asyncCallbackInfo =
3808         reinterpret_cast<BundleInfoCallbackInfo *>(data);
3809     if (asyncCallbackInfo == nullptr) {
3810         APP_LOGE("asyncCallbackInfo is null");
3811         return;
3812     }
3813     std::unique_ptr<BundleInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
3814     napi_value result[CALLBACK_PARAM_SIZE] = {0};
3815     if (asyncCallbackInfo->err == NO_ERROR) {
3816         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
3817         if (asyncCallbackInfo->isSavedInCache) {
3818             std::shared_lock<std::shared_mutex> lock(g_cacheMutex);
3819             auto item = cache.find(Query(
3820                 asyncCallbackInfo->bundleName, GET_BUNDLE_INFO,
3821                 asyncCallbackInfo->flags, asyncCallbackInfo->userId, env));
3822             if (item == cache.end()) {
3823                 APP_LOGE("cannot find result in cache");
3824                 return;
3825             }
3826             NAPI_CALL_RETURN_VOID(env, napi_get_reference_value(env, item->second, &result[ARGS_POS_ONE]));
3827         } else {
3828             NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &result[ARGS_POS_ONE]));
3829             CommonFunc::ConvertBundleInfo(env,
3830                 asyncCallbackInfo->bundleInfo, result[ARGS_POS_ONE], asyncCallbackInfo->flags);
3831             if (!CommonFunc::CheckBundleFlagWithPermission(asyncCallbackInfo->flags)) {
3832                 Query query(
3833                     asyncCallbackInfo->bundleName, GET_BUNDLE_INFO,
3834                     asyncCallbackInfo->flags, asyncCallbackInfo->userId, env);
3835                 CheckToCache(env, asyncCallbackInfo->bundleInfo.uid, IPCSkeleton::GetCallingUid(),
3836                     query, result[ARGS_POS_ONE]);
3837             }
3838         }
3839     } else {
3840         result[ARGS_POS_ZERO] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
3841             GET_BUNDLE_INFO, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
3842     }
3843     CommonFunc::NapiReturnDeferred<BundleInfoCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
3844 }
3845 
GetBundleInfoExec(napi_env env,void * data)3846 void GetBundleInfoExec(napi_env env, void *data)
3847 {
3848     BundleInfoCallbackInfo *asyncCallbackInfo = reinterpret_cast<BundleInfoCallbackInfo *>(data);
3849     if (asyncCallbackInfo == nullptr) {
3850         APP_LOGE("asyncCallbackInfo is null");
3851         return;
3852     }
3853     if (asyncCallbackInfo->err == NO_ERROR) {
3854         if (!CommonFunc::CheckBundleFlagWithPermission(asyncCallbackInfo->flags)) {
3855             std::shared_lock<std::shared_mutex> lock(g_cacheMutex);
3856             auto item = cache.find(Query(asyncCallbackInfo->bundleName,
3857                 GET_BUNDLE_INFO, asyncCallbackInfo->flags, asyncCallbackInfo->userId, env));
3858             if (item != cache.end()) {
3859                 asyncCallbackInfo->isSavedInCache = true;
3860                 APP_LOGD("GetBundleInfo param from cache");
3861                 return;
3862             }
3863         }
3864         asyncCallbackInfo->err = InnerGetBundleInfo(asyncCallbackInfo->bundleName,
3865             asyncCallbackInfo->flags, asyncCallbackInfo->userId, asyncCallbackInfo->bundleInfo);
3866     }
3867 }
3868 
GetBundleInfoForSelfExec(napi_env env,void * data)3869 void GetBundleInfoForSelfExec(napi_env env, void *data)
3870 {
3871     BundleInfoCallbackInfo *asyncCallbackInfo = reinterpret_cast<BundleInfoCallbackInfo *>(data);
3872     if (asyncCallbackInfo == nullptr) {
3873         APP_LOGE("asyncCallbackInfo is null");
3874         return;
3875     }
3876     if (asyncCallbackInfo->err != NO_ERROR) {
3877         return;
3878     }
3879     auto uid = IPCSkeleton::GetCallingUid();
3880     asyncCallbackInfo->uid = uid;
3881     asyncCallbackInfo->bundleName = std::to_string(uid);
3882     asyncCallbackInfo->userId = uid / Constants::BASE_USER_RANGE;
3883     if (!CommonFunc::CheckBundleFlagWithPermission(asyncCallbackInfo->flags)) {
3884         std::shared_lock<std::shared_mutex> lock(g_cacheMutex);
3885         auto item = cache.find(Query(
3886             asyncCallbackInfo->bundleName, GET_BUNDLE_INFO,
3887             asyncCallbackInfo->flags, asyncCallbackInfo->userId, env));
3888         if (item != cache.end()) {
3889             asyncCallbackInfo->isSavedInCache = true;
3890             APP_LOGD("GetBundleInfo param from cache");
3891             return;
3892         }
3893     }
3894     asyncCallbackInfo->err = InnerGetBundleInfoForSelf(
3895         asyncCallbackInfo->flags, asyncCallbackInfo->bundleInfo);
3896 }
3897 
GetBundleInfo(napi_env env,napi_callback_info info)3898 napi_value GetBundleInfo(napi_env env, napi_callback_info info)
3899 {
3900     LOG_NOFUNC_I(BMS_TAG_COMMON, "NAPI GetBundleInfo call");
3901     NapiArg args(env, info);
3902     BundleInfoCallbackInfo *asyncCallbackInfo = new (std::nothrow) BundleInfoCallbackInfo(env);
3903     if (asyncCallbackInfo == nullptr) {
3904         APP_LOGE("asyncCallbackInfo is null");
3905         return nullptr;
3906     }
3907     std::unique_ptr<BundleInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
3908     if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_FOUR)) {
3909         APP_LOGE("param count invalid");
3910         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
3911         return nullptr;
3912     }
3913     asyncCallbackInfo->uid = IPCSkeleton::GetCallingUid();
3914     asyncCallbackInfo->userId = asyncCallbackInfo->uid / Constants::BASE_USER_RANGE;
3915     if (args.GetMaxArgc() < ARGS_SIZE_TWO) {
3916         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
3917         return nullptr;
3918     }
3919     for (size_t i = 0; i < args.GetMaxArgc(); i++) {
3920         napi_valuetype valueType = napi_undefined;
3921         napi_typeof(env, args[i], &valueType);
3922         if (i == ARGS_POS_ZERO) {
3923             if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->bundleName)) {
3924                 APP_LOGW("appId %{public}s invalid", asyncCallbackInfo->bundleName.c_str());
3925                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
3926                 return nullptr;
3927             }
3928         } else if (i == ARGS_POS_ONE) {
3929             if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->flags)) {
3930                 APP_LOGE("Flags %{public}d invalid", asyncCallbackInfo->flags);
3931                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_FLAGS, TYPE_NUMBER);
3932                 return nullptr;
3933             }
3934         } else if (i == ARGS_POS_TWO) {
3935             if (valueType == napi_function) {
3936                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
3937                 break;
3938             }
3939             if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->userId)) {
3940                 APP_LOGW("Parse userId failed, set this parameter to the caller userId");
3941             }
3942         } else if (i == ARGS_POS_THREE) {
3943             if (valueType == napi_function) {
3944                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
3945             }
3946             break;
3947         } else {
3948             APP_LOGE("param check error");
3949             BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
3950             return nullptr;
3951         }
3952     }
3953     auto promise = CommonFunc::AsyncCallNativeMethod<BundleInfoCallbackInfo>(
3954         env, asyncCallbackInfo, GET_BUNDLE_INFO, GetBundleInfoExec, GetBundleInfoComplete);
3955     callbackPtr.release();
3956     LOG_NOFUNC_I(BMS_TAG_COMMON, "NAPI GetBundleInfo done");
3957     return promise;
3958 }
3959 
GetBundleInfosExec(napi_env env,void * data)3960 void GetBundleInfosExec(napi_env env, void *data)
3961 {
3962     BundleInfosCallbackInfo *asyncCallbackInfo = reinterpret_cast<BundleInfosCallbackInfo *>(data);
3963     if (asyncCallbackInfo == nullptr) {
3964         APP_LOGE("asyncCallbackInfo is null");
3965         return;
3966     }
3967     asyncCallbackInfo->err = InnerGetBundleInfos(asyncCallbackInfo->flags,
3968         asyncCallbackInfo->userId, asyncCallbackInfo->bundleInfos);
3969 }
3970 
GetBundleInfos(napi_env env,napi_callback_info info)3971 napi_value GetBundleInfos(napi_env env, napi_callback_info info)
3972 {
3973     APP_LOGD("NAPI_GetBundleInfos called");
3974     NapiArg args(env, info);
3975     BundleInfosCallbackInfo *asyncCallbackInfo = new (std::nothrow) BundleInfosCallbackInfo(env);
3976     if (asyncCallbackInfo == nullptr) {
3977         APP_LOGE("asyncCallbackInfo is null");
3978         return nullptr;
3979     }
3980     std::unique_ptr<BundleInfosCallbackInfo> callbackPtr {asyncCallbackInfo};
3981     if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_THREE)) {
3982         APP_LOGE("param count invalid");
3983         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
3984         return nullptr;
3985     }
3986     asyncCallbackInfo->userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
3987     if (args.GetMaxArgc() < ARGS_SIZE_ONE) {
3988         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
3989         return nullptr;
3990     }
3991     for (size_t i = 0; i < args.GetMaxArgc(); ++i) {
3992         napi_valuetype valueType = napi_undefined;
3993         napi_typeof(env, args[i], &valueType);
3994         if (i == ARGS_POS_ZERO) {
3995             if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->flags)) {
3996                 APP_LOGE("Flags %{public}d invalid", asyncCallbackInfo->flags);
3997                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_FLAGS, TYPE_NUMBER);
3998                 return nullptr;
3999             }
4000         } else if (i == ARGS_POS_ONE) {
4001             if (valueType == napi_function) {
4002                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
4003                 break;
4004             }
4005             if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->userId)) {
4006                 APP_LOGW("Parse userId failed, set this parameter to the caller userId");
4007             }
4008         } else if (i == ARGS_POS_TWO) {
4009             if (valueType == napi_function) {
4010                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
4011                 break;
4012             }
4013         } else {
4014             APP_LOGE("param check error");
4015             BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
4016             return nullptr;
4017         }
4018     }
4019     auto promise = CommonFunc::AsyncCallNativeMethod<BundleInfosCallbackInfo>(
4020         env, asyncCallbackInfo, GET_BUNDLE_INFOS, GetBundleInfosExec, GetBundleInfosComplete);
4021     callbackPtr.release();
4022     APP_LOGD("call NAPI_GetBundleInfos done");
4023     return promise;
4024 }
4025 
GetBundleInfoForSelf(napi_env env,napi_callback_info info)4026 napi_value GetBundleInfoForSelf(napi_env env, napi_callback_info info)
4027 {
4028     APP_LOGD("GetBundleInfoForSelf called");
4029     NapiArg args(env, info);
4030     BundleInfoCallbackInfo *asyncCallbackInfo = new (std::nothrow) BundleInfoCallbackInfo(env);
4031     if (asyncCallbackInfo == nullptr) {
4032         APP_LOGE("asyncCallbackInfo is null");
4033         return nullptr;
4034     }
4035     std::unique_ptr<BundleInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
4036     if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_TWO)) {
4037         APP_LOGE("param count invalid");
4038         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
4039         return nullptr;
4040     }
4041     for (size_t i = 0; i < args.GetArgc(); ++i) {
4042         napi_valuetype valueType = napi_undefined;
4043         napi_typeof(env, args[i], &valueType);
4044         if (i == ARGS_POS_ZERO) {
4045             if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->flags)) {
4046                 APP_LOGE("Flags invalid");
4047                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_FLAGS, TYPE_NUMBER);
4048                 return nullptr;
4049             }
4050         } else if (i == ARGS_POS_ONE) {
4051             if (valueType == napi_function) {
4052                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
4053             }
4054         } else {
4055             APP_LOGE("param check error");
4056             BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
4057             return nullptr;
4058         }
4059     }
4060     auto promise = CommonFunc::AsyncCallNativeMethod<BundleInfoCallbackInfo>(
4061         env, asyncCallbackInfo, "GetBundleInfoForSelf", GetBundleInfoForSelfExec, GetBundleInfoComplete);
4062     callbackPtr.release();
4063     APP_LOGD("call GetBundleInfoForSelf done");
4064     return promise;
4065 }
4066 
GetAllSharedBundleInfoExec(napi_env env,void * data)4067 void GetAllSharedBundleInfoExec(napi_env env, void *data)
4068 {
4069     SharedBundleCallbackInfo *asyncCallbackInfo = reinterpret_cast<SharedBundleCallbackInfo *>(data);
4070     if (asyncCallbackInfo == nullptr) {
4071         APP_LOGE("asyncCallbackInfo is null");
4072         return;
4073     }
4074     asyncCallbackInfo->err = BundleManagerHelper::InnerGetAllSharedBundleInfo(asyncCallbackInfo->sharedBundles);
4075 }
4076 
GetAllSharedBundleInfoComplete(napi_env env,napi_status status,void * data)4077 void GetAllSharedBundleInfoComplete(napi_env env, napi_status status, void *data)
4078 {
4079     SharedBundleCallbackInfo *asyncCallbackInfo =
4080         reinterpret_cast<SharedBundleCallbackInfo *>(data);
4081     if (asyncCallbackInfo == nullptr) {
4082         APP_LOGE("asyncCallbackInfo is null");
4083         return;
4084     }
4085     std::unique_ptr<SharedBundleCallbackInfo> callbackPtr {asyncCallbackInfo};
4086     napi_value result[CALLBACK_PARAM_SIZE] = {0};
4087     if (asyncCallbackInfo->err == NO_ERROR) {
4088         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
4089         NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &result[ARGS_POS_ONE]));
4090         CommonFunc::ConvertAllSharedBundleInfo(env, result[ARGS_POS_ONE], asyncCallbackInfo->sharedBundles);
4091     } else {
4092         result[ARGS_POS_ZERO] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
4093             GET_ALL_SHARED_BUNDLE_INFO, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
4094     }
4095     CommonFunc::NapiReturnDeferred<SharedBundleCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
4096 }
4097 
GetAllSharedBundleInfo(napi_env env,napi_callback_info info)4098 napi_value GetAllSharedBundleInfo(napi_env env, napi_callback_info info)
4099 {
4100     APP_LOGD("NAPI_GetAllSharedBundleInfo called");
4101     NapiArg args(env, info);
4102     SharedBundleCallbackInfo *asyncCallbackInfo = new (std::nothrow) SharedBundleCallbackInfo(env);
4103     if (asyncCallbackInfo == nullptr) {
4104         APP_LOGE("asyncCallbackInfo is null");
4105         return nullptr;
4106     }
4107     std::unique_ptr<SharedBundleCallbackInfo> callbackPtr {asyncCallbackInfo};
4108     if (!args.Init(ARGS_SIZE_ZERO, ARGS_SIZE_ONE)) {
4109         APP_LOGE("param count invalid");
4110         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
4111         return nullptr;
4112     }
4113     if (args.GetMaxArgc() < ARGS_SIZE_ZERO) {
4114         APP_LOGE("param count invalid");
4115         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
4116         return nullptr;
4117     }
4118     for (size_t i = 0; i < args.GetMaxArgc(); ++i) {
4119         napi_valuetype valueType = napi_undefined;
4120         napi_typeof(env, args[i], &valueType);
4121         if (i == ARGS_POS_ZERO) {
4122             if (valueType == napi_function) {
4123                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
4124                 break;
4125             }
4126         } else {
4127             APP_LOGE("param check error");
4128             BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
4129             return nullptr;
4130         }
4131     }
4132     auto promise = CommonFunc::AsyncCallNativeMethod<SharedBundleCallbackInfo>(env, asyncCallbackInfo,
4133         GET_ALL_SHARED_BUNDLE_INFO, GetAllSharedBundleInfoExec, GetAllSharedBundleInfoComplete);
4134     callbackPtr.release();
4135     APP_LOGD("call NAPI_GetAllSharedBundleInfo done");
4136     return promise;
4137 }
4138 
GetSharedBundleInfoExec(napi_env env,void * data)4139 void GetSharedBundleInfoExec(napi_env env, void *data)
4140 {
4141     SharedBundleCallbackInfo *asyncCallbackInfo = reinterpret_cast<SharedBundleCallbackInfo *>(data);
4142     if (asyncCallbackInfo == nullptr) {
4143         APP_LOGE("asyncCallbackInfo is null");
4144         return;
4145     }
4146     asyncCallbackInfo->err = BundleManagerHelper::InnerGetSharedBundleInfo(
4147         asyncCallbackInfo->bundleName, asyncCallbackInfo->moduleName, asyncCallbackInfo->sharedBundles);
4148 }
4149 
GetSharedBundleInfoComplete(napi_env env,napi_status status,void * data)4150 void GetSharedBundleInfoComplete(napi_env env, napi_status status, void *data)
4151 {
4152     SharedBundleCallbackInfo *asyncCallbackInfo =
4153         reinterpret_cast<SharedBundleCallbackInfo *>(data);
4154     if (asyncCallbackInfo == nullptr) {
4155         APP_LOGE("asyncCallbackInfo is null");
4156         return;
4157     }
4158     std::unique_ptr<SharedBundleCallbackInfo> callbackPtr {asyncCallbackInfo};
4159     napi_value result[CALLBACK_PARAM_SIZE] = {0};
4160     if (asyncCallbackInfo->err == NO_ERROR) {
4161         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
4162         NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &result[ARGS_POS_ONE]));
4163         CommonFunc::ConvertAllSharedBundleInfo(env, result[ARGS_POS_ONE], asyncCallbackInfo->sharedBundles);
4164     } else {
4165         if (asyncCallbackInfo->bundleName.empty()) {
4166             APP_LOGE("bundleName is empty");
4167             result[ARGS_POS_ZERO] = BusinessError::CreateError(env, ERROR_PARAM_CHECK_ERROR,
4168                 PARAM_BUNDLENAME_EMPTY_ERROR);
4169         } else if (asyncCallbackInfo->moduleName.empty()) {
4170             APP_LOGE("moduleName is empty");
4171             result[ARGS_POS_ZERO] = BusinessError::CreateError(env, ERROR_PARAM_CHECK_ERROR,
4172                 PARAM_MODULENAME_EMPTY_ERROR);
4173         } else {
4174             result[ARGS_POS_ZERO] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
4175                 GET_SHARED_BUNDLE_INFO, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
4176         }
4177     }
4178     CommonFunc::NapiReturnDeferred<SharedBundleCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
4179 }
4180 
GetSharedBundleInfo(napi_env env,napi_callback_info info)4181 napi_value GetSharedBundleInfo(napi_env env, napi_callback_info info)
4182 {
4183     APP_LOGD("NAPI_GetSharedBundleInfo called");
4184     NapiArg args(env, info);
4185     SharedBundleCallbackInfo *asyncCallbackInfo = new (std::nothrow) SharedBundleCallbackInfo(env);
4186     if (asyncCallbackInfo == nullptr) {
4187         APP_LOGE("asyncCallbackInfo is null");
4188         return nullptr;
4189     }
4190     std::unique_ptr<SharedBundleCallbackInfo> callbackPtr {asyncCallbackInfo};
4191     if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_THREE)) {
4192         APP_LOGE("param count invalid");
4193         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
4194         return nullptr;
4195     }
4196     if (args.GetMaxArgc() < ARGS_SIZE_TWO) {
4197         APP_LOGE("param count invalid");
4198         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
4199         return nullptr;
4200     }
4201 
4202     for (size_t i = 0; i < args.GetMaxArgc(); i++) {
4203         napi_valuetype valueType = napi_undefined;
4204         napi_typeof(env, args[i], &valueType);
4205         if (i == ARGS_POS_ZERO) {
4206             if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->bundleName)) {
4207                 APP_LOGW("appId %{public}s invalid", asyncCallbackInfo->bundleName.c_str());
4208                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
4209                 return nullptr;
4210             }
4211         } else if (i == ARGS_POS_ONE) {
4212             if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->moduleName)) {
4213                 APP_LOGW("appId %{public}s invalid", asyncCallbackInfo->moduleName.c_str());
4214                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, MODULE_NAME, TYPE_STRING);
4215                 return nullptr;
4216             }
4217         } else if (i == ARGS_POS_TWO) {
4218             if (valueType == napi_function) {
4219                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
4220                 break;
4221             }
4222         } else {
4223             APP_LOGE("param check error");
4224             BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
4225             return nullptr;
4226         }
4227     }
4228 
4229     auto promise = CommonFunc::AsyncCallNativeMethod<SharedBundleCallbackInfo>(env, asyncCallbackInfo,
4230         GET_SHARED_BUNDLE_INFO, GetSharedBundleInfoExec, GetSharedBundleInfoComplete);
4231     callbackPtr.release();
4232     APP_LOGD("call NAPI_GetSharedBundleInfo done");
4233     return promise;
4234 }
4235 
CreatePermissionGrantStateObject(napi_env env,napi_value value)4236 void CreatePermissionGrantStateObject(napi_env env, napi_value value)
4237 {
4238     napi_value nPermissionDenied;
4239     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, -1, &nPermissionDenied));
4240     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "PERMISSION_DENIED",
4241         nPermissionDenied));
4242 
4243     napi_value nPermissionGranted;
4244     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, 0, &nPermissionGranted));
4245     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "PERMISSION_GRANTED",
4246         nPermissionGranted));
4247 }
4248 
CreateAbilityTypeObject(napi_env env,napi_value value)4249 void CreateAbilityTypeObject(napi_env env, napi_value value)
4250 {
4251     napi_value nUnknow;
4252     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(AbilityType::UNKNOWN), &nUnknow));
4253     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "UNKNOWN", nUnknow));
4254     napi_value nPage;
4255     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(AbilityType::PAGE), &nPage));
4256     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "PAGE", nPage));
4257     napi_value nService;
4258     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(AbilityType::SERVICE), &nService));
4259     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SERVICE", nService));
4260     napi_value nData;
4261     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(AbilityType::DATA), &nData));
4262     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "DATA", nData));
4263 }
4264 
CreateBundleTypeObject(napi_env env,napi_value value)4265 void CreateBundleTypeObject(napi_env env, napi_value value)
4266 {
4267     napi_value nApp;
4268     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(BundleType::APP), &nApp));
4269     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "APP", nApp));
4270     napi_value nAtomicService;
4271     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
4272         static_cast<int32_t>(BundleType::ATOMIC_SERVICE), &nAtomicService));
4273     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "ATOMIC_SERVICE", nAtomicService));
4274 }
4275 
CreateDisplayOrientationObject(napi_env env,napi_value value)4276 void CreateDisplayOrientationObject(napi_env env, napi_value value)
4277 {
4278     napi_value nUnspecified;
4279     NAPI_CALL_RETURN_VOID(
4280         env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::UNSPECIFIED), &nUnspecified));
4281     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "UNSPECIFIED", nUnspecified));
4282     napi_value nLandscape;
4283     NAPI_CALL_RETURN_VOID(
4284         env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::LANDSCAPE), &nLandscape));
4285     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "LANDSCAPE", nLandscape));
4286     napi_value nPortrait;
4287     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::PORTRAIT), &nPortrait));
4288     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "PORTRAIT", nPortrait));
4289     napi_value nFollowrecent;
4290     NAPI_CALL_RETURN_VOID(
4291         env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::FOLLOWRECENT), &nFollowrecent));
4292     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "FOLLOW_RECENT", nFollowrecent));
4293     napi_value nReverseLandscape;
4294     NAPI_CALL_RETURN_VOID(
4295         env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::LANDSCAPE_INVERTED), &nReverseLandscape));
4296     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "LANDSCAPE_INVERTED", nReverseLandscape));
4297     napi_value nReversePortrait;
4298     NAPI_CALL_RETURN_VOID(
4299         env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::PORTRAIT_INVERTED), &nReversePortrait));
4300     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "PORTRAIT_INVERTED", nReversePortrait));
4301     napi_value nLocked;
4302     NAPI_CALL_RETURN_VOID(
4303         env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::LOCKED), &nLocked));
4304     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "LOCKED", nLocked));
4305     CreateOrientationRelatedToSensor(env, value);
4306 }
4307 
CreateOrientationRelatedToSensor(napi_env env,napi_value value)4308 void CreateOrientationRelatedToSensor(napi_env env, napi_value value)
4309 {
4310     napi_value nAutoRotation;
4311     NAPI_CALL_RETURN_VOID(
4312         env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::AUTO_ROTATION), &nAutoRotation));
4313     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "AUTO_ROTATION", nAutoRotation));
4314     napi_value nAutoRotationLandscape;
4315     NAPI_CALL_RETURN_VOID(
4316         env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::AUTO_ROTATION_LANDSCAPE),
4317             &nAutoRotationLandscape));
4318     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "AUTO_ROTATION_LANDSCAPE", nAutoRotationLandscape));
4319     napi_value nAutoRotationPortrait;
4320     NAPI_CALL_RETURN_VOID(
4321         env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::AUTO_ROTATION_PORTRAIT),
4322             &nAutoRotationPortrait));
4323     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "AUTO_ROTATION_PORTRAIT", nAutoRotationPortrait));
4324     napi_value nAutoRotationRestricted;
4325     NAPI_CALL_RETURN_VOID(
4326         env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::AUTO_ROTATION_RESTRICTED),
4327             &nAutoRotationRestricted));
4328     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "AUTO_ROTATION_RESTRICTED",
4329         nAutoRotationRestricted));
4330     napi_value nAutoRotationLandscapeRestricted;
4331     NAPI_CALL_RETURN_VOID(
4332         env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::AUTO_ROTATION_LANDSCAPE_RESTRICTED),
4333             &nAutoRotationLandscapeRestricted));
4334     NAPI_CALL_RETURN_VOID(env,
4335         napi_set_named_property(env, value, "AUTO_ROTATION_LANDSCAPE_RESTRICTED", nAutoRotationLandscapeRestricted));
4336     napi_value nAutoRotationPortraitRestricted;
4337     NAPI_CALL_RETURN_VOID(
4338         env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::AUTO_ROTATION_PORTRAIT_RESTRICTED),
4339             &nAutoRotationPortraitRestricted));
4340     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "AUTO_ROTATION_PORTRAIT_RESTRICTED",
4341         nAutoRotationPortraitRestricted));
4342     napi_value nAutoRotationUnspecified;
4343     NAPI_CALL_RETURN_VOID(env,
4344         napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::AUTO_ROTATION_UNSPECIFIED),
4345             &nAutoRotationUnspecified));
4346     NAPI_CALL_RETURN_VOID(env,
4347         napi_set_named_property(env, value, "AUTO_ROTATION_UNSPECIFIED", nAutoRotationUnspecified));
4348     napi_value nFollowDesktop;
4349     NAPI_CALL_RETURN_VOID(env,
4350         napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::FOLLOW_DESKTOP), &nFollowDesktop));
4351     NAPI_CALL_RETURN_VOID(env,
4352         napi_set_named_property(env, value, "FOLLOW_DESKTOP", nFollowDesktop));
4353 }
4354 
CreateLaunchTypeObject(napi_env env,napi_value value)4355 void CreateLaunchTypeObject(napi_env env, napi_value value)
4356 {
4357     napi_value nSingleton;
4358     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(LaunchMode::SINGLETON), &nSingleton));
4359     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SINGLETON", nSingleton));
4360     napi_value nStandard;
4361     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(LaunchMode::STANDARD), &nStandard));
4362     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "STANDARD", nStandard));
4363     napi_value nMultiton;
4364     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(LaunchMode::STANDARD), &nMultiton));
4365     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "MULTITON", nMultiton));
4366     napi_value nSpecified;
4367     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(LaunchMode::SPECIFIED), &nSpecified));
4368     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SPECIFIED", nSpecified));
4369 }
4370 
CreateSupportWindowModesObject(napi_env env,napi_value value)4371 void CreateSupportWindowModesObject(napi_env env, napi_value value)
4372 {
4373     napi_value nFullscreen;
4374     NAPI_CALL_RETURN_VOID(env,
4375         napi_create_int32(env, static_cast<int32_t>(SupportWindowMode::FULLSCREEN), &nFullscreen));
4376     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "FULL_SCREEN", nFullscreen));
4377 
4378     napi_value nSplit;
4379     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(SupportWindowMode::SPLIT), &nSplit));
4380     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SPLIT", nSplit));
4381 
4382     napi_value nFloat;
4383     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(SupportWindowMode::FLOATING), &nFloat));
4384     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "FLOATING", nFloat));
4385 }
4386 
CreateModuleTypeObject(napi_env env,napi_value value)4387 void CreateModuleTypeObject(napi_env env, napi_value value)
4388 {
4389     napi_value nUnknown;
4390     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(ModuleType::UNKNOWN), &nUnknown));
4391     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "UNKNOWN", nUnknown));
4392 
4393     napi_value nEntry;
4394     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(ModuleType::ENTRY), &nEntry));
4395     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "ENTRY", nEntry));
4396 
4397     napi_value nFeature;
4398     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(ModuleType::FEATURE), &nFeature));
4399     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "FEATURE", nFeature));
4400 
4401     napi_value nShared;
4402     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(ModuleType::SHARED), &nShared));
4403     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SHARED", nShared));
4404 }
4405 
CreateCompatiblePolicyObject(napi_env env,napi_value value)4406 void CreateCompatiblePolicyObject(napi_env env, napi_value value)
4407 {
4408     napi_value nNORMAL;
4409     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(CompatiblePolicy::NORMAL), &nNORMAL));
4410     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "NORMAL", nNORMAL));
4411 
4412     napi_value nBackwardCompatibility;
4413     NAPI_CALL_RETURN_VOID(env, napi_create_int32(
4414         env, static_cast<int32_t>(CompatiblePolicy::BACKWARD_COMPATIBILITY), &nBackwardCompatibility));
4415     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "BACKWARD_COMPATIBILITY", nBackwardCompatibility));
4416 }
4417 
CreateProfileTypeObject(napi_env env,napi_value value)4418 void CreateProfileTypeObject(napi_env env, napi_value value)
4419 {
4420     napi_value nIntentProfile;
4421     NAPI_CALL_RETURN_VOID(env, napi_create_int32(
4422         env, static_cast<int32_t>(ProfileType::INTENT_PROFILE), &nIntentProfile));
4423     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "INTENT_PROFILE", nIntentProfile));
4424 }
4425 
GetAppProvisionInfoExec(napi_env env,void * data)4426 void GetAppProvisionInfoExec(napi_env env, void *data)
4427 {
4428     AppProvisionInfoCallbackInfo *asyncCallbackInfo = reinterpret_cast<AppProvisionInfoCallbackInfo *>(data);
4429     if (asyncCallbackInfo == nullptr) {
4430         APP_LOGE("asyncCallbackInfo is null");
4431         return;
4432     }
4433     if (asyncCallbackInfo->err == NO_ERROR) {
4434         asyncCallbackInfo->err = BundleManagerHelper::InnerGetAppProvisionInfo(
4435             asyncCallbackInfo->bundleName, asyncCallbackInfo->userId, asyncCallbackInfo->appProvisionInfo);
4436     }
4437 }
4438 
GetAppProvisionInfoComplete(napi_env env,napi_status status,void * data)4439 void GetAppProvisionInfoComplete(napi_env env, napi_status status, void *data)
4440 {
4441     AppProvisionInfoCallbackInfo *asyncCallbackInfo =
4442         reinterpret_cast<AppProvisionInfoCallbackInfo *>(data);
4443     if (asyncCallbackInfo == nullptr) {
4444         APP_LOGE("asyncCallbackInfo is null");
4445         return;
4446     }
4447     std::unique_ptr<AppProvisionInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
4448     napi_value result[CALLBACK_PARAM_SIZE] = {0};
4449     if (asyncCallbackInfo->err == NO_ERROR) {
4450         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
4451         NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &result[ARGS_POS_ONE]));
4452         CommonFunc::ConvertAppProvisionInfo(env, asyncCallbackInfo->appProvisionInfo, result[ARGS_POS_ONE]);
4453     } else {
4454         result[ARGS_POS_ZERO] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
4455             GET_APP_PROVISION_INFO, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
4456     }
4457     CommonFunc::NapiReturnDeferred<AppProvisionInfoCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
4458 }
4459 
GetAppProvisionInfo(napi_env env,napi_callback_info info)4460 napi_value GetAppProvisionInfo(napi_env env, napi_callback_info info)
4461 {
4462     APP_LOGD("napi GetAppProvisionInfo called");
4463     NapiArg args(env, info);
4464     AppProvisionInfoCallbackInfo *asyncCallbackInfo = new (std::nothrow) AppProvisionInfoCallbackInfo(env);
4465     if (asyncCallbackInfo == nullptr) {
4466         APP_LOGE("asyncCallbackInfo is null");
4467         return nullptr;
4468     }
4469     std::unique_ptr<AppProvisionInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
4470     if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_THREE)) {
4471         APP_LOGE("param count invalid");
4472         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
4473         return nullptr;
4474     }
4475     asyncCallbackInfo->userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
4476     for (size_t i = 0; i < args.GetArgc(); ++i) {
4477         napi_valuetype valueType = napi_undefined;
4478         napi_typeof(env, args[i], &valueType);
4479         if (i == ARGS_POS_ZERO) {
4480             if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->bundleName)) {
4481                 APP_LOGE("bundleName invalid");
4482                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
4483                 return nullptr;
4484             }
4485             CHECK_STRING_EMPTY(env, asyncCallbackInfo->bundleName, std::string{ BUNDLE_NAME });
4486         } else if (i == ARGS_POS_ONE) {
4487             if (valueType == napi_function) {
4488                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
4489                 break;
4490             }
4491             if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->userId)) {
4492                 APP_LOGW("parse userId failed, set this parameter to the caller userId");
4493             }
4494         } else if (i == ARGS_POS_TWO) {
4495             if (valueType == napi_function) {
4496                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
4497                 break;
4498             }
4499         } else {
4500             APP_LOGE("param check error");
4501             BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
4502             return nullptr;
4503         }
4504     }
4505 
4506     auto promise = CommonFunc::AsyncCallNativeMethod<AppProvisionInfoCallbackInfo>(
4507         env, asyncCallbackInfo, GET_APP_PROVISION_INFO, GetAppProvisionInfoExec, GetAppProvisionInfoComplete);
4508     callbackPtr.release();
4509     APP_LOGD("call GetAppProvisionInfo done");
4510     return promise;
4511 }
4512 
GetSpecifiedDistributionType(napi_env env,napi_callback_info info)4513 napi_value GetSpecifiedDistributionType(napi_env env, napi_callback_info info)
4514 {
4515     APP_LOGD("GetSpecifiedDistributionType napi called");
4516     NapiArg args(env, info);
4517     if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_ONE)) {
4518         APP_LOGE("param count invalid");
4519         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
4520         return nullptr;
4521     }
4522 
4523     std::string bundleName;
4524     if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], bundleName)) {
4525         APP_LOGE("bundleName invalid");
4526         BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
4527         return nullptr;
4528     }
4529 
4530     auto iBundleMgr = CommonFunc::GetBundleMgr();
4531     if (iBundleMgr == nullptr) {
4532         APP_LOGE("iBundleMgr is null");
4533         napi_value businessError = BusinessError::CreateCommonError(
4534             env, ERROR_BUNDLE_SERVICE_EXCEPTION, RESOURCE_NAME_OF_GET_SPECIFIED_DISTRIBUTION_TYPE,
4535             Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
4536         napi_throw(env, businessError);
4537         return nullptr;
4538     }
4539 
4540     std::string specifiedDistributionType;
4541     ErrCode ret = CommonFunc::ConvertErrCode(
4542         iBundleMgr->GetSpecifiedDistributionType(bundleName, specifiedDistributionType));
4543     if (ret != SUCCESS) {
4544         APP_LOGE_NOFUNC("GetSpecifiedDistributionType failed -n %{public}s ret:%{public}d",
4545             bundleName.c_str(), ret);
4546         napi_value businessError = BusinessError::CreateCommonError(
4547             env, ret, RESOURCE_NAME_OF_GET_SPECIFIED_DISTRIBUTION_TYPE,
4548             Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
4549         napi_throw(env, businessError);
4550         return nullptr;
4551     }
4552 
4553     napi_value nSpecifiedDistributionType;
4554     napi_create_string_utf8(env, specifiedDistributionType.c_str(), NAPI_AUTO_LENGTH, &nSpecifiedDistributionType);
4555     APP_LOGD("call GetSpecifiedDistributionType done");
4556     return nSpecifiedDistributionType;
4557 }
4558 
GetAdditionalInfo(napi_env env,napi_callback_info info)4559 napi_value GetAdditionalInfo(napi_env env, napi_callback_info info)
4560 {
4561     APP_LOGD("GetAdditionalInfo napi called");
4562     NapiArg args(env, info);
4563     if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_ONE)) {
4564         APP_LOGE("param count invalid");
4565         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
4566         return nullptr;
4567     }
4568 
4569     std::string bundleName;
4570     if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], bundleName)) {
4571         APP_LOGE("bundleName invalid");
4572         BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
4573         return nullptr;
4574     }
4575     CHECK_STRING_EMPTY(env, bundleName, std::string{ BUNDLE_NAME });
4576 
4577     auto iBundleMgr = CommonFunc::GetBundleMgr();
4578     if (iBundleMgr == nullptr) {
4579         APP_LOGE("iBundleMgr is null");
4580         napi_value businessError = BusinessError::CreateCommonError(
4581             env, ERROR_BUNDLE_SERVICE_EXCEPTION, RESOURCE_NAME_OF_GET_SPECIFIED_DISTRIBUTION_TYPE,
4582             Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
4583         napi_throw(env, businessError);
4584         return nullptr;
4585     }
4586 
4587     std::string additionalInfo;
4588     ErrCode ret = CommonFunc::ConvertErrCode(
4589         iBundleMgr->GetAdditionalInfo(bundleName, additionalInfo));
4590     if (ret != SUCCESS) {
4591         APP_LOGD("GetAdditionalInfo %{public}s error", bundleName.c_str());
4592         napi_value businessError = BusinessError::CreateCommonError(
4593             env, ret, RESOURCE_NAME_OF_GET_ADDITIONAL_INFO, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
4594         napi_throw(env, businessError);
4595         return nullptr;
4596     }
4597 
4598     napi_value nAdditionalInfo;
4599     napi_create_string_utf8(env, additionalInfo.c_str(), NAPI_AUTO_LENGTH, &nAdditionalInfo);
4600     APP_LOGD("call GetAdditionalInfo done");
4601     return nAdditionalInfo;
4602 }
4603 
GetBundleInfoForSelfSync(napi_env env,napi_callback_info info)4604 napi_value GetBundleInfoForSelfSync(napi_env env, napi_callback_info info)
4605 {
4606     APP_LOGD("GetBundleInfoForSelfSync called");
4607     NapiArg args(env, info);
4608     if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_ONE)) {
4609         APP_LOGE("param count invalid");
4610         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
4611         return nullptr;
4612     }
4613     int32_t flags = 0;
4614     if (!CommonFunc::ParseInt(env, args[ARGS_POS_ZERO], flags)) {
4615         APP_LOGE("parseInt invalid");
4616         BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_FLAGS, TYPE_NUMBER);
4617         return nullptr;
4618     }
4619     auto iBundleMgr = CommonFunc::GetBundleMgr();
4620     if (iBundleMgr == nullptr) {
4621         APP_LOGE("BundleMgr is null");
4622         return nullptr;
4623     }
4624     auto uid = IPCSkeleton::GetCallingUid();
4625     std::string bundleName = std::to_string(uid);
4626     int32_t userId = uid / Constants::BASE_USER_RANGE;
4627     napi_value nBundleInfo = nullptr;
4628     if (!CommonFunc::CheckBundleFlagWithPermission(flags)) {
4629         std::shared_lock<std::shared_mutex> lock(g_cacheMutex);
4630         auto item = cache.find(Query(bundleName, GET_BUNDLE_INFO, flags, userId, env));
4631         if (item != cache.end()) {
4632             APP_LOGD("GetBundleInfo param from cache");
4633             NAPI_CALL(env,
4634                 napi_get_reference_value(env, item->second, &nBundleInfo));
4635             return nBundleInfo;
4636         }
4637     }
4638     BundleInfo bundleInfo;
4639     ErrCode ret = CommonFunc::ConvertErrCode(iBundleMgr->GetBundleInfoForSelf(flags, bundleInfo));
4640     if (ret != NO_ERROR) {
4641         APP_LOGE("GetBundleInfoForSelfSync failed, bundleName is %{public}s", bundleName.c_str());
4642         napi_value businessError = BusinessError::CreateCommonError(
4643             env, ret, GET_BUNDLE_INFO_FOR_SELF_SYNC, BUNDLE_PERMISSIONS);
4644         napi_throw(env, businessError);
4645         return nullptr;
4646     }
4647     NAPI_CALL(env, napi_create_object(env,  &nBundleInfo));
4648     CommonFunc::ConvertBundleInfo(env, bundleInfo, nBundleInfo, flags);
4649     if (!CommonFunc::CheckBundleFlagWithPermission(flags)) {
4650         Query query(bundleName, GET_BUNDLE_INFO, flags, userId, env);
4651         CheckToCache(env, bundleInfo.uid, IPCSkeleton::GetCallingUid(), query, nBundleInfo);
4652     }
4653     return nBundleInfo;
4654 }
4655 
ParamsProcessGetJsonProfile(napi_env env,napi_callback_info info,int32_t & profileType,std::string & bundleName,std::string & moduleName,int32_t & userId)4656 bool ParamsProcessGetJsonProfile(napi_env env, napi_callback_info info,
4657     int32_t& profileType, std::string& bundleName, std::string& moduleName, int32_t& userId)
4658 {
4659     NapiArg args(env, info);
4660     if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_FOUR)) {
4661         APP_LOGE("param count invalid");
4662         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
4663         return false;
4664     }
4665     if (!CommonFunc::ParseInt(env, args[ARGS_POS_ZERO], profileType)) {
4666         APP_LOGE("profileType invalid");
4667         BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, PROFILE_TYPE, TYPE_NUMBER);
4668         return false;
4669     }
4670     if (g_supportedProfileList.find(profileType) == g_supportedProfileList.end()) {
4671         APP_LOGE("JS request profile error, type is %{public}d, profile not exist", profileType);
4672         BusinessError::ThrowParameterTypeError(env, ERROR_PROFILE_NOT_EXIST, PROFILE_TYPE, TYPE_NUMBER);
4673         return false;
4674     }
4675     if (!CommonFunc::ParseString(env, args[ARGS_POS_ONE], bundleName)) {
4676         APP_LOGE("bundleName invalid");
4677         BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
4678         return false;
4679     }
4680     if (bundleName.empty()) {
4681         APP_LOGE("bundleName is empty");
4682         napi_value businessError = BusinessError::CreateCommonError(
4683             env, ERROR_BUNDLE_NOT_EXIST, GET_JSON_PROFILE, BUNDLE_PERMISSIONS);
4684         napi_throw(env, businessError);
4685         return false;
4686     }
4687     if (args.GetMaxArgc() >= ARGS_SIZE_THREE) {
4688         if (!CommonFunc::ParseString(env, args[ARGS_POS_TWO], moduleName)) {
4689             APP_LOGW("parse moduleName failed, try to get profile from entry module");
4690         } else if (moduleName.empty()) {
4691             APP_LOGE("moduleName is empty");
4692             napi_value businessError = BusinessError::CreateCommonError(
4693                 env, ERROR_MODULE_NOT_EXIST, GET_JSON_PROFILE, BUNDLE_PERMISSIONS);
4694             napi_throw(env, businessError);
4695             return false;
4696         }
4697     }
4698     if (args.GetMaxArgc() == ARGS_SIZE_FOUR) {
4699         if (!CommonFunc::ParseInt(env, args[ARGS_POS_THREE], userId)) {
4700             APP_LOGE("userId invalid");
4701             BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, USER_ID, TYPE_NUMBER);
4702             return false;
4703         }
4704     }
4705     return true;
4706 }
4707 
GetJsonProfile(napi_env env,napi_callback_info info)4708 napi_value GetJsonProfile(napi_env env, napi_callback_info info)
4709 {
4710     APP_LOGD("GetJsonProfile napi called");
4711     int32_t profileType = 0;
4712     std::string bundleName;
4713     std::string moduleName;
4714     int32_t userId = Constants::UNSPECIFIED_USERID;
4715     if (!ParamsProcessGetJsonProfile(env, info, profileType, bundleName, moduleName, userId)) {
4716         APP_LOGE("paramsProcess failed");
4717         return nullptr;
4718     }
4719     auto iBundleMgr = CommonFunc::GetBundleMgr();
4720     if (iBundleMgr == nullptr) {
4721         APP_LOGE("iBundleMgr is null");
4722         return nullptr;
4723     }
4724     std::string profile;
4725     ErrCode ret = CommonFunc::ConvertErrCode(
4726         iBundleMgr->GetJsonProfile(static_cast<ProfileType>(profileType), bundleName, moduleName, profile, userId));
4727     if (ret != SUCCESS) {
4728         APP_LOGD("napi GetJsonProfile err:%{public}d -n %{public}s", ret, bundleName.c_str());
4729         napi_value businessError = BusinessError::CreateCommonError(
4730             env, ret, GET_JSON_PROFILE, BUNDLE_PERMISSIONS);
4731         napi_throw(env, businessError);
4732         return nullptr;
4733     }
4734     napi_value nProfile;
4735     napi_create_string_utf8(env, profile.c_str(), NAPI_AUTO_LENGTH, &nProfile);
4736     APP_LOGD("call GetJsonProfile done");
4737     return nProfile;
4738 }
4739 
GetRecoverableApplicationInfoExec(napi_env env,void * data)4740 void GetRecoverableApplicationInfoExec(napi_env env, void *data)
4741 {
4742     RecoverableApplicationCallbackInfo *asyncCallbackInfo =
4743         reinterpret_cast<RecoverableApplicationCallbackInfo *>(data);
4744     if (asyncCallbackInfo == nullptr) {
4745         return;
4746     }
4747     asyncCallbackInfo->err =
4748         BundleManagerHelper::InnerGetRecoverableApplicationInfo(asyncCallbackInfo->recoverableApplicationInfos);
4749 }
4750 
GetRecoverableApplicationInfoExecComplete(napi_env env,napi_status status,void * data)4751 void GetRecoverableApplicationInfoExecComplete(napi_env env, napi_status status, void *data)
4752 {
4753     RecoverableApplicationCallbackInfo *asyncCallbackInfo =
4754         reinterpret_cast<RecoverableApplicationCallbackInfo *>(data);
4755     if (asyncCallbackInfo == nullptr) {
4756         return;
4757     }
4758     std::unique_ptr<RecoverableApplicationCallbackInfo> callbackPtr {asyncCallbackInfo};
4759     napi_value result[CALLBACK_PARAM_SIZE] = {0};
4760     if (asyncCallbackInfo->err == NO_ERROR) {
4761         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
4762         NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &result[ARGS_POS_ONE]));
4763         CommonFunc::ConvertRecoverableApplicationInfos(
4764             env, result[ARGS_POS_ONE], asyncCallbackInfo->recoverableApplicationInfos);
4765     } else {
4766         result[ARGS_POS_ZERO] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
4767             GET_RECOVERABLE_APPLICATION_INFO, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
4768     }
4769     CommonFunc::NapiReturnDeferred<RecoverableApplicationCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
4770 }
4771 
GetRecoverableApplicationInfo(napi_env env,napi_callback_info info)4772 napi_value GetRecoverableApplicationInfo(napi_env env, napi_callback_info info)
4773 {
4774     APP_LOGD("NAPI_GetRecoverableApplicationInfo called");
4775     NapiArg args(env, info);
4776     RecoverableApplicationCallbackInfo *asyncCallbackInfo = new (std::nothrow) RecoverableApplicationCallbackInfo(env);
4777     if (asyncCallbackInfo == nullptr) {
4778         APP_LOGE("asyncCallbackInfo is null");
4779         return nullptr;
4780     }
4781     std::unique_ptr<RecoverableApplicationCallbackInfo> callbackPtr {asyncCallbackInfo};
4782     if (!args.Init(ARGS_SIZE_ZERO, ARGS_SIZE_ONE)) {
4783         APP_LOGE("param count invalid");
4784         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
4785         return nullptr;
4786     }
4787     for (size_t i = 0; i < args.GetMaxArgc(); ++i) {
4788         napi_valuetype valueType = napi_undefined;
4789         napi_typeof(env, args[i], &valueType);
4790         if (i == ARGS_POS_ZERO) {
4791             if (valueType == napi_function) {
4792                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
4793                 break;
4794             }
4795         } else {
4796             APP_LOGE("param check error");
4797             BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
4798             return nullptr;
4799         }
4800     }
4801     auto promise = CommonFunc::AsyncCallNativeMethod<RecoverableApplicationCallbackInfo>(
4802         env, asyncCallbackInfo, GET_RECOVERABLE_APPLICATION_INFO,
4803         GetRecoverableApplicationInfoExec, GetRecoverableApplicationInfoExecComplete);
4804     callbackPtr.release();
4805     APP_LOGD("call NAPI_GetRecoverableApplicationInfo done");
4806     return promise;
4807 }
4808 
SetAdditionalInfo(napi_env env,napi_callback_info info)4809 napi_value SetAdditionalInfo(napi_env env, napi_callback_info info)
4810 {
4811     APP_LOGD("Called");
4812     NapiArg args(env, info);
4813     if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_TWO)) {
4814         APP_LOGE("Param count invalid");
4815         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
4816         return nullptr;
4817     }
4818     std::string bundleName;
4819     if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], bundleName)) {
4820         APP_LOGE("Parse bundleName failed");
4821         BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
4822         return nullptr;
4823     }
4824     CHECK_STRING_EMPTY(env, bundleName, std::string{ BUNDLE_NAME });
4825     std::string additionalInfo;
4826     if (!CommonFunc::ParseString(env, args[ARGS_POS_ONE], additionalInfo)) {
4827         APP_LOGE("Parse additionalInfo failed");
4828         BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, ADDITIONAL_INFO, TYPE_STRING);
4829         return nullptr;
4830     }
4831     auto iBundleMgr = CommonFunc::GetBundleMgr();
4832     if (iBundleMgr == nullptr) {
4833         APP_LOGE("Can not get iBundleMgr");
4834         BusinessError::ThrowError(env, ERROR_BUNDLE_SERVICE_EXCEPTION, ERR_MSG_BUNDLE_SERVICE_EXCEPTION);
4835         return nullptr;
4836     }
4837     ErrCode ret = CommonFunc::ConvertErrCode(iBundleMgr->SetAdditionalInfo(bundleName, additionalInfo));
4838     if (ret != NO_ERROR) {
4839         APP_LOGE("Call failed, bundleName is %{public}s", bundleName.c_str());
4840         napi_value businessError = BusinessError::CreateCommonError(
4841             env, ret, RESOURCE_NAME_OF_SET_ADDITIONAL_INFO, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
4842         napi_throw(env, businessError);
4843         return nullptr;
4844     }
4845     napi_value nRet = nullptr;
4846     NAPI_CALL(env, napi_get_undefined(env, &nRet));
4847     APP_LOGD("Call done");
4848     return nRet;
4849 }
4850 
ParamsProcessCanOpenLink(napi_env env,napi_callback_info info,std::string & link)4851 ErrCode ParamsProcessCanOpenLink(napi_env env, napi_callback_info info,
4852     std::string& link)
4853 {
4854     NapiArg args(env, info);
4855     if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_ONE)) {
4856         APP_LOGE("param count invalid");
4857         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
4858         return ERROR_PARAM_CHECK_ERROR;
4859     }
4860     if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], link)) {
4861         APP_LOGW("Parse link failed");
4862         BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, LINK, TYPE_STRING);
4863         return ERROR_PARAM_CHECK_ERROR;
4864     }
4865     return ERR_OK;
4866 }
4867 
CanOpenLink(napi_env env,napi_callback_info info)4868 napi_value CanOpenLink(napi_env env, napi_callback_info info)
4869 {
4870     APP_LOGD("NAPI CanOpenLink call");
4871     napi_value nRet;
4872     bool canOpen = false;
4873     napi_get_boolean(env, canOpen, &nRet);
4874     std::string link;
4875     if (ParamsProcessCanOpenLink(env, info, link) != ERR_OK) {
4876         APP_LOGE("paramsProcess is invalid");
4877         BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
4878         return nRet;
4879     }
4880     auto iBundleMgr = CommonFunc::GetBundleMgr();
4881     if (iBundleMgr == nullptr) {
4882         APP_LOGE("can not get iBundleMgr");
4883         BusinessError::ThrowError(env, ERROR_BUNDLE_SERVICE_EXCEPTION, ERR_MSG_BUNDLE_SERVICE_EXCEPTION);
4884         return nRet;
4885     }
4886     ErrCode ret = CommonFunc::ConvertErrCode(
4887         iBundleMgr->CanOpenLink(link, canOpen));
4888     if (ret != NO_ERROR) {
4889         APP_LOGE("CanOpenLink failed");
4890         napi_value businessError = BusinessError::CreateCommonError(
4891             env, ret, CAN_OPEN_LINK, "");
4892         napi_throw(env, businessError);
4893         return nRet;
4894     }
4895     NAPI_CALL(env, napi_get_boolean(env, canOpen, &nRet));
4896     APP_LOGD("call CanOpenLink done");
4897     return nRet;
4898 }
4899 
ConvertPreinstalledApplicationInfo(napi_env env,const PreinstalledApplicationInfo & preinstalledApplicationInfo,napi_value objPreinstalledApplicationInfo)4900 void ConvertPreinstalledApplicationInfo(napi_env env, const PreinstalledApplicationInfo &preinstalledApplicationInfo,
4901     napi_value objPreinstalledApplicationInfo)
4902 {
4903     napi_value nBundleName;
4904     NAPI_CALL_RETURN_VOID(env,
4905         napi_create_string_utf8(env, preinstalledApplicationInfo.bundleName.c_str(), NAPI_AUTO_LENGTH, &nBundleName));
4906     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, objPreinstalledApplicationInfo, BUNDLE_NAME, nBundleName));
4907 
4908     napi_value nModuleName;
4909     NAPI_CALL_RETURN_VOID(env,
4910         napi_create_string_utf8(env, preinstalledApplicationInfo.moduleName.c_str(), NAPI_AUTO_LENGTH, &nModuleName));
4911     NAPI_CALL_RETURN_VOID(env,
4912         napi_set_named_property(env, objPreinstalledApplicationInfo, MODULE_NAME, nModuleName));
4913 
4914     napi_value nLabelId;
4915     NAPI_CALL_RETURN_VOID(env, napi_create_uint32(env, preinstalledApplicationInfo.labelId, &nLabelId));
4916     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, objPreinstalledApplicationInfo, LABEL_ID, nLabelId));
4917 
4918     napi_value nIconId;
4919     NAPI_CALL_RETURN_VOID(env, napi_create_uint32(env, preinstalledApplicationInfo.iconId, &nIconId));
4920     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, objPreinstalledApplicationInfo, ICON_ID, nIconId));
4921 }
4922 
4923 
ProcessPreinstalledApplicationInfos(napi_env env,napi_value result,const std::vector<PreinstalledApplicationInfo> & preinstalledApplicationInfos)4924 static void ProcessPreinstalledApplicationInfos(
4925     napi_env env, napi_value result, const std::vector<PreinstalledApplicationInfo> &preinstalledApplicationInfos)
4926 {
4927     if (preinstalledApplicationInfos.size() == 0) {
4928         APP_LOGD("PreinstalledApplicationInfos is null");
4929         return;
4930     }
4931     size_t index = 0;
4932     napi_value objPreinstalledApplicationInfo;
4933     for (const auto &item : preinstalledApplicationInfos) {
4934         NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &objPreinstalledApplicationInfo));
4935         ConvertPreinstalledApplicationInfo(env, item, objPreinstalledApplicationInfo);
4936         NAPI_CALL_RETURN_VOID(env, napi_set_element(env, result, index, objPreinstalledApplicationInfo));
4937         index++;
4938     }
4939 }
4940 
GetAllPreinstalledApplicationInfosComplete(napi_env env,napi_status status,void * data)4941 void GetAllPreinstalledApplicationInfosComplete(napi_env env, napi_status status, void *data)
4942 {
4943     PreinstalledApplicationInfosCallbackInfo *asyncCallbackInfo =
4944         reinterpret_cast<PreinstalledApplicationInfosCallbackInfo *>(data);
4945     if (asyncCallbackInfo == nullptr) {
4946         APP_LOGE("AsyncCallbackInfo is null");
4947         return;
4948     }
4949     std::unique_ptr<PreinstalledApplicationInfosCallbackInfo> callbackPtr {asyncCallbackInfo};
4950     napi_value result[CALLBACK_PARAM_SIZE] = {0};
4951     if (asyncCallbackInfo->err == NO_ERROR) {
4952         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
4953         NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &result[ARGS_POS_ONE]));
4954         ProcessPreinstalledApplicationInfos(env, result[ARGS_POS_ONE], asyncCallbackInfo->preinstalledApplicationInfos);
4955     } else {
4956         result[ARGS_POS_ZERO] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
4957             GET_ALL_PREINSTALLED_APP_INFOS, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
4958     }
4959     CommonFunc::NapiReturnDeferred<PreinstalledApplicationInfosCallbackInfo>(
4960         env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
4961 }
4962 
GetAllPreinstalledApplicationInfosExec(napi_env env,void * data)4963 void GetAllPreinstalledApplicationInfosExec(napi_env env, void *data)
4964 {
4965     PreinstalledApplicationInfosCallbackInfo *asyncCallbackInfo =
4966         reinterpret_cast<PreinstalledApplicationInfosCallbackInfo *>(data);
4967     if (asyncCallbackInfo == nullptr) {
4968         APP_LOGE("AsyncCallbackInfo is null");
4969         return;
4970     }
4971     asyncCallbackInfo->err =
4972         BundleManagerHelper::InnerGetAllPreinstalledApplicationInfos(asyncCallbackInfo->preinstalledApplicationInfos);
4973 }
4974 
GetAllPreinstalledApplicationInfos(napi_env env,napi_callback_info info)4975 napi_value GetAllPreinstalledApplicationInfos(napi_env env, napi_callback_info info)
4976 {
4977     APP_LOGD("Called");
4978     NapiArg args(env, info);
4979     PreinstalledApplicationInfosCallbackInfo *asyncCallbackInfo =
4980         new (std::nothrow) PreinstalledApplicationInfosCallbackInfo(env);
4981     if (asyncCallbackInfo == nullptr) {
4982         APP_LOGE("AsyncCallbackInfo is null");
4983         return nullptr;
4984     }
4985     std::unique_ptr<PreinstalledApplicationInfosCallbackInfo> callbackPtr {asyncCallbackInfo};
4986     if (!args.Init(ARGS_SIZE_ZERO, ARGS_SIZE_ZERO)) {
4987         APP_LOGE("Param count invalid");
4988         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
4989         return nullptr;
4990     }
4991     auto promise = CommonFunc::AsyncCallNativeMethod<PreinstalledApplicationInfosCallbackInfo>(env, asyncCallbackInfo,
4992         GET_ALL_PREINSTALLED_APP_INFOS, GetAllPreinstalledApplicationInfosExec,
4993         GetAllPreinstalledApplicationInfosComplete);
4994     callbackPtr.release();
4995     return promise;
4996 }
4997 
GetAllBundleInfoByDeveloperId(napi_env env,napi_callback_info info)4998 napi_value GetAllBundleInfoByDeveloperId(napi_env env, napi_callback_info info)
4999 {
5000     APP_LOGD("Called");
5001     NapiArg args(env, info);
5002     if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_ONE)) {
5003         APP_LOGE("Param count invalid");
5004         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
5005         return nullptr;
5006     }
5007     std::string developerId;
5008     if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], developerId)) {
5009         APP_LOGE("Parse developerId failed");
5010         BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, DEVELOPER_ID, TYPE_STRING);
5011         return nullptr;
5012     }
5013     CHECK_STRING_EMPTY(env, developerId, std::string{ DEVELOPER_ID });
5014     auto iBundleMgr = CommonFunc::GetBundleMgr();
5015     if (iBundleMgr == nullptr) {
5016         APP_LOGE("Can not get iBundleMgr");
5017         BusinessError::ThrowError(env, ERROR_BUNDLE_SERVICE_EXCEPTION, ERR_MSG_BUNDLE_SERVICE_EXCEPTION);
5018         return nullptr;
5019     }
5020     std::vector<BundleInfo> bundleInfos;
5021     int32_t userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
5022     ErrCode ret = CommonFunc::ConvertErrCode(
5023         iBundleMgr->GetAllBundleInfoByDeveloperId(developerId, bundleInfos, userId));
5024     if (ret != NO_ERROR) {
5025         APP_LOGE("Call failed, developerId is %{public}s", developerId.c_str());
5026         napi_value businessError = BusinessError::CreateCommonError(
5027             env, ret, GET_ALL_BUNDLE_INFO_BY_DEVELOPER_ID, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
5028         napi_throw(env, businessError);
5029         return nullptr;
5030     }
5031     napi_value nBundleInfos;
5032     NAPI_CALL(env, napi_create_array(env, &nBundleInfos));
5033     ProcessBundleInfos(env, nBundleInfos, bundleInfos,
5034         static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_APPLICATION));
5035     APP_LOGD("Call done");
5036     return nBundleInfos;
5037 }
5038 
ProcessStringVec(napi_env env,napi_value result,const std::vector<std::string> & stringList)5039 static void ProcessStringVec(
5040     napi_env env, napi_value result, const std::vector<std::string> &stringList)
5041 {
5042     if (stringList.size() == 0) {
5043         APP_LOGD("stringList is null");
5044         return;
5045     }
5046     size_t index = 0;
5047     for (const auto &item : stringList) {
5048         APP_LOGD("string: %{public}s ", item.c_str());
5049         napi_value nString;
5050         NAPI_CALL_RETURN_VOID(env, napi_create_string_utf8(env, item.c_str(), NAPI_AUTO_LENGTH, &nString));
5051         NAPI_CALL_RETURN_VOID(env, napi_set_element(env, result, index, nString));
5052         index++;
5053     }
5054 }
5055 
GetDeveloperIds(napi_env env,napi_callback_info info)5056 napi_value GetDeveloperIds(napi_env env, napi_callback_info info)
5057 {
5058     APP_LOGD("Called");
5059     NapiArg args(env, info);
5060     if (!args.Init(ARGS_SIZE_ZERO, ARGS_SIZE_ONE)) {
5061         APP_LOGE("Param count invalid");
5062         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
5063         return nullptr;
5064     }
5065     std::string distributionType;
5066     if (args.GetMaxArgc() >= ARGS_SIZE_ONE) {
5067         int32_t appDistributionTypeEnum = 0;
5068         if (!CommonFunc::ParseInt(env, args[ARGS_POS_ZERO], appDistributionTypeEnum)) {
5069             APP_LOGE("parseInt failed");
5070             BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, APP_DISTRIBUTION_TYPE, TYPE_NUMBER);
5071             return nullptr;
5072         }
5073         if (appDistributionTypeMap.find(appDistributionTypeEnum) == appDistributionTypeMap.end()) {
5074             APP_LOGE("request error, type %{public}d is invalid", appDistributionTypeEnum);
5075             BusinessError::ThrowEnumError(env, APP_DISTRIBUTION_TYPE, APP_DISTRIBUTION_TYPE_ENUM);
5076             return nullptr;
5077         }
5078         distributionType = std::string{ appDistributionTypeMap[appDistributionTypeEnum] };
5079     }
5080 
5081     auto iBundleMgr = CommonFunc::GetBundleMgr();
5082     if (iBundleMgr == nullptr) {
5083         APP_LOGE("Can not get iBundleMgr");
5084         BusinessError::ThrowError(env, ERROR_BUNDLE_SERVICE_EXCEPTION, ERR_MSG_BUNDLE_SERVICE_EXCEPTION);
5085         return nullptr;
5086     }
5087     std::vector<std::string> developerIds;
5088     int32_t userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
5089     ErrCode ret = CommonFunc::ConvertErrCode(
5090         iBundleMgr->GetDeveloperIds(distributionType, developerIds, userId));
5091     if (ret != NO_ERROR) {
5092         APP_LOGW("Call failed, appDistributionType is %{public}s", distributionType.c_str());
5093         napi_value businessError = BusinessError::CreateCommonError(
5094             env, ret, GET_DEVELOPER_IDS, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
5095         napi_throw(env, businessError);
5096         return nullptr;
5097     }
5098     napi_value nDeveloperIds;
5099     NAPI_CALL(env, napi_create_array(env, &nDeveloperIds));
5100     ProcessStringVec(env, nDeveloperIds, developerIds);
5101     APP_LOGD("Call done");
5102     return nDeveloperIds;
5103 }
5104 
SwitchUninstallState(napi_env env,napi_callback_info info)5105 napi_value SwitchUninstallState(napi_env env, napi_callback_info info)
5106 {
5107     APP_LOGI("NAPI SwitchUninstallState call");
5108     NapiArg args(env, info);
5109     if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_TWO)) {
5110         APP_LOGE("Param count invalid");
5111         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
5112         return nullptr;
5113     }
5114     std::string bundleName;
5115     if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], bundleName)) {
5116         APP_LOGE("Parse bundleName failed");
5117         BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
5118         return nullptr;
5119     }
5120     bool state;
5121     if (!CommonFunc::ParseBool(env, args[ARGS_POS_ONE], state)) {
5122         APP_LOGE("Parse state failed");
5123         BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, STATE, TYPE_BOOLEAN);
5124         return nullptr;
5125     }
5126     auto iBundleMgr = CommonFunc::GetBundleMgr();
5127     if (iBundleMgr == nullptr) {
5128         APP_LOGE("can not get iBundleMgr");
5129         BusinessError::ThrowError(env, ERROR_BUNDLE_SERVICE_EXCEPTION, ERR_MSG_BUNDLE_SERVICE_EXCEPTION);
5130         return nullptr;
5131     }
5132     ErrCode ret = CommonFunc::ConvertErrCode(iBundleMgr->SwitchUninstallState(bundleName, state));
5133     if (ret != NO_ERROR) {
5134         APP_LOGE("SwitchUninstallState failed");
5135         napi_value businessError = BusinessError::CreateCommonError(
5136             env, ret, SWITCH_UNINSTALL_STATE, "");
5137         napi_throw(env, businessError);
5138         return nullptr;
5139     }
5140     napi_value nRet = nullptr;
5141     NAPI_CALL(env, napi_get_undefined(env, &nRet));
5142     APP_LOGD("call SwitchUninstallState done");
5143     return nRet;
5144 }
5145 
InnerGetAppCloneBundleInfo(const std::string & bundleName,int32_t appIndex,int32_t bundleFlags,int32_t userId,BundleInfo & bundleInfo)5146 static ErrCode InnerGetAppCloneBundleInfo(const std::string &bundleName, int32_t appIndex,
5147     int32_t bundleFlags, int32_t userId, BundleInfo &bundleInfo)
5148 {
5149     auto iBundleMgr = CommonFunc::GetBundleMgr();
5150     if (iBundleMgr == nullptr) {
5151         APP_LOGE("can not get iBundleMgr");
5152         return ERROR_BUNDLE_SERVICE_EXCEPTION;
5153     }
5154     ErrCode ret = iBundleMgr->GetCloneBundleInfo(bundleName, bundleFlags, appIndex, bundleInfo, userId);
5155     APP_LOGD("GetCloneBundleInfo result is %{public}d", ret);
5156     return CommonFunc::ConvertErrCode(ret);
5157 }
5158 
GetAppCloneBundleInfoExec(napi_env env,void * data)5159 void GetAppCloneBundleInfoExec(napi_env env, void *data)
5160 {
5161     CloneAppBundleInfoCallbackInfo *asyncCallbackInfo = reinterpret_cast<CloneAppBundleInfoCallbackInfo *>(data);
5162     if (asyncCallbackInfo == nullptr) {
5163         APP_LOGE("asyncCallbackInfo is null");
5164         return;
5165     }
5166     APP_LOGD("param: name=%{public}s,index=%{public}d,bundleFlags=%{public}d,userId=%{public}d",
5167         asyncCallbackInfo->bundleName.c_str(),
5168         asyncCallbackInfo->appIndex,
5169         asyncCallbackInfo->bundleFlags,
5170         asyncCallbackInfo->userId);
5171     asyncCallbackInfo->err =
5172         InnerGetAppCloneBundleInfo(asyncCallbackInfo->bundleName, asyncCallbackInfo->appIndex,
5173             asyncCallbackInfo->bundleFlags, asyncCallbackInfo->userId, asyncCallbackInfo->bundleInfo);
5174 }
5175 
GetAppCloneBundleInfoComplete(napi_env env,napi_status status,void * data)5176 void GetAppCloneBundleInfoComplete(napi_env env, napi_status status, void *data)
5177 {
5178     CloneAppBundleInfoCallbackInfo *asyncCallbackInfo = reinterpret_cast<CloneAppBundleInfoCallbackInfo *>(data);
5179     if (asyncCallbackInfo == nullptr) {
5180         APP_LOGE("asyncCallbackInfo is null");
5181         return;
5182     }
5183     std::unique_ptr<CloneAppBundleInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
5184     napi_value result[CALLBACK_PARAM_SIZE] = {0};
5185     if (asyncCallbackInfo->err == NO_ERROR) {
5186         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
5187         NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &result[ARGS_POS_ONE]));
5188         CommonFunc::ConvertBundleInfo(env, asyncCallbackInfo->bundleInfo, result[ARGS_POS_ONE],
5189             asyncCallbackInfo->bundleFlags);
5190     } else {
5191         result[ARGS_POS_ZERO] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
5192             GET_APP_CLONE_BUNDLE_INFO, Constants::PERMISSION_GET_BUNDLE_INFO);
5193     }
5194     CommonFunc::NapiReturnDeferred<CloneAppBundleInfoCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
5195 }
5196 
GetAppCloneBundleInfo(napi_env env,napi_callback_info info)5197 napi_value GetAppCloneBundleInfo(napi_env env, napi_callback_info info)
5198 {
5199     APP_LOGD("NAPI GetAppCloneBundleInfo call");
5200     NapiArg args(env, info);
5201     if (!args.Init(ARGS_SIZE_THREE, ARGS_SIZE_FOUR)) {
5202         APP_LOGE("Param count invalid");
5203         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
5204         return nullptr;
5205     }
5206     std::unique_ptr<CloneAppBundleInfoCallbackInfo> asyncCallbackInfo =
5207         std::make_unique<CloneAppBundleInfoCallbackInfo>(env);
5208     if (asyncCallbackInfo == nullptr) {
5209         APP_LOGW("asyncCallbackInfo is null");
5210         return nullptr;
5211     }
5212     if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], asyncCallbackInfo->bundleName)) {
5213         APP_LOGE("Parse bundleName failed");
5214         BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
5215         return nullptr;
5216     }
5217     if (!CommonFunc::ParseInt(env, args[ARGS_POS_ONE], asyncCallbackInfo->appIndex)) {
5218         APP_LOGE("Parse appIndex failed");
5219         BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, APP_INDEX, TYPE_NUMBER);
5220         return nullptr;
5221     }
5222     if (!CommonFunc::ParseInt(env, args[ARGS_POS_TWO], asyncCallbackInfo->bundleFlags)) {
5223         APP_LOGE("Parse bundleFlags failed");
5224         BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_FLAGS, TYPE_NUMBER);
5225         return nullptr;
5226     }
5227     if (!CommonFunc::ParseInt(env, args[ARGS_POS_THREE], asyncCallbackInfo->userId)) {
5228         APP_LOGD("Parse userId failed, use default value");
5229     }
5230     auto promise = CommonFunc::AsyncCallNativeMethod<CloneAppBundleInfoCallbackInfo>(
5231         env, asyncCallbackInfo.get(), GET_APP_CLONE_BUNDLE_INFO,
5232         GetAppCloneBundleInfoExec, GetAppCloneBundleInfoComplete);
5233     asyncCallbackInfo.release();
5234     APP_LOGD("call GetAppCloneBundleInfo done");
5235     return promise;
5236 }
5237 
GetAllAppCloneBundleInfoExec(napi_env env,void * data)5238 void GetAllAppCloneBundleInfoExec(napi_env env, void *data)
5239 {
5240     CloneAppBundleInfosCallbackInfo *asyncCallbackInfo = reinterpret_cast<CloneAppBundleInfosCallbackInfo *>(data);
5241     if (asyncCallbackInfo == nullptr) {
5242         APP_LOGE("asyncCallbackInfo is null");
5243         return;
5244     }
5245     APP_LOGD("param: name=%{public}s,bundleFlags=%{public}d,userId=%{public}d",
5246         asyncCallbackInfo->bundleName.c_str(),
5247         asyncCallbackInfo->bundleFlags,
5248         asyncCallbackInfo->userId);
5249     asyncCallbackInfo->err = BundleManagerHelper::InnerGetAllAppCloneBundleInfo(asyncCallbackInfo->bundleName,
5250         asyncCallbackInfo->bundleFlags, asyncCallbackInfo->userId, asyncCallbackInfo->bundleInfos);
5251 }
5252 
CloneAppBundleInfos(napi_env env,napi_value result,const std::vector<BundleInfo> & bundleInfos,int32_t flags)5253 static void CloneAppBundleInfos(
5254     napi_env env, napi_value result, const std::vector<BundleInfo> &bundleInfos, int32_t flags)
5255 {
5256     if (bundleInfos.size() == 0) {
5257         APP_LOGD("bundleInfos is null");
5258         return;
5259     }
5260     size_t index = 0;
5261     for (const auto &item : bundleInfos) {
5262         napi_value objBundleInfo;
5263         NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &objBundleInfo));
5264         CommonFunc::ConvertBundleInfo(env, item, objBundleInfo, flags);
5265         NAPI_CALL_RETURN_VOID(env, napi_set_element(env, result, index++, objBundleInfo));
5266     }
5267 }
5268 
GetAllAppCloneBundleInfoComplete(napi_env env,napi_status status,void * data)5269 void GetAllAppCloneBundleInfoComplete(napi_env env, napi_status status, void *data)
5270 {
5271     CloneAppBundleInfosCallbackInfo *asyncCallbackInfo = reinterpret_cast<CloneAppBundleInfosCallbackInfo *>(data);
5272     if (asyncCallbackInfo == nullptr) {
5273         APP_LOGE("asyncCallbackInfo is null");
5274         return;
5275     }
5276     std::unique_ptr<CloneAppBundleInfosCallbackInfo> callbackPtr {asyncCallbackInfo};
5277     napi_value result[CALLBACK_PARAM_SIZE] = {0};
5278     if (asyncCallbackInfo->err == NO_ERROR) {
5279         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
5280         NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &result[ARGS_POS_ONE]));
5281         CloneAppBundleInfos(env, result[ARGS_POS_ONE], asyncCallbackInfo->bundleInfos, asyncCallbackInfo->bundleFlags);
5282     } else {
5283         result[ARGS_POS_ZERO] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
5284             GET_ALL_APP_CLONE_BUNDLE_INFO, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
5285     }
5286     CommonFunc::NapiReturnDeferred<CloneAppBundleInfosCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
5287 }
5288 
GetAllAppCloneBundleInfo(napi_env env,napi_callback_info info)5289 napi_value GetAllAppCloneBundleInfo(napi_env env, napi_callback_info info)
5290 {
5291     APP_LOGD("NAPI GetAllAppCloneBundleInfo call");
5292     NapiArg args(env, info);
5293     if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_THREE)) {
5294         APP_LOGE("Param count invalid");
5295         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
5296         return nullptr;
5297     }
5298     std::unique_ptr<CloneAppBundleInfosCallbackInfo> asyncCallbackInfo =
5299         std::make_unique<CloneAppBundleInfosCallbackInfo>(env);
5300     if (asyncCallbackInfo == nullptr) {
5301         APP_LOGW("asyncCallbackInfo is null");
5302         return nullptr;
5303     }
5304     if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], asyncCallbackInfo->bundleName)) {
5305         APP_LOGE("Parse bundleName failed");
5306         BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
5307         return nullptr;
5308     }
5309     if (!CommonFunc::ParseInt(env, args[ARGS_POS_ONE], asyncCallbackInfo->bundleFlags)) {
5310         APP_LOGE("Parse bundleFlags failed");
5311         BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_FLAGS, TYPE_NUMBER);
5312         return nullptr;
5313     }
5314     if (!CommonFunc::ParseInt(env, args[ARGS_POS_TWO], asyncCallbackInfo->userId)) {
5315         APP_LOGD("Parse userId failed, use default value");
5316     }
5317     auto promise = CommonFunc::AsyncCallNativeMethod<CloneAppBundleInfosCallbackInfo>(
5318         env, asyncCallbackInfo.get(), GET_ALL_APP_CLONE_BUNDLE_INFO,
5319         GetAllAppCloneBundleInfoExec, GetAllAppCloneBundleInfoComplete);
5320     asyncCallbackInfo.release();
5321     APP_LOGD("call GetAllAppCloneBundleInfo done");
5322     return promise;
5323 }
5324 
CreateMultiAppModeTypeObject(napi_env env,napi_value value)5325 void CreateMultiAppModeTypeObject(napi_env env, napi_value value)
5326 {
5327     napi_value nUnspecified;
5328     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(MultiAppModeType::UNSPECIFIED),
5329         &nUnspecified));
5330     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, UNSPECIFIED, nUnspecified));
5331 
5332     napi_value nMultiInstance;
5333     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(MultiAppModeType::MULTI_INSTANCE),
5334         &nMultiInstance));
5335     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, MULTI_INSTANCE, nMultiInstance));
5336 
5337     napi_value nAppClone;
5338     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(MultiAppModeType::APP_CLONE),
5339         &nAppClone));
5340     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, APP_CLONE, nAppClone));
5341 }
5342 
MigrateDataExec(napi_env env,void * data)5343 void MigrateDataExec(napi_env env, void *data)
5344 {
5345     MigrateDataCallbackInfo *asyncCallbackInfo = reinterpret_cast<MigrateDataCallbackInfo *>(data);
5346     if (asyncCallbackInfo == nullptr) {
5347         APP_LOGE("asyncCallbackInfo is null");
5348         return;
5349     }
5350 
5351     auto iBundleMgr = CommonFunc::GetBundleMgr();
5352     if (iBundleMgr == nullptr) {
5353         APP_LOGE("can not get iBundleMgr");
5354         asyncCallbackInfo->err = CommonFunc::ConvertErrCode(ERROR_BUNDLE_SERVICE_EXCEPTION);
5355         return;
5356     }
5357 
5358     asyncCallbackInfo->err = CommonFunc::ConvertErrCode(iBundleMgr->MigrateData(
5359         asyncCallbackInfo->sourcePaths, asyncCallbackInfo->destinationPath));
5360 }
5361 
MigrateDataComplete(napi_env env,napi_status status,void * data)5362 void MigrateDataComplete(napi_env env, napi_status status, void *data)
5363 {
5364     MigrateDataCallbackInfo *asyncCallbackInfo = reinterpret_cast<MigrateDataCallbackInfo *>(data);
5365     if (asyncCallbackInfo == nullptr) {
5366         APP_LOGE("asyncCallbackInfo is null");
5367         return;
5368     }
5369 
5370     std::unique_ptr<MigrateDataCallbackInfo> callbackPtr{ asyncCallbackInfo };
5371     napi_value result[ARGS_SIZE_ONE] = { 0 };
5372     if (asyncCallbackInfo->err == NO_ERROR) {
5373         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
5374     } else {
5375         APP_LOGE("MigrateData err! code :%{public}d", asyncCallbackInfo->err);
5376         result[0] = BusinessError::CreateCommonError(
5377             env, asyncCallbackInfo->err, MIGRATE_DATA, Constants::PERMISSION_MIGRATE_DATA);
5378     }
5379     CommonFunc::NapiReturnDeferred<MigrateDataCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_ONE);
5380 }
5381 
MigrateData(napi_env env,napi_callback_info info)5382 napi_value MigrateData(napi_env env, napi_callback_info info)
5383 {
5384     APP_LOGI("begin to MigrateData");
5385     NapiArg args(env, info);
5386     if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_TWO)) {
5387         APP_LOGE("MigrateData napi func init failed");
5388         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
5389         return nullptr;
5390     }
5391 
5392     std::unique_ptr<MigrateDataCallbackInfo> asyncCallbackInfo = std::make_unique<MigrateDataCallbackInfo>(env);
5393     if (asyncCallbackInfo == nullptr) {
5394         APP_LOGE("VerifyCallbackInfo asyncCallbackInfo is null");
5395         return nullptr;
5396     }
5397 
5398     if (!CommonFunc::ParseStringArray(env, asyncCallbackInfo->sourcePaths, args[ARGS_POS_ZERO])) {
5399         APP_LOGE("ParseStringArray invalid");
5400         BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, SOURCE_PATHS, TYPE_ARRAY);
5401         return nullptr;
5402     }
5403 
5404     if (!CommonFunc::ParseString(env, args[ARGS_POS_ONE], asyncCallbackInfo->destinationPath)) {
5405         APP_LOGE("ParseString invalid");
5406         BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, DESTINATION_PATH, TYPE_STRING);
5407         return nullptr;
5408     }
5409 
5410     auto promise = CommonFunc::AsyncCallNativeMethod<MigrateDataCallbackInfo>(
5411         env, asyncCallbackInfo.get(), MIGRATE_DATA, MigrateDataExec, MigrateDataComplete);
5412     asyncCallbackInfo.release();
5413     APP_LOGI("call MigrateData done");
5414     return promise;
5415 }
5416 
GetAllDynamicIconInfoExec(napi_env env,void * data)5417 void GetAllDynamicIconInfoExec(napi_env env, void *data)
5418 {
5419     DynamicIconInfoCallbackInfo *asyncCallbackInfo = reinterpret_cast<DynamicIconInfoCallbackInfo *>(data);
5420     if (asyncCallbackInfo == nullptr) {
5421         APP_LOGE("asyncCallbackInfo is null");
5422         return;
5423     }
5424     asyncCallbackInfo->err = BundleManagerHelper::InnerGetAllDynamicIconInfo(
5425         asyncCallbackInfo->userId, asyncCallbackInfo->dynamicIconInfos);
5426 }
5427 
GetAllDynamicIconInfoComplete(napi_env env,napi_status status,void * data)5428 void GetAllDynamicIconInfoComplete(napi_env env, napi_status status, void *data)
5429 {
5430     DynamicIconInfoCallbackInfo *asyncCallbackInfo = reinterpret_cast<DynamicIconInfoCallbackInfo *>(data);
5431     if (asyncCallbackInfo == nullptr) {
5432         APP_LOGE("asyncCallbackInfo is null");
5433         return;
5434     }
5435 
5436     std::unique_ptr<DynamicIconInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
5437     napi_value result[ARGS_POS_TWO] = {0};
5438     if (asyncCallbackInfo->err == NO_ERROR) {
5439         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
5440         NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &result[ARGS_POS_ONE]));
5441         CommonFunc::ConvertDynamicIconInfos(env, asyncCallbackInfo->dynamicIconInfos, result[ARGS_POS_ONE]);
5442     } else {
5443         result[0] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
5444             GET_ALL_DYNAMIC_ICON, BUNDLE_GET_ALL_DYNAMIC_PERMISSIONS);
5445     }
5446 
5447     CommonFunc::NapiReturnDeferred<DynamicIconInfoCallbackInfo>(
5448         env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
5449 }
5450 
GetAllDynamicIconInfo(napi_env env,napi_callback_info info)5451 napi_value GetAllDynamicIconInfo(napi_env env, napi_callback_info info)
5452 {
5453     APP_LOGI("GetAllDynamicIconInfo called");
5454     NapiArg args(env, info);
5455     DynamicIconInfoCallbackInfo *asyncCallbackInfo = new (std::nothrow) DynamicIconInfoCallbackInfo(env);
5456     if (asyncCallbackInfo == nullptr) {
5457         APP_LOGE("asyncCallbackInfo is null");
5458         return nullptr;
5459     }
5460     std::unique_ptr<DynamicIconInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
5461     if (!args.Init(ARGS_SIZE_ZERO, ARGS_SIZE_ONE)) {
5462         APP_LOGE("param count invalid");
5463         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
5464         return nullptr;
5465     }
5466     if (args.GetMaxArgc() > ARGS_SIZE_ZERO) {
5467         if (CommonFunc::ParseInt(env, args[0], asyncCallbackInfo->userId)) {
5468             if (asyncCallbackInfo->userId < 0) {
5469                 asyncCallbackInfo->userId = Constants::INVALID_USERID;
5470             }
5471         } else {
5472             APP_LOGW("userId is invalid");
5473         }
5474     } else {
5475         asyncCallbackInfo->userId = Constants::UNSPECIFIED_USERID;
5476     }
5477     auto promise = CommonFunc::AsyncCallNativeMethod<DynamicIconInfoCallbackInfo>(
5478         env, asyncCallbackInfo, GET_ALL_DYNAMIC_ICON, GetAllDynamicIconInfoExec, GetAllDynamicIconInfoComplete);
5479     callbackPtr.release();
5480     APP_LOGI("call GetAllDynamicIconInfo done");
5481     return promise;
5482 }
5483 
GetDynamicIconInfoExec(napi_env env,void * data)5484 void GetDynamicIconInfoExec(napi_env env, void *data)
5485 {
5486     DynamicIconInfoCallbackInfo *asyncCallbackInfo = reinterpret_cast<DynamicIconInfoCallbackInfo *>(data);
5487     if (asyncCallbackInfo == nullptr) {
5488         APP_LOGE("asyncCallbackInfo is null");
5489         return;
5490     }
5491     asyncCallbackInfo->err = BundleManagerHelper::InnerGetDynamicIconInfo(
5492         asyncCallbackInfo->bundleName, asyncCallbackInfo->dynamicIconInfos);
5493 }
5494 
GetDynamicIconInfoComplete(napi_env env,napi_status status,void * data)5495 void GetDynamicIconInfoComplete(napi_env env, napi_status status, void *data)
5496 {
5497     DynamicIconInfoCallbackInfo *asyncCallbackInfo = reinterpret_cast<DynamicIconInfoCallbackInfo *>(data);
5498     if (asyncCallbackInfo == nullptr) {
5499         APP_LOGE("asyncCallbackInfo is null");
5500         return;
5501     }
5502 
5503     std::unique_ptr<DynamicIconInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
5504     napi_value result[ARGS_POS_TWO] = {0};
5505     if (asyncCallbackInfo->err == NO_ERROR) {
5506         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
5507         NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &result[ARGS_POS_ONE]));
5508         CommonFunc::ConvertDynamicIconInfos(env, asyncCallbackInfo->dynamicIconInfos, result[ARGS_POS_ONE]);
5509     } else {
5510         result[0] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
5511             GET_DYNAMIC_ICON, BUNDLE_GET_ALL_DYNAMIC_PERMISSIONS);
5512     }
5513 
5514     CommonFunc::NapiReturnDeferred<DynamicIconInfoCallbackInfo>(
5515         env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
5516 }
5517 
GetDynamicIconInfo(napi_env env,napi_callback_info info)5518 napi_value GetDynamicIconInfo(napi_env env, napi_callback_info info)
5519 {
5520     APP_LOGI("GetDynamicIconInfo called");
5521     NapiArg args(env, info);
5522     DynamicIconInfoCallbackInfo *asyncCallbackInfo = new (std::nothrow) DynamicIconInfoCallbackInfo(env);
5523     if (asyncCallbackInfo == nullptr) {
5524         APP_LOGE("asyncCallbackInfo is null");
5525         return nullptr;
5526     }
5527     std::unique_ptr<DynamicIconInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
5528     if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_ONE)) {
5529         APP_LOGE("param count invalid");
5530         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
5531         return nullptr;
5532     }
5533     if (args.GetMaxArgc() > ARGS_SIZE_ZERO) {
5534         if (!CommonFunc::ParseString(env, args[0], asyncCallbackInfo->bundleName)) {
5535             APP_LOGE("parse bundleName failed");
5536             BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
5537             return nullptr;
5538         }
5539     }
5540     auto promise = CommonFunc::AsyncCallNativeMethod<DynamicIconInfoCallbackInfo>(
5541         env, asyncCallbackInfo, GET_DYNAMIC_ICON_INFO, GetDynamicIconInfoExec, GetDynamicIconInfoComplete);
5542     callbackPtr.release();
5543     APP_LOGI("call GetDynamicIconInfo done");
5544     return promise;
5545 }
5546 
GetAbilityInfosExec(napi_env env,void * data)5547 void GetAbilityInfosExec(napi_env env, void *data)
5548 {
5549     GetAbilityCallbackInfo *asyncCallbackInfo = reinterpret_cast<GetAbilityCallbackInfo *>(data);
5550     if (asyncCallbackInfo == nullptr) {
5551         APP_LOGE("asyncCallbackInfo is null");
5552         return;
5553     }
5554     {
5555         std::shared_lock<std::shared_mutex> lock(g_cacheMutex);
5556         int32_t userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
5557         auto item = cache.find(Query(asyncCallbackInfo->uri,
5558             GET_ABILITY_INFOS, asyncCallbackInfo->flags, userId, env));
5559         if (item != cache.end()) {
5560             asyncCallbackInfo->isSavedInCache = true;
5561             APP_LOGD("has cache, no need to query from host");
5562             return;
5563         }
5564     }
5565     asyncCallbackInfo->err = BundleManagerHelper::InnerGetAbilityInfos(
5566         asyncCallbackInfo->uri, asyncCallbackInfo->flags, asyncCallbackInfo->abilityInfos);
5567 }
5568 
GetAbilityInfosComplete(napi_env env,napi_status status,void * data)5569 void GetAbilityInfosComplete(napi_env env, napi_status status, void *data)
5570 {
5571     GetAbilityCallbackInfo *asyncCallbackInfo = reinterpret_cast<GetAbilityCallbackInfo *>(data);
5572     if (asyncCallbackInfo == nullptr) {
5573         APP_LOGE("asyncCallbackInfo is null");
5574         return;
5575     }
5576     std::unique_ptr<GetAbilityCallbackInfo> callbackPtr {asyncCallbackInfo};
5577     napi_value result[CALLBACK_PARAM_SIZE] = {0};
5578     int32_t userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
5579     if (asyncCallbackInfo->err == NO_ERROR) {
5580         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
5581         if (asyncCallbackInfo->isSavedInCache) {
5582             std::shared_lock<std::shared_mutex> lock(g_cacheMutex);
5583             auto item = cache.find(Query(asyncCallbackInfo->uri,
5584                 GET_ABILITY_INFOS, asyncCallbackInfo->flags, userId, env));
5585             if (item == cache.end()) {
5586                 APP_LOGE("cannot find result in cache");
5587                 return;
5588             }
5589             NAPI_CALL_RETURN_VOID(env, napi_get_reference_value(env, item->second, &result[ARGS_POS_ONE]));
5590         } else {
5591             NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &result[ARGS_POS_ONE]));
5592             CommonFunc::ConvertAbilityInfos(env, asyncCallbackInfo->abilityInfos, result[ARGS_POS_ONE]);
5593         }
5594     } else {
5595         result[0] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
5596             GET_ABILITY_INFOS, GET_ABILITYINFO_PERMISSIONS);
5597     }
5598     CommonFunc::NapiReturnDeferred<GetAbilityCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
5599 }
5600 
GetAbilityInfos(napi_env env,napi_callback_info info)5601 napi_value GetAbilityInfos(napi_env env, napi_callback_info info)
5602 {
5603     APP_LOGI_NOFUNC("napi GetAbilityInfos");
5604     NapiArg args(env, info);
5605     if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_TWO)) {
5606         APP_LOGE("param count invalid");
5607         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
5608         return nullptr;
5609     }
5610     GetAbilityCallbackInfo *asyncCallbackInfo = new (std::nothrow) GetAbilityCallbackInfo(env);
5611     if (asyncCallbackInfo == nullptr) {
5612         APP_LOGE("asyncCallbackInfo is null");
5613         return nullptr;
5614     }
5615     std::unique_ptr<GetAbilityCallbackInfo> callbackPtr {asyncCallbackInfo};
5616     for (size_t i = 0; i < args.GetMaxArgc(); ++i) {
5617         napi_valuetype valueType = napi_undefined;
5618         napi_typeof(env, args[i], &valueType);
5619         if (i == ARGS_POS_ZERO) {
5620             // parse uri with parameter
5621             if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->uri)) {
5622                 APP_LOGE("parse uri failed");
5623                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, URI, TYPE_STRING);
5624                 return nullptr;
5625             }
5626             if (asyncCallbackInfo->uri.empty()) {
5627                 APP_LOGE("invalid uri");
5628                 napi_value businessError = BusinessError::CreateCommonError(
5629                     env, ERROR_ABILITY_NOT_EXIST, GET_ABILITY_INFOS, GET_ABILITYINFO_PERMISSIONS);
5630                 napi_throw(env, businessError);
5631                 return nullptr;
5632             }
5633         } else if (i == ARGS_POS_ONE) {
5634             if (!CommonFunc::ParseUint(env, args[i], asyncCallbackInfo->flags)) {
5635                 APP_LOGE("Parse abilityflags failed");
5636                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, ABILITY_FLAGS, TYPE_NUMBER);
5637                 return nullptr;
5638             }
5639         } else {
5640             APP_LOGE("param check error");
5641             std::string errMsg = PARAM_TYPE_CHECK_ERROR_WITH_POS + std::to_string(i + 1);
5642             BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, errMsg);
5643             return nullptr;
5644         }
5645     }
5646     auto promise = CommonFunc::AsyncCallNativeMethod<GetAbilityCallbackInfo>(
5647         env, asyncCallbackInfo, GET_ABILITY_INFOS, GetAbilityInfosExec, GetAbilityInfosComplete);
5648     callbackPtr.release();
5649     APP_LOGI_NOFUNC("napi GetAbilityInfos end");
5650     return promise;
5651 }
5652 } // namespace AppExecFwk
5653 } // namespace OHOS
5654