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