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