• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-2023 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 "bundle_errors.h"
22 #include "bundle_mgr_client.h"
23 #include "bundle_mgr_interface.h"
24 #include "bundle_mgr_proxy.h"
25 #include "business_error.h"
26 #include "bundle_constants.h"
27 #include "common_func.h"
28 #include "hap_module_info.h"
29 #ifdef BUNDLE_FRAMEWORK_GET_ABILITY_ICON_ENABLED
30 #include "image_source.h"
31 #include "pixel_map_napi.h"
32 #endif
33 #include "ipc_skeleton.h"
34 #include "napi_arg.h"
35 #include "napi_constants.h"
36 
37 namespace OHOS {
38 namespace AppExecFwk {
39 namespace {
40 constexpr const char* MODULE_NAME = "moduleName";
41 constexpr const char* ABILITY_NAME = "abilityName";
42 constexpr const char* BUNDLE_NAME = "bundleName";
43 constexpr const char* ABILITY_INFO = "abilityInfo";
44 constexpr const char* IS_ENABLE = "isEnable";
45 constexpr const char* USER_ID = "userId";
46 constexpr const char* BUNDLE_FLAGS = "bundleFlags";
47 constexpr const char* APP_FLAGS = "appFlags";
48 constexpr const char* ABILITY_FLAGS = "abilityFlags";
49 constexpr const char* STRING_TYPE = "napi_string";
50 constexpr const char* GET_LAUNCH_WANT_FOR_BUNDLE = "GetLaunchWantForBundle";
51 constexpr const char* ERR_MSG_BUNDLE_SERVICE_EXCEPTION = "Bundle manager service is excepted.";
52 const std::string GET_BUNDLE_ARCHIVE_INFO = "GetBundleArchiveInfo";
53 const std::string GET_BUNDLE_NAME_BY_UID = "GetBundleNameByUid";
54 const std::string QUERY_ABILITY_INFOS = "QueryAbilityInfos";
55 const std::string QUERY_ABILITY_INFOS_SYNC = "QueryAbilityInfosSync";
56 const std::string QUERY_EXTENSION_INFOS = "QueryExtensionInfos";
57 const std::string GET_BUNDLE_INFO = "GetBundleInfo";
58 const std::string GET_BUNDLE_INFOS = "GetBundleInfos";
59 const std::string GET_APPLICATION_INFO = "GetApplicationInfo";
60 const std::string GET_APPLICATION_INFOS = "GetApplicationInfos";
61 const std::string GET_PERMISSION_DEF = "GetPermissionDef";
62 const std::string PERMISSION_NAME = "permissionName";
63 const std::string BUNDLE_PERMISSIONS = "ohos.permission.GET_BUNDLE_INFO or ohos.permission.GET_BUNDLE_INFO_PRIVILEGED";
64 const std::string PARAM_TYPE_CHECK_ERROR = "param type check error";
65 const std::string PARAM_TYPE_CHECK_ERROR_WITH_POS = "param type check error, error position : ";
66 const std::string GET_BUNDLE_INFO_SYNC = "GetBundleInfoSync";
67 const std::string GET_APPLICATION_INFO_SYNC = "GetApplicationInfoSync";
68 const std::string GET_ALL_SHARED_BUNDLE_INFO = "GetAllSharedBundleInfo";
69 const std::string GET_SHARED_BUNDLE_INFO = "GetSharedBundleInfo";
70 const std::string INVALID_WANT_ERROR =
71     "implicit query condition, at least one query param(action entities uri type) non-empty.";
72 const std::string GET_APP_PROVISION_INFO = "GetAppProvisionInfo";
73 const std::string RESOURCE_NAME_OF_GET_SPECIFIED_DISTRIBUTION_TYPE = "GetSpecifiedDistributionType";
74 const std::string RESOURCE_NAME_OF_GET_ADDITIONAL_INFO = "GetAdditionalInfo";
75 const std::string GET_BUNDLE_INFO_FOR_SELF_SYNC = "GetBundleInfoForSelfSync";
76 } // namespace
77 using namespace OHOS::AAFwk;
78 static std::shared_ptr<ClearCacheListener> g_clearCacheListener;
79 static std::unordered_map<Query, napi_ref, QueryHash> cache;
80 static std::string g_ownBundleName;
81 static std::mutex g_ownBundleNameMutex;
82 static std::shared_mutex g_cacheMutex;
83 namespace {
84 const std::string PARAMETER_BUNDLE_NAME = "bundleName";
85 }
86 
ClearCacheListener(const EventFwk::CommonEventSubscribeInfo & subscribeInfo)87 ClearCacheListener::ClearCacheListener(const EventFwk::CommonEventSubscribeInfo &subscribeInfo)
88     : EventFwk::CommonEventSubscriber(subscribeInfo)
89 {}
90 
OnReceiveEvent(const EventFwk::CommonEventData & data)91 void ClearCacheListener::OnReceiveEvent(const EventFwk::CommonEventData &data)
92 {
93     APP_LOGD("clear bms cache");
94     std::unique_lock<std::shared_mutex> lock(g_cacheMutex);
95     cache.clear();
96 }
97 
RegisterClearCacheListener()98 void RegisterClearCacheListener()
99 {
100     if (g_clearCacheListener != nullptr) {
101         return;
102     }
103     APP_LOGD("register clear cache listener");
104     EventFwk::MatchingSkills matchingSkills;
105     matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_PACKAGE_ADDED);
106     matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_PACKAGE_CHANGED);
107     matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_PACKAGE_REMOVED);
108     EventFwk::CommonEventSubscribeInfo subscribeInfo(matchingSkills);
109     g_clearCacheListener = std::make_shared<ClearCacheListener>(subscribeInfo);
110     (void)EventFwk::CommonEventManager::SubscribeCommonEvent(g_clearCacheListener);
111 }
112 
InnerGetBundleArchiveInfo(std::string & hapFilePath,int32_t flags,BundleInfo & bundleInfo)113 static ErrCode InnerGetBundleArchiveInfo(std::string &hapFilePath, int32_t flags, BundleInfo &bundleInfo)
114 {
115     auto iBundleMgr = CommonFunc::GetBundleMgr();
116     if (iBundleMgr == nullptr) {
117         APP_LOGE("iBundleMgr is null");
118         return ERROR_BUNDLE_SERVICE_EXCEPTION;
119     }
120     ErrCode ret = iBundleMgr->GetBundleArchiveInfoV9(hapFilePath, flags, bundleInfo);
121     APP_LOGD("GetBundleArchiveInfoV9 ErrCode : %{public}d", ret);
122     return CommonFunc::ConvertErrCode(ret);
123 }
124 
GetBundleArchiveInfoExec(napi_env env,void * data)125 void GetBundleArchiveInfoExec(napi_env env, void *data)
126 {
127     GetBundleArchiveInfoCallbackInfo *asyncCallbackInfo = reinterpret_cast<GetBundleArchiveInfoCallbackInfo *>(data);
128     if (asyncCallbackInfo == nullptr) {
129         APP_LOGE("asyncCallbackInfo is null");
130         return;
131     }
132     asyncCallbackInfo->err = InnerGetBundleArchiveInfo(
133         asyncCallbackInfo->hapFilePath, asyncCallbackInfo->flags, asyncCallbackInfo->bundleInfo);
134 }
135 
GetBundleArchiveInfoComplete(napi_env env,napi_status status,void * data)136 void GetBundleArchiveInfoComplete(napi_env env, napi_status status, void *data)
137 {
138     GetBundleArchiveInfoCallbackInfo *asyncCallbackInfo = reinterpret_cast<GetBundleArchiveInfoCallbackInfo *>(data);
139     if (asyncCallbackInfo == nullptr) {
140         APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
141         return;
142     }
143     std::unique_ptr<GetBundleArchiveInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
144     napi_value result[ARGS_SIZE_TWO] = {0};
145     if (asyncCallbackInfo->err == NO_ERROR) {
146         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
147         NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &result[ARGS_POS_ONE]));
148         CommonFunc::ConvertBundleInfo(env,
149             asyncCallbackInfo->bundleInfo, result[ARGS_POS_ONE], asyncCallbackInfo->flags);
150     } else {
151         result[ARGS_POS_ZERO] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
152             GET_BUNDLE_ARCHIVE_INFO, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
153     }
154     CommonFunc::NapiReturnDeferred<GetBundleArchiveInfoCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
155 }
156 
GetBundleArchiveInfo(napi_env env,napi_callback_info info)157 napi_value GetBundleArchiveInfo(napi_env env, napi_callback_info info)
158 {
159     APP_LOGD("begin to GetBundleArchiveInfo");
160     NapiArg args(env, info);
161     GetBundleArchiveInfoCallbackInfo *asyncCallbackInfo = new (std::nothrow) GetBundleArchiveInfoCallbackInfo(env);
162     if (asyncCallbackInfo == nullptr) {
163         APP_LOGE("asyncCallbackInfo is null");
164         return nullptr;
165     }
166     std::unique_ptr<GetBundleArchiveInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
167     if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_THREE)) {
168         APP_LOGE("param count invalid.");
169         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
170         return nullptr;
171     }
172     for (size_t i = 0; i < args.GetMaxArgc(); ++i) {
173         napi_valuetype valueType = napi_undefined;
174         napi_typeof(env, args[i], &valueType);
175         if ((i == ARGS_POS_ZERO) && (valueType == napi_string)) {
176             if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->hapFilePath)) {
177                 APP_LOGE("hapFilePath %{public}s invalid!", asyncCallbackInfo->hapFilePath.c_str());
178                 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
179                 return nullptr;
180             }
181         } else if ((i == ARGS_POS_ONE) && (valueType == napi_number)) {
182             CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->flags);
183         } else if (i == ARGS_POS_TWO) {
184             if (valueType == napi_function) {
185                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
186             }
187             break;
188         } else {
189             APP_LOGE("param check error");
190             std::string errMsg = PARAM_TYPE_CHECK_ERROR_WITH_POS + std::to_string(i + 1);
191             BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, errMsg);
192             return nullptr;
193         }
194     }
195     auto promise = CommonFunc::AsyncCallNativeMethod<GetBundleArchiveInfoCallbackInfo>(
196         env, asyncCallbackInfo, GET_BUNDLE_ARCHIVE_INFO, GetBundleArchiveInfoExec, GetBundleArchiveInfoComplete);
197     callbackPtr.release();
198     APP_LOGD("call GetBundleArchiveInfo done");
199     return promise;
200 }
201 
InnerGetBundleNameByUid(int32_t uid,std::string & bundleName)202 static ErrCode InnerGetBundleNameByUid(int32_t uid, std::string &bundleName)
203 {
204     auto iBundleMgr = CommonFunc::GetBundleMgr();
205     if (iBundleMgr == nullptr) {
206         APP_LOGE("iBundleMgr is null");
207         return ERROR_BUNDLE_SERVICE_EXCEPTION;
208     }
209     ErrCode ret = iBundleMgr->GetNameForUid(uid, bundleName);
210     APP_LOGD("GetNameForUid ErrCode : %{public}d", ret);
211     return CommonFunc::ConvertErrCode(ret);
212 }
213 
InnerGetApplicationInfo(const std::string & bundleName,int32_t flags,int32_t userId,ApplicationInfo & appInfo)214 static ErrCode InnerGetApplicationInfo(const std::string &bundleName, int32_t flags,
215     int32_t userId, ApplicationInfo &appInfo)
216 {
217     auto iBundleMgr = CommonFunc::GetBundleMgr();
218     if (iBundleMgr == nullptr) {
219         APP_LOGE("iBundleMgr is null");
220         return ERROR_BUNDLE_SERVICE_EXCEPTION;
221     }
222     ErrCode ret = iBundleMgr->GetApplicationInfoV9(bundleName, flags, userId, appInfo);
223     return CommonFunc::ConvertErrCode(ret);
224 }
225 
InnerGetApplicationInfos(int32_t flags,int32_t userId,std::vector<ApplicationInfo> & appInfos)226 static ErrCode InnerGetApplicationInfos(int32_t flags,
227     int32_t userId, std::vector<ApplicationInfo> &appInfos)
228 {
229     auto iBundleMgr = CommonFunc::GetBundleMgr();
230     if (iBundleMgr == nullptr) {
231         APP_LOGE("iBundleMgr is null");
232         return ERROR_BUNDLE_SERVICE_EXCEPTION;
233     }
234     ErrCode ret = iBundleMgr->GetApplicationInfosV9(flags, userId, appInfos);
235     return CommonFunc::ConvertErrCode(ret);
236 }
237 
ProcessApplicationInfos(napi_env env,napi_value result,const std::vector<ApplicationInfo> & appInfos)238 static void ProcessApplicationInfos(
239     napi_env env, napi_value result, const std::vector<ApplicationInfo> &appInfos)
240 {
241     if (appInfos.size() == 0) {
242         APP_LOGD("appInfos is null");
243         return;
244     }
245     size_t index = 0;
246     for (const auto &item : appInfos) {
247         APP_LOGD("name{%s}, bundleName{%s} ", item.name.c_str(), item.bundleName.c_str());
248         napi_value objAppInfo;
249         NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &objAppInfo));
250         CommonFunc::ConvertApplicationInfo(env, objAppInfo, item);
251         NAPI_CALL_RETURN_VOID(env, napi_set_element(env, result, index, objAppInfo));
252         index++;
253     }
254 }
255 
GetBundleNameByUidExec(napi_env env,void * data)256 void GetBundleNameByUidExec(napi_env env, void *data)
257 {
258     GetBundleNameByUidCallbackInfo *asyncCallbackInfo = reinterpret_cast<GetBundleNameByUidCallbackInfo *>(data);
259     if (asyncCallbackInfo == nullptr) {
260         APP_LOGE("asyncCallbackInfo is null");
261         return;
262     }
263     bool queryOwn = (asyncCallbackInfo->uid == IPCSkeleton::GetCallingUid());
264     if (queryOwn) {
265         std::lock_guard<std::mutex> lock(g_ownBundleNameMutex);
266         if (!g_ownBundleName.empty()) {
267             APP_LOGD("query own bundleName, has cache, no need to query from host");
268             asyncCallbackInfo->bundleName = g_ownBundleName;
269             asyncCallbackInfo->err = NO_ERROR;
270             return;
271         }
272     }
273     asyncCallbackInfo->err = InnerGetBundleNameByUid(asyncCallbackInfo->uid, asyncCallbackInfo->bundleName);
274     if ((asyncCallbackInfo->err == NO_ERROR) && queryOwn && g_ownBundleName.empty()) {
275         APP_LOGD("put own bundleName to cache");
276         std::lock_guard<std::mutex> lock(g_ownBundleNameMutex);
277         g_ownBundleName = asyncCallbackInfo->bundleName;
278     }
279 }
280 
GetBundleNameByUidComplete(napi_env env,napi_status status,void * data)281 void GetBundleNameByUidComplete(napi_env env, napi_status status, void *data)
282 {
283     GetBundleNameByUidCallbackInfo *asyncCallbackInfo = reinterpret_cast<GetBundleNameByUidCallbackInfo *>(data);
284     if (asyncCallbackInfo == nullptr) {
285         APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
286         return;
287     }
288     std::unique_ptr<GetBundleNameByUidCallbackInfo> callbackPtr {asyncCallbackInfo};
289     napi_value result[2] = {0};
290     if (asyncCallbackInfo->err == NO_ERROR) {
291         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
292         NAPI_CALL_RETURN_VOID(env,
293             napi_create_string_utf8(env, asyncCallbackInfo->bundleName.c_str(), NAPI_AUTO_LENGTH, &result[1]));
294     } else {
295         result[0] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
296             GET_BUNDLE_NAME_BY_UID, BUNDLE_PERMISSIONS);
297     }
298     CommonFunc::NapiReturnDeferred<GetBundleNameByUidCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
299 }
300 
GetApplicationInfoComplete(napi_env env,napi_status status,void * data)301 void GetApplicationInfoComplete(napi_env env, napi_status status, void *data)
302 {
303     ApplicationInfoCallbackInfo *asyncCallbackInfo =
304         reinterpret_cast<ApplicationInfoCallbackInfo *>(data);
305     if (asyncCallbackInfo == nullptr) {
306         APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
307         return;
308     }
309     std::unique_ptr<ApplicationInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
310     napi_value result[CALLBACK_PARAM_SIZE] = {0};
311     if (asyncCallbackInfo->err == NO_ERROR) {
312         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
313         NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &result[ARGS_POS_ONE]));
314         CommonFunc::ConvertApplicationInfo(env, result[ARGS_POS_ONE], asyncCallbackInfo->appInfo);
315     } else {
316         result[ARGS_POS_ZERO] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
317             GET_APPLICATION_INFO, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
318     }
319     CommonFunc::NapiReturnDeferred<ApplicationInfoCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
320 }
321 
GetApplicationInfosComplete(napi_env env,napi_status status,void * data)322 void GetApplicationInfosComplete(napi_env env, napi_status status, void *data)
323 {
324     ApplicationInfosCallbackInfo *asyncCallbackInfo =
325         reinterpret_cast<ApplicationInfosCallbackInfo *>(data);
326     if (asyncCallbackInfo == nullptr) {
327         APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
328         return;
329     }
330     std::unique_ptr<ApplicationInfosCallbackInfo> callbackPtr {asyncCallbackInfo};
331     napi_value result[CALLBACK_PARAM_SIZE] = {0};
332     if (asyncCallbackInfo->err == NO_ERROR) {
333         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
334         NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &result[ARGS_POS_ONE]));
335         ProcessApplicationInfos(env, result[ARGS_POS_ONE], asyncCallbackInfo->appInfos);
336     } else {
337         result[ARGS_POS_ZERO] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
338             GET_APPLICATION_INFOS, Constants::PERMISSION_GET_INSTALLED_BUNDLE_LIST);
339     }
340     CommonFunc::NapiReturnDeferred<ApplicationInfosCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
341 }
342 
GetApplicationInfoExec(napi_env env,void * data)343 void GetApplicationInfoExec(napi_env env, void *data)
344 {
345     ApplicationInfoCallbackInfo *asyncCallbackInfo = reinterpret_cast<ApplicationInfoCallbackInfo *>(data);
346     if (asyncCallbackInfo == nullptr) {
347         APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
348         return;
349     }
350     asyncCallbackInfo->err = InnerGetApplicationInfo(asyncCallbackInfo->bundleName,
351         asyncCallbackInfo->flags, asyncCallbackInfo->userId, asyncCallbackInfo->appInfo);
352 }
353 
GetApplicationInfosExec(napi_env env,void * data)354 void GetApplicationInfosExec(napi_env env, void *data)
355 {
356     ApplicationInfosCallbackInfo *asyncCallbackInfo = reinterpret_cast<ApplicationInfosCallbackInfo *>(data);
357     if (asyncCallbackInfo == nullptr) {
358         APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
359         return;
360     }
361     asyncCallbackInfo->err = InnerGetApplicationInfos(asyncCallbackInfo->flags,
362         asyncCallbackInfo->userId, asyncCallbackInfo->appInfos);
363 }
364 
GetBundleNameByUid(napi_env env,napi_callback_info info)365 napi_value GetBundleNameByUid(napi_env env, napi_callback_info info)
366 {
367     APP_LOGD("begin to GetBundleNameByUid");
368     NapiArg args(env, info);
369     GetBundleNameByUidCallbackInfo *asyncCallbackInfo = new (std::nothrow) GetBundleNameByUidCallbackInfo(env);
370     if (asyncCallbackInfo == nullptr) {
371         APP_LOGE("asyncCallbackInfo is null");
372         return nullptr;
373     }
374     std::unique_ptr<GetBundleNameByUidCallbackInfo> callbackPtr {asyncCallbackInfo};
375     if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_TWO)) {
376         APP_LOGE("param count invalid.");
377         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
378         return nullptr;
379     }
380     for (size_t i = 0; i < args.GetMaxArgc(); ++i) {
381         napi_valuetype valueType = napi_undefined;
382         napi_typeof(env, args[i], &valueType);
383         if ((i == ARGS_POS_ZERO) && (valueType == napi_number)) {
384             CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->uid);
385         } else if (i == ARGS_POS_ONE) {
386             if (valueType == napi_function) {
387                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
388             }
389             break;
390         } else {
391             APP_LOGE("param check error");
392             std::string errMsg = PARAM_TYPE_CHECK_ERROR_WITH_POS + std::to_string(i + 1);
393             BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, errMsg);
394             return nullptr;
395         }
396     }
397     auto promise = CommonFunc::AsyncCallNativeMethod<GetBundleNameByUidCallbackInfo>(
398         env, asyncCallbackInfo, GET_BUNDLE_NAME_BY_UID, GetBundleNameByUidExec, GetBundleNameByUidComplete);
399     callbackPtr.release();
400     APP_LOGD("call GetBundleNameByUid done");
401     return promise;
402 }
403 
GetApplicationInfo(napi_env env,napi_callback_info info)404 napi_value GetApplicationInfo(napi_env env, napi_callback_info info)
405 {
406     APP_LOGD("NAPI_GetApplicationInfo called");
407     NapiArg args(env, info);
408     ApplicationInfoCallbackInfo *asyncCallbackInfo = new (std::nothrow) ApplicationInfoCallbackInfo(env);
409     if (asyncCallbackInfo == nullptr) {
410         APP_LOGE("asyncCallbackInfo is null.");
411         return nullptr;
412     }
413     std::unique_ptr<ApplicationInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
414     if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_FOUR)) {
415         APP_LOGE("param count invalid.");
416         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
417         return nullptr;
418     }
419     asyncCallbackInfo->userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
420     if (args.GetMaxArgc() < ARGS_SIZE_TWO) {
421         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
422         return nullptr;
423     }
424     for (size_t i = 0; i < args.GetMaxArgc(); i++) {
425         napi_valuetype valueType = napi_undefined;
426         napi_typeof(env, args[i], &valueType);
427         if (i == ARGS_POS_ZERO) {
428             if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->bundleName)) {
429                 APP_LOGE("appId %{public}s invalid!", asyncCallbackInfo->bundleName.c_str());
430                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
431                 return nullptr;
432             }
433         } else if (i == ARGS_SIZE_ONE) {
434             if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->flags)) {
435                 APP_LOGE("Flags %{public}d invalid!", asyncCallbackInfo->flags);
436                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, APP_FLAGS, TYPE_NUMBER);
437                 return nullptr;
438             }
439         } else if (i == ARGS_SIZE_TWO) {
440             if (valueType == napi_function) {
441                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
442                 break;
443             }
444             if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->userId)) {
445                 APP_LOGW("Parse userId failed, set this parameter to the caller userId!");
446             }
447         } else if (i == ARGS_SIZE_THREE) {
448             if (valueType == napi_function) {
449                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
450             }
451             break;
452         } else {
453             APP_LOGE("param check error");
454             BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
455             return nullptr;
456         }
457     }
458     auto promise = CommonFunc::AsyncCallNativeMethod<ApplicationInfoCallbackInfo>(
459         env, asyncCallbackInfo, GET_APPLICATION_INFO, GetApplicationInfoExec, GetApplicationInfoComplete);
460     callbackPtr.release();
461     APP_LOGD("call NAPI_GetApplicationInfo done.");
462     return promise;
463 }
464 
GetApplicationInfos(napi_env env,napi_callback_info info)465 napi_value GetApplicationInfos(napi_env env, napi_callback_info info)
466 {
467     APP_LOGD("NAPI_GetApplicationInfos called");
468     NapiArg args(env, info);
469     ApplicationInfosCallbackInfo *asyncCallbackInfo = new (std::nothrow) ApplicationInfosCallbackInfo(env);
470     if (asyncCallbackInfo == nullptr) {
471         APP_LOGE("asyncCallbackInfo is null.");
472         return nullptr;
473     }
474     std::unique_ptr<ApplicationInfosCallbackInfo> callbackPtr {asyncCallbackInfo};
475     if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_THREE)) {
476         APP_LOGE("param count invalid.");
477         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
478         return nullptr;
479     }
480     asyncCallbackInfo->userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
481     if (args.GetMaxArgc() < ARGS_SIZE_ONE) {
482         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
483         return nullptr;
484     }
485     for (size_t i = 0; i < args.GetMaxArgc(); ++i) {
486         napi_valuetype valueType = napi_undefined;
487         napi_typeof(env, args[i], &valueType);
488         if (i == ARGS_POS_ZERO) {
489             if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->flags)) {
490                 APP_LOGE("Flags %{public}d invalid!", asyncCallbackInfo->flags);
491                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, APP_FLAGS, TYPE_NUMBER);
492                 return nullptr;
493             }
494         } else if (i == ARGS_POS_ONE) {
495             if (valueType == napi_function) {
496                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
497                 break;
498             }
499             if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->userId)) {
500                 APP_LOGW("Parse userId failed, set this parameter to the caller userId!");
501             }
502         } else if (i == ARGS_POS_TWO) {
503             if (valueType == napi_function) {
504                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
505             }
506             break;
507         } else {
508             APP_LOGE("param check error");
509             BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
510             return nullptr;
511         }
512     }
513     auto promise = CommonFunc::AsyncCallNativeMethod<ApplicationInfosCallbackInfo>(
514         env, asyncCallbackInfo, GET_APPLICATION_INFOS, GetApplicationInfosExec, GetApplicationInfosComplete);
515     callbackPtr.release();
516     APP_LOGD("call NAPI_GetApplicationInfos done.");
517     return promise;
518 }
519 
InnerQueryAbilityInfos(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos)520 static ErrCode InnerQueryAbilityInfos(const Want &want,
521     int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos)
522 {
523     auto iBundleMgr = CommonFunc::GetBundleMgr();
524     if (iBundleMgr == nullptr) {
525         APP_LOGE("iBundleMgr is null");
526         return ERROR_BUNDLE_SERVICE_EXCEPTION;
527     }
528     ErrCode ret = iBundleMgr->QueryAbilityInfosV9(want, flags, userId, abilityInfos);
529     APP_LOGD("QueryAbilityInfosV9 ErrCode : %{public}d", ret);
530     return CommonFunc::ConvertErrCode(ret);
531 }
532 
InnerSetApplicationEnabled(const std::string & bundleName,bool & isEnable)533 static ErrCode InnerSetApplicationEnabled(const std::string &bundleName, bool &isEnable)
534 {
535     auto bundleMgr = CommonFunc::GetBundleMgr();
536     if (bundleMgr == nullptr) {
537         APP_LOGE("CommonFunc::GetBundleMgr failed.");
538         return ERROR_BUNDLE_SERVICE_EXCEPTION;
539     }
540     ErrCode ret = bundleMgr->SetApplicationEnabled(bundleName, isEnable);
541     return CommonFunc::ConvertErrCode(ret);
542 }
543 
InnerIsApplicationEnabled(const std::string & bundleName,bool & isEnable)544 static ErrCode InnerIsApplicationEnabled(const std::string &bundleName, bool &isEnable)
545 {
546     auto bundleMgr = CommonFunc::GetBundleMgr();
547     if (bundleMgr == nullptr) {
548         APP_LOGE("CommonFunc::GetBundleMgr failed.");
549         return ERROR_BUNDLE_SERVICE_EXCEPTION;
550     }
551     ErrCode ret = bundleMgr->IsApplicationEnabled(bundleName, isEnable);
552     return CommonFunc::ConvertErrCode(ret);
553 }
554 
InnerSetAbilityEnabled(const AbilityInfo & abilityInfo,bool & isEnable)555 static ErrCode InnerSetAbilityEnabled(const AbilityInfo &abilityInfo, bool &isEnable)
556 {
557     auto bundleMgr = CommonFunc::GetBundleMgr();
558     if (bundleMgr == nullptr) {
559         APP_LOGE("CommonFunc::GetBundleMgr failed.");
560         return ERROR_BUNDLE_SERVICE_EXCEPTION;
561     }
562     ErrCode ret = bundleMgr->SetAbilityEnabled(abilityInfo, isEnable);
563     return CommonFunc::ConvertErrCode(ret);
564 }
565 
InnerIsAbilityEnabled(const AbilityInfo & abilityInfo,bool & isEnable)566 static ErrCode InnerIsAbilityEnabled(const AbilityInfo &abilityInfo, bool &isEnable)
567 {
568     auto bundleMgr = CommonFunc::GetBundleMgr();
569     if (bundleMgr == nullptr) {
570         APP_LOGE("CommonFunc::GetBundleMgr failed.");
571         return ERROR_BUNDLE_SERVICE_EXCEPTION;
572     }
573     ErrCode ret = bundleMgr->IsAbilityEnabled(abilityInfo, isEnable);
574     return CommonFunc::ConvertErrCode(ret);
575 }
576 
InnerGetAbilityLabel(const std::string & bundleName,const std::string & moduleName,const std::string & abilityName,std::string & abilityLabel)577 static ErrCode InnerGetAbilityLabel(const std::string &bundleName, const std::string &moduleName,
578     const std::string &abilityName, std::string &abilityLabel)
579 {
580     auto bundleMgr = CommonFunc::GetBundleMgr();
581     if (bundleMgr == nullptr) {
582         APP_LOGE("CommonFunc::GetBundleMgr failed.");
583         return ERROR_SYSTEM_ABILITY_NOT_FOUND;
584     }
585     ErrCode ret = bundleMgr->GetAbilityLabel(bundleName, moduleName, abilityName, abilityLabel);
586     return CommonFunc::ConvertErrCode(ret);
587 }
588 
589 #ifdef BUNDLE_FRAMEWORK_GET_ABILITY_ICON_ENABLED
LoadImageFile(const uint8_t * data,size_t len)590 static std::shared_ptr<Media::PixelMap> LoadImageFile(const uint8_t *data, size_t len)
591 {
592     APP_LOGD("begin LoadImageFile");
593     uint32_t errorCode = 0;
594     Media::SourceOptions opts;
595     std::unique_ptr<Media::ImageSource> imageSource = Media::ImageSource::CreateImageSource(data, len, opts, errorCode);
596     if (errorCode != 0) {
597         APP_LOGE("failed to create image source err is %{public}d", errorCode);
598         return nullptr;
599     }
600 
601     Media::DecodeOptions decodeOpts;
602     auto pixelMapPtr = imageSource->CreatePixelMap(decodeOpts, errorCode);
603     if (errorCode != 0) {
604         APP_LOGE("failed to create pixelmap err %{public}d", errorCode);
605         return nullptr;
606     }
607     APP_LOGD("LoadImageFile finish");
608     return std::shared_ptr<Media::PixelMap>(std::move(pixelMapPtr));
609 }
610 
InnerGetAbilityIcon(const std::string & bundleName,const std::string & moduleName,const std::string & abilityName,std::shared_ptr<Media::PixelMap> & pixelMap)611 static ErrCode InnerGetAbilityIcon(const std::string &bundleName, const std::string &moduleName,
612     const std::string &abilityName, std::shared_ptr<Media::PixelMap> &pixelMap)
613 {
614     auto bundleMgr = CommonFunc::GetBundleMgr();
615     if (bundleMgr == nullptr) {
616         APP_LOGE("CommonFunc::GetBundleMgr failed.");
617         return ERROR_SYSTEM_ABILITY_NOT_FOUND;
618     }
619     if (bundleName.empty() || moduleName.empty() || abilityName.empty()) {
620         APP_LOGE("GetAbilityIcon check param failed.");
621         return ERROR_PARAM_CHECK_ERROR;
622     }
623     std::unique_ptr<uint8_t[]> mediaDataPtr = nullptr;
624     size_t len = 0;
625     ErrCode ret = bundleMgr->GetMediaData(bundleName, moduleName, abilityName, mediaDataPtr, len);
626     if (ret != ERR_OK) {
627         APP_LOGE("get media data failed");
628         return CommonFunc::ConvertErrCode(ret);
629     }
630     if (mediaDataPtr == nullptr || len == 0) {
631         return ERROR_BUNDLE_SERVICE_EXCEPTION;
632     }
633     auto pixelMapPtr = LoadImageFile(mediaDataPtr.get(), len);
634     if (pixelMapPtr == nullptr) {
635         APP_LOGE("loadImageFile failed");
636         return ERROR_BUNDLE_SERVICE_EXCEPTION;
637     }
638     pixelMap = std::move(pixelMapPtr);
639     return SUCCESS;
640 }
641 #endif
642 
CheckAbilityInfoCache(napi_env env,const Query & query,const OHOS::AAFwk::Want & want,std::vector<AbilityInfo> abilityInfos,napi_value jsObject)643 static void CheckAbilityInfoCache(napi_env env, const Query &query,
644     const OHOS::AAFwk::Want &want, std::vector<AbilityInfo> abilityInfos,  napi_value jsObject)
645 {
646     ElementName element = want.GetElement();
647     if (element.GetBundleName().empty() || element.GetAbilityName().empty()) {
648         return;
649     }
650 
651     uint32_t explicitQueryResultLen = 1;
652     if (abilityInfos.size() != explicitQueryResultLen ||
653         abilityInfos[0].uid != IPCSkeleton::GetCallingUid()) {
654         return;
655     }
656 
657     napi_ref cacheAbilityInfo = nullptr;
658     NAPI_CALL_RETURN_VOID(env, napi_create_reference(env, jsObject, NAPI_RETURN_ONE, &cacheAbilityInfo));
659     std::unique_lock<std::shared_mutex> lock(g_cacheMutex);
660     cache[query] = cacheAbilityInfo;
661 }
662 
CheckAbilityInfoCache(napi_env env,const Query & query,const AbilityCallbackInfo * info,napi_value jsObject)663 static void CheckAbilityInfoCache(
664     napi_env env, const Query &query, const AbilityCallbackInfo *info, napi_value jsObject)
665 {
666     if (info == nullptr) {
667         return;
668     }
669     CheckAbilityInfoCache(env, query, info->want, info->abilityInfos, jsObject);
670 }
671 
QueryAbilityInfosExec(napi_env env,void * data)672 void QueryAbilityInfosExec(napi_env env, void *data)
673 {
674     AbilityCallbackInfo *asyncCallbackInfo = reinterpret_cast<AbilityCallbackInfo *>(data);
675     if (asyncCallbackInfo == nullptr) {
676         APP_LOGE("asyncCallbackInfo is null");
677         return;
678     }
679     {
680         std::shared_lock<std::shared_mutex> lock(g_cacheMutex);
681         auto item = cache.find(Query(asyncCallbackInfo->want.ToString(),
682             QUERY_ABILITY_INFOS, asyncCallbackInfo->flags, asyncCallbackInfo->userId, env));
683         if (item != cache.end()) {
684             asyncCallbackInfo->isSavedInCache = true;
685             APP_LOGD("has cache, no need to query from host.");
686             return;
687         }
688     }
689     asyncCallbackInfo->err = InnerQueryAbilityInfos(asyncCallbackInfo->want, asyncCallbackInfo->flags,
690         asyncCallbackInfo->userId, asyncCallbackInfo->abilityInfos);
691 }
692 
QueryAbilityInfosComplete(napi_env env,napi_status status,void * data)693 void QueryAbilityInfosComplete(napi_env env, napi_status status, void *data)
694 {
695     AbilityCallbackInfo *asyncCallbackInfo = reinterpret_cast<AbilityCallbackInfo *>(data);
696     if (asyncCallbackInfo == nullptr) {
697         APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
698         return;
699     }
700     std::unique_ptr<AbilityCallbackInfo> callbackPtr {asyncCallbackInfo};
701     napi_value result[2] = {0};
702     if (asyncCallbackInfo->err == NO_ERROR) {
703         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
704         if (asyncCallbackInfo->isSavedInCache) {
705             std::shared_lock<std::shared_mutex> lock(g_cacheMutex);
706             auto item = cache.find(Query(asyncCallbackInfo->want.ToString(),
707                 QUERY_ABILITY_INFOS, asyncCallbackInfo->flags, asyncCallbackInfo->userId, env));
708             if (item == cache.end()) {
709                 APP_LOGE("cannot find result in cache in %{public}s", __func__);
710                 return;
711             }
712             NAPI_CALL_RETURN_VOID(env, napi_get_reference_value(env, item->second, &result[1]));
713         } else {
714             NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &result[1]));
715             CommonFunc::ConvertAbilityInfos(env, asyncCallbackInfo->abilityInfos, result[1]);
716             Query query(asyncCallbackInfo->want.ToString(),
717                 QUERY_ABILITY_INFOS, asyncCallbackInfo->flags, asyncCallbackInfo->userId, env);
718             CheckAbilityInfoCache(env, query, asyncCallbackInfo, result[1]);
719         }
720     } else {
721         result[0] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
722             QUERY_ABILITY_INFOS, BUNDLE_PERMISSIONS);
723     }
724     CommonFunc::NapiReturnDeferred<AbilityCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
725 }
726 
QueryAbilityInfos(napi_env env,napi_callback_info info)727 napi_value QueryAbilityInfos(napi_env env, napi_callback_info info)
728 {
729     APP_LOGD("begin to QueryAbilityInfos");
730     NapiArg args(env, info);
731     AbilityCallbackInfo *asyncCallbackInfo = new (std::nothrow) AbilityCallbackInfo(env);
732     if (asyncCallbackInfo == nullptr) {
733         APP_LOGE("asyncCallbackInfo is null");
734         return nullptr;
735     }
736     asyncCallbackInfo->userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
737     std::unique_ptr<AbilityCallbackInfo> callbackPtr {asyncCallbackInfo};
738     if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_FOUR)) {
739         APP_LOGE("param count invalid.");
740         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
741         return nullptr;
742     }
743     for (size_t i = 0; i < args.GetMaxArgc(); ++i) {
744         napi_valuetype valueType = napi_undefined;
745         napi_typeof(env, args[i], &valueType);
746         if ((i == ARGS_POS_ZERO) && (valueType == napi_object)) {
747             if (!CommonFunc::ParseWantPerformance(env, args[i], asyncCallbackInfo->want)) {
748                 APP_LOGE("invalid want");
749                 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, INVALID_WANT_ERROR);
750                 return nullptr;
751             }
752         } else if ((i == ARGS_POS_ONE) && (valueType == napi_number)) {
753             CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->flags);
754         } else if (i == ARGS_POS_TWO) {
755             if (valueType == napi_function) {
756                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
757                 break;
758             }
759             if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->userId)) {
760                 APP_LOGW("Parse userId failed, set this parameter to the caller userId!");
761             }
762         } else if (i == ARGS_POS_THREE) {
763             if (valueType == napi_function) {
764                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
765             }
766             break;
767         } else {
768             APP_LOGE("param check error");
769             std::string errMsg = PARAM_TYPE_CHECK_ERROR_WITH_POS + std::to_string(i + 1);
770             BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, errMsg);
771             return nullptr;
772         }
773     }
774     auto promise = CommonFunc::AsyncCallNativeMethod<AbilityCallbackInfo>(
775         env, asyncCallbackInfo, QUERY_ABILITY_INFOS, QueryAbilityInfosExec, QueryAbilityInfosComplete);
776     callbackPtr.release();
777     APP_LOGD("call QueryAbilityInfos done");
778     return promise;
779 }
780 
ParamsProcessQueryAbilityInfosSync(napi_env env,napi_callback_info info,OHOS::AAFwk::Want & want,int32_t & abilityFlags,int32_t & userId)781 ErrCode ParamsProcessQueryAbilityInfosSync(napi_env env, napi_callback_info info,
782     OHOS::AAFwk::Want& want, int32_t& abilityFlags, int32_t& userId)
783 {
784     NapiArg args(env, info);
785     if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_THREE)) {
786         APP_LOGE("param count invalid");
787         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
788         return ERROR_PARAM_CHECK_ERROR;
789     }
790     for (size_t i = 0; i < args.GetMaxArgc(); ++i) {
791         napi_valuetype valueType = napi_undefined;
792         napi_typeof(env, args[i], &valueType);
793         if (i == ARGS_POS_ZERO) {
794             if (!CommonFunc::ParseWantPerformance(env, args[i], want)) {
795                 APP_LOGE("invalid want");
796                 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, INVALID_WANT_ERROR);
797                 return ERROR_PARAM_CHECK_ERROR;
798             }
799         } else if (i == ARGS_POS_ONE) {
800             if (!CommonFunc::ParseInt(env, args[i], abilityFlags)) {
801                 APP_LOGE("abilityFlags %{public}d invalid!", abilityFlags);
802                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, ABILITY_FLAGS, TYPE_NUMBER);
803             }
804         } else if (i == ARGS_POS_TWO) {
805             if (!CommonFunc::ParseInt(env, args[i], userId)) {
806                 APP_LOGW("Parse userId failed, set this parameter to the caller userId!");
807             }
808         } else {
809             APP_LOGE("parameter is invalid");
810             BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
811             return ERROR_PARAM_CHECK_ERROR;
812         }
813     }
814     if (userId == Constants::UNSPECIFIED_USERID) {
815         userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
816     }
817     return ERR_OK;
818 }
819 
QueryAbilityInfosSync(napi_env env,napi_callback_info info)820 napi_value QueryAbilityInfosSync(napi_env env, napi_callback_info info)
821 {
822     APP_LOGD("NAPI QueryAbilityInfosSync call");
823     OHOS::AAFwk::Want want;
824     int32_t abilityFlags = 0;
825     int32_t userId = Constants::UNSPECIFIED_USERID;
826     if (ParamsProcessQueryAbilityInfosSync(env, info, want, abilityFlags, userId) != ERR_OK) {
827         APP_LOGE("paramsProcess is invalid");
828         BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
829         return nullptr;
830     }
831     napi_value nAbilityInfos = nullptr;
832     {
833         std::shared_lock<std::shared_mutex> lock(g_cacheMutex);
834         auto item = cache.find(Query(want.ToString(),
835             QUERY_ABILITY_INFOS_SYNC, abilityFlags, userId, env));
836         if (item != cache.end()) {
837             APP_LOGD("QueryAbilityInfosSync param from cache");
838             NAPI_CALL(env,
839                 napi_get_reference_value(env, item->second, &nAbilityInfos));
840             return nAbilityInfos;
841         }
842     }
843     auto iBundleMgr = CommonFunc::GetBundleMgr();
844     if (iBundleMgr == nullptr) {
845         APP_LOGE("can not get iBundleMgr");
846         BusinessError::ThrowError(env, ERROR_BUNDLE_SERVICE_EXCEPTION, ERR_MSG_BUNDLE_SERVICE_EXCEPTION);
847         return nullptr;
848     }
849     std::vector<AbilityInfo> abilityInfos;
850     ErrCode ret = CommonFunc::ConvertErrCode(
851         iBundleMgr->QueryAbilityInfosV9(want, abilityFlags, userId, abilityInfos));
852     if (ret != NO_ERROR) {
853         APP_LOGE("QueryAbilityInfosV9 failed");
854         napi_value businessError = BusinessError::CreateCommonError(
855             env, ret, QUERY_ABILITY_INFOS_SYNC, BUNDLE_PERMISSIONS);
856         napi_throw(env, businessError);
857         return nullptr;
858     }
859     NAPI_CALL(env, napi_create_array(env, &nAbilityInfos));
860     CommonFunc::ConvertAbilityInfos(env, abilityInfos, nAbilityInfos);
861     Query query(want.ToString(),
862                 QUERY_ABILITY_INFOS_SYNC, abilityFlags, userId, env);
863     CheckAbilityInfoCache(env, query, want, abilityInfos, nAbilityInfos);
864     APP_LOGD("call QueryAbilityInfosSync done");
865     return nAbilityInfos;
866 }
867 
InnerQueryExtensionInfos(ExtensionCallbackInfo * info)868 static ErrCode InnerQueryExtensionInfos(ExtensionCallbackInfo *info)
869 {
870     if (info == nullptr) {
871         APP_LOGE("ExtensionCallbackInfo is null");
872         return ERROR_BUNDLE_SERVICE_EXCEPTION;
873     }
874     auto iBundleMgr = CommonFunc::GetBundleMgr();
875     if (iBundleMgr == nullptr) {
876         APP_LOGE("iBundleMgr is null");
877         return ERROR_BUNDLE_SERVICE_EXCEPTION;
878     }
879     ErrCode ret = ERR_OK;
880     if (info->extensionAbilityType == static_cast<int32_t>(ExtensionAbilityType::UNSPECIFIED)) {
881         APP_LOGD("query extensionAbilityInfo without type");
882         ret = iBundleMgr->QueryExtensionAbilityInfosV9(info->want, info->flags, info->userId, info->extensionInfos);
883     } else {
884         ExtensionAbilityType type = static_cast<ExtensionAbilityType>(info->extensionAbilityType);
885         APP_LOGD("query extensionAbilityInfo with type %{public}d", info->extensionAbilityType);
886         ret = iBundleMgr->QueryExtensionAbilityInfosV9(
887             info->want, type, info->flags, info->userId, info->extensionInfos);
888     }
889     APP_LOGD("QueryExtensionAbilityInfosV9 ErrCode : %{public}d", ret);
890     return CommonFunc::ConvertErrCode(ret);
891 }
892 
HandleExtensionCache(napi_env env,const Query & query,const ExtensionCallbackInfo * info,napi_value jsObject)893 static void HandleExtensionCache(
894     napi_env env, const Query &query, const ExtensionCallbackInfo *info, napi_value jsObject)
895 {
896     if (info == nullptr) {
897         return;
898     }
899 
900     ElementName element = info->want.GetElement();
901     if (element.GetBundleName().empty() || element.GetAbilityName().empty()) {
902         return;
903     }
904 
905     uint32_t explicitQueryResultLen = 1;
906     if (info->extensionInfos.size() != explicitQueryResultLen ||
907         info->extensionInfos[0].uid != IPCSkeleton::GetCallingUid()) {
908         return;
909     }
910 
911     napi_ref cacheExtensionInfo = nullptr;
912     NAPI_CALL_RETURN_VOID(env, napi_create_reference(env, jsObject, NAPI_RETURN_ONE, &cacheExtensionInfo));
913     std::unique_lock<std::shared_mutex> lock(g_cacheMutex);
914     cache[query] = cacheExtensionInfo;
915 }
916 
QueryExtensionInfosExec(napi_env env,void * data)917 void QueryExtensionInfosExec(napi_env env, void *data)
918 {
919     ExtensionCallbackInfo *asyncCallbackInfo = reinterpret_cast<ExtensionCallbackInfo *>(data);
920     if (asyncCallbackInfo == nullptr) {
921         APP_LOGE("asyncCallbackInfo is null");
922         return;
923     }
924     {
925         std::shared_lock<std::shared_mutex> lock(g_cacheMutex);
926         std::string key = asyncCallbackInfo->want.ToString() + std::to_string(asyncCallbackInfo->extensionAbilityType);
927         auto item = cache.find(
928             Query(key, QUERY_EXTENSION_INFOS, asyncCallbackInfo->flags, asyncCallbackInfo->userId, env));
929         if (item != cache.end()) {
930             asyncCallbackInfo->isSavedInCache = true;
931             APP_LOGD("extension has cache, no need to query from host.");
932             return;
933         }
934     }
935     asyncCallbackInfo->err = InnerQueryExtensionInfos(asyncCallbackInfo);
936 }
937 
QueryExtensionInfosComplete(napi_env env,napi_status status,void * data)938 void QueryExtensionInfosComplete(napi_env env, napi_status status, void *data)
939 {
940     ExtensionCallbackInfo *asyncCallbackInfo = reinterpret_cast<ExtensionCallbackInfo *>(data);
941     if (asyncCallbackInfo == nullptr) {
942         APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
943         return;
944     }
945     std::unique_ptr<ExtensionCallbackInfo> callbackPtr {asyncCallbackInfo};
946     napi_value result[2] = {0};
947     if (asyncCallbackInfo->err == NO_ERROR) {
948         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
949         NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &result[1]));
950         std::string key = asyncCallbackInfo->want.ToString() + std::to_string(asyncCallbackInfo->extensionAbilityType);
951         Query query(key, QUERY_EXTENSION_INFOS, asyncCallbackInfo->flags, asyncCallbackInfo->userId, env);
952         if (asyncCallbackInfo->isSavedInCache) {
953             // get from cache
954             std::shared_lock<std::shared_mutex> lock(g_cacheMutex);
955             auto item = cache.find(query);
956             if (item != cache.end()) {
957                 NAPI_CALL_RETURN_VOID(env, napi_get_reference_value(env, item->second, &result[1]));
958             } else {
959                 APP_LOGE("extension not in cache");
960                 asyncCallbackInfo->isSavedInCache = false;
961             }
962         } else {
963             CommonFunc::ConvertExtensionInfos(env, asyncCallbackInfo->extensionInfos, result[1]);
964             // optionally save to cache
965             HandleExtensionCache(env, query, asyncCallbackInfo, result[1]);
966         }
967     } else {
968         result[0] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
969             QUERY_EXTENSION_INFOS, BUNDLE_PERMISSIONS);
970     }
971     CommonFunc::NapiReturnDeferred<ExtensionCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
972 }
973 
QueryExtensionInfos(napi_env env,napi_callback_info info)974 napi_value QueryExtensionInfos(napi_env env, napi_callback_info info)
975 {
976     APP_LOGD("begin to QueryExtensionInfos");
977     NapiArg args(env, info);
978     ExtensionCallbackInfo *asyncCallbackInfo = new (std::nothrow) ExtensionCallbackInfo(env);
979     if (asyncCallbackInfo == nullptr) {
980         APP_LOGE("asyncCallbackInfo is null");
981         return nullptr;
982     }
983     asyncCallbackInfo->userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
984     std::unique_ptr<ExtensionCallbackInfo> callbackPtr {asyncCallbackInfo};
985     if (!args.Init(ARGS_SIZE_THREE, ARGS_SIZE_FIVE)) {
986         APP_LOGE("param count invalid");
987         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
988         return nullptr;
989     }
990     for (size_t i = 0; i < args.GetMaxArgc(); ++i) {
991         napi_valuetype valueType = napi_undefined;
992         napi_typeof(env, args[i], &valueType);
993         if ((i == ARGS_POS_ZERO) && (valueType == napi_object)) {
994             if (!CommonFunc::ParseWant(env, args[i], asyncCallbackInfo->want)) {
995                 APP_LOGE("invalid want");
996                 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, INVALID_WANT_ERROR);
997                 return nullptr;
998             }
999         } else if ((i == ARGS_POS_ONE) && (valueType == napi_number)) {
1000             CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->extensionAbilityType);
1001         } else if ((i == ARGS_POS_TWO) && (valueType == napi_number)) {
1002             CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->flags);
1003         } else if (i == ARGS_POS_THREE) {
1004             if (valueType == napi_function) {
1005                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
1006                 break;
1007             }
1008             if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->userId)) {
1009                 APP_LOGW("Parse userId failed, set this parameter to the caller userId!");
1010             }
1011         } else if (i == ARGS_POS_FOUR) {
1012             if (valueType == napi_function) {
1013                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
1014             }
1015             break;
1016         } else {
1017             APP_LOGE("param check error");
1018             std::string errMsg = PARAM_TYPE_CHECK_ERROR_WITH_POS + std::to_string(i + 1);
1019             BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, errMsg);
1020             return nullptr;
1021         }
1022     }
1023     auto promise = CommonFunc::AsyncCallNativeMethod<ExtensionCallbackInfo>(
1024         env, asyncCallbackInfo, QUERY_EXTENSION_INFOS, QueryExtensionInfosExec, QueryExtensionInfosComplete);
1025     callbackPtr.release();
1026     APP_LOGD("call QueryExtensionInfos done");
1027     return promise;
1028 }
1029 
CreateAbilityFlagObject(napi_env env,napi_value value)1030 void CreateAbilityFlagObject(napi_env env, napi_value value)
1031 {
1032     napi_value nGetAbilityInfoDefault;
1033     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
1034         GetAbilityInfoFlag::GET_ABILITY_INFO_DEFAULT), &nGetAbilityInfoDefault));
1035     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_ABILITY_INFO_DEFAULT",
1036         nGetAbilityInfoDefault));
1037 
1038     napi_value nGetAbilityInfoWithPermission;
1039     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
1040         GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_PERMISSION), &nGetAbilityInfoWithPermission));
1041     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_ABILITY_INFO_WITH_PERMISSION",
1042         nGetAbilityInfoWithPermission));
1043 
1044     napi_value nGetAbilityInfoWithApplication;
1045     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
1046         GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_APPLICATION), &nGetAbilityInfoWithApplication));
1047     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_ABILITY_INFO_WITH_APPLICATION",
1048         nGetAbilityInfoWithApplication));
1049 
1050     napi_value nGetAbilityInfoWithMetadata;
1051     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
1052         GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_METADATA), &nGetAbilityInfoWithMetadata));
1053     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_ABILITY_INFO_WITH_METADATA",
1054         nGetAbilityInfoWithMetadata));
1055 
1056     napi_value nGetAbilityInfoWithDisabled;
1057     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
1058         GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_DISABLE), &nGetAbilityInfoWithDisabled));
1059     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_ABILITY_INFO_WITH_DISABLE",
1060         nGetAbilityInfoWithDisabled));
1061 
1062     napi_value nGetAbilityInfOnlySystemApp;
1063     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
1064         GetAbilityInfoFlag::GET_ABILITY_INFO_ONLY_SYSTEM_APP), &nGetAbilityInfOnlySystemApp));
1065     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_ABILITY_INFO_ONLY_SYSTEM_APP",
1066         nGetAbilityInfOnlySystemApp));
1067 }
1068 
GetAbilityLabelExec(napi_env env,void * data)1069 void GetAbilityLabelExec(napi_env env, void *data)
1070 {
1071     AbilityLabelCallbackInfo *asyncCallbackInfo = reinterpret_cast<AbilityLabelCallbackInfo *>(data);
1072     if (asyncCallbackInfo == nullptr) {
1073         APP_LOGE("%{public}s, asyncCallbackInfo == nullptr.", __func__);
1074         return;
1075     }
1076     asyncCallbackInfo->err = InnerGetAbilityLabel(asyncCallbackInfo->bundleName,
1077         asyncCallbackInfo->moduleName, asyncCallbackInfo->abilityName, asyncCallbackInfo->abilityLabel);
1078 }
1079 
GetAbilityLabelComplete(napi_env env,napi_status status,void * data)1080 void GetAbilityLabelComplete(napi_env env, napi_status status, void *data)
1081 {
1082     AbilityLabelCallbackInfo *asyncCallbackInfo = reinterpret_cast<AbilityLabelCallbackInfo *>(data);
1083     if (asyncCallbackInfo == nullptr) {
1084         APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
1085         return;
1086     }
1087     std::unique_ptr<AbilityLabelCallbackInfo> callbackPtr {asyncCallbackInfo};
1088     napi_value result[2] = {0};
1089     if (asyncCallbackInfo->err == NO_ERROR) {
1090         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
1091         NAPI_CALL_RETURN_VOID(env, napi_create_string_utf8(env, asyncCallbackInfo->abilityLabel.c_str(),
1092             NAPI_AUTO_LENGTH, &result[1]));
1093     } else {
1094         APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
1095         result[0] = BusinessError::CreateCommonError(
1096             env, asyncCallbackInfo->err, "GetAbilityLabel", Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
1097     }
1098     CommonFunc::NapiReturnDeferred<AbilityLabelCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
1099 }
1100 
GetAbilityLabel(napi_env env,napi_callback_info info)1101 napi_value GetAbilityLabel(napi_env env, napi_callback_info info)
1102 {
1103     APP_LOGD("begin to GetAbilityLabel");
1104 #ifdef GLOBAL_RESMGR_ENABLE
1105     NapiArg args(env, info);
1106     AbilityLabelCallbackInfo *asyncCallbackInfo = new (std::nothrow) AbilityLabelCallbackInfo(env);
1107     if (asyncCallbackInfo == nullptr) {
1108         APP_LOGE("asyncCallbackInfo is null.");
1109         return nullptr;
1110     }
1111     std::unique_ptr<AbilityLabelCallbackInfo> callbackPtr {asyncCallbackInfo};
1112     if (!args.Init(ARGS_SIZE_THREE, ARGS_SIZE_FOUR)) {
1113         APP_LOGE("Napi func init failed");
1114         return nullptr;
1115     }
1116     if (args.GetMaxArgc() >= ARGS_SIZE_THREE) {
1117         if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], asyncCallbackInfo->bundleName)) {
1118             BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
1119             return nullptr;
1120         }
1121         if (!CommonFunc::ParseString(env, args[ARGS_POS_ONE], asyncCallbackInfo->moduleName)) {
1122             BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, MODULE_NAME, TYPE_STRING);
1123             return nullptr;
1124         }
1125         if (!CommonFunc::ParseString(env, args[ARGS_POS_TWO], asyncCallbackInfo->abilityName)) {
1126             BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, ABILITY_NAME, TYPE_STRING);
1127             return nullptr;
1128         }
1129         if (args.GetMaxArgc() == ARGS_SIZE_FOUR) {
1130             napi_valuetype valueType = napi_undefined;
1131             napi_typeof(env, args[ARGS_POS_THREE], &valueType);
1132             if (valueType == napi_function) {
1133                 NAPI_CALL(env, napi_create_reference(env, args[ARGS_POS_THREE],
1134                     NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
1135             }
1136         }
1137     } else {
1138         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1139         return nullptr;
1140     }
1141     auto promise = CommonFunc::AsyncCallNativeMethod<AbilityLabelCallbackInfo>(
1142         env, asyncCallbackInfo, "GetAbilityLabel", GetAbilityLabelExec, GetAbilityLabelComplete);
1143     callbackPtr.release();
1144     APP_LOGD("call GetAbilityLabel done.");
1145     return promise;
1146 #else
1147     APP_LOGE("SystemCapability.BundleManager.BundleFramework.Resource not supported.");
1148     napi_value error = BusinessError::CreateCommonError(env, ERROR_SYSTEM_ABILITY_NOT_FOUND, "getAbilityLabel");
1149     napi_throw(env, error);
1150     return nullptr;
1151 #endif
1152 }
1153 
1154 #ifdef BUNDLE_FRAMEWORK_GET_ABILITY_ICON_ENABLED
GetAbilityIconExec(napi_env env,void * data)1155 void GetAbilityIconExec(napi_env env, void *data)
1156 {
1157     AbilityIconCallbackInfo *asyncCallbackInfo = reinterpret_cast<AbilityIconCallbackInfo *>(data);
1158     if (asyncCallbackInfo == nullptr) {
1159         APP_LOGE("%{public}s, asyncCallbackInfo == nullptr.", __func__);
1160         return;
1161     }
1162     asyncCallbackInfo->err = InnerGetAbilityIcon(asyncCallbackInfo->bundleName,
1163         asyncCallbackInfo->moduleName, asyncCallbackInfo->abilityName, asyncCallbackInfo->pixelMap);
1164 }
1165 
GetAbilityIconComplete(napi_env env,napi_status status,void * data)1166 void GetAbilityIconComplete(napi_env env, napi_status status, void *data)
1167 {
1168     AbilityIconCallbackInfo *asyncCallbackInfo = reinterpret_cast<AbilityIconCallbackInfo *>(data);
1169     if (asyncCallbackInfo == nullptr) {
1170         APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
1171         return;
1172     }
1173     std::unique_ptr<AbilityIconCallbackInfo> callbackPtr {asyncCallbackInfo};
1174     napi_value result[2] = {0};
1175     if (asyncCallbackInfo->err == NO_ERROR) {
1176         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
1177         result[1] = Media::PixelMapNapi::CreatePixelMap(env, asyncCallbackInfo->pixelMap);
1178     } else {
1179         APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
1180         result[0] = BusinessError::CreateCommonError(
1181             env, asyncCallbackInfo->err, "GetAbilityIcon", Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
1182     }
1183     CommonFunc::NapiReturnDeferred<AbilityIconCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
1184 }
1185 #endif
1186 
GetAbilityIcon(napi_env env,napi_callback_info info)1187 napi_value GetAbilityIcon(napi_env env, napi_callback_info info)
1188 {
1189     APP_LOGD("begin to GetAbilityIcon");
1190 #ifdef BUNDLE_FRAMEWORK_GET_ABILITY_ICON_ENABLED
1191     NapiArg args(env, info);
1192     AbilityIconCallbackInfo *asyncCallbackInfo = new (std::nothrow) AbilityIconCallbackInfo(env);
1193     if (asyncCallbackInfo == nullptr) {
1194         APP_LOGE("asyncCallbackInfo is null.");
1195         return nullptr;
1196     }
1197     std::unique_ptr<AbilityIconCallbackInfo> callbackPtr {asyncCallbackInfo};
1198     if (!args.Init(ARGS_SIZE_THREE, ARGS_SIZE_FOUR)) {
1199         APP_LOGE("Napi func init failed");
1200         return nullptr;
1201     }
1202 
1203     if (args.GetMaxArgc() >= ARGS_SIZE_THREE) {
1204         if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], asyncCallbackInfo->bundleName)) {
1205             BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
1206             return nullptr;
1207         }
1208         if (!CommonFunc::ParseString(env, args[ARGS_POS_ONE], asyncCallbackInfo->moduleName)) {
1209             BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, MODULE_NAME, TYPE_STRING);
1210             return nullptr;
1211         }
1212         if (!CommonFunc::ParseString(env, args[ARGS_POS_TWO], asyncCallbackInfo->abilityName)) {
1213             BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, ABILITY_NAME, TYPE_STRING);
1214             return nullptr;
1215         }
1216         if (args.GetMaxArgc() == ARGS_SIZE_FOUR) {
1217             napi_valuetype valueType = napi_undefined;
1218             napi_typeof(env, args[ARGS_POS_THREE], &valueType);
1219             if (valueType == napi_function) {
1220                 NAPI_CALL(env, napi_create_reference(env, args[ARGS_POS_THREE],
1221                     NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
1222             }
1223         }
1224     } else {
1225         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1226         return nullptr;
1227     }
1228     auto promise = CommonFunc::AsyncCallNativeMethod<AbilityIconCallbackInfo>(
1229         env, asyncCallbackInfo, "GetAbilityIcon", GetAbilityIconExec, GetAbilityIconComplete);
1230     callbackPtr.release();
1231     APP_LOGD("call GetAbilityIcon done.");
1232     return promise;
1233 #else
1234     APP_LOGE("SystemCapability.BundleManager.BundleFramework.Resource not supported.");
1235     napi_value error = BusinessError::CreateCommonError(env, ERROR_SYSTEM_ABILITY_NOT_FOUND, "getAbilityIcon");
1236     napi_throw(env, error);
1237     return nullptr;
1238 #endif
1239 }
1240 
SetApplicationEnabledExec(napi_env env,void * data)1241 void SetApplicationEnabledExec(napi_env env, void *data)
1242 {
1243     ApplicationEnableCallbackInfo *asyncCallbackInfo = reinterpret_cast<ApplicationEnableCallbackInfo *>(data);
1244     if (asyncCallbackInfo == nullptr) {
1245         APP_LOGE("%{public}s, asyncCallbackInfo == nullptr.", __func__);
1246         return;
1247     }
1248     asyncCallbackInfo->err = InnerSetApplicationEnabled(asyncCallbackInfo->bundleName,
1249         asyncCallbackInfo->isEnable);
1250 }
1251 
SetApplicationEnabledComplete(napi_env env,napi_status status,void * data)1252 void SetApplicationEnabledComplete(napi_env env, napi_status status, void *data)
1253 {
1254     ApplicationEnableCallbackInfo *asyncCallbackInfo = reinterpret_cast<ApplicationEnableCallbackInfo *>(data);
1255     if (asyncCallbackInfo == nullptr) {
1256         APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
1257         return;
1258     }
1259     std::unique_ptr<ApplicationEnableCallbackInfo> callbackPtr {asyncCallbackInfo};
1260     napi_value result[1] = {0};
1261     if (asyncCallbackInfo->err == NO_ERROR) {
1262         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
1263     } else {
1264         APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
1265         result[0] = BusinessError::CreateCommonError(
1266             env, asyncCallbackInfo->err, "SetApplicationEnabled", Constants::PERMISSION_CHANGE_ABILITY_ENABLED_STATE);
1267     }
1268     CommonFunc::NapiReturnDeferred<ApplicationEnableCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_ONE);
1269 }
1270 
SetApplicationEnabled(napi_env env,napi_callback_info info)1271 napi_value SetApplicationEnabled(napi_env env, napi_callback_info info)
1272 {
1273     APP_LOGD("begin to SetApplicationEnabled");
1274     NapiArg args(env, info);
1275     ApplicationEnableCallbackInfo *asyncCallbackInfo = new (std::nothrow) ApplicationEnableCallbackInfo(env);
1276     if (asyncCallbackInfo == nullptr) {
1277         APP_LOGE("asyncCallbackInfo is null.");
1278         return nullptr;
1279     }
1280     std::unique_ptr<ApplicationEnableCallbackInfo> callbackPtr {asyncCallbackInfo};
1281     if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_THREE)) {
1282         APP_LOGE("Napi func init failed");
1283         return nullptr;
1284     }
1285     if (args.GetMaxArgc() >= ARGS_SIZE_TWO) {
1286         if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], asyncCallbackInfo->bundleName)) {
1287             BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
1288             return nullptr;
1289         }
1290         if (!CommonFunc::ParseBool(env, args[ARGS_POS_ONE], asyncCallbackInfo->isEnable)) {
1291             BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, IS_ENABLE, TYPE_BOOLEAN);
1292             return nullptr;
1293         }
1294         if (args.GetMaxArgc() == ARGS_SIZE_THREE) {
1295             napi_valuetype valueType = napi_undefined;
1296             napi_typeof(env, args[ARGS_POS_TWO], &valueType);
1297             if (valueType == napi_function) {
1298                 NAPI_CALL(env, napi_create_reference(env, args[ARGS_POS_TWO],
1299                     NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
1300             }
1301         }
1302     } else {
1303         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1304         return nullptr;
1305     }
1306     auto promise = CommonFunc::AsyncCallNativeMethod<ApplicationEnableCallbackInfo>(
1307         env, asyncCallbackInfo, "SetApplicationEnabled", SetApplicationEnabledExec, SetApplicationEnabledComplete);
1308     callbackPtr.release();
1309     APP_LOGD("call SetApplicationEnabled done.");
1310     return promise;
1311 }
1312 
SetAbilityEnabledExec(napi_env env,void * data)1313 void SetAbilityEnabledExec(napi_env env, void *data)
1314 {
1315     AbilityEnableCallbackInfo *asyncCallbackInfo = reinterpret_cast<AbilityEnableCallbackInfo *>(data);
1316     if (asyncCallbackInfo == nullptr) {
1317         APP_LOGE("%{public}s, asyncCallbackInfo == nullptr.", __func__);
1318         return;
1319     }
1320     asyncCallbackInfo->err = InnerSetAbilityEnabled(asyncCallbackInfo->abilityInfo,
1321         asyncCallbackInfo->isEnable);
1322 }
1323 
SetAbilityEnabledComplete(napi_env env,napi_status status,void * data)1324 void SetAbilityEnabledComplete(napi_env env, napi_status status, void *data)
1325 {
1326     AbilityEnableCallbackInfo *asyncCallbackInfo = reinterpret_cast<AbilityEnableCallbackInfo *>(data);
1327     if (asyncCallbackInfo == nullptr) {
1328         APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
1329         return;
1330     }
1331     std::unique_ptr<AbilityEnableCallbackInfo> callbackPtr {asyncCallbackInfo};
1332     napi_value result[1] = {0};
1333     if (asyncCallbackInfo->err == NO_ERROR) {
1334         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
1335     } else {
1336         APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
1337         result[0] = BusinessError::CreateCommonError(
1338             env, asyncCallbackInfo->err, "SetAbilityEnabled", Constants::PERMISSION_CHANGE_ABILITY_ENABLED_STATE);
1339     }
1340     CommonFunc::NapiReturnDeferred<AbilityEnableCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_ONE);
1341 }
1342 
SetAbilityEnabled(napi_env env,napi_callback_info info)1343 napi_value SetAbilityEnabled(napi_env env, napi_callback_info info)
1344 {
1345     APP_LOGD("begin to SetAbilityEnabled");
1346     NapiArg args(env, info);
1347     AbilityEnableCallbackInfo *asyncCallbackInfo = new (std::nothrow) AbilityEnableCallbackInfo(env);
1348     if (asyncCallbackInfo == nullptr) {
1349         APP_LOGE("asyncCallbackInfo is null.");
1350         return nullptr;
1351     }
1352     std::unique_ptr<AbilityEnableCallbackInfo> callbackPtr {asyncCallbackInfo};
1353     if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_THREE)) {
1354         APP_LOGE("Napi func init failed");
1355         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1356         return nullptr;
1357     }
1358     if (args.GetMaxArgc() >= ARGS_SIZE_TWO) {
1359         if (!CommonFunc::ParseAbilityInfo(env, args[ARGS_POS_ZERO], asyncCallbackInfo->abilityInfo)) {
1360             BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, ABILITY_INFO, TYPE_OBJECT);
1361             return nullptr;
1362         }
1363         if (!CommonFunc::ParseBool(env, args[ARGS_POS_ONE], asyncCallbackInfo->isEnable)) {
1364             BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, IS_ENABLE, TYPE_BOOLEAN);
1365             return nullptr;
1366         }
1367         if (args.GetMaxArgc() == ARGS_SIZE_THREE) {
1368             napi_valuetype valueType = napi_undefined;
1369             napi_typeof(env, args[ARGS_POS_TWO], &valueType);
1370             if (valueType == napi_function) {
1371                 NAPI_CALL(env, napi_create_reference(env, args[ARGS_POS_TWO],
1372                     NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
1373             }
1374         }
1375     } else {
1376         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1377         return nullptr;
1378     }
1379     auto promise = CommonFunc::AsyncCallNativeMethod<AbilityEnableCallbackInfo>(
1380         env, asyncCallbackInfo, "SetAbilityEnabled", SetAbilityEnabledExec, SetAbilityEnabledComplete);
1381     callbackPtr.release();
1382     APP_LOGD("call SetAbilityEnabled done.");
1383     return promise;
1384 }
1385 
IsApplicationEnabledExec(napi_env env,void * data)1386 void IsApplicationEnabledExec(napi_env env, void *data)
1387 {
1388     ApplicationEnableCallbackInfo *asyncCallbackInfo = reinterpret_cast<ApplicationEnableCallbackInfo *>(data);
1389     if (asyncCallbackInfo == nullptr) {
1390         APP_LOGE("%{public}s, asyncCallbackInfo == nullptr.", __func__);
1391         return;
1392     }
1393     asyncCallbackInfo->err = InnerIsApplicationEnabled(asyncCallbackInfo->bundleName,
1394         asyncCallbackInfo->isEnable);
1395 }
1396 
IsApplicationEnabledComplete(napi_env env,napi_status status,void * data)1397 void IsApplicationEnabledComplete(napi_env env, napi_status status, void *data)
1398 {
1399     ApplicationEnableCallbackInfo *asyncCallbackInfo = reinterpret_cast<ApplicationEnableCallbackInfo *>(data);
1400     if (asyncCallbackInfo == nullptr) {
1401         APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
1402         return;
1403     }
1404     std::unique_ptr<ApplicationEnableCallbackInfo> callbackPtr {asyncCallbackInfo};
1405     napi_value result[ARGS_POS_TWO] = {0};
1406     if (asyncCallbackInfo->err == NO_ERROR) {
1407         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
1408         NAPI_CALL_RETURN_VOID(env, napi_get_boolean(env, asyncCallbackInfo->isEnable, &result[ARGS_POS_ONE]));
1409     } else {
1410         APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
1411         result[0] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err, "", "");
1412     }
1413     CommonFunc::NapiReturnDeferred<ApplicationEnableCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
1414 }
1415 
IsApplicationEnabled(napi_env env,napi_callback_info info)1416 napi_value IsApplicationEnabled(napi_env env, napi_callback_info info)
1417 {
1418     APP_LOGD("begin to IsApplicationEnabled");
1419     NapiArg args(env, info);
1420     ApplicationEnableCallbackInfo *asyncCallbackInfo = new (std::nothrow) ApplicationEnableCallbackInfo(env);
1421     if (asyncCallbackInfo == nullptr) {
1422         APP_LOGE("asyncCallbackInfo is null.");
1423         return nullptr;
1424     }
1425     std::unique_ptr<ApplicationEnableCallbackInfo> callbackPtr {asyncCallbackInfo};
1426     if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_TWO)) {
1427         APP_LOGE("Napi func init failed");
1428         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1429         return nullptr;
1430     }
1431     if (args.GetMaxArgc() >= ARGS_SIZE_ONE) {
1432         if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], asyncCallbackInfo->bundleName)) {
1433             BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
1434             return nullptr;
1435         }
1436         if (args.GetMaxArgc() == ARGS_POS_TWO) {
1437             napi_valuetype valueType = napi_undefined;
1438             napi_typeof(env, args[ARGS_POS_ONE], &valueType);
1439             if (valueType == napi_function) {
1440                 NAPI_CALL(env, napi_create_reference(env, args[ARGS_POS_ONE],
1441                     NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
1442             }
1443         }
1444     } else {
1445         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1446         return nullptr;
1447     }
1448     auto promise = CommonFunc::AsyncCallNativeMethod<ApplicationEnableCallbackInfo>(
1449         env, asyncCallbackInfo, "IsSetApplicationEnabled", IsApplicationEnabledExec, IsApplicationEnabledComplete);
1450     callbackPtr.release();
1451     APP_LOGD("call IsSetApplicationEnabled done.");
1452     return promise;
1453 }
1454 
IsAbilityEnabledExec(napi_env env,void * data)1455 void IsAbilityEnabledExec(napi_env env, void *data)
1456 {
1457     AbilityEnableCallbackInfo *asyncCallbackInfo = reinterpret_cast<AbilityEnableCallbackInfo *>(data);
1458     if (asyncCallbackInfo == nullptr) {
1459         APP_LOGE("%{public}s, asyncCallbackInfo == nullptr.", __func__);
1460         return;
1461     }
1462     asyncCallbackInfo->err = InnerIsAbilityEnabled(asyncCallbackInfo->abilityInfo,
1463         asyncCallbackInfo->isEnable);
1464 }
1465 
IsAbilityEnabledComplete(napi_env env,napi_status status,void * data)1466 void IsAbilityEnabledComplete(napi_env env, napi_status status, void *data)
1467 {
1468     AbilityEnableCallbackInfo *asyncCallbackInfo = reinterpret_cast<AbilityEnableCallbackInfo *>(data);
1469     if (asyncCallbackInfo == nullptr) {
1470         APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
1471         return;
1472     }
1473     std::unique_ptr<AbilityEnableCallbackInfo> callbackPtr {asyncCallbackInfo};
1474     napi_value result[ARGS_POS_TWO] = {0};
1475     if (asyncCallbackInfo->err == NO_ERROR) {
1476         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
1477         NAPI_CALL_RETURN_VOID(env, napi_get_boolean(env, asyncCallbackInfo->isEnable, &result[ARGS_POS_ONE]));
1478     } else {
1479         APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
1480         result[0] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err, "", "");
1481     }
1482     CommonFunc::NapiReturnDeferred<AbilityEnableCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
1483 }
1484 
IsAbilityEnabled(napi_env env,napi_callback_info info)1485 napi_value IsAbilityEnabled(napi_env env, napi_callback_info info)
1486 {
1487     APP_LOGI("begin to IsAbilityEnabled");
1488     NapiArg args(env, info);
1489     AbilityEnableCallbackInfo *asyncCallbackInfo = new (std::nothrow) AbilityEnableCallbackInfo(env);
1490     if (asyncCallbackInfo == nullptr) {
1491         APP_LOGE("asyncCallbackInfo is null.");
1492         return nullptr;
1493     }
1494     std::unique_ptr<AbilityEnableCallbackInfo> callbackPtr {asyncCallbackInfo};
1495     if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_TWO)) {
1496         APP_LOGE("Napi func init failed");
1497         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1498         return nullptr;
1499     }
1500     if (args.GetMaxArgc() >= ARGS_SIZE_ONE) {
1501         if (!CommonFunc::ParseAbilityInfo(env, args[ARGS_POS_ZERO], asyncCallbackInfo->abilityInfo)) {
1502             BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, ABILITY_INFO, TYPE_OBJECT);
1503             return nullptr;
1504         }
1505         if (args.GetMaxArgc() == ARGS_SIZE_TWO) {
1506             napi_valuetype valueType = napi_undefined;
1507             napi_typeof(env, args[ARGS_POS_ONE], &valueType);
1508             if (valueType == napi_function) {
1509                 NAPI_CALL(env, napi_create_reference(env, args[ARGS_POS_ONE],
1510                     NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
1511             }
1512         }
1513     } else {
1514         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1515         return nullptr;
1516     }
1517     auto promise = CommonFunc::AsyncCallNativeMethod<AbilityEnableCallbackInfo>(
1518         env, asyncCallbackInfo, "IsAbilityEnabled", IsAbilityEnabledExec, IsAbilityEnabledComplete);
1519     callbackPtr.release();
1520     APP_LOGD("call SetAbilityEnabled done.");
1521     return promise;
1522 }
1523 
InnerCleanBundleCacheCallback(const std::string & bundleName,const OHOS::sptr<CleanCacheCallback> & cleanCacheCallback)1524 static ErrCode InnerCleanBundleCacheCallback(
1525     const std::string& bundleName, const OHOS::sptr<CleanCacheCallback>& cleanCacheCallback)
1526 {
1527     if (cleanCacheCallback == nullptr) {
1528         APP_LOGE("callback nullptr");
1529         return ERROR_BUNDLE_SERVICE_EXCEPTION;
1530     }
1531     auto iBundleMgr = CommonFunc::GetBundleMgr();
1532     if (iBundleMgr == nullptr) {
1533         APP_LOGE("can not get iBundleMgr");
1534         return ERROR_BUNDLE_SERVICE_EXCEPTION;
1535     }
1536     int32_t userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
1537     ErrCode result = iBundleMgr->CleanBundleCacheFiles(bundleName, cleanCacheCallback, userId);
1538     if (result != ERR_OK) {
1539         APP_LOGE("CleanBundleDataFiles call error");
1540     }
1541     return CommonFunc::ConvertErrCode(result);
1542 }
1543 
CleanBundleCacheFilesExec(napi_env env,void * data)1544 void CleanBundleCacheFilesExec(napi_env env, void *data)
1545 {
1546     CleanBundleCacheCallbackInfo* asyncCallbackInfo = reinterpret_cast<CleanBundleCacheCallbackInfo*>(data);
1547     if (asyncCallbackInfo == nullptr) {
1548         APP_LOGE("error CleanBundleCacheCallbackInfo is nullptr");
1549         return;
1550     }
1551     if (asyncCallbackInfo->cleanCacheCallback == nullptr) {
1552         asyncCallbackInfo->cleanCacheCallback = new (std::nothrow) CleanCacheCallback();
1553     }
1554     asyncCallbackInfo->err =
1555         InnerCleanBundleCacheCallback(asyncCallbackInfo->bundleName, asyncCallbackInfo->cleanCacheCallback);
1556 }
1557 
CleanBundleCacheFilesComplete(napi_env env,napi_status status,void * data)1558 void CleanBundleCacheFilesComplete(napi_env env, napi_status status, void *data)
1559 {
1560     CleanBundleCacheCallbackInfo* asyncCallbackInfo = reinterpret_cast<CleanBundleCacheCallbackInfo*>(data);
1561     std::unique_ptr<CleanBundleCacheCallbackInfo> callbackPtr {asyncCallbackInfo};
1562     napi_value result[1] = { 0 };
1563     if ((asyncCallbackInfo->err == NO_ERROR) && (asyncCallbackInfo->cleanCacheCallback != nullptr)) {
1564         // wait for OnCleanCacheFinished
1565         uv_sem_wait(&(asyncCallbackInfo->cleanCacheCallback->uvSem_));
1566         asyncCallbackInfo->err = asyncCallbackInfo->cleanCacheCallback->GetErr() ?
1567             NO_ERROR : ERROR_BUNDLE_SERVICE_EXCEPTION;
1568     }
1569     // implement callback or promise
1570     if (asyncCallbackInfo->err == NO_ERROR) {
1571         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
1572     } else {
1573         result[0] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
1574             "CleanBundleCacheFiles", Constants::PERMISSION_REMOVECACHEFILE);
1575     }
1576     CommonFunc::NapiReturnDeferred<CleanBundleCacheCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_ONE);
1577 }
1578 
CleanBundleCacheFiles(napi_env env,napi_callback_info info)1579 napi_value CleanBundleCacheFiles(napi_env env, napi_callback_info info)
1580 {
1581     APP_LOGD("napi begin to CleanBundleCacheFiles");
1582     NapiArg args(env, info);
1583     CleanBundleCacheCallbackInfo *asyncCallbackInfo = new (std::nothrow) CleanBundleCacheCallbackInfo(env);
1584     if (asyncCallbackInfo == nullptr) {
1585         APP_LOGE("CleanBundleCacheFiles asyncCallbackInfo is null.");
1586         return nullptr;
1587     }
1588     std::unique_ptr<CleanBundleCacheCallbackInfo> callbackPtr {asyncCallbackInfo};
1589     if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_TWO)) {
1590         APP_LOGE("CleanBundleCacheFiles napi func init failed");
1591         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1592         return nullptr;
1593     }
1594     size_t maxArgc = args.GetMaxArgc();
1595     if (maxArgc >= ARGS_SIZE_ONE) {
1596         if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], asyncCallbackInfo->bundleName)) {
1597             APP_LOGE("CleanBundleCacheFiles bundleName is not a string!");
1598             BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, PARAMETER_BUNDLE_NAME, TYPE_STRING);
1599             return nullptr;
1600         }
1601         if (maxArgc >= ARGS_SIZE_TWO) {
1602             napi_valuetype valueType = napi_undefined;
1603             napi_typeof(env, args[ARGS_POS_ONE], &valueType);
1604             if (valueType == napi_function) {
1605                 NAPI_CALL(env, napi_create_reference(env, args[ARGS_POS_ONE],
1606                     NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
1607             }
1608         }
1609     } else {
1610         APP_LOGE("param error.");
1611         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1612         return nullptr;
1613     }
1614     auto promise = CommonFunc::AsyncCallNativeMethod<CleanBundleCacheCallbackInfo>(
1615         env, asyncCallbackInfo, "CleanBundleCacheFiles", CleanBundleCacheFilesExec, CleanBundleCacheFilesComplete);
1616     callbackPtr.release();
1617     APP_LOGD("napi call CleanBundleCacheFiles done");
1618     return promise;
1619 }
1620 
InnerGetLaunchWantForBundleExec(const std::string & bundleName,Want & want,int32_t userId)1621 static ErrCode InnerGetLaunchWantForBundleExec(
1622     const std::string& bundleName, Want &want, int32_t userId)
1623 {
1624     auto iBundleMgr = CommonFunc::GetBundleMgr();
1625     if (iBundleMgr == nullptr) {
1626         APP_LOGE("can not get iBundleMgr");
1627         return ERROR_BUNDLE_SERVICE_EXCEPTION;
1628     }
1629 
1630     ErrCode result = iBundleMgr->GetLaunchWantForBundle(bundleName, want, userId);
1631     if (result != ERR_OK) {
1632         APP_LOGE("GetLaunchWantForBundle call error");
1633     }
1634 
1635     return CommonFunc::ConvertErrCode(result);
1636 }
1637 
GetLaunchWantForBundleExec(napi_env env,void * data)1638 void GetLaunchWantForBundleExec(napi_env env, void *data)
1639 {
1640     LaunchWantCallbackInfo* asyncCallbackInfo = reinterpret_cast<LaunchWantCallbackInfo*>(data);
1641     if (asyncCallbackInfo == nullptr) {
1642         APP_LOGE("error LaunchWantCallbackInfo is nullptr");
1643         return;
1644     }
1645 
1646     asyncCallbackInfo->err = InnerGetLaunchWantForBundleExec(
1647         asyncCallbackInfo->bundleName, asyncCallbackInfo->want, asyncCallbackInfo->userId);
1648 }
1649 
GetLaunchWantForBundleComplete(napi_env env,napi_status status,void * data)1650 void GetLaunchWantForBundleComplete(napi_env env, napi_status status, void *data)
1651 {
1652     LaunchWantCallbackInfo *asyncCallbackInfo = reinterpret_cast<LaunchWantCallbackInfo *>(data);
1653     if (asyncCallbackInfo == nullptr) {
1654         APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
1655         return;
1656     }
1657 
1658     std::unique_ptr<LaunchWantCallbackInfo> callbackPtr {asyncCallbackInfo};
1659     napi_value result[ARGS_POS_TWO] = {0};
1660     if (asyncCallbackInfo->err == NO_ERROR) {
1661         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
1662         NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &result[1]));
1663         CommonFunc::ConvertWantInfo(env, result[1], asyncCallbackInfo->want);
1664     } else {
1665         result[0] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err, GET_LAUNCH_WANT_FOR_BUNDLE,
1666             Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
1667     }
1668 
1669     CommonFunc::NapiReturnDeferred<LaunchWantCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
1670 }
1671 
GetLaunchWantForBundle(napi_env env,napi_callback_info info)1672 napi_value GetLaunchWantForBundle(napi_env env, napi_callback_info info)
1673 {
1674     APP_LOGD("napi begin to GetLaunchWantForBundle");
1675     NapiArg args(env, info);
1676     LaunchWantCallbackInfo *asyncCallbackInfo = new (std::nothrow) LaunchWantCallbackInfo(env);
1677     if (asyncCallbackInfo == nullptr) {
1678         APP_LOGE("GetLaunchWantForBundle asyncCallbackInfo is null.");
1679         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1680         return nullptr;
1681     }
1682     asyncCallbackInfo->userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
1683     std::unique_ptr<LaunchWantCallbackInfo> callbackPtr {asyncCallbackInfo};
1684     if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_THREE)) {
1685         APP_LOGE("GetLaunchWantForBundle napi func init failed");
1686         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1687         return nullptr;
1688     }
1689     size_t maxArgc = args.GetMaxArgc();
1690     for (size_t i = 0; i < maxArgc; ++i) {
1691         napi_valuetype valueType = napi_undefined;
1692         napi_typeof(env, args[i], &valueType);
1693         if (i == ARGS_POS_ZERO) {
1694             if (valueType != napi_string) {
1695                 APP_LOGE("GetLaunchWantForBundle bundleName is not a string!");
1696                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, STRING_TYPE);
1697                 return nullptr;
1698             }
1699             CommonFunc::ParseString(env, args[i], asyncCallbackInfo->bundleName);
1700             if (asyncCallbackInfo->bundleName.size() == 0) {
1701                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, STRING_TYPE);
1702                 return nullptr;
1703             }
1704         } else if (i == ARGS_POS_ONE) {
1705             if (valueType == napi_function) {
1706                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
1707                 break;
1708             }
1709             if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->userId)) {
1710                 APP_LOGW("Parse userId failed, set this parameter to the caller userId!");
1711             }
1712         } else if (i == ARGS_POS_TWO) {
1713             if (valueType == napi_function) {
1714                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
1715                 break;
1716             }
1717         } else {
1718             APP_LOGE("GetLaunchWantForBundle arg err!");
1719             BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1720             return nullptr;
1721         }
1722     }
1723     auto promise = CommonFunc::AsyncCallNativeMethod<LaunchWantCallbackInfo>(
1724         env, asyncCallbackInfo, "GetLaunchWantForBundle", GetLaunchWantForBundleExec, GetLaunchWantForBundleComplete);
1725     callbackPtr.release();
1726     APP_LOGD("napi call GetLaunchWantForBundle done");
1727     return promise;
1728 }
1729 
GetAbilityFromBundleInfo(const BundleInfo & bundleInfo,const std::string & abilityName,const std::string & moduleName,AbilityInfo & targetAbilityInfo)1730 ErrCode GetAbilityFromBundleInfo(const BundleInfo& bundleInfo, const std::string& abilityName,
1731     const std::string& moduleName, AbilityInfo& targetAbilityInfo)
1732 {
1733     bool ifExists = false;
1734     for (const auto& hapModuleInfo : bundleInfo.hapModuleInfos) {
1735         for (const auto& abilityInfo : hapModuleInfo.abilityInfos) {
1736             if (abilityInfo.name == abilityName && abilityInfo.moduleName == moduleName) {
1737                 if (!abilityInfo.enabled) {
1738                     APP_LOGI("ability disabled");
1739                     return ERR_BUNDLE_MANAGER_ABILITY_DISABLED;
1740                 }
1741                 ifExists = true;
1742                 targetAbilityInfo = abilityInfo;
1743                 break;
1744             }
1745         }
1746         if (ifExists) {
1747             break;
1748         }
1749     }
1750     if (!ifExists) {
1751         APP_LOGE("ability not exist");
1752         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
1753     }
1754     return ERR_OK;
1755 }
1756 
GetExtensionFromBundleInfo(const BundleInfo & bundleInfo,const std::string & abilityName,const std::string & moduleName,ExtensionAbilityInfo & targetExtensionInfo)1757 ErrCode GetExtensionFromBundleInfo(const BundleInfo& bundleInfo, const std::string& abilityName,
1758     const std::string& moduleName, ExtensionAbilityInfo& targetExtensionInfo)
1759 {
1760     bool ifExists = false;
1761     for (const auto& hapModuleInfo : bundleInfo.hapModuleInfos) {
1762         for (const auto& extensionInfo : hapModuleInfo.extensionInfos) {
1763             if (extensionInfo.name == abilityName && extensionInfo.moduleName == moduleName) {
1764                 ifExists = true;
1765                 targetExtensionInfo = extensionInfo;
1766                 break;
1767             }
1768             if (!extensionInfo.enabled) {
1769                 APP_LOGI("extension disabled");
1770                 return ERR_BUNDLE_MANAGER_ABILITY_DISABLED;
1771             }
1772         }
1773         if (ifExists) {
1774             break;
1775         }
1776     }
1777     if (!ifExists) {
1778         APP_LOGE("ability not exist");
1779         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
1780     }
1781     return ERR_OK;
1782 }
1783 
InnerGetProfile(GetProfileCallbackInfo & info)1784 static ErrCode InnerGetProfile(GetProfileCallbackInfo &info)
1785 {
1786     auto iBundleMgr = CommonFunc::GetBundleMgr();
1787     if (iBundleMgr == nullptr) {
1788         APP_LOGE("can not get iBundleMgr");
1789         return ERROR_BUNDLE_SERVICE_EXCEPTION;
1790     }
1791 
1792     if (info.abilityName.empty()) {
1793         APP_LOGE("InnerGetProfile failed due to empty abilityName");
1794         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
1795     }
1796 
1797     if (info.moduleName.empty()) {
1798         APP_LOGE("InnerGetProfile failed due to empty moduleName");
1799         return ERR_BUNDLE_MANAGER_MODULE_NOT_EXIST;
1800     }
1801     auto baseFlag = static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE) +
1802            static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_METADATA) +
1803            static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_DISABLE);
1804     ErrCode result;
1805     BundleMgrClient client;
1806     BundleInfo bundleInfo;
1807     if (info.type == ProfileType::ABILITY_PROFILE) {
1808         auto getAbilityFlag = baseFlag +
1809             static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_ABILITY);
1810         result = iBundleMgr->GetBundleInfoForSelf(getAbilityFlag, bundleInfo);
1811         if (result != ERR_OK) {
1812             APP_LOGE("GetBundleInfoForSelf failed");
1813             return result;
1814         }
1815         AbilityInfo targetAbilityInfo;
1816         result = GetAbilityFromBundleInfo(
1817             bundleInfo, info.abilityName, info.moduleName, targetAbilityInfo);
1818         if (result != ERR_OK) {
1819             return result;
1820         }
1821         if (!client.GetProfileFromAbility(targetAbilityInfo, info.metadataName, info.profileVec)) {
1822             APP_LOGE("GetProfileFromExtension failed");
1823             return ERR_BUNDLE_MANAGER_PROFILE_NOT_EXIST;
1824         }
1825         return ERR_OK;
1826     }
1827 
1828     if (info.type == ProfileType::EXTENSION_PROFILE) {
1829         auto getExtensionFlag = baseFlag +
1830             static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_EXTENSION_ABILITY);
1831         result = iBundleMgr->GetBundleInfoForSelf(getExtensionFlag, bundleInfo);
1832         if (result != ERR_OK) {
1833             APP_LOGE("GetBundleInfoForSelf failed");
1834             return result;
1835         }
1836 
1837         ExtensionAbilityInfo targetExtensionInfo;
1838         result = GetExtensionFromBundleInfo(
1839             bundleInfo, info.abilityName, info.moduleName, targetExtensionInfo);
1840         if (result != ERR_OK) {
1841             return result;
1842         }
1843         if (!client.GetProfileFromExtension(targetExtensionInfo, info.metadataName, info.profileVec)) {
1844             APP_LOGE("GetProfileFromExtension failed");
1845             return ERR_BUNDLE_MANAGER_PROFILE_NOT_EXIST;
1846         }
1847         return ERR_OK;
1848     }
1849 
1850     APP_LOGE("InnerGetProfile failed due to type is invalid");
1851     return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
1852 }
1853 
GetProfileExec(napi_env env,void * data)1854 void GetProfileExec(napi_env env, void *data)
1855 {
1856     GetProfileCallbackInfo* asyncCallbackInfo = reinterpret_cast<GetProfileCallbackInfo*>(data);
1857     if (asyncCallbackInfo == nullptr) {
1858         APP_LOGE("error GetProfileCallbackInfo is nullptr");
1859         return;
1860     }
1861 
1862     ErrCode result = InnerGetProfile(*asyncCallbackInfo);
1863     asyncCallbackInfo->err = CommonFunc::ConvertErrCode(result);
1864 }
1865 
GetProfileComplete(napi_env env,napi_status status,void * data)1866 void GetProfileComplete(napi_env env, napi_status status, void *data)
1867 {
1868     GetProfileCallbackInfo *asyncCallbackInfo = reinterpret_cast<GetProfileCallbackInfo *>(data);
1869     if (asyncCallbackInfo == nullptr) {
1870         APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
1871         return;
1872     }
1873 
1874     std::unique_ptr<GetProfileCallbackInfo> callbackPtr {asyncCallbackInfo};
1875     napi_value result[ARGS_POS_TWO] = {0};
1876     if (asyncCallbackInfo->err == NO_ERROR) {
1877         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
1878         NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &result[1]));
1879         CommonFunc::ConvertStringArrays(env, asyncCallbackInfo->profileVec, result[1]);
1880     } else {
1881         result[0] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err, "", "");
1882     }
1883 
1884     CommonFunc::NapiReturnDeferred<GetProfileCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
1885 }
1886 
GetProfile(napi_env env,napi_callback_info info,const ProfileType & profileType)1887 napi_value GetProfile(napi_env env, napi_callback_info info, const ProfileType &profileType)
1888 {
1889     APP_LOGD("napi begin to GetProfile");
1890     NapiArg args(env, info);
1891     GetProfileCallbackInfo *asyncCallbackInfo = new (std::nothrow) GetProfileCallbackInfo(env);
1892     if (asyncCallbackInfo == nullptr) {
1893         APP_LOGE("GetProfile asyncCallbackInfo is null.");
1894         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1895         return nullptr;
1896     }
1897 
1898     asyncCallbackInfo->type = profileType;
1899     std::unique_ptr<GetProfileCallbackInfo> callbackPtr {asyncCallbackInfo};
1900     if (!args.Init(ARGS_POS_TWO, ARGS_SIZE_FOUR)) {
1901         APP_LOGE("GetProfile napi func init failed");
1902         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1903         return nullptr;
1904     }
1905     size_t maxArgc = args.GetMaxArgc();
1906     for (size_t i = 0; i < maxArgc; ++i) {
1907         napi_valuetype valueType = napi_undefined;
1908         napi_typeof(env, args[i], &valueType);
1909         if (i == ARGS_POS_ZERO) {
1910             if (valueType != napi_string) {
1911                 APP_LOGE("GetProfile moduleName is not a string!");
1912                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, MODULE_NAME, STRING_TYPE);
1913                 return nullptr;
1914             }
1915             CommonFunc::ParseString(env, args[i], asyncCallbackInfo->moduleName);
1916         } else if (i == ARGS_POS_ONE) {
1917             if (valueType != napi_string) {
1918                 APP_LOGE("GetProfile abilityName is not a string!");
1919                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, ABILITY_NAME, STRING_TYPE);
1920                 return nullptr;
1921             }
1922             CommonFunc::ParseString(env, args[i], asyncCallbackInfo->abilityName);
1923         } else if (i == ARGS_POS_TWO) {
1924             if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->metadataName)) {
1925                 APP_LOGW("Parse metadataName failed, The default value is undefined!");
1926             }
1927         } else if (i == ARGS_POS_THREE) {
1928             if (valueType == napi_function) {
1929                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
1930                 break;
1931             }
1932         } else {
1933             APP_LOGE("GetProfile arg err!");
1934             BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1935             return nullptr;
1936         }
1937     }
1938     auto promise = CommonFunc::AsyncCallNativeMethod<GetProfileCallbackInfo>(
1939         env, asyncCallbackInfo, "GetProfile", GetProfileExec, GetProfileComplete);
1940     callbackPtr.release();
1941     APP_LOGD("napi call GetProfile done");
1942     return promise;
1943 }
1944 
GetProfileByAbility(napi_env env,napi_callback_info info)1945 napi_value GetProfileByAbility(napi_env env, napi_callback_info info)
1946 {
1947     APP_LOGD("napi begin to GetProfileByAbility");
1948     return GetProfile(env, info, ProfileType::ABILITY_PROFILE);
1949 }
1950 
GetProfileByExAbility(napi_env env,napi_callback_info info)1951 napi_value GetProfileByExAbility(napi_env env, napi_callback_info info)
1952 {
1953     APP_LOGD("napi begin to GetProfileByExAbility");
1954     return GetProfile(env, info, ProfileType::EXTENSION_PROFILE);
1955 }
1956 
CreateExtensionAbilityFlagObject(napi_env env,napi_value value)1957 void CreateExtensionAbilityFlagObject(napi_env env, napi_value value)
1958 {
1959     napi_value nGetExtensionAbilityInfoDefault;
1960     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
1961         GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_DEFAULT), &nGetExtensionAbilityInfoDefault));
1962     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_EXTENSION_ABILITY_INFO_DEFAULT",
1963         nGetExtensionAbilityInfoDefault));
1964 
1965     napi_value nGetExtensionAbilityInfoWithPermission;
1966     NAPI_CALL_RETURN_VOID(env,
1967         napi_create_int32(env, static_cast<int32_t>(
1968             GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_PERMISSION),
1969             &nGetExtensionAbilityInfoWithPermission));
1970     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_EXTENSION_ABILITY_INFO_WITH_PERMISSION",
1971         nGetExtensionAbilityInfoWithPermission));
1972 
1973     napi_value nGetExtensionAbilityInfoWithApplication;
1974     NAPI_CALL_RETURN_VOID(env,
1975         napi_create_int32(env, static_cast<int32_t>(
1976             GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_APPLICATION),
1977             &nGetExtensionAbilityInfoWithApplication));
1978     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_EXTENSION_ABILITY_INFO_WITH_APPLICATION",
1979         nGetExtensionAbilityInfoWithApplication));
1980 
1981     napi_value nGetExtensionAbilityInfoWithMetadata;
1982     NAPI_CALL_RETURN_VOID(env,
1983         napi_create_int32(env, static_cast<int32_t>(
1984             GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_METADATA),
1985             &nGetExtensionAbilityInfoWithMetadata));
1986     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_EXTENSION_ABILITY_INFO_WITH_METADATA",
1987         nGetExtensionAbilityInfoWithMetadata));
1988 }
1989 
CreateExtensionAbilityTypeObject(napi_env env,napi_value value)1990 void CreateExtensionAbilityTypeObject(napi_env env, napi_value value)
1991 {
1992     napi_value nForm;
1993     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::FORM), &nForm));
1994     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "FORM", nForm));
1995 
1996     napi_value nWorkSchedule;
1997     NAPI_CALL_RETURN_VOID(env,
1998         napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::WORK_SCHEDULER), &nWorkSchedule));
1999     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "WORK_SCHEDULER", nWorkSchedule));
2000 
2001     napi_value nInputMethod;
2002     NAPI_CALL_RETURN_VOID(env,
2003         napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::INPUTMETHOD), &nInputMethod));
2004     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "INPUT_METHOD", nInputMethod));
2005 
2006     napi_value nService;
2007     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::SERVICE), &nService));
2008     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SERVICE", nService));
2009 
2010     napi_value nAccessibility;
2011     NAPI_CALL_RETURN_VOID(env,
2012         napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::ACCESSIBILITY), &nAccessibility));
2013     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "ACCESSIBILITY", nAccessibility));
2014 
2015     napi_value nDataShare;
2016     NAPI_CALL_RETURN_VOID(env,
2017         napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::DATASHARE), &nDataShare));
2018     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "DATA_SHARE", nDataShare));
2019 
2020     napi_value nFileShare;
2021     NAPI_CALL_RETURN_VOID(env,
2022         napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::FILESHARE), &nFileShare));
2023     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "FILE_SHARE", nFileShare));
2024 
2025     napi_value nStaticSubscriber;
2026     NAPI_CALL_RETURN_VOID(env,
2027         napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::STATICSUBSCRIBER), &nStaticSubscriber));
2028     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "STATIC_SUBSCRIBER", nStaticSubscriber));
2029 
2030     napi_value nWallpaper;
2031     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
2032         static_cast<int32_t>(ExtensionAbilityType::WALLPAPER), &nWallpaper));
2033     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "WALLPAPER", nWallpaper));
2034 
2035     napi_value nBackup;
2036     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
2037         static_cast<int32_t>(ExtensionAbilityType::BACKUP), &nBackup));
2038     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "BACKUP", nBackup));
2039 
2040     napi_value nWindow;
2041     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
2042         static_cast<int32_t>(ExtensionAbilityType::WINDOW), &nWindow));
2043     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "WINDOW", nWindow));
2044 
2045     napi_value nEnterpriseAdmin;
2046     NAPI_CALL_RETURN_VOID(env,
2047         napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::ENTERPRISE_ADMIN), &nEnterpriseAdmin));
2048     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "ENTERPRISE_ADMIN", nEnterpriseAdmin));
2049 
2050     napi_value nTHUMBNAIL;
2051     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
2052         static_cast<int32_t>(ExtensionAbilityType::THUMBNAIL), &nTHUMBNAIL));
2053     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "THUMBNAIL", nTHUMBNAIL));
2054 
2055     napi_value nPREVIEW;
2056     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
2057         static_cast<int32_t>(ExtensionAbilityType::PREVIEW), &nPREVIEW));
2058     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "PREVIEW", nPREVIEW));
2059 
2060     napi_value nPrint;
2061     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
2062         static_cast<int32_t>(ExtensionAbilityType::PRINT), &nPrint));
2063     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "PRINT", nPrint));
2064 
2065     napi_value nShare;
2066     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
2067         static_cast<int32_t>(ExtensionAbilityType::SHARE), &nShare));
2068     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SHARE", nShare));
2069 
2070     napi_value nAction;
2071     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
2072         static_cast<int32_t>(ExtensionAbilityType::ACTION), &nAction));
2073     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "ACTION", nAction));
2074 
2075     napi_value nAuthorization;
2076     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
2077         static_cast<int32_t>(ExtensionAbilityType::APP_ACCOUNT_AUTHORIZATION), &nAuthorization));
2078     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "APP_ACCOUNT_AUTHORIZATION", nAuthorization));
2079 
2080     napi_value nUI;
2081     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
2082         static_cast<int32_t>(ExtensionAbilityType::UI), &nUI));
2083     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "UI", nUI));
2084 
2085     napi_value nPush;
2086     NAPI_CALL_RETURN_VOID(env,
2087         napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::PUSH), &nPush));
2088     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "PUSH", nPush));
2089 
2090     napi_value nDriver;
2091     NAPI_CALL_RETURN_VOID(env,
2092         napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::DRIVER), &nDriver));
2093     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "DRIVER", nDriver));
2094 
2095     napi_value nUnspecified;
2096     NAPI_CALL_RETURN_VOID(env,
2097         napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::UNSPECIFIED), &nUnspecified));
2098     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "UNSPECIFIED", nUnspecified));
2099 
2100     napi_value nSysDialogUserAuth;
2101     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
2102         static_cast<int32_t>(ExtensionAbilityType::SYSDIALOG_USERAUTH), &nSysDialogUserAuth));
2103     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SYSDIALOG_USERAUTH", nSysDialogUserAuth));
2104 
2105     napi_value nSysDialogCommon;
2106     NAPI_CALL_RETURN_VOID(env,
2107         napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::SYSDIALOG_COMMON), &nSysDialogCommon));
2108     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SYSDIALOG_COMMON", nSysDialogCommon));
2109 
2110     napi_value nMediaControl;
2111     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
2112         static_cast<int32_t>(ExtensionAbilityType::SYSPICKER_MEDIACONTROL), &nMediaControl));
2113     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SYSPICKER_MEDIACONTROL", nMediaControl));
2114 
2115     napi_value nSysDialogAtomicServicePanel;
2116     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
2117         static_cast<int32_t>(ExtensionAbilityType::SYSDIALOG_ATOMICSERVICEPANEL), &nSysDialogAtomicServicePanel));
2118     NAPI_CALL_RETURN_VOID(env,
2119         napi_set_named_property(env, value, "SYSDIALOG_ATOMICSERVICEPANEL", nSysDialogAtomicServicePanel));
2120 
2121     napi_value nSysDialogPower;
2122     NAPI_CALL_RETURN_VOID(env,
2123         napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::SYSDIALOG_POWER), &nSysDialogPower));
2124     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SYSDIALOG_POWER", nSysDialogPower));
2125 
2126     napi_value nSysPickerShare;
2127     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
2128         static_cast<int32_t>(ExtensionAbilityType::SYSPICKER_SHARE), &nSysPickerShare));
2129     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SYSPICKER_SHARE", nSysPickerShare));
2130 
2131     napi_value nSysHmsAccount;
2132     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
2133         static_cast<int32_t>(ExtensionAbilityType::HMS_ACCOUNT), &nSysHmsAccount));
2134     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "HMS_ACCOUNT", nSysHmsAccount));
2135 
2136     napi_value nSysCommonUI;
2137     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
2138         static_cast<int32_t>(ExtensionAbilityType::SYS_COMMON_UI), &nSysCommonUI));
2139     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SYS_COMMON_UI", nSysCommonUI));
2140 }
2141 
CreateApplicationFlagObject(napi_env env,napi_value value)2142 void CreateApplicationFlagObject(napi_env env, napi_value value)
2143 {
2144     napi_value nGetApplicationInfoDefault;
2145     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
2146         GetApplicationFlag::GET_APPLICATION_INFO_DEFAULT), &nGetApplicationInfoDefault));
2147     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_APPLICATION_INFO_DEFAULT",
2148         nGetApplicationInfoDefault));
2149 
2150     napi_value nGetApplicationInfoWithPermission;
2151     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
2152         GetApplicationFlag::GET_APPLICATION_INFO_WITH_PERMISSION), &nGetApplicationInfoWithPermission));
2153     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_APPLICATION_INFO_WITH_PERMISSION",
2154         nGetApplicationInfoWithPermission));
2155 
2156     napi_value nGetApplicationInfoWithMetadata;
2157     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
2158         GetApplicationFlag::GET_APPLICATION_INFO_WITH_METADATA), &nGetApplicationInfoWithMetadata));
2159     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_APPLICATION_INFO_WITH_METADATA",
2160         nGetApplicationInfoWithMetadata));
2161 
2162     napi_value nGetApplicationInfoWithDisable;
2163     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
2164         GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE), &nGetApplicationInfoWithDisable));
2165     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_APPLICATION_INFO_WITH_DISABLE",
2166         nGetApplicationInfoWithDisable));
2167 }
2168 
InnerGetPermissionDef(const std::string & permissionName,PermissionDef & permissionDef)2169 static ErrCode InnerGetPermissionDef(const std::string &permissionName, PermissionDef &permissionDef)
2170 {
2171     auto iBundleMgr = CommonFunc::GetBundleMgr();
2172     if (iBundleMgr == nullptr) {
2173         APP_LOGE("can not get iBundleMgr");
2174         return ERROR_BUNDLE_SERVICE_EXCEPTION;
2175     }
2176     ErrCode ret = iBundleMgr->GetPermissionDef(permissionName, permissionDef);
2177     return CommonFunc::ConvertErrCode(ret);
2178 }
2179 
GetPermissionDefExec(napi_env env,void * data)2180 void GetPermissionDefExec(napi_env env, void *data)
2181 {
2182     AsyncPermissionDefineCallbackInfo *asyncCallbackInfo = reinterpret_cast<AsyncPermissionDefineCallbackInfo *>(data);
2183     if (asyncCallbackInfo == nullptr) {
2184         APP_LOGE("%{public}s, asyncCallbackInfo == nullptr.", __func__);
2185         return;
2186     }
2187     if (asyncCallbackInfo->err == NO_ERROR) {
2188         asyncCallbackInfo->err = InnerGetPermissionDef(asyncCallbackInfo->permissionName,
2189             asyncCallbackInfo->permissionDef);
2190     }
2191 }
2192 
GetPermissionDefComplete(napi_env env,napi_status status,void * data)2193 void GetPermissionDefComplete(napi_env env, napi_status status, void *data)
2194 {
2195     AsyncPermissionDefineCallbackInfo *asyncCallbackInfo = reinterpret_cast<AsyncPermissionDefineCallbackInfo *>(data);
2196     if (asyncCallbackInfo == nullptr) {
2197         APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
2198         return;
2199     }
2200     std::unique_ptr<AsyncPermissionDefineCallbackInfo> callbackPtr {asyncCallbackInfo};
2201     napi_value result[ARGS_SIZE_TWO] = {0};
2202     if (asyncCallbackInfo->err == NO_ERROR) {
2203         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
2204         NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &result[ARGS_POS_ONE]));
2205         CommonFunc::ConvertPermissionDef(env, result[ARGS_POS_ONE], asyncCallbackInfo->permissionDef);
2206     } else {
2207         result[0] = BusinessError::CreateCommonError(
2208             env, asyncCallbackInfo->err, GET_PERMISSION_DEF, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
2209     }
2210     CommonFunc::NapiReturnDeferred<AsyncPermissionDefineCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
2211 }
2212 
2213 /**
2214  * Promise and async callback
2215  */
GetPermissionDef(napi_env env,napi_callback_info info)2216 napi_value GetPermissionDef(napi_env env, napi_callback_info info)
2217 {
2218     APP_LOGD("GetPermissionDef called");
2219     NapiArg args(env, info);
2220     AsyncPermissionDefineCallbackInfo *asyncCallbackInfo = new (std::nothrow) AsyncPermissionDefineCallbackInfo(env);
2221     if (asyncCallbackInfo == nullptr) {
2222         APP_LOGE("asyncCallbackInfo is null.");
2223         return nullptr;
2224     }
2225     std::unique_ptr<AsyncPermissionDefineCallbackInfo> callbackPtr {asyncCallbackInfo};
2226     if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_TWO)) {
2227         APP_LOGE("param count invalid");
2228         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2229         return nullptr;
2230     }
2231     for (size_t i = 0; i < args.GetMaxArgc(); ++i) {
2232         napi_valuetype valuetype = napi_undefined;
2233         NAPI_CALL(env, napi_typeof(env, args[i], &valuetype));
2234         if (i == ARGS_POS_ZERO) {
2235             if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->permissionName)) {
2236                 APP_LOGE("permissionName invalid!");
2237                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, PERMISSION_NAME, TYPE_STRING);
2238                 return nullptr;
2239             }
2240         } else if (i == ARGS_POS_ONE) {
2241             if (valuetype == napi_function) {
2242                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
2243             } else {
2244                 APP_LOGD("GetPermissionDef extra arg ignored");
2245             }
2246         } else {
2247             APP_LOGE("GetPermissionDef arg err!");
2248             BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR);
2249             return nullptr;
2250         }
2251     }
2252 
2253     auto promise = CommonFunc::AsyncCallNativeMethod<AsyncPermissionDefineCallbackInfo>(
2254         env, asyncCallbackInfo, "GetPermissionDef", GetPermissionDefExec, GetPermissionDefComplete);
2255     callbackPtr.release();
2256     return promise;
2257 }
2258 
CheckToCache(napi_env env,int32_t uid,int32_t callingUid,const Query & query,napi_value jsObject)2259 static void CheckToCache(napi_env env, int32_t uid, int32_t callingUid, const Query &query, napi_value jsObject)
2260 {
2261     if (uid != callingUid) {
2262         APP_LOGD("uid %{public}d and callingUid %{public}d not equal", uid, callingUid);
2263         return;
2264     }
2265     APP_LOGD("put applicationInfo to cache");
2266     napi_ref cacheApplicationInfo = nullptr;
2267     NAPI_CALL_RETURN_VOID(env, napi_create_reference(env, jsObject, NAPI_RETURN_ONE, &cacheApplicationInfo));
2268     std::unique_lock<std::shared_mutex> lock(g_cacheMutex);
2269     cache[query] = cacheApplicationInfo;
2270 }
2271 
GetApplicationInfoSync(napi_env env,napi_callback_info info)2272 napi_value GetApplicationInfoSync(napi_env env, napi_callback_info info)
2273 {
2274     APP_LOGD("NAPI GetApplicationInfoSync call");
2275     NapiArg args(env, info);
2276     if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_THREE)) {
2277         APP_LOGE("param count invalid");
2278         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2279         return nullptr;
2280     }
2281     std::string bundleName;
2282     int32_t flags = 0;
2283     int32_t userId = Constants::UNSPECIFIED_USERID;
2284     for (size_t i = 0; i < args.GetArgc(); ++i) {
2285         napi_valuetype valueType = napi_undefined;
2286         napi_typeof(env, args[i], &valueType);
2287         if (i == ARGS_POS_ZERO) {
2288             if (!CommonFunc::ParseString(env, args[i], bundleName)) {
2289                 APP_LOGE("bundleName %{public}s invalid", bundleName.c_str());
2290                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
2291                 return nullptr;
2292             }
2293         } else if (i == ARGS_POS_ONE) {
2294             if (!CommonFunc::ParseInt(env, args[i], flags)) {
2295                 APP_LOGE("parseInt failed");
2296                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, APP_FLAGS, TYPE_NUMBER);
2297                 return nullptr;
2298             }
2299         } else if (i == ARGS_POS_TWO) {
2300             if (!CommonFunc::ParseInt(env, args[i], userId)) {
2301                 APP_LOGW("userId parseInt failed");
2302             }
2303         } else {
2304             APP_LOGE("parameter is invalid");
2305             BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
2306             return nullptr;
2307         }
2308     }
2309     if (bundleName.size() == 0) {
2310         napi_value businessError = BusinessError::CreateCommonError(
2311             env, ERROR_BUNDLE_NOT_EXIST, GET_BUNDLE_INFO_SYNC, BUNDLE_PERMISSIONS);
2312         napi_throw(env, businessError);
2313         return nullptr;
2314     }
2315     if (userId == Constants::UNSPECIFIED_USERID) {
2316         userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
2317     }
2318     napi_value nApplicationInfo = nullptr;
2319     {
2320         std::shared_lock<std::shared_mutex> lock(g_cacheMutex);
2321         auto item = cache.find(Query(bundleName, GET_APPLICATION_INFO, flags, userId, env));
2322         if (item != cache.end()) {
2323             APP_LOGD("getApplicationInfo param from cache");
2324             NAPI_CALL(env,
2325                 napi_get_reference_value(env, item->second, &nApplicationInfo));
2326             return nApplicationInfo;
2327         }
2328     }
2329     auto iBundleMgr = CommonFunc::GetBundleMgr();
2330     if (iBundleMgr == nullptr) {
2331         APP_LOGE("can not get iBundleMgr");
2332         return nullptr;
2333     }
2334     AppExecFwk::ApplicationInfo appInfo;
2335     ErrCode ret = CommonFunc::ConvertErrCode(
2336         iBundleMgr->GetApplicationInfoV9(bundleName, flags, userId, appInfo));
2337     if (ret != NO_ERROR) {
2338         APP_LOGE("GetApplicationInfo failed");
2339         napi_value businessError = BusinessError::CreateCommonError(
2340             env, ret, GET_BUNDLE_INFO_SYNC, BUNDLE_PERMISSIONS);
2341         napi_throw(env, businessError);
2342         return nullptr;
2343     }
2344     NAPI_CALL(env, napi_create_object(env, &nApplicationInfo));
2345     CommonFunc::ConvertApplicationInfo(env, nApplicationInfo, appInfo);
2346     Query query(bundleName, GET_APPLICATION_INFO, flags, userId, env);
2347     CheckToCache(env, appInfo.uid, IPCSkeleton::GetCallingUid(), query, nApplicationInfo);
2348     return nApplicationInfo;
2349 }
2350 
GetBundleInfoSync(napi_env env,napi_callback_info info)2351 napi_value GetBundleInfoSync(napi_env env, napi_callback_info info)
2352 {
2353     APP_LOGD("NAPI GetBundleInfoSync call");
2354     NapiArg args(env, info);
2355     if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_THREE)) {
2356         APP_LOGE("param count invalid");
2357         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2358         return nullptr;
2359     }
2360     std::string bundleName;
2361     int32_t flags = 0;
2362     int32_t userId = Constants::UNSPECIFIED_USERID;
2363     for (size_t i = 0; i < args.GetArgc(); ++i) {
2364         napi_valuetype valueType = napi_undefined;
2365         NAPI_CALL(env, napi_typeof(env, args[i], &valueType));
2366         if (i == ARGS_POS_ZERO) {
2367             if (!CommonFunc::ParseString(env, args[i], bundleName)) {
2368                 APP_LOGE("bundleName %{public}s invalid", bundleName.c_str());
2369                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
2370                 return nullptr;
2371             }
2372         } else if (i == ARGS_POS_ONE) {
2373             if (!CommonFunc::ParseInt(env, args[i], flags)) {
2374                 APP_LOGE("parseInt failed");
2375                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_FLAGS, TYPE_NUMBER);
2376                 return nullptr;
2377             }
2378         } else if (i == ARGS_POS_TWO) {
2379             if ((valueType == napi_number) && (!CommonFunc::ParseInt(env, args[i], userId))) {
2380                 APP_LOGE("parseInt failed");
2381                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, USER_ID, TYPE_NUMBER);
2382                 return nullptr;
2383             }
2384         } else {
2385             APP_LOGE("parameter is invalid");
2386             BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
2387             return nullptr;
2388         }
2389     }
2390     if (bundleName.size() == 0) {
2391         napi_value businessError = BusinessError::CreateCommonError(
2392             env, ERROR_BUNDLE_NOT_EXIST, GET_BUNDLE_INFO_SYNC, BUNDLE_PERMISSIONS);
2393         napi_throw(env, businessError);
2394         return nullptr;
2395     }
2396     if (userId == Constants::UNSPECIFIED_USERID) {
2397         userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
2398     }
2399     napi_value nBundleInfo = nullptr;
2400     {
2401         std::shared_lock<std::shared_mutex> lock(g_cacheMutex);
2402         auto item = cache.find(Query(bundleName, GET_BUNDLE_INFO, flags, userId, env));
2403         if (item != cache.end()) {
2404             APP_LOGD("GetBundleInfo param from cache");
2405             NAPI_CALL(env,
2406                 napi_get_reference_value(env, item->second, &nBundleInfo));
2407             return nBundleInfo;
2408         }
2409     }
2410     auto iBundleMgr = CommonFunc::GetBundleMgr();
2411     if (iBundleMgr == nullptr) {
2412         APP_LOGE("BundleMgr is null");
2413         return nullptr;
2414     }
2415     BundleInfo bundleInfo;
2416     ErrCode ret = CommonFunc::ConvertErrCode(iBundleMgr->GetBundleInfoV9(bundleName, flags, bundleInfo, userId));
2417     if (ret != NO_ERROR) {
2418         APP_LOGE("GetBundleInfo failed");
2419         napi_value businessError = BusinessError::CreateCommonError(
2420             env, ret, GET_BUNDLE_INFO_SYNC, BUNDLE_PERMISSIONS);
2421         napi_throw(env, businessError);
2422         return nullptr;
2423     }
2424     NAPI_CALL(env, napi_create_object(env,  &nBundleInfo));
2425     CommonFunc::ConvertBundleInfo(env, bundleInfo, nBundleInfo, flags);
2426     Query query(bundleName, GET_BUNDLE_INFO, flags, userId, env);
2427     CheckToCache(env, bundleInfo.uid, IPCSkeleton::GetCallingUid(), query, nBundleInfo);
2428     return nBundleInfo;
2429 }
2430 
InnerGetBundleInfos(int32_t flags,int32_t userId,std::vector<BundleInfo> & bundleInfos)2431 static ErrCode InnerGetBundleInfos(int32_t flags,
2432     int32_t userId, std::vector<BundleInfo> &bundleInfos)
2433 {
2434     auto iBundleMgr = CommonFunc::GetBundleMgr();
2435     if (iBundleMgr == nullptr) {
2436         APP_LOGE("iBundleMgr is null");
2437         return ERROR_BUNDLE_SERVICE_EXCEPTION;
2438     }
2439     ErrCode ret = iBundleMgr->GetBundleInfosV9(flags, bundleInfos, userId);
2440     return CommonFunc::ConvertErrCode(ret);
2441 }
2442 
CreateBundleFlagObject(napi_env env,napi_value value)2443 void CreateBundleFlagObject(napi_env env, napi_value value)
2444 {
2445     napi_value nBundleInfoDefault;
2446     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_DEFAULT),
2447         &nBundleInfoDefault));
2448     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_DEFAULT",
2449         nBundleInfoDefault));
2450 
2451     napi_value nGetBundleInfoWithApplication;
2452     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
2453         GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_APPLICATION), &nGetBundleInfoWithApplication));
2454     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_APPLICATION",
2455         nGetBundleInfoWithApplication));
2456 
2457     napi_value nGetBundleInfoWithHapModule;
2458     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
2459         GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE), &nGetBundleInfoWithHapModule));
2460     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_HAP_MODULE",
2461         nGetBundleInfoWithHapModule));
2462 
2463     napi_value nGetBundleInfoWithAbility;
2464     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
2465         GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_ABILITY), &nGetBundleInfoWithAbility));
2466     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_ABILITY",
2467         nGetBundleInfoWithAbility));
2468 
2469     napi_value nGetBundleInfoWithExtensionAbility;
2470     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
2471         GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_EXTENSION_ABILITY), &nGetBundleInfoWithExtensionAbility));
2472     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_EXTENSION_ABILITY",
2473         nGetBundleInfoWithExtensionAbility));
2474 
2475     napi_value nGetBundleInfoWithRequestedPermission;
2476     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
2477         GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_REQUESTED_PERMISSION), &nGetBundleInfoWithRequestedPermission));
2478     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_REQUESTED_PERMISSION",
2479         nGetBundleInfoWithRequestedPermission));
2480 
2481     napi_value nGetBundleInfoWithMetadata;
2482     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
2483         GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_METADATA), &nGetBundleInfoWithMetadata));
2484     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_METADATA",
2485         nGetBundleInfoWithMetadata));
2486 
2487     napi_value nGetBundleInfoWithDisable;
2488     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
2489         GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_DISABLE), &nGetBundleInfoWithDisable));
2490     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_DISABLE",
2491         nGetBundleInfoWithDisable));
2492 
2493     napi_value nGetBundleInfoWithSignatureInfo;
2494     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
2495         GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_SIGNATURE_INFO), &nGetBundleInfoWithSignatureInfo));
2496     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_SIGNATURE_INFO",
2497         nGetBundleInfoWithSignatureInfo));
2498 }
2499 
InnerGetBundleInfo(const std::string & bundleName,int32_t flags,int32_t userId,BundleInfo & bundleInfo)2500 static ErrCode InnerGetBundleInfo(const std::string &bundleName, int32_t flags,
2501     int32_t userId, BundleInfo &bundleInfo)
2502 {
2503     auto iBundleMgr = CommonFunc::GetBundleMgr();
2504     if (iBundleMgr == nullptr) {
2505         APP_LOGE("iBundleMgr is null");
2506         return ERROR_BUNDLE_SERVICE_EXCEPTION;
2507     }
2508     ErrCode ret = iBundleMgr->GetBundleInfoV9(bundleName, flags, bundleInfo, userId);
2509     return CommonFunc::ConvertErrCode(ret);
2510 }
2511 
InnerGetBundleInfoForSelf(int32_t flags,BundleInfo & bundleInfo)2512 static ErrCode InnerGetBundleInfoForSelf(int32_t flags, BundleInfo &bundleInfo)
2513 {
2514     auto iBundleMgr = CommonFunc::GetBundleMgr();
2515     if (iBundleMgr == nullptr) {
2516         APP_LOGE("iBundleMgr is null");
2517         return ERROR_BUNDLE_SERVICE_EXCEPTION;
2518     }
2519     ErrCode ret = iBundleMgr->GetBundleInfoForSelf(flags, bundleInfo);
2520     return CommonFunc::ConvertErrCode(ret);
2521 }
2522 
ProcessBundleInfos(napi_env env,napi_value result,const std::vector<BundleInfo> & bundleInfos,int32_t flags)2523 static void ProcessBundleInfos(
2524     napi_env env, napi_value result, const std::vector<BundleInfo> &bundleInfos, int32_t flags)
2525 {
2526     if (bundleInfos.size() == 0) {
2527         APP_LOGD("bundleInfos is null");
2528         return;
2529     }
2530     size_t index = 0;
2531     for (const auto &item : bundleInfos) {
2532         APP_LOGD("name{%s}, bundleName{%s} ", item.name.c_str(), item.name.c_str());
2533         napi_value objBundleInfo;
2534         NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &objBundleInfo));
2535         CommonFunc::ConvertBundleInfo(env, item, objBundleInfo, flags);
2536         NAPI_CALL_RETURN_VOID(env, napi_set_element(env, result, index, objBundleInfo));
2537         index++;
2538     }
2539 }
2540 
GetBundleInfosComplete(napi_env env,napi_status status,void * data)2541 void GetBundleInfosComplete(napi_env env, napi_status status, void *data)
2542 {
2543     BundleInfosCallbackInfo *asyncCallbackInfo =
2544         reinterpret_cast<BundleInfosCallbackInfo *>(data);
2545     if (asyncCallbackInfo == nullptr) {
2546         APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
2547         return;
2548     }
2549     std::unique_ptr<BundleInfosCallbackInfo> callbackPtr {asyncCallbackInfo};
2550     napi_value result[CALLBACK_PARAM_SIZE] = {0};
2551     if (asyncCallbackInfo->err == NO_ERROR) {
2552         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
2553         NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &result[ARGS_POS_ONE]));
2554         ProcessBundleInfos(env, result[ARGS_POS_ONE], asyncCallbackInfo->bundleInfos, asyncCallbackInfo->flags);
2555     } else {
2556         result[ARGS_POS_ZERO] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
2557             GET_BUNDLE_INFOS, Constants::PERMISSION_GET_INSTALLED_BUNDLE_LIST);
2558     }
2559     CommonFunc::NapiReturnDeferred<BundleInfosCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
2560 }
2561 
GetBundleInfoComplete(napi_env env,napi_status status,void * data)2562 void GetBundleInfoComplete(napi_env env, napi_status status, void *data)
2563 {
2564     BundleInfoCallbackInfo *asyncCallbackInfo =
2565         reinterpret_cast<BundleInfoCallbackInfo *>(data);
2566     if (asyncCallbackInfo == nullptr) {
2567         APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
2568         return;
2569     }
2570     std::unique_ptr<BundleInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
2571     napi_value result[CALLBACK_PARAM_SIZE] = {0};
2572     if (asyncCallbackInfo->err == NO_ERROR) {
2573         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
2574         if (asyncCallbackInfo->isSavedInCache) {
2575             std::shared_lock<std::shared_mutex> lock(g_cacheMutex);
2576             auto item = cache.find(Query(
2577                 asyncCallbackInfo->bundleName, GET_BUNDLE_INFO,
2578                 asyncCallbackInfo->flags, asyncCallbackInfo->userId, env));
2579             if (item == cache.end()) {
2580                 APP_LOGE("cannot find result in cache in %{public}s", __func__);
2581                 return;
2582             }
2583             NAPI_CALL_RETURN_VOID(env, napi_get_reference_value(env, item->second, &result[ARGS_POS_ONE]));
2584         } else {
2585             NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &result[ARGS_POS_ONE]));
2586             CommonFunc::ConvertBundleInfo(env,
2587                 asyncCallbackInfo->bundleInfo, result[ARGS_POS_ONE], asyncCallbackInfo->flags);
2588             Query query(
2589                 asyncCallbackInfo->bundleName, GET_BUNDLE_INFO,
2590                 asyncCallbackInfo->flags, asyncCallbackInfo->userId, env);
2591             CheckToCache(
2592                 env, asyncCallbackInfo->bundleInfo.uid, IPCSkeleton::GetCallingUid(), query, result[ARGS_POS_ONE]);
2593         }
2594     } else {
2595         result[ARGS_POS_ZERO] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
2596             GET_BUNDLE_INFO, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
2597     }
2598     CommonFunc::NapiReturnDeferred<BundleInfoCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
2599 }
2600 
GetBundleInfoExec(napi_env env,void * data)2601 void GetBundleInfoExec(napi_env env, void *data)
2602 {
2603     BundleInfoCallbackInfo *asyncCallbackInfo = reinterpret_cast<BundleInfoCallbackInfo *>(data);
2604     if (asyncCallbackInfo == nullptr) {
2605         APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
2606         return;
2607     }
2608     if (asyncCallbackInfo->err == NO_ERROR) {
2609         {
2610             std::shared_lock<std::shared_mutex> lock(g_cacheMutex);
2611             auto item = cache.find(Query(asyncCallbackInfo->bundleName,
2612                 GET_BUNDLE_INFO, asyncCallbackInfo->flags, asyncCallbackInfo->userId, env));
2613             if (item != cache.end()) {
2614                 asyncCallbackInfo->isSavedInCache = true;
2615                 APP_LOGD("GetBundleInfo param from cache");
2616                 return;
2617             }
2618         }
2619         asyncCallbackInfo->err = InnerGetBundleInfo(asyncCallbackInfo->bundleName,
2620             asyncCallbackInfo->flags, asyncCallbackInfo->userId, asyncCallbackInfo->bundleInfo);
2621     }
2622 }
2623 
GetBundleInfoForSelfExec(napi_env env,void * data)2624 void GetBundleInfoForSelfExec(napi_env env, void *data)
2625 {
2626     BundleInfoCallbackInfo *asyncCallbackInfo = reinterpret_cast<BundleInfoCallbackInfo *>(data);
2627     if (asyncCallbackInfo == nullptr) {
2628         APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
2629         return;
2630     }
2631     if (asyncCallbackInfo->err != NO_ERROR) {
2632         return;
2633     }
2634     auto uid = IPCSkeleton::GetCallingUid();
2635     asyncCallbackInfo->uid = uid;
2636     asyncCallbackInfo->bundleName = std::to_string(uid);
2637     asyncCallbackInfo->userId = uid / Constants::BASE_USER_RANGE;
2638     {
2639         std::shared_lock<std::shared_mutex> lock(g_cacheMutex);
2640         auto item = cache.find(Query(
2641             asyncCallbackInfo->bundleName, GET_BUNDLE_INFO,
2642             asyncCallbackInfo->flags, asyncCallbackInfo->userId, env));
2643         if (item != cache.end()) {
2644             asyncCallbackInfo->isSavedInCache = true;
2645             APP_LOGD("GetBundleInfo param from cache");
2646             return;
2647         }
2648     }
2649     asyncCallbackInfo->err = InnerGetBundleInfoForSelf(
2650         asyncCallbackInfo->flags, asyncCallbackInfo->bundleInfo);
2651 }
2652 
GetBundleInfo(napi_env env,napi_callback_info info)2653 napi_value GetBundleInfo(napi_env env, napi_callback_info info)
2654 {
2655     APP_LOGD("NAPI_GetBundleInfo called");
2656     NapiArg args(env, info);
2657     BundleInfoCallbackInfo *asyncCallbackInfo = new (std::nothrow) BundleInfoCallbackInfo(env);
2658     if (asyncCallbackInfo == nullptr) {
2659         APP_LOGE("asyncCallbackInfo is null.");
2660         return nullptr;
2661     }
2662     std::unique_ptr<BundleInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
2663     if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_FOUR)) {
2664         APP_LOGE("param count invalid.");
2665         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2666         return nullptr;
2667     }
2668     asyncCallbackInfo->uid = IPCSkeleton::GetCallingUid();
2669     asyncCallbackInfo->userId = asyncCallbackInfo->uid / Constants::BASE_USER_RANGE;
2670     if (args.GetMaxArgc() < ARGS_SIZE_TWO) {
2671         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2672         return nullptr;
2673     }
2674     for (size_t i = 0; i < args.GetMaxArgc(); i++) {
2675         napi_valuetype valueType = napi_undefined;
2676         napi_typeof(env, args[i], &valueType);
2677         if (i == ARGS_POS_ZERO) {
2678             if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->bundleName)) {
2679                 APP_LOGE("appId %{public}s invalid!", asyncCallbackInfo->bundleName.c_str());
2680                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
2681                 return nullptr;
2682             }
2683         } else if (i == ARGS_POS_ONE) {
2684             if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->flags)) {
2685                 APP_LOGE("Flags %{public}d invalid!", asyncCallbackInfo->flags);
2686                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_FLAGS, TYPE_NUMBER);
2687                 return nullptr;
2688             }
2689         } else if (i == ARGS_POS_TWO) {
2690             if (valueType == napi_function) {
2691                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
2692                 break;
2693             }
2694             if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->userId)) {
2695                 APP_LOGW("Parse userId failed, set this parameter to the caller userId!");
2696             }
2697         } else if (i == ARGS_POS_THREE) {
2698             if (valueType == napi_function) {
2699                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
2700             }
2701             break;
2702         } else {
2703             APP_LOGE("param check error");
2704             BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
2705             return nullptr;
2706         }
2707     }
2708     auto promise = CommonFunc::AsyncCallNativeMethod<BundleInfoCallbackInfo>(
2709         env, asyncCallbackInfo, GET_BUNDLE_INFO, GetBundleInfoExec, GetBundleInfoComplete);
2710     callbackPtr.release();
2711     APP_LOGD("call NAPI_GetBundleInfo done.");
2712     return promise;
2713 }
2714 
GetBundleInfosExec(napi_env env,void * data)2715 void GetBundleInfosExec(napi_env env, void *data)
2716 {
2717     BundleInfosCallbackInfo *asyncCallbackInfo = reinterpret_cast<BundleInfosCallbackInfo *>(data);
2718     if (asyncCallbackInfo == nullptr) {
2719         APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
2720         return;
2721     }
2722     asyncCallbackInfo->err = InnerGetBundleInfos(asyncCallbackInfo->flags,
2723         asyncCallbackInfo->userId, asyncCallbackInfo->bundleInfos);
2724 }
2725 
GetBundleInfos(napi_env env,napi_callback_info info)2726 napi_value GetBundleInfos(napi_env env, napi_callback_info info)
2727 {
2728     APP_LOGD("NAPI_GetBundleInfos called");
2729     NapiArg args(env, info);
2730     BundleInfosCallbackInfo *asyncCallbackInfo = new (std::nothrow) BundleInfosCallbackInfo(env);
2731     if (asyncCallbackInfo == nullptr) {
2732         APP_LOGE("asyncCallbackInfo is null.");
2733         return nullptr;
2734     }
2735     std::unique_ptr<BundleInfosCallbackInfo> callbackPtr {asyncCallbackInfo};
2736     if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_THREE)) {
2737         APP_LOGE("param count invalid.");
2738         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2739         return nullptr;
2740     }
2741     asyncCallbackInfo->userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
2742     if (args.GetMaxArgc() < ARGS_SIZE_ONE) {
2743         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2744         return nullptr;
2745     }
2746     for (size_t i = 0; i < args.GetMaxArgc(); ++i) {
2747         napi_valuetype valueType = napi_undefined;
2748         napi_typeof(env, args[i], &valueType);
2749         if (i == ARGS_POS_ZERO) {
2750             if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->flags)) {
2751                 APP_LOGE("Flags %{public}d invalid!", asyncCallbackInfo->flags);
2752                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_FLAGS, TYPE_NUMBER);
2753                 return nullptr;
2754             }
2755         } else if (i == ARGS_POS_ONE) {
2756             if (valueType == napi_function) {
2757                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
2758                 break;
2759             }
2760             if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->userId)) {
2761                 APP_LOGW("Parse userId failed, set this parameter to the caller userId!");
2762             }
2763         } else if (i == ARGS_POS_TWO) {
2764             if (valueType == napi_function) {
2765                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
2766                 break;
2767             }
2768         } else {
2769             APP_LOGE("param check error");
2770             BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
2771             return nullptr;
2772         }
2773     }
2774     auto promise = CommonFunc::AsyncCallNativeMethod<BundleInfosCallbackInfo>(
2775         env, asyncCallbackInfo, GET_BUNDLE_INFOS, GetBundleInfosExec, GetBundleInfosComplete);
2776     callbackPtr.release();
2777     APP_LOGD("call NAPI_GetBundleInfos done.");
2778     return promise;
2779 }
2780 
GetBundleInfoForSelf(napi_env env,napi_callback_info info)2781 napi_value GetBundleInfoForSelf(napi_env env, napi_callback_info info)
2782 {
2783     APP_LOGD("GetBundleInfoForSelf called");
2784     NapiArg args(env, info);
2785     BundleInfoCallbackInfo *asyncCallbackInfo = new (std::nothrow) BundleInfoCallbackInfo(env);
2786     if (asyncCallbackInfo == nullptr) {
2787         APP_LOGE("asyncCallbackInfo is null.");
2788         return nullptr;
2789     }
2790     std::unique_ptr<BundleInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
2791     if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_TWO)) {
2792         APP_LOGE("param count invalid.");
2793         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2794         return nullptr;
2795     }
2796     for (size_t i = 0; i < args.GetArgc(); ++i) {
2797         napi_valuetype valueType = napi_undefined;
2798         napi_typeof(env, args[i], &valueType);
2799         if (i == ARGS_POS_ZERO) {
2800             if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->flags)) {
2801                 APP_LOGE("Flags invalid!");
2802                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_FLAGS, TYPE_NUMBER);
2803                 return nullptr;
2804             }
2805         } else if (i == ARGS_POS_ONE) {
2806             if (valueType == napi_function) {
2807                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
2808             }
2809         } else {
2810             APP_LOGE("param check error");
2811             BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
2812             return nullptr;
2813         }
2814     }
2815     auto promise = CommonFunc::AsyncCallNativeMethod<BundleInfoCallbackInfo>(
2816         env, asyncCallbackInfo, "GetBundleInfoForSelf", GetBundleInfoForSelfExec, GetBundleInfoComplete);
2817     callbackPtr.release();
2818     APP_LOGD("call GetBundleInfoForSelf done.");
2819     return promise;
2820 }
2821 
InnerGetAllSharedBundleInfo(std::vector<SharedBundleInfo> & sharedBundles)2822 static ErrCode InnerGetAllSharedBundleInfo(std::vector<SharedBundleInfo> &sharedBundles)
2823 {
2824     auto iBundleMgr = CommonFunc::GetBundleMgr();
2825     if (iBundleMgr == nullptr) {
2826         APP_LOGE("iBundleMgr is null");
2827         return ERROR_BUNDLE_SERVICE_EXCEPTION;
2828     }
2829     ErrCode ret = iBundleMgr->GetAllSharedBundleInfo(sharedBundles);
2830     return CommonFunc::ConvertErrCode(ret);
2831 }
2832 
GetAllSharedBundleInfoExec(napi_env env,void * data)2833 void GetAllSharedBundleInfoExec(napi_env env, void *data)
2834 {
2835     SharedBundleCallbackInfo *asyncCallbackInfo = reinterpret_cast<SharedBundleCallbackInfo *>(data);
2836     if (asyncCallbackInfo == nullptr) {
2837         APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
2838         return;
2839     }
2840     asyncCallbackInfo->err = InnerGetAllSharedBundleInfo(asyncCallbackInfo->sharedBundles);
2841 }
2842 
GetAllSharedBundleInfoComplete(napi_env env,napi_status status,void * data)2843 void GetAllSharedBundleInfoComplete(napi_env env, napi_status status, void *data)
2844 {
2845     SharedBundleCallbackInfo *asyncCallbackInfo =
2846         reinterpret_cast<SharedBundleCallbackInfo *>(data);
2847     if (asyncCallbackInfo == nullptr) {
2848         APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
2849         return;
2850     }
2851     std::unique_ptr<SharedBundleCallbackInfo> callbackPtr {asyncCallbackInfo};
2852     napi_value result[CALLBACK_PARAM_SIZE] = {0};
2853     if (asyncCallbackInfo->err == NO_ERROR) {
2854         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
2855         NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &result[ARGS_POS_ONE]));
2856         CommonFunc::ConvertAllSharedBundleInfo(env, result[ARGS_POS_ONE], asyncCallbackInfo->sharedBundles);
2857     } else {
2858         result[ARGS_POS_ZERO] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
2859             GET_ALL_SHARED_BUNDLE_INFO, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
2860     }
2861     CommonFunc::NapiReturnDeferred<SharedBundleCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
2862 }
2863 
GetAllSharedBundleInfo(napi_env env,napi_callback_info info)2864 napi_value GetAllSharedBundleInfo(napi_env env, napi_callback_info info)
2865 {
2866     APP_LOGD("NAPI_GetAllSharedBundleInfo called");
2867     NapiArg args(env, info);
2868     SharedBundleCallbackInfo *asyncCallbackInfo = new (std::nothrow) SharedBundleCallbackInfo(env);
2869     if (asyncCallbackInfo == nullptr) {
2870         APP_LOGE("asyncCallbackInfo is null.");
2871         return nullptr;
2872     }
2873     std::unique_ptr<SharedBundleCallbackInfo> callbackPtr {asyncCallbackInfo};
2874     if (!args.Init(ARGS_SIZE_ZERO, ARGS_SIZE_ONE)) {
2875         APP_LOGE("param count invalid.");
2876         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2877         return nullptr;
2878     }
2879     if (args.GetMaxArgc() < ARGS_SIZE_ZERO) {
2880         APP_LOGE("param count invalid.");
2881         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2882         return nullptr;
2883     }
2884     for (size_t i = 0; i < args.GetMaxArgc(); ++i) {
2885         napi_valuetype valueType = napi_undefined;
2886         napi_typeof(env, args[i], &valueType);
2887         if (i == ARGS_POS_ZERO) {
2888             if (valueType == napi_function) {
2889                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
2890                 break;
2891             }
2892         } else {
2893             APP_LOGE("param check error");
2894             BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
2895             return nullptr;
2896         }
2897     }
2898     auto promise = CommonFunc::AsyncCallNativeMethod<SharedBundleCallbackInfo>(env, asyncCallbackInfo,
2899         GET_ALL_SHARED_BUNDLE_INFO, GetAllSharedBundleInfoExec, GetAllSharedBundleInfoComplete);
2900     callbackPtr.release();
2901     APP_LOGD("call NAPI_GetAllSharedBundleInfo done.");
2902     return promise;
2903 }
2904 
InnerGetSharedBundleInfo(const std::string & bundleName,const std::string & moduleName,std::vector<SharedBundleInfo> & sharedBundles)2905 static ErrCode InnerGetSharedBundleInfo(const std::string &bundleName, const std::string &moduleName,
2906     std::vector<SharedBundleInfo> &sharedBundles)
2907 {
2908     auto iBundleMgr = CommonFunc::GetBundleMgr();
2909     if (iBundleMgr == nullptr) {
2910         APP_LOGE("iBundleMgr is null");
2911         return ERROR_BUNDLE_SERVICE_EXCEPTION;
2912     }
2913     ErrCode ret = iBundleMgr->GetSharedBundleInfo(bundleName, moduleName, sharedBundles);
2914     return CommonFunc::ConvertErrCode(ret);
2915 }
2916 
GetSharedBundleInfoExec(napi_env env,void * data)2917 void GetSharedBundleInfoExec(napi_env env, void *data)
2918 {
2919     SharedBundleCallbackInfo *asyncCallbackInfo = reinterpret_cast<SharedBundleCallbackInfo *>(data);
2920     if (asyncCallbackInfo == nullptr) {
2921         APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
2922         return;
2923     }
2924     asyncCallbackInfo->err = InnerGetSharedBundleInfo(asyncCallbackInfo->bundleName, asyncCallbackInfo->moduleName,
2925         asyncCallbackInfo->sharedBundles);
2926 }
2927 
GetSharedBundleInfoComplete(napi_env env,napi_status status,void * data)2928 void GetSharedBundleInfoComplete(napi_env env, napi_status status, void *data)
2929 {
2930     SharedBundleCallbackInfo *asyncCallbackInfo =
2931         reinterpret_cast<SharedBundleCallbackInfo *>(data);
2932     if (asyncCallbackInfo == nullptr) {
2933         APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
2934         return;
2935     }
2936     std::unique_ptr<SharedBundleCallbackInfo> callbackPtr {asyncCallbackInfo};
2937     napi_value result[CALLBACK_PARAM_SIZE] = {0};
2938     if (asyncCallbackInfo->err == NO_ERROR) {
2939         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
2940         NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &result[ARGS_POS_ONE]));
2941         CommonFunc::ConvertAllSharedBundleInfo(env, result[ARGS_POS_ONE], asyncCallbackInfo->sharedBundles);
2942     } else {
2943         result[ARGS_POS_ZERO] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
2944             GET_SHARED_BUNDLE_INFO, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
2945     }
2946     CommonFunc::NapiReturnDeferred<SharedBundleCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
2947 }
2948 
GetSharedBundleInfo(napi_env env,napi_callback_info info)2949 napi_value GetSharedBundleInfo(napi_env env, napi_callback_info info)
2950 {
2951     APP_LOGD("NAPI_GetSharedBundleInfo called");
2952     NapiArg args(env, info);
2953     SharedBundleCallbackInfo *asyncCallbackInfo = new (std::nothrow) SharedBundleCallbackInfo(env);
2954     if (asyncCallbackInfo == nullptr) {
2955         APP_LOGE("asyncCallbackInfo is null.");
2956         return nullptr;
2957     }
2958     std::unique_ptr<SharedBundleCallbackInfo> callbackPtr {asyncCallbackInfo};
2959     if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_THREE)) {
2960         APP_LOGE("param count invalid.");
2961         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2962         return nullptr;
2963     }
2964     if (args.GetMaxArgc() < ARGS_SIZE_TWO) {
2965         APP_LOGE("param count invalid.");
2966         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2967         return nullptr;
2968     }
2969 
2970     for (size_t i = 0; i < args.GetMaxArgc(); i++) {
2971         napi_valuetype valueType = napi_undefined;
2972         napi_typeof(env, args[i], &valueType);
2973         if (i == ARGS_POS_ZERO) {
2974             if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->bundleName)) {
2975                 APP_LOGE("appId %{public}s invalid!", asyncCallbackInfo->bundleName.c_str());
2976                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
2977                 return nullptr;
2978             }
2979         } else if (i == ARGS_POS_ONE) {
2980             if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->moduleName)) {
2981                 APP_LOGE("appId %{public}s invalid!", asyncCallbackInfo->moduleName.c_str());
2982                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, MODULE_NAME, TYPE_STRING);
2983                 return nullptr;
2984             }
2985         } else if (i == ARGS_POS_TWO) {
2986             if (valueType == napi_function) {
2987                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
2988                 break;
2989             }
2990         } else {
2991             APP_LOGE("param check error");
2992             BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
2993             return nullptr;
2994         }
2995     }
2996 
2997     auto promise = CommonFunc::AsyncCallNativeMethod<SharedBundleCallbackInfo>(env, asyncCallbackInfo,
2998         GET_SHARED_BUNDLE_INFO, GetSharedBundleInfoExec, GetSharedBundleInfoComplete);
2999     callbackPtr.release();
3000     APP_LOGD("call NAPI_GetSharedBundleInfo done.");
3001     return promise;
3002 }
3003 
CreatePermissionGrantStateObject(napi_env env,napi_value value)3004 void CreatePermissionGrantStateObject(napi_env env, napi_value value)
3005 {
3006     napi_value nPermissionDenied;
3007     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, -1, &nPermissionDenied));
3008     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "PERMISSION_DENIED",
3009         nPermissionDenied));
3010 
3011     napi_value nPermissionGranted;
3012     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, 0, &nPermissionGranted));
3013     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "PERMISSION_GRANTED",
3014         nPermissionGranted));
3015 }
3016 
CreateAbilityTypeObject(napi_env env,napi_value value)3017 void CreateAbilityTypeObject(napi_env env, napi_value value)
3018 {
3019     napi_value nUnknow;
3020     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(AbilityType::UNKNOWN), &nUnknow));
3021     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "UNKNOWN", nUnknow));
3022     napi_value nPage;
3023     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(AbilityType::PAGE), &nPage));
3024     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "PAGE", nPage));
3025     napi_value nService;
3026     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(AbilityType::SERVICE), &nService));
3027     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SERVICE", nService));
3028     napi_value nData;
3029     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(AbilityType::DATA), &nData));
3030     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "DATA", nData));
3031 }
3032 
CreateBundleTypeObject(napi_env env,napi_value value)3033 void CreateBundleTypeObject(napi_env env, napi_value value)
3034 {
3035     napi_value nApp;
3036     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(BundleType::APP), &nApp));
3037     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "APP", nApp));
3038     napi_value nAtomicService;
3039     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3040         static_cast<int32_t>(BundleType::ATOMIC_SERVICE), &nAtomicService));
3041     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "ATOMIC_SERVICE", nAtomicService));
3042 }
3043 
CreateDisplayOrientationObject(napi_env env,napi_value value)3044 void CreateDisplayOrientationObject(napi_env env, napi_value value)
3045 {
3046     napi_value nUnspecified;
3047     NAPI_CALL_RETURN_VOID(
3048         env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::UNSPECIFIED), &nUnspecified));
3049     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "UNSPECIFIED", nUnspecified));
3050     napi_value nLandscape;
3051     NAPI_CALL_RETURN_VOID(
3052         env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::LANDSCAPE), &nLandscape));
3053     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "LANDSCAPE", nLandscape));
3054     napi_value nPortrait;
3055     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::PORTRAIT), &nPortrait));
3056     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "PORTRAIT", nPortrait));
3057     napi_value nFollowrecent;
3058     NAPI_CALL_RETURN_VOID(
3059         env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::FOLLOWRECENT), &nFollowrecent));
3060     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "FOLLOW_RECENT", nFollowrecent));
3061     napi_value nReverseLandscape;
3062     NAPI_CALL_RETURN_VOID(
3063         env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::LANDSCAPE_INVERTED), &nReverseLandscape));
3064     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "LANDSCAPE_INVERTED", nReverseLandscape));
3065     napi_value nReversePortrait;
3066     NAPI_CALL_RETURN_VOID(
3067         env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::PORTRAIT_INVERTED), &nReversePortrait));
3068     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "PORTRAIT_INVERTED", nReversePortrait));
3069     napi_value nAutoRotation;
3070     NAPI_CALL_RETURN_VOID(
3071         env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::AUTO_ROTATION), &nAutoRotation));
3072     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "AUTO_ROTATION", nAutoRotation));
3073     napi_value nAutoRotationLandscape;
3074     NAPI_CALL_RETURN_VOID(
3075         env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::AUTO_ROTATION_LANDSCAPE),
3076             &nAutoRotationLandscape));
3077     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "AUTO_ROTATION_LANDSCAPE", nAutoRotationLandscape));
3078     napi_value nAutoRotationPortrait;
3079     NAPI_CALL_RETURN_VOID(
3080         env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::AUTO_ROTATION_PORTRAIT),
3081             &nAutoRotationPortrait));
3082     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "AUTO_ROTATION_PORTRAIT", nAutoRotationPortrait));
3083     napi_value nAutoRotationRestricted;
3084     NAPI_CALL_RETURN_VOID(
3085         env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::AUTO_ROTATION_RESTRICTED),
3086             &nAutoRotationRestricted));
3087     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "AUTO_ROTATION_RESTRICTED",
3088         nAutoRotationRestricted));
3089     napi_value nAutoRotationLandscapeRestricted;
3090     NAPI_CALL_RETURN_VOID(
3091         env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::AUTO_ROTATION_LANDSCAPE_RESTRICTED),
3092             &nAutoRotationLandscapeRestricted));
3093     NAPI_CALL_RETURN_VOID(env,
3094         napi_set_named_property(env, value, "AUTO_ROTATION_LANDSCAPE_RESTRICTED", nAutoRotationLandscapeRestricted));
3095     napi_value nAutoRotationPortraitRestricted;
3096     NAPI_CALL_RETURN_VOID(
3097         env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::AUTO_ROTATION_PORTRAIT_RESTRICTED),
3098             &nAutoRotationPortraitRestricted));
3099     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "AUTO_ROTATION_PORTRAIT_RESTRICTED",
3100         nAutoRotationPortraitRestricted));
3101     napi_value nLocked;
3102     NAPI_CALL_RETURN_VOID(
3103         env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::LOCKED), &nLocked));
3104     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "LOCKED", nLocked));
3105 }
3106 
CreateLaunchTypeObject(napi_env env,napi_value value)3107 void CreateLaunchTypeObject(napi_env env, napi_value value)
3108 {
3109     napi_value nSingleton;
3110     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(LaunchMode::SINGLETON), &nSingleton));
3111     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SINGLETON", nSingleton));
3112     napi_value nStandard;
3113     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(LaunchMode::STANDARD), &nStandard));
3114     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "STANDARD", nStandard));
3115     napi_value nMultiton;
3116     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(LaunchMode::STANDARD), &nMultiton));
3117     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "MULTITON", nMultiton));
3118     napi_value nSpecified;
3119     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(LaunchMode::SPECIFIED), &nSpecified));
3120     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SPECIFIED", nSpecified));
3121 }
3122 
CreateSupportWindowModesObject(napi_env env,napi_value value)3123 void CreateSupportWindowModesObject(napi_env env, napi_value value)
3124 {
3125     napi_value nFullscreen;
3126     NAPI_CALL_RETURN_VOID(env,
3127         napi_create_int32(env, static_cast<int32_t>(SupportWindowMode::FULLSCREEN), &nFullscreen));
3128     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "FULL_SCREEN", nFullscreen));
3129 
3130     napi_value nSplit;
3131     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(SupportWindowMode::SPLIT), &nSplit));
3132     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SPLIT", nSplit));
3133 
3134     napi_value nFloat;
3135     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(SupportWindowMode::FLOATING), &nFloat));
3136     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "FLOATING", nFloat));
3137 }
3138 
CreateModuleTypeObject(napi_env env,napi_value value)3139 void CreateModuleTypeObject(napi_env env, napi_value value)
3140 {
3141     napi_value nUnknown;
3142     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(ModuleType::UNKNOWN), &nUnknown));
3143     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "UNKNOWN", nUnknown));
3144 
3145     napi_value nEntry;
3146     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(ModuleType::ENTRY), &nEntry));
3147     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "ENTRY", nEntry));
3148 
3149     napi_value nFeature;
3150     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(ModuleType::FEATURE), &nFeature));
3151     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "FEATURE", nFeature));
3152 
3153     napi_value nShared;
3154     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(ModuleType::SHARED), &nShared));
3155     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SHARED", nShared));
3156 }
3157 
CreateCompatiblePolicyObject(napi_env env,napi_value value)3158 void CreateCompatiblePolicyObject(napi_env env, napi_value value)
3159 {
3160     napi_value nNORMAL;
3161     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(CompatiblePolicy::NORMAL), &nNORMAL));
3162     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "NORMAL", nNORMAL));
3163 
3164     napi_value nBackwardCompatibility;
3165     NAPI_CALL_RETURN_VOID(env, napi_create_int32(
3166         env, static_cast<int32_t>(CompatiblePolicy::BACKWARD_COMPATIBILITY), &nBackwardCompatibility));
3167     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "BACKWARD_COMPATIBILITY", nBackwardCompatibility));
3168 }
3169 
InnerGetAppProvisionInfo(const std::string & bundleName,int32_t userId,AppProvisionInfo & appProvisionInfo)3170 ErrCode InnerGetAppProvisionInfo(
3171     const std::string &bundleName, int32_t userId, AppProvisionInfo &appProvisionInfo)
3172 {
3173     auto iBundleMgr = CommonFunc::GetBundleMgr();
3174     if (iBundleMgr == nullptr) {
3175         APP_LOGE("iBundleMgr is null");
3176         return ERROR_BUNDLE_SERVICE_EXCEPTION;
3177     }
3178     ErrCode ret = iBundleMgr->GetAppProvisionInfo(bundleName, userId, appProvisionInfo);
3179     return CommonFunc::ConvertErrCode(ret);
3180 }
3181 
GetAppProvisionInfoExec(napi_env env,void * data)3182 void GetAppProvisionInfoExec(napi_env env, void *data)
3183 {
3184     AppProvisionInfoCallbackInfo *asyncCallbackInfo = reinterpret_cast<AppProvisionInfoCallbackInfo *>(data);
3185     if (asyncCallbackInfo == nullptr) {
3186         APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
3187         return;
3188     }
3189     if (asyncCallbackInfo->err == NO_ERROR) {
3190         asyncCallbackInfo->err = InnerGetAppProvisionInfo(
3191             asyncCallbackInfo->bundleName, asyncCallbackInfo->userId, asyncCallbackInfo->appProvisionInfo);
3192     }
3193 }
3194 
GetAppProvisionInfoComplete(napi_env env,napi_status status,void * data)3195 void GetAppProvisionInfoComplete(napi_env env, napi_status status, void *data)
3196 {
3197     AppProvisionInfoCallbackInfo *asyncCallbackInfo =
3198         reinterpret_cast<AppProvisionInfoCallbackInfo *>(data);
3199     if (asyncCallbackInfo == nullptr) {
3200         APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
3201         return;
3202     }
3203     std::unique_ptr<AppProvisionInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
3204     napi_value result[CALLBACK_PARAM_SIZE] = {0};
3205     if (asyncCallbackInfo->err == NO_ERROR) {
3206         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
3207         NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &result[ARGS_POS_ONE]));
3208         CommonFunc::ConvertAppProvisionInfo(env, asyncCallbackInfo->appProvisionInfo, result[ARGS_POS_ONE]);
3209     } else {
3210         result[ARGS_POS_ZERO] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
3211             GET_APP_PROVISION_INFO, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
3212     }
3213     CommonFunc::NapiReturnDeferred<AppProvisionInfoCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
3214 }
3215 
GetAppProvisionInfo(napi_env env,napi_callback_info info)3216 napi_value GetAppProvisionInfo(napi_env env, napi_callback_info info)
3217 {
3218     APP_LOGD("napi GetAppProvisionInfo called");
3219     NapiArg args(env, info);
3220     AppProvisionInfoCallbackInfo *asyncCallbackInfo = new (std::nothrow) AppProvisionInfoCallbackInfo(env);
3221     if (asyncCallbackInfo == nullptr) {
3222         APP_LOGE("asyncCallbackInfo is null.");
3223         return nullptr;
3224     }
3225     std::unique_ptr<AppProvisionInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
3226     if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_THREE)) {
3227         APP_LOGE("param count invalid.");
3228         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
3229         return nullptr;
3230     }
3231     asyncCallbackInfo->userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
3232     for (size_t i = 0; i < args.GetArgc(); ++i) {
3233         napi_valuetype valueType = napi_undefined;
3234         napi_typeof(env, args[i], &valueType);
3235         if (i == ARGS_POS_ZERO) {
3236             if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->bundleName)) {
3237                 APP_LOGE("bundleName invalid!");
3238                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
3239                 return nullptr;
3240             }
3241         } else if (i == ARGS_POS_ONE) {
3242             if (valueType == napi_function) {
3243                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
3244                 break;
3245             }
3246             if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->userId)) {
3247                 APP_LOGW("parse userId failed, set this parameter to the caller userId.");
3248             }
3249         } else if (i == ARGS_POS_TWO) {
3250             if (valueType == napi_function) {
3251                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
3252                 break;
3253             }
3254         } else {
3255             APP_LOGE("param check error");
3256             BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
3257             return nullptr;
3258         }
3259     }
3260 
3261     auto promise = CommonFunc::AsyncCallNativeMethod<AppProvisionInfoCallbackInfo>(
3262         env, asyncCallbackInfo, GET_APP_PROVISION_INFO, GetAppProvisionInfoExec, GetAppProvisionInfoComplete);
3263     callbackPtr.release();
3264     APP_LOGD("call GetAppProvisionInfo done.");
3265     return promise;
3266 }
3267 
GetSpecifiedDistributionType(napi_env env,napi_callback_info info)3268 napi_value GetSpecifiedDistributionType(napi_env env, napi_callback_info info)
3269 {
3270     APP_LOGD("GetSpecifiedDistributionType napi called");
3271     NapiArg args(env, info);
3272     if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_ONE)) {
3273         APP_LOGE("param count invalid.");
3274         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
3275         return nullptr;
3276     }
3277 
3278     std::string bundleName;
3279     if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], bundleName)) {
3280         APP_LOGE("bundleName invalid!");
3281         BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
3282         return nullptr;
3283     }
3284 
3285     auto iBundleMgr = CommonFunc::GetBundleMgr();
3286     if (iBundleMgr == nullptr) {
3287         APP_LOGE("iBundleMgr is null");
3288         napi_value businessError = BusinessError::CreateCommonError(
3289             env, ERROR_BUNDLE_SERVICE_EXCEPTION, RESOURCE_NAME_OF_GET_SPECIFIED_DISTRIBUTION_TYPE,
3290             Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
3291         napi_throw(env, businessError);
3292         return nullptr;
3293     }
3294 
3295     std::string specifiedDistributionType;
3296     ErrCode ret = CommonFunc::ConvertErrCode(
3297         iBundleMgr->GetSpecifiedDistributionType(bundleName, specifiedDistributionType));
3298     if (ret != SUCCESS) {
3299         napi_value businessError = BusinessError::CreateCommonError(
3300             env, ret, RESOURCE_NAME_OF_GET_SPECIFIED_DISTRIBUTION_TYPE,
3301             Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
3302         napi_throw(env, businessError);
3303         return nullptr;
3304     }
3305 
3306     napi_value nSpecifiedDistributionType;
3307     napi_create_string_utf8(env, specifiedDistributionType.c_str(), NAPI_AUTO_LENGTH, &nSpecifiedDistributionType);
3308     APP_LOGD("call GetSpecifiedDistributionType done.");
3309     return nSpecifiedDistributionType;
3310 }
3311 
GetAdditionalInfo(napi_env env,napi_callback_info info)3312 napi_value GetAdditionalInfo(napi_env env, napi_callback_info info)
3313 {
3314     APP_LOGD("GetAdditionalInfo napi called");
3315     NapiArg args(env, info);
3316     if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_ONE)) {
3317         APP_LOGE("param count invalid.");
3318         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
3319         return nullptr;
3320     }
3321 
3322     std::string bundleName;
3323     if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], bundleName)) {
3324         APP_LOGE("bundleName invalid!");
3325         BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
3326         return nullptr;
3327     }
3328 
3329     auto iBundleMgr = CommonFunc::GetBundleMgr();
3330     if (iBundleMgr == nullptr) {
3331         APP_LOGE("iBundleMgr is null");
3332         napi_value businessError = BusinessError::CreateCommonError(
3333             env, ERROR_BUNDLE_SERVICE_EXCEPTION, RESOURCE_NAME_OF_GET_SPECIFIED_DISTRIBUTION_TYPE,
3334             Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
3335         napi_throw(env, businessError);
3336         return nullptr;
3337     }
3338 
3339     std::string additionalInfo;
3340     ErrCode ret = CommonFunc::ConvertErrCode(
3341         iBundleMgr->GetAdditionalInfo(bundleName, additionalInfo));
3342     if (ret != SUCCESS) {
3343         napi_value businessError = BusinessError::CreateCommonError(
3344             env, ret, RESOURCE_NAME_OF_GET_ADDITIONAL_INFO, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
3345         napi_throw(env, businessError);
3346         return nullptr;
3347     }
3348 
3349     napi_value nAdditionalInfo;
3350     napi_create_string_utf8(env, additionalInfo.c_str(), NAPI_AUTO_LENGTH, &nAdditionalInfo);
3351     APP_LOGD("call GetAdditionalInfo done.");
3352     return nAdditionalInfo;
3353 }
3354 
GetBundleInfoForSelfSync(napi_env env,napi_callback_info info)3355 napi_value GetBundleInfoForSelfSync(napi_env env, napi_callback_info info)
3356 {
3357     APP_LOGD("GetBundleInfoForSelfSync called");
3358     NapiArg args(env, info);
3359     if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_ONE)) {
3360         APP_LOGE("param count invalid");
3361         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
3362         return nullptr;
3363     }
3364     int32_t flags = 0;
3365     if (!CommonFunc::ParseInt(env, args[ARGS_POS_ZERO], flags)) {
3366         APP_LOGE("parseInt invalid!");
3367         BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_FLAGS, TYPE_NUMBER);
3368         return nullptr;
3369     }
3370     auto iBundleMgr = CommonFunc::GetBundleMgr();
3371     if (iBundleMgr == nullptr) {
3372         APP_LOGE("BundleMgr is null");
3373         return nullptr;
3374     }
3375     std::string bundleName;
3376     auto uid = IPCSkeleton::GetCallingUid();
3377     bundleName = std::to_string(uid);
3378     int32_t userId = uid / Constants::BASE_USER_RANGE;
3379     napi_value nBundleInfo = nullptr;
3380     {
3381         std::shared_lock<std::shared_mutex> lock(g_cacheMutex);
3382         auto item = cache.find(Query(bundleName, GET_BUNDLE_INFO, flags, userId, env));
3383         if (item != cache.end()) {
3384             APP_LOGD("GetBundleInfo param from cache");
3385             NAPI_CALL(env,
3386                 napi_get_reference_value(env, item->second, &nBundleInfo));
3387             return nBundleInfo;
3388         }
3389     }
3390     BundleInfo bundleInfo;
3391     ErrCode ret = CommonFunc::ConvertErrCode(iBundleMgr->GetBundleInfoForSelf(flags, bundleInfo));
3392     if (ret != NO_ERROR) {
3393         APP_LOGE("GetBundleInfoForSelfSync failed");
3394         napi_value businessError = BusinessError::CreateCommonError(
3395             env, ret, GET_BUNDLE_INFO_FOR_SELF_SYNC, BUNDLE_PERMISSIONS);
3396         napi_throw(env, businessError);
3397         return nullptr;
3398     }
3399     NAPI_CALL(env, napi_create_object(env,  &nBundleInfo));
3400     CommonFunc::ConvertBundleInfo(env, bundleInfo, nBundleInfo, flags);
3401     Query query(bundleName, GET_BUNDLE_INFO, flags, userId, env);
3402     CheckToCache(env, bundleInfo.uid, IPCSkeleton::GetCallingUid(), query, nBundleInfo);
3403     return nBundleInfo;
3404 }
3405 }
3406 }