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