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