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