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