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