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("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("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
CreateApplicationFlagObject(napi_env env,napi_value value)3295 void CreateApplicationFlagObject(napi_env env, napi_value value)
3296 {
3297 napi_value nGetApplicationInfoDefault;
3298 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3299 GetApplicationFlag::GET_APPLICATION_INFO_DEFAULT), &nGetApplicationInfoDefault));
3300 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_APPLICATION_INFO_DEFAULT",
3301 nGetApplicationInfoDefault));
3302
3303 napi_value nGetApplicationInfoWithPermission;
3304 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3305 GetApplicationFlag::GET_APPLICATION_INFO_WITH_PERMISSION), &nGetApplicationInfoWithPermission));
3306 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_APPLICATION_INFO_WITH_PERMISSION",
3307 nGetApplicationInfoWithPermission));
3308
3309 napi_value nGetApplicationInfoWithMetadata;
3310 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3311 GetApplicationFlag::GET_APPLICATION_INFO_WITH_METADATA), &nGetApplicationInfoWithMetadata));
3312 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_APPLICATION_INFO_WITH_METADATA",
3313 nGetApplicationInfoWithMetadata));
3314
3315 napi_value nGetApplicationInfoWithDisable;
3316 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3317 GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE), &nGetApplicationInfoWithDisable));
3318 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_APPLICATION_INFO_WITH_DISABLE",
3319 nGetApplicationInfoWithDisable));
3320 }
3321
CreateApplicationInfoFlagObject(napi_env env,napi_value value)3322 void CreateApplicationInfoFlagObject(napi_env env, napi_value value)
3323 {
3324 napi_value nApplicationInfoFlagInstalled;
3325 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3326 ApplicationInfoFlag::FLAG_INSTALLED), &nApplicationInfoFlagInstalled));
3327 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "FLAG_INSTALLED",
3328 nApplicationInfoFlagInstalled));
3329 }
3330
CreateAppDistributionTypeObject(napi_env env,napi_value value)3331 void CreateAppDistributionTypeObject(napi_env env, napi_value value)
3332 {
3333 napi_value nAppGallery;
3334 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, ENUM_ONE, &nAppGallery));
3335 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "APP_GALLERY", nAppGallery));
3336
3337 napi_value nEnterprise;
3338 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, ENUM_TWO, &nEnterprise));
3339 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "ENTERPRISE", nEnterprise));
3340
3341 napi_value nEnterPriseNormal;
3342 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, ENUM_THREE, &nEnterPriseNormal));
3343 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "ENTERPRISE_NORMAL", nEnterPriseNormal));
3344
3345 napi_value nEnterPriseMdm;
3346 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, ENUM_FOUR, &nEnterPriseMdm));
3347 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "ENTERPRISE_MDM", nEnterPriseMdm));
3348
3349 napi_value nOsIntegration;
3350 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, ENUM_FIVE, &nOsIntegration));
3351 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "OS_INTEGRATION", nOsIntegration));
3352
3353 napi_value nCrowdTesting;
3354 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, ENUM_SIX, &nCrowdTesting));
3355 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "CROWDTESTING", nCrowdTesting));
3356
3357 napi_value nNone;
3358 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, ENUM_SEVEN, &nNone));
3359 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "NONE", nNone));
3360 }
3361
InnerGetPermissionDef(const std::string & permissionName,PermissionDef & permissionDef)3362 static ErrCode InnerGetPermissionDef(const std::string &permissionName, PermissionDef &permissionDef)
3363 {
3364 auto iBundleMgr = CommonFunc::GetBundleMgr();
3365 if (iBundleMgr == nullptr) {
3366 APP_LOGE("can not get iBundleMgr");
3367 return ERROR_BUNDLE_SERVICE_EXCEPTION;
3368 }
3369 ErrCode ret = iBundleMgr->GetPermissionDef(permissionName, permissionDef);
3370 return CommonFunc::ConvertErrCode(ret);
3371 }
3372
GetPermissionDefExec(napi_env env,void * data)3373 void GetPermissionDefExec(napi_env env, void *data)
3374 {
3375 AsyncPermissionDefineCallbackInfo *asyncCallbackInfo = reinterpret_cast<AsyncPermissionDefineCallbackInfo *>(data);
3376 if (asyncCallbackInfo == nullptr) {
3377 APP_LOGE("asyncCallbackInfo is nullptr");
3378 return;
3379 }
3380 if (asyncCallbackInfo->err == NO_ERROR) {
3381 asyncCallbackInfo->err = InnerGetPermissionDef(asyncCallbackInfo->permissionName,
3382 asyncCallbackInfo->permissionDef);
3383 }
3384 }
3385
GetPermissionDefComplete(napi_env env,napi_status status,void * data)3386 void GetPermissionDefComplete(napi_env env, napi_status status, void *data)
3387 {
3388 AsyncPermissionDefineCallbackInfo *asyncCallbackInfo = reinterpret_cast<AsyncPermissionDefineCallbackInfo *>(data);
3389 if (asyncCallbackInfo == nullptr) {
3390 APP_LOGE("asyncCallbackInfo is null");
3391 return;
3392 }
3393 std::unique_ptr<AsyncPermissionDefineCallbackInfo> callbackPtr {asyncCallbackInfo};
3394 napi_value result[ARGS_SIZE_TWO] = {0};
3395 if (asyncCallbackInfo->err == NO_ERROR) {
3396 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
3397 NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &result[ARGS_POS_ONE]));
3398 CommonFunc::ConvertPermissionDef(env, result[ARGS_POS_ONE], asyncCallbackInfo->permissionDef);
3399 } else {
3400 result[0] = BusinessError::CreateCommonError(
3401 env, asyncCallbackInfo->err, GET_PERMISSION_DEF, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
3402 }
3403 CommonFunc::NapiReturnDeferred<AsyncPermissionDefineCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
3404 }
3405
3406 /**
3407 * Promise and async callback
3408 */
GetPermissionDef(napi_env env,napi_callback_info info)3409 napi_value GetPermissionDef(napi_env env, napi_callback_info info)
3410 {
3411 APP_LOGD("GetPermissionDef called");
3412 NapiArg args(env, info);
3413 AsyncPermissionDefineCallbackInfo *asyncCallbackInfo = new (std::nothrow) AsyncPermissionDefineCallbackInfo(env);
3414 if (asyncCallbackInfo == nullptr) {
3415 APP_LOGE("asyncCallbackInfo is null");
3416 return nullptr;
3417 }
3418 std::unique_ptr<AsyncPermissionDefineCallbackInfo> callbackPtr {asyncCallbackInfo};
3419 if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_TWO)) {
3420 APP_LOGE("param count invalid");
3421 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
3422 return nullptr;
3423 }
3424 for (size_t i = 0; i < args.GetMaxArgc(); ++i) {
3425 napi_valuetype valuetype = napi_undefined;
3426 NAPI_CALL(env, napi_typeof(env, args[i], &valuetype));
3427 if (i == ARGS_POS_ZERO) {
3428 if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->permissionName)) {
3429 APP_LOGE("permissionName invalid");
3430 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, PERMISSION_NAME, TYPE_STRING);
3431 return nullptr;
3432 }
3433 } else if (i == ARGS_POS_ONE) {
3434 if (valuetype == napi_function) {
3435 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
3436 } else {
3437 APP_LOGD("GetPermissionDef extra arg ignored");
3438 }
3439 } else {
3440 APP_LOGE("GetPermissionDef arg err");
3441 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR);
3442 return nullptr;
3443 }
3444 }
3445
3446 auto promise = CommonFunc::AsyncCallNativeMethod<AsyncPermissionDefineCallbackInfo>(
3447 env, asyncCallbackInfo, "GetPermissionDef", GetPermissionDefExec, GetPermissionDefComplete);
3448 callbackPtr.release();
3449 return promise;
3450 }
3451
CheckToCache(napi_env env,int32_t uid,int32_t callingUid,const Query & query,napi_value jsObject)3452 static void CheckToCache(napi_env env, int32_t uid, int32_t callingUid, const Query &query, napi_value jsObject)
3453 {
3454 if (uid != callingUid) {
3455 APP_LOGD("uid %{public}d and callingUid %{public}d not equal", uid, callingUid);
3456 return;
3457 }
3458 napi_ref cacheApplicationInfo = nullptr;
3459 NAPI_CALL_RETURN_VOID(env, napi_create_reference(env, jsObject, NAPI_RETURN_ONE, &cacheApplicationInfo));
3460 std::unique_lock<std::shared_mutex> lock(g_cacheMutex);
3461 cache[query] = cacheApplicationInfo;
3462 }
3463
GetApplicationInfoSync(napi_env env,napi_callback_info info)3464 napi_value GetApplicationInfoSync(napi_env env, napi_callback_info info)
3465 {
3466 APP_LOGD("NAPI GetApplicationInfoSync call");
3467 NapiArg args(env, info);
3468 if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_THREE)) {
3469 APP_LOGE("param count invalid");
3470 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
3471 return nullptr;
3472 }
3473 std::string bundleName;
3474 int32_t flags = 0;
3475 int32_t userId = Constants::UNSPECIFIED_USERID;
3476 for (size_t i = 0; i < args.GetArgc(); ++i) {
3477 napi_valuetype valueType = napi_undefined;
3478 napi_typeof(env, args[i], &valueType);
3479 if (i == ARGS_POS_ZERO) {
3480 if (!CommonFunc::ParseString(env, args[i], bundleName)) {
3481 APP_LOGE("bundleName %{public}s invalid", bundleName.c_str());
3482 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
3483 return nullptr;
3484 }
3485 } else if (i == ARGS_POS_ONE) {
3486 if (!CommonFunc::ParseInt(env, args[i], flags)) {
3487 APP_LOGE("parseInt failed");
3488 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, APP_FLAGS, TYPE_NUMBER);
3489 return nullptr;
3490 }
3491 } else if (i == ARGS_POS_TWO) {
3492 if (!CommonFunc::ParseInt(env, args[i], userId)) {
3493 APP_LOGW("userId parseInt failed");
3494 }
3495 } else {
3496 APP_LOGE("parameter is invalid");
3497 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
3498 return nullptr;
3499 }
3500 }
3501 if (bundleName.size() == 0) {
3502 napi_value businessError = BusinessError::CreateCommonError(
3503 env, ERROR_BUNDLE_NOT_EXIST, GET_BUNDLE_INFO_SYNC, BUNDLE_PERMISSIONS);
3504 napi_throw(env, businessError);
3505 return nullptr;
3506 }
3507 if (userId == Constants::UNSPECIFIED_USERID) {
3508 userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
3509 }
3510 napi_value nApplicationInfo = nullptr;
3511 {
3512 std::shared_lock<std::shared_mutex> lock(g_cacheMutex);
3513 auto item = cache.find(Query(bundleName, GET_APPLICATION_INFO, flags, userId, env));
3514 if (item != cache.end()) {
3515 APP_LOGD("getApplicationInfo param from cache");
3516 NAPI_CALL(env,
3517 napi_get_reference_value(env, item->second, &nApplicationInfo));
3518 return nApplicationInfo;
3519 }
3520 }
3521 auto iBundleMgr = CommonFunc::GetBundleMgr();
3522 if (iBundleMgr == nullptr) {
3523 APP_LOGE("can not get iBundleMgr");
3524 return nullptr;
3525 }
3526 AppExecFwk::ApplicationInfo appInfo;
3527 ErrCode ret = CommonFunc::ConvertErrCode(
3528 iBundleMgr->GetApplicationInfoV9(bundleName, flags, userId, appInfo));
3529 if (ret != NO_ERROR) {
3530 APP_LOGE_NOFUNC("GetApplicationInfo failed -n:%{public}s -f: %{public}d -u: %{public}d",
3531 bundleName.c_str(), flags, userId);
3532 napi_value businessError = BusinessError::CreateCommonError(
3533 env, ret, GET_BUNDLE_INFO_SYNC, BUNDLE_PERMISSIONS);
3534 napi_throw(env, businessError);
3535 return nullptr;
3536 }
3537 NAPI_CALL(env, napi_create_object(env, &nApplicationInfo));
3538 CommonFunc::ConvertApplicationInfo(env, nApplicationInfo, appInfo);
3539 Query query(bundleName, GET_APPLICATION_INFO, flags, userId, env);
3540 CheckToCache(env, appInfo.uid, IPCSkeleton::GetCallingUid(), query, nApplicationInfo);
3541 return nApplicationInfo;
3542 }
3543
GetBundleInfoSync(napi_env env,napi_callback_info info)3544 napi_value GetBundleInfoSync(napi_env env, napi_callback_info info)
3545 {
3546 APP_LOGD("NAPI GetBundleInfoSync call");
3547 NapiArg args(env, info);
3548 if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_THREE)) {
3549 APP_LOGE("param count invalid");
3550 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
3551 return nullptr;
3552 }
3553 std::string bundleName;
3554 int32_t flags = 0;
3555 int32_t userId = Constants::UNSPECIFIED_USERID;
3556 for (size_t i = 0; i < args.GetArgc(); ++i) {
3557 napi_valuetype valueType = napi_undefined;
3558 NAPI_CALL(env, napi_typeof(env, args[i], &valueType));
3559 if (i == ARGS_POS_ZERO) {
3560 if (!CommonFunc::ParseString(env, args[i], bundleName)) {
3561 APP_LOGE("bundleName %{public}s invalid", bundleName.c_str());
3562 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
3563 return nullptr;
3564 }
3565 } else if (i == ARGS_POS_ONE) {
3566 if (!CommonFunc::ParseInt(env, args[i], flags)) {
3567 APP_LOGE("parseInt failed");
3568 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_FLAGS, TYPE_NUMBER);
3569 return nullptr;
3570 }
3571 } else if (i == ARGS_POS_TWO) {
3572 if ((valueType == napi_number) && (!CommonFunc::ParseInt(env, args[i], userId))) {
3573 APP_LOGE("parseInt failed");
3574 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, USER_ID, TYPE_NUMBER);
3575 return nullptr;
3576 }
3577 } else {
3578 APP_LOGE("parameter is invalid");
3579 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
3580 return nullptr;
3581 }
3582 }
3583 if (bundleName.size() == 0) {
3584 napi_value businessError = BusinessError::CreateCommonError(
3585 env, ERROR_BUNDLE_NOT_EXIST, GET_BUNDLE_INFO_SYNC, BUNDLE_PERMISSIONS);
3586 napi_throw(env, businessError);
3587 return nullptr;
3588 }
3589 if (userId == Constants::UNSPECIFIED_USERID) {
3590 userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
3591 }
3592 napi_value nBundleInfo = nullptr;
3593 {
3594 std::shared_lock<std::shared_mutex> lock(g_cacheMutex);
3595 auto item = cache.find(Query(bundleName, GET_BUNDLE_INFO, flags, userId, env));
3596 if (item != cache.end()) {
3597 APP_LOGD("GetBundleInfo param from cache");
3598 NAPI_CALL(env,
3599 napi_get_reference_value(env, item->second, &nBundleInfo));
3600 return nBundleInfo;
3601 }
3602 }
3603 auto iBundleMgr = CommonFunc::GetBundleMgr();
3604 if (iBundleMgr == nullptr) {
3605 APP_LOGE("BundleMgr is null");
3606 return nullptr;
3607 }
3608 BundleInfo bundleInfo;
3609 ErrCode ret = CommonFunc::ConvertErrCode(iBundleMgr->GetBundleInfoV9(bundleName, flags, bundleInfo, userId));
3610 if (ret != NO_ERROR) {
3611 APP_LOGE_NOFUNC("GetBundleInfoV9 failed -n %{public}s -f %{public}d -u %{public}d",
3612 bundleName.c_str(), flags, userId);
3613 napi_value businessError = BusinessError::CreateCommonError(
3614 env, ret, GET_BUNDLE_INFO_SYNC, BUNDLE_PERMISSIONS);
3615 napi_throw(env, businessError);
3616 return nullptr;
3617 }
3618 NAPI_CALL(env, napi_create_object(env, &nBundleInfo));
3619 CommonFunc::ConvertBundleInfo(env, bundleInfo, nBundleInfo, flags);
3620 if (!CommonFunc::CheckBundleFlagWithPermission(flags)) {
3621 Query query(bundleName, GET_BUNDLE_INFO, flags, userId, env);
3622 CheckToCache(env, bundleInfo.uid, IPCSkeleton::GetCallingUid(), query, nBundleInfo);
3623 }
3624 return nBundleInfo;
3625 }
3626
InnerGetBundleInfos(int32_t flags,int32_t userId,std::vector<BundleInfo> & bundleInfos)3627 static ErrCode InnerGetBundleInfos(int32_t flags,
3628 int32_t userId, std::vector<BundleInfo> &bundleInfos)
3629 {
3630 auto iBundleMgr = CommonFunc::GetBundleMgr();
3631 if (iBundleMgr == nullptr) {
3632 APP_LOGE("iBundleMgr is null");
3633 return ERROR_BUNDLE_SERVICE_EXCEPTION;
3634 }
3635 ErrCode ret = iBundleMgr->GetBundleInfosV9(flags, bundleInfos, userId);
3636 return CommonFunc::ConvertErrCode(ret);
3637 }
3638
CreateBundleFlagObject(napi_env env,napi_value value)3639 void CreateBundleFlagObject(napi_env env, napi_value value)
3640 {
3641 napi_value nBundleInfoDefault;
3642 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_DEFAULT),
3643 &nBundleInfoDefault));
3644 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_DEFAULT",
3645 nBundleInfoDefault));
3646
3647 napi_value nGetBundleInfoWithApplication;
3648 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3649 GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_APPLICATION), &nGetBundleInfoWithApplication));
3650 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_APPLICATION",
3651 nGetBundleInfoWithApplication));
3652
3653 napi_value nGetBundleInfoWithHapModule;
3654 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3655 GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE), &nGetBundleInfoWithHapModule));
3656 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_HAP_MODULE",
3657 nGetBundleInfoWithHapModule));
3658
3659 napi_value nGetBundleInfoWithAbility;
3660 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3661 GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_ABILITY), &nGetBundleInfoWithAbility));
3662 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_ABILITY",
3663 nGetBundleInfoWithAbility));
3664
3665 napi_value nGetBundleInfoWithExtensionAbility;
3666 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3667 GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_EXTENSION_ABILITY), &nGetBundleInfoWithExtensionAbility));
3668 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_EXTENSION_ABILITY",
3669 nGetBundleInfoWithExtensionAbility));
3670
3671 napi_value nGetBundleInfoWithRequestedPermission;
3672 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3673 GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_REQUESTED_PERMISSION), &nGetBundleInfoWithRequestedPermission));
3674 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_REQUESTED_PERMISSION",
3675 nGetBundleInfoWithRequestedPermission));
3676
3677 napi_value nGetBundleInfoWithMetadata;
3678 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3679 GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_METADATA), &nGetBundleInfoWithMetadata));
3680 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_METADATA",
3681 nGetBundleInfoWithMetadata));
3682
3683 napi_value nGetBundleInfoWithDisable;
3684 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3685 GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_DISABLE), &nGetBundleInfoWithDisable));
3686 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_DISABLE",
3687 nGetBundleInfoWithDisable));
3688
3689 napi_value nGetBundleInfoWithSignatureInfo;
3690 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3691 GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_SIGNATURE_INFO), &nGetBundleInfoWithSignatureInfo));
3692 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_SIGNATURE_INFO",
3693 nGetBundleInfoWithSignatureInfo));
3694
3695 napi_value nGetBundleInfoWithMenu;
3696 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3697 GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_MENU), &nGetBundleInfoWithMenu));
3698 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_MENU",
3699 nGetBundleInfoWithMenu));
3700
3701 napi_value nGetBundleInfoWithRouterMap;
3702 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3703 GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_ROUTER_MAP), &nGetBundleInfoWithRouterMap));
3704 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_ROUTER_MAP",
3705 nGetBundleInfoWithRouterMap));
3706
3707 napi_value nGetBundleInfoWithSkill;
3708 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3709 GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_SKILL), &nGetBundleInfoWithSkill));
3710 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_SKILL",
3711 nGetBundleInfoWithSkill));
3712
3713 napi_value nGetBundleInfoOnlyWithLauncherAbility;
3714 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3715 GetBundleInfoFlag::GET_BUNDLE_INFO_ONLY_WITH_LAUNCHER_ABILITY), &nGetBundleInfoOnlyWithLauncherAbility));
3716 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_ONLY_WITH_LAUNCHER_ABILITY",
3717 nGetBundleInfoOnlyWithLauncherAbility));
3718
3719 napi_value nGetBundleInfoExcludeClone;
3720 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3721 GetBundleInfoFlag::GET_BUNDLE_INFO_EXCLUDE_CLONE), &nGetBundleInfoExcludeClone));
3722 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_EXCLUDE_CLONE",
3723 nGetBundleInfoExcludeClone));
3724
3725 napi_value nGetBundleInfoOfAnyUser;
3726 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3727 GetBundleInfoFlag::GET_BUNDLE_INFO_OF_ANY_USER), &nGetBundleInfoOfAnyUser));
3728 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_OF_ANY_USER",
3729 nGetBundleInfoOfAnyUser));
3730 }
3731
InnerGetBundleInfo(const std::string & bundleName,int32_t flags,int32_t userId,BundleInfo & bundleInfo)3732 static ErrCode InnerGetBundleInfo(const std::string &bundleName, int32_t flags,
3733 int32_t userId, BundleInfo &bundleInfo)
3734 {
3735 auto iBundleMgr = CommonFunc::GetBundleMgr();
3736 if (iBundleMgr == nullptr) {
3737 APP_LOGE("iBundleMgr is null");
3738 return ERROR_BUNDLE_SERVICE_EXCEPTION;
3739 }
3740 ErrCode ret = iBundleMgr->GetBundleInfoV9(bundleName, flags, bundleInfo, userId);
3741 return CommonFunc::ConvertErrCode(ret);
3742 }
3743
InnerGetBundleInfoForSelf(int32_t flags,BundleInfo & bundleInfo)3744 static ErrCode InnerGetBundleInfoForSelf(int32_t flags, BundleInfo &bundleInfo)
3745 {
3746 auto iBundleMgr = CommonFunc::GetBundleMgr();
3747 if (iBundleMgr == nullptr) {
3748 APP_LOGE("iBundleMgr is null");
3749 return ERROR_BUNDLE_SERVICE_EXCEPTION;
3750 }
3751 ErrCode ret = iBundleMgr->GetBundleInfoForSelf(flags, bundleInfo);
3752 return CommonFunc::ConvertErrCode(ret);
3753 }
3754
ProcessBundleInfos(napi_env env,napi_value result,const std::vector<BundleInfo> & bundleInfos,int32_t flags)3755 static void ProcessBundleInfos(
3756 napi_env env, napi_value result, const std::vector<BundleInfo> &bundleInfos, int32_t flags)
3757 {
3758 if (bundleInfos.size() == 0) {
3759 APP_LOGD("bundleInfos is null");
3760 return;
3761 }
3762 size_t index = 0;
3763 for (const auto &item : bundleInfos) {
3764 APP_LOGD("name: %{public}s ", item.name.c_str());
3765 napi_value objBundleInfo;
3766 NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &objBundleInfo));
3767 CommonFunc::ConvertBundleInfo(env, item, objBundleInfo, flags);
3768 NAPI_CALL_RETURN_VOID(env, napi_set_element(env, result, index, objBundleInfo));
3769 index++;
3770 }
3771 }
3772
GetBundleInfosComplete(napi_env env,napi_status status,void * data)3773 void GetBundleInfosComplete(napi_env env, napi_status status, void *data)
3774 {
3775 BundleInfosCallbackInfo *asyncCallbackInfo =
3776 reinterpret_cast<BundleInfosCallbackInfo *>(data);
3777 if (asyncCallbackInfo == nullptr) {
3778 APP_LOGE("asyncCallbackInfo is null");
3779 return;
3780 }
3781 std::unique_ptr<BundleInfosCallbackInfo> callbackPtr {asyncCallbackInfo};
3782 napi_value result[CALLBACK_PARAM_SIZE] = {0};
3783 if (asyncCallbackInfo->err == NO_ERROR) {
3784 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
3785 NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &result[ARGS_POS_ONE]));
3786 ProcessBundleInfos(env, result[ARGS_POS_ONE], asyncCallbackInfo->bundleInfos, asyncCallbackInfo->flags);
3787 } else {
3788 result[ARGS_POS_ZERO] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
3789 GET_BUNDLE_INFOS, Constants::PERMISSION_GET_INSTALLED_BUNDLE_LIST);
3790 }
3791 CommonFunc::NapiReturnDeferred<BundleInfosCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
3792 }
3793
GetBundleInfoComplete(napi_env env,napi_status status,void * data)3794 void GetBundleInfoComplete(napi_env env, napi_status status, void *data)
3795 {
3796 BundleInfoCallbackInfo *asyncCallbackInfo =
3797 reinterpret_cast<BundleInfoCallbackInfo *>(data);
3798 if (asyncCallbackInfo == nullptr) {
3799 APP_LOGE("asyncCallbackInfo is null");
3800 return;
3801 }
3802 std::unique_ptr<BundleInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
3803 napi_value result[CALLBACK_PARAM_SIZE] = {0};
3804 if (asyncCallbackInfo->err == NO_ERROR) {
3805 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
3806 if (asyncCallbackInfo->isSavedInCache) {
3807 std::shared_lock<std::shared_mutex> lock(g_cacheMutex);
3808 auto item = cache.find(Query(
3809 asyncCallbackInfo->bundleName, GET_BUNDLE_INFO,
3810 asyncCallbackInfo->flags, asyncCallbackInfo->userId, env));
3811 if (item == cache.end()) {
3812 APP_LOGE("cannot find result in cache");
3813 return;
3814 }
3815 NAPI_CALL_RETURN_VOID(env, napi_get_reference_value(env, item->second, &result[ARGS_POS_ONE]));
3816 } else {
3817 NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &result[ARGS_POS_ONE]));
3818 CommonFunc::ConvertBundleInfo(env,
3819 asyncCallbackInfo->bundleInfo, result[ARGS_POS_ONE], asyncCallbackInfo->flags);
3820 if (!CommonFunc::CheckBundleFlagWithPermission(asyncCallbackInfo->flags)) {
3821 Query query(
3822 asyncCallbackInfo->bundleName, GET_BUNDLE_INFO,
3823 asyncCallbackInfo->flags, asyncCallbackInfo->userId, env);
3824 CheckToCache(env, asyncCallbackInfo->bundleInfo.uid, IPCSkeleton::GetCallingUid(),
3825 query, result[ARGS_POS_ONE]);
3826 }
3827 }
3828 } else {
3829 result[ARGS_POS_ZERO] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
3830 GET_BUNDLE_INFO, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
3831 }
3832 CommonFunc::NapiReturnDeferred<BundleInfoCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
3833 }
3834
GetBundleInfoExec(napi_env env,void * data)3835 void GetBundleInfoExec(napi_env env, void *data)
3836 {
3837 BundleInfoCallbackInfo *asyncCallbackInfo = reinterpret_cast<BundleInfoCallbackInfo *>(data);
3838 if (asyncCallbackInfo == nullptr) {
3839 APP_LOGE("asyncCallbackInfo is null");
3840 return;
3841 }
3842 if (asyncCallbackInfo->err == NO_ERROR) {
3843 if (!CommonFunc::CheckBundleFlagWithPermission(asyncCallbackInfo->flags)) {
3844 std::shared_lock<std::shared_mutex> lock(g_cacheMutex);
3845 auto item = cache.find(Query(asyncCallbackInfo->bundleName,
3846 GET_BUNDLE_INFO, asyncCallbackInfo->flags, asyncCallbackInfo->userId, env));
3847 if (item != cache.end()) {
3848 asyncCallbackInfo->isSavedInCache = true;
3849 APP_LOGD("GetBundleInfo param from cache");
3850 return;
3851 }
3852 }
3853 asyncCallbackInfo->err = InnerGetBundleInfo(asyncCallbackInfo->bundleName,
3854 asyncCallbackInfo->flags, asyncCallbackInfo->userId, asyncCallbackInfo->bundleInfo);
3855 }
3856 }
3857
GetBundleInfoForSelfExec(napi_env env,void * data)3858 void GetBundleInfoForSelfExec(napi_env env, void *data)
3859 {
3860 BundleInfoCallbackInfo *asyncCallbackInfo = reinterpret_cast<BundleInfoCallbackInfo *>(data);
3861 if (asyncCallbackInfo == nullptr) {
3862 APP_LOGE("asyncCallbackInfo is null");
3863 return;
3864 }
3865 if (asyncCallbackInfo->err != NO_ERROR) {
3866 return;
3867 }
3868 auto uid = IPCSkeleton::GetCallingUid();
3869 asyncCallbackInfo->uid = uid;
3870 asyncCallbackInfo->bundleName = std::to_string(uid);
3871 asyncCallbackInfo->userId = uid / Constants::BASE_USER_RANGE;
3872 if (!CommonFunc::CheckBundleFlagWithPermission(asyncCallbackInfo->flags)) {
3873 std::shared_lock<std::shared_mutex> lock(g_cacheMutex);
3874 auto item = cache.find(Query(
3875 asyncCallbackInfo->bundleName, GET_BUNDLE_INFO,
3876 asyncCallbackInfo->flags, asyncCallbackInfo->userId, env));
3877 if (item != cache.end()) {
3878 asyncCallbackInfo->isSavedInCache = true;
3879 APP_LOGD("GetBundleInfo param from cache");
3880 return;
3881 }
3882 }
3883 asyncCallbackInfo->err = InnerGetBundleInfoForSelf(
3884 asyncCallbackInfo->flags, asyncCallbackInfo->bundleInfo);
3885 }
3886
GetBundleInfo(napi_env env,napi_callback_info info)3887 napi_value GetBundleInfo(napi_env env, napi_callback_info info)
3888 {
3889 LOG_NOFUNC_I(BMS_TAG_COMMON, "NAPI GetBundleInfo call");
3890 NapiArg args(env, info);
3891 BundleInfoCallbackInfo *asyncCallbackInfo = new (std::nothrow) BundleInfoCallbackInfo(env);
3892 if (asyncCallbackInfo == nullptr) {
3893 APP_LOGE("asyncCallbackInfo is null");
3894 return nullptr;
3895 }
3896 std::unique_ptr<BundleInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
3897 if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_FOUR)) {
3898 APP_LOGE("param count invalid");
3899 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
3900 return nullptr;
3901 }
3902 asyncCallbackInfo->uid = IPCSkeleton::GetCallingUid();
3903 asyncCallbackInfo->userId = asyncCallbackInfo->uid / Constants::BASE_USER_RANGE;
3904 if (args.GetMaxArgc() < ARGS_SIZE_TWO) {
3905 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
3906 return nullptr;
3907 }
3908 for (size_t i = 0; i < args.GetMaxArgc(); i++) {
3909 napi_valuetype valueType = napi_undefined;
3910 napi_typeof(env, args[i], &valueType);
3911 if (i == ARGS_POS_ZERO) {
3912 if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->bundleName)) {
3913 APP_LOGE("appId %{public}s invalid", asyncCallbackInfo->bundleName.c_str());
3914 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
3915 return nullptr;
3916 }
3917 } else if (i == ARGS_POS_ONE) {
3918 if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->flags)) {
3919 APP_LOGE("Flags %{public}d invalid", asyncCallbackInfo->flags);
3920 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_FLAGS, TYPE_NUMBER);
3921 return nullptr;
3922 }
3923 } else if (i == ARGS_POS_TWO) {
3924 if (valueType == napi_function) {
3925 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
3926 break;
3927 }
3928 if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->userId)) {
3929 APP_LOGW("Parse userId failed, set this parameter to the caller userId");
3930 }
3931 } else if (i == ARGS_POS_THREE) {
3932 if (valueType == napi_function) {
3933 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
3934 }
3935 break;
3936 } else {
3937 APP_LOGE("param check error");
3938 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
3939 return nullptr;
3940 }
3941 }
3942 auto promise = CommonFunc::AsyncCallNativeMethod<BundleInfoCallbackInfo>(
3943 env, asyncCallbackInfo, GET_BUNDLE_INFO, GetBundleInfoExec, GetBundleInfoComplete);
3944 callbackPtr.release();
3945 LOG_NOFUNC_I(BMS_TAG_COMMON, "NAPI GetBundleInfo done");
3946 return promise;
3947 }
3948
GetBundleInfosExec(napi_env env,void * data)3949 void GetBundleInfosExec(napi_env env, void *data)
3950 {
3951 BundleInfosCallbackInfo *asyncCallbackInfo = reinterpret_cast<BundleInfosCallbackInfo *>(data);
3952 if (asyncCallbackInfo == nullptr) {
3953 APP_LOGE("asyncCallbackInfo is null");
3954 return;
3955 }
3956 asyncCallbackInfo->err = InnerGetBundleInfos(asyncCallbackInfo->flags,
3957 asyncCallbackInfo->userId, asyncCallbackInfo->bundleInfos);
3958 }
3959
GetBundleInfos(napi_env env,napi_callback_info info)3960 napi_value GetBundleInfos(napi_env env, napi_callback_info info)
3961 {
3962 APP_LOGD("NAPI_GetBundleInfos called");
3963 NapiArg args(env, info);
3964 BundleInfosCallbackInfo *asyncCallbackInfo = new (std::nothrow) BundleInfosCallbackInfo(env);
3965 if (asyncCallbackInfo == nullptr) {
3966 APP_LOGE("asyncCallbackInfo is null");
3967 return nullptr;
3968 }
3969 std::unique_ptr<BundleInfosCallbackInfo> callbackPtr {asyncCallbackInfo};
3970 if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_THREE)) {
3971 APP_LOGE("param count invalid");
3972 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
3973 return nullptr;
3974 }
3975 asyncCallbackInfo->userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
3976 if (args.GetMaxArgc() < ARGS_SIZE_ONE) {
3977 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
3978 return nullptr;
3979 }
3980 for (size_t i = 0; i < args.GetMaxArgc(); ++i) {
3981 napi_valuetype valueType = napi_undefined;
3982 napi_typeof(env, args[i], &valueType);
3983 if (i == ARGS_POS_ZERO) {
3984 if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->flags)) {
3985 APP_LOGE("Flags %{public}d invalid", asyncCallbackInfo->flags);
3986 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_FLAGS, TYPE_NUMBER);
3987 return nullptr;
3988 }
3989 } else if (i == ARGS_POS_ONE) {
3990 if (valueType == napi_function) {
3991 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
3992 break;
3993 }
3994 if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->userId)) {
3995 APP_LOGW("Parse userId failed, set this parameter to the caller userId");
3996 }
3997 } else if (i == ARGS_POS_TWO) {
3998 if (valueType == napi_function) {
3999 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
4000 break;
4001 }
4002 } else {
4003 APP_LOGE("param check error");
4004 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
4005 return nullptr;
4006 }
4007 }
4008 auto promise = CommonFunc::AsyncCallNativeMethod<BundleInfosCallbackInfo>(
4009 env, asyncCallbackInfo, GET_BUNDLE_INFOS, GetBundleInfosExec, GetBundleInfosComplete);
4010 callbackPtr.release();
4011 APP_LOGD("call NAPI_GetBundleInfos done");
4012 return promise;
4013 }
4014
GetBundleInfoForSelf(napi_env env,napi_callback_info info)4015 napi_value GetBundleInfoForSelf(napi_env env, napi_callback_info info)
4016 {
4017 APP_LOGD("GetBundleInfoForSelf called");
4018 NapiArg args(env, info);
4019 BundleInfoCallbackInfo *asyncCallbackInfo = new (std::nothrow) BundleInfoCallbackInfo(env);
4020 if (asyncCallbackInfo == nullptr) {
4021 APP_LOGE("asyncCallbackInfo is null");
4022 return nullptr;
4023 }
4024 std::unique_ptr<BundleInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
4025 if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_TWO)) {
4026 APP_LOGE("param count invalid");
4027 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
4028 return nullptr;
4029 }
4030 for (size_t i = 0; i < args.GetArgc(); ++i) {
4031 napi_valuetype valueType = napi_undefined;
4032 napi_typeof(env, args[i], &valueType);
4033 if (i == ARGS_POS_ZERO) {
4034 if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->flags)) {
4035 APP_LOGE("Flags invalid");
4036 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_FLAGS, TYPE_NUMBER);
4037 return nullptr;
4038 }
4039 } else if (i == ARGS_POS_ONE) {
4040 if (valueType == napi_function) {
4041 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
4042 }
4043 } else {
4044 APP_LOGE("param check error");
4045 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
4046 return nullptr;
4047 }
4048 }
4049 auto promise = CommonFunc::AsyncCallNativeMethod<BundleInfoCallbackInfo>(
4050 env, asyncCallbackInfo, "GetBundleInfoForSelf", GetBundleInfoForSelfExec, GetBundleInfoComplete);
4051 callbackPtr.release();
4052 APP_LOGD("call GetBundleInfoForSelf done");
4053 return promise;
4054 }
4055
InnerGetAllSharedBundleInfo(std::vector<SharedBundleInfo> & sharedBundles)4056 static ErrCode InnerGetAllSharedBundleInfo(std::vector<SharedBundleInfo> &sharedBundles)
4057 {
4058 auto iBundleMgr = CommonFunc::GetBundleMgr();
4059 if (iBundleMgr == nullptr) {
4060 APP_LOGE("iBundleMgr is null");
4061 return ERROR_BUNDLE_SERVICE_EXCEPTION;
4062 }
4063 ErrCode ret = iBundleMgr->GetAllSharedBundleInfo(sharedBundles);
4064 return CommonFunc::ConvertErrCode(ret);
4065 }
4066
GetAllSharedBundleInfoExec(napi_env env,void * data)4067 void GetAllSharedBundleInfoExec(napi_env env, void *data)
4068 {
4069 SharedBundleCallbackInfo *asyncCallbackInfo = reinterpret_cast<SharedBundleCallbackInfo *>(data);
4070 if (asyncCallbackInfo == nullptr) {
4071 APP_LOGE("asyncCallbackInfo is null");
4072 return;
4073 }
4074 asyncCallbackInfo->err = InnerGetAllSharedBundleInfo(asyncCallbackInfo->sharedBundles);
4075 }
4076
GetAllSharedBundleInfoComplete(napi_env env,napi_status status,void * data)4077 void GetAllSharedBundleInfoComplete(napi_env env, napi_status status, void *data)
4078 {
4079 SharedBundleCallbackInfo *asyncCallbackInfo =
4080 reinterpret_cast<SharedBundleCallbackInfo *>(data);
4081 if (asyncCallbackInfo == nullptr) {
4082 APP_LOGE("asyncCallbackInfo is null");
4083 return;
4084 }
4085 std::unique_ptr<SharedBundleCallbackInfo> callbackPtr {asyncCallbackInfo};
4086 napi_value result[CALLBACK_PARAM_SIZE] = {0};
4087 if (asyncCallbackInfo->err == NO_ERROR) {
4088 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
4089 NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &result[ARGS_POS_ONE]));
4090 CommonFunc::ConvertAllSharedBundleInfo(env, result[ARGS_POS_ONE], asyncCallbackInfo->sharedBundles);
4091 } else {
4092 result[ARGS_POS_ZERO] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
4093 GET_ALL_SHARED_BUNDLE_INFO, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
4094 }
4095 CommonFunc::NapiReturnDeferred<SharedBundleCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
4096 }
4097
GetAllSharedBundleInfo(napi_env env,napi_callback_info info)4098 napi_value GetAllSharedBundleInfo(napi_env env, napi_callback_info info)
4099 {
4100 APP_LOGD("NAPI_GetAllSharedBundleInfo called");
4101 NapiArg args(env, info);
4102 SharedBundleCallbackInfo *asyncCallbackInfo = new (std::nothrow) SharedBundleCallbackInfo(env);
4103 if (asyncCallbackInfo == nullptr) {
4104 APP_LOGE("asyncCallbackInfo is null");
4105 return nullptr;
4106 }
4107 std::unique_ptr<SharedBundleCallbackInfo> callbackPtr {asyncCallbackInfo};
4108 if (!args.Init(ARGS_SIZE_ZERO, ARGS_SIZE_ONE)) {
4109 APP_LOGE("param count invalid");
4110 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
4111 return nullptr;
4112 }
4113 if (args.GetMaxArgc() < ARGS_SIZE_ZERO) {
4114 APP_LOGE("param count invalid");
4115 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
4116 return nullptr;
4117 }
4118 for (size_t i = 0; i < args.GetMaxArgc(); ++i) {
4119 napi_valuetype valueType = napi_undefined;
4120 napi_typeof(env, args[i], &valueType);
4121 if (i == ARGS_POS_ZERO) {
4122 if (valueType == napi_function) {
4123 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
4124 break;
4125 }
4126 } else {
4127 APP_LOGE("param check error");
4128 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
4129 return nullptr;
4130 }
4131 }
4132 auto promise = CommonFunc::AsyncCallNativeMethod<SharedBundleCallbackInfo>(env, asyncCallbackInfo,
4133 GET_ALL_SHARED_BUNDLE_INFO, GetAllSharedBundleInfoExec, GetAllSharedBundleInfoComplete);
4134 callbackPtr.release();
4135 APP_LOGD("call NAPI_GetAllSharedBundleInfo done");
4136 return promise;
4137 }
4138
InnerGetSharedBundleInfo(const std::string & bundleName,const std::string & moduleName,std::vector<SharedBundleInfo> & sharedBundles)4139 static ErrCode InnerGetSharedBundleInfo(const std::string &bundleName, const std::string &moduleName,
4140 std::vector<SharedBundleInfo> &sharedBundles)
4141 {
4142 auto iBundleMgr = CommonFunc::GetBundleMgr();
4143 if (iBundleMgr == nullptr) {
4144 APP_LOGE("iBundleMgr is null");
4145 return ERROR_BUNDLE_SERVICE_EXCEPTION;
4146 }
4147 ErrCode ret = iBundleMgr->GetSharedBundleInfo(bundleName, moduleName, sharedBundles);
4148 return CommonFunc::ConvertErrCode(ret);
4149 }
4150
GetSharedBundleInfoExec(napi_env env,void * data)4151 void GetSharedBundleInfoExec(napi_env env, void *data)
4152 {
4153 SharedBundleCallbackInfo *asyncCallbackInfo = reinterpret_cast<SharedBundleCallbackInfo *>(data);
4154 if (asyncCallbackInfo == nullptr) {
4155 APP_LOGE("asyncCallbackInfo is null");
4156 return;
4157 }
4158 asyncCallbackInfo->err = InnerGetSharedBundleInfo(asyncCallbackInfo->bundleName, asyncCallbackInfo->moduleName,
4159 asyncCallbackInfo->sharedBundles);
4160 }
4161
GetSharedBundleInfoComplete(napi_env env,napi_status status,void * data)4162 void GetSharedBundleInfoComplete(napi_env env, napi_status status, void *data)
4163 {
4164 SharedBundleCallbackInfo *asyncCallbackInfo =
4165 reinterpret_cast<SharedBundleCallbackInfo *>(data);
4166 if (asyncCallbackInfo == nullptr) {
4167 APP_LOGE("asyncCallbackInfo is null");
4168 return;
4169 }
4170 std::unique_ptr<SharedBundleCallbackInfo> callbackPtr {asyncCallbackInfo};
4171 napi_value result[CALLBACK_PARAM_SIZE] = {0};
4172 if (asyncCallbackInfo->err == NO_ERROR) {
4173 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
4174 NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &result[ARGS_POS_ONE]));
4175 CommonFunc::ConvertAllSharedBundleInfo(env, result[ARGS_POS_ONE], asyncCallbackInfo->sharedBundles);
4176 } else {
4177 result[ARGS_POS_ZERO] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
4178 GET_SHARED_BUNDLE_INFO, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
4179 }
4180 CommonFunc::NapiReturnDeferred<SharedBundleCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
4181 }
4182
GetSharedBundleInfo(napi_env env,napi_callback_info info)4183 napi_value GetSharedBundleInfo(napi_env env, napi_callback_info info)
4184 {
4185 APP_LOGD("NAPI_GetSharedBundleInfo called");
4186 NapiArg args(env, info);
4187 SharedBundleCallbackInfo *asyncCallbackInfo = new (std::nothrow) SharedBundleCallbackInfo(env);
4188 if (asyncCallbackInfo == nullptr) {
4189 APP_LOGE("asyncCallbackInfo is null");
4190 return nullptr;
4191 }
4192 std::unique_ptr<SharedBundleCallbackInfo> callbackPtr {asyncCallbackInfo};
4193 if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_THREE)) {
4194 APP_LOGE("param count invalid");
4195 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
4196 return nullptr;
4197 }
4198 if (args.GetMaxArgc() < ARGS_SIZE_TWO) {
4199 APP_LOGE("param count invalid");
4200 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
4201 return nullptr;
4202 }
4203
4204 for (size_t i = 0; i < args.GetMaxArgc(); i++) {
4205 napi_valuetype valueType = napi_undefined;
4206 napi_typeof(env, args[i], &valueType);
4207 if (i == ARGS_POS_ZERO) {
4208 if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->bundleName)) {
4209 APP_LOGE("appId %{public}s invalid", asyncCallbackInfo->bundleName.c_str());
4210 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
4211 return nullptr;
4212 }
4213 } else if (i == ARGS_POS_ONE) {
4214 if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->moduleName)) {
4215 APP_LOGE("appId %{public}s invalid", asyncCallbackInfo->moduleName.c_str());
4216 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, MODULE_NAME, TYPE_STRING);
4217 return nullptr;
4218 }
4219 } else if (i == ARGS_POS_TWO) {
4220 if (valueType == napi_function) {
4221 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
4222 break;
4223 }
4224 } else {
4225 APP_LOGE("param check error");
4226 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
4227 return nullptr;
4228 }
4229 }
4230
4231 auto promise = CommonFunc::AsyncCallNativeMethod<SharedBundleCallbackInfo>(env, asyncCallbackInfo,
4232 GET_SHARED_BUNDLE_INFO, GetSharedBundleInfoExec, GetSharedBundleInfoComplete);
4233 callbackPtr.release();
4234 APP_LOGD("call NAPI_GetSharedBundleInfo done");
4235 return promise;
4236 }
4237
CreatePermissionGrantStateObject(napi_env env,napi_value value)4238 void CreatePermissionGrantStateObject(napi_env env, napi_value value)
4239 {
4240 napi_value nPermissionDenied;
4241 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, -1, &nPermissionDenied));
4242 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "PERMISSION_DENIED",
4243 nPermissionDenied));
4244
4245 napi_value nPermissionGranted;
4246 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, 0, &nPermissionGranted));
4247 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "PERMISSION_GRANTED",
4248 nPermissionGranted));
4249 }
4250
CreateAbilityTypeObject(napi_env env,napi_value value)4251 void CreateAbilityTypeObject(napi_env env, napi_value value)
4252 {
4253 napi_value nUnknow;
4254 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(AbilityType::UNKNOWN), &nUnknow));
4255 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "UNKNOWN", nUnknow));
4256 napi_value nPage;
4257 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(AbilityType::PAGE), &nPage));
4258 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "PAGE", nPage));
4259 napi_value nService;
4260 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(AbilityType::SERVICE), &nService));
4261 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SERVICE", nService));
4262 napi_value nData;
4263 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(AbilityType::DATA), &nData));
4264 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "DATA", nData));
4265 }
4266
CreateBundleTypeObject(napi_env env,napi_value value)4267 void CreateBundleTypeObject(napi_env env, napi_value value)
4268 {
4269 napi_value nApp;
4270 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(BundleType::APP), &nApp));
4271 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "APP", nApp));
4272 napi_value nAtomicService;
4273 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
4274 static_cast<int32_t>(BundleType::ATOMIC_SERVICE), &nAtomicService));
4275 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "ATOMIC_SERVICE", nAtomicService));
4276 }
4277
CreateDisplayOrientationObject(napi_env env,napi_value value)4278 void CreateDisplayOrientationObject(napi_env env, napi_value value)
4279 {
4280 napi_value nUnspecified;
4281 NAPI_CALL_RETURN_VOID(
4282 env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::UNSPECIFIED), &nUnspecified));
4283 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "UNSPECIFIED", nUnspecified));
4284 napi_value nLandscape;
4285 NAPI_CALL_RETURN_VOID(
4286 env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::LANDSCAPE), &nLandscape));
4287 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "LANDSCAPE", nLandscape));
4288 napi_value nPortrait;
4289 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::PORTRAIT), &nPortrait));
4290 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "PORTRAIT", nPortrait));
4291 napi_value nFollowrecent;
4292 NAPI_CALL_RETURN_VOID(
4293 env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::FOLLOWRECENT), &nFollowrecent));
4294 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "FOLLOW_RECENT", nFollowrecent));
4295 napi_value nReverseLandscape;
4296 NAPI_CALL_RETURN_VOID(
4297 env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::LANDSCAPE_INVERTED), &nReverseLandscape));
4298 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "LANDSCAPE_INVERTED", nReverseLandscape));
4299 napi_value nReversePortrait;
4300 NAPI_CALL_RETURN_VOID(
4301 env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::PORTRAIT_INVERTED), &nReversePortrait));
4302 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "PORTRAIT_INVERTED", nReversePortrait));
4303 napi_value nLocked;
4304 NAPI_CALL_RETURN_VOID(
4305 env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::LOCKED), &nLocked));
4306 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "LOCKED", nLocked));
4307 CreateOrientationRelatedToSensor(env, value);
4308 }
4309
CreateOrientationRelatedToSensor(napi_env env,napi_value value)4310 void CreateOrientationRelatedToSensor(napi_env env, napi_value value)
4311 {
4312 napi_value nAutoRotation;
4313 NAPI_CALL_RETURN_VOID(
4314 env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::AUTO_ROTATION), &nAutoRotation));
4315 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "AUTO_ROTATION", nAutoRotation));
4316 napi_value nAutoRotationLandscape;
4317 NAPI_CALL_RETURN_VOID(
4318 env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::AUTO_ROTATION_LANDSCAPE),
4319 &nAutoRotationLandscape));
4320 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "AUTO_ROTATION_LANDSCAPE", nAutoRotationLandscape));
4321 napi_value nAutoRotationPortrait;
4322 NAPI_CALL_RETURN_VOID(
4323 env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::AUTO_ROTATION_PORTRAIT),
4324 &nAutoRotationPortrait));
4325 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "AUTO_ROTATION_PORTRAIT", nAutoRotationPortrait));
4326 napi_value nAutoRotationRestricted;
4327 NAPI_CALL_RETURN_VOID(
4328 env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::AUTO_ROTATION_RESTRICTED),
4329 &nAutoRotationRestricted));
4330 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "AUTO_ROTATION_RESTRICTED",
4331 nAutoRotationRestricted));
4332 napi_value nAutoRotationLandscapeRestricted;
4333 NAPI_CALL_RETURN_VOID(
4334 env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::AUTO_ROTATION_LANDSCAPE_RESTRICTED),
4335 &nAutoRotationLandscapeRestricted));
4336 NAPI_CALL_RETURN_VOID(env,
4337 napi_set_named_property(env, value, "AUTO_ROTATION_LANDSCAPE_RESTRICTED", nAutoRotationLandscapeRestricted));
4338 napi_value nAutoRotationPortraitRestricted;
4339 NAPI_CALL_RETURN_VOID(
4340 env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::AUTO_ROTATION_PORTRAIT_RESTRICTED),
4341 &nAutoRotationPortraitRestricted));
4342 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "AUTO_ROTATION_PORTRAIT_RESTRICTED",
4343 nAutoRotationPortraitRestricted));
4344 napi_value nAutoRotationUnspecified;
4345 NAPI_CALL_RETURN_VOID(env,
4346 napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::AUTO_ROTATION_UNSPECIFIED),
4347 &nAutoRotationUnspecified));
4348 NAPI_CALL_RETURN_VOID(env,
4349 napi_set_named_property(env, value, "AUTO_ROTATION_UNSPECIFIED", nAutoRotationUnspecified));
4350 napi_value nFollowDesktop;
4351 NAPI_CALL_RETURN_VOID(env,
4352 napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::FOLLOW_DESKTOP), &nFollowDesktop));
4353 NAPI_CALL_RETURN_VOID(env,
4354 napi_set_named_property(env, value, "FOLLOW_DESKTOP", nFollowDesktop));
4355 }
4356
CreateLaunchTypeObject(napi_env env,napi_value value)4357 void CreateLaunchTypeObject(napi_env env, napi_value value)
4358 {
4359 napi_value nSingleton;
4360 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(LaunchMode::SINGLETON), &nSingleton));
4361 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SINGLETON", nSingleton));
4362 napi_value nStandard;
4363 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(LaunchMode::STANDARD), &nStandard));
4364 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "STANDARD", nStandard));
4365 napi_value nMultiton;
4366 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(LaunchMode::STANDARD), &nMultiton));
4367 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "MULTITON", nMultiton));
4368 napi_value nSpecified;
4369 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(LaunchMode::SPECIFIED), &nSpecified));
4370 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SPECIFIED", nSpecified));
4371 }
4372
CreateSupportWindowModesObject(napi_env env,napi_value value)4373 void CreateSupportWindowModesObject(napi_env env, napi_value value)
4374 {
4375 napi_value nFullscreen;
4376 NAPI_CALL_RETURN_VOID(env,
4377 napi_create_int32(env, static_cast<int32_t>(SupportWindowMode::FULLSCREEN), &nFullscreen));
4378 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "FULL_SCREEN", nFullscreen));
4379
4380 napi_value nSplit;
4381 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(SupportWindowMode::SPLIT), &nSplit));
4382 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SPLIT", nSplit));
4383
4384 napi_value nFloat;
4385 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(SupportWindowMode::FLOATING), &nFloat));
4386 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "FLOATING", nFloat));
4387 }
4388
CreateModuleTypeObject(napi_env env,napi_value value)4389 void CreateModuleTypeObject(napi_env env, napi_value value)
4390 {
4391 napi_value nUnknown;
4392 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(ModuleType::UNKNOWN), &nUnknown));
4393 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "UNKNOWN", nUnknown));
4394
4395 napi_value nEntry;
4396 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(ModuleType::ENTRY), &nEntry));
4397 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "ENTRY", nEntry));
4398
4399 napi_value nFeature;
4400 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(ModuleType::FEATURE), &nFeature));
4401 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "FEATURE", nFeature));
4402
4403 napi_value nShared;
4404 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(ModuleType::SHARED), &nShared));
4405 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SHARED", nShared));
4406 }
4407
CreateCompatiblePolicyObject(napi_env env,napi_value value)4408 void CreateCompatiblePolicyObject(napi_env env, napi_value value)
4409 {
4410 napi_value nNORMAL;
4411 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(CompatiblePolicy::NORMAL), &nNORMAL));
4412 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "NORMAL", nNORMAL));
4413
4414 napi_value nBackwardCompatibility;
4415 NAPI_CALL_RETURN_VOID(env, napi_create_int32(
4416 env, static_cast<int32_t>(CompatiblePolicy::BACKWARD_COMPATIBILITY), &nBackwardCompatibility));
4417 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "BACKWARD_COMPATIBILITY", nBackwardCompatibility));
4418 }
4419
CreateProfileTypeObject(napi_env env,napi_value value)4420 void CreateProfileTypeObject(napi_env env, napi_value value)
4421 {
4422 napi_value nIntentProfile;
4423 NAPI_CALL_RETURN_VOID(env, napi_create_int32(
4424 env, static_cast<int32_t>(ProfileType::INTENT_PROFILE), &nIntentProfile));
4425 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "INTENT_PROFILE", nIntentProfile));
4426 }
4427
InnerGetAppProvisionInfo(const std::string & bundleName,int32_t userId,AppProvisionInfo & appProvisionInfo)4428 ErrCode InnerGetAppProvisionInfo(
4429 const std::string &bundleName, int32_t userId, AppProvisionInfo &appProvisionInfo)
4430 {
4431 auto iBundleMgr = CommonFunc::GetBundleMgr();
4432 if (iBundleMgr == nullptr) {
4433 APP_LOGE("iBundleMgr is null");
4434 return ERROR_BUNDLE_SERVICE_EXCEPTION;
4435 }
4436 ErrCode ret = iBundleMgr->GetAppProvisionInfo(bundleName, userId, appProvisionInfo);
4437 return CommonFunc::ConvertErrCode(ret);
4438 }
4439
GetAppProvisionInfoExec(napi_env env,void * data)4440 void GetAppProvisionInfoExec(napi_env env, void *data)
4441 {
4442 AppProvisionInfoCallbackInfo *asyncCallbackInfo = reinterpret_cast<AppProvisionInfoCallbackInfo *>(data);
4443 if (asyncCallbackInfo == nullptr) {
4444 APP_LOGE("asyncCallbackInfo is null");
4445 return;
4446 }
4447 if (asyncCallbackInfo->err == NO_ERROR) {
4448 asyncCallbackInfo->err = InnerGetAppProvisionInfo(
4449 asyncCallbackInfo->bundleName, asyncCallbackInfo->userId, asyncCallbackInfo->appProvisionInfo);
4450 }
4451 }
4452
GetAppProvisionInfoComplete(napi_env env,napi_status status,void * data)4453 void GetAppProvisionInfoComplete(napi_env env, napi_status status, void *data)
4454 {
4455 AppProvisionInfoCallbackInfo *asyncCallbackInfo =
4456 reinterpret_cast<AppProvisionInfoCallbackInfo *>(data);
4457 if (asyncCallbackInfo == nullptr) {
4458 APP_LOGE("asyncCallbackInfo is null");
4459 return;
4460 }
4461 std::unique_ptr<AppProvisionInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
4462 napi_value result[CALLBACK_PARAM_SIZE] = {0};
4463 if (asyncCallbackInfo->err == NO_ERROR) {
4464 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
4465 NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &result[ARGS_POS_ONE]));
4466 CommonFunc::ConvertAppProvisionInfo(env, asyncCallbackInfo->appProvisionInfo, result[ARGS_POS_ONE]);
4467 } else {
4468 result[ARGS_POS_ZERO] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
4469 GET_APP_PROVISION_INFO, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
4470 }
4471 CommonFunc::NapiReturnDeferred<AppProvisionInfoCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
4472 }
4473
GetAppProvisionInfo(napi_env env,napi_callback_info info)4474 napi_value GetAppProvisionInfo(napi_env env, napi_callback_info info)
4475 {
4476 APP_LOGD("napi GetAppProvisionInfo called");
4477 NapiArg args(env, info);
4478 AppProvisionInfoCallbackInfo *asyncCallbackInfo = new (std::nothrow) AppProvisionInfoCallbackInfo(env);
4479 if (asyncCallbackInfo == nullptr) {
4480 APP_LOGE("asyncCallbackInfo is null");
4481 return nullptr;
4482 }
4483 std::unique_ptr<AppProvisionInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
4484 if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_THREE)) {
4485 APP_LOGE("param count invalid");
4486 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
4487 return nullptr;
4488 }
4489 asyncCallbackInfo->userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
4490 for (size_t i = 0; i < args.GetArgc(); ++i) {
4491 napi_valuetype valueType = napi_undefined;
4492 napi_typeof(env, args[i], &valueType);
4493 if (i == ARGS_POS_ZERO) {
4494 if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->bundleName)) {
4495 APP_LOGE("bundleName invalid");
4496 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
4497 return nullptr;
4498 }
4499 CHECK_STRING_EMPTY(env, asyncCallbackInfo->bundleName, std::string{ BUNDLE_NAME });
4500 } else if (i == ARGS_POS_ONE) {
4501 if (valueType == napi_function) {
4502 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
4503 break;
4504 }
4505 if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->userId)) {
4506 APP_LOGW("parse userId failed, set this parameter to the caller userId");
4507 }
4508 } else if (i == ARGS_POS_TWO) {
4509 if (valueType == napi_function) {
4510 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
4511 break;
4512 }
4513 } else {
4514 APP_LOGE("param check error");
4515 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
4516 return nullptr;
4517 }
4518 }
4519
4520 auto promise = CommonFunc::AsyncCallNativeMethod<AppProvisionInfoCallbackInfo>(
4521 env, asyncCallbackInfo, GET_APP_PROVISION_INFO, GetAppProvisionInfoExec, GetAppProvisionInfoComplete);
4522 callbackPtr.release();
4523 APP_LOGD("call GetAppProvisionInfo done");
4524 return promise;
4525 }
4526
GetSpecifiedDistributionType(napi_env env,napi_callback_info info)4527 napi_value GetSpecifiedDistributionType(napi_env env, napi_callback_info info)
4528 {
4529 APP_LOGD("GetSpecifiedDistributionType napi called");
4530 NapiArg args(env, info);
4531 if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_ONE)) {
4532 APP_LOGE("param count invalid");
4533 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
4534 return nullptr;
4535 }
4536
4537 std::string bundleName;
4538 if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], bundleName)) {
4539 APP_LOGE("bundleName invalid");
4540 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
4541 return nullptr;
4542 }
4543
4544 auto iBundleMgr = CommonFunc::GetBundleMgr();
4545 if (iBundleMgr == nullptr) {
4546 APP_LOGE("iBundleMgr is null");
4547 napi_value businessError = BusinessError::CreateCommonError(
4548 env, ERROR_BUNDLE_SERVICE_EXCEPTION, RESOURCE_NAME_OF_GET_SPECIFIED_DISTRIBUTION_TYPE,
4549 Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
4550 napi_throw(env, businessError);
4551 return nullptr;
4552 }
4553
4554 std::string specifiedDistributionType;
4555 ErrCode ret = CommonFunc::ConvertErrCode(
4556 iBundleMgr->GetSpecifiedDistributionType(bundleName, specifiedDistributionType));
4557 if (ret != SUCCESS) {
4558 APP_LOGE_NOFUNC("GetSpecifiedDistributionType failed -n %{public}s ret:%{public}d",
4559 bundleName.c_str(), ret);
4560 napi_value businessError = BusinessError::CreateCommonError(
4561 env, ret, RESOURCE_NAME_OF_GET_SPECIFIED_DISTRIBUTION_TYPE,
4562 Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
4563 napi_throw(env, businessError);
4564 return nullptr;
4565 }
4566
4567 napi_value nSpecifiedDistributionType;
4568 napi_create_string_utf8(env, specifiedDistributionType.c_str(), NAPI_AUTO_LENGTH, &nSpecifiedDistributionType);
4569 APP_LOGD("call GetSpecifiedDistributionType done");
4570 return nSpecifiedDistributionType;
4571 }
4572
GetAdditionalInfo(napi_env env,napi_callback_info info)4573 napi_value GetAdditionalInfo(napi_env env, napi_callback_info info)
4574 {
4575 APP_LOGD("GetAdditionalInfo napi called");
4576 NapiArg args(env, info);
4577 if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_ONE)) {
4578 APP_LOGE("param count invalid");
4579 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
4580 return nullptr;
4581 }
4582
4583 std::string bundleName;
4584 if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], bundleName)) {
4585 APP_LOGE("bundleName invalid");
4586 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
4587 return nullptr;
4588 }
4589 CHECK_STRING_EMPTY(env, bundleName, std::string{ BUNDLE_NAME });
4590
4591 auto iBundleMgr = CommonFunc::GetBundleMgr();
4592 if (iBundleMgr == nullptr) {
4593 APP_LOGE("iBundleMgr is null");
4594 napi_value businessError = BusinessError::CreateCommonError(
4595 env, ERROR_BUNDLE_SERVICE_EXCEPTION, RESOURCE_NAME_OF_GET_SPECIFIED_DISTRIBUTION_TYPE,
4596 Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
4597 napi_throw(env, businessError);
4598 return nullptr;
4599 }
4600
4601 std::string additionalInfo;
4602 ErrCode ret = CommonFunc::ConvertErrCode(
4603 iBundleMgr->GetAdditionalInfo(bundleName, additionalInfo));
4604 if (ret != SUCCESS) {
4605 APP_LOGE_NOFUNC("GetAdditionalInfo %{public}s error", bundleName.c_str());
4606 napi_value businessError = BusinessError::CreateCommonError(
4607 env, ret, RESOURCE_NAME_OF_GET_ADDITIONAL_INFO, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
4608 napi_throw(env, businessError);
4609 return nullptr;
4610 }
4611
4612 napi_value nAdditionalInfo;
4613 napi_create_string_utf8(env, additionalInfo.c_str(), NAPI_AUTO_LENGTH, &nAdditionalInfo);
4614 APP_LOGD("call GetAdditionalInfo done");
4615 return nAdditionalInfo;
4616 }
4617
GetBundleInfoForSelfSync(napi_env env,napi_callback_info info)4618 napi_value GetBundleInfoForSelfSync(napi_env env, napi_callback_info info)
4619 {
4620 APP_LOGD("GetBundleInfoForSelfSync called");
4621 NapiArg args(env, info);
4622 if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_ONE)) {
4623 APP_LOGE("param count invalid");
4624 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
4625 return nullptr;
4626 }
4627 int32_t flags = 0;
4628 if (!CommonFunc::ParseInt(env, args[ARGS_POS_ZERO], flags)) {
4629 APP_LOGE("parseInt invalid");
4630 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_FLAGS, TYPE_NUMBER);
4631 return nullptr;
4632 }
4633 auto iBundleMgr = CommonFunc::GetBundleMgr();
4634 if (iBundleMgr == nullptr) {
4635 APP_LOGE("BundleMgr is null");
4636 return nullptr;
4637 }
4638 auto uid = IPCSkeleton::GetCallingUid();
4639 std::string bundleName = std::to_string(uid);
4640 int32_t userId = uid / Constants::BASE_USER_RANGE;
4641 napi_value nBundleInfo = nullptr;
4642 if (!CommonFunc::CheckBundleFlagWithPermission(flags)) {
4643 std::shared_lock<std::shared_mutex> lock(g_cacheMutex);
4644 auto item = cache.find(Query(bundleName, GET_BUNDLE_INFO, flags, userId, env));
4645 if (item != cache.end()) {
4646 APP_LOGD("GetBundleInfo param from cache");
4647 NAPI_CALL(env,
4648 napi_get_reference_value(env, item->second, &nBundleInfo));
4649 return nBundleInfo;
4650 }
4651 }
4652 BundleInfo bundleInfo;
4653 ErrCode ret = CommonFunc::ConvertErrCode(iBundleMgr->GetBundleInfoForSelf(flags, bundleInfo));
4654 if (ret != NO_ERROR) {
4655 APP_LOGE("GetBundleInfoForSelfSync failed, bundleName is %{public}s", bundleName.c_str());
4656 napi_value businessError = BusinessError::CreateCommonError(
4657 env, ret, GET_BUNDLE_INFO_FOR_SELF_SYNC, BUNDLE_PERMISSIONS);
4658 napi_throw(env, businessError);
4659 return nullptr;
4660 }
4661 NAPI_CALL(env, napi_create_object(env, &nBundleInfo));
4662 CommonFunc::ConvertBundleInfo(env, bundleInfo, nBundleInfo, flags);
4663 if (!CommonFunc::CheckBundleFlagWithPermission(flags)) {
4664 Query query(bundleName, GET_BUNDLE_INFO, flags, userId, env);
4665 CheckToCache(env, bundleInfo.uid, IPCSkeleton::GetCallingUid(), query, nBundleInfo);
4666 }
4667 return nBundleInfo;
4668 }
4669
ParamsProcessGetJsonProfile(napi_env env,napi_callback_info info,int32_t & profileType,std::string & bundleName,std::string & moduleName,int32_t & userId)4670 bool ParamsProcessGetJsonProfile(napi_env env, napi_callback_info info,
4671 int32_t& profileType, std::string& bundleName, std::string& moduleName, int32_t& userId)
4672 {
4673 NapiArg args(env, info);
4674 if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_FOUR)) {
4675 APP_LOGE("param count invalid");
4676 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
4677 return false;
4678 }
4679 if (!CommonFunc::ParseInt(env, args[ARGS_POS_ZERO], profileType)) {
4680 APP_LOGE("profileType invalid");
4681 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, PROFILE_TYPE, TYPE_NUMBER);
4682 return false;
4683 }
4684 if (g_supportedProfileList.find(profileType) == g_supportedProfileList.end()) {
4685 APP_LOGE("JS request profile error, type is %{public}d, profile not exist", profileType);
4686 BusinessError::ThrowParameterTypeError(env, ERROR_PROFILE_NOT_EXIST, PROFILE_TYPE, TYPE_NUMBER);
4687 return false;
4688 }
4689 if (!CommonFunc::ParseString(env, args[ARGS_POS_ONE], bundleName)) {
4690 APP_LOGE("bundleName invalid");
4691 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
4692 return false;
4693 }
4694 if (bundleName.empty()) {
4695 APP_LOGE("bundleName is empty");
4696 napi_value businessError = BusinessError::CreateCommonError(
4697 env, ERROR_BUNDLE_NOT_EXIST, GET_JSON_PROFILE, BUNDLE_PERMISSIONS);
4698 napi_throw(env, businessError);
4699 return false;
4700 }
4701 if (args.GetMaxArgc() >= ARGS_SIZE_THREE) {
4702 if (!CommonFunc::ParseString(env, args[ARGS_POS_TWO], moduleName)) {
4703 APP_LOGW("parse moduleName failed, try to get profile from entry module");
4704 } else if (moduleName.empty()) {
4705 APP_LOGE("moduleName is empty");
4706 napi_value businessError = BusinessError::CreateCommonError(
4707 env, ERROR_MODULE_NOT_EXIST, GET_JSON_PROFILE, BUNDLE_PERMISSIONS);
4708 napi_throw(env, businessError);
4709 return false;
4710 }
4711 }
4712 if (args.GetMaxArgc() == ARGS_SIZE_FOUR) {
4713 if (!CommonFunc::ParseInt(env, args[ARGS_POS_THREE], userId)) {
4714 APP_LOGE("userId invalid");
4715 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, USER_ID, TYPE_NUMBER);
4716 return false;
4717 }
4718 }
4719 return true;
4720 }
4721
GetJsonProfile(napi_env env,napi_callback_info info)4722 napi_value GetJsonProfile(napi_env env, napi_callback_info info)
4723 {
4724 APP_LOGD("GetJsonProfile napi called");
4725 int32_t profileType = 0;
4726 std::string bundleName;
4727 std::string moduleName;
4728 int32_t userId = Constants::UNSPECIFIED_USERID;
4729 if (!ParamsProcessGetJsonProfile(env, info, profileType, bundleName, moduleName, userId)) {
4730 APP_LOGE("paramsProcess failed");
4731 return nullptr;
4732 }
4733 auto iBundleMgr = CommonFunc::GetBundleMgr();
4734 if (iBundleMgr == nullptr) {
4735 APP_LOGE("iBundleMgr is null");
4736 return nullptr;
4737 }
4738 std::string profile;
4739 ErrCode ret = CommonFunc::ConvertErrCode(
4740 iBundleMgr->GetJsonProfile(static_cast<ProfileType>(profileType), bundleName, moduleName, profile, userId));
4741 if (ret != SUCCESS) {
4742 APP_LOGE_NOFUNC("napi GetJsonProfile err:%{public}d -n %{public}s", ret, bundleName.c_str());
4743 napi_value businessError = BusinessError::CreateCommonError(
4744 env, ret, GET_JSON_PROFILE, BUNDLE_PERMISSIONS);
4745 napi_throw(env, businessError);
4746 return nullptr;
4747 }
4748 napi_value nProfile;
4749 napi_create_string_utf8(env, profile.c_str(), NAPI_AUTO_LENGTH, &nProfile);
4750 APP_LOGD("call GetJsonProfile done");
4751 return nProfile;
4752 }
4753
InnerGetRecoverableApplicationInfo(std::vector<RecoverableApplicationInfo> & recoverableApplications)4754 static ErrCode InnerGetRecoverableApplicationInfo(std::vector<RecoverableApplicationInfo> &recoverableApplications)
4755 {
4756 auto iBundleMgr = CommonFunc::GetBundleMgr();
4757 if (iBundleMgr == nullptr) {
4758 APP_LOGE("iBundleMgr is null");
4759 return ERROR_BUNDLE_SERVICE_EXCEPTION;
4760 }
4761 ErrCode ret = iBundleMgr->GetRecoverableApplicationInfo(recoverableApplications);
4762 return CommonFunc::ConvertErrCode(ret);
4763 }
4764
GetRecoverableApplicationInfoExec(napi_env env,void * data)4765 void GetRecoverableApplicationInfoExec(napi_env env, void *data)
4766 {
4767 RecoverableApplicationCallbackInfo *asyncCallbackInfo =
4768 reinterpret_cast<RecoverableApplicationCallbackInfo *>(data);
4769 if (asyncCallbackInfo == nullptr) {
4770 return;
4771 }
4772 asyncCallbackInfo->err = InnerGetRecoverableApplicationInfo(asyncCallbackInfo->recoverableApplicationInfos);
4773 }
4774
GetRecoverableApplicationInfoExecComplete(napi_env env,napi_status status,void * data)4775 void GetRecoverableApplicationInfoExecComplete(napi_env env, napi_status status, void *data)
4776 {
4777 RecoverableApplicationCallbackInfo *asyncCallbackInfo =
4778 reinterpret_cast<RecoverableApplicationCallbackInfo *>(data);
4779 if (asyncCallbackInfo == nullptr) {
4780 return;
4781 }
4782 std::unique_ptr<RecoverableApplicationCallbackInfo> callbackPtr {asyncCallbackInfo};
4783 napi_value result[CALLBACK_PARAM_SIZE] = {0};
4784 if (asyncCallbackInfo->err == NO_ERROR) {
4785 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
4786 NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &result[ARGS_POS_ONE]));
4787 CommonFunc::ConvertRecoverableApplicationInfos(
4788 env, result[ARGS_POS_ONE], asyncCallbackInfo->recoverableApplicationInfos);
4789 } else {
4790 result[ARGS_POS_ZERO] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
4791 GET_RECOVERABLE_APPLICATION_INFO, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
4792 }
4793 CommonFunc::NapiReturnDeferred<RecoverableApplicationCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
4794 }
4795
GetRecoverableApplicationInfo(napi_env env,napi_callback_info info)4796 napi_value GetRecoverableApplicationInfo(napi_env env, napi_callback_info info)
4797 {
4798 APP_LOGD("NAPI_GetRecoverableApplicationInfo called");
4799 NapiArg args(env, info);
4800 RecoverableApplicationCallbackInfo *asyncCallbackInfo = new (std::nothrow) RecoverableApplicationCallbackInfo(env);
4801 if (asyncCallbackInfo == nullptr) {
4802 APP_LOGE("asyncCallbackInfo is null");
4803 return nullptr;
4804 }
4805 std::unique_ptr<RecoverableApplicationCallbackInfo> callbackPtr {asyncCallbackInfo};
4806 if (!args.Init(ARGS_SIZE_ZERO, ARGS_SIZE_ONE)) {
4807 APP_LOGE("param count invalid");
4808 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
4809 return nullptr;
4810 }
4811 for (size_t i = 0; i < args.GetMaxArgc(); ++i) {
4812 napi_valuetype valueType = napi_undefined;
4813 napi_typeof(env, args[i], &valueType);
4814 if (i == ARGS_POS_ZERO) {
4815 if (valueType == napi_function) {
4816 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
4817 break;
4818 }
4819 } else {
4820 APP_LOGE("param check error");
4821 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
4822 return nullptr;
4823 }
4824 }
4825 auto promise = CommonFunc::AsyncCallNativeMethod<RecoverableApplicationCallbackInfo>(
4826 env, asyncCallbackInfo, GET_RECOVERABLE_APPLICATION_INFO,
4827 GetRecoverableApplicationInfoExec, GetRecoverableApplicationInfoExecComplete);
4828 callbackPtr.release();
4829 APP_LOGD("call NAPI_GetRecoverableApplicationInfo done");
4830 return promise;
4831 }
4832
SetAdditionalInfo(napi_env env,napi_callback_info info)4833 napi_value SetAdditionalInfo(napi_env env, napi_callback_info info)
4834 {
4835 APP_LOGD("Called");
4836 NapiArg args(env, info);
4837 if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_TWO)) {
4838 APP_LOGE("Param count invalid");
4839 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
4840 return nullptr;
4841 }
4842 std::string bundleName;
4843 if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], bundleName)) {
4844 APP_LOGE("Parse bundleName failed");
4845 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
4846 return nullptr;
4847 }
4848 CHECK_STRING_EMPTY(env, bundleName, std::string{ BUNDLE_NAME });
4849 std::string additionalInfo;
4850 if (!CommonFunc::ParseString(env, args[ARGS_POS_ONE], additionalInfo)) {
4851 APP_LOGE("Parse additionalInfo failed");
4852 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, ADDITIONAL_INFO, TYPE_STRING);
4853 return nullptr;
4854 }
4855 auto iBundleMgr = CommonFunc::GetBundleMgr();
4856 if (iBundleMgr == nullptr) {
4857 APP_LOGE("Can not get iBundleMgr");
4858 BusinessError::ThrowError(env, ERROR_BUNDLE_SERVICE_EXCEPTION, ERR_MSG_BUNDLE_SERVICE_EXCEPTION);
4859 return nullptr;
4860 }
4861 ErrCode ret = CommonFunc::ConvertErrCode(iBundleMgr->SetAdditionalInfo(bundleName, additionalInfo));
4862 if (ret != NO_ERROR) {
4863 APP_LOGE("Call failed, bundleName is %{public}s", bundleName.c_str());
4864 napi_value businessError = BusinessError::CreateCommonError(
4865 env, ret, RESOURCE_NAME_OF_SET_ADDITIONAL_INFO, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
4866 napi_throw(env, businessError);
4867 return nullptr;
4868 }
4869 napi_value nRet = nullptr;
4870 NAPI_CALL(env, napi_get_undefined(env, &nRet));
4871 APP_LOGD("Call done");
4872 return nRet;
4873 }
4874
ParamsProcessCanOpenLink(napi_env env,napi_callback_info info,std::string & link)4875 ErrCode ParamsProcessCanOpenLink(napi_env env, napi_callback_info info,
4876 std::string& link)
4877 {
4878 NapiArg args(env, info);
4879 if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_ONE)) {
4880 APP_LOGE("param count invalid");
4881 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
4882 return ERROR_PARAM_CHECK_ERROR;
4883 }
4884 if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], link)) {
4885 APP_LOGW("Parse link failed");
4886 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, LINK, TYPE_STRING);
4887 return ERROR_PARAM_CHECK_ERROR;
4888 }
4889 return ERR_OK;
4890 }
4891
CanOpenLink(napi_env env,napi_callback_info info)4892 napi_value CanOpenLink(napi_env env, napi_callback_info info)
4893 {
4894 APP_LOGD("NAPI CanOpenLink call");
4895 napi_value nRet;
4896 bool canOpen = false;
4897 napi_get_boolean(env, canOpen, &nRet);
4898 std::string link;
4899 if (ParamsProcessCanOpenLink(env, info, link) != ERR_OK) {
4900 APP_LOGE("paramsProcess is invalid");
4901 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
4902 return nRet;
4903 }
4904 auto iBundleMgr = CommonFunc::GetBundleMgr();
4905 if (iBundleMgr == nullptr) {
4906 APP_LOGE("can not get iBundleMgr");
4907 BusinessError::ThrowError(env, ERROR_BUNDLE_SERVICE_EXCEPTION, ERR_MSG_BUNDLE_SERVICE_EXCEPTION);
4908 return nRet;
4909 }
4910 ErrCode ret = CommonFunc::ConvertErrCode(
4911 iBundleMgr->CanOpenLink(link, canOpen));
4912 if (ret != NO_ERROR) {
4913 APP_LOGE("CanOpenLink failed");
4914 napi_value businessError = BusinessError::CreateCommonError(
4915 env, ret, CAN_OPEN_LINK, "");
4916 napi_throw(env, businessError);
4917 return nRet;
4918 }
4919 NAPI_CALL(env, napi_get_boolean(env, canOpen, &nRet));
4920 APP_LOGD("call CanOpenLink done");
4921 return nRet;
4922 }
4923
ConvertPreinstalledApplicationInfo(napi_env env,const PreinstalledApplicationInfo & preinstalledApplicationInfo,napi_value objPreinstalledApplicationInfo)4924 void ConvertPreinstalledApplicationInfo(napi_env env, const PreinstalledApplicationInfo &preinstalledApplicationInfo,
4925 napi_value objPreinstalledApplicationInfo)
4926 {
4927 napi_value nBundleName;
4928 NAPI_CALL_RETURN_VOID(env,
4929 napi_create_string_utf8(env, preinstalledApplicationInfo.bundleName.c_str(), NAPI_AUTO_LENGTH, &nBundleName));
4930 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, objPreinstalledApplicationInfo, BUNDLE_NAME, nBundleName));
4931
4932 napi_value nModuleName;
4933 NAPI_CALL_RETURN_VOID(env,
4934 napi_create_string_utf8(env, preinstalledApplicationInfo.moduleName.c_str(), NAPI_AUTO_LENGTH, &nModuleName));
4935 NAPI_CALL_RETURN_VOID(env,
4936 napi_set_named_property(env, objPreinstalledApplicationInfo, MODULE_NAME, nModuleName));
4937
4938 napi_value nLabelId;
4939 NAPI_CALL_RETURN_VOID(env, napi_create_uint32(env, preinstalledApplicationInfo.labelId, &nLabelId));
4940 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, objPreinstalledApplicationInfo, LABEL_ID, nLabelId));
4941
4942 napi_value nIconId;
4943 NAPI_CALL_RETURN_VOID(env, napi_create_uint32(env, preinstalledApplicationInfo.iconId, &nIconId));
4944 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, objPreinstalledApplicationInfo, ICON_ID, nIconId));
4945 }
4946
4947
ProcessPreinstalledApplicationInfos(napi_env env,napi_value result,const std::vector<PreinstalledApplicationInfo> & preinstalledApplicationInfos)4948 static void ProcessPreinstalledApplicationInfos(
4949 napi_env env, napi_value result, const std::vector<PreinstalledApplicationInfo> &preinstalledApplicationInfos)
4950 {
4951 if (preinstalledApplicationInfos.size() == 0) {
4952 APP_LOGD("PreinstalledApplicationInfos is null");
4953 return;
4954 }
4955 size_t index = 0;
4956 napi_value objPreinstalledApplicationInfo;
4957 for (const auto &item : preinstalledApplicationInfos) {
4958 NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &objPreinstalledApplicationInfo));
4959 ConvertPreinstalledApplicationInfo(env, item, objPreinstalledApplicationInfo);
4960 NAPI_CALL_RETURN_VOID(env, napi_set_element(env, result, index, objPreinstalledApplicationInfo));
4961 index++;
4962 }
4963 }
4964
GetAllPreinstalledApplicationInfosComplete(napi_env env,napi_status status,void * data)4965 void GetAllPreinstalledApplicationInfosComplete(napi_env env, napi_status status, void *data)
4966 {
4967 PreinstalledApplicationInfosCallbackInfo *asyncCallbackInfo =
4968 reinterpret_cast<PreinstalledApplicationInfosCallbackInfo *>(data);
4969 if (asyncCallbackInfo == nullptr) {
4970 APP_LOGE("AsyncCallbackInfo is null");
4971 return;
4972 }
4973 std::unique_ptr<PreinstalledApplicationInfosCallbackInfo> callbackPtr {asyncCallbackInfo};
4974 napi_value result[CALLBACK_PARAM_SIZE] = {0};
4975 if (asyncCallbackInfo->err == NO_ERROR) {
4976 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
4977 NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &result[ARGS_POS_ONE]));
4978 ProcessPreinstalledApplicationInfos(env, result[ARGS_POS_ONE], asyncCallbackInfo->preinstalledApplicationInfos);
4979 } else {
4980 result[ARGS_POS_ZERO] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
4981 GET_ALL_PREINSTALLED_APP_INFOS, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
4982 }
4983 CommonFunc::NapiReturnDeferred<PreinstalledApplicationInfosCallbackInfo>(
4984 env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
4985 }
4986
InnerGetAllPreinstalledApplicationInfos(std::vector<PreinstalledApplicationInfo> & preinstalledApplicationInfos)4987 static ErrCode InnerGetAllPreinstalledApplicationInfos(
4988 std::vector<PreinstalledApplicationInfo> &preinstalledApplicationInfos)
4989 {
4990 auto iBundleMgr = CommonFunc::GetBundleMgr();
4991 if (iBundleMgr == nullptr) {
4992 APP_LOGE("IBundleMgr is null");
4993 return ERROR_BUNDLE_SERVICE_EXCEPTION;
4994 }
4995 ErrCode ret = iBundleMgr->GetAllPreinstalledApplicationInfos(preinstalledApplicationInfos);
4996 return CommonFunc::ConvertErrCode(ret);
4997 }
4998
GetAllPreinstalledApplicationInfosExec(napi_env env,void * data)4999 void GetAllPreinstalledApplicationInfosExec(napi_env env, void *data)
5000 {
5001 PreinstalledApplicationInfosCallbackInfo *asyncCallbackInfo =
5002 reinterpret_cast<PreinstalledApplicationInfosCallbackInfo *>(data);
5003 if (asyncCallbackInfo == nullptr) {
5004 APP_LOGE("AsyncCallbackInfo is null");
5005 return;
5006 }
5007 asyncCallbackInfo->err = InnerGetAllPreinstalledApplicationInfos(asyncCallbackInfo->preinstalledApplicationInfos);
5008 }
5009
GetAllPreinstalledApplicationInfos(napi_env env,napi_callback_info info)5010 napi_value GetAllPreinstalledApplicationInfos(napi_env env, napi_callback_info info)
5011 {
5012 APP_LOGD("Called");
5013 NapiArg args(env, info);
5014 PreinstalledApplicationInfosCallbackInfo *asyncCallbackInfo =
5015 new (std::nothrow) PreinstalledApplicationInfosCallbackInfo(env);
5016 if (asyncCallbackInfo == nullptr) {
5017 APP_LOGE("AsyncCallbackInfo is null");
5018 return nullptr;
5019 }
5020 std::unique_ptr<PreinstalledApplicationInfosCallbackInfo> callbackPtr {asyncCallbackInfo};
5021 if (!args.Init(ARGS_SIZE_ZERO, ARGS_SIZE_ZERO)) {
5022 APP_LOGE("Param count invalid");
5023 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
5024 return nullptr;
5025 }
5026 auto promise = CommonFunc::AsyncCallNativeMethod<PreinstalledApplicationInfosCallbackInfo>(env, asyncCallbackInfo,
5027 GET_ALL_PREINSTALLED_APP_INFOS, GetAllPreinstalledApplicationInfosExec,
5028 GetAllPreinstalledApplicationInfosComplete);
5029 callbackPtr.release();
5030 return promise;
5031 }
5032
GetAllBundleInfoByDeveloperId(napi_env env,napi_callback_info info)5033 napi_value GetAllBundleInfoByDeveloperId(napi_env env, napi_callback_info info)
5034 {
5035 APP_LOGD("Called");
5036 NapiArg args(env, info);
5037 if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_ONE)) {
5038 APP_LOGE("Param count invalid");
5039 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
5040 return nullptr;
5041 }
5042 std::string developerId;
5043 if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], developerId)) {
5044 APP_LOGE("Parse developerId failed");
5045 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, DEVELOPER_ID, TYPE_STRING);
5046 return nullptr;
5047 }
5048 CHECK_STRING_EMPTY(env, developerId, std::string{ DEVELOPER_ID });
5049 auto iBundleMgr = CommonFunc::GetBundleMgr();
5050 if (iBundleMgr == nullptr) {
5051 APP_LOGE("Can not get iBundleMgr");
5052 BusinessError::ThrowError(env, ERROR_BUNDLE_SERVICE_EXCEPTION, ERR_MSG_BUNDLE_SERVICE_EXCEPTION);
5053 return nullptr;
5054 }
5055 std::vector<BundleInfo> bundleInfos;
5056 int32_t userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
5057 ErrCode ret = CommonFunc::ConvertErrCode(
5058 iBundleMgr->GetAllBundleInfoByDeveloperId(developerId, bundleInfos, userId));
5059 if (ret != NO_ERROR) {
5060 APP_LOGE("Call failed, developerId is %{public}s", developerId.c_str());
5061 napi_value businessError = BusinessError::CreateCommonError(
5062 env, ret, GET_ALL_BUNDLE_INFO_BY_DEVELOPER_ID, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
5063 napi_throw(env, businessError);
5064 return nullptr;
5065 }
5066 napi_value nBundleInfos;
5067 NAPI_CALL(env, napi_create_array(env, &nBundleInfos));
5068 ProcessBundleInfos(env, nBundleInfos, bundleInfos,
5069 static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_APPLICATION));
5070 APP_LOGD("Call done");
5071 return nBundleInfos;
5072 }
5073
ProcessStringVec(napi_env env,napi_value result,const std::vector<std::string> & stringList)5074 static void ProcessStringVec(
5075 napi_env env, napi_value result, const std::vector<std::string> &stringList)
5076 {
5077 if (stringList.size() == 0) {
5078 APP_LOGD("stringList is null");
5079 return;
5080 }
5081 size_t index = 0;
5082 for (const auto &item : stringList) {
5083 APP_LOGD("string: %{public}s ", item.c_str());
5084 napi_value nString;
5085 NAPI_CALL_RETURN_VOID(env, napi_create_string_utf8(env, item.c_str(), NAPI_AUTO_LENGTH, &nString));
5086 NAPI_CALL_RETURN_VOID(env, napi_set_element(env, result, index, nString));
5087 index++;
5088 }
5089 }
5090
GetDeveloperIds(napi_env env,napi_callback_info info)5091 napi_value GetDeveloperIds(napi_env env, napi_callback_info info)
5092 {
5093 APP_LOGD("Called");
5094 NapiArg args(env, info);
5095 if (!args.Init(ARGS_SIZE_ZERO, ARGS_SIZE_ONE)) {
5096 APP_LOGE("Param count invalid");
5097 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
5098 return nullptr;
5099 }
5100 std::string distributionType;
5101 if (args.GetMaxArgc() >= ARGS_SIZE_ONE) {
5102 int32_t appDistributionTypeEnum = 0;
5103 if (!CommonFunc::ParseInt(env, args[ARGS_POS_ZERO], appDistributionTypeEnum)) {
5104 APP_LOGE("parseInt failed");
5105 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, APP_DISTRIBUTION_TYPE, TYPE_NUMBER);
5106 return nullptr;
5107 }
5108 if (appDistributionTypeMap.find(appDistributionTypeEnum) == appDistributionTypeMap.end()) {
5109 APP_LOGE("request error, type %{public}d is invalid", appDistributionTypeEnum);
5110 BusinessError::ThrowEnumError(env, APP_DISTRIBUTION_TYPE, APP_DISTRIBUTION_TYPE_ENUM);
5111 return nullptr;
5112 }
5113 distributionType = std::string{ appDistributionTypeMap[appDistributionTypeEnum] };
5114 }
5115
5116 auto iBundleMgr = CommonFunc::GetBundleMgr();
5117 if (iBundleMgr == nullptr) {
5118 APP_LOGE("Can not get iBundleMgr");
5119 BusinessError::ThrowError(env, ERROR_BUNDLE_SERVICE_EXCEPTION, ERR_MSG_BUNDLE_SERVICE_EXCEPTION);
5120 return nullptr;
5121 }
5122 std::vector<std::string> developerIds;
5123 int32_t userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
5124 ErrCode ret = CommonFunc::ConvertErrCode(
5125 iBundleMgr->GetDeveloperIds(distributionType, developerIds, userId));
5126 if (ret != NO_ERROR) {
5127 APP_LOGW("Call failed, appDistributionType is %{public}s", distributionType.c_str());
5128 napi_value businessError = BusinessError::CreateCommonError(
5129 env, ret, GET_DEVELOPER_IDS, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
5130 napi_throw(env, businessError);
5131 return nullptr;
5132 }
5133 napi_value nDeveloperIds;
5134 NAPI_CALL(env, napi_create_array(env, &nDeveloperIds));
5135 ProcessStringVec(env, nDeveloperIds, developerIds);
5136 APP_LOGD("Call done");
5137 return nDeveloperIds;
5138 }
5139
SwitchUninstallState(napi_env env,napi_callback_info info)5140 napi_value SwitchUninstallState(napi_env env, napi_callback_info info)
5141 {
5142 APP_LOGI("NAPI SwitchUninstallState call");
5143 NapiArg args(env, info);
5144 if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_TWO)) {
5145 APP_LOGE("Param count invalid");
5146 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
5147 return nullptr;
5148 }
5149 std::string bundleName;
5150 if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], bundleName)) {
5151 APP_LOGE("Parse bundleName failed");
5152 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
5153 return nullptr;
5154 }
5155 bool state;
5156 if (!CommonFunc::ParseBool(env, args[ARGS_POS_ONE], state)) {
5157 APP_LOGE("Parse state failed");
5158 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, STATE, TYPE_BOOLEAN);
5159 return nullptr;
5160 }
5161 auto iBundleMgr = CommonFunc::GetBundleMgr();
5162 if (iBundleMgr == nullptr) {
5163 APP_LOGE("can not get iBundleMgr");
5164 BusinessError::ThrowError(env, ERROR_BUNDLE_SERVICE_EXCEPTION, ERR_MSG_BUNDLE_SERVICE_EXCEPTION);
5165 return nullptr;
5166 }
5167 ErrCode ret = CommonFunc::ConvertErrCode(iBundleMgr->SwitchUninstallState(bundleName, state));
5168 if (ret != NO_ERROR) {
5169 APP_LOGE("SwitchUninstallState failed");
5170 napi_value businessError = BusinessError::CreateCommonError(
5171 env, ret, SWITCH_UNINSTALL_STATE, "");
5172 napi_throw(env, businessError);
5173 return nullptr;
5174 }
5175 napi_value nRet = nullptr;
5176 NAPI_CALL(env, napi_get_undefined(env, &nRet));
5177 APP_LOGD("call SwitchUninstallState done");
5178 return nRet;
5179 }
5180
InnerGetAppCloneBundleInfo(const std::string & bundleName,int32_t appIndex,int32_t bundleFlags,int32_t userId,BundleInfo & bundleInfo)5181 static ErrCode InnerGetAppCloneBundleInfo(const std::string &bundleName, int32_t appIndex,
5182 int32_t bundleFlags, int32_t userId, BundleInfo &bundleInfo)
5183 {
5184 auto iBundleMgr = CommonFunc::GetBundleMgr();
5185 if (iBundleMgr == nullptr) {
5186 APP_LOGE("can not get iBundleMgr");
5187 return ERROR_BUNDLE_SERVICE_EXCEPTION;
5188 }
5189 ErrCode ret = iBundleMgr->GetCloneBundleInfo(bundleName, bundleFlags, appIndex, bundleInfo, userId);
5190 APP_LOGD("GetCloneBundleInfo result is %{public}d", ret);
5191 return CommonFunc::ConvertErrCode(ret);
5192 }
5193
GetAppCloneBundleInfoExec(napi_env env,void * data)5194 void GetAppCloneBundleInfoExec(napi_env env, void *data)
5195 {
5196 CloneAppBundleInfoCallbackInfo *asyncCallbackInfo = reinterpret_cast<CloneAppBundleInfoCallbackInfo *>(data);
5197 if (asyncCallbackInfo == nullptr) {
5198 APP_LOGE("asyncCallbackInfo is null");
5199 return;
5200 }
5201 APP_LOGD("param: name=%{public}s,index=%{public}d,bundleFlags=%{public}d,userId=%{public}d",
5202 asyncCallbackInfo->bundleName.c_str(),
5203 asyncCallbackInfo->appIndex,
5204 asyncCallbackInfo->bundleFlags,
5205 asyncCallbackInfo->userId);
5206 asyncCallbackInfo->err =
5207 InnerGetAppCloneBundleInfo(asyncCallbackInfo->bundleName, asyncCallbackInfo->appIndex,
5208 asyncCallbackInfo->bundleFlags, asyncCallbackInfo->userId, asyncCallbackInfo->bundleInfo);
5209 }
5210
GetAppCloneBundleInfoComplete(napi_env env,napi_status status,void * data)5211 void GetAppCloneBundleInfoComplete(napi_env env, napi_status status, void *data)
5212 {
5213 CloneAppBundleInfoCallbackInfo *asyncCallbackInfo = reinterpret_cast<CloneAppBundleInfoCallbackInfo *>(data);
5214 if (asyncCallbackInfo == nullptr) {
5215 APP_LOGE("asyncCallbackInfo is null");
5216 return;
5217 }
5218 std::unique_ptr<CloneAppBundleInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
5219 napi_value result[CALLBACK_PARAM_SIZE] = {0};
5220 if (asyncCallbackInfo->err == NO_ERROR) {
5221 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
5222 NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &result[ARGS_POS_ONE]));
5223 CommonFunc::ConvertBundleInfo(env, asyncCallbackInfo->bundleInfo, result[ARGS_POS_ONE],
5224 asyncCallbackInfo->bundleFlags);
5225 } else {
5226 result[ARGS_POS_ZERO] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
5227 GET_APP_CLONE_BUNDLE_INFO, Constants::PERMISSION_GET_BUNDLE_INFO);
5228 }
5229 CommonFunc::NapiReturnDeferred<CloneAppBundleInfoCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
5230 }
5231
GetAppCloneBundleInfo(napi_env env,napi_callback_info info)5232 napi_value GetAppCloneBundleInfo(napi_env env, napi_callback_info info)
5233 {
5234 APP_LOGD("NAPI GetAppCloneBundleInfo call");
5235 NapiArg args(env, info);
5236 if (!args.Init(ARGS_SIZE_THREE, ARGS_SIZE_FOUR)) {
5237 APP_LOGE("Param count invalid");
5238 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
5239 return nullptr;
5240 }
5241 std::unique_ptr<CloneAppBundleInfoCallbackInfo> asyncCallbackInfo =
5242 std::make_unique<CloneAppBundleInfoCallbackInfo>(env);
5243 if (asyncCallbackInfo == nullptr) {
5244 APP_LOGW("asyncCallbackInfo is null");
5245 return nullptr;
5246 }
5247 if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], asyncCallbackInfo->bundleName)) {
5248 APP_LOGE("Parse bundleName failed");
5249 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
5250 return nullptr;
5251 }
5252 if (!CommonFunc::ParseInt(env, args[ARGS_POS_ONE], asyncCallbackInfo->appIndex)) {
5253 APP_LOGE("Parse appIndex failed");
5254 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, APP_INDEX, TYPE_NUMBER);
5255 return nullptr;
5256 }
5257 if (!CommonFunc::ParseInt(env, args[ARGS_POS_TWO], asyncCallbackInfo->bundleFlags)) {
5258 APP_LOGE("Parse bundleFlags failed");
5259 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_FLAGS, TYPE_NUMBER);
5260 return nullptr;
5261 }
5262 if (!CommonFunc::ParseInt(env, args[ARGS_POS_THREE], asyncCallbackInfo->userId)) {
5263 APP_LOGI("Parse userId failed, use default value");
5264 }
5265 auto promise = CommonFunc::AsyncCallNativeMethod<CloneAppBundleInfoCallbackInfo>(
5266 env, asyncCallbackInfo.get(), GET_APP_CLONE_BUNDLE_INFO,
5267 GetAppCloneBundleInfoExec, GetAppCloneBundleInfoComplete);
5268 asyncCallbackInfo.release();
5269 APP_LOGD("call GetAppCloneBundleInfo done");
5270 return promise;
5271 }
5272
InnerGetAllAppCloneBundleInfo(const std::string & bundleName,int32_t bundleFlags,int32_t userId,std::vector<BundleInfo> & bundleInfos)5273 static ErrCode InnerGetAllAppCloneBundleInfo(const std::string &bundleName, int32_t bundleFlags,
5274 int32_t userId, std::vector<BundleInfo> &bundleInfos)
5275 {
5276 auto iBundleMgr = CommonFunc::GetBundleMgr();
5277 if (iBundleMgr == nullptr) {
5278 APP_LOGE("can not get iBundleMgr");
5279 return ERROR_BUNDLE_SERVICE_EXCEPTION;
5280 }
5281 BundleInfo bundleInfoMain;
5282 ErrCode ret = iBundleMgr->GetCloneBundleInfo(bundleName, bundleFlags, 0, bundleInfoMain, userId);
5283 APP_LOGD("GetMainBundleInfo appIndex = 0, ret=%{public}d", ret);
5284 if (ret == ERR_OK) {
5285 bundleInfos.emplace_back(bundleInfoMain);
5286 }
5287 if (ret != ERR_OK && ret != ERR_BUNDLE_MANAGER_APPLICATION_DISABLED) {
5288 return CommonFunc::ConvertErrCode(ret);
5289 }
5290 // handle clone apps
5291 std::vector<int32_t> appIndexes;
5292 ErrCode getCloneIndexesRet = iBundleMgr->GetCloneAppIndexes(bundleName, appIndexes, userId);
5293 if (getCloneIndexesRet != ERR_OK) {
5294 if (ret == ERR_OK) {
5295 return SUCCESS;
5296 }
5297 return CommonFunc::ConvertErrCode(ret);
5298 }
5299 for (int32_t appIndex : appIndexes) {
5300 BundleInfo bundleInfo;
5301 ret = iBundleMgr->GetCloneBundleInfo(bundleName, bundleFlags, appIndex, bundleInfo, userId);
5302 if (ret == ERR_OK) {
5303 bundleInfos.emplace_back(bundleInfo);
5304 }
5305 }
5306 if (bundleInfos.empty()) {
5307 return ERROR_BUNDLE_IS_DISABLED;
5308 }
5309 return SUCCESS;
5310 }
5311
GetAllAppCloneBundleInfoExec(napi_env env,void * data)5312 void GetAllAppCloneBundleInfoExec(napi_env env, void *data)
5313 {
5314 CloneAppBundleInfosCallbackInfo *asyncCallbackInfo = reinterpret_cast<CloneAppBundleInfosCallbackInfo *>(data);
5315 if (asyncCallbackInfo == nullptr) {
5316 APP_LOGE("asyncCallbackInfo is null");
5317 return;
5318 }
5319 APP_LOGD("param: name=%{public}s,bundleFlags=%{public}d,userId=%{public}d",
5320 asyncCallbackInfo->bundleName.c_str(),
5321 asyncCallbackInfo->bundleFlags,
5322 asyncCallbackInfo->userId);
5323 asyncCallbackInfo->err =
5324 InnerGetAllAppCloneBundleInfo(asyncCallbackInfo->bundleName, asyncCallbackInfo->bundleFlags,
5325 asyncCallbackInfo->userId, asyncCallbackInfo->bundleInfos);
5326 }
5327
CloneAppBundleInfos(napi_env env,napi_value result,const std::vector<BundleInfo> & bundleInfos,int32_t flags)5328 static void CloneAppBundleInfos(
5329 napi_env env, napi_value result, const std::vector<BundleInfo> &bundleInfos, int32_t flags)
5330 {
5331 if (bundleInfos.size() == 0) {
5332 APP_LOGD("bundleInfos is null");
5333 return;
5334 }
5335 size_t index = 0;
5336 for (const auto &item : bundleInfos) {
5337 napi_value objBundleInfo;
5338 NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &objBundleInfo));
5339 CommonFunc::ConvertBundleInfo(env, item, objBundleInfo, flags);
5340 NAPI_CALL_RETURN_VOID(env, napi_set_element(env, result, index++, objBundleInfo));
5341 }
5342 }
5343
GetAllAppCloneBundleInfoComplete(napi_env env,napi_status status,void * data)5344 void GetAllAppCloneBundleInfoComplete(napi_env env, napi_status status, void *data)
5345 {
5346 CloneAppBundleInfosCallbackInfo *asyncCallbackInfo = reinterpret_cast<CloneAppBundleInfosCallbackInfo *>(data);
5347 if (asyncCallbackInfo == nullptr) {
5348 APP_LOGE("asyncCallbackInfo is null");
5349 return;
5350 }
5351 std::unique_ptr<CloneAppBundleInfosCallbackInfo> callbackPtr {asyncCallbackInfo};
5352 napi_value result[CALLBACK_PARAM_SIZE] = {0};
5353 if (asyncCallbackInfo->err == NO_ERROR) {
5354 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
5355 NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &result[ARGS_POS_ONE]));
5356 CloneAppBundleInfos(env, result[ARGS_POS_ONE], asyncCallbackInfo->bundleInfos, asyncCallbackInfo->bundleFlags);
5357 } else {
5358 result[ARGS_POS_ZERO] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
5359 GET_ALL_APP_CLONE_BUNDLE_INFO, Constants::PERMISSION_GET_BUNDLE_INFO);
5360 }
5361 CommonFunc::NapiReturnDeferred<CloneAppBundleInfosCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
5362 }
5363
GetAllAppCloneBundleInfo(napi_env env,napi_callback_info info)5364 napi_value GetAllAppCloneBundleInfo(napi_env env, napi_callback_info info)
5365 {
5366 APP_LOGD("NAPI GetAllAppCloneBundleInfo call");
5367 NapiArg args(env, info);
5368 if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_THREE)) {
5369 APP_LOGE("Param count invalid");
5370 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
5371 return nullptr;
5372 }
5373 std::unique_ptr<CloneAppBundleInfosCallbackInfo> asyncCallbackInfo =
5374 std::make_unique<CloneAppBundleInfosCallbackInfo>(env);
5375 if (asyncCallbackInfo == nullptr) {
5376 APP_LOGW("asyncCallbackInfo is null");
5377 return nullptr;
5378 }
5379 if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], asyncCallbackInfo->bundleName)) {
5380 APP_LOGE("Parse bundleName failed");
5381 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
5382 return nullptr;
5383 }
5384 if (!CommonFunc::ParseInt(env, args[ARGS_POS_ONE], asyncCallbackInfo->bundleFlags)) {
5385 APP_LOGE("Parse bundleFlags failed");
5386 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_FLAGS, TYPE_NUMBER);
5387 return nullptr;
5388 }
5389 if (!CommonFunc::ParseInt(env, args[ARGS_POS_TWO], asyncCallbackInfo->userId)) {
5390 APP_LOGI("Parse userId failed, use default value");
5391 }
5392 auto promise = CommonFunc::AsyncCallNativeMethod<CloneAppBundleInfosCallbackInfo>(
5393 env, asyncCallbackInfo.get(), GET_ALL_APP_CLONE_BUNDLE_INFO,
5394 GetAllAppCloneBundleInfoExec, GetAllAppCloneBundleInfoComplete);
5395 asyncCallbackInfo.release();
5396 APP_LOGD("call GetAllAppCloneBundleInfo done");
5397 return promise;
5398 }
5399
CreateMultiAppModeTypeObject(napi_env env,napi_value value)5400 void CreateMultiAppModeTypeObject(napi_env env, napi_value value)
5401 {
5402 napi_value nUnspecified;
5403 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(MultiAppModeType::UNSPECIFIED),
5404 &nUnspecified));
5405 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, UNSPECIFIED, nUnspecified));
5406
5407 napi_value nMultiInstance;
5408 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(MultiAppModeType::MULTI_INSTANCE),
5409 &nMultiInstance));
5410 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, MULTI_INSTANCE, nMultiInstance));
5411
5412 napi_value nAppClone;
5413 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(MultiAppModeType::APP_CLONE),
5414 &nAppClone));
5415 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, APP_CLONE, nAppClone));
5416 }
5417 }
5418 }
5419