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     if ((asyncCallbackInfo->err == NO_ERROR) && (asyncCallbackInfo->cleanCacheCallback != nullptr)) {
2114         // wait for OnCleanCacheFinished
2115         APP_LOGI("clean exec wait");
2116         if (asyncCallbackInfo->cleanCacheCallback->WaitForCompletion()) {
2117             asyncCallbackInfo->err = asyncCallbackInfo->cleanCacheCallback->GetErr() ?
2118                 NO_ERROR : ERROR_BUNDLE_SERVICE_EXCEPTION;
2119         } else {
2120             APP_LOGI("clean exec timeout");
2121             asyncCallbackInfo->err = ERROR_BUNDLE_SERVICE_EXCEPTION;
2122         }
2123     }
2124     APP_LOGI("clean exec end");
2125 }
2126 
CleanBundleCacheFilesComplete(napi_env env,napi_status status,void * data)2127 void CleanBundleCacheFilesComplete(napi_env env, napi_status status, void *data)
2128 {
2129     CleanBundleCacheCallbackInfo* asyncCallbackInfo = reinterpret_cast<CleanBundleCacheCallbackInfo*>(data);
2130     std::unique_ptr<CleanBundleCacheCallbackInfo> callbackPtr {asyncCallbackInfo};
2131     napi_value result[1] = { 0 };
2132     // implement callback or promise
2133     if (asyncCallbackInfo->err == NO_ERROR) {
2134         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
2135     } else {
2136         result[0] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
2137             "CleanBundleCacheFiles", Constants::PERMISSION_REMOVECACHEFILE);
2138     }
2139     CommonFunc::NapiReturnDeferred<CleanBundleCacheCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_ONE);
2140 }
2141 
CleanBundleCacheFiles(napi_env env,napi_callback_info info)2142 napi_value CleanBundleCacheFiles(napi_env env, napi_callback_info info)
2143 {
2144     APP_LOGD("napi begin to CleanBundleCacheFiles");
2145     NapiArg args(env, info);
2146     CleanBundleCacheCallbackInfo *asyncCallbackInfo = new (std::nothrow) CleanBundleCacheCallbackInfo(env);
2147     if (asyncCallbackInfo == nullptr) {
2148         APP_LOGE("CleanBundleCacheFiles asyncCallbackInfo is null");
2149         return nullptr;
2150     }
2151     std::unique_ptr<CleanBundleCacheCallbackInfo> callbackPtr {asyncCallbackInfo};
2152     if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_TWO)) {
2153         APP_LOGE("CleanBundleCacheFiles napi func init failed");
2154         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2155         return nullptr;
2156     }
2157     size_t maxArgc = args.GetMaxArgc();
2158     if (maxArgc >= ARGS_SIZE_ONE) {
2159         if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], asyncCallbackInfo->bundleName)) {
2160             APP_LOGE("CleanBundleCacheFiles bundleName is not a string");
2161             BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, PARAMETER_BUNDLE_NAME, TYPE_STRING);
2162             return nullptr;
2163         }
2164         if (maxArgc >= ARGS_SIZE_TWO) {
2165             napi_valuetype valueType = napi_undefined;
2166             napi_typeof(env, args[ARGS_POS_ONE], &valueType);
2167             if (valueType == napi_function) {
2168                 NAPI_CALL(env, napi_create_reference(env, args[ARGS_POS_ONE],
2169                     NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
2170             }
2171         }
2172     } else {
2173         APP_LOGE("param error");
2174         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2175         return nullptr;
2176     }
2177     auto promise = CommonFunc::AsyncCallNativeMethod<CleanBundleCacheCallbackInfo>(
2178         env, asyncCallbackInfo, "CleanBundleCacheFiles", CleanBundleCacheFilesExec, CleanBundleCacheFilesComplete);
2179     callbackPtr.release();
2180     APP_LOGD("napi call CleanBundleCacheFiles done");
2181     return promise;
2182 }
2183 
InnerVerify(const std::vector<std::string> & abcPaths,bool flag)2184 ErrCode InnerVerify(const std::vector<std::string> &abcPaths, bool flag)
2185 {
2186     auto verifyManager = CommonFunc::GetVerifyManager();
2187     if (verifyManager == nullptr) {
2188         APP_LOGE("iBundleMgr is null");
2189         return ERROR_BUNDLE_SERVICE_EXCEPTION;
2190     }
2191 
2192     ErrCode ret = verifyManager->Verify(abcPaths);
2193     if (ret == ERR_OK && flag) {
2194         verifyManager->RemoveFiles(abcPaths);
2195     }
2196     return CommonFunc::ConvertErrCode(ret);
2197 }
2198 
VerifyExec(napi_env env,void * data)2199 void VerifyExec(napi_env env, void *data)
2200 {
2201     VerifyCallbackInfo* asyncCallbackInfo = reinterpret_cast<VerifyCallbackInfo*>(data);
2202     if (asyncCallbackInfo == nullptr) {
2203         APP_LOGE("error VerifyCallbackInfo is nullptr");
2204         return;
2205     }
2206 
2207     asyncCallbackInfo->err = InnerVerify(asyncCallbackInfo->abcPaths, asyncCallbackInfo->flag);
2208 }
2209 
VerifyComplete(napi_env env,napi_status status,void * data)2210 void VerifyComplete(napi_env env, napi_status status, void *data)
2211 {
2212     VerifyCallbackInfo *asyncCallbackInfo = reinterpret_cast<VerifyCallbackInfo *>(data);
2213     if (asyncCallbackInfo == nullptr) {
2214         APP_LOGE("asyncCallbackInfo is null");
2215         return;
2216     }
2217 
2218     std::unique_ptr<VerifyCallbackInfo> callbackPtr {asyncCallbackInfo};
2219     napi_value result[ARGS_POS_TWO] = {0};
2220     if (asyncCallbackInfo->err == NO_ERROR) {
2221         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
2222     } else {
2223         result[0] = BusinessError::CreateCommonError(
2224             env, asyncCallbackInfo->err, VERIFY_ABC, Constants::PERMISSION_RUN_DYN_CODE);
2225     }
2226 
2227     CommonFunc::NapiReturnDeferred<VerifyCallbackInfo>(
2228         env, asyncCallbackInfo, result, ARGS_SIZE_ONE);
2229 }
2230 
VerifyAbc(napi_env env,napi_callback_info info)2231 napi_value VerifyAbc(napi_env env, napi_callback_info info)
2232 {
2233     APP_LOGD("napi call VerifyAbc called");
2234     NapiArg args(env, info);
2235     VerifyCallbackInfo *asyncCallbackInfo = new (std::nothrow) VerifyCallbackInfo(env);
2236     if (asyncCallbackInfo == nullptr) {
2237         APP_LOGE("VerifyCallbackInfo asyncCallbackInfo is null");
2238         return nullptr;
2239     }
2240 
2241     std::unique_ptr<VerifyCallbackInfo> callbackPtr {asyncCallbackInfo};
2242     if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_THREE)) {
2243         APP_LOGE("VerifyCallbackInfo napi func init failed");
2244         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2245         return nullptr;
2246     }
2247 
2248     if (!CommonFunc::ParseStringArray(env, asyncCallbackInfo->abcPaths, args[ARGS_POS_ZERO])) {
2249         APP_LOGE("ParseStringArray invalid");
2250         BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, VERIFY_ABC, TYPE_ARRAY);
2251         return nullptr;
2252     }
2253 
2254     if (!CommonFunc::ParseBool(env, args[ARGS_POS_ONE], asyncCallbackInfo->flag)) {
2255         APP_LOGE("ParseBool invalid");
2256         BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, VERIFY_ABC, TYPE_BOOLEAN);
2257         return nullptr;
2258     }
2259 
2260     size_t maxArgc = args.GetMaxArgc();
2261     if (maxArgc > ARGS_SIZE_TWO) {
2262         napi_valuetype valueType = napi_undefined;
2263         napi_typeof(env, args[ARGS_SIZE_TWO], &valueType);
2264         if (valueType == napi_function) {
2265             NAPI_CALL(env, napi_create_reference(env, args[ARGS_SIZE_TWO],
2266                 NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
2267         }
2268     }
2269     auto promise = CommonFunc::AsyncCallNativeMethod<VerifyCallbackInfo>(
2270         env, asyncCallbackInfo, "VerifyAbc", VerifyExec, VerifyComplete);
2271     callbackPtr.release();
2272     APP_LOGD("napi call VerifyAbc done");
2273     return promise;
2274 }
2275 
InnerGetExtResource(const std::string & bundleName,std::vector<std::string> & moduleNames)2276 ErrCode InnerGetExtResource(
2277     const std::string &bundleName, std::vector<std::string> &moduleNames)
2278 {
2279     auto extResourceManager = CommonFunc::GetExtendResourceManager();
2280     if (extResourceManager == nullptr) {
2281         APP_LOGE("extResourceManager is null");
2282         return ERROR_BUNDLE_SERVICE_EXCEPTION;
2283     }
2284 
2285     ErrCode ret = extResourceManager->GetExtResource(bundleName, moduleNames);
2286     if (ret != ERR_OK) {
2287         APP_LOGE("GetExtResource failed");
2288     }
2289 
2290     return CommonFunc::ConvertErrCode(ret);
2291 }
2292 
GetExtResourceExec(napi_env env,void * data)2293 void GetExtResourceExec(napi_env env, void *data)
2294 {
2295     DynamicIconCallbackInfo *asyncCallbackInfo = reinterpret_cast<DynamicIconCallbackInfo *>(data);
2296     if (asyncCallbackInfo == nullptr) {
2297         APP_LOGE("asyncCallbackInfo is null");
2298         return;
2299     }
2300     asyncCallbackInfo->err = InnerGetExtResource(
2301         asyncCallbackInfo->bundleName, asyncCallbackInfo->moduleNames);
2302 }
2303 
SetStrArrayToNapiObj(napi_env env,napi_value result,const std::vector<std::string> & strArray)2304 static void SetStrArrayToNapiObj(
2305     napi_env env, napi_value result, const std::vector<std::string> &strArray)
2306 {
2307     if (strArray.size() == 0) {
2308         APP_LOGD("bundleInfos is null");
2309         return;
2310     }
2311     size_t index = 0;
2312     for (const auto &item : strArray) {
2313         APP_LOGD("item: %{public}s ", item.c_str());
2314         napi_value itemStr;
2315         NAPI_CALL_RETURN_VOID(env, napi_create_string_utf8(
2316             env, item.c_str(), NAPI_AUTO_LENGTH, &itemStr));
2317         NAPI_CALL_RETURN_VOID(env, napi_set_element(env, result, index, itemStr));
2318         index++;
2319     }
2320 }
2321 
GetExtResourceComplete(napi_env env,napi_status status,void * data)2322 void GetExtResourceComplete(napi_env env, napi_status status, void *data)
2323 {
2324     DynamicIconCallbackInfo *asyncCallbackInfo = reinterpret_cast<DynamicIconCallbackInfo *>(data);
2325     if (asyncCallbackInfo == nullptr) {
2326         APP_LOGE("asyncCallbackInfo is null");
2327         return;
2328     }
2329 
2330     std::unique_ptr<DynamicIconCallbackInfo> callbackPtr {asyncCallbackInfo};
2331     napi_value result[ARGS_POS_TWO] = {0};
2332     if (asyncCallbackInfo->err == NO_ERROR) {
2333         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
2334         NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &result[ARGS_POS_ONE]));
2335         SetStrArrayToNapiObj(env, result[ARGS_POS_ONE], asyncCallbackInfo->moduleNames);
2336     } else {
2337         result[0] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
2338             GET_EXT_RESOURCE, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
2339     }
2340 
2341     CommonFunc::NapiReturnDeferred<DynamicIconCallbackInfo>(
2342         env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
2343 }
2344 
GetExtResource(napi_env env,napi_callback_info info)2345 napi_value GetExtResource(napi_env env, napi_callback_info info)
2346 {
2347     APP_LOGD("GetExtResource called");
2348     NapiArg args(env, info);
2349     DynamicIconCallbackInfo *asyncCallbackInfo = new (std::nothrow) DynamicIconCallbackInfo(env);
2350     if (asyncCallbackInfo == nullptr) {
2351         APP_LOGE("asyncCallbackInfo is null");
2352         return nullptr;
2353     }
2354     std::unique_ptr<DynamicIconCallbackInfo> callbackPtr {asyncCallbackInfo};
2355     if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_ONE)) {
2356         APP_LOGE("param count invalid");
2357         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2358         return nullptr;
2359     }
2360 
2361     if (!CommonFunc::ParseString(env, args[0], asyncCallbackInfo->bundleName)) {
2362         APP_LOGE("bundleName invalid");
2363         BusinessError::ThrowParameterTypeError(
2364             env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
2365         return nullptr;
2366     }
2367     auto promise = CommonFunc::AsyncCallNativeMethod<DynamicIconCallbackInfo>(
2368         env, asyncCallbackInfo, "GetExtResource", GetExtResourceExec, GetExtResourceComplete);
2369     callbackPtr.release();
2370     APP_LOGD("call GetExtResource done");
2371     return promise;
2372 }
2373 
InnerEnableDynamicIcon(const std::string & bundleName,const std::string & moduleName)2374 ErrCode InnerEnableDynamicIcon(
2375     const std::string &bundleName, const std::string &moduleName)
2376 {
2377     auto extResourceManager = CommonFunc::GetExtendResourceManager();
2378     if (extResourceManager == nullptr) {
2379         APP_LOGE("extResourceManager is null");
2380         return ERROR_BUNDLE_SERVICE_EXCEPTION;
2381     }
2382 
2383     ErrCode ret = extResourceManager->EnableDynamicIcon(bundleName, moduleName);
2384     if (ret != ERR_OK) {
2385         APP_LOGE("EnableDynamicIcon failed");
2386     }
2387 
2388     return CommonFunc::ConvertErrCode(ret);
2389 }
2390 
EnableDynamicIconExec(napi_env env,void * data)2391 void EnableDynamicIconExec(napi_env env, void *data)
2392 {
2393     DynamicIconCallbackInfo *asyncCallbackInfo = reinterpret_cast<DynamicIconCallbackInfo *>(data);
2394     if (asyncCallbackInfo == nullptr) {
2395         APP_LOGE("asyncCallbackInfo is null");
2396         return;
2397     }
2398     asyncCallbackInfo->err = InnerEnableDynamicIcon(
2399         asyncCallbackInfo->bundleName, asyncCallbackInfo->moduleName);
2400 }
2401 
EnableDynamicIconComplete(napi_env env,napi_status status,void * data)2402 void EnableDynamicIconComplete(napi_env env, napi_status status, void *data)
2403 {
2404     DynamicIconCallbackInfo *asyncCallbackInfo = reinterpret_cast<DynamicIconCallbackInfo *>(data);
2405     if (asyncCallbackInfo == nullptr) {
2406         APP_LOGE("asyncCallbackInfo is null");
2407         return;
2408     }
2409 
2410     std::unique_ptr<DynamicIconCallbackInfo> callbackPtr {asyncCallbackInfo};
2411     napi_value result[ARGS_POS_TWO] = {0};
2412     if (asyncCallbackInfo->err == NO_ERROR) {
2413         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
2414     } else {
2415         result[0] = BusinessError::CreateCommonError(env,
2416             asyncCallbackInfo->err, ENABLE_DYNAMIC_ICON, Constants::PERMISSION_ACCESS_DYNAMIC_ICON);
2417     }
2418 
2419     CommonFunc::NapiReturnDeferred<DynamicIconCallbackInfo>(
2420         env, asyncCallbackInfo, result, ARGS_SIZE_ONE);
2421 }
2422 
EnableDynamicIcon(napi_env env,napi_callback_info info)2423 napi_value EnableDynamicIcon(napi_env env, napi_callback_info info)
2424 {
2425     APP_LOGD("EnableDynamicIcon called");
2426     NapiArg args(env, info);
2427     DynamicIconCallbackInfo *asyncCallbackInfo = new (std::nothrow) DynamicIconCallbackInfo(env);
2428     if (asyncCallbackInfo == nullptr) {
2429         APP_LOGE("asyncCallbackInfo is null");
2430         return nullptr;
2431     }
2432     std::unique_ptr<DynamicIconCallbackInfo> callbackPtr {asyncCallbackInfo};
2433     if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_TWO)) {
2434         APP_LOGE("param count invalid");
2435         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2436         return nullptr;
2437     }
2438     for (size_t i = 0; i < args.GetArgc(); ++i) {
2439         napi_valuetype valueType = napi_undefined;
2440         napi_typeof(env, args[i], &valueType);
2441         if (i == ARGS_POS_ZERO) {
2442             if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->bundleName)) {
2443                 APP_LOGE("bundleName invalid");
2444                 BusinessError::ThrowParameterTypeError(
2445                     env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
2446                 return nullptr;
2447             }
2448         } else if (i == ARGS_POS_ONE) {
2449             if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->moduleName)) {
2450                 APP_LOGE("moduleName invalid");
2451                 BusinessError::ThrowParameterTypeError(
2452                     env, ERROR_PARAM_CHECK_ERROR, MODULE_NAME, TYPE_STRING);
2453                 return nullptr;
2454             }
2455         }
2456     }
2457     auto promise = CommonFunc::AsyncCallNativeMethod<DynamicIconCallbackInfo>(
2458         env, asyncCallbackInfo, "EnableDynamicIcon", EnableDynamicIconExec, EnableDynamicIconComplete);
2459     callbackPtr.release();
2460     APP_LOGD("call EnableDynamicIcon done");
2461     return promise;
2462 }
2463 
InnerDisableDynamicIcon(const std::string & bundleName)2464 ErrCode InnerDisableDynamicIcon(const std::string &bundleName)
2465 {
2466     auto extResourceManager = CommonFunc::GetExtendResourceManager();
2467     if (extResourceManager == nullptr) {
2468         APP_LOGE("extResourceManager is null");
2469         return ERROR_BUNDLE_SERVICE_EXCEPTION;
2470     }
2471 
2472     ErrCode ret = extResourceManager->DisableDynamicIcon(bundleName);
2473     if (ret != ERR_OK) {
2474         APP_LOGE("DisableDynamicIcon failed");
2475     }
2476 
2477     return CommonFunc::ConvertErrCode(ret);
2478 }
2479 
DisableDynamicIconExec(napi_env env,void * data)2480 void DisableDynamicIconExec(napi_env env, void *data)
2481 {
2482     DynamicIconCallbackInfo *asyncCallbackInfo = reinterpret_cast<DynamicIconCallbackInfo *>(data);
2483     if (asyncCallbackInfo == nullptr) {
2484         APP_LOGE("asyncCallbackInfo is null");
2485         return;
2486     }
2487     asyncCallbackInfo->err = InnerDisableDynamicIcon(asyncCallbackInfo->bundleName);
2488 }
2489 
DisableDynamicIconComplete(napi_env env,napi_status status,void * data)2490 void DisableDynamicIconComplete(napi_env env, napi_status status, void *data)
2491 {
2492     DynamicIconCallbackInfo *asyncCallbackInfo = reinterpret_cast<DynamicIconCallbackInfo *>(data);
2493     if (asyncCallbackInfo == nullptr) {
2494         APP_LOGE("asyncCallbackInfo is null");
2495         return;
2496     }
2497 
2498     std::unique_ptr<DynamicIconCallbackInfo> callbackPtr {asyncCallbackInfo};
2499     napi_value result[ARGS_POS_TWO] = {0};
2500     if (asyncCallbackInfo->err == NO_ERROR) {
2501         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
2502     } else {
2503         result[0] = BusinessError::CreateCommonError(
2504             env, asyncCallbackInfo->err, DISABLE_DYNAMIC_ICON, Constants::PERMISSION_ACCESS_DYNAMIC_ICON);
2505     }
2506 
2507     CommonFunc::NapiReturnDeferred<DynamicIconCallbackInfo>(
2508         env, asyncCallbackInfo, result, ARGS_SIZE_ONE);
2509 }
2510 
DisableDynamicIcon(napi_env env,napi_callback_info info)2511 napi_value DisableDynamicIcon(napi_env env, napi_callback_info info)
2512 {
2513     APP_LOGD("DisableDynamicIcon called");
2514     NapiArg args(env, info);
2515     DynamicIconCallbackInfo *asyncCallbackInfo = new (std::nothrow) DynamicIconCallbackInfo(env);
2516     if (asyncCallbackInfo == nullptr) {
2517         APP_LOGE("asyncCallbackInfo is null");
2518         return nullptr;
2519     }
2520     std::unique_ptr<DynamicIconCallbackInfo> callbackPtr {asyncCallbackInfo};
2521     if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_ONE)) {
2522         APP_LOGE("param count invalid");
2523         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2524         return nullptr;
2525     }
2526 
2527     if (!CommonFunc::ParseString(env, args[0], asyncCallbackInfo->bundleName)) {
2528         APP_LOGE("bundleName invalid");
2529         BusinessError::ThrowParameterTypeError(
2530             env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
2531         return nullptr;
2532     }
2533     auto promise = CommonFunc::AsyncCallNativeMethod<DynamicIconCallbackInfo>(
2534         env, asyncCallbackInfo, "DisableDynamicIcon", DisableDynamicIconExec, DisableDynamicIconComplete);
2535     callbackPtr.release();
2536     APP_LOGD("call DisableDynamicIcon done");
2537     return promise;
2538 }
2539 
InnerGetDynamicIcon(const std::string & bundleName,std::string & moduleName)2540 ErrCode InnerGetDynamicIcon(const std::string &bundleName, std::string &moduleName)
2541 {
2542     auto extResourceManager = CommonFunc::GetExtendResourceManager();
2543     if (extResourceManager == nullptr) {
2544         APP_LOGE("extResourceManager is null");
2545         return ERROR_BUNDLE_SERVICE_EXCEPTION;
2546     }
2547 
2548     ErrCode ret = extResourceManager->GetDynamicIcon(bundleName, moduleName);
2549     if (ret != ERR_OK) {
2550         APP_LOGE_NOFUNC("GetDynamicIcon failed");
2551     }
2552 
2553     return CommonFunc::ConvertErrCode(ret);
2554 }
2555 
GetDynamicIconExec(napi_env env,void * data)2556 void GetDynamicIconExec(napi_env env, void *data)
2557 {
2558     DynamicIconCallbackInfo *asyncCallbackInfo = reinterpret_cast<DynamicIconCallbackInfo *>(data);
2559     if (asyncCallbackInfo == nullptr) {
2560         APP_LOGE("asyncCallbackInfo is null");
2561         return;
2562     }
2563     asyncCallbackInfo->err = InnerGetDynamicIcon(
2564         asyncCallbackInfo->bundleName, asyncCallbackInfo->moduleName);
2565 }
2566 
GetDynamicIconComplete(napi_env env,napi_status status,void * data)2567 void GetDynamicIconComplete(napi_env env, napi_status status, void *data)
2568 {
2569     DynamicIconCallbackInfo *asyncCallbackInfo = reinterpret_cast<DynamicIconCallbackInfo *>(data);
2570     if (asyncCallbackInfo == nullptr) {
2571         APP_LOGE("asyncCallbackInfo is null");
2572         return;
2573     }
2574 
2575     std::unique_ptr<DynamicIconCallbackInfo> callbackPtr {asyncCallbackInfo};
2576     napi_value result[ARGS_POS_TWO] = {0};
2577     if (asyncCallbackInfo->err == NO_ERROR) {
2578         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
2579         NAPI_CALL_RETURN_VOID(env, napi_create_string_utf8(env,
2580             asyncCallbackInfo->moduleName.c_str(), NAPI_AUTO_LENGTH, &result[ARGS_POS_ONE]));
2581     } else {
2582         result[0] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
2583             GET_DYNAMIC_ICON, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
2584     }
2585 
2586     CommonFunc::NapiReturnDeferred<DynamicIconCallbackInfo>(
2587         env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
2588 }
2589 
GetDynamicIcon(napi_env env,napi_callback_info info)2590 napi_value GetDynamicIcon(napi_env env, napi_callback_info info)
2591 {
2592     APP_LOGD("GetDynamicIcon called");
2593     NapiArg args(env, info);
2594     DynamicIconCallbackInfo *asyncCallbackInfo = new (std::nothrow) DynamicIconCallbackInfo(env);
2595     if (asyncCallbackInfo == nullptr) {
2596         APP_LOGE("asyncCallbackInfo is null");
2597         return nullptr;
2598     }
2599     std::unique_ptr<DynamicIconCallbackInfo> callbackPtr {asyncCallbackInfo};
2600     if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_ONE)) {
2601         APP_LOGE("param count invalid");
2602         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2603         return nullptr;
2604     }
2605 
2606     if (!CommonFunc::ParseString(env, args[0], asyncCallbackInfo->bundleName)) {
2607         APP_LOGE("bundleName invalid");
2608         BusinessError::ThrowParameterTypeError(
2609             env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
2610         return nullptr;
2611     }
2612     auto promise = CommonFunc::AsyncCallNativeMethod<DynamicIconCallbackInfo>(
2613         env, asyncCallbackInfo, "GetDynamicIcon", GetDynamicIconExec, GetDynamicIconComplete);
2614     callbackPtr.release();
2615     APP_LOGD("call GetDynamicIcon done");
2616     return promise;
2617 }
2618 
InnerDeleteAbc(const std::string & path)2619 ErrCode InnerDeleteAbc(const std::string &path)
2620 {
2621     auto verifyManager = CommonFunc::GetVerifyManager();
2622     if (verifyManager == nullptr) {
2623         APP_LOGE("iBundleMgr is null");
2624         return ERROR_BUNDLE_SERVICE_EXCEPTION;
2625     }
2626 
2627     ErrCode ret = verifyManager->DeleteAbc(path);
2628     if (ret != ERR_OK) {
2629         APP_LOGE("DeleteAbc failed");
2630     }
2631 
2632     return CommonFunc::ConvertErrCode(ret);
2633 }
2634 
DeleteAbcExec(napi_env env,void * data)2635 void DeleteAbcExec(napi_env env, void *data)
2636 {
2637     VerifyCallbackInfo* asyncCallbackInfo = reinterpret_cast<VerifyCallbackInfo*>(data);
2638     if (asyncCallbackInfo == nullptr) {
2639         APP_LOGE("error VerifyCallbackInfo is nullptr");
2640         return;
2641     }
2642 
2643     asyncCallbackInfo->err = InnerDeleteAbc(asyncCallbackInfo->deletePath);
2644 }
2645 
DeleteAbcComplete(napi_env env,napi_status status,void * data)2646 void DeleteAbcComplete(napi_env env, napi_status status, void *data)
2647 {
2648     VerifyCallbackInfo *asyncCallbackInfo = reinterpret_cast<VerifyCallbackInfo *>(data);
2649     if (asyncCallbackInfo == nullptr) {
2650         APP_LOGE("asyncCallbackInfo is null");
2651         return;
2652     }
2653 
2654     std::unique_ptr<VerifyCallbackInfo> callbackPtr {asyncCallbackInfo};
2655     napi_value result[ARGS_POS_TWO] = {0};
2656     if (asyncCallbackInfo->err == NO_ERROR) {
2657         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
2658     } else {
2659         result[0] = BusinessError::CreateCommonError(
2660             env, asyncCallbackInfo->err, DELETE_ABC, Constants::PERMISSION_RUN_DYN_CODE);
2661     }
2662 
2663     CommonFunc::NapiReturnDeferred<VerifyCallbackInfo>(
2664         env, asyncCallbackInfo, result, ARGS_SIZE_ONE);
2665 }
2666 
DeleteAbc(napi_env env,napi_callback_info info)2667 napi_value DeleteAbc(napi_env env, napi_callback_info info)
2668 {
2669     APP_LOGD("napi call DeleteAbc called");
2670     NapiArg args(env, info);
2671     VerifyCallbackInfo *asyncCallbackInfo = new (std::nothrow) VerifyCallbackInfo(env);
2672     if (asyncCallbackInfo == nullptr) {
2673         APP_LOGE("VerifyCallbackInfo asyncCallbackInfo is null");
2674         return nullptr;
2675     }
2676 
2677     std::unique_ptr<VerifyCallbackInfo> callbackPtr {asyncCallbackInfo};
2678     if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_ONE)) {
2679         APP_LOGE("VerifyCallbackInfo napi func init failed");
2680         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2681         return nullptr;
2682     }
2683 
2684     if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], asyncCallbackInfo->deletePath)) {
2685         APP_LOGE("CleanBundleCacheFiles deletePath is not a string");
2686         BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, DELETE_ABC, TYPE_STRING);
2687         return nullptr;
2688     }
2689 
2690     auto promise = CommonFunc::AsyncCallNativeMethod<VerifyCallbackInfo>(
2691         env, asyncCallbackInfo, "DeleteAbc", DeleteAbcExec, DeleteAbcComplete);
2692     callbackPtr.release();
2693     APP_LOGD("napi call DeleteAbc done");
2694     return promise;
2695 }
2696 
InnerGetLaunchWantForBundleExec(const std::string & bundleName,Want & want,int32_t userId)2697 static ErrCode InnerGetLaunchWantForBundleExec(
2698     const std::string& bundleName, Want &want, int32_t userId)
2699 {
2700     auto iBundleMgr = CommonFunc::GetBundleMgr();
2701     if (iBundleMgr == nullptr) {
2702         APP_LOGE("can not get iBundleMgr");
2703         return ERROR_BUNDLE_SERVICE_EXCEPTION;
2704     }
2705 
2706     ErrCode result = iBundleMgr->GetLaunchWantForBundle(bundleName, want, userId);
2707     if (result != ERR_OK) {
2708         APP_LOGE("GetLaunchWantForBundle call error, bundleName is %{public}s, userId is %{public}d",
2709             bundleName.c_str(), userId);
2710     }
2711 
2712     return CommonFunc::ConvertErrCode(result);
2713 }
2714 
GetLaunchWantForBundleExec(napi_env env,void * data)2715 void GetLaunchWantForBundleExec(napi_env env, void *data)
2716 {
2717     LaunchWantCallbackInfo* asyncCallbackInfo = reinterpret_cast<LaunchWantCallbackInfo*>(data);
2718     if (asyncCallbackInfo == nullptr) {
2719         APP_LOGE("error LaunchWantCallbackInfo is nullptr");
2720         return;
2721     }
2722 
2723     asyncCallbackInfo->err = InnerGetLaunchWantForBundleExec(
2724         asyncCallbackInfo->bundleName, asyncCallbackInfo->want, asyncCallbackInfo->userId);
2725 }
2726 
GetLaunchWantForBundleComplete(napi_env env,napi_status status,void * data)2727 void GetLaunchWantForBundleComplete(napi_env env, napi_status status, void *data)
2728 {
2729     LaunchWantCallbackInfo *asyncCallbackInfo = reinterpret_cast<LaunchWantCallbackInfo *>(data);
2730     if (asyncCallbackInfo == nullptr) {
2731         APP_LOGE("asyncCallbackInfo is null");
2732         return;
2733     }
2734 
2735     std::unique_ptr<LaunchWantCallbackInfo> callbackPtr {asyncCallbackInfo};
2736     napi_value result[ARGS_POS_TWO] = {0};
2737     if (asyncCallbackInfo->err == NO_ERROR) {
2738         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
2739         NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &result[1]));
2740         CommonFunc::ConvertWantInfo(env, result[1], asyncCallbackInfo->want);
2741     } else {
2742         result[0] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err, GET_LAUNCH_WANT_FOR_BUNDLE,
2743             Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
2744     }
2745 
2746     CommonFunc::NapiReturnDeferred<LaunchWantCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
2747 }
2748 
GetLaunchWantForBundle(napi_env env,napi_callback_info info)2749 napi_value GetLaunchWantForBundle(napi_env env, napi_callback_info info)
2750 {
2751     APP_LOGD("napi begin to GetLaunchWantForBundle");
2752     NapiArg args(env, info);
2753     LaunchWantCallbackInfo *asyncCallbackInfo = new (std::nothrow) LaunchWantCallbackInfo(env);
2754     if (asyncCallbackInfo == nullptr) {
2755         APP_LOGE("GetLaunchWantForBundle asyncCallbackInfo is null");
2756         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2757         return nullptr;
2758     }
2759     asyncCallbackInfo->userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
2760     std::unique_ptr<LaunchWantCallbackInfo> callbackPtr {asyncCallbackInfo};
2761     if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_THREE)) {
2762         APP_LOGE("GetLaunchWantForBundle napi func init failed");
2763         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2764         return nullptr;
2765     }
2766     size_t maxArgc = args.GetMaxArgc();
2767     for (size_t i = 0; i < maxArgc; ++i) {
2768         napi_valuetype valueType = napi_undefined;
2769         napi_typeof(env, args[i], &valueType);
2770         if (i == ARGS_POS_ZERO) {
2771             if (valueType != napi_string) {
2772                 APP_LOGE("GetLaunchWantForBundle bundleName is not a string");
2773                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, STRING_TYPE);
2774                 return nullptr;
2775             }
2776             CommonFunc::ParseString(env, args[i], asyncCallbackInfo->bundleName);
2777             if (asyncCallbackInfo->bundleName.size() == 0) {
2778                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, STRING_TYPE);
2779                 return nullptr;
2780             }
2781         } else if (i == ARGS_POS_ONE) {
2782             if (valueType == napi_function) {
2783                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
2784                 break;
2785             }
2786             if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->userId)) {
2787                 APP_LOGW("Parse userId failed, set this parameter to the caller userId");
2788             }
2789         } else if (i == ARGS_POS_TWO) {
2790             if (valueType == napi_function) {
2791                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
2792                 break;
2793             }
2794         } else {
2795             APP_LOGE("GetLaunchWantForBundle arg err");
2796             BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2797             return nullptr;
2798         }
2799     }
2800     auto promise = CommonFunc::AsyncCallNativeMethod<LaunchWantCallbackInfo>(
2801         env, asyncCallbackInfo, "GetLaunchWantForBundle", GetLaunchWantForBundleExec, GetLaunchWantForBundleComplete);
2802     callbackPtr.release();
2803     APP_LOGD("napi call GetLaunchWantForBundle done");
2804     return promise;
2805 }
2806 
GetAbilityFromBundleInfo(const BundleInfo & bundleInfo,const std::string & abilityName,const std::string & moduleName,AbilityInfo & targetAbilityInfo)2807 ErrCode GetAbilityFromBundleInfo(const BundleInfo& bundleInfo, const std::string& abilityName,
2808     const std::string& moduleName, AbilityInfo& targetAbilityInfo)
2809 {
2810     bool ifExists = false;
2811     for (const auto& hapModuleInfo : bundleInfo.hapModuleInfos) {
2812         for (const auto& abilityInfo : hapModuleInfo.abilityInfos) {
2813             if (abilityInfo.name == abilityName && abilityInfo.moduleName == moduleName) {
2814                 if (!abilityInfo.enabled) {
2815                     APP_LOGI("ability disabled");
2816                     return ERR_BUNDLE_MANAGER_ABILITY_DISABLED;
2817                 }
2818                 ifExists = true;
2819                 targetAbilityInfo = abilityInfo;
2820                 break;
2821             }
2822         }
2823         if (ifExists) {
2824             break;
2825         }
2826     }
2827     if (!ifExists) {
2828         APP_LOGE("ability not exist");
2829         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
2830     }
2831     return ERR_OK;
2832 }
2833 
GetExtensionFromBundleInfo(const BundleInfo & bundleInfo,const std::string & abilityName,const std::string & moduleName,ExtensionAbilityInfo & targetExtensionInfo)2834 ErrCode GetExtensionFromBundleInfo(const BundleInfo& bundleInfo, const std::string& abilityName,
2835     const std::string& moduleName, ExtensionAbilityInfo& targetExtensionInfo)
2836 {
2837     bool ifExists = false;
2838     for (const auto& hapModuleInfo : bundleInfo.hapModuleInfos) {
2839         for (const auto& extensionInfo : hapModuleInfo.extensionInfos) {
2840             if (extensionInfo.name == abilityName && extensionInfo.moduleName == moduleName) {
2841                 ifExists = true;
2842                 targetExtensionInfo = extensionInfo;
2843                 break;
2844             }
2845             if (!extensionInfo.enabled) {
2846                 APP_LOGI("extension disabled");
2847                 return ERR_BUNDLE_MANAGER_ABILITY_DISABLED;
2848             }
2849         }
2850         if (ifExists) {
2851             break;
2852         }
2853     }
2854     if (!ifExists) {
2855         APP_LOGE("ability not exist");
2856         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
2857     }
2858     return ERR_OK;
2859 }
2860 
InnerGetProfile(GetProfileCallbackInfo & info)2861 static ErrCode InnerGetProfile(GetProfileCallbackInfo &info)
2862 {
2863     auto iBundleMgr = CommonFunc::GetBundleMgr();
2864     if (iBundleMgr == nullptr) {
2865         APP_LOGE("can not get iBundleMgr");
2866         return ERROR_BUNDLE_SERVICE_EXCEPTION;
2867     }
2868 
2869     if (info.abilityName.empty()) {
2870         APP_LOGE("InnerGetProfile failed due to empty abilityName");
2871         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
2872     }
2873 
2874     if (info.moduleName.empty()) {
2875         APP_LOGE("InnerGetProfile failed due to empty moduleName");
2876         return ERR_BUNDLE_MANAGER_MODULE_NOT_EXIST;
2877     }
2878     auto baseFlag = static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE) +
2879            static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_METADATA) +
2880            static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_DISABLE);
2881     ErrCode result;
2882     BundleMgrClient client;
2883     BundleInfo bundleInfo;
2884     if (info.type == AbilityProfileType::ABILITY_PROFILE) {
2885         auto getAbilityFlag = baseFlag +
2886             static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_ABILITY);
2887         result = iBundleMgr->GetBundleInfoForSelf(getAbilityFlag, bundleInfo);
2888         if (result != ERR_OK) {
2889             APP_LOGE("GetBundleInfoForSelf failed");
2890             return result;
2891         }
2892         AbilityInfo targetAbilityInfo;
2893         result = GetAbilityFromBundleInfo(
2894             bundleInfo, info.abilityName, info.moduleName, targetAbilityInfo);
2895         if (result != ERR_OK) {
2896             return result;
2897         }
2898         if (!client.GetProfileFromAbility(targetAbilityInfo, info.metadataName, info.profileVec)) {
2899             APP_LOGE("GetProfileFromExtension failed");
2900             return ERR_BUNDLE_MANAGER_PROFILE_NOT_EXIST;
2901         }
2902         return ERR_OK;
2903     }
2904 
2905     if (info.type == AbilityProfileType::EXTENSION_PROFILE) {
2906         auto getExtensionFlag = baseFlag +
2907             static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_EXTENSION_ABILITY);
2908         result = iBundleMgr->GetBundleInfoForSelf(getExtensionFlag, bundleInfo);
2909         if (result != ERR_OK) {
2910             APP_LOGE("GetBundleInfoForSelf failed");
2911             return result;
2912         }
2913 
2914         ExtensionAbilityInfo targetExtensionInfo;
2915         result = GetExtensionFromBundleInfo(
2916             bundleInfo, info.abilityName, info.moduleName, targetExtensionInfo);
2917         if (result != ERR_OK) {
2918             return result;
2919         }
2920         if (!client.GetProfileFromExtension(targetExtensionInfo, info.metadataName, info.profileVec)) {
2921             APP_LOGE("GetProfileFromExtension failed");
2922             return ERR_BUNDLE_MANAGER_PROFILE_NOT_EXIST;
2923         }
2924         return ERR_OK;
2925     }
2926 
2927     APP_LOGE("InnerGetProfile failed due to type is invalid");
2928     return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
2929 }
2930 
GetProfileExec(napi_env env,void * data)2931 void GetProfileExec(napi_env env, void *data)
2932 {
2933     GetProfileCallbackInfo* asyncCallbackInfo = reinterpret_cast<GetProfileCallbackInfo*>(data);
2934     if (asyncCallbackInfo == nullptr) {
2935         APP_LOGE("error GetProfileCallbackInfo is nullptr");
2936         return;
2937     }
2938 
2939     ErrCode result = InnerGetProfile(*asyncCallbackInfo);
2940     asyncCallbackInfo->err = CommonFunc::ConvertErrCode(result);
2941 }
2942 
GetProfileComplete(napi_env env,napi_status status,void * data)2943 void GetProfileComplete(napi_env env, napi_status status, void *data)
2944 {
2945     GetProfileCallbackInfo *asyncCallbackInfo = reinterpret_cast<GetProfileCallbackInfo *>(data);
2946     if (asyncCallbackInfo == nullptr) {
2947         APP_LOGE("asyncCallbackInfo is null");
2948         return;
2949     }
2950 
2951     std::unique_ptr<GetProfileCallbackInfo> callbackPtr {asyncCallbackInfo};
2952     napi_value result[ARGS_POS_TWO] = {0};
2953     if (asyncCallbackInfo->err == NO_ERROR) {
2954         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
2955         NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &result[1]));
2956         CommonFunc::ConvertStringArrays(env, asyncCallbackInfo->profileVec, result[1]);
2957     } else {
2958         result[0] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err, "", "");
2959     }
2960 
2961     CommonFunc::NapiReturnDeferred<GetProfileCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
2962 }
2963 
GetProfile(napi_env env,napi_callback_info info,const AbilityProfileType & profileType)2964 napi_value GetProfile(napi_env env, napi_callback_info info, const AbilityProfileType &profileType)
2965 {
2966     APP_LOGD("napi begin to GetProfile");
2967     NapiArg args(env, info);
2968     GetProfileCallbackInfo *asyncCallbackInfo = new (std::nothrow) GetProfileCallbackInfo(env);
2969     if (asyncCallbackInfo == nullptr) {
2970         APP_LOGE("GetProfile asyncCallbackInfo is null");
2971         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2972         return nullptr;
2973     }
2974 
2975     asyncCallbackInfo->type = profileType;
2976     std::unique_ptr<GetProfileCallbackInfo> callbackPtr {asyncCallbackInfo};
2977     if (!args.Init(ARGS_POS_TWO, ARGS_SIZE_FOUR)) {
2978         APP_LOGE("GetProfile napi func init failed");
2979         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2980         return nullptr;
2981     }
2982     size_t maxArgc = args.GetMaxArgc();
2983     for (size_t i = 0; i < maxArgc; ++i) {
2984         napi_valuetype valueType = napi_undefined;
2985         napi_typeof(env, args[i], &valueType);
2986         if (i == ARGS_POS_ZERO) {
2987             if (valueType != napi_string) {
2988                 APP_LOGE("GetProfile moduleName is not a string");
2989                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, MODULE_NAME, STRING_TYPE);
2990                 return nullptr;
2991             }
2992             CommonFunc::ParseString(env, args[i], asyncCallbackInfo->moduleName);
2993         } else if (i == ARGS_POS_ONE) {
2994             if (valueType != napi_string) {
2995                 APP_LOGE("GetProfile abilityName is not a string");
2996                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, ABILITY_NAME, STRING_TYPE);
2997                 return nullptr;
2998             }
2999             CommonFunc::ParseString(env, args[i], asyncCallbackInfo->abilityName);
3000         } else if (i == ARGS_POS_TWO) {
3001             if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->metadataName)) {
3002                 APP_LOGW("Parse metadataName failed, The default value is undefined");
3003             }
3004         } else if (i == ARGS_POS_THREE) {
3005             if (valueType == napi_function) {
3006                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
3007                 break;
3008             }
3009         } else {
3010             APP_LOGE("GetProfile arg err");
3011             BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
3012             return nullptr;
3013         }
3014     }
3015     auto promise = CommonFunc::AsyncCallNativeMethod<GetProfileCallbackInfo>(
3016         env, asyncCallbackInfo, "GetProfile", GetProfileExec, GetProfileComplete);
3017     callbackPtr.release();
3018     APP_LOGD("napi call GetProfile done");
3019     return promise;
3020 }
3021 
GetProfileByAbility(napi_env env,napi_callback_info info)3022 napi_value GetProfileByAbility(napi_env env, napi_callback_info info)
3023 {
3024     APP_LOGD("napi begin to GetProfileByAbility");
3025     return GetProfile(env, info, AbilityProfileType::ABILITY_PROFILE);
3026 }
3027 
GetProfileByExAbility(napi_env env,napi_callback_info info)3028 napi_value GetProfileByExAbility(napi_env env, napi_callback_info info)
3029 {
3030     APP_LOGD("napi begin to GetProfileByExAbility");
3031     return GetProfile(env, info, AbilityProfileType::EXTENSION_PROFILE);
3032 }
3033 
CreateExtensionAbilityFlagObject(napi_env env,napi_value value)3034 void CreateExtensionAbilityFlagObject(napi_env env, napi_value value)
3035 {
3036     napi_value nGetExtensionAbilityInfoDefault;
3037     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3038         GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_DEFAULT), &nGetExtensionAbilityInfoDefault));
3039     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_EXTENSION_ABILITY_INFO_DEFAULT",
3040         nGetExtensionAbilityInfoDefault));
3041 
3042     napi_value nGetExtensionAbilityInfoWithPermission;
3043     NAPI_CALL_RETURN_VOID(env,
3044         napi_create_int32(env, static_cast<int32_t>(
3045             GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_PERMISSION),
3046             &nGetExtensionAbilityInfoWithPermission));
3047     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_EXTENSION_ABILITY_INFO_WITH_PERMISSION",
3048         nGetExtensionAbilityInfoWithPermission));
3049 
3050     napi_value nGetExtensionAbilityInfoWithApplication;
3051     NAPI_CALL_RETURN_VOID(env,
3052         napi_create_int32(env, static_cast<int32_t>(
3053             GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_APPLICATION),
3054             &nGetExtensionAbilityInfoWithApplication));
3055     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_EXTENSION_ABILITY_INFO_WITH_APPLICATION",
3056         nGetExtensionAbilityInfoWithApplication));
3057 
3058     napi_value nGetExtensionAbilityInfoWithMetadata;
3059     NAPI_CALL_RETURN_VOID(env,
3060         napi_create_int32(env, static_cast<int32_t>(
3061             GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_METADATA),
3062             &nGetExtensionAbilityInfoWithMetadata));
3063     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_EXTENSION_ABILITY_INFO_WITH_METADATA",
3064         nGetExtensionAbilityInfoWithMetadata));
3065 
3066     napi_value nGetExtensionAbilityInfoWithSkill;
3067     NAPI_CALL_RETURN_VOID(env,
3068         napi_create_int32(env, static_cast<int32_t>(
3069             GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_SKILL),
3070             &nGetExtensionAbilityInfoWithSkill));
3071     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_EXTENSION_ABILITY_INFO_WITH_SKILL",
3072         nGetExtensionAbilityInfoWithSkill));
3073 }
3074 
CreateExtensionAbilityTypeObject(napi_env env,napi_value value)3075 void CreateExtensionAbilityTypeObject(napi_env env, napi_value value)
3076 {
3077     napi_value nForm;
3078     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::FORM), &nForm));
3079     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "FORM", nForm));
3080 
3081     napi_value nWorkSchedule;
3082     NAPI_CALL_RETURN_VOID(env,
3083         napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::WORK_SCHEDULER), &nWorkSchedule));
3084     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "WORK_SCHEDULER", nWorkSchedule));
3085 
3086     napi_value nInputMethod;
3087     NAPI_CALL_RETURN_VOID(env,
3088         napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::INPUTMETHOD), &nInputMethod));
3089     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "INPUT_METHOD", nInputMethod));
3090 
3091     napi_value nService;
3092     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::SERVICE), &nService));
3093     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SERVICE", nService));
3094 
3095     napi_value nAccessibility;
3096     NAPI_CALL_RETURN_VOID(env,
3097         napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::ACCESSIBILITY), &nAccessibility));
3098     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "ACCESSIBILITY", nAccessibility));
3099 
3100     napi_value nDataShare;
3101     NAPI_CALL_RETURN_VOID(env,
3102         napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::DATASHARE), &nDataShare));
3103     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "DATA_SHARE", nDataShare));
3104 
3105     napi_value nFileShare;
3106     NAPI_CALL_RETURN_VOID(env,
3107         napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::FILESHARE), &nFileShare));
3108     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "FILE_SHARE", nFileShare));
3109 
3110     napi_value nStaticSubscriber;
3111     NAPI_CALL_RETURN_VOID(env,
3112         napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::STATICSUBSCRIBER), &nStaticSubscriber));
3113     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "STATIC_SUBSCRIBER", nStaticSubscriber));
3114 
3115     napi_value nWallpaper;
3116     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3117         static_cast<int32_t>(ExtensionAbilityType::WALLPAPER), &nWallpaper));
3118     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "WALLPAPER", nWallpaper));
3119 
3120     napi_value nBackup;
3121     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3122         static_cast<int32_t>(ExtensionAbilityType::BACKUP), &nBackup));
3123     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "BACKUP", nBackup));
3124 
3125     napi_value nWindow;
3126     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3127         static_cast<int32_t>(ExtensionAbilityType::WINDOW), &nWindow));
3128     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "WINDOW", nWindow));
3129 
3130     napi_value nEnterpriseAdmin;
3131     NAPI_CALL_RETURN_VOID(env,
3132         napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::ENTERPRISE_ADMIN), &nEnterpriseAdmin));
3133     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "ENTERPRISE_ADMIN", nEnterpriseAdmin));
3134 
3135     napi_value nTHUMBNAIL;
3136     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3137         static_cast<int32_t>(ExtensionAbilityType::THUMBNAIL), &nTHUMBNAIL));
3138     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "THUMBNAIL", nTHUMBNAIL));
3139 
3140     napi_value nPREVIEW;
3141     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3142         static_cast<int32_t>(ExtensionAbilityType::PREVIEW), &nPREVIEW));
3143     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "PREVIEW", nPREVIEW));
3144 
3145     napi_value nPrint;
3146     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3147         static_cast<int32_t>(ExtensionAbilityType::PRINT), &nPrint));
3148     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "PRINT", nPrint));
3149 
3150     napi_value nShare;
3151     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3152         static_cast<int32_t>(ExtensionAbilityType::SHARE), &nShare));
3153     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SHARE", nShare));
3154 
3155     napi_value nAction;
3156     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3157         static_cast<int32_t>(ExtensionAbilityType::ACTION), &nAction));
3158     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "ACTION", nAction));
3159 
3160     napi_value nAdsService;
3161     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3162         static_cast<int32_t>(ExtensionAbilityType::ADS_SERVICE), &nAdsService));
3163     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "ADS_SERVICE", nAdsService));
3164 
3165     napi_value nEmbeddedUI;
3166     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3167         static_cast<int32_t>(ExtensionAbilityType::EMBEDDED_UI), &nEmbeddedUI));
3168     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "EMBEDDED_UI", nEmbeddedUI));
3169 
3170     napi_value nfence;
3171     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3172         static_cast<int32_t>(ExtensionAbilityType::FENCE), &nfence));
3173     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "FENCE", nfence));
3174 
3175     napi_value nInsightIntentUI;
3176     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3177         static_cast<int32_t>(ExtensionAbilityType::INSIGHT_INTENT_UI), &nInsightIntentUI));
3178     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "INSIGHT_INTENT_UI", nInsightIntentUI));
3179 
3180     napi_value nAuthorization;
3181     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3182         static_cast<int32_t>(ExtensionAbilityType::APP_ACCOUNT_AUTHORIZATION), &nAuthorization));
3183     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "APP_ACCOUNT_AUTHORIZATION", nAuthorization));
3184 
3185     napi_value nUI;
3186     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3187         static_cast<int32_t>(ExtensionAbilityType::UI), &nUI));
3188     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "UI", nUI));
3189 
3190     napi_value nPush;
3191     NAPI_CALL_RETURN_VOID(env,
3192         napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::PUSH), &nPush));
3193     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "PUSH", nPush));
3194 
3195     napi_value nDriver;
3196     NAPI_CALL_RETURN_VOID(env,
3197         napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::DRIVER), &nDriver));
3198     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "DRIVER", nDriver));
3199 
3200     napi_value nUnspecified;
3201     NAPI_CALL_RETURN_VOID(env,
3202         napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::UNSPECIFIED), &nUnspecified));
3203     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "UNSPECIFIED", nUnspecified));
3204 
3205     napi_value nRemoteNotification;
3206     NAPI_CALL_RETURN_VOID(env,
3207         napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::REMOTE_NOTIFICATION), &nRemoteNotification));
3208     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "REMOTE_NOTIFICATION", nRemoteNotification));
3209 
3210     napi_value nRemoteLocation;
3211     NAPI_CALL_RETURN_VOID(env,
3212         napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::REMOTE_LOCATION), &nRemoteLocation));
3213     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "REMOTE_LOCATION", nRemoteLocation));
3214 
3215     napi_value nVoip;
3216     NAPI_CALL_RETURN_VOID(env,
3217         napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::VOIP), &nVoip));
3218     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "VOIP", nVoip));
3219 
3220     napi_value nSysDialogUserAuth;
3221     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3222         static_cast<int32_t>(ExtensionAbilityType::SYSDIALOG_USERAUTH), &nSysDialogUserAuth));
3223     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SYSDIALOG_USERAUTH", nSysDialogUserAuth));
3224 
3225     napi_value nSysDialogCommon;
3226     NAPI_CALL_RETURN_VOID(env,
3227         napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::SYSDIALOG_COMMON), &nSysDialogCommon));
3228     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SYSDIALOG_COMMON", nSysDialogCommon));
3229 
3230     napi_value nMediaControl;
3231     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3232         static_cast<int32_t>(ExtensionAbilityType::SYSPICKER_MEDIACONTROL), &nMediaControl));
3233     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SYSPICKER_MEDIACONTROL", nMediaControl));
3234 
3235     napi_value nSysDialogAtomicServicePanel;
3236     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3237         static_cast<int32_t>(ExtensionAbilityType::SYSDIALOG_ATOMICSERVICEPANEL), &nSysDialogAtomicServicePanel));
3238     NAPI_CALL_RETURN_VOID(env,
3239         napi_set_named_property(env, value, "SYSDIALOG_ATOMICSERVICEPANEL", nSysDialogAtomicServicePanel));
3240 
3241     napi_value nSysDialogPower;
3242     NAPI_CALL_RETURN_VOID(env,
3243         napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::SYSDIALOG_POWER), &nSysDialogPower));
3244     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SYSDIALOG_POWER", nSysDialogPower));
3245 
3246     napi_value nSysPickerShare;
3247     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3248         static_cast<int32_t>(ExtensionAbilityType::SYSPICKER_SHARE), &nSysPickerShare));
3249     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SYSPICKER_SHARE", nSysPickerShare));
3250 
3251     napi_value nSysHmsAccount;
3252     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3253         static_cast<int32_t>(ExtensionAbilityType::HMS_ACCOUNT), &nSysHmsAccount));
3254     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "HMS_ACCOUNT", nSysHmsAccount));
3255 
3256     napi_value nSysDialogMeetimeCall;
3257     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3258         static_cast<int32_t>(ExtensionAbilityType::SYSDIALOG_MEETIMECALL), &nSysDialogMeetimeCall));
3259     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SYSDIALOG_MEETIMECALL", nSysDialogMeetimeCall));
3260 
3261     napi_value nSysDialogMeetimeContact;
3262     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3263         static_cast<int32_t>(ExtensionAbilityType::SYSDIALOG_MEETIMECONTACT), &nSysDialogMeetimeContact));
3264     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SYSDIALOG_MEETIMECONTACT",
3265         nSysDialogMeetimeContact));
3266 
3267     napi_value nSysDialogMeetimeMessage;
3268     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3269         static_cast<int32_t>(ExtensionAbilityType::SYSDIALOG_MEETIMEMESSAGE), &nSysDialogMeetimeMessage));
3270     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SYSDIALOG_MEETIMEMESSAGE",
3271         nSysDialogMeetimeMessage));
3272 
3273     napi_value nSysPickerMeetimeContact;
3274     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3275         static_cast<int32_t>(ExtensionAbilityType::SYSPICKER_MEETIMECONTACT), &nSysPickerMeetimeContact));
3276     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SYSPICKER_MEETIMECONTACT",
3277         nSysPickerMeetimeContact));
3278 
3279     napi_value nSysPickerMeetimeCallLog;
3280     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3281         static_cast<int32_t>(ExtensionAbilityType::SYSPICKER_MEETIMECALLLOG), &nSysPickerMeetimeCallLog));
3282     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SYSPICKER_MEETIMECALLLOG",
3283         nSysPickerMeetimeCallLog));
3284 
3285     napi_value nAds;
3286     NAPI_CALL_RETURN_VOID(env,
3287         napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::ADS), &nAds));
3288     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "ADS", nAds));
3289 
3290     napi_value nSysCommonUI;
3291     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3292         static_cast<int32_t>(ExtensionAbilityType::SYS_COMMON_UI), &nSysCommonUI));
3293     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SYS_COMMON_UI", nSysCommonUI));
3294 
3295     napi_value nPhotoEditor;
3296     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3297         static_cast<int32_t>(ExtensionAbilityType::PHOTO_EDITOR), &nPhotoEditor));
3298     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "PHOTO_EDITOR", nPhotoEditor));
3299 
3300     napi_value nCallerInfoQuery;
3301     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3302         static_cast<int32_t>(ExtensionAbilityType::CALLER_INFO_QUERY), &nCallerInfoQuery));
3303     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "CALLER_INFO_QUERY", nCallerInfoQuery));
3304 }
3305 
CreateApplicationFlagObject(napi_env env,napi_value value)3306 void CreateApplicationFlagObject(napi_env env, napi_value value)
3307 {
3308     napi_value nGetApplicationInfoDefault;
3309     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3310         GetApplicationFlag::GET_APPLICATION_INFO_DEFAULT), &nGetApplicationInfoDefault));
3311     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_APPLICATION_INFO_DEFAULT",
3312         nGetApplicationInfoDefault));
3313 
3314     napi_value nGetApplicationInfoWithPermission;
3315     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3316         GetApplicationFlag::GET_APPLICATION_INFO_WITH_PERMISSION), &nGetApplicationInfoWithPermission));
3317     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_APPLICATION_INFO_WITH_PERMISSION",
3318         nGetApplicationInfoWithPermission));
3319 
3320     napi_value nGetApplicationInfoWithMetadata;
3321     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3322         GetApplicationFlag::GET_APPLICATION_INFO_WITH_METADATA), &nGetApplicationInfoWithMetadata));
3323     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_APPLICATION_INFO_WITH_METADATA",
3324         nGetApplicationInfoWithMetadata));
3325 
3326     napi_value nGetApplicationInfoWithDisable;
3327     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3328         GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE), &nGetApplicationInfoWithDisable));
3329     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_APPLICATION_INFO_WITH_DISABLE",
3330         nGetApplicationInfoWithDisable));
3331 }
3332 
CreateApplicationInfoFlagObject(napi_env env,napi_value value)3333 void CreateApplicationInfoFlagObject(napi_env env, napi_value value)
3334 {
3335     napi_value nApplicationInfoFlagInstalled;
3336     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3337         ApplicationInfoFlag::FLAG_INSTALLED), &nApplicationInfoFlagInstalled));
3338     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "FLAG_INSTALLED",
3339         nApplicationInfoFlagInstalled));
3340 
3341     napi_value nApplicationInfoFlagOtherInstalled;
3342     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3343         ApplicationInfoFlag::FLAG_OTHER_INSTALLED), &nApplicationInfoFlagOtherInstalled));
3344     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "FLAG_OTHER_INSTALLED",
3345         nApplicationInfoFlagOtherInstalled));
3346 }
3347 
CreateAppDistributionTypeObject(napi_env env,napi_value value)3348 void CreateAppDistributionTypeObject(napi_env env, napi_value value)
3349 {
3350     napi_value nAppGallery;
3351     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, ENUM_ONE, &nAppGallery));
3352     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "APP_GALLERY", nAppGallery));
3353 
3354     napi_value nEnterprise;
3355     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, ENUM_TWO, &nEnterprise));
3356     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "ENTERPRISE", nEnterprise));
3357 
3358     napi_value nEnterPriseNormal;
3359     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, ENUM_THREE, &nEnterPriseNormal));
3360     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "ENTERPRISE_NORMAL", nEnterPriseNormal));
3361 
3362     napi_value nEnterPriseMdm;
3363     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, ENUM_FOUR, &nEnterPriseMdm));
3364     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "ENTERPRISE_MDM", nEnterPriseMdm));
3365 
3366     napi_value nOsIntegration;
3367     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, ENUM_FIVE, &nOsIntegration));
3368     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "OS_INTEGRATION", nOsIntegration));
3369 
3370     napi_value nCrowdTesting;
3371     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, ENUM_SIX, &nCrowdTesting));
3372     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "CROWDTESTING", nCrowdTesting));
3373 
3374     napi_value nNone;
3375     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, ENUM_SEVEN, &nNone));
3376     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "NONE", nNone));
3377 }
3378 
InnerGetPermissionDef(const std::string & permissionName,PermissionDef & permissionDef)3379 static ErrCode InnerGetPermissionDef(const std::string &permissionName, PermissionDef &permissionDef)
3380 {
3381     auto iBundleMgr = CommonFunc::GetBundleMgr();
3382     if (iBundleMgr == nullptr) {
3383         APP_LOGE("can not get iBundleMgr");
3384         return ERROR_BUNDLE_SERVICE_EXCEPTION;
3385     }
3386     ErrCode ret = iBundleMgr->GetPermissionDef(permissionName, permissionDef);
3387     return CommonFunc::ConvertErrCode(ret);
3388 }
3389 
GetPermissionDefExec(napi_env env,void * data)3390 void GetPermissionDefExec(napi_env env, void *data)
3391 {
3392     AsyncPermissionDefineCallbackInfo *asyncCallbackInfo = reinterpret_cast<AsyncPermissionDefineCallbackInfo *>(data);
3393     if (asyncCallbackInfo == nullptr) {
3394         APP_LOGE("asyncCallbackInfo is nullptr");
3395         return;
3396     }
3397     if (asyncCallbackInfo->err == NO_ERROR) {
3398         asyncCallbackInfo->err = InnerGetPermissionDef(asyncCallbackInfo->permissionName,
3399             asyncCallbackInfo->permissionDef);
3400     }
3401 }
3402 
GetPermissionDefComplete(napi_env env,napi_status status,void * data)3403 void GetPermissionDefComplete(napi_env env, napi_status status, void *data)
3404 {
3405     AsyncPermissionDefineCallbackInfo *asyncCallbackInfo = reinterpret_cast<AsyncPermissionDefineCallbackInfo *>(data);
3406     if (asyncCallbackInfo == nullptr) {
3407         APP_LOGE("asyncCallbackInfo is null");
3408         return;
3409     }
3410     std::unique_ptr<AsyncPermissionDefineCallbackInfo> callbackPtr {asyncCallbackInfo};
3411     napi_value result[ARGS_SIZE_TWO] = {0};
3412     if (asyncCallbackInfo->err == NO_ERROR) {
3413         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
3414         NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &result[ARGS_POS_ONE]));
3415         CommonFunc::ConvertPermissionDef(env, result[ARGS_POS_ONE], asyncCallbackInfo->permissionDef);
3416     } else {
3417         result[0] = BusinessError::CreateCommonError(
3418             env, asyncCallbackInfo->err, GET_PERMISSION_DEF, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
3419     }
3420     CommonFunc::NapiReturnDeferred<AsyncPermissionDefineCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
3421 }
3422 
3423 /**
3424  * Promise and async callback
3425  */
GetPermissionDef(napi_env env,napi_callback_info info)3426 napi_value GetPermissionDef(napi_env env, napi_callback_info info)
3427 {
3428     APP_LOGD("GetPermissionDef called");
3429     NapiArg args(env, info);
3430     AsyncPermissionDefineCallbackInfo *asyncCallbackInfo = new (std::nothrow) AsyncPermissionDefineCallbackInfo(env);
3431     if (asyncCallbackInfo == nullptr) {
3432         APP_LOGE("asyncCallbackInfo is null");
3433         return nullptr;
3434     }
3435     std::unique_ptr<AsyncPermissionDefineCallbackInfo> callbackPtr {asyncCallbackInfo};
3436     if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_TWO)) {
3437         APP_LOGE("param count invalid");
3438         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
3439         return nullptr;
3440     }
3441     for (size_t i = 0; i < args.GetMaxArgc(); ++i) {
3442         napi_valuetype valuetype = napi_undefined;
3443         NAPI_CALL(env, napi_typeof(env, args[i], &valuetype));
3444         if (i == ARGS_POS_ZERO) {
3445             if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->permissionName)) {
3446                 APP_LOGE("permissionName invalid");
3447                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, PERMISSION_NAME, TYPE_STRING);
3448                 return nullptr;
3449             }
3450         } else if (i == ARGS_POS_ONE) {
3451             if (valuetype == napi_function) {
3452                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
3453             } else {
3454                 APP_LOGD("GetPermissionDef extra arg ignored");
3455             }
3456         } else {
3457             APP_LOGE("GetPermissionDef arg err");
3458             BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR);
3459             return nullptr;
3460         }
3461     }
3462 
3463     auto promise = CommonFunc::AsyncCallNativeMethod<AsyncPermissionDefineCallbackInfo>(
3464         env, asyncCallbackInfo, "GetPermissionDef", GetPermissionDefExec, GetPermissionDefComplete);
3465     callbackPtr.release();
3466     return promise;
3467 }
3468 
CheckToCache(napi_env env,int32_t uid,int32_t callingUid,const Query & query,napi_value jsObject)3469 static void CheckToCache(napi_env env, int32_t uid, int32_t callingUid, const Query &query, napi_value jsObject)
3470 {
3471     if (uid != callingUid) {
3472         APP_LOGD("uid %{public}d and callingUid %{public}d not equal", uid, callingUid);
3473         return;
3474     }
3475     napi_ref cacheApplicationInfo = nullptr;
3476     NAPI_CALL_RETURN_VOID(env, napi_create_reference(env, jsObject, NAPI_RETURN_ONE, &cacheApplicationInfo));
3477     std::unique_lock<std::shared_mutex> lock(g_cacheMutex);
3478     cache[query] = cacheApplicationInfo;
3479 }
3480 
GetApplicationInfoSync(napi_env env,napi_callback_info info)3481 napi_value GetApplicationInfoSync(napi_env env, napi_callback_info info)
3482 {
3483     APP_LOGD("NAPI GetApplicationInfoSync call");
3484     NapiArg args(env, info);
3485     if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_THREE)) {
3486         APP_LOGE("param count invalid");
3487         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
3488         return nullptr;
3489     }
3490     std::string bundleName;
3491     int32_t flags = 0;
3492     int32_t userId = Constants::UNSPECIFIED_USERID;
3493     for (size_t i = 0; i < args.GetArgc(); ++i) {
3494         napi_valuetype valueType = napi_undefined;
3495         napi_typeof(env, args[i], &valueType);
3496         if (i == ARGS_POS_ZERO) {
3497             if (!CommonFunc::ParseString(env, args[i], bundleName)) {
3498                 APP_LOGE("bundleName %{public}s invalid", bundleName.c_str());
3499                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
3500                 return nullptr;
3501             }
3502         } else if (i == ARGS_POS_ONE) {
3503             if (!CommonFunc::ParseInt(env, args[i], flags)) {
3504                 APP_LOGE("parseInt failed");
3505                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, APP_FLAGS, TYPE_NUMBER);
3506                 return nullptr;
3507             }
3508         } else if (i == ARGS_POS_TWO) {
3509             if (!CommonFunc::ParseInt(env, args[i], userId)) {
3510                 APP_LOGW("userId parseInt failed");
3511             }
3512         } else {
3513             APP_LOGE("parameter is invalid");
3514             BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
3515             return nullptr;
3516         }
3517     }
3518     if (bundleName.size() == 0) {
3519         napi_value businessError = BusinessError::CreateCommonError(
3520             env, ERROR_BUNDLE_NOT_EXIST, GET_BUNDLE_INFO_SYNC, BUNDLE_PERMISSIONS);
3521         napi_throw(env, businessError);
3522         return nullptr;
3523     }
3524     if (userId == Constants::UNSPECIFIED_USERID) {
3525         userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
3526     }
3527     napi_value nApplicationInfo = nullptr;
3528     {
3529         std::shared_lock<std::shared_mutex> lock(g_cacheMutex);
3530         auto item = cache.find(Query(bundleName, GET_APPLICATION_INFO, flags, userId, env));
3531         if (item != cache.end()) {
3532             APP_LOGD("getApplicationInfo param from cache");
3533             NAPI_CALL(env,
3534                 napi_get_reference_value(env, item->second, &nApplicationInfo));
3535             return nApplicationInfo;
3536         }
3537     }
3538     auto iBundleMgr = CommonFunc::GetBundleMgr();
3539     if (iBundleMgr == nullptr) {
3540         APP_LOGE("can not get iBundleMgr");
3541         return nullptr;
3542     }
3543     AppExecFwk::ApplicationInfo appInfo;
3544     ErrCode ret = CommonFunc::ConvertErrCode(
3545         iBundleMgr->GetApplicationInfoV9(bundleName, flags, userId, appInfo));
3546     if (ret != NO_ERROR) {
3547         APP_LOGE_NOFUNC("GetApplicationInfo failed -n:%{public}s -f: %{public}d -u: %{public}d",
3548             bundleName.c_str(), flags, userId);
3549         napi_value businessError = BusinessError::CreateCommonError(
3550             env, ret, GET_BUNDLE_INFO_SYNC, BUNDLE_PERMISSIONS);
3551         napi_throw(env, businessError);
3552         return nullptr;
3553     }
3554     NAPI_CALL(env, napi_create_object(env, &nApplicationInfo));
3555     CommonFunc::ConvertApplicationInfo(env, nApplicationInfo, appInfo);
3556     Query query(bundleName, GET_APPLICATION_INFO, flags, userId, env);
3557     CheckToCache(env, appInfo.uid, IPCSkeleton::GetCallingUid(), query, nApplicationInfo);
3558     return nApplicationInfo;
3559 }
3560 
GetBundleInfoSync(napi_env env,napi_callback_info info)3561 napi_value GetBundleInfoSync(napi_env env, napi_callback_info info)
3562 {
3563     APP_LOGD("NAPI GetBundleInfoSync call");
3564     NapiArg args(env, info);
3565     if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_THREE)) {
3566         APP_LOGE("param count invalid");
3567         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
3568         return nullptr;
3569     }
3570     std::string bundleName;
3571     int32_t flags = 0;
3572     int32_t userId = Constants::UNSPECIFIED_USERID;
3573     for (size_t i = 0; i < args.GetArgc(); ++i) {
3574         napi_valuetype valueType = napi_undefined;
3575         NAPI_CALL(env, napi_typeof(env, args[i], &valueType));
3576         if (i == ARGS_POS_ZERO) {
3577             if (!CommonFunc::ParseString(env, args[i], bundleName)) {
3578                 APP_LOGE("bundleName %{public}s invalid", bundleName.c_str());
3579                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
3580                 return nullptr;
3581             }
3582         } else if (i == ARGS_POS_ONE) {
3583             if (!CommonFunc::ParseInt(env, args[i], flags)) {
3584                 APP_LOGE("parseInt failed");
3585                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_FLAGS, TYPE_NUMBER);
3586                 return nullptr;
3587             }
3588         } else if (i == ARGS_POS_TWO) {
3589             if ((valueType == napi_number) && (!CommonFunc::ParseInt(env, args[i], userId))) {
3590                 APP_LOGE("parseInt failed");
3591                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, USER_ID, TYPE_NUMBER);
3592                 return nullptr;
3593             }
3594         } else {
3595             APP_LOGE("parameter is invalid");
3596             BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
3597             return nullptr;
3598         }
3599     }
3600     if (bundleName.size() == 0) {
3601         napi_value businessError = BusinessError::CreateCommonError(
3602             env, ERROR_BUNDLE_NOT_EXIST, GET_BUNDLE_INFO_SYNC, BUNDLE_PERMISSIONS);
3603         napi_throw(env, businessError);
3604         return nullptr;
3605     }
3606     if (userId == Constants::UNSPECIFIED_USERID) {
3607         userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
3608     }
3609     napi_value nBundleInfo = nullptr;
3610     {
3611         std::shared_lock<std::shared_mutex> lock(g_cacheMutex);
3612         auto item = cache.find(Query(bundleName, GET_BUNDLE_INFO, flags, userId, env));
3613         if (item != cache.end()) {
3614             APP_LOGD("GetBundleInfo param from cache");
3615             NAPI_CALL(env,
3616                 napi_get_reference_value(env, item->second, &nBundleInfo));
3617             return nBundleInfo;
3618         }
3619     }
3620     auto iBundleMgr = CommonFunc::GetBundleMgr();
3621     if (iBundleMgr == nullptr) {
3622         APP_LOGE("BundleMgr is null");
3623         return nullptr;
3624     }
3625     BundleInfo bundleInfo;
3626     ErrCode ret = CommonFunc::ConvertErrCode(iBundleMgr->GetBundleInfoV9(bundleName, flags, bundleInfo, userId));
3627     if (ret != NO_ERROR) {
3628         APP_LOGE_NOFUNC("GetBundleInfoV9 failed -n %{public}s -f %{public}d -u %{public}d",
3629             bundleName.c_str(), flags, userId);
3630         napi_value businessError = BusinessError::CreateCommonError(
3631             env, ret, GET_BUNDLE_INFO_SYNC, BUNDLE_PERMISSIONS);
3632         napi_throw(env, businessError);
3633         return nullptr;
3634     }
3635     NAPI_CALL(env, napi_create_object(env,  &nBundleInfo));
3636     CommonFunc::ConvertBundleInfo(env, bundleInfo, nBundleInfo, flags);
3637     if (!CommonFunc::CheckBundleFlagWithPermission(flags)) {
3638         Query query(bundleName, GET_BUNDLE_INFO, flags, userId, env);
3639         CheckToCache(env, bundleInfo.uid, IPCSkeleton::GetCallingUid(), query, nBundleInfo);
3640     }
3641     return nBundleInfo;
3642 }
3643 
InnerGetBundleInfos(int32_t flags,int32_t userId,std::vector<BundleInfo> & bundleInfos)3644 static ErrCode InnerGetBundleInfos(int32_t flags,
3645     int32_t userId, std::vector<BundleInfo> &bundleInfos)
3646 {
3647     auto iBundleMgr = CommonFunc::GetBundleMgr();
3648     if (iBundleMgr == nullptr) {
3649         APP_LOGE("iBundleMgr is null");
3650         return ERROR_BUNDLE_SERVICE_EXCEPTION;
3651     }
3652     ErrCode ret = iBundleMgr->GetBundleInfosV9(flags, bundleInfos, userId);
3653     return CommonFunc::ConvertErrCode(ret);
3654 }
3655 
CreateBundleFlagObject(napi_env env,napi_value value)3656 void CreateBundleFlagObject(napi_env env, napi_value value)
3657 {
3658     napi_value nBundleInfoDefault;
3659     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_DEFAULT),
3660         &nBundleInfoDefault));
3661     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_DEFAULT",
3662         nBundleInfoDefault));
3663 
3664     napi_value nGetBundleInfoWithApplication;
3665     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3666         GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_APPLICATION), &nGetBundleInfoWithApplication));
3667     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_APPLICATION",
3668         nGetBundleInfoWithApplication));
3669 
3670     napi_value nGetBundleInfoWithHapModule;
3671     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3672         GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE), &nGetBundleInfoWithHapModule));
3673     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_HAP_MODULE",
3674         nGetBundleInfoWithHapModule));
3675 
3676     napi_value nGetBundleInfoWithAbility;
3677     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3678         GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_ABILITY), &nGetBundleInfoWithAbility));
3679     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_ABILITY",
3680         nGetBundleInfoWithAbility));
3681 
3682     napi_value nGetBundleInfoWithExtensionAbility;
3683     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3684         GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_EXTENSION_ABILITY), &nGetBundleInfoWithExtensionAbility));
3685     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_EXTENSION_ABILITY",
3686         nGetBundleInfoWithExtensionAbility));
3687 
3688     napi_value nGetBundleInfoWithRequestedPermission;
3689     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3690         GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_REQUESTED_PERMISSION), &nGetBundleInfoWithRequestedPermission));
3691     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_REQUESTED_PERMISSION",
3692         nGetBundleInfoWithRequestedPermission));
3693 
3694     napi_value nGetBundleInfoWithMetadata;
3695     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3696         GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_METADATA), &nGetBundleInfoWithMetadata));
3697     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_METADATA",
3698         nGetBundleInfoWithMetadata));
3699 
3700     napi_value nGetBundleInfoWithDisable;
3701     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3702         GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_DISABLE), &nGetBundleInfoWithDisable));
3703     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_DISABLE",
3704         nGetBundleInfoWithDisable));
3705 
3706     napi_value nGetBundleInfoWithSignatureInfo;
3707     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3708         GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_SIGNATURE_INFO), &nGetBundleInfoWithSignatureInfo));
3709     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_SIGNATURE_INFO",
3710         nGetBundleInfoWithSignatureInfo));
3711 
3712     napi_value nGetBundleInfoWithMenu;
3713     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3714         GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_MENU), &nGetBundleInfoWithMenu));
3715     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_MENU",
3716         nGetBundleInfoWithMenu));
3717 
3718     napi_value nGetBundleInfoWithRouterMap;
3719     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3720         GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_ROUTER_MAP), &nGetBundleInfoWithRouterMap));
3721     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_ROUTER_MAP",
3722         nGetBundleInfoWithRouterMap));
3723 
3724     napi_value nGetBundleInfoWithSkill;
3725     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3726         GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_SKILL), &nGetBundleInfoWithSkill));
3727     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_SKILL",
3728         nGetBundleInfoWithSkill));
3729 
3730     napi_value nGetBundleInfoOnlyWithLauncherAbility;
3731     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3732         GetBundleInfoFlag::GET_BUNDLE_INFO_ONLY_WITH_LAUNCHER_ABILITY), &nGetBundleInfoOnlyWithLauncherAbility));
3733     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_ONLY_WITH_LAUNCHER_ABILITY",
3734         nGetBundleInfoOnlyWithLauncherAbility));
3735 
3736     napi_value nGetBundleInfoExcludeClone;
3737     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3738         GetBundleInfoFlag::GET_BUNDLE_INFO_EXCLUDE_CLONE), &nGetBundleInfoExcludeClone));
3739     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_EXCLUDE_CLONE",
3740         nGetBundleInfoExcludeClone));
3741 
3742     napi_value nGetBundleInfoOfAnyUser;
3743     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3744         GetBundleInfoFlag::GET_BUNDLE_INFO_OF_ANY_USER), &nGetBundleInfoOfAnyUser));
3745     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_OF_ANY_USER",
3746         nGetBundleInfoOfAnyUser));
3747 }
3748 
InnerGetBundleInfo(const std::string & bundleName,int32_t flags,int32_t userId,BundleInfo & bundleInfo)3749 static ErrCode InnerGetBundleInfo(const std::string &bundleName, int32_t flags,
3750     int32_t userId, BundleInfo &bundleInfo)
3751 {
3752     auto iBundleMgr = CommonFunc::GetBundleMgr();
3753     if (iBundleMgr == nullptr) {
3754         APP_LOGE("iBundleMgr is null");
3755         return ERROR_BUNDLE_SERVICE_EXCEPTION;
3756     }
3757     ErrCode ret = iBundleMgr->GetBundleInfoV9(bundleName, flags, bundleInfo, userId);
3758     return CommonFunc::ConvertErrCode(ret);
3759 }
3760 
InnerGetBundleInfoForSelf(int32_t flags,BundleInfo & bundleInfo)3761 static ErrCode InnerGetBundleInfoForSelf(int32_t flags, BundleInfo &bundleInfo)
3762 {
3763     auto iBundleMgr = CommonFunc::GetBundleMgr();
3764     if (iBundleMgr == nullptr) {
3765         APP_LOGE("iBundleMgr is null");
3766         return ERROR_BUNDLE_SERVICE_EXCEPTION;
3767     }
3768     ErrCode ret = iBundleMgr->GetBundleInfoForSelf(flags, bundleInfo);
3769     return CommonFunc::ConvertErrCode(ret);
3770 }
3771 
ProcessBundleInfos(napi_env env,napi_value result,const std::vector<BundleInfo> & bundleInfos,int32_t flags)3772 static void ProcessBundleInfos(
3773     napi_env env, napi_value result, const std::vector<BundleInfo> &bundleInfos, int32_t flags)
3774 {
3775     if (bundleInfos.size() == 0) {
3776         APP_LOGD("bundleInfos is null");
3777         return;
3778     }
3779     size_t index = 0;
3780     for (const auto &item : bundleInfos) {
3781         APP_LOGD("name: %{public}s ", item.name.c_str());
3782         napi_value objBundleInfo;
3783         NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &objBundleInfo));
3784         CommonFunc::ConvertBundleInfo(env, item, objBundleInfo, flags);
3785         NAPI_CALL_RETURN_VOID(env, napi_set_element(env, result, index, objBundleInfo));
3786         index++;
3787     }
3788 }
3789 
GetBundleInfosComplete(napi_env env,napi_status status,void * data)3790 void GetBundleInfosComplete(napi_env env, napi_status status, void *data)
3791 {
3792     BundleInfosCallbackInfo *asyncCallbackInfo =
3793         reinterpret_cast<BundleInfosCallbackInfo *>(data);
3794     if (asyncCallbackInfo == nullptr) {
3795         APP_LOGE("asyncCallbackInfo is null");
3796         return;
3797     }
3798     std::unique_ptr<BundleInfosCallbackInfo> callbackPtr {asyncCallbackInfo};
3799     napi_value result[CALLBACK_PARAM_SIZE] = {0};
3800     if (asyncCallbackInfo->err == NO_ERROR) {
3801         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
3802         NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &result[ARGS_POS_ONE]));
3803         ProcessBundleInfos(env, result[ARGS_POS_ONE], asyncCallbackInfo->bundleInfos, asyncCallbackInfo->flags);
3804     } else {
3805         result[ARGS_POS_ZERO] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
3806             GET_BUNDLE_INFOS, Constants::PERMISSION_GET_INSTALLED_BUNDLE_LIST);
3807     }
3808     CommonFunc::NapiReturnDeferred<BundleInfosCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
3809 }
3810 
GetBundleInfoComplete(napi_env env,napi_status status,void * data)3811 void GetBundleInfoComplete(napi_env env, napi_status status, void *data)
3812 {
3813     BundleInfoCallbackInfo *asyncCallbackInfo =
3814         reinterpret_cast<BundleInfoCallbackInfo *>(data);
3815     if (asyncCallbackInfo == nullptr) {
3816         APP_LOGE("asyncCallbackInfo is null");
3817         return;
3818     }
3819     std::unique_ptr<BundleInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
3820     napi_value result[CALLBACK_PARAM_SIZE] = {0};
3821     if (asyncCallbackInfo->err == NO_ERROR) {
3822         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
3823         if (asyncCallbackInfo->isSavedInCache) {
3824             std::shared_lock<std::shared_mutex> lock(g_cacheMutex);
3825             auto item = cache.find(Query(
3826                 asyncCallbackInfo->bundleName, GET_BUNDLE_INFO,
3827                 asyncCallbackInfo->flags, asyncCallbackInfo->userId, env));
3828             if (item == cache.end()) {
3829                 APP_LOGE("cannot find result in cache");
3830                 return;
3831             }
3832             NAPI_CALL_RETURN_VOID(env, napi_get_reference_value(env, item->second, &result[ARGS_POS_ONE]));
3833         } else {
3834             NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &result[ARGS_POS_ONE]));
3835             CommonFunc::ConvertBundleInfo(env,
3836                 asyncCallbackInfo->bundleInfo, result[ARGS_POS_ONE], asyncCallbackInfo->flags);
3837             if (!CommonFunc::CheckBundleFlagWithPermission(asyncCallbackInfo->flags)) {
3838                 Query query(
3839                     asyncCallbackInfo->bundleName, GET_BUNDLE_INFO,
3840                     asyncCallbackInfo->flags, asyncCallbackInfo->userId, env);
3841                 CheckToCache(env, asyncCallbackInfo->bundleInfo.uid, IPCSkeleton::GetCallingUid(),
3842                     query, result[ARGS_POS_ONE]);
3843             }
3844         }
3845     } else {
3846         result[ARGS_POS_ZERO] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
3847             GET_BUNDLE_INFO, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
3848     }
3849     CommonFunc::NapiReturnDeferred<BundleInfoCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
3850 }
3851 
GetBundleInfoExec(napi_env env,void * data)3852 void GetBundleInfoExec(napi_env env, void *data)
3853 {
3854     BundleInfoCallbackInfo *asyncCallbackInfo = reinterpret_cast<BundleInfoCallbackInfo *>(data);
3855     if (asyncCallbackInfo == nullptr) {
3856         APP_LOGE("asyncCallbackInfo is null");
3857         return;
3858     }
3859     if (asyncCallbackInfo->err == NO_ERROR) {
3860         if (!CommonFunc::CheckBundleFlagWithPermission(asyncCallbackInfo->flags)) {
3861             std::shared_lock<std::shared_mutex> lock(g_cacheMutex);
3862             auto item = cache.find(Query(asyncCallbackInfo->bundleName,
3863                 GET_BUNDLE_INFO, asyncCallbackInfo->flags, asyncCallbackInfo->userId, env));
3864             if (item != cache.end()) {
3865                 asyncCallbackInfo->isSavedInCache = true;
3866                 APP_LOGD("GetBundleInfo param from cache");
3867                 return;
3868             }
3869         }
3870         asyncCallbackInfo->err = InnerGetBundleInfo(asyncCallbackInfo->bundleName,
3871             asyncCallbackInfo->flags, asyncCallbackInfo->userId, asyncCallbackInfo->bundleInfo);
3872     }
3873 }
3874 
GetBundleInfoForSelfExec(napi_env env,void * data)3875 void GetBundleInfoForSelfExec(napi_env env, void *data)
3876 {
3877     BundleInfoCallbackInfo *asyncCallbackInfo = reinterpret_cast<BundleInfoCallbackInfo *>(data);
3878     if (asyncCallbackInfo == nullptr) {
3879         APP_LOGE("asyncCallbackInfo is null");
3880         return;
3881     }
3882     if (asyncCallbackInfo->err != NO_ERROR) {
3883         return;
3884     }
3885     auto uid = IPCSkeleton::GetCallingUid();
3886     asyncCallbackInfo->uid = uid;
3887     asyncCallbackInfo->bundleName = std::to_string(uid);
3888     asyncCallbackInfo->userId = uid / Constants::BASE_USER_RANGE;
3889     if (!CommonFunc::CheckBundleFlagWithPermission(asyncCallbackInfo->flags)) {
3890         std::shared_lock<std::shared_mutex> lock(g_cacheMutex);
3891         auto item = cache.find(Query(
3892             asyncCallbackInfo->bundleName, GET_BUNDLE_INFO,
3893             asyncCallbackInfo->flags, asyncCallbackInfo->userId, env));
3894         if (item != cache.end()) {
3895             asyncCallbackInfo->isSavedInCache = true;
3896             APP_LOGD("GetBundleInfo param from cache");
3897             return;
3898         }
3899     }
3900     asyncCallbackInfo->err = InnerGetBundleInfoForSelf(
3901         asyncCallbackInfo->flags, asyncCallbackInfo->bundleInfo);
3902 }
3903 
GetBundleInfo(napi_env env,napi_callback_info info)3904 napi_value GetBundleInfo(napi_env env, napi_callback_info info)
3905 {
3906     LOG_NOFUNC_I(BMS_TAG_COMMON, "NAPI GetBundleInfo call");
3907     NapiArg args(env, info);
3908     BundleInfoCallbackInfo *asyncCallbackInfo = new (std::nothrow) BundleInfoCallbackInfo(env);
3909     if (asyncCallbackInfo == nullptr) {
3910         APP_LOGE("asyncCallbackInfo is null");
3911         return nullptr;
3912     }
3913     std::unique_ptr<BundleInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
3914     if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_FOUR)) {
3915         APP_LOGE("param count invalid");
3916         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
3917         return nullptr;
3918     }
3919     asyncCallbackInfo->uid = IPCSkeleton::GetCallingUid();
3920     asyncCallbackInfo->userId = asyncCallbackInfo->uid / Constants::BASE_USER_RANGE;
3921     if (args.GetMaxArgc() < ARGS_SIZE_TWO) {
3922         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
3923         return nullptr;
3924     }
3925     for (size_t i = 0; i < args.GetMaxArgc(); i++) {
3926         napi_valuetype valueType = napi_undefined;
3927         napi_typeof(env, args[i], &valueType);
3928         if (i == ARGS_POS_ZERO) {
3929             if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->bundleName)) {
3930                 APP_LOGE("appId %{public}s invalid", asyncCallbackInfo->bundleName.c_str());
3931                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
3932                 return nullptr;
3933             }
3934         } else if (i == ARGS_POS_ONE) {
3935             if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->flags)) {
3936                 APP_LOGE("Flags %{public}d invalid", asyncCallbackInfo->flags);
3937                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_FLAGS, TYPE_NUMBER);
3938                 return nullptr;
3939             }
3940         } else if (i == ARGS_POS_TWO) {
3941             if (valueType == napi_function) {
3942                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
3943                 break;
3944             }
3945             if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->userId)) {
3946                 APP_LOGW("Parse userId failed, set this parameter to the caller userId");
3947             }
3948         } else if (i == ARGS_POS_THREE) {
3949             if (valueType == napi_function) {
3950                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
3951             }
3952             break;
3953         } else {
3954             APP_LOGE("param check error");
3955             BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
3956             return nullptr;
3957         }
3958     }
3959     auto promise = CommonFunc::AsyncCallNativeMethod<BundleInfoCallbackInfo>(
3960         env, asyncCallbackInfo, GET_BUNDLE_INFO, GetBundleInfoExec, GetBundleInfoComplete);
3961     callbackPtr.release();
3962     LOG_NOFUNC_I(BMS_TAG_COMMON, "NAPI GetBundleInfo done");
3963     return promise;
3964 }
3965 
GetBundleInfosExec(napi_env env,void * data)3966 void GetBundleInfosExec(napi_env env, void *data)
3967 {
3968     BundleInfosCallbackInfo *asyncCallbackInfo = reinterpret_cast<BundleInfosCallbackInfo *>(data);
3969     if (asyncCallbackInfo == nullptr) {
3970         APP_LOGE("asyncCallbackInfo is null");
3971         return;
3972     }
3973     asyncCallbackInfo->err = InnerGetBundleInfos(asyncCallbackInfo->flags,
3974         asyncCallbackInfo->userId, asyncCallbackInfo->bundleInfos);
3975 }
3976 
GetBundleInfos(napi_env env,napi_callback_info info)3977 napi_value GetBundleInfos(napi_env env, napi_callback_info info)
3978 {
3979     APP_LOGD("NAPI_GetBundleInfos called");
3980     NapiArg args(env, info);
3981     BundleInfosCallbackInfo *asyncCallbackInfo = new (std::nothrow) BundleInfosCallbackInfo(env);
3982     if (asyncCallbackInfo == nullptr) {
3983         APP_LOGE("asyncCallbackInfo is null");
3984         return nullptr;
3985     }
3986     std::unique_ptr<BundleInfosCallbackInfo> callbackPtr {asyncCallbackInfo};
3987     if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_THREE)) {
3988         APP_LOGE("param count invalid");
3989         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
3990         return nullptr;
3991     }
3992     asyncCallbackInfo->userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
3993     if (args.GetMaxArgc() < ARGS_SIZE_ONE) {
3994         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
3995         return nullptr;
3996     }
3997     for (size_t i = 0; i < args.GetMaxArgc(); ++i) {
3998         napi_valuetype valueType = napi_undefined;
3999         napi_typeof(env, args[i], &valueType);
4000         if (i == ARGS_POS_ZERO) {
4001             if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->flags)) {
4002                 APP_LOGE("Flags %{public}d invalid", asyncCallbackInfo->flags);
4003                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_FLAGS, TYPE_NUMBER);
4004                 return nullptr;
4005             }
4006         } else if (i == ARGS_POS_ONE) {
4007             if (valueType == napi_function) {
4008                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
4009                 break;
4010             }
4011             if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->userId)) {
4012                 APP_LOGW("Parse userId failed, set this parameter to the caller userId");
4013             }
4014         } else if (i == ARGS_POS_TWO) {
4015             if (valueType == napi_function) {
4016                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
4017                 break;
4018             }
4019         } else {
4020             APP_LOGE("param check error");
4021             BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
4022             return nullptr;
4023         }
4024     }
4025     auto promise = CommonFunc::AsyncCallNativeMethod<BundleInfosCallbackInfo>(
4026         env, asyncCallbackInfo, GET_BUNDLE_INFOS, GetBundleInfosExec, GetBundleInfosComplete);
4027     callbackPtr.release();
4028     APP_LOGD("call NAPI_GetBundleInfos done");
4029     return promise;
4030 }
4031 
GetBundleInfoForSelf(napi_env env,napi_callback_info info)4032 napi_value GetBundleInfoForSelf(napi_env env, napi_callback_info info)
4033 {
4034     APP_LOGD("GetBundleInfoForSelf called");
4035     NapiArg args(env, info);
4036     BundleInfoCallbackInfo *asyncCallbackInfo = new (std::nothrow) BundleInfoCallbackInfo(env);
4037     if (asyncCallbackInfo == nullptr) {
4038         APP_LOGE("asyncCallbackInfo is null");
4039         return nullptr;
4040     }
4041     std::unique_ptr<BundleInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
4042     if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_TWO)) {
4043         APP_LOGE("param count invalid");
4044         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
4045         return nullptr;
4046     }
4047     for (size_t i = 0; i < args.GetArgc(); ++i) {
4048         napi_valuetype valueType = napi_undefined;
4049         napi_typeof(env, args[i], &valueType);
4050         if (i == ARGS_POS_ZERO) {
4051             if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->flags)) {
4052                 APP_LOGE("Flags invalid");
4053                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_FLAGS, TYPE_NUMBER);
4054                 return nullptr;
4055             }
4056         } else if (i == ARGS_POS_ONE) {
4057             if (valueType == napi_function) {
4058                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
4059             }
4060         } else {
4061             APP_LOGE("param check error");
4062             BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
4063             return nullptr;
4064         }
4065     }
4066     auto promise = CommonFunc::AsyncCallNativeMethod<BundleInfoCallbackInfo>(
4067         env, asyncCallbackInfo, "GetBundleInfoForSelf", GetBundleInfoForSelfExec, GetBundleInfoComplete);
4068     callbackPtr.release();
4069     APP_LOGD("call GetBundleInfoForSelf done");
4070     return promise;
4071 }
4072 
InnerGetAllSharedBundleInfo(std::vector<SharedBundleInfo> & sharedBundles)4073 static ErrCode InnerGetAllSharedBundleInfo(std::vector<SharedBundleInfo> &sharedBundles)
4074 {
4075     auto iBundleMgr = CommonFunc::GetBundleMgr();
4076     if (iBundleMgr == nullptr) {
4077         APP_LOGE("iBundleMgr is null");
4078         return ERROR_BUNDLE_SERVICE_EXCEPTION;
4079     }
4080     ErrCode ret = iBundleMgr->GetAllSharedBundleInfo(sharedBundles);
4081     return CommonFunc::ConvertErrCode(ret);
4082 }
4083 
GetAllSharedBundleInfoExec(napi_env env,void * data)4084 void GetAllSharedBundleInfoExec(napi_env env, void *data)
4085 {
4086     SharedBundleCallbackInfo *asyncCallbackInfo = reinterpret_cast<SharedBundleCallbackInfo *>(data);
4087     if (asyncCallbackInfo == nullptr) {
4088         APP_LOGE("asyncCallbackInfo is null");
4089         return;
4090     }
4091     asyncCallbackInfo->err = InnerGetAllSharedBundleInfo(asyncCallbackInfo->sharedBundles);
4092 }
4093 
GetAllSharedBundleInfoComplete(napi_env env,napi_status status,void * data)4094 void GetAllSharedBundleInfoComplete(napi_env env, napi_status status, void *data)
4095 {
4096     SharedBundleCallbackInfo *asyncCallbackInfo =
4097         reinterpret_cast<SharedBundleCallbackInfo *>(data);
4098     if (asyncCallbackInfo == nullptr) {
4099         APP_LOGE("asyncCallbackInfo is null");
4100         return;
4101     }
4102     std::unique_ptr<SharedBundleCallbackInfo> callbackPtr {asyncCallbackInfo};
4103     napi_value result[CALLBACK_PARAM_SIZE] = {0};
4104     if (asyncCallbackInfo->err == NO_ERROR) {
4105         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
4106         NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &result[ARGS_POS_ONE]));
4107         CommonFunc::ConvertAllSharedBundleInfo(env, result[ARGS_POS_ONE], asyncCallbackInfo->sharedBundles);
4108     } else {
4109         result[ARGS_POS_ZERO] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
4110             GET_ALL_SHARED_BUNDLE_INFO, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
4111     }
4112     CommonFunc::NapiReturnDeferred<SharedBundleCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
4113 }
4114 
GetAllSharedBundleInfo(napi_env env,napi_callback_info info)4115 napi_value GetAllSharedBundleInfo(napi_env env, napi_callback_info info)
4116 {
4117     APP_LOGD("NAPI_GetAllSharedBundleInfo called");
4118     NapiArg args(env, info);
4119     SharedBundleCallbackInfo *asyncCallbackInfo = new (std::nothrow) SharedBundleCallbackInfo(env);
4120     if (asyncCallbackInfo == nullptr) {
4121         APP_LOGE("asyncCallbackInfo is null");
4122         return nullptr;
4123     }
4124     std::unique_ptr<SharedBundleCallbackInfo> callbackPtr {asyncCallbackInfo};
4125     if (!args.Init(ARGS_SIZE_ZERO, ARGS_SIZE_ONE)) {
4126         APP_LOGE("param count invalid");
4127         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
4128         return nullptr;
4129     }
4130     if (args.GetMaxArgc() < ARGS_SIZE_ZERO) {
4131         APP_LOGE("param count invalid");
4132         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
4133         return nullptr;
4134     }
4135     for (size_t i = 0; i < args.GetMaxArgc(); ++i) {
4136         napi_valuetype valueType = napi_undefined;
4137         napi_typeof(env, args[i], &valueType);
4138         if (i == ARGS_POS_ZERO) {
4139             if (valueType == napi_function) {
4140                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
4141                 break;
4142             }
4143         } else {
4144             APP_LOGE("param check error");
4145             BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
4146             return nullptr;
4147         }
4148     }
4149     auto promise = CommonFunc::AsyncCallNativeMethod<SharedBundleCallbackInfo>(env, asyncCallbackInfo,
4150         GET_ALL_SHARED_BUNDLE_INFO, GetAllSharedBundleInfoExec, GetAllSharedBundleInfoComplete);
4151     callbackPtr.release();
4152     APP_LOGD("call NAPI_GetAllSharedBundleInfo done");
4153     return promise;
4154 }
4155 
InnerGetSharedBundleInfo(const std::string & bundleName,const std::string & moduleName,std::vector<SharedBundleInfo> & sharedBundles)4156 static ErrCode InnerGetSharedBundleInfo(const std::string &bundleName, const std::string &moduleName,
4157     std::vector<SharedBundleInfo> &sharedBundles)
4158 {
4159     auto iBundleMgr = CommonFunc::GetBundleMgr();
4160     if (iBundleMgr == nullptr) {
4161         APP_LOGE("iBundleMgr is null");
4162         return ERROR_BUNDLE_SERVICE_EXCEPTION;
4163     }
4164     ErrCode ret = iBundleMgr->GetSharedBundleInfo(bundleName, moduleName, sharedBundles);
4165     return CommonFunc::ConvertErrCode(ret);
4166 }
4167 
GetSharedBundleInfoExec(napi_env env,void * data)4168 void GetSharedBundleInfoExec(napi_env env, void *data)
4169 {
4170     SharedBundleCallbackInfo *asyncCallbackInfo = reinterpret_cast<SharedBundleCallbackInfo *>(data);
4171     if (asyncCallbackInfo == nullptr) {
4172         APP_LOGE("asyncCallbackInfo is null");
4173         return;
4174     }
4175     asyncCallbackInfo->err = InnerGetSharedBundleInfo(asyncCallbackInfo->bundleName, asyncCallbackInfo->moduleName,
4176         asyncCallbackInfo->sharedBundles);
4177 }
4178 
GetSharedBundleInfoComplete(napi_env env,napi_status status,void * data)4179 void GetSharedBundleInfoComplete(napi_env env, napi_status status, void *data)
4180 {
4181     SharedBundleCallbackInfo *asyncCallbackInfo =
4182         reinterpret_cast<SharedBundleCallbackInfo *>(data);
4183     if (asyncCallbackInfo == nullptr) {
4184         APP_LOGE("asyncCallbackInfo is null");
4185         return;
4186     }
4187     std::unique_ptr<SharedBundleCallbackInfo> callbackPtr {asyncCallbackInfo};
4188     napi_value result[CALLBACK_PARAM_SIZE] = {0};
4189     if (asyncCallbackInfo->err == NO_ERROR) {
4190         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
4191         NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &result[ARGS_POS_ONE]));
4192         CommonFunc::ConvertAllSharedBundleInfo(env, result[ARGS_POS_ONE], asyncCallbackInfo->sharedBundles);
4193     } else {
4194         result[ARGS_POS_ZERO] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
4195             GET_SHARED_BUNDLE_INFO, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
4196     }
4197     CommonFunc::NapiReturnDeferred<SharedBundleCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
4198 }
4199 
GetSharedBundleInfo(napi_env env,napi_callback_info info)4200 napi_value GetSharedBundleInfo(napi_env env, napi_callback_info info)
4201 {
4202     APP_LOGD("NAPI_GetSharedBundleInfo called");
4203     NapiArg args(env, info);
4204     SharedBundleCallbackInfo *asyncCallbackInfo = new (std::nothrow) SharedBundleCallbackInfo(env);
4205     if (asyncCallbackInfo == nullptr) {
4206         APP_LOGE("asyncCallbackInfo is null");
4207         return nullptr;
4208     }
4209     std::unique_ptr<SharedBundleCallbackInfo> callbackPtr {asyncCallbackInfo};
4210     if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_THREE)) {
4211         APP_LOGE("param count invalid");
4212         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
4213         return nullptr;
4214     }
4215     if (args.GetMaxArgc() < ARGS_SIZE_TWO) {
4216         APP_LOGE("param count invalid");
4217         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
4218         return nullptr;
4219     }
4220 
4221     for (size_t i = 0; i < args.GetMaxArgc(); i++) {
4222         napi_valuetype valueType = napi_undefined;
4223         napi_typeof(env, args[i], &valueType);
4224         if (i == ARGS_POS_ZERO) {
4225             if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->bundleName)) {
4226                 APP_LOGE("appId %{public}s invalid", asyncCallbackInfo->bundleName.c_str());
4227                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
4228                 return nullptr;
4229             }
4230         } else if (i == ARGS_POS_ONE) {
4231             if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->moduleName)) {
4232                 APP_LOGE("appId %{public}s invalid", asyncCallbackInfo->moduleName.c_str());
4233                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, MODULE_NAME, TYPE_STRING);
4234                 return nullptr;
4235             }
4236         } else if (i == ARGS_POS_TWO) {
4237             if (valueType == napi_function) {
4238                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
4239                 break;
4240             }
4241         } else {
4242             APP_LOGE("param check error");
4243             BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
4244             return nullptr;
4245         }
4246     }
4247 
4248     auto promise = CommonFunc::AsyncCallNativeMethod<SharedBundleCallbackInfo>(env, asyncCallbackInfo,
4249         GET_SHARED_BUNDLE_INFO, GetSharedBundleInfoExec, GetSharedBundleInfoComplete);
4250     callbackPtr.release();
4251     APP_LOGD("call NAPI_GetSharedBundleInfo done");
4252     return promise;
4253 }
4254 
CreatePermissionGrantStateObject(napi_env env,napi_value value)4255 void CreatePermissionGrantStateObject(napi_env env, napi_value value)
4256 {
4257     napi_value nPermissionDenied;
4258     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, -1, &nPermissionDenied));
4259     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "PERMISSION_DENIED",
4260         nPermissionDenied));
4261 
4262     napi_value nPermissionGranted;
4263     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, 0, &nPermissionGranted));
4264     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "PERMISSION_GRANTED",
4265         nPermissionGranted));
4266 }
4267 
CreateAbilityTypeObject(napi_env env,napi_value value)4268 void CreateAbilityTypeObject(napi_env env, napi_value value)
4269 {
4270     napi_value nUnknow;
4271     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(AbilityType::UNKNOWN), &nUnknow));
4272     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "UNKNOWN", nUnknow));
4273     napi_value nPage;
4274     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(AbilityType::PAGE), &nPage));
4275     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "PAGE", nPage));
4276     napi_value nService;
4277     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(AbilityType::SERVICE), &nService));
4278     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SERVICE", nService));
4279     napi_value nData;
4280     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(AbilityType::DATA), &nData));
4281     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "DATA", nData));
4282 }
4283 
CreateBundleTypeObject(napi_env env,napi_value value)4284 void CreateBundleTypeObject(napi_env env, napi_value value)
4285 {
4286     napi_value nApp;
4287     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(BundleType::APP), &nApp));
4288     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "APP", nApp));
4289     napi_value nAtomicService;
4290     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
4291         static_cast<int32_t>(BundleType::ATOMIC_SERVICE), &nAtomicService));
4292     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "ATOMIC_SERVICE", nAtomicService));
4293 }
4294 
CreateDisplayOrientationObject(napi_env env,napi_value value)4295 void CreateDisplayOrientationObject(napi_env env, napi_value value)
4296 {
4297     napi_value nUnspecified;
4298     NAPI_CALL_RETURN_VOID(
4299         env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::UNSPECIFIED), &nUnspecified));
4300     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "UNSPECIFIED", nUnspecified));
4301     napi_value nLandscape;
4302     NAPI_CALL_RETURN_VOID(
4303         env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::LANDSCAPE), &nLandscape));
4304     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "LANDSCAPE", nLandscape));
4305     napi_value nPortrait;
4306     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::PORTRAIT), &nPortrait));
4307     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "PORTRAIT", nPortrait));
4308     napi_value nFollowrecent;
4309     NAPI_CALL_RETURN_VOID(
4310         env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::FOLLOWRECENT), &nFollowrecent));
4311     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "FOLLOW_RECENT", nFollowrecent));
4312     napi_value nReverseLandscape;
4313     NAPI_CALL_RETURN_VOID(
4314         env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::LANDSCAPE_INVERTED), &nReverseLandscape));
4315     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "LANDSCAPE_INVERTED", nReverseLandscape));
4316     napi_value nReversePortrait;
4317     NAPI_CALL_RETURN_VOID(
4318         env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::PORTRAIT_INVERTED), &nReversePortrait));
4319     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "PORTRAIT_INVERTED", nReversePortrait));
4320     napi_value nLocked;
4321     NAPI_CALL_RETURN_VOID(
4322         env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::LOCKED), &nLocked));
4323     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "LOCKED", nLocked));
4324     CreateOrientationRelatedToSensor(env, value);
4325 }
4326 
CreateOrientationRelatedToSensor(napi_env env,napi_value value)4327 void CreateOrientationRelatedToSensor(napi_env env, napi_value value)
4328 {
4329     napi_value nAutoRotation;
4330     NAPI_CALL_RETURN_VOID(
4331         env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::AUTO_ROTATION), &nAutoRotation));
4332     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "AUTO_ROTATION", nAutoRotation));
4333     napi_value nAutoRotationLandscape;
4334     NAPI_CALL_RETURN_VOID(
4335         env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::AUTO_ROTATION_LANDSCAPE),
4336             &nAutoRotationLandscape));
4337     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "AUTO_ROTATION_LANDSCAPE", nAutoRotationLandscape));
4338     napi_value nAutoRotationPortrait;
4339     NAPI_CALL_RETURN_VOID(
4340         env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::AUTO_ROTATION_PORTRAIT),
4341             &nAutoRotationPortrait));
4342     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "AUTO_ROTATION_PORTRAIT", nAutoRotationPortrait));
4343     napi_value nAutoRotationRestricted;
4344     NAPI_CALL_RETURN_VOID(
4345         env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::AUTO_ROTATION_RESTRICTED),
4346             &nAutoRotationRestricted));
4347     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "AUTO_ROTATION_RESTRICTED",
4348         nAutoRotationRestricted));
4349     napi_value nAutoRotationLandscapeRestricted;
4350     NAPI_CALL_RETURN_VOID(
4351         env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::AUTO_ROTATION_LANDSCAPE_RESTRICTED),
4352             &nAutoRotationLandscapeRestricted));
4353     NAPI_CALL_RETURN_VOID(env,
4354         napi_set_named_property(env, value, "AUTO_ROTATION_LANDSCAPE_RESTRICTED", nAutoRotationLandscapeRestricted));
4355     napi_value nAutoRotationPortraitRestricted;
4356     NAPI_CALL_RETURN_VOID(
4357         env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::AUTO_ROTATION_PORTRAIT_RESTRICTED),
4358             &nAutoRotationPortraitRestricted));
4359     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "AUTO_ROTATION_PORTRAIT_RESTRICTED",
4360         nAutoRotationPortraitRestricted));
4361     napi_value nAutoRotationUnspecified;
4362     NAPI_CALL_RETURN_VOID(env,
4363         napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::AUTO_ROTATION_UNSPECIFIED),
4364             &nAutoRotationUnspecified));
4365     NAPI_CALL_RETURN_VOID(env,
4366         napi_set_named_property(env, value, "AUTO_ROTATION_UNSPECIFIED", nAutoRotationUnspecified));
4367     napi_value nFollowDesktop;
4368     NAPI_CALL_RETURN_VOID(env,
4369         napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::FOLLOW_DESKTOP), &nFollowDesktop));
4370     NAPI_CALL_RETURN_VOID(env,
4371         napi_set_named_property(env, value, "FOLLOW_DESKTOP", nFollowDesktop));
4372 }
4373 
CreateLaunchTypeObject(napi_env env,napi_value value)4374 void CreateLaunchTypeObject(napi_env env, napi_value value)
4375 {
4376     napi_value nSingleton;
4377     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(LaunchMode::SINGLETON), &nSingleton));
4378     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SINGLETON", nSingleton));
4379     napi_value nStandard;
4380     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(LaunchMode::STANDARD), &nStandard));
4381     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "STANDARD", nStandard));
4382     napi_value nMultiton;
4383     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(LaunchMode::STANDARD), &nMultiton));
4384     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "MULTITON", nMultiton));
4385     napi_value nSpecified;
4386     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(LaunchMode::SPECIFIED), &nSpecified));
4387     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SPECIFIED", nSpecified));
4388 }
4389 
CreateSupportWindowModesObject(napi_env env,napi_value value)4390 void CreateSupportWindowModesObject(napi_env env, napi_value value)
4391 {
4392     napi_value nFullscreen;
4393     NAPI_CALL_RETURN_VOID(env,
4394         napi_create_int32(env, static_cast<int32_t>(SupportWindowMode::FULLSCREEN), &nFullscreen));
4395     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "FULL_SCREEN", nFullscreen));
4396 
4397     napi_value nSplit;
4398     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(SupportWindowMode::SPLIT), &nSplit));
4399     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SPLIT", nSplit));
4400 
4401     napi_value nFloat;
4402     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(SupportWindowMode::FLOATING), &nFloat));
4403     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "FLOATING", nFloat));
4404 }
4405 
CreateModuleTypeObject(napi_env env,napi_value value)4406 void CreateModuleTypeObject(napi_env env, napi_value value)
4407 {
4408     napi_value nUnknown;
4409     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(ModuleType::UNKNOWN), &nUnknown));
4410     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "UNKNOWN", nUnknown));
4411 
4412     napi_value nEntry;
4413     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(ModuleType::ENTRY), &nEntry));
4414     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "ENTRY", nEntry));
4415 
4416     napi_value nFeature;
4417     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(ModuleType::FEATURE), &nFeature));
4418     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "FEATURE", nFeature));
4419 
4420     napi_value nShared;
4421     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(ModuleType::SHARED), &nShared));
4422     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SHARED", nShared));
4423 }
4424 
CreateCompatiblePolicyObject(napi_env env,napi_value value)4425 void CreateCompatiblePolicyObject(napi_env env, napi_value value)
4426 {
4427     napi_value nNORMAL;
4428     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(CompatiblePolicy::NORMAL), &nNORMAL));
4429     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "NORMAL", nNORMAL));
4430 
4431     napi_value nBackwardCompatibility;
4432     NAPI_CALL_RETURN_VOID(env, napi_create_int32(
4433         env, static_cast<int32_t>(CompatiblePolicy::BACKWARD_COMPATIBILITY), &nBackwardCompatibility));
4434     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "BACKWARD_COMPATIBILITY", nBackwardCompatibility));
4435 }
4436 
CreateProfileTypeObject(napi_env env,napi_value value)4437 void CreateProfileTypeObject(napi_env env, napi_value value)
4438 {
4439     napi_value nIntentProfile;
4440     NAPI_CALL_RETURN_VOID(env, napi_create_int32(
4441         env, static_cast<int32_t>(ProfileType::INTENT_PROFILE), &nIntentProfile));
4442     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "INTENT_PROFILE", nIntentProfile));
4443 }
4444 
InnerGetAppProvisionInfo(const std::string & bundleName,int32_t userId,AppProvisionInfo & appProvisionInfo)4445 ErrCode InnerGetAppProvisionInfo(
4446     const std::string &bundleName, int32_t userId, AppProvisionInfo &appProvisionInfo)
4447 {
4448     auto iBundleMgr = CommonFunc::GetBundleMgr();
4449     if (iBundleMgr == nullptr) {
4450         APP_LOGE("iBundleMgr is null");
4451         return ERROR_BUNDLE_SERVICE_EXCEPTION;
4452     }
4453     ErrCode ret = iBundleMgr->GetAppProvisionInfo(bundleName, userId, appProvisionInfo);
4454     return CommonFunc::ConvertErrCode(ret);
4455 }
4456 
GetAppProvisionInfoExec(napi_env env,void * data)4457 void GetAppProvisionInfoExec(napi_env env, void *data)
4458 {
4459     AppProvisionInfoCallbackInfo *asyncCallbackInfo = reinterpret_cast<AppProvisionInfoCallbackInfo *>(data);
4460     if (asyncCallbackInfo == nullptr) {
4461         APP_LOGE("asyncCallbackInfo is null");
4462         return;
4463     }
4464     if (asyncCallbackInfo->err == NO_ERROR) {
4465         asyncCallbackInfo->err = InnerGetAppProvisionInfo(
4466             asyncCallbackInfo->bundleName, asyncCallbackInfo->userId, asyncCallbackInfo->appProvisionInfo);
4467     }
4468 }
4469 
GetAppProvisionInfoComplete(napi_env env,napi_status status,void * data)4470 void GetAppProvisionInfoComplete(napi_env env, napi_status status, void *data)
4471 {
4472     AppProvisionInfoCallbackInfo *asyncCallbackInfo =
4473         reinterpret_cast<AppProvisionInfoCallbackInfo *>(data);
4474     if (asyncCallbackInfo == nullptr) {
4475         APP_LOGE("asyncCallbackInfo is null");
4476         return;
4477     }
4478     std::unique_ptr<AppProvisionInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
4479     napi_value result[CALLBACK_PARAM_SIZE] = {0};
4480     if (asyncCallbackInfo->err == NO_ERROR) {
4481         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
4482         NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &result[ARGS_POS_ONE]));
4483         CommonFunc::ConvertAppProvisionInfo(env, asyncCallbackInfo->appProvisionInfo, result[ARGS_POS_ONE]);
4484     } else {
4485         result[ARGS_POS_ZERO] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
4486             GET_APP_PROVISION_INFO, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
4487     }
4488     CommonFunc::NapiReturnDeferred<AppProvisionInfoCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
4489 }
4490 
GetAppProvisionInfo(napi_env env,napi_callback_info info)4491 napi_value GetAppProvisionInfo(napi_env env, napi_callback_info info)
4492 {
4493     APP_LOGD("napi GetAppProvisionInfo called");
4494     NapiArg args(env, info);
4495     AppProvisionInfoCallbackInfo *asyncCallbackInfo = new (std::nothrow) AppProvisionInfoCallbackInfo(env);
4496     if (asyncCallbackInfo == nullptr) {
4497         APP_LOGE("asyncCallbackInfo is null");
4498         return nullptr;
4499     }
4500     std::unique_ptr<AppProvisionInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
4501     if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_THREE)) {
4502         APP_LOGE("param count invalid");
4503         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
4504         return nullptr;
4505     }
4506     asyncCallbackInfo->userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
4507     for (size_t i = 0; i < args.GetArgc(); ++i) {
4508         napi_valuetype valueType = napi_undefined;
4509         napi_typeof(env, args[i], &valueType);
4510         if (i == ARGS_POS_ZERO) {
4511             if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->bundleName)) {
4512                 APP_LOGE("bundleName invalid");
4513                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
4514                 return nullptr;
4515             }
4516             CHECK_STRING_EMPTY(env, asyncCallbackInfo->bundleName, std::string{ BUNDLE_NAME });
4517         } else if (i == ARGS_POS_ONE) {
4518             if (valueType == napi_function) {
4519                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
4520                 break;
4521             }
4522             if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->userId)) {
4523                 APP_LOGW("parse userId failed, set this parameter to the caller userId");
4524             }
4525         } else if (i == ARGS_POS_TWO) {
4526             if (valueType == napi_function) {
4527                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
4528                 break;
4529             }
4530         } else {
4531             APP_LOGE("param check error");
4532             BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
4533             return nullptr;
4534         }
4535     }
4536 
4537     auto promise = CommonFunc::AsyncCallNativeMethod<AppProvisionInfoCallbackInfo>(
4538         env, asyncCallbackInfo, GET_APP_PROVISION_INFO, GetAppProvisionInfoExec, GetAppProvisionInfoComplete);
4539     callbackPtr.release();
4540     APP_LOGD("call GetAppProvisionInfo done");
4541     return promise;
4542 }
4543 
GetSpecifiedDistributionType(napi_env env,napi_callback_info info)4544 napi_value GetSpecifiedDistributionType(napi_env env, napi_callback_info info)
4545 {
4546     APP_LOGD("GetSpecifiedDistributionType napi called");
4547     NapiArg args(env, info);
4548     if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_ONE)) {
4549         APP_LOGE("param count invalid");
4550         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
4551         return nullptr;
4552     }
4553 
4554     std::string bundleName;
4555     if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], bundleName)) {
4556         APP_LOGE("bundleName invalid");
4557         BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
4558         return nullptr;
4559     }
4560 
4561     auto iBundleMgr = CommonFunc::GetBundleMgr();
4562     if (iBundleMgr == nullptr) {
4563         APP_LOGE("iBundleMgr is null");
4564         napi_value businessError = BusinessError::CreateCommonError(
4565             env, ERROR_BUNDLE_SERVICE_EXCEPTION, RESOURCE_NAME_OF_GET_SPECIFIED_DISTRIBUTION_TYPE,
4566             Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
4567         napi_throw(env, businessError);
4568         return nullptr;
4569     }
4570 
4571     std::string specifiedDistributionType;
4572     ErrCode ret = CommonFunc::ConvertErrCode(
4573         iBundleMgr->GetSpecifiedDistributionType(bundleName, specifiedDistributionType));
4574     if (ret != SUCCESS) {
4575         APP_LOGE_NOFUNC("GetSpecifiedDistributionType failed -n %{public}s ret:%{public}d",
4576             bundleName.c_str(), ret);
4577         napi_value businessError = BusinessError::CreateCommonError(
4578             env, ret, RESOURCE_NAME_OF_GET_SPECIFIED_DISTRIBUTION_TYPE,
4579             Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
4580         napi_throw(env, businessError);
4581         return nullptr;
4582     }
4583 
4584     napi_value nSpecifiedDistributionType;
4585     napi_create_string_utf8(env, specifiedDistributionType.c_str(), NAPI_AUTO_LENGTH, &nSpecifiedDistributionType);
4586     APP_LOGD("call GetSpecifiedDistributionType done");
4587     return nSpecifiedDistributionType;
4588 }
4589 
GetAdditionalInfo(napi_env env,napi_callback_info info)4590 napi_value GetAdditionalInfo(napi_env env, napi_callback_info info)
4591 {
4592     APP_LOGD("GetAdditionalInfo napi called");
4593     NapiArg args(env, info);
4594     if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_ONE)) {
4595         APP_LOGE("param count invalid");
4596         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
4597         return nullptr;
4598     }
4599 
4600     std::string bundleName;
4601     if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], bundleName)) {
4602         APP_LOGE("bundleName invalid");
4603         BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
4604         return nullptr;
4605     }
4606     CHECK_STRING_EMPTY(env, bundleName, std::string{ BUNDLE_NAME });
4607 
4608     auto iBundleMgr = CommonFunc::GetBundleMgr();
4609     if (iBundleMgr == nullptr) {
4610         APP_LOGE("iBundleMgr is null");
4611         napi_value businessError = BusinessError::CreateCommonError(
4612             env, ERROR_BUNDLE_SERVICE_EXCEPTION, RESOURCE_NAME_OF_GET_SPECIFIED_DISTRIBUTION_TYPE,
4613             Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
4614         napi_throw(env, businessError);
4615         return nullptr;
4616     }
4617 
4618     std::string additionalInfo;
4619     ErrCode ret = CommonFunc::ConvertErrCode(
4620         iBundleMgr->GetAdditionalInfo(bundleName, additionalInfo));
4621     if (ret != SUCCESS) {
4622         APP_LOGE_NOFUNC("GetAdditionalInfo %{public}s error", bundleName.c_str());
4623         napi_value businessError = BusinessError::CreateCommonError(
4624             env, ret, RESOURCE_NAME_OF_GET_ADDITIONAL_INFO, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
4625         napi_throw(env, businessError);
4626         return nullptr;
4627     }
4628 
4629     napi_value nAdditionalInfo;
4630     napi_create_string_utf8(env, additionalInfo.c_str(), NAPI_AUTO_LENGTH, &nAdditionalInfo);
4631     APP_LOGD("call GetAdditionalInfo done");
4632     return nAdditionalInfo;
4633 }
4634 
GetBundleInfoForSelfSync(napi_env env,napi_callback_info info)4635 napi_value GetBundleInfoForSelfSync(napi_env env, napi_callback_info info)
4636 {
4637     APP_LOGD("GetBundleInfoForSelfSync called");
4638     NapiArg args(env, info);
4639     if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_ONE)) {
4640         APP_LOGE("param count invalid");
4641         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
4642         return nullptr;
4643     }
4644     int32_t flags = 0;
4645     if (!CommonFunc::ParseInt(env, args[ARGS_POS_ZERO], flags)) {
4646         APP_LOGE("parseInt invalid");
4647         BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_FLAGS, TYPE_NUMBER);
4648         return nullptr;
4649     }
4650     auto iBundleMgr = CommonFunc::GetBundleMgr();
4651     if (iBundleMgr == nullptr) {
4652         APP_LOGE("BundleMgr is null");
4653         return nullptr;
4654     }
4655     auto uid = IPCSkeleton::GetCallingUid();
4656     std::string bundleName = std::to_string(uid);
4657     int32_t userId = uid / Constants::BASE_USER_RANGE;
4658     napi_value nBundleInfo = nullptr;
4659     if (!CommonFunc::CheckBundleFlagWithPermission(flags)) {
4660         std::shared_lock<std::shared_mutex> lock(g_cacheMutex);
4661         auto item = cache.find(Query(bundleName, GET_BUNDLE_INFO, flags, userId, env));
4662         if (item != cache.end()) {
4663             APP_LOGD("GetBundleInfo param from cache");
4664             NAPI_CALL(env,
4665                 napi_get_reference_value(env, item->second, &nBundleInfo));
4666             return nBundleInfo;
4667         }
4668     }
4669     BundleInfo bundleInfo;
4670     ErrCode ret = CommonFunc::ConvertErrCode(iBundleMgr->GetBundleInfoForSelf(flags, bundleInfo));
4671     if (ret != NO_ERROR) {
4672         APP_LOGE("GetBundleInfoForSelfSync failed, bundleName is %{public}s", bundleName.c_str());
4673         napi_value businessError = BusinessError::CreateCommonError(
4674             env, ret, GET_BUNDLE_INFO_FOR_SELF_SYNC, BUNDLE_PERMISSIONS);
4675         napi_throw(env, businessError);
4676         return nullptr;
4677     }
4678     NAPI_CALL(env, napi_create_object(env,  &nBundleInfo));
4679     CommonFunc::ConvertBundleInfo(env, bundleInfo, nBundleInfo, flags);
4680     if (!CommonFunc::CheckBundleFlagWithPermission(flags)) {
4681         Query query(bundleName, GET_BUNDLE_INFO, flags, userId, env);
4682         CheckToCache(env, bundleInfo.uid, IPCSkeleton::GetCallingUid(), query, nBundleInfo);
4683     }
4684     return nBundleInfo;
4685 }
4686 
ParamsProcessGetJsonProfile(napi_env env,napi_callback_info info,int32_t & profileType,std::string & bundleName,std::string & moduleName,int32_t & userId)4687 bool ParamsProcessGetJsonProfile(napi_env env, napi_callback_info info,
4688     int32_t& profileType, std::string& bundleName, std::string& moduleName, int32_t& userId)
4689 {
4690     NapiArg args(env, info);
4691     if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_FOUR)) {
4692         APP_LOGE("param count invalid");
4693         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
4694         return false;
4695     }
4696     if (!CommonFunc::ParseInt(env, args[ARGS_POS_ZERO], profileType)) {
4697         APP_LOGE("profileType invalid");
4698         BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, PROFILE_TYPE, TYPE_NUMBER);
4699         return false;
4700     }
4701     if (g_supportedProfileList.find(profileType) == g_supportedProfileList.end()) {
4702         APP_LOGE("JS request profile error, type is %{public}d, profile not exist", profileType);
4703         BusinessError::ThrowParameterTypeError(env, ERROR_PROFILE_NOT_EXIST, PROFILE_TYPE, TYPE_NUMBER);
4704         return false;
4705     }
4706     if (!CommonFunc::ParseString(env, args[ARGS_POS_ONE], bundleName)) {
4707         APP_LOGE("bundleName invalid");
4708         BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
4709         return false;
4710     }
4711     if (bundleName.empty()) {
4712         APP_LOGE("bundleName is empty");
4713         napi_value businessError = BusinessError::CreateCommonError(
4714             env, ERROR_BUNDLE_NOT_EXIST, GET_JSON_PROFILE, BUNDLE_PERMISSIONS);
4715         napi_throw(env, businessError);
4716         return false;
4717     }
4718     if (args.GetMaxArgc() >= ARGS_SIZE_THREE) {
4719         if (!CommonFunc::ParseString(env, args[ARGS_POS_TWO], moduleName)) {
4720             APP_LOGW("parse moduleName failed, try to get profile from entry module");
4721         } else if (moduleName.empty()) {
4722             APP_LOGE("moduleName is empty");
4723             napi_value businessError = BusinessError::CreateCommonError(
4724                 env, ERROR_MODULE_NOT_EXIST, GET_JSON_PROFILE, BUNDLE_PERMISSIONS);
4725             napi_throw(env, businessError);
4726             return false;
4727         }
4728     }
4729     if (args.GetMaxArgc() == ARGS_SIZE_FOUR) {
4730         if (!CommonFunc::ParseInt(env, args[ARGS_POS_THREE], userId)) {
4731             APP_LOGE("userId invalid");
4732             BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, USER_ID, TYPE_NUMBER);
4733             return false;
4734         }
4735     }
4736     return true;
4737 }
4738 
GetJsonProfile(napi_env env,napi_callback_info info)4739 napi_value GetJsonProfile(napi_env env, napi_callback_info info)
4740 {
4741     APP_LOGD("GetJsonProfile napi called");
4742     int32_t profileType = 0;
4743     std::string bundleName;
4744     std::string moduleName;
4745     int32_t userId = Constants::UNSPECIFIED_USERID;
4746     if (!ParamsProcessGetJsonProfile(env, info, profileType, bundleName, moduleName, userId)) {
4747         APP_LOGE("paramsProcess failed");
4748         return nullptr;
4749     }
4750     auto iBundleMgr = CommonFunc::GetBundleMgr();
4751     if (iBundleMgr == nullptr) {
4752         APP_LOGE("iBundleMgr is null");
4753         return nullptr;
4754     }
4755     std::string profile;
4756     ErrCode ret = CommonFunc::ConvertErrCode(
4757         iBundleMgr->GetJsonProfile(static_cast<ProfileType>(profileType), bundleName, moduleName, profile, userId));
4758     if (ret != SUCCESS) {
4759         APP_LOGE_NOFUNC("napi GetJsonProfile err:%{public}d -n %{public}s", ret, bundleName.c_str());
4760         napi_value businessError = BusinessError::CreateCommonError(
4761             env, ret, GET_JSON_PROFILE, BUNDLE_PERMISSIONS);
4762         napi_throw(env, businessError);
4763         return nullptr;
4764     }
4765     napi_value nProfile;
4766     napi_create_string_utf8(env, profile.c_str(), NAPI_AUTO_LENGTH, &nProfile);
4767     APP_LOGD("call GetJsonProfile done");
4768     return nProfile;
4769 }
4770 
InnerGetRecoverableApplicationInfo(std::vector<RecoverableApplicationInfo> & recoverableApplications)4771 static ErrCode InnerGetRecoverableApplicationInfo(std::vector<RecoverableApplicationInfo> &recoverableApplications)
4772 {
4773     auto iBundleMgr = CommonFunc::GetBundleMgr();
4774     if (iBundleMgr == nullptr) {
4775         APP_LOGE("iBundleMgr is null");
4776         return ERROR_BUNDLE_SERVICE_EXCEPTION;
4777     }
4778     ErrCode ret = iBundleMgr->GetRecoverableApplicationInfo(recoverableApplications);
4779     return CommonFunc::ConvertErrCode(ret);
4780 }
4781 
GetRecoverableApplicationInfoExec(napi_env env,void * data)4782 void GetRecoverableApplicationInfoExec(napi_env env, void *data)
4783 {
4784     RecoverableApplicationCallbackInfo *asyncCallbackInfo =
4785         reinterpret_cast<RecoverableApplicationCallbackInfo *>(data);
4786     if (asyncCallbackInfo == nullptr) {
4787         return;
4788     }
4789     asyncCallbackInfo->err = InnerGetRecoverableApplicationInfo(asyncCallbackInfo->recoverableApplicationInfos);
4790 }
4791 
GetRecoverableApplicationInfoExecComplete(napi_env env,napi_status status,void * data)4792 void GetRecoverableApplicationInfoExecComplete(napi_env env, napi_status status, void *data)
4793 {
4794     RecoverableApplicationCallbackInfo *asyncCallbackInfo =
4795         reinterpret_cast<RecoverableApplicationCallbackInfo *>(data);
4796     if (asyncCallbackInfo == nullptr) {
4797         return;
4798     }
4799     std::unique_ptr<RecoverableApplicationCallbackInfo> callbackPtr {asyncCallbackInfo};
4800     napi_value result[CALLBACK_PARAM_SIZE] = {0};
4801     if (asyncCallbackInfo->err == NO_ERROR) {
4802         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
4803         NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &result[ARGS_POS_ONE]));
4804         CommonFunc::ConvertRecoverableApplicationInfos(
4805             env, result[ARGS_POS_ONE], asyncCallbackInfo->recoverableApplicationInfos);
4806     } else {
4807         result[ARGS_POS_ZERO] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
4808             GET_RECOVERABLE_APPLICATION_INFO, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
4809     }
4810     CommonFunc::NapiReturnDeferred<RecoverableApplicationCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
4811 }
4812 
GetRecoverableApplicationInfo(napi_env env,napi_callback_info info)4813 napi_value GetRecoverableApplicationInfo(napi_env env, napi_callback_info info)
4814 {
4815     APP_LOGD("NAPI_GetRecoverableApplicationInfo called");
4816     NapiArg args(env, info);
4817     RecoverableApplicationCallbackInfo *asyncCallbackInfo = new (std::nothrow) RecoverableApplicationCallbackInfo(env);
4818     if (asyncCallbackInfo == nullptr) {
4819         APP_LOGE("asyncCallbackInfo is null");
4820         return nullptr;
4821     }
4822     std::unique_ptr<RecoverableApplicationCallbackInfo> callbackPtr {asyncCallbackInfo};
4823     if (!args.Init(ARGS_SIZE_ZERO, ARGS_SIZE_ONE)) {
4824         APP_LOGE("param count invalid");
4825         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
4826         return nullptr;
4827     }
4828     for (size_t i = 0; i < args.GetMaxArgc(); ++i) {
4829         napi_valuetype valueType = napi_undefined;
4830         napi_typeof(env, args[i], &valueType);
4831         if (i == ARGS_POS_ZERO) {
4832             if (valueType == napi_function) {
4833                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
4834                 break;
4835             }
4836         } else {
4837             APP_LOGE("param check error");
4838             BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
4839             return nullptr;
4840         }
4841     }
4842     auto promise = CommonFunc::AsyncCallNativeMethod<RecoverableApplicationCallbackInfo>(
4843         env, asyncCallbackInfo, GET_RECOVERABLE_APPLICATION_INFO,
4844         GetRecoverableApplicationInfoExec, GetRecoverableApplicationInfoExecComplete);
4845     callbackPtr.release();
4846     APP_LOGD("call NAPI_GetRecoverableApplicationInfo done");
4847     return promise;
4848 }
4849 
SetAdditionalInfo(napi_env env,napi_callback_info info)4850 napi_value SetAdditionalInfo(napi_env env, napi_callback_info info)
4851 {
4852     APP_LOGD("Called");
4853     NapiArg args(env, info);
4854     if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_TWO)) {
4855         APP_LOGE("Param count invalid");
4856         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
4857         return nullptr;
4858     }
4859     std::string bundleName;
4860     if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], bundleName)) {
4861         APP_LOGE("Parse bundleName failed");
4862         BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
4863         return nullptr;
4864     }
4865     CHECK_STRING_EMPTY(env, bundleName, std::string{ BUNDLE_NAME });
4866     std::string additionalInfo;
4867     if (!CommonFunc::ParseString(env, args[ARGS_POS_ONE], additionalInfo)) {
4868         APP_LOGE("Parse additionalInfo failed");
4869         BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, ADDITIONAL_INFO, TYPE_STRING);
4870         return nullptr;
4871     }
4872     auto iBundleMgr = CommonFunc::GetBundleMgr();
4873     if (iBundleMgr == nullptr) {
4874         APP_LOGE("Can not get iBundleMgr");
4875         BusinessError::ThrowError(env, ERROR_BUNDLE_SERVICE_EXCEPTION, ERR_MSG_BUNDLE_SERVICE_EXCEPTION);
4876         return nullptr;
4877     }
4878     ErrCode ret = CommonFunc::ConvertErrCode(iBundleMgr->SetAdditionalInfo(bundleName, additionalInfo));
4879     if (ret != NO_ERROR) {
4880         APP_LOGE("Call failed, bundleName is %{public}s", bundleName.c_str());
4881         napi_value businessError = BusinessError::CreateCommonError(
4882             env, ret, RESOURCE_NAME_OF_SET_ADDITIONAL_INFO, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
4883         napi_throw(env, businessError);
4884         return nullptr;
4885     }
4886     napi_value nRet = nullptr;
4887     NAPI_CALL(env, napi_get_undefined(env, &nRet));
4888     APP_LOGD("Call done");
4889     return nRet;
4890 }
4891 
ParamsProcessCanOpenLink(napi_env env,napi_callback_info info,std::string & link)4892 ErrCode ParamsProcessCanOpenLink(napi_env env, napi_callback_info info,
4893     std::string& link)
4894 {
4895     NapiArg args(env, info);
4896     if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_ONE)) {
4897         APP_LOGE("param count invalid");
4898         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
4899         return ERROR_PARAM_CHECK_ERROR;
4900     }
4901     if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], link)) {
4902         APP_LOGW("Parse link failed");
4903         BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, LINK, TYPE_STRING);
4904         return ERROR_PARAM_CHECK_ERROR;
4905     }
4906     return ERR_OK;
4907 }
4908 
CanOpenLink(napi_env env,napi_callback_info info)4909 napi_value CanOpenLink(napi_env env, napi_callback_info info)
4910 {
4911     APP_LOGD("NAPI CanOpenLink call");
4912     napi_value nRet;
4913     bool canOpen = false;
4914     napi_get_boolean(env, canOpen, &nRet);
4915     std::string link;
4916     if (ParamsProcessCanOpenLink(env, info, link) != ERR_OK) {
4917         APP_LOGE("paramsProcess is invalid");
4918         BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
4919         return nRet;
4920     }
4921     auto iBundleMgr = CommonFunc::GetBundleMgr();
4922     if (iBundleMgr == nullptr) {
4923         APP_LOGE("can not get iBundleMgr");
4924         BusinessError::ThrowError(env, ERROR_BUNDLE_SERVICE_EXCEPTION, ERR_MSG_BUNDLE_SERVICE_EXCEPTION);
4925         return nRet;
4926     }
4927     ErrCode ret = CommonFunc::ConvertErrCode(
4928         iBundleMgr->CanOpenLink(link, canOpen));
4929     if (ret != NO_ERROR) {
4930         APP_LOGE("CanOpenLink failed");
4931         napi_value businessError = BusinessError::CreateCommonError(
4932             env, ret, CAN_OPEN_LINK, "");
4933         napi_throw(env, businessError);
4934         return nRet;
4935     }
4936     NAPI_CALL(env, napi_get_boolean(env, canOpen, &nRet));
4937     APP_LOGD("call CanOpenLink done");
4938     return nRet;
4939 }
4940 
ConvertPreinstalledApplicationInfo(napi_env env,const PreinstalledApplicationInfo & preinstalledApplicationInfo,napi_value objPreinstalledApplicationInfo)4941 void ConvertPreinstalledApplicationInfo(napi_env env, const PreinstalledApplicationInfo &preinstalledApplicationInfo,
4942     napi_value objPreinstalledApplicationInfo)
4943 {
4944     napi_value nBundleName;
4945     NAPI_CALL_RETURN_VOID(env,
4946         napi_create_string_utf8(env, preinstalledApplicationInfo.bundleName.c_str(), NAPI_AUTO_LENGTH, &nBundleName));
4947     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, objPreinstalledApplicationInfo, BUNDLE_NAME, nBundleName));
4948 
4949     napi_value nModuleName;
4950     NAPI_CALL_RETURN_VOID(env,
4951         napi_create_string_utf8(env, preinstalledApplicationInfo.moduleName.c_str(), NAPI_AUTO_LENGTH, &nModuleName));
4952     NAPI_CALL_RETURN_VOID(env,
4953         napi_set_named_property(env, objPreinstalledApplicationInfo, MODULE_NAME, nModuleName));
4954 
4955     napi_value nLabelId;
4956     NAPI_CALL_RETURN_VOID(env, napi_create_uint32(env, preinstalledApplicationInfo.labelId, &nLabelId));
4957     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, objPreinstalledApplicationInfo, LABEL_ID, nLabelId));
4958 
4959     napi_value nIconId;
4960     NAPI_CALL_RETURN_VOID(env, napi_create_uint32(env, preinstalledApplicationInfo.iconId, &nIconId));
4961     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, objPreinstalledApplicationInfo, ICON_ID, nIconId));
4962 }
4963 
4964 
ProcessPreinstalledApplicationInfos(napi_env env,napi_value result,const std::vector<PreinstalledApplicationInfo> & preinstalledApplicationInfos)4965 static void ProcessPreinstalledApplicationInfos(
4966     napi_env env, napi_value result, const std::vector<PreinstalledApplicationInfo> &preinstalledApplicationInfos)
4967 {
4968     if (preinstalledApplicationInfos.size() == 0) {
4969         APP_LOGD("PreinstalledApplicationInfos is null");
4970         return;
4971     }
4972     size_t index = 0;
4973     napi_value objPreinstalledApplicationInfo;
4974     for (const auto &item : preinstalledApplicationInfos) {
4975         NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &objPreinstalledApplicationInfo));
4976         ConvertPreinstalledApplicationInfo(env, item, objPreinstalledApplicationInfo);
4977         NAPI_CALL_RETURN_VOID(env, napi_set_element(env, result, index, objPreinstalledApplicationInfo));
4978         index++;
4979     }
4980 }
4981 
GetAllPreinstalledApplicationInfosComplete(napi_env env,napi_status status,void * data)4982 void GetAllPreinstalledApplicationInfosComplete(napi_env env, napi_status status, void *data)
4983 {
4984     PreinstalledApplicationInfosCallbackInfo *asyncCallbackInfo =
4985         reinterpret_cast<PreinstalledApplicationInfosCallbackInfo *>(data);
4986     if (asyncCallbackInfo == nullptr) {
4987         APP_LOGE("AsyncCallbackInfo is null");
4988         return;
4989     }
4990     std::unique_ptr<PreinstalledApplicationInfosCallbackInfo> callbackPtr {asyncCallbackInfo};
4991     napi_value result[CALLBACK_PARAM_SIZE] = {0};
4992     if (asyncCallbackInfo->err == NO_ERROR) {
4993         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
4994         NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &result[ARGS_POS_ONE]));
4995         ProcessPreinstalledApplicationInfos(env, result[ARGS_POS_ONE], asyncCallbackInfo->preinstalledApplicationInfos);
4996     } else {
4997         result[ARGS_POS_ZERO] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
4998             GET_ALL_PREINSTALLED_APP_INFOS, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
4999     }
5000     CommonFunc::NapiReturnDeferred<PreinstalledApplicationInfosCallbackInfo>(
5001         env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
5002 }
5003 
InnerGetAllPreinstalledApplicationInfos(std::vector<PreinstalledApplicationInfo> & preinstalledApplicationInfos)5004 static ErrCode InnerGetAllPreinstalledApplicationInfos(
5005     std::vector<PreinstalledApplicationInfo> &preinstalledApplicationInfos)
5006 {
5007     auto iBundleMgr = CommonFunc::GetBundleMgr();
5008     if (iBundleMgr == nullptr) {
5009         APP_LOGE("IBundleMgr is null");
5010         return ERROR_BUNDLE_SERVICE_EXCEPTION;
5011     }
5012     ErrCode ret = iBundleMgr->GetAllPreinstalledApplicationInfos(preinstalledApplicationInfos);
5013     return CommonFunc::ConvertErrCode(ret);
5014 }
5015 
GetAllPreinstalledApplicationInfosExec(napi_env env,void * data)5016 void GetAllPreinstalledApplicationInfosExec(napi_env env, void *data)
5017 {
5018     PreinstalledApplicationInfosCallbackInfo *asyncCallbackInfo =
5019         reinterpret_cast<PreinstalledApplicationInfosCallbackInfo *>(data);
5020     if (asyncCallbackInfo == nullptr) {
5021         APP_LOGE("AsyncCallbackInfo is null");
5022         return;
5023     }
5024     asyncCallbackInfo->err = InnerGetAllPreinstalledApplicationInfos(asyncCallbackInfo->preinstalledApplicationInfos);
5025 }
5026 
GetAllPreinstalledApplicationInfos(napi_env env,napi_callback_info info)5027 napi_value GetAllPreinstalledApplicationInfos(napi_env env, napi_callback_info info)
5028 {
5029     APP_LOGD("Called");
5030     NapiArg args(env, info);
5031     PreinstalledApplicationInfosCallbackInfo *asyncCallbackInfo =
5032         new (std::nothrow) PreinstalledApplicationInfosCallbackInfo(env);
5033     if (asyncCallbackInfo == nullptr) {
5034         APP_LOGE("AsyncCallbackInfo is null");
5035         return nullptr;
5036     }
5037     std::unique_ptr<PreinstalledApplicationInfosCallbackInfo> callbackPtr {asyncCallbackInfo};
5038     if (!args.Init(ARGS_SIZE_ZERO, ARGS_SIZE_ZERO)) {
5039         APP_LOGE("Param count invalid");
5040         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
5041         return nullptr;
5042     }
5043     auto promise = CommonFunc::AsyncCallNativeMethod<PreinstalledApplicationInfosCallbackInfo>(env, asyncCallbackInfo,
5044         GET_ALL_PREINSTALLED_APP_INFOS, GetAllPreinstalledApplicationInfosExec,
5045         GetAllPreinstalledApplicationInfosComplete);
5046     callbackPtr.release();
5047     return promise;
5048 }
5049 
GetAllBundleInfoByDeveloperId(napi_env env,napi_callback_info info)5050 napi_value GetAllBundleInfoByDeveloperId(napi_env env, napi_callback_info info)
5051 {
5052     APP_LOGD("Called");
5053     NapiArg args(env, info);
5054     if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_ONE)) {
5055         APP_LOGE("Param count invalid");
5056         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
5057         return nullptr;
5058     }
5059     std::string developerId;
5060     if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], developerId)) {
5061         APP_LOGE("Parse developerId failed");
5062         BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, DEVELOPER_ID, TYPE_STRING);
5063         return nullptr;
5064     }
5065     CHECK_STRING_EMPTY(env, developerId, std::string{ DEVELOPER_ID });
5066     auto iBundleMgr = CommonFunc::GetBundleMgr();
5067     if (iBundleMgr == nullptr) {
5068         APP_LOGE("Can not get iBundleMgr");
5069         BusinessError::ThrowError(env, ERROR_BUNDLE_SERVICE_EXCEPTION, ERR_MSG_BUNDLE_SERVICE_EXCEPTION);
5070         return nullptr;
5071     }
5072     std::vector<BundleInfo> bundleInfos;
5073     int32_t userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
5074     ErrCode ret = CommonFunc::ConvertErrCode(
5075         iBundleMgr->GetAllBundleInfoByDeveloperId(developerId, bundleInfos, userId));
5076     if (ret != NO_ERROR) {
5077         APP_LOGE("Call failed, developerId is %{public}s", developerId.c_str());
5078         napi_value businessError = BusinessError::CreateCommonError(
5079             env, ret, GET_ALL_BUNDLE_INFO_BY_DEVELOPER_ID, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
5080         napi_throw(env, businessError);
5081         return nullptr;
5082     }
5083     napi_value nBundleInfos;
5084     NAPI_CALL(env, napi_create_array(env, &nBundleInfos));
5085     ProcessBundleInfos(env, nBundleInfos, bundleInfos,
5086         static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_APPLICATION));
5087     APP_LOGD("Call done");
5088     return nBundleInfos;
5089 }
5090 
ProcessStringVec(napi_env env,napi_value result,const std::vector<std::string> & stringList)5091 static void ProcessStringVec(
5092     napi_env env, napi_value result, const std::vector<std::string> &stringList)
5093 {
5094     if (stringList.size() == 0) {
5095         APP_LOGD("stringList is null");
5096         return;
5097     }
5098     size_t index = 0;
5099     for (const auto &item : stringList) {
5100         APP_LOGD("string: %{public}s ", item.c_str());
5101         napi_value nString;
5102         NAPI_CALL_RETURN_VOID(env, napi_create_string_utf8(env, item.c_str(), NAPI_AUTO_LENGTH, &nString));
5103         NAPI_CALL_RETURN_VOID(env, napi_set_element(env, result, index, nString));
5104         index++;
5105     }
5106 }
5107 
GetDeveloperIds(napi_env env,napi_callback_info info)5108 napi_value GetDeveloperIds(napi_env env, napi_callback_info info)
5109 {
5110     APP_LOGD("Called");
5111     NapiArg args(env, info);
5112     if (!args.Init(ARGS_SIZE_ZERO, ARGS_SIZE_ONE)) {
5113         APP_LOGE("Param count invalid");
5114         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
5115         return nullptr;
5116     }
5117     std::string distributionType;
5118     if (args.GetMaxArgc() >= ARGS_SIZE_ONE) {
5119         int32_t appDistributionTypeEnum = 0;
5120         if (!CommonFunc::ParseInt(env, args[ARGS_POS_ZERO], appDistributionTypeEnum)) {
5121             APP_LOGE("parseInt failed");
5122             BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, APP_DISTRIBUTION_TYPE, TYPE_NUMBER);
5123             return nullptr;
5124         }
5125         if (appDistributionTypeMap.find(appDistributionTypeEnum) == appDistributionTypeMap.end()) {
5126             APP_LOGE("request error, type %{public}d is invalid", appDistributionTypeEnum);
5127             BusinessError::ThrowEnumError(env, APP_DISTRIBUTION_TYPE, APP_DISTRIBUTION_TYPE_ENUM);
5128             return nullptr;
5129         }
5130         distributionType = std::string{ appDistributionTypeMap[appDistributionTypeEnum] };
5131     }
5132 
5133     auto iBundleMgr = CommonFunc::GetBundleMgr();
5134     if (iBundleMgr == nullptr) {
5135         APP_LOGE("Can not get iBundleMgr");
5136         BusinessError::ThrowError(env, ERROR_BUNDLE_SERVICE_EXCEPTION, ERR_MSG_BUNDLE_SERVICE_EXCEPTION);
5137         return nullptr;
5138     }
5139     std::vector<std::string> developerIds;
5140     int32_t userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
5141     ErrCode ret = CommonFunc::ConvertErrCode(
5142         iBundleMgr->GetDeveloperIds(distributionType, developerIds, userId));
5143     if (ret != NO_ERROR) {
5144         APP_LOGW("Call failed, appDistributionType is %{public}s", distributionType.c_str());
5145         napi_value businessError = BusinessError::CreateCommonError(
5146             env, ret, GET_DEVELOPER_IDS, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
5147         napi_throw(env, businessError);
5148         return nullptr;
5149     }
5150     napi_value nDeveloperIds;
5151     NAPI_CALL(env, napi_create_array(env, &nDeveloperIds));
5152     ProcessStringVec(env, nDeveloperIds, developerIds);
5153     APP_LOGD("Call done");
5154     return nDeveloperIds;
5155 }
5156 
SwitchUninstallState(napi_env env,napi_callback_info info)5157 napi_value SwitchUninstallState(napi_env env, napi_callback_info info)
5158 {
5159     APP_LOGI("NAPI SwitchUninstallState call");
5160     NapiArg args(env, info);
5161     if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_TWO)) {
5162         APP_LOGE("Param count invalid");
5163         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
5164         return nullptr;
5165     }
5166     std::string bundleName;
5167     if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], bundleName)) {
5168         APP_LOGE("Parse bundleName failed");
5169         BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
5170         return nullptr;
5171     }
5172     bool state;
5173     if (!CommonFunc::ParseBool(env, args[ARGS_POS_ONE], state)) {
5174         APP_LOGE("Parse state failed");
5175         BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, STATE, TYPE_BOOLEAN);
5176         return nullptr;
5177     }
5178     auto iBundleMgr = CommonFunc::GetBundleMgr();
5179     if (iBundleMgr == nullptr) {
5180         APP_LOGE("can not get iBundleMgr");
5181         BusinessError::ThrowError(env, ERROR_BUNDLE_SERVICE_EXCEPTION, ERR_MSG_BUNDLE_SERVICE_EXCEPTION);
5182         return nullptr;
5183     }
5184     ErrCode ret = CommonFunc::ConvertErrCode(iBundleMgr->SwitchUninstallState(bundleName, state));
5185     if (ret != NO_ERROR) {
5186         APP_LOGE("SwitchUninstallState failed");
5187         napi_value businessError = BusinessError::CreateCommonError(
5188             env, ret, SWITCH_UNINSTALL_STATE, "");
5189         napi_throw(env, businessError);
5190         return nullptr;
5191     }
5192     napi_value nRet = nullptr;
5193     NAPI_CALL(env, napi_get_undefined(env, &nRet));
5194     APP_LOGD("call SwitchUninstallState done");
5195     return nRet;
5196 }
5197 
InnerGetAppCloneBundleInfo(const std::string & bundleName,int32_t appIndex,int32_t bundleFlags,int32_t userId,BundleInfo & bundleInfo)5198 static ErrCode InnerGetAppCloneBundleInfo(const std::string &bundleName, int32_t appIndex,
5199     int32_t bundleFlags, int32_t userId, BundleInfo &bundleInfo)
5200 {
5201     auto iBundleMgr = CommonFunc::GetBundleMgr();
5202     if (iBundleMgr == nullptr) {
5203         APP_LOGE("can not get iBundleMgr");
5204         return ERROR_BUNDLE_SERVICE_EXCEPTION;
5205     }
5206     ErrCode ret = iBundleMgr->GetCloneBundleInfo(bundleName, bundleFlags, appIndex, bundleInfo, userId);
5207     APP_LOGD("GetCloneBundleInfo result is %{public}d", ret);
5208     return CommonFunc::ConvertErrCode(ret);
5209 }
5210 
GetAppCloneBundleInfoExec(napi_env env,void * data)5211 void GetAppCloneBundleInfoExec(napi_env env, void *data)
5212 {
5213     CloneAppBundleInfoCallbackInfo *asyncCallbackInfo = reinterpret_cast<CloneAppBundleInfoCallbackInfo *>(data);
5214     if (asyncCallbackInfo == nullptr) {
5215         APP_LOGE("asyncCallbackInfo is null");
5216         return;
5217     }
5218     APP_LOGD("param: name=%{public}s,index=%{public}d,bundleFlags=%{public}d,userId=%{public}d",
5219         asyncCallbackInfo->bundleName.c_str(),
5220         asyncCallbackInfo->appIndex,
5221         asyncCallbackInfo->bundleFlags,
5222         asyncCallbackInfo->userId);
5223     asyncCallbackInfo->err =
5224         InnerGetAppCloneBundleInfo(asyncCallbackInfo->bundleName, asyncCallbackInfo->appIndex,
5225             asyncCallbackInfo->bundleFlags, asyncCallbackInfo->userId, asyncCallbackInfo->bundleInfo);
5226 }
5227 
GetAppCloneBundleInfoComplete(napi_env env,napi_status status,void * data)5228 void GetAppCloneBundleInfoComplete(napi_env env, napi_status status, void *data)
5229 {
5230     CloneAppBundleInfoCallbackInfo *asyncCallbackInfo = reinterpret_cast<CloneAppBundleInfoCallbackInfo *>(data);
5231     if (asyncCallbackInfo == nullptr) {
5232         APP_LOGE("asyncCallbackInfo is null");
5233         return;
5234     }
5235     std::unique_ptr<CloneAppBundleInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
5236     napi_value result[CALLBACK_PARAM_SIZE] = {0};
5237     if (asyncCallbackInfo->err == NO_ERROR) {
5238         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
5239         NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &result[ARGS_POS_ONE]));
5240         CommonFunc::ConvertBundleInfo(env, asyncCallbackInfo->bundleInfo, result[ARGS_POS_ONE],
5241             asyncCallbackInfo->bundleFlags);
5242     } else {
5243         result[ARGS_POS_ZERO] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
5244             GET_APP_CLONE_BUNDLE_INFO, Constants::PERMISSION_GET_BUNDLE_INFO);
5245     }
5246     CommonFunc::NapiReturnDeferred<CloneAppBundleInfoCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
5247 }
5248 
GetAppCloneBundleInfo(napi_env env,napi_callback_info info)5249 napi_value GetAppCloneBundleInfo(napi_env env, napi_callback_info info)
5250 {
5251     APP_LOGD("NAPI GetAppCloneBundleInfo call");
5252     NapiArg args(env, info);
5253     if (!args.Init(ARGS_SIZE_THREE, ARGS_SIZE_FOUR)) {
5254         APP_LOGE("Param count invalid");
5255         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
5256         return nullptr;
5257     }
5258     std::unique_ptr<CloneAppBundleInfoCallbackInfo> asyncCallbackInfo =
5259         std::make_unique<CloneAppBundleInfoCallbackInfo>(env);
5260     if (asyncCallbackInfo == nullptr) {
5261         APP_LOGW("asyncCallbackInfo is null");
5262         return nullptr;
5263     }
5264     if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], asyncCallbackInfo->bundleName)) {
5265         APP_LOGE("Parse bundleName failed");
5266         BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
5267         return nullptr;
5268     }
5269     if (!CommonFunc::ParseInt(env, args[ARGS_POS_ONE], asyncCallbackInfo->appIndex)) {
5270         APP_LOGE("Parse appIndex failed");
5271         BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, APP_INDEX, TYPE_NUMBER);
5272         return nullptr;
5273     }
5274     if (!CommonFunc::ParseInt(env, args[ARGS_POS_TWO], asyncCallbackInfo->bundleFlags)) {
5275         APP_LOGE("Parse bundleFlags failed");
5276         BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_FLAGS, TYPE_NUMBER);
5277         return nullptr;
5278     }
5279     if (!CommonFunc::ParseInt(env, args[ARGS_POS_THREE], asyncCallbackInfo->userId)) {
5280         APP_LOGI("Parse userId failed, use default value");
5281     }
5282     auto promise = CommonFunc::AsyncCallNativeMethod<CloneAppBundleInfoCallbackInfo>(
5283         env, asyncCallbackInfo.get(), GET_APP_CLONE_BUNDLE_INFO,
5284         GetAppCloneBundleInfoExec, GetAppCloneBundleInfoComplete);
5285     asyncCallbackInfo.release();
5286     APP_LOGD("call GetAppCloneBundleInfo done");
5287     return promise;
5288 }
5289 
InnerGetAllAppCloneBundleInfo(const std::string & bundleName,int32_t bundleFlags,int32_t userId,std::vector<BundleInfo> & bundleInfos)5290 static ErrCode InnerGetAllAppCloneBundleInfo(const std::string &bundleName, int32_t bundleFlags,
5291     int32_t userId, std::vector<BundleInfo> &bundleInfos)
5292 {
5293     auto iBundleMgr = CommonFunc::GetBundleMgr();
5294     if (iBundleMgr == nullptr) {
5295         APP_LOGE("can not get iBundleMgr");
5296         return ERROR_BUNDLE_SERVICE_EXCEPTION;
5297     }
5298     BundleInfo bundleInfoMain;
5299     ErrCode ret = iBundleMgr->GetCloneBundleInfo(bundleName, bundleFlags, 0, bundleInfoMain, userId);
5300     APP_LOGD("GetMainBundleInfo appIndex = 0, ret=%{public}d", ret);
5301     if (ret == ERR_OK) {
5302         bundleInfos.emplace_back(bundleInfoMain);
5303     }
5304     if (ret != ERR_OK && ret != ERR_BUNDLE_MANAGER_APPLICATION_DISABLED) {
5305         return CommonFunc::ConvertErrCode(ret);
5306     }
5307     // handle clone apps
5308     std::vector<int32_t> appIndexes;
5309     ErrCode getCloneIndexesRet = iBundleMgr->GetCloneAppIndexes(bundleName, appIndexes, userId);
5310     if (getCloneIndexesRet != ERR_OK) {
5311         if (ret == ERR_OK) {
5312             return SUCCESS;
5313         }
5314         return CommonFunc::ConvertErrCode(ret);
5315     }
5316     for (int32_t appIndex : appIndexes) {
5317         BundleInfo bundleInfo;
5318         ret = iBundleMgr->GetCloneBundleInfo(bundleName, bundleFlags, appIndex, bundleInfo, userId);
5319         if (ret == ERR_OK) {
5320             bundleInfos.emplace_back(bundleInfo);
5321         }
5322     }
5323     if (bundleInfos.empty()) {
5324         return ERROR_BUNDLE_IS_DISABLED;
5325     }
5326     return SUCCESS;
5327 }
5328 
GetAllAppCloneBundleInfoExec(napi_env env,void * data)5329 void GetAllAppCloneBundleInfoExec(napi_env env, void *data)
5330 {
5331     CloneAppBundleInfosCallbackInfo *asyncCallbackInfo = reinterpret_cast<CloneAppBundleInfosCallbackInfo *>(data);
5332     if (asyncCallbackInfo == nullptr) {
5333         APP_LOGE("asyncCallbackInfo is null");
5334         return;
5335     }
5336     APP_LOGD("param: name=%{public}s,bundleFlags=%{public}d,userId=%{public}d",
5337         asyncCallbackInfo->bundleName.c_str(),
5338         asyncCallbackInfo->bundleFlags,
5339         asyncCallbackInfo->userId);
5340     asyncCallbackInfo->err =
5341         InnerGetAllAppCloneBundleInfo(asyncCallbackInfo->bundleName, asyncCallbackInfo->bundleFlags,
5342             asyncCallbackInfo->userId, asyncCallbackInfo->bundleInfos);
5343 }
5344 
CloneAppBundleInfos(napi_env env,napi_value result,const std::vector<BundleInfo> & bundleInfos,int32_t flags)5345 static void CloneAppBundleInfos(
5346     napi_env env, napi_value result, const std::vector<BundleInfo> &bundleInfos, int32_t flags)
5347 {
5348     if (bundleInfos.size() == 0) {
5349         APP_LOGD("bundleInfos is null");
5350         return;
5351     }
5352     size_t index = 0;
5353     for (const auto &item : bundleInfos) {
5354         napi_value objBundleInfo;
5355         NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &objBundleInfo));
5356         CommonFunc::ConvertBundleInfo(env, item, objBundleInfo, flags);
5357         NAPI_CALL_RETURN_VOID(env, napi_set_element(env, result, index++, objBundleInfo));
5358     }
5359 }
5360 
GetAllAppCloneBundleInfoComplete(napi_env env,napi_status status,void * data)5361 void GetAllAppCloneBundleInfoComplete(napi_env env, napi_status status, void *data)
5362 {
5363     CloneAppBundleInfosCallbackInfo *asyncCallbackInfo = reinterpret_cast<CloneAppBundleInfosCallbackInfo *>(data);
5364     if (asyncCallbackInfo == nullptr) {
5365         APP_LOGE("asyncCallbackInfo is null");
5366         return;
5367     }
5368     std::unique_ptr<CloneAppBundleInfosCallbackInfo> callbackPtr {asyncCallbackInfo};
5369     napi_value result[CALLBACK_PARAM_SIZE] = {0};
5370     if (asyncCallbackInfo->err == NO_ERROR) {
5371         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
5372         NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &result[ARGS_POS_ONE]));
5373         CloneAppBundleInfos(env, result[ARGS_POS_ONE], asyncCallbackInfo->bundleInfos, asyncCallbackInfo->bundleFlags);
5374     } else {
5375         result[ARGS_POS_ZERO] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
5376             GET_ALL_APP_CLONE_BUNDLE_INFO, Constants::PERMISSION_GET_BUNDLE_INFO);
5377     }
5378     CommonFunc::NapiReturnDeferred<CloneAppBundleInfosCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
5379 }
5380 
GetAllAppCloneBundleInfo(napi_env env,napi_callback_info info)5381 napi_value GetAllAppCloneBundleInfo(napi_env env, napi_callback_info info)
5382 {
5383     APP_LOGD("NAPI GetAllAppCloneBundleInfo call");
5384     NapiArg args(env, info);
5385     if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_THREE)) {
5386         APP_LOGE("Param count invalid");
5387         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
5388         return nullptr;
5389     }
5390     std::unique_ptr<CloneAppBundleInfosCallbackInfo> asyncCallbackInfo =
5391         std::make_unique<CloneAppBundleInfosCallbackInfo>(env);
5392     if (asyncCallbackInfo == nullptr) {
5393         APP_LOGW("asyncCallbackInfo is null");
5394         return nullptr;
5395     }
5396     if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], asyncCallbackInfo->bundleName)) {
5397         APP_LOGE("Parse bundleName failed");
5398         BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
5399         return nullptr;
5400     }
5401     if (!CommonFunc::ParseInt(env, args[ARGS_POS_ONE], asyncCallbackInfo->bundleFlags)) {
5402         APP_LOGE("Parse bundleFlags failed");
5403         BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_FLAGS, TYPE_NUMBER);
5404         return nullptr;
5405     }
5406     if (!CommonFunc::ParseInt(env, args[ARGS_POS_TWO], asyncCallbackInfo->userId)) {
5407         APP_LOGI("Parse userId failed, use default value");
5408     }
5409     auto promise = CommonFunc::AsyncCallNativeMethod<CloneAppBundleInfosCallbackInfo>(
5410         env, asyncCallbackInfo.get(), GET_ALL_APP_CLONE_BUNDLE_INFO,
5411         GetAllAppCloneBundleInfoExec, GetAllAppCloneBundleInfoComplete);
5412     asyncCallbackInfo.release();
5413     APP_LOGD("call GetAllAppCloneBundleInfo done");
5414     return promise;
5415 }
5416 
CreateMultiAppModeTypeObject(napi_env env,napi_value value)5417 void CreateMultiAppModeTypeObject(napi_env env, napi_value value)
5418 {
5419     napi_value nUnspecified;
5420     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(MultiAppModeType::UNSPECIFIED),
5421         &nUnspecified));
5422     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, UNSPECIFIED, nUnspecified));
5423 
5424     napi_value nMultiInstance;
5425     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(MultiAppModeType::MULTI_INSTANCE),
5426         &nMultiInstance));
5427     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, MULTI_INSTANCE, nMultiInstance));
5428 
5429     napi_value nAppClone;
5430     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(MultiAppModeType::APP_CLONE),
5431         &nAppClone));
5432     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, APP_CLONE, nAppClone));
5433 }
5434 }
5435 }
5436