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