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 if ((asyncCallbackInfo->err == NO_ERROR) && (asyncCallbackInfo->cleanCacheCallback != nullptr)) {
2114 // wait for OnCleanCacheFinished
2115 APP_LOGI("clean exec wait");
2116 if (asyncCallbackInfo->cleanCacheCallback->WaitForCompletion()) {
2117 asyncCallbackInfo->err = asyncCallbackInfo->cleanCacheCallback->GetErr() ?
2118 NO_ERROR : ERROR_BUNDLE_SERVICE_EXCEPTION;
2119 } else {
2120 APP_LOGI("clean exec timeout");
2121 asyncCallbackInfo->err = ERROR_BUNDLE_SERVICE_EXCEPTION;
2122 }
2123 }
2124 APP_LOGI("clean exec end");
2125 }
2126
CleanBundleCacheFilesComplete(napi_env env,napi_status status,void * data)2127 void CleanBundleCacheFilesComplete(napi_env env, napi_status status, void *data)
2128 {
2129 CleanBundleCacheCallbackInfo* asyncCallbackInfo = reinterpret_cast<CleanBundleCacheCallbackInfo*>(data);
2130 std::unique_ptr<CleanBundleCacheCallbackInfo> callbackPtr {asyncCallbackInfo};
2131 napi_value result[1] = { 0 };
2132 // implement callback or promise
2133 if (asyncCallbackInfo->err == NO_ERROR) {
2134 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
2135 } else {
2136 result[0] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
2137 "CleanBundleCacheFiles", Constants::PERMISSION_REMOVECACHEFILE);
2138 }
2139 CommonFunc::NapiReturnDeferred<CleanBundleCacheCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_ONE);
2140 }
2141
CleanBundleCacheFiles(napi_env env,napi_callback_info info)2142 napi_value CleanBundleCacheFiles(napi_env env, napi_callback_info info)
2143 {
2144 APP_LOGD("napi begin to CleanBundleCacheFiles");
2145 NapiArg args(env, info);
2146 CleanBundleCacheCallbackInfo *asyncCallbackInfo = new (std::nothrow) CleanBundleCacheCallbackInfo(env);
2147 if (asyncCallbackInfo == nullptr) {
2148 APP_LOGE("CleanBundleCacheFiles asyncCallbackInfo is null");
2149 return nullptr;
2150 }
2151 std::unique_ptr<CleanBundleCacheCallbackInfo> callbackPtr {asyncCallbackInfo};
2152 if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_TWO)) {
2153 APP_LOGE("CleanBundleCacheFiles napi func init failed");
2154 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2155 return nullptr;
2156 }
2157 size_t maxArgc = args.GetMaxArgc();
2158 if (maxArgc >= ARGS_SIZE_ONE) {
2159 if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], asyncCallbackInfo->bundleName)) {
2160 APP_LOGE("CleanBundleCacheFiles bundleName is not a string");
2161 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, PARAMETER_BUNDLE_NAME, TYPE_STRING);
2162 return nullptr;
2163 }
2164 if (maxArgc >= ARGS_SIZE_TWO) {
2165 napi_valuetype valueType = napi_undefined;
2166 napi_typeof(env, args[ARGS_POS_ONE], &valueType);
2167 if (valueType == napi_function) {
2168 NAPI_CALL(env, napi_create_reference(env, args[ARGS_POS_ONE],
2169 NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
2170 }
2171 }
2172 } else {
2173 APP_LOGE("param error");
2174 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2175 return nullptr;
2176 }
2177 auto promise = CommonFunc::AsyncCallNativeMethod<CleanBundleCacheCallbackInfo>(
2178 env, asyncCallbackInfo, "CleanBundleCacheFiles", CleanBundleCacheFilesExec, CleanBundleCacheFilesComplete);
2179 callbackPtr.release();
2180 APP_LOGD("napi call CleanBundleCacheFiles done");
2181 return promise;
2182 }
2183
InnerVerify(const std::vector<std::string> & abcPaths,bool flag)2184 ErrCode InnerVerify(const std::vector<std::string> &abcPaths, bool flag)
2185 {
2186 auto verifyManager = CommonFunc::GetVerifyManager();
2187 if (verifyManager == nullptr) {
2188 APP_LOGE("iBundleMgr is null");
2189 return ERROR_BUNDLE_SERVICE_EXCEPTION;
2190 }
2191
2192 ErrCode ret = verifyManager->Verify(abcPaths);
2193 if (ret == ERR_OK && flag) {
2194 verifyManager->RemoveFiles(abcPaths);
2195 }
2196 return CommonFunc::ConvertErrCode(ret);
2197 }
2198
VerifyExec(napi_env env,void * data)2199 void VerifyExec(napi_env env, void *data)
2200 {
2201 VerifyCallbackInfo* asyncCallbackInfo = reinterpret_cast<VerifyCallbackInfo*>(data);
2202 if (asyncCallbackInfo == nullptr) {
2203 APP_LOGE("error VerifyCallbackInfo is nullptr");
2204 return;
2205 }
2206
2207 asyncCallbackInfo->err = InnerVerify(asyncCallbackInfo->abcPaths, asyncCallbackInfo->flag);
2208 }
2209
VerifyComplete(napi_env env,napi_status status,void * data)2210 void VerifyComplete(napi_env env, napi_status status, void *data)
2211 {
2212 VerifyCallbackInfo *asyncCallbackInfo = reinterpret_cast<VerifyCallbackInfo *>(data);
2213 if (asyncCallbackInfo == nullptr) {
2214 APP_LOGE("asyncCallbackInfo is null");
2215 return;
2216 }
2217
2218 std::unique_ptr<VerifyCallbackInfo> callbackPtr {asyncCallbackInfo};
2219 napi_value result[ARGS_POS_TWO] = {0};
2220 if (asyncCallbackInfo->err == NO_ERROR) {
2221 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
2222 } else {
2223 result[0] = BusinessError::CreateCommonError(
2224 env, asyncCallbackInfo->err, VERIFY_ABC, Constants::PERMISSION_RUN_DYN_CODE);
2225 }
2226
2227 CommonFunc::NapiReturnDeferred<VerifyCallbackInfo>(
2228 env, asyncCallbackInfo, result, ARGS_SIZE_ONE);
2229 }
2230
VerifyAbc(napi_env env,napi_callback_info info)2231 napi_value VerifyAbc(napi_env env, napi_callback_info info)
2232 {
2233 APP_LOGD("napi call VerifyAbc called");
2234 NapiArg args(env, info);
2235 VerifyCallbackInfo *asyncCallbackInfo = new (std::nothrow) VerifyCallbackInfo(env);
2236 if (asyncCallbackInfo == nullptr) {
2237 APP_LOGE("VerifyCallbackInfo asyncCallbackInfo is null");
2238 return nullptr;
2239 }
2240
2241 std::unique_ptr<VerifyCallbackInfo> callbackPtr {asyncCallbackInfo};
2242 if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_THREE)) {
2243 APP_LOGE("VerifyCallbackInfo napi func init failed");
2244 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2245 return nullptr;
2246 }
2247
2248 if (!CommonFunc::ParseStringArray(env, asyncCallbackInfo->abcPaths, args[ARGS_POS_ZERO])) {
2249 APP_LOGE("ParseStringArray invalid");
2250 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, VERIFY_ABC, TYPE_ARRAY);
2251 return nullptr;
2252 }
2253
2254 if (!CommonFunc::ParseBool(env, args[ARGS_POS_ONE], asyncCallbackInfo->flag)) {
2255 APP_LOGE("ParseBool invalid");
2256 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, VERIFY_ABC, TYPE_BOOLEAN);
2257 return nullptr;
2258 }
2259
2260 size_t maxArgc = args.GetMaxArgc();
2261 if (maxArgc > ARGS_SIZE_TWO) {
2262 napi_valuetype valueType = napi_undefined;
2263 napi_typeof(env, args[ARGS_SIZE_TWO], &valueType);
2264 if (valueType == napi_function) {
2265 NAPI_CALL(env, napi_create_reference(env, args[ARGS_SIZE_TWO],
2266 NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
2267 }
2268 }
2269 auto promise = CommonFunc::AsyncCallNativeMethod<VerifyCallbackInfo>(
2270 env, asyncCallbackInfo, "VerifyAbc", VerifyExec, VerifyComplete);
2271 callbackPtr.release();
2272 APP_LOGD("napi call VerifyAbc done");
2273 return promise;
2274 }
2275
InnerGetExtResource(const std::string & bundleName,std::vector<std::string> & moduleNames)2276 ErrCode InnerGetExtResource(
2277 const std::string &bundleName, std::vector<std::string> &moduleNames)
2278 {
2279 auto extResourceManager = CommonFunc::GetExtendResourceManager();
2280 if (extResourceManager == nullptr) {
2281 APP_LOGE("extResourceManager is null");
2282 return ERROR_BUNDLE_SERVICE_EXCEPTION;
2283 }
2284
2285 ErrCode ret = extResourceManager->GetExtResource(bundleName, moduleNames);
2286 if (ret != ERR_OK) {
2287 APP_LOGE("GetExtResource failed");
2288 }
2289
2290 return CommonFunc::ConvertErrCode(ret);
2291 }
2292
GetExtResourceExec(napi_env env,void * data)2293 void GetExtResourceExec(napi_env env, void *data)
2294 {
2295 DynamicIconCallbackInfo *asyncCallbackInfo = reinterpret_cast<DynamicIconCallbackInfo *>(data);
2296 if (asyncCallbackInfo == nullptr) {
2297 APP_LOGE("asyncCallbackInfo is null");
2298 return;
2299 }
2300 asyncCallbackInfo->err = InnerGetExtResource(
2301 asyncCallbackInfo->bundleName, asyncCallbackInfo->moduleNames);
2302 }
2303
SetStrArrayToNapiObj(napi_env env,napi_value result,const std::vector<std::string> & strArray)2304 static void SetStrArrayToNapiObj(
2305 napi_env env, napi_value result, const std::vector<std::string> &strArray)
2306 {
2307 if (strArray.size() == 0) {
2308 APP_LOGD("bundleInfos is null");
2309 return;
2310 }
2311 size_t index = 0;
2312 for (const auto &item : strArray) {
2313 APP_LOGD("item: %{public}s ", item.c_str());
2314 napi_value itemStr;
2315 NAPI_CALL_RETURN_VOID(env, napi_create_string_utf8(
2316 env, item.c_str(), NAPI_AUTO_LENGTH, &itemStr));
2317 NAPI_CALL_RETURN_VOID(env, napi_set_element(env, result, index, itemStr));
2318 index++;
2319 }
2320 }
2321
GetExtResourceComplete(napi_env env,napi_status status,void * data)2322 void GetExtResourceComplete(napi_env env, napi_status status, void *data)
2323 {
2324 DynamicIconCallbackInfo *asyncCallbackInfo = reinterpret_cast<DynamicIconCallbackInfo *>(data);
2325 if (asyncCallbackInfo == nullptr) {
2326 APP_LOGE("asyncCallbackInfo is null");
2327 return;
2328 }
2329
2330 std::unique_ptr<DynamicIconCallbackInfo> callbackPtr {asyncCallbackInfo};
2331 napi_value result[ARGS_POS_TWO] = {0};
2332 if (asyncCallbackInfo->err == NO_ERROR) {
2333 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
2334 NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &result[ARGS_POS_ONE]));
2335 SetStrArrayToNapiObj(env, result[ARGS_POS_ONE], asyncCallbackInfo->moduleNames);
2336 } else {
2337 result[0] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
2338 GET_EXT_RESOURCE, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
2339 }
2340
2341 CommonFunc::NapiReturnDeferred<DynamicIconCallbackInfo>(
2342 env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
2343 }
2344
GetExtResource(napi_env env,napi_callback_info info)2345 napi_value GetExtResource(napi_env env, napi_callback_info info)
2346 {
2347 APP_LOGD("GetExtResource called");
2348 NapiArg args(env, info);
2349 DynamicIconCallbackInfo *asyncCallbackInfo = new (std::nothrow) DynamicIconCallbackInfo(env);
2350 if (asyncCallbackInfo == nullptr) {
2351 APP_LOGE("asyncCallbackInfo is null");
2352 return nullptr;
2353 }
2354 std::unique_ptr<DynamicIconCallbackInfo> callbackPtr {asyncCallbackInfo};
2355 if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_ONE)) {
2356 APP_LOGE("param count invalid");
2357 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2358 return nullptr;
2359 }
2360
2361 if (!CommonFunc::ParseString(env, args[0], asyncCallbackInfo->bundleName)) {
2362 APP_LOGE("bundleName invalid");
2363 BusinessError::ThrowParameterTypeError(
2364 env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
2365 return nullptr;
2366 }
2367 auto promise = CommonFunc::AsyncCallNativeMethod<DynamicIconCallbackInfo>(
2368 env, asyncCallbackInfo, "GetExtResource", GetExtResourceExec, GetExtResourceComplete);
2369 callbackPtr.release();
2370 APP_LOGD("call GetExtResource done");
2371 return promise;
2372 }
2373
InnerEnableDynamicIcon(const std::string & bundleName,const std::string & moduleName)2374 ErrCode InnerEnableDynamicIcon(
2375 const std::string &bundleName, const std::string &moduleName)
2376 {
2377 auto extResourceManager = CommonFunc::GetExtendResourceManager();
2378 if (extResourceManager == nullptr) {
2379 APP_LOGE("extResourceManager is null");
2380 return ERROR_BUNDLE_SERVICE_EXCEPTION;
2381 }
2382
2383 ErrCode ret = extResourceManager->EnableDynamicIcon(bundleName, moduleName);
2384 if (ret != ERR_OK) {
2385 APP_LOGE("EnableDynamicIcon failed");
2386 }
2387
2388 return CommonFunc::ConvertErrCode(ret);
2389 }
2390
EnableDynamicIconExec(napi_env env,void * data)2391 void EnableDynamicIconExec(napi_env env, void *data)
2392 {
2393 DynamicIconCallbackInfo *asyncCallbackInfo = reinterpret_cast<DynamicIconCallbackInfo *>(data);
2394 if (asyncCallbackInfo == nullptr) {
2395 APP_LOGE("asyncCallbackInfo is null");
2396 return;
2397 }
2398 asyncCallbackInfo->err = InnerEnableDynamicIcon(
2399 asyncCallbackInfo->bundleName, asyncCallbackInfo->moduleName);
2400 }
2401
EnableDynamicIconComplete(napi_env env,napi_status status,void * data)2402 void EnableDynamicIconComplete(napi_env env, napi_status status, void *data)
2403 {
2404 DynamicIconCallbackInfo *asyncCallbackInfo = reinterpret_cast<DynamicIconCallbackInfo *>(data);
2405 if (asyncCallbackInfo == nullptr) {
2406 APP_LOGE("asyncCallbackInfo is null");
2407 return;
2408 }
2409
2410 std::unique_ptr<DynamicIconCallbackInfo> callbackPtr {asyncCallbackInfo};
2411 napi_value result[ARGS_POS_TWO] = {0};
2412 if (asyncCallbackInfo->err == NO_ERROR) {
2413 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
2414 } else {
2415 result[0] = BusinessError::CreateCommonError(env,
2416 asyncCallbackInfo->err, ENABLE_DYNAMIC_ICON, Constants::PERMISSION_ACCESS_DYNAMIC_ICON);
2417 }
2418
2419 CommonFunc::NapiReturnDeferred<DynamicIconCallbackInfo>(
2420 env, asyncCallbackInfo, result, ARGS_SIZE_ONE);
2421 }
2422
EnableDynamicIcon(napi_env env,napi_callback_info info)2423 napi_value EnableDynamicIcon(napi_env env, napi_callback_info info)
2424 {
2425 APP_LOGD("EnableDynamicIcon called");
2426 NapiArg args(env, info);
2427 DynamicIconCallbackInfo *asyncCallbackInfo = new (std::nothrow) DynamicIconCallbackInfo(env);
2428 if (asyncCallbackInfo == nullptr) {
2429 APP_LOGE("asyncCallbackInfo is null");
2430 return nullptr;
2431 }
2432 std::unique_ptr<DynamicIconCallbackInfo> callbackPtr {asyncCallbackInfo};
2433 if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_TWO)) {
2434 APP_LOGE("param count invalid");
2435 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2436 return nullptr;
2437 }
2438 for (size_t i = 0; i < args.GetArgc(); ++i) {
2439 napi_valuetype valueType = napi_undefined;
2440 napi_typeof(env, args[i], &valueType);
2441 if (i == ARGS_POS_ZERO) {
2442 if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->bundleName)) {
2443 APP_LOGE("bundleName invalid");
2444 BusinessError::ThrowParameterTypeError(
2445 env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
2446 return nullptr;
2447 }
2448 } else if (i == ARGS_POS_ONE) {
2449 if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->moduleName)) {
2450 APP_LOGE("moduleName invalid");
2451 BusinessError::ThrowParameterTypeError(
2452 env, ERROR_PARAM_CHECK_ERROR, MODULE_NAME, TYPE_STRING);
2453 return nullptr;
2454 }
2455 }
2456 }
2457 auto promise = CommonFunc::AsyncCallNativeMethod<DynamicIconCallbackInfo>(
2458 env, asyncCallbackInfo, "EnableDynamicIcon", EnableDynamicIconExec, EnableDynamicIconComplete);
2459 callbackPtr.release();
2460 APP_LOGD("call EnableDynamicIcon done");
2461 return promise;
2462 }
2463
InnerDisableDynamicIcon(const std::string & bundleName)2464 ErrCode InnerDisableDynamicIcon(const std::string &bundleName)
2465 {
2466 auto extResourceManager = CommonFunc::GetExtendResourceManager();
2467 if (extResourceManager == nullptr) {
2468 APP_LOGE("extResourceManager is null");
2469 return ERROR_BUNDLE_SERVICE_EXCEPTION;
2470 }
2471
2472 ErrCode ret = extResourceManager->DisableDynamicIcon(bundleName);
2473 if (ret != ERR_OK) {
2474 APP_LOGE("DisableDynamicIcon failed");
2475 }
2476
2477 return CommonFunc::ConvertErrCode(ret);
2478 }
2479
DisableDynamicIconExec(napi_env env,void * data)2480 void DisableDynamicIconExec(napi_env env, void *data)
2481 {
2482 DynamicIconCallbackInfo *asyncCallbackInfo = reinterpret_cast<DynamicIconCallbackInfo *>(data);
2483 if (asyncCallbackInfo == nullptr) {
2484 APP_LOGE("asyncCallbackInfo is null");
2485 return;
2486 }
2487 asyncCallbackInfo->err = InnerDisableDynamicIcon(asyncCallbackInfo->bundleName);
2488 }
2489
DisableDynamicIconComplete(napi_env env,napi_status status,void * data)2490 void DisableDynamicIconComplete(napi_env env, napi_status status, void *data)
2491 {
2492 DynamicIconCallbackInfo *asyncCallbackInfo = reinterpret_cast<DynamicIconCallbackInfo *>(data);
2493 if (asyncCallbackInfo == nullptr) {
2494 APP_LOGE("asyncCallbackInfo is null");
2495 return;
2496 }
2497
2498 std::unique_ptr<DynamicIconCallbackInfo> callbackPtr {asyncCallbackInfo};
2499 napi_value result[ARGS_POS_TWO] = {0};
2500 if (asyncCallbackInfo->err == NO_ERROR) {
2501 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
2502 } else {
2503 result[0] = BusinessError::CreateCommonError(
2504 env, asyncCallbackInfo->err, DISABLE_DYNAMIC_ICON, Constants::PERMISSION_ACCESS_DYNAMIC_ICON);
2505 }
2506
2507 CommonFunc::NapiReturnDeferred<DynamicIconCallbackInfo>(
2508 env, asyncCallbackInfo, result, ARGS_SIZE_ONE);
2509 }
2510
DisableDynamicIcon(napi_env env,napi_callback_info info)2511 napi_value DisableDynamicIcon(napi_env env, napi_callback_info info)
2512 {
2513 APP_LOGD("DisableDynamicIcon called");
2514 NapiArg args(env, info);
2515 DynamicIconCallbackInfo *asyncCallbackInfo = new (std::nothrow) DynamicIconCallbackInfo(env);
2516 if (asyncCallbackInfo == nullptr) {
2517 APP_LOGE("asyncCallbackInfo is null");
2518 return nullptr;
2519 }
2520 std::unique_ptr<DynamicIconCallbackInfo> callbackPtr {asyncCallbackInfo};
2521 if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_ONE)) {
2522 APP_LOGE("param count invalid");
2523 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2524 return nullptr;
2525 }
2526
2527 if (!CommonFunc::ParseString(env, args[0], asyncCallbackInfo->bundleName)) {
2528 APP_LOGE("bundleName invalid");
2529 BusinessError::ThrowParameterTypeError(
2530 env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
2531 return nullptr;
2532 }
2533 auto promise = CommonFunc::AsyncCallNativeMethod<DynamicIconCallbackInfo>(
2534 env, asyncCallbackInfo, "DisableDynamicIcon", DisableDynamicIconExec, DisableDynamicIconComplete);
2535 callbackPtr.release();
2536 APP_LOGD("call DisableDynamicIcon done");
2537 return promise;
2538 }
2539
InnerGetDynamicIcon(const std::string & bundleName,std::string & moduleName)2540 ErrCode InnerGetDynamicIcon(const std::string &bundleName, std::string &moduleName)
2541 {
2542 auto extResourceManager = CommonFunc::GetExtendResourceManager();
2543 if (extResourceManager == nullptr) {
2544 APP_LOGE("extResourceManager is null");
2545 return ERROR_BUNDLE_SERVICE_EXCEPTION;
2546 }
2547
2548 ErrCode ret = extResourceManager->GetDynamicIcon(bundleName, moduleName);
2549 if (ret != ERR_OK) {
2550 APP_LOGE_NOFUNC("GetDynamicIcon failed");
2551 }
2552
2553 return CommonFunc::ConvertErrCode(ret);
2554 }
2555
GetDynamicIconExec(napi_env env,void * data)2556 void GetDynamicIconExec(napi_env env, void *data)
2557 {
2558 DynamicIconCallbackInfo *asyncCallbackInfo = reinterpret_cast<DynamicIconCallbackInfo *>(data);
2559 if (asyncCallbackInfo == nullptr) {
2560 APP_LOGE("asyncCallbackInfo is null");
2561 return;
2562 }
2563 asyncCallbackInfo->err = InnerGetDynamicIcon(
2564 asyncCallbackInfo->bundleName, asyncCallbackInfo->moduleName);
2565 }
2566
GetDynamicIconComplete(napi_env env,napi_status status,void * data)2567 void GetDynamicIconComplete(napi_env env, napi_status status, void *data)
2568 {
2569 DynamicIconCallbackInfo *asyncCallbackInfo = reinterpret_cast<DynamicIconCallbackInfo *>(data);
2570 if (asyncCallbackInfo == nullptr) {
2571 APP_LOGE("asyncCallbackInfo is null");
2572 return;
2573 }
2574
2575 std::unique_ptr<DynamicIconCallbackInfo> callbackPtr {asyncCallbackInfo};
2576 napi_value result[ARGS_POS_TWO] = {0};
2577 if (asyncCallbackInfo->err == NO_ERROR) {
2578 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
2579 NAPI_CALL_RETURN_VOID(env, napi_create_string_utf8(env,
2580 asyncCallbackInfo->moduleName.c_str(), NAPI_AUTO_LENGTH, &result[ARGS_POS_ONE]));
2581 } else {
2582 result[0] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
2583 GET_DYNAMIC_ICON, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
2584 }
2585
2586 CommonFunc::NapiReturnDeferred<DynamicIconCallbackInfo>(
2587 env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
2588 }
2589
GetDynamicIcon(napi_env env,napi_callback_info info)2590 napi_value GetDynamicIcon(napi_env env, napi_callback_info info)
2591 {
2592 APP_LOGD("GetDynamicIcon called");
2593 NapiArg args(env, info);
2594 DynamicIconCallbackInfo *asyncCallbackInfo = new (std::nothrow) DynamicIconCallbackInfo(env);
2595 if (asyncCallbackInfo == nullptr) {
2596 APP_LOGE("asyncCallbackInfo is null");
2597 return nullptr;
2598 }
2599 std::unique_ptr<DynamicIconCallbackInfo> callbackPtr {asyncCallbackInfo};
2600 if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_ONE)) {
2601 APP_LOGE("param count invalid");
2602 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2603 return nullptr;
2604 }
2605
2606 if (!CommonFunc::ParseString(env, args[0], asyncCallbackInfo->bundleName)) {
2607 APP_LOGE("bundleName invalid");
2608 BusinessError::ThrowParameterTypeError(
2609 env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
2610 return nullptr;
2611 }
2612 auto promise = CommonFunc::AsyncCallNativeMethod<DynamicIconCallbackInfo>(
2613 env, asyncCallbackInfo, "GetDynamicIcon", GetDynamicIconExec, GetDynamicIconComplete);
2614 callbackPtr.release();
2615 APP_LOGD("call GetDynamicIcon done");
2616 return promise;
2617 }
2618
InnerDeleteAbc(const std::string & path)2619 ErrCode InnerDeleteAbc(const std::string &path)
2620 {
2621 auto verifyManager = CommonFunc::GetVerifyManager();
2622 if (verifyManager == nullptr) {
2623 APP_LOGE("iBundleMgr is null");
2624 return ERROR_BUNDLE_SERVICE_EXCEPTION;
2625 }
2626
2627 ErrCode ret = verifyManager->DeleteAbc(path);
2628 if (ret != ERR_OK) {
2629 APP_LOGE("DeleteAbc failed");
2630 }
2631
2632 return CommonFunc::ConvertErrCode(ret);
2633 }
2634
DeleteAbcExec(napi_env env,void * data)2635 void DeleteAbcExec(napi_env env, void *data)
2636 {
2637 VerifyCallbackInfo* asyncCallbackInfo = reinterpret_cast<VerifyCallbackInfo*>(data);
2638 if (asyncCallbackInfo == nullptr) {
2639 APP_LOGE("error VerifyCallbackInfo is nullptr");
2640 return;
2641 }
2642
2643 asyncCallbackInfo->err = InnerDeleteAbc(asyncCallbackInfo->deletePath);
2644 }
2645
DeleteAbcComplete(napi_env env,napi_status status,void * data)2646 void DeleteAbcComplete(napi_env env, napi_status status, void *data)
2647 {
2648 VerifyCallbackInfo *asyncCallbackInfo = reinterpret_cast<VerifyCallbackInfo *>(data);
2649 if (asyncCallbackInfo == nullptr) {
2650 APP_LOGE("asyncCallbackInfo is null");
2651 return;
2652 }
2653
2654 std::unique_ptr<VerifyCallbackInfo> callbackPtr {asyncCallbackInfo};
2655 napi_value result[ARGS_POS_TWO] = {0};
2656 if (asyncCallbackInfo->err == NO_ERROR) {
2657 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
2658 } else {
2659 result[0] = BusinessError::CreateCommonError(
2660 env, asyncCallbackInfo->err, DELETE_ABC, Constants::PERMISSION_RUN_DYN_CODE);
2661 }
2662
2663 CommonFunc::NapiReturnDeferred<VerifyCallbackInfo>(
2664 env, asyncCallbackInfo, result, ARGS_SIZE_ONE);
2665 }
2666
DeleteAbc(napi_env env,napi_callback_info info)2667 napi_value DeleteAbc(napi_env env, napi_callback_info info)
2668 {
2669 APP_LOGD("napi call DeleteAbc called");
2670 NapiArg args(env, info);
2671 VerifyCallbackInfo *asyncCallbackInfo = new (std::nothrow) VerifyCallbackInfo(env);
2672 if (asyncCallbackInfo == nullptr) {
2673 APP_LOGE("VerifyCallbackInfo asyncCallbackInfo is null");
2674 return nullptr;
2675 }
2676
2677 std::unique_ptr<VerifyCallbackInfo> callbackPtr {asyncCallbackInfo};
2678 if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_ONE)) {
2679 APP_LOGE("VerifyCallbackInfo napi func init failed");
2680 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2681 return nullptr;
2682 }
2683
2684 if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], asyncCallbackInfo->deletePath)) {
2685 APP_LOGE("CleanBundleCacheFiles deletePath is not a string");
2686 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, DELETE_ABC, TYPE_STRING);
2687 return nullptr;
2688 }
2689
2690 auto promise = CommonFunc::AsyncCallNativeMethod<VerifyCallbackInfo>(
2691 env, asyncCallbackInfo, "DeleteAbc", DeleteAbcExec, DeleteAbcComplete);
2692 callbackPtr.release();
2693 APP_LOGD("napi call DeleteAbc done");
2694 return promise;
2695 }
2696
InnerGetLaunchWantForBundleExec(const std::string & bundleName,Want & want,int32_t userId)2697 static ErrCode InnerGetLaunchWantForBundleExec(
2698 const std::string& bundleName, Want &want, int32_t userId)
2699 {
2700 auto iBundleMgr = CommonFunc::GetBundleMgr();
2701 if (iBundleMgr == nullptr) {
2702 APP_LOGE("can not get iBundleMgr");
2703 return ERROR_BUNDLE_SERVICE_EXCEPTION;
2704 }
2705
2706 ErrCode result = iBundleMgr->GetLaunchWantForBundle(bundleName, want, userId);
2707 if (result != ERR_OK) {
2708 APP_LOGE("GetLaunchWantForBundle call error, bundleName is %{public}s, userId is %{public}d",
2709 bundleName.c_str(), userId);
2710 }
2711
2712 return CommonFunc::ConvertErrCode(result);
2713 }
2714
GetLaunchWantForBundleExec(napi_env env,void * data)2715 void GetLaunchWantForBundleExec(napi_env env, void *data)
2716 {
2717 LaunchWantCallbackInfo* asyncCallbackInfo = reinterpret_cast<LaunchWantCallbackInfo*>(data);
2718 if (asyncCallbackInfo == nullptr) {
2719 APP_LOGE("error LaunchWantCallbackInfo is nullptr");
2720 return;
2721 }
2722
2723 asyncCallbackInfo->err = InnerGetLaunchWantForBundleExec(
2724 asyncCallbackInfo->bundleName, asyncCallbackInfo->want, asyncCallbackInfo->userId);
2725 }
2726
GetLaunchWantForBundleComplete(napi_env env,napi_status status,void * data)2727 void GetLaunchWantForBundleComplete(napi_env env, napi_status status, void *data)
2728 {
2729 LaunchWantCallbackInfo *asyncCallbackInfo = reinterpret_cast<LaunchWantCallbackInfo *>(data);
2730 if (asyncCallbackInfo == nullptr) {
2731 APP_LOGE("asyncCallbackInfo is null");
2732 return;
2733 }
2734
2735 std::unique_ptr<LaunchWantCallbackInfo> callbackPtr {asyncCallbackInfo};
2736 napi_value result[ARGS_POS_TWO] = {0};
2737 if (asyncCallbackInfo->err == NO_ERROR) {
2738 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
2739 NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &result[1]));
2740 CommonFunc::ConvertWantInfo(env, result[1], asyncCallbackInfo->want);
2741 } else {
2742 result[0] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err, GET_LAUNCH_WANT_FOR_BUNDLE,
2743 Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
2744 }
2745
2746 CommonFunc::NapiReturnDeferred<LaunchWantCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
2747 }
2748
GetLaunchWantForBundle(napi_env env,napi_callback_info info)2749 napi_value GetLaunchWantForBundle(napi_env env, napi_callback_info info)
2750 {
2751 APP_LOGD("napi begin to GetLaunchWantForBundle");
2752 NapiArg args(env, info);
2753 LaunchWantCallbackInfo *asyncCallbackInfo = new (std::nothrow) LaunchWantCallbackInfo(env);
2754 if (asyncCallbackInfo == nullptr) {
2755 APP_LOGE("GetLaunchWantForBundle asyncCallbackInfo is null");
2756 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2757 return nullptr;
2758 }
2759 asyncCallbackInfo->userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
2760 std::unique_ptr<LaunchWantCallbackInfo> callbackPtr {asyncCallbackInfo};
2761 if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_THREE)) {
2762 APP_LOGE("GetLaunchWantForBundle napi func init failed");
2763 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2764 return nullptr;
2765 }
2766 size_t maxArgc = args.GetMaxArgc();
2767 for (size_t i = 0; i < maxArgc; ++i) {
2768 napi_valuetype valueType = napi_undefined;
2769 napi_typeof(env, args[i], &valueType);
2770 if (i == ARGS_POS_ZERO) {
2771 if (valueType != napi_string) {
2772 APP_LOGE("GetLaunchWantForBundle bundleName is not a string");
2773 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, STRING_TYPE);
2774 return nullptr;
2775 }
2776 CommonFunc::ParseString(env, args[i], asyncCallbackInfo->bundleName);
2777 if (asyncCallbackInfo->bundleName.size() == 0) {
2778 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, STRING_TYPE);
2779 return nullptr;
2780 }
2781 } else if (i == ARGS_POS_ONE) {
2782 if (valueType == napi_function) {
2783 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
2784 break;
2785 }
2786 if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->userId)) {
2787 APP_LOGW("Parse userId failed, set this parameter to the caller userId");
2788 }
2789 } else if (i == ARGS_POS_TWO) {
2790 if (valueType == napi_function) {
2791 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
2792 break;
2793 }
2794 } else {
2795 APP_LOGE("GetLaunchWantForBundle arg err");
2796 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2797 return nullptr;
2798 }
2799 }
2800 auto promise = CommonFunc::AsyncCallNativeMethod<LaunchWantCallbackInfo>(
2801 env, asyncCallbackInfo, "GetLaunchWantForBundle", GetLaunchWantForBundleExec, GetLaunchWantForBundleComplete);
2802 callbackPtr.release();
2803 APP_LOGD("napi call GetLaunchWantForBundle done");
2804 return promise;
2805 }
2806
GetAbilityFromBundleInfo(const BundleInfo & bundleInfo,const std::string & abilityName,const std::string & moduleName,AbilityInfo & targetAbilityInfo)2807 ErrCode GetAbilityFromBundleInfo(const BundleInfo& bundleInfo, const std::string& abilityName,
2808 const std::string& moduleName, AbilityInfo& targetAbilityInfo)
2809 {
2810 bool ifExists = false;
2811 for (const auto& hapModuleInfo : bundleInfo.hapModuleInfos) {
2812 for (const auto& abilityInfo : hapModuleInfo.abilityInfos) {
2813 if (abilityInfo.name == abilityName && abilityInfo.moduleName == moduleName) {
2814 if (!abilityInfo.enabled) {
2815 APP_LOGI("ability disabled");
2816 return ERR_BUNDLE_MANAGER_ABILITY_DISABLED;
2817 }
2818 ifExists = true;
2819 targetAbilityInfo = abilityInfo;
2820 break;
2821 }
2822 }
2823 if (ifExists) {
2824 break;
2825 }
2826 }
2827 if (!ifExists) {
2828 APP_LOGE("ability not exist");
2829 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
2830 }
2831 return ERR_OK;
2832 }
2833
GetExtensionFromBundleInfo(const BundleInfo & bundleInfo,const std::string & abilityName,const std::string & moduleName,ExtensionAbilityInfo & targetExtensionInfo)2834 ErrCode GetExtensionFromBundleInfo(const BundleInfo& bundleInfo, const std::string& abilityName,
2835 const std::string& moduleName, ExtensionAbilityInfo& targetExtensionInfo)
2836 {
2837 bool ifExists = false;
2838 for (const auto& hapModuleInfo : bundleInfo.hapModuleInfos) {
2839 for (const auto& extensionInfo : hapModuleInfo.extensionInfos) {
2840 if (extensionInfo.name == abilityName && extensionInfo.moduleName == moduleName) {
2841 ifExists = true;
2842 targetExtensionInfo = extensionInfo;
2843 break;
2844 }
2845 if (!extensionInfo.enabled) {
2846 APP_LOGI("extension disabled");
2847 return ERR_BUNDLE_MANAGER_ABILITY_DISABLED;
2848 }
2849 }
2850 if (ifExists) {
2851 break;
2852 }
2853 }
2854 if (!ifExists) {
2855 APP_LOGE("ability not exist");
2856 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
2857 }
2858 return ERR_OK;
2859 }
2860
InnerGetProfile(GetProfileCallbackInfo & info)2861 static ErrCode InnerGetProfile(GetProfileCallbackInfo &info)
2862 {
2863 auto iBundleMgr = CommonFunc::GetBundleMgr();
2864 if (iBundleMgr == nullptr) {
2865 APP_LOGE("can not get iBundleMgr");
2866 return ERROR_BUNDLE_SERVICE_EXCEPTION;
2867 }
2868
2869 if (info.abilityName.empty()) {
2870 APP_LOGE("InnerGetProfile failed due to empty abilityName");
2871 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
2872 }
2873
2874 if (info.moduleName.empty()) {
2875 APP_LOGE("InnerGetProfile failed due to empty moduleName");
2876 return ERR_BUNDLE_MANAGER_MODULE_NOT_EXIST;
2877 }
2878 auto baseFlag = static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE) +
2879 static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_METADATA) +
2880 static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_DISABLE);
2881 ErrCode result;
2882 BundleMgrClient client;
2883 BundleInfo bundleInfo;
2884 if (info.type == AbilityProfileType::ABILITY_PROFILE) {
2885 auto getAbilityFlag = baseFlag +
2886 static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_ABILITY);
2887 result = iBundleMgr->GetBundleInfoForSelf(getAbilityFlag, bundleInfo);
2888 if (result != ERR_OK) {
2889 APP_LOGE("GetBundleInfoForSelf failed");
2890 return result;
2891 }
2892 AbilityInfo targetAbilityInfo;
2893 result = GetAbilityFromBundleInfo(
2894 bundleInfo, info.abilityName, info.moduleName, targetAbilityInfo);
2895 if (result != ERR_OK) {
2896 return result;
2897 }
2898 if (!client.GetProfileFromAbility(targetAbilityInfo, info.metadataName, info.profileVec)) {
2899 APP_LOGE("GetProfileFromExtension failed");
2900 return ERR_BUNDLE_MANAGER_PROFILE_NOT_EXIST;
2901 }
2902 return ERR_OK;
2903 }
2904
2905 if (info.type == AbilityProfileType::EXTENSION_PROFILE) {
2906 auto getExtensionFlag = baseFlag +
2907 static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_EXTENSION_ABILITY);
2908 result = iBundleMgr->GetBundleInfoForSelf(getExtensionFlag, bundleInfo);
2909 if (result != ERR_OK) {
2910 APP_LOGE("GetBundleInfoForSelf failed");
2911 return result;
2912 }
2913
2914 ExtensionAbilityInfo targetExtensionInfo;
2915 result = GetExtensionFromBundleInfo(
2916 bundleInfo, info.abilityName, info.moduleName, targetExtensionInfo);
2917 if (result != ERR_OK) {
2918 return result;
2919 }
2920 if (!client.GetProfileFromExtension(targetExtensionInfo, info.metadataName, info.profileVec)) {
2921 APP_LOGE("GetProfileFromExtension failed");
2922 return ERR_BUNDLE_MANAGER_PROFILE_NOT_EXIST;
2923 }
2924 return ERR_OK;
2925 }
2926
2927 APP_LOGE("InnerGetProfile failed due to type is invalid");
2928 return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
2929 }
2930
GetProfileExec(napi_env env,void * data)2931 void GetProfileExec(napi_env env, void *data)
2932 {
2933 GetProfileCallbackInfo* asyncCallbackInfo = reinterpret_cast<GetProfileCallbackInfo*>(data);
2934 if (asyncCallbackInfo == nullptr) {
2935 APP_LOGE("error GetProfileCallbackInfo is nullptr");
2936 return;
2937 }
2938
2939 ErrCode result = InnerGetProfile(*asyncCallbackInfo);
2940 asyncCallbackInfo->err = CommonFunc::ConvertErrCode(result);
2941 }
2942
GetProfileComplete(napi_env env,napi_status status,void * data)2943 void GetProfileComplete(napi_env env, napi_status status, void *data)
2944 {
2945 GetProfileCallbackInfo *asyncCallbackInfo = reinterpret_cast<GetProfileCallbackInfo *>(data);
2946 if (asyncCallbackInfo == nullptr) {
2947 APP_LOGE("asyncCallbackInfo is null");
2948 return;
2949 }
2950
2951 std::unique_ptr<GetProfileCallbackInfo> callbackPtr {asyncCallbackInfo};
2952 napi_value result[ARGS_POS_TWO] = {0};
2953 if (asyncCallbackInfo->err == NO_ERROR) {
2954 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
2955 NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &result[1]));
2956 CommonFunc::ConvertStringArrays(env, asyncCallbackInfo->profileVec, result[1]);
2957 } else {
2958 result[0] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err, "", "");
2959 }
2960
2961 CommonFunc::NapiReturnDeferred<GetProfileCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
2962 }
2963
GetProfile(napi_env env,napi_callback_info info,const AbilityProfileType & profileType)2964 napi_value GetProfile(napi_env env, napi_callback_info info, const AbilityProfileType &profileType)
2965 {
2966 APP_LOGD("napi begin to GetProfile");
2967 NapiArg args(env, info);
2968 GetProfileCallbackInfo *asyncCallbackInfo = new (std::nothrow) GetProfileCallbackInfo(env);
2969 if (asyncCallbackInfo == nullptr) {
2970 APP_LOGE("GetProfile asyncCallbackInfo is null");
2971 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2972 return nullptr;
2973 }
2974
2975 asyncCallbackInfo->type = profileType;
2976 std::unique_ptr<GetProfileCallbackInfo> callbackPtr {asyncCallbackInfo};
2977 if (!args.Init(ARGS_POS_TWO, ARGS_SIZE_FOUR)) {
2978 APP_LOGE("GetProfile napi func init failed");
2979 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2980 return nullptr;
2981 }
2982 size_t maxArgc = args.GetMaxArgc();
2983 for (size_t i = 0; i < maxArgc; ++i) {
2984 napi_valuetype valueType = napi_undefined;
2985 napi_typeof(env, args[i], &valueType);
2986 if (i == ARGS_POS_ZERO) {
2987 if (valueType != napi_string) {
2988 APP_LOGE("GetProfile moduleName is not a string");
2989 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, MODULE_NAME, STRING_TYPE);
2990 return nullptr;
2991 }
2992 CommonFunc::ParseString(env, args[i], asyncCallbackInfo->moduleName);
2993 } else if (i == ARGS_POS_ONE) {
2994 if (valueType != napi_string) {
2995 APP_LOGE("GetProfile abilityName is not a string");
2996 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, ABILITY_NAME, STRING_TYPE);
2997 return nullptr;
2998 }
2999 CommonFunc::ParseString(env, args[i], asyncCallbackInfo->abilityName);
3000 } else if (i == ARGS_POS_TWO) {
3001 if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->metadataName)) {
3002 APP_LOGW("Parse metadataName failed, The default value is undefined");
3003 }
3004 } else if (i == ARGS_POS_THREE) {
3005 if (valueType == napi_function) {
3006 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
3007 break;
3008 }
3009 } else {
3010 APP_LOGE("GetProfile arg err");
3011 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
3012 return nullptr;
3013 }
3014 }
3015 auto promise = CommonFunc::AsyncCallNativeMethod<GetProfileCallbackInfo>(
3016 env, asyncCallbackInfo, "GetProfile", GetProfileExec, GetProfileComplete);
3017 callbackPtr.release();
3018 APP_LOGD("napi call GetProfile done");
3019 return promise;
3020 }
3021
GetProfileByAbility(napi_env env,napi_callback_info info)3022 napi_value GetProfileByAbility(napi_env env, napi_callback_info info)
3023 {
3024 APP_LOGD("napi begin to GetProfileByAbility");
3025 return GetProfile(env, info, AbilityProfileType::ABILITY_PROFILE);
3026 }
3027
GetProfileByExAbility(napi_env env,napi_callback_info info)3028 napi_value GetProfileByExAbility(napi_env env, napi_callback_info info)
3029 {
3030 APP_LOGD("napi begin to GetProfileByExAbility");
3031 return GetProfile(env, info, AbilityProfileType::EXTENSION_PROFILE);
3032 }
3033
CreateExtensionAbilityFlagObject(napi_env env,napi_value value)3034 void CreateExtensionAbilityFlagObject(napi_env env, napi_value value)
3035 {
3036 napi_value nGetExtensionAbilityInfoDefault;
3037 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3038 GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_DEFAULT), &nGetExtensionAbilityInfoDefault));
3039 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_EXTENSION_ABILITY_INFO_DEFAULT",
3040 nGetExtensionAbilityInfoDefault));
3041
3042 napi_value nGetExtensionAbilityInfoWithPermission;
3043 NAPI_CALL_RETURN_VOID(env,
3044 napi_create_int32(env, static_cast<int32_t>(
3045 GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_PERMISSION),
3046 &nGetExtensionAbilityInfoWithPermission));
3047 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_EXTENSION_ABILITY_INFO_WITH_PERMISSION",
3048 nGetExtensionAbilityInfoWithPermission));
3049
3050 napi_value nGetExtensionAbilityInfoWithApplication;
3051 NAPI_CALL_RETURN_VOID(env,
3052 napi_create_int32(env, static_cast<int32_t>(
3053 GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_APPLICATION),
3054 &nGetExtensionAbilityInfoWithApplication));
3055 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_EXTENSION_ABILITY_INFO_WITH_APPLICATION",
3056 nGetExtensionAbilityInfoWithApplication));
3057
3058 napi_value nGetExtensionAbilityInfoWithMetadata;
3059 NAPI_CALL_RETURN_VOID(env,
3060 napi_create_int32(env, static_cast<int32_t>(
3061 GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_METADATA),
3062 &nGetExtensionAbilityInfoWithMetadata));
3063 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_EXTENSION_ABILITY_INFO_WITH_METADATA",
3064 nGetExtensionAbilityInfoWithMetadata));
3065
3066 napi_value nGetExtensionAbilityInfoWithSkill;
3067 NAPI_CALL_RETURN_VOID(env,
3068 napi_create_int32(env, static_cast<int32_t>(
3069 GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_SKILL),
3070 &nGetExtensionAbilityInfoWithSkill));
3071 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_EXTENSION_ABILITY_INFO_WITH_SKILL",
3072 nGetExtensionAbilityInfoWithSkill));
3073 }
3074
CreateExtensionAbilityTypeObject(napi_env env,napi_value value)3075 void CreateExtensionAbilityTypeObject(napi_env env, napi_value value)
3076 {
3077 napi_value nForm;
3078 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::FORM), &nForm));
3079 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "FORM", nForm));
3080
3081 napi_value nWorkSchedule;
3082 NAPI_CALL_RETURN_VOID(env,
3083 napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::WORK_SCHEDULER), &nWorkSchedule));
3084 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "WORK_SCHEDULER", nWorkSchedule));
3085
3086 napi_value nInputMethod;
3087 NAPI_CALL_RETURN_VOID(env,
3088 napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::INPUTMETHOD), &nInputMethod));
3089 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "INPUT_METHOD", nInputMethod));
3090
3091 napi_value nService;
3092 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::SERVICE), &nService));
3093 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SERVICE", nService));
3094
3095 napi_value nAccessibility;
3096 NAPI_CALL_RETURN_VOID(env,
3097 napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::ACCESSIBILITY), &nAccessibility));
3098 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "ACCESSIBILITY", nAccessibility));
3099
3100 napi_value nDataShare;
3101 NAPI_CALL_RETURN_VOID(env,
3102 napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::DATASHARE), &nDataShare));
3103 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "DATA_SHARE", nDataShare));
3104
3105 napi_value nFileShare;
3106 NAPI_CALL_RETURN_VOID(env,
3107 napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::FILESHARE), &nFileShare));
3108 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "FILE_SHARE", nFileShare));
3109
3110 napi_value nStaticSubscriber;
3111 NAPI_CALL_RETURN_VOID(env,
3112 napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::STATICSUBSCRIBER), &nStaticSubscriber));
3113 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "STATIC_SUBSCRIBER", nStaticSubscriber));
3114
3115 napi_value nWallpaper;
3116 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3117 static_cast<int32_t>(ExtensionAbilityType::WALLPAPER), &nWallpaper));
3118 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "WALLPAPER", nWallpaper));
3119
3120 napi_value nBackup;
3121 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3122 static_cast<int32_t>(ExtensionAbilityType::BACKUP), &nBackup));
3123 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "BACKUP", nBackup));
3124
3125 napi_value nWindow;
3126 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3127 static_cast<int32_t>(ExtensionAbilityType::WINDOW), &nWindow));
3128 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "WINDOW", nWindow));
3129
3130 napi_value nEnterpriseAdmin;
3131 NAPI_CALL_RETURN_VOID(env,
3132 napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::ENTERPRISE_ADMIN), &nEnterpriseAdmin));
3133 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "ENTERPRISE_ADMIN", nEnterpriseAdmin));
3134
3135 napi_value nTHUMBNAIL;
3136 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3137 static_cast<int32_t>(ExtensionAbilityType::THUMBNAIL), &nTHUMBNAIL));
3138 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "THUMBNAIL", nTHUMBNAIL));
3139
3140 napi_value nPREVIEW;
3141 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3142 static_cast<int32_t>(ExtensionAbilityType::PREVIEW), &nPREVIEW));
3143 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "PREVIEW", nPREVIEW));
3144
3145 napi_value nPrint;
3146 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3147 static_cast<int32_t>(ExtensionAbilityType::PRINT), &nPrint));
3148 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "PRINT", nPrint));
3149
3150 napi_value nShare;
3151 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3152 static_cast<int32_t>(ExtensionAbilityType::SHARE), &nShare));
3153 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SHARE", nShare));
3154
3155 napi_value nAction;
3156 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3157 static_cast<int32_t>(ExtensionAbilityType::ACTION), &nAction));
3158 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "ACTION", nAction));
3159
3160 napi_value nAdsService;
3161 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3162 static_cast<int32_t>(ExtensionAbilityType::ADS_SERVICE), &nAdsService));
3163 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "ADS_SERVICE", nAdsService));
3164
3165 napi_value nEmbeddedUI;
3166 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3167 static_cast<int32_t>(ExtensionAbilityType::EMBEDDED_UI), &nEmbeddedUI));
3168 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "EMBEDDED_UI", nEmbeddedUI));
3169
3170 napi_value nfence;
3171 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3172 static_cast<int32_t>(ExtensionAbilityType::FENCE), &nfence));
3173 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "FENCE", nfence));
3174
3175 napi_value nInsightIntentUI;
3176 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3177 static_cast<int32_t>(ExtensionAbilityType::INSIGHT_INTENT_UI), &nInsightIntentUI));
3178 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "INSIGHT_INTENT_UI", nInsightIntentUI));
3179
3180 napi_value nAuthorization;
3181 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3182 static_cast<int32_t>(ExtensionAbilityType::APP_ACCOUNT_AUTHORIZATION), &nAuthorization));
3183 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "APP_ACCOUNT_AUTHORIZATION", nAuthorization));
3184
3185 napi_value nUI;
3186 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3187 static_cast<int32_t>(ExtensionAbilityType::UI), &nUI));
3188 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "UI", nUI));
3189
3190 napi_value nPush;
3191 NAPI_CALL_RETURN_VOID(env,
3192 napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::PUSH), &nPush));
3193 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "PUSH", nPush));
3194
3195 napi_value nDriver;
3196 NAPI_CALL_RETURN_VOID(env,
3197 napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::DRIVER), &nDriver));
3198 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "DRIVER", nDriver));
3199
3200 napi_value nUnspecified;
3201 NAPI_CALL_RETURN_VOID(env,
3202 napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::UNSPECIFIED), &nUnspecified));
3203 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "UNSPECIFIED", nUnspecified));
3204
3205 napi_value nRemoteNotification;
3206 NAPI_CALL_RETURN_VOID(env,
3207 napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::REMOTE_NOTIFICATION), &nRemoteNotification));
3208 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "REMOTE_NOTIFICATION", nRemoteNotification));
3209
3210 napi_value nRemoteLocation;
3211 NAPI_CALL_RETURN_VOID(env,
3212 napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::REMOTE_LOCATION), &nRemoteLocation));
3213 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "REMOTE_LOCATION", nRemoteLocation));
3214
3215 napi_value nVoip;
3216 NAPI_CALL_RETURN_VOID(env,
3217 napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::VOIP), &nVoip));
3218 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "VOIP", nVoip));
3219
3220 napi_value nSysDialogUserAuth;
3221 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3222 static_cast<int32_t>(ExtensionAbilityType::SYSDIALOG_USERAUTH), &nSysDialogUserAuth));
3223 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SYSDIALOG_USERAUTH", nSysDialogUserAuth));
3224
3225 napi_value nSysDialogCommon;
3226 NAPI_CALL_RETURN_VOID(env,
3227 napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::SYSDIALOG_COMMON), &nSysDialogCommon));
3228 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SYSDIALOG_COMMON", nSysDialogCommon));
3229
3230 napi_value nMediaControl;
3231 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3232 static_cast<int32_t>(ExtensionAbilityType::SYSPICKER_MEDIACONTROL), &nMediaControl));
3233 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SYSPICKER_MEDIACONTROL", nMediaControl));
3234
3235 napi_value nSysDialogAtomicServicePanel;
3236 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3237 static_cast<int32_t>(ExtensionAbilityType::SYSDIALOG_ATOMICSERVICEPANEL), &nSysDialogAtomicServicePanel));
3238 NAPI_CALL_RETURN_VOID(env,
3239 napi_set_named_property(env, value, "SYSDIALOG_ATOMICSERVICEPANEL", nSysDialogAtomicServicePanel));
3240
3241 napi_value nSysDialogPower;
3242 NAPI_CALL_RETURN_VOID(env,
3243 napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::SYSDIALOG_POWER), &nSysDialogPower));
3244 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SYSDIALOG_POWER", nSysDialogPower));
3245
3246 napi_value nSysPickerShare;
3247 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3248 static_cast<int32_t>(ExtensionAbilityType::SYSPICKER_SHARE), &nSysPickerShare));
3249 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SYSPICKER_SHARE", nSysPickerShare));
3250
3251 napi_value nSysHmsAccount;
3252 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3253 static_cast<int32_t>(ExtensionAbilityType::HMS_ACCOUNT), &nSysHmsAccount));
3254 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "HMS_ACCOUNT", nSysHmsAccount));
3255
3256 napi_value nSysDialogMeetimeCall;
3257 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3258 static_cast<int32_t>(ExtensionAbilityType::SYSDIALOG_MEETIMECALL), &nSysDialogMeetimeCall));
3259 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SYSDIALOG_MEETIMECALL", nSysDialogMeetimeCall));
3260
3261 napi_value nSysDialogMeetimeContact;
3262 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3263 static_cast<int32_t>(ExtensionAbilityType::SYSDIALOG_MEETIMECONTACT), &nSysDialogMeetimeContact));
3264 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SYSDIALOG_MEETIMECONTACT",
3265 nSysDialogMeetimeContact));
3266
3267 napi_value nSysDialogMeetimeMessage;
3268 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3269 static_cast<int32_t>(ExtensionAbilityType::SYSDIALOG_MEETIMEMESSAGE), &nSysDialogMeetimeMessage));
3270 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SYSDIALOG_MEETIMEMESSAGE",
3271 nSysDialogMeetimeMessage));
3272
3273 napi_value nSysPickerMeetimeContact;
3274 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3275 static_cast<int32_t>(ExtensionAbilityType::SYSPICKER_MEETIMECONTACT), &nSysPickerMeetimeContact));
3276 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SYSPICKER_MEETIMECONTACT",
3277 nSysPickerMeetimeContact));
3278
3279 napi_value nSysPickerMeetimeCallLog;
3280 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3281 static_cast<int32_t>(ExtensionAbilityType::SYSPICKER_MEETIMECALLLOG), &nSysPickerMeetimeCallLog));
3282 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SYSPICKER_MEETIMECALLLOG",
3283 nSysPickerMeetimeCallLog));
3284
3285 napi_value nAds;
3286 NAPI_CALL_RETURN_VOID(env,
3287 napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::ADS), &nAds));
3288 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "ADS", nAds));
3289
3290 napi_value nSysCommonUI;
3291 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3292 static_cast<int32_t>(ExtensionAbilityType::SYS_COMMON_UI), &nSysCommonUI));
3293 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SYS_COMMON_UI", nSysCommonUI));
3294
3295 napi_value nPhotoEditor;
3296 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3297 static_cast<int32_t>(ExtensionAbilityType::PHOTO_EDITOR), &nPhotoEditor));
3298 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "PHOTO_EDITOR", nPhotoEditor));
3299
3300 napi_value nCallerInfoQuery;
3301 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3302 static_cast<int32_t>(ExtensionAbilityType::CALLER_INFO_QUERY), &nCallerInfoQuery));
3303 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "CALLER_INFO_QUERY", nCallerInfoQuery));
3304 }
3305
CreateApplicationFlagObject(napi_env env,napi_value value)3306 void CreateApplicationFlagObject(napi_env env, napi_value value)
3307 {
3308 napi_value nGetApplicationInfoDefault;
3309 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3310 GetApplicationFlag::GET_APPLICATION_INFO_DEFAULT), &nGetApplicationInfoDefault));
3311 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_APPLICATION_INFO_DEFAULT",
3312 nGetApplicationInfoDefault));
3313
3314 napi_value nGetApplicationInfoWithPermission;
3315 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3316 GetApplicationFlag::GET_APPLICATION_INFO_WITH_PERMISSION), &nGetApplicationInfoWithPermission));
3317 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_APPLICATION_INFO_WITH_PERMISSION",
3318 nGetApplicationInfoWithPermission));
3319
3320 napi_value nGetApplicationInfoWithMetadata;
3321 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3322 GetApplicationFlag::GET_APPLICATION_INFO_WITH_METADATA), &nGetApplicationInfoWithMetadata));
3323 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_APPLICATION_INFO_WITH_METADATA",
3324 nGetApplicationInfoWithMetadata));
3325
3326 napi_value nGetApplicationInfoWithDisable;
3327 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3328 GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE), &nGetApplicationInfoWithDisable));
3329 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_APPLICATION_INFO_WITH_DISABLE",
3330 nGetApplicationInfoWithDisable));
3331 }
3332
CreateApplicationInfoFlagObject(napi_env env,napi_value value)3333 void CreateApplicationInfoFlagObject(napi_env env, napi_value value)
3334 {
3335 napi_value nApplicationInfoFlagInstalled;
3336 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3337 ApplicationInfoFlag::FLAG_INSTALLED), &nApplicationInfoFlagInstalled));
3338 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "FLAG_INSTALLED",
3339 nApplicationInfoFlagInstalled));
3340
3341 napi_value nApplicationInfoFlagOtherInstalled;
3342 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3343 ApplicationInfoFlag::FLAG_OTHER_INSTALLED), &nApplicationInfoFlagOtherInstalled));
3344 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "FLAG_OTHER_INSTALLED",
3345 nApplicationInfoFlagOtherInstalled));
3346 }
3347
CreateAppDistributionTypeObject(napi_env env,napi_value value)3348 void CreateAppDistributionTypeObject(napi_env env, napi_value value)
3349 {
3350 napi_value nAppGallery;
3351 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, ENUM_ONE, &nAppGallery));
3352 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "APP_GALLERY", nAppGallery));
3353
3354 napi_value nEnterprise;
3355 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, ENUM_TWO, &nEnterprise));
3356 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "ENTERPRISE", nEnterprise));
3357
3358 napi_value nEnterPriseNormal;
3359 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, ENUM_THREE, &nEnterPriseNormal));
3360 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "ENTERPRISE_NORMAL", nEnterPriseNormal));
3361
3362 napi_value nEnterPriseMdm;
3363 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, ENUM_FOUR, &nEnterPriseMdm));
3364 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "ENTERPRISE_MDM", nEnterPriseMdm));
3365
3366 napi_value nOsIntegration;
3367 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, ENUM_FIVE, &nOsIntegration));
3368 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "OS_INTEGRATION", nOsIntegration));
3369
3370 napi_value nCrowdTesting;
3371 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, ENUM_SIX, &nCrowdTesting));
3372 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "CROWDTESTING", nCrowdTesting));
3373
3374 napi_value nNone;
3375 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, ENUM_SEVEN, &nNone));
3376 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "NONE", nNone));
3377 }
3378
InnerGetPermissionDef(const std::string & permissionName,PermissionDef & permissionDef)3379 static ErrCode InnerGetPermissionDef(const std::string &permissionName, PermissionDef &permissionDef)
3380 {
3381 auto iBundleMgr = CommonFunc::GetBundleMgr();
3382 if (iBundleMgr == nullptr) {
3383 APP_LOGE("can not get iBundleMgr");
3384 return ERROR_BUNDLE_SERVICE_EXCEPTION;
3385 }
3386 ErrCode ret = iBundleMgr->GetPermissionDef(permissionName, permissionDef);
3387 return CommonFunc::ConvertErrCode(ret);
3388 }
3389
GetPermissionDefExec(napi_env env,void * data)3390 void GetPermissionDefExec(napi_env env, void *data)
3391 {
3392 AsyncPermissionDefineCallbackInfo *asyncCallbackInfo = reinterpret_cast<AsyncPermissionDefineCallbackInfo *>(data);
3393 if (asyncCallbackInfo == nullptr) {
3394 APP_LOGE("asyncCallbackInfo is nullptr");
3395 return;
3396 }
3397 if (asyncCallbackInfo->err == NO_ERROR) {
3398 asyncCallbackInfo->err = InnerGetPermissionDef(asyncCallbackInfo->permissionName,
3399 asyncCallbackInfo->permissionDef);
3400 }
3401 }
3402
GetPermissionDefComplete(napi_env env,napi_status status,void * data)3403 void GetPermissionDefComplete(napi_env env, napi_status status, void *data)
3404 {
3405 AsyncPermissionDefineCallbackInfo *asyncCallbackInfo = reinterpret_cast<AsyncPermissionDefineCallbackInfo *>(data);
3406 if (asyncCallbackInfo == nullptr) {
3407 APP_LOGE("asyncCallbackInfo is null");
3408 return;
3409 }
3410 std::unique_ptr<AsyncPermissionDefineCallbackInfo> callbackPtr {asyncCallbackInfo};
3411 napi_value result[ARGS_SIZE_TWO] = {0};
3412 if (asyncCallbackInfo->err == NO_ERROR) {
3413 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
3414 NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &result[ARGS_POS_ONE]));
3415 CommonFunc::ConvertPermissionDef(env, result[ARGS_POS_ONE], asyncCallbackInfo->permissionDef);
3416 } else {
3417 result[0] = BusinessError::CreateCommonError(
3418 env, asyncCallbackInfo->err, GET_PERMISSION_DEF, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
3419 }
3420 CommonFunc::NapiReturnDeferred<AsyncPermissionDefineCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
3421 }
3422
3423 /**
3424 * Promise and async callback
3425 */
GetPermissionDef(napi_env env,napi_callback_info info)3426 napi_value GetPermissionDef(napi_env env, napi_callback_info info)
3427 {
3428 APP_LOGD("GetPermissionDef called");
3429 NapiArg args(env, info);
3430 AsyncPermissionDefineCallbackInfo *asyncCallbackInfo = new (std::nothrow) AsyncPermissionDefineCallbackInfo(env);
3431 if (asyncCallbackInfo == nullptr) {
3432 APP_LOGE("asyncCallbackInfo is null");
3433 return nullptr;
3434 }
3435 std::unique_ptr<AsyncPermissionDefineCallbackInfo> callbackPtr {asyncCallbackInfo};
3436 if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_TWO)) {
3437 APP_LOGE("param count invalid");
3438 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
3439 return nullptr;
3440 }
3441 for (size_t i = 0; i < args.GetMaxArgc(); ++i) {
3442 napi_valuetype valuetype = napi_undefined;
3443 NAPI_CALL(env, napi_typeof(env, args[i], &valuetype));
3444 if (i == ARGS_POS_ZERO) {
3445 if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->permissionName)) {
3446 APP_LOGE("permissionName invalid");
3447 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, PERMISSION_NAME, TYPE_STRING);
3448 return nullptr;
3449 }
3450 } else if (i == ARGS_POS_ONE) {
3451 if (valuetype == napi_function) {
3452 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
3453 } else {
3454 APP_LOGD("GetPermissionDef extra arg ignored");
3455 }
3456 } else {
3457 APP_LOGE("GetPermissionDef arg err");
3458 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR);
3459 return nullptr;
3460 }
3461 }
3462
3463 auto promise = CommonFunc::AsyncCallNativeMethod<AsyncPermissionDefineCallbackInfo>(
3464 env, asyncCallbackInfo, "GetPermissionDef", GetPermissionDefExec, GetPermissionDefComplete);
3465 callbackPtr.release();
3466 return promise;
3467 }
3468
CheckToCache(napi_env env,int32_t uid,int32_t callingUid,const Query & query,napi_value jsObject)3469 static void CheckToCache(napi_env env, int32_t uid, int32_t callingUid, const Query &query, napi_value jsObject)
3470 {
3471 if (uid != callingUid) {
3472 APP_LOGD("uid %{public}d and callingUid %{public}d not equal", uid, callingUid);
3473 return;
3474 }
3475 napi_ref cacheApplicationInfo = nullptr;
3476 NAPI_CALL_RETURN_VOID(env, napi_create_reference(env, jsObject, NAPI_RETURN_ONE, &cacheApplicationInfo));
3477 std::unique_lock<std::shared_mutex> lock(g_cacheMutex);
3478 cache[query] = cacheApplicationInfo;
3479 }
3480
GetApplicationInfoSync(napi_env env,napi_callback_info info)3481 napi_value GetApplicationInfoSync(napi_env env, napi_callback_info info)
3482 {
3483 APP_LOGD("NAPI GetApplicationInfoSync call");
3484 NapiArg args(env, info);
3485 if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_THREE)) {
3486 APP_LOGE("param count invalid");
3487 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
3488 return nullptr;
3489 }
3490 std::string bundleName;
3491 int32_t flags = 0;
3492 int32_t userId = Constants::UNSPECIFIED_USERID;
3493 for (size_t i = 0; i < args.GetArgc(); ++i) {
3494 napi_valuetype valueType = napi_undefined;
3495 napi_typeof(env, args[i], &valueType);
3496 if (i == ARGS_POS_ZERO) {
3497 if (!CommonFunc::ParseString(env, args[i], bundleName)) {
3498 APP_LOGE("bundleName %{public}s invalid", bundleName.c_str());
3499 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
3500 return nullptr;
3501 }
3502 } else if (i == ARGS_POS_ONE) {
3503 if (!CommonFunc::ParseInt(env, args[i], flags)) {
3504 APP_LOGE("parseInt failed");
3505 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, APP_FLAGS, TYPE_NUMBER);
3506 return nullptr;
3507 }
3508 } else if (i == ARGS_POS_TWO) {
3509 if (!CommonFunc::ParseInt(env, args[i], userId)) {
3510 APP_LOGW("userId parseInt failed");
3511 }
3512 } else {
3513 APP_LOGE("parameter is invalid");
3514 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
3515 return nullptr;
3516 }
3517 }
3518 if (bundleName.size() == 0) {
3519 napi_value businessError = BusinessError::CreateCommonError(
3520 env, ERROR_BUNDLE_NOT_EXIST, GET_BUNDLE_INFO_SYNC, BUNDLE_PERMISSIONS);
3521 napi_throw(env, businessError);
3522 return nullptr;
3523 }
3524 if (userId == Constants::UNSPECIFIED_USERID) {
3525 userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
3526 }
3527 napi_value nApplicationInfo = nullptr;
3528 {
3529 std::shared_lock<std::shared_mutex> lock(g_cacheMutex);
3530 auto item = cache.find(Query(bundleName, GET_APPLICATION_INFO, flags, userId, env));
3531 if (item != cache.end()) {
3532 APP_LOGD("getApplicationInfo param from cache");
3533 NAPI_CALL(env,
3534 napi_get_reference_value(env, item->second, &nApplicationInfo));
3535 return nApplicationInfo;
3536 }
3537 }
3538 auto iBundleMgr = CommonFunc::GetBundleMgr();
3539 if (iBundleMgr == nullptr) {
3540 APP_LOGE("can not get iBundleMgr");
3541 return nullptr;
3542 }
3543 AppExecFwk::ApplicationInfo appInfo;
3544 ErrCode ret = CommonFunc::ConvertErrCode(
3545 iBundleMgr->GetApplicationInfoV9(bundleName, flags, userId, appInfo));
3546 if (ret != NO_ERROR) {
3547 APP_LOGE_NOFUNC("GetApplicationInfo failed -n:%{public}s -f: %{public}d -u: %{public}d",
3548 bundleName.c_str(), flags, userId);
3549 napi_value businessError = BusinessError::CreateCommonError(
3550 env, ret, GET_BUNDLE_INFO_SYNC, BUNDLE_PERMISSIONS);
3551 napi_throw(env, businessError);
3552 return nullptr;
3553 }
3554 NAPI_CALL(env, napi_create_object(env, &nApplicationInfo));
3555 CommonFunc::ConvertApplicationInfo(env, nApplicationInfo, appInfo);
3556 Query query(bundleName, GET_APPLICATION_INFO, flags, userId, env);
3557 CheckToCache(env, appInfo.uid, IPCSkeleton::GetCallingUid(), query, nApplicationInfo);
3558 return nApplicationInfo;
3559 }
3560
GetBundleInfoSync(napi_env env,napi_callback_info info)3561 napi_value GetBundleInfoSync(napi_env env, napi_callback_info info)
3562 {
3563 APP_LOGD("NAPI GetBundleInfoSync call");
3564 NapiArg args(env, info);
3565 if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_THREE)) {
3566 APP_LOGE("param count invalid");
3567 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
3568 return nullptr;
3569 }
3570 std::string bundleName;
3571 int32_t flags = 0;
3572 int32_t userId = Constants::UNSPECIFIED_USERID;
3573 for (size_t i = 0; i < args.GetArgc(); ++i) {
3574 napi_valuetype valueType = napi_undefined;
3575 NAPI_CALL(env, napi_typeof(env, args[i], &valueType));
3576 if (i == ARGS_POS_ZERO) {
3577 if (!CommonFunc::ParseString(env, args[i], bundleName)) {
3578 APP_LOGE("bundleName %{public}s invalid", bundleName.c_str());
3579 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
3580 return nullptr;
3581 }
3582 } else if (i == ARGS_POS_ONE) {
3583 if (!CommonFunc::ParseInt(env, args[i], flags)) {
3584 APP_LOGE("parseInt failed");
3585 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_FLAGS, TYPE_NUMBER);
3586 return nullptr;
3587 }
3588 } else if (i == ARGS_POS_TWO) {
3589 if ((valueType == napi_number) && (!CommonFunc::ParseInt(env, args[i], userId))) {
3590 APP_LOGE("parseInt failed");
3591 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, USER_ID, TYPE_NUMBER);
3592 return nullptr;
3593 }
3594 } else {
3595 APP_LOGE("parameter is invalid");
3596 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
3597 return nullptr;
3598 }
3599 }
3600 if (bundleName.size() == 0) {
3601 napi_value businessError = BusinessError::CreateCommonError(
3602 env, ERROR_BUNDLE_NOT_EXIST, GET_BUNDLE_INFO_SYNC, BUNDLE_PERMISSIONS);
3603 napi_throw(env, businessError);
3604 return nullptr;
3605 }
3606 if (userId == Constants::UNSPECIFIED_USERID) {
3607 userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
3608 }
3609 napi_value nBundleInfo = nullptr;
3610 {
3611 std::shared_lock<std::shared_mutex> lock(g_cacheMutex);
3612 auto item = cache.find(Query(bundleName, GET_BUNDLE_INFO, flags, userId, env));
3613 if (item != cache.end()) {
3614 APP_LOGD("GetBundleInfo param from cache");
3615 NAPI_CALL(env,
3616 napi_get_reference_value(env, item->second, &nBundleInfo));
3617 return nBundleInfo;
3618 }
3619 }
3620 auto iBundleMgr = CommonFunc::GetBundleMgr();
3621 if (iBundleMgr == nullptr) {
3622 APP_LOGE("BundleMgr is null");
3623 return nullptr;
3624 }
3625 BundleInfo bundleInfo;
3626 ErrCode ret = CommonFunc::ConvertErrCode(iBundleMgr->GetBundleInfoV9(bundleName, flags, bundleInfo, userId));
3627 if (ret != NO_ERROR) {
3628 APP_LOGE_NOFUNC("GetBundleInfoV9 failed -n %{public}s -f %{public}d -u %{public}d",
3629 bundleName.c_str(), flags, userId);
3630 napi_value businessError = BusinessError::CreateCommonError(
3631 env, ret, GET_BUNDLE_INFO_SYNC, BUNDLE_PERMISSIONS);
3632 napi_throw(env, businessError);
3633 return nullptr;
3634 }
3635 NAPI_CALL(env, napi_create_object(env, &nBundleInfo));
3636 CommonFunc::ConvertBundleInfo(env, bundleInfo, nBundleInfo, flags);
3637 if (!CommonFunc::CheckBundleFlagWithPermission(flags)) {
3638 Query query(bundleName, GET_BUNDLE_INFO, flags, userId, env);
3639 CheckToCache(env, bundleInfo.uid, IPCSkeleton::GetCallingUid(), query, nBundleInfo);
3640 }
3641 return nBundleInfo;
3642 }
3643
InnerGetBundleInfos(int32_t flags,int32_t userId,std::vector<BundleInfo> & bundleInfos)3644 static ErrCode InnerGetBundleInfos(int32_t flags,
3645 int32_t userId, std::vector<BundleInfo> &bundleInfos)
3646 {
3647 auto iBundleMgr = CommonFunc::GetBundleMgr();
3648 if (iBundleMgr == nullptr) {
3649 APP_LOGE("iBundleMgr is null");
3650 return ERROR_BUNDLE_SERVICE_EXCEPTION;
3651 }
3652 ErrCode ret = iBundleMgr->GetBundleInfosV9(flags, bundleInfos, userId);
3653 return CommonFunc::ConvertErrCode(ret);
3654 }
3655
CreateBundleFlagObject(napi_env env,napi_value value)3656 void CreateBundleFlagObject(napi_env env, napi_value value)
3657 {
3658 napi_value nBundleInfoDefault;
3659 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_DEFAULT),
3660 &nBundleInfoDefault));
3661 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_DEFAULT",
3662 nBundleInfoDefault));
3663
3664 napi_value nGetBundleInfoWithApplication;
3665 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3666 GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_APPLICATION), &nGetBundleInfoWithApplication));
3667 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_APPLICATION",
3668 nGetBundleInfoWithApplication));
3669
3670 napi_value nGetBundleInfoWithHapModule;
3671 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3672 GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE), &nGetBundleInfoWithHapModule));
3673 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_HAP_MODULE",
3674 nGetBundleInfoWithHapModule));
3675
3676 napi_value nGetBundleInfoWithAbility;
3677 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3678 GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_ABILITY), &nGetBundleInfoWithAbility));
3679 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_ABILITY",
3680 nGetBundleInfoWithAbility));
3681
3682 napi_value nGetBundleInfoWithExtensionAbility;
3683 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3684 GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_EXTENSION_ABILITY), &nGetBundleInfoWithExtensionAbility));
3685 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_EXTENSION_ABILITY",
3686 nGetBundleInfoWithExtensionAbility));
3687
3688 napi_value nGetBundleInfoWithRequestedPermission;
3689 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3690 GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_REQUESTED_PERMISSION), &nGetBundleInfoWithRequestedPermission));
3691 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_REQUESTED_PERMISSION",
3692 nGetBundleInfoWithRequestedPermission));
3693
3694 napi_value nGetBundleInfoWithMetadata;
3695 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3696 GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_METADATA), &nGetBundleInfoWithMetadata));
3697 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_METADATA",
3698 nGetBundleInfoWithMetadata));
3699
3700 napi_value nGetBundleInfoWithDisable;
3701 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3702 GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_DISABLE), &nGetBundleInfoWithDisable));
3703 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_DISABLE",
3704 nGetBundleInfoWithDisable));
3705
3706 napi_value nGetBundleInfoWithSignatureInfo;
3707 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3708 GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_SIGNATURE_INFO), &nGetBundleInfoWithSignatureInfo));
3709 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_SIGNATURE_INFO",
3710 nGetBundleInfoWithSignatureInfo));
3711
3712 napi_value nGetBundleInfoWithMenu;
3713 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3714 GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_MENU), &nGetBundleInfoWithMenu));
3715 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_MENU",
3716 nGetBundleInfoWithMenu));
3717
3718 napi_value nGetBundleInfoWithRouterMap;
3719 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3720 GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_ROUTER_MAP), &nGetBundleInfoWithRouterMap));
3721 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_ROUTER_MAP",
3722 nGetBundleInfoWithRouterMap));
3723
3724 napi_value nGetBundleInfoWithSkill;
3725 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3726 GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_SKILL), &nGetBundleInfoWithSkill));
3727 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_SKILL",
3728 nGetBundleInfoWithSkill));
3729
3730 napi_value nGetBundleInfoOnlyWithLauncherAbility;
3731 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3732 GetBundleInfoFlag::GET_BUNDLE_INFO_ONLY_WITH_LAUNCHER_ABILITY), &nGetBundleInfoOnlyWithLauncherAbility));
3733 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_ONLY_WITH_LAUNCHER_ABILITY",
3734 nGetBundleInfoOnlyWithLauncherAbility));
3735
3736 napi_value nGetBundleInfoExcludeClone;
3737 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3738 GetBundleInfoFlag::GET_BUNDLE_INFO_EXCLUDE_CLONE), &nGetBundleInfoExcludeClone));
3739 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_EXCLUDE_CLONE",
3740 nGetBundleInfoExcludeClone));
3741
3742 napi_value nGetBundleInfoOfAnyUser;
3743 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
3744 GetBundleInfoFlag::GET_BUNDLE_INFO_OF_ANY_USER), &nGetBundleInfoOfAnyUser));
3745 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_OF_ANY_USER",
3746 nGetBundleInfoOfAnyUser));
3747 }
3748
InnerGetBundleInfo(const std::string & bundleName,int32_t flags,int32_t userId,BundleInfo & bundleInfo)3749 static ErrCode InnerGetBundleInfo(const std::string &bundleName, int32_t flags,
3750 int32_t userId, BundleInfo &bundleInfo)
3751 {
3752 auto iBundleMgr = CommonFunc::GetBundleMgr();
3753 if (iBundleMgr == nullptr) {
3754 APP_LOGE("iBundleMgr is null");
3755 return ERROR_BUNDLE_SERVICE_EXCEPTION;
3756 }
3757 ErrCode ret = iBundleMgr->GetBundleInfoV9(bundleName, flags, bundleInfo, userId);
3758 return CommonFunc::ConvertErrCode(ret);
3759 }
3760
InnerGetBundleInfoForSelf(int32_t flags,BundleInfo & bundleInfo)3761 static ErrCode InnerGetBundleInfoForSelf(int32_t flags, BundleInfo &bundleInfo)
3762 {
3763 auto iBundleMgr = CommonFunc::GetBundleMgr();
3764 if (iBundleMgr == nullptr) {
3765 APP_LOGE("iBundleMgr is null");
3766 return ERROR_BUNDLE_SERVICE_EXCEPTION;
3767 }
3768 ErrCode ret = iBundleMgr->GetBundleInfoForSelf(flags, bundleInfo);
3769 return CommonFunc::ConvertErrCode(ret);
3770 }
3771
ProcessBundleInfos(napi_env env,napi_value result,const std::vector<BundleInfo> & bundleInfos,int32_t flags)3772 static void ProcessBundleInfos(
3773 napi_env env, napi_value result, const std::vector<BundleInfo> &bundleInfos, int32_t flags)
3774 {
3775 if (bundleInfos.size() == 0) {
3776 APP_LOGD("bundleInfos is null");
3777 return;
3778 }
3779 size_t index = 0;
3780 for (const auto &item : bundleInfos) {
3781 APP_LOGD("name: %{public}s ", item.name.c_str());
3782 napi_value objBundleInfo;
3783 NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &objBundleInfo));
3784 CommonFunc::ConvertBundleInfo(env, item, objBundleInfo, flags);
3785 NAPI_CALL_RETURN_VOID(env, napi_set_element(env, result, index, objBundleInfo));
3786 index++;
3787 }
3788 }
3789
GetBundleInfosComplete(napi_env env,napi_status status,void * data)3790 void GetBundleInfosComplete(napi_env env, napi_status status, void *data)
3791 {
3792 BundleInfosCallbackInfo *asyncCallbackInfo =
3793 reinterpret_cast<BundleInfosCallbackInfo *>(data);
3794 if (asyncCallbackInfo == nullptr) {
3795 APP_LOGE("asyncCallbackInfo is null");
3796 return;
3797 }
3798 std::unique_ptr<BundleInfosCallbackInfo> callbackPtr {asyncCallbackInfo};
3799 napi_value result[CALLBACK_PARAM_SIZE] = {0};
3800 if (asyncCallbackInfo->err == NO_ERROR) {
3801 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
3802 NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &result[ARGS_POS_ONE]));
3803 ProcessBundleInfos(env, result[ARGS_POS_ONE], asyncCallbackInfo->bundleInfos, asyncCallbackInfo->flags);
3804 } else {
3805 result[ARGS_POS_ZERO] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
3806 GET_BUNDLE_INFOS, Constants::PERMISSION_GET_INSTALLED_BUNDLE_LIST);
3807 }
3808 CommonFunc::NapiReturnDeferred<BundleInfosCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
3809 }
3810
GetBundleInfoComplete(napi_env env,napi_status status,void * data)3811 void GetBundleInfoComplete(napi_env env, napi_status status, void *data)
3812 {
3813 BundleInfoCallbackInfo *asyncCallbackInfo =
3814 reinterpret_cast<BundleInfoCallbackInfo *>(data);
3815 if (asyncCallbackInfo == nullptr) {
3816 APP_LOGE("asyncCallbackInfo is null");
3817 return;
3818 }
3819 std::unique_ptr<BundleInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
3820 napi_value result[CALLBACK_PARAM_SIZE] = {0};
3821 if (asyncCallbackInfo->err == NO_ERROR) {
3822 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
3823 if (asyncCallbackInfo->isSavedInCache) {
3824 std::shared_lock<std::shared_mutex> lock(g_cacheMutex);
3825 auto item = cache.find(Query(
3826 asyncCallbackInfo->bundleName, GET_BUNDLE_INFO,
3827 asyncCallbackInfo->flags, asyncCallbackInfo->userId, env));
3828 if (item == cache.end()) {
3829 APP_LOGE("cannot find result in cache");
3830 return;
3831 }
3832 NAPI_CALL_RETURN_VOID(env, napi_get_reference_value(env, item->second, &result[ARGS_POS_ONE]));
3833 } else {
3834 NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &result[ARGS_POS_ONE]));
3835 CommonFunc::ConvertBundleInfo(env,
3836 asyncCallbackInfo->bundleInfo, result[ARGS_POS_ONE], asyncCallbackInfo->flags);
3837 if (!CommonFunc::CheckBundleFlagWithPermission(asyncCallbackInfo->flags)) {
3838 Query query(
3839 asyncCallbackInfo->bundleName, GET_BUNDLE_INFO,
3840 asyncCallbackInfo->flags, asyncCallbackInfo->userId, env);
3841 CheckToCache(env, asyncCallbackInfo->bundleInfo.uid, IPCSkeleton::GetCallingUid(),
3842 query, result[ARGS_POS_ONE]);
3843 }
3844 }
3845 } else {
3846 result[ARGS_POS_ZERO] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
3847 GET_BUNDLE_INFO, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
3848 }
3849 CommonFunc::NapiReturnDeferred<BundleInfoCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
3850 }
3851
GetBundleInfoExec(napi_env env,void * data)3852 void GetBundleInfoExec(napi_env env, void *data)
3853 {
3854 BundleInfoCallbackInfo *asyncCallbackInfo = reinterpret_cast<BundleInfoCallbackInfo *>(data);
3855 if (asyncCallbackInfo == nullptr) {
3856 APP_LOGE("asyncCallbackInfo is null");
3857 return;
3858 }
3859 if (asyncCallbackInfo->err == NO_ERROR) {
3860 if (!CommonFunc::CheckBundleFlagWithPermission(asyncCallbackInfo->flags)) {
3861 std::shared_lock<std::shared_mutex> lock(g_cacheMutex);
3862 auto item = cache.find(Query(asyncCallbackInfo->bundleName,
3863 GET_BUNDLE_INFO, asyncCallbackInfo->flags, asyncCallbackInfo->userId, env));
3864 if (item != cache.end()) {
3865 asyncCallbackInfo->isSavedInCache = true;
3866 APP_LOGD("GetBundleInfo param from cache");
3867 return;
3868 }
3869 }
3870 asyncCallbackInfo->err = InnerGetBundleInfo(asyncCallbackInfo->bundleName,
3871 asyncCallbackInfo->flags, asyncCallbackInfo->userId, asyncCallbackInfo->bundleInfo);
3872 }
3873 }
3874
GetBundleInfoForSelfExec(napi_env env,void * data)3875 void GetBundleInfoForSelfExec(napi_env env, void *data)
3876 {
3877 BundleInfoCallbackInfo *asyncCallbackInfo = reinterpret_cast<BundleInfoCallbackInfo *>(data);
3878 if (asyncCallbackInfo == nullptr) {
3879 APP_LOGE("asyncCallbackInfo is null");
3880 return;
3881 }
3882 if (asyncCallbackInfo->err != NO_ERROR) {
3883 return;
3884 }
3885 auto uid = IPCSkeleton::GetCallingUid();
3886 asyncCallbackInfo->uid = uid;
3887 asyncCallbackInfo->bundleName = std::to_string(uid);
3888 asyncCallbackInfo->userId = uid / Constants::BASE_USER_RANGE;
3889 if (!CommonFunc::CheckBundleFlagWithPermission(asyncCallbackInfo->flags)) {
3890 std::shared_lock<std::shared_mutex> lock(g_cacheMutex);
3891 auto item = cache.find(Query(
3892 asyncCallbackInfo->bundleName, GET_BUNDLE_INFO,
3893 asyncCallbackInfo->flags, asyncCallbackInfo->userId, env));
3894 if (item != cache.end()) {
3895 asyncCallbackInfo->isSavedInCache = true;
3896 APP_LOGD("GetBundleInfo param from cache");
3897 return;
3898 }
3899 }
3900 asyncCallbackInfo->err = InnerGetBundleInfoForSelf(
3901 asyncCallbackInfo->flags, asyncCallbackInfo->bundleInfo);
3902 }
3903
GetBundleInfo(napi_env env,napi_callback_info info)3904 napi_value GetBundleInfo(napi_env env, napi_callback_info info)
3905 {
3906 LOG_NOFUNC_I(BMS_TAG_COMMON, "NAPI GetBundleInfo call");
3907 NapiArg args(env, info);
3908 BundleInfoCallbackInfo *asyncCallbackInfo = new (std::nothrow) BundleInfoCallbackInfo(env);
3909 if (asyncCallbackInfo == nullptr) {
3910 APP_LOGE("asyncCallbackInfo is null");
3911 return nullptr;
3912 }
3913 std::unique_ptr<BundleInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
3914 if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_FOUR)) {
3915 APP_LOGE("param count invalid");
3916 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
3917 return nullptr;
3918 }
3919 asyncCallbackInfo->uid = IPCSkeleton::GetCallingUid();
3920 asyncCallbackInfo->userId = asyncCallbackInfo->uid / Constants::BASE_USER_RANGE;
3921 if (args.GetMaxArgc() < ARGS_SIZE_TWO) {
3922 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
3923 return nullptr;
3924 }
3925 for (size_t i = 0; i < args.GetMaxArgc(); i++) {
3926 napi_valuetype valueType = napi_undefined;
3927 napi_typeof(env, args[i], &valueType);
3928 if (i == ARGS_POS_ZERO) {
3929 if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->bundleName)) {
3930 APP_LOGE("appId %{public}s invalid", asyncCallbackInfo->bundleName.c_str());
3931 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
3932 return nullptr;
3933 }
3934 } else if (i == ARGS_POS_ONE) {
3935 if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->flags)) {
3936 APP_LOGE("Flags %{public}d invalid", asyncCallbackInfo->flags);
3937 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_FLAGS, TYPE_NUMBER);
3938 return nullptr;
3939 }
3940 } else if (i == ARGS_POS_TWO) {
3941 if (valueType == napi_function) {
3942 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
3943 break;
3944 }
3945 if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->userId)) {
3946 APP_LOGW("Parse userId failed, set this parameter to the caller userId");
3947 }
3948 } else if (i == ARGS_POS_THREE) {
3949 if (valueType == napi_function) {
3950 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
3951 }
3952 break;
3953 } else {
3954 APP_LOGE("param check error");
3955 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
3956 return nullptr;
3957 }
3958 }
3959 auto promise = CommonFunc::AsyncCallNativeMethod<BundleInfoCallbackInfo>(
3960 env, asyncCallbackInfo, GET_BUNDLE_INFO, GetBundleInfoExec, GetBundleInfoComplete);
3961 callbackPtr.release();
3962 LOG_NOFUNC_I(BMS_TAG_COMMON, "NAPI GetBundleInfo done");
3963 return promise;
3964 }
3965
GetBundleInfosExec(napi_env env,void * data)3966 void GetBundleInfosExec(napi_env env, void *data)
3967 {
3968 BundleInfosCallbackInfo *asyncCallbackInfo = reinterpret_cast<BundleInfosCallbackInfo *>(data);
3969 if (asyncCallbackInfo == nullptr) {
3970 APP_LOGE("asyncCallbackInfo is null");
3971 return;
3972 }
3973 asyncCallbackInfo->err = InnerGetBundleInfos(asyncCallbackInfo->flags,
3974 asyncCallbackInfo->userId, asyncCallbackInfo->bundleInfos);
3975 }
3976
GetBundleInfos(napi_env env,napi_callback_info info)3977 napi_value GetBundleInfos(napi_env env, napi_callback_info info)
3978 {
3979 APP_LOGD("NAPI_GetBundleInfos called");
3980 NapiArg args(env, info);
3981 BundleInfosCallbackInfo *asyncCallbackInfo = new (std::nothrow) BundleInfosCallbackInfo(env);
3982 if (asyncCallbackInfo == nullptr) {
3983 APP_LOGE("asyncCallbackInfo is null");
3984 return nullptr;
3985 }
3986 std::unique_ptr<BundleInfosCallbackInfo> callbackPtr {asyncCallbackInfo};
3987 if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_THREE)) {
3988 APP_LOGE("param count invalid");
3989 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
3990 return nullptr;
3991 }
3992 asyncCallbackInfo->userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
3993 if (args.GetMaxArgc() < ARGS_SIZE_ONE) {
3994 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
3995 return nullptr;
3996 }
3997 for (size_t i = 0; i < args.GetMaxArgc(); ++i) {
3998 napi_valuetype valueType = napi_undefined;
3999 napi_typeof(env, args[i], &valueType);
4000 if (i == ARGS_POS_ZERO) {
4001 if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->flags)) {
4002 APP_LOGE("Flags %{public}d invalid", asyncCallbackInfo->flags);
4003 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_FLAGS, TYPE_NUMBER);
4004 return nullptr;
4005 }
4006 } else if (i == ARGS_POS_ONE) {
4007 if (valueType == napi_function) {
4008 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
4009 break;
4010 }
4011 if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->userId)) {
4012 APP_LOGW("Parse userId failed, set this parameter to the caller userId");
4013 }
4014 } else if (i == ARGS_POS_TWO) {
4015 if (valueType == napi_function) {
4016 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
4017 break;
4018 }
4019 } else {
4020 APP_LOGE("param check error");
4021 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
4022 return nullptr;
4023 }
4024 }
4025 auto promise = CommonFunc::AsyncCallNativeMethod<BundleInfosCallbackInfo>(
4026 env, asyncCallbackInfo, GET_BUNDLE_INFOS, GetBundleInfosExec, GetBundleInfosComplete);
4027 callbackPtr.release();
4028 APP_LOGD("call NAPI_GetBundleInfos done");
4029 return promise;
4030 }
4031
GetBundleInfoForSelf(napi_env env,napi_callback_info info)4032 napi_value GetBundleInfoForSelf(napi_env env, napi_callback_info info)
4033 {
4034 APP_LOGD("GetBundleInfoForSelf called");
4035 NapiArg args(env, info);
4036 BundleInfoCallbackInfo *asyncCallbackInfo = new (std::nothrow) BundleInfoCallbackInfo(env);
4037 if (asyncCallbackInfo == nullptr) {
4038 APP_LOGE("asyncCallbackInfo is null");
4039 return nullptr;
4040 }
4041 std::unique_ptr<BundleInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
4042 if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_TWO)) {
4043 APP_LOGE("param count invalid");
4044 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
4045 return nullptr;
4046 }
4047 for (size_t i = 0; i < args.GetArgc(); ++i) {
4048 napi_valuetype valueType = napi_undefined;
4049 napi_typeof(env, args[i], &valueType);
4050 if (i == ARGS_POS_ZERO) {
4051 if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->flags)) {
4052 APP_LOGE("Flags invalid");
4053 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_FLAGS, TYPE_NUMBER);
4054 return nullptr;
4055 }
4056 } else if (i == ARGS_POS_ONE) {
4057 if (valueType == napi_function) {
4058 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
4059 }
4060 } else {
4061 APP_LOGE("param check error");
4062 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
4063 return nullptr;
4064 }
4065 }
4066 auto promise = CommonFunc::AsyncCallNativeMethod<BundleInfoCallbackInfo>(
4067 env, asyncCallbackInfo, "GetBundleInfoForSelf", GetBundleInfoForSelfExec, GetBundleInfoComplete);
4068 callbackPtr.release();
4069 APP_LOGD("call GetBundleInfoForSelf done");
4070 return promise;
4071 }
4072
InnerGetAllSharedBundleInfo(std::vector<SharedBundleInfo> & sharedBundles)4073 static ErrCode InnerGetAllSharedBundleInfo(std::vector<SharedBundleInfo> &sharedBundles)
4074 {
4075 auto iBundleMgr = CommonFunc::GetBundleMgr();
4076 if (iBundleMgr == nullptr) {
4077 APP_LOGE("iBundleMgr is null");
4078 return ERROR_BUNDLE_SERVICE_EXCEPTION;
4079 }
4080 ErrCode ret = iBundleMgr->GetAllSharedBundleInfo(sharedBundles);
4081 return CommonFunc::ConvertErrCode(ret);
4082 }
4083
GetAllSharedBundleInfoExec(napi_env env,void * data)4084 void GetAllSharedBundleInfoExec(napi_env env, void *data)
4085 {
4086 SharedBundleCallbackInfo *asyncCallbackInfo = reinterpret_cast<SharedBundleCallbackInfo *>(data);
4087 if (asyncCallbackInfo == nullptr) {
4088 APP_LOGE("asyncCallbackInfo is null");
4089 return;
4090 }
4091 asyncCallbackInfo->err = InnerGetAllSharedBundleInfo(asyncCallbackInfo->sharedBundles);
4092 }
4093
GetAllSharedBundleInfoComplete(napi_env env,napi_status status,void * data)4094 void GetAllSharedBundleInfoComplete(napi_env env, napi_status status, void *data)
4095 {
4096 SharedBundleCallbackInfo *asyncCallbackInfo =
4097 reinterpret_cast<SharedBundleCallbackInfo *>(data);
4098 if (asyncCallbackInfo == nullptr) {
4099 APP_LOGE("asyncCallbackInfo is null");
4100 return;
4101 }
4102 std::unique_ptr<SharedBundleCallbackInfo> callbackPtr {asyncCallbackInfo};
4103 napi_value result[CALLBACK_PARAM_SIZE] = {0};
4104 if (asyncCallbackInfo->err == NO_ERROR) {
4105 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
4106 NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &result[ARGS_POS_ONE]));
4107 CommonFunc::ConvertAllSharedBundleInfo(env, result[ARGS_POS_ONE], asyncCallbackInfo->sharedBundles);
4108 } else {
4109 result[ARGS_POS_ZERO] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
4110 GET_ALL_SHARED_BUNDLE_INFO, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
4111 }
4112 CommonFunc::NapiReturnDeferred<SharedBundleCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
4113 }
4114
GetAllSharedBundleInfo(napi_env env,napi_callback_info info)4115 napi_value GetAllSharedBundleInfo(napi_env env, napi_callback_info info)
4116 {
4117 APP_LOGD("NAPI_GetAllSharedBundleInfo called");
4118 NapiArg args(env, info);
4119 SharedBundleCallbackInfo *asyncCallbackInfo = new (std::nothrow) SharedBundleCallbackInfo(env);
4120 if (asyncCallbackInfo == nullptr) {
4121 APP_LOGE("asyncCallbackInfo is null");
4122 return nullptr;
4123 }
4124 std::unique_ptr<SharedBundleCallbackInfo> callbackPtr {asyncCallbackInfo};
4125 if (!args.Init(ARGS_SIZE_ZERO, ARGS_SIZE_ONE)) {
4126 APP_LOGE("param count invalid");
4127 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
4128 return nullptr;
4129 }
4130 if (args.GetMaxArgc() < ARGS_SIZE_ZERO) {
4131 APP_LOGE("param count invalid");
4132 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
4133 return nullptr;
4134 }
4135 for (size_t i = 0; i < args.GetMaxArgc(); ++i) {
4136 napi_valuetype valueType = napi_undefined;
4137 napi_typeof(env, args[i], &valueType);
4138 if (i == ARGS_POS_ZERO) {
4139 if (valueType == napi_function) {
4140 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
4141 break;
4142 }
4143 } else {
4144 APP_LOGE("param check error");
4145 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
4146 return nullptr;
4147 }
4148 }
4149 auto promise = CommonFunc::AsyncCallNativeMethod<SharedBundleCallbackInfo>(env, asyncCallbackInfo,
4150 GET_ALL_SHARED_BUNDLE_INFO, GetAllSharedBundleInfoExec, GetAllSharedBundleInfoComplete);
4151 callbackPtr.release();
4152 APP_LOGD("call NAPI_GetAllSharedBundleInfo done");
4153 return promise;
4154 }
4155
InnerGetSharedBundleInfo(const std::string & bundleName,const std::string & moduleName,std::vector<SharedBundleInfo> & sharedBundles)4156 static ErrCode InnerGetSharedBundleInfo(const std::string &bundleName, const std::string &moduleName,
4157 std::vector<SharedBundleInfo> &sharedBundles)
4158 {
4159 auto iBundleMgr = CommonFunc::GetBundleMgr();
4160 if (iBundleMgr == nullptr) {
4161 APP_LOGE("iBundleMgr is null");
4162 return ERROR_BUNDLE_SERVICE_EXCEPTION;
4163 }
4164 ErrCode ret = iBundleMgr->GetSharedBundleInfo(bundleName, moduleName, sharedBundles);
4165 return CommonFunc::ConvertErrCode(ret);
4166 }
4167
GetSharedBundleInfoExec(napi_env env,void * data)4168 void GetSharedBundleInfoExec(napi_env env, void *data)
4169 {
4170 SharedBundleCallbackInfo *asyncCallbackInfo = reinterpret_cast<SharedBundleCallbackInfo *>(data);
4171 if (asyncCallbackInfo == nullptr) {
4172 APP_LOGE("asyncCallbackInfo is null");
4173 return;
4174 }
4175 asyncCallbackInfo->err = InnerGetSharedBundleInfo(asyncCallbackInfo->bundleName, asyncCallbackInfo->moduleName,
4176 asyncCallbackInfo->sharedBundles);
4177 }
4178
GetSharedBundleInfoComplete(napi_env env,napi_status status,void * data)4179 void GetSharedBundleInfoComplete(napi_env env, napi_status status, void *data)
4180 {
4181 SharedBundleCallbackInfo *asyncCallbackInfo =
4182 reinterpret_cast<SharedBundleCallbackInfo *>(data);
4183 if (asyncCallbackInfo == nullptr) {
4184 APP_LOGE("asyncCallbackInfo is null");
4185 return;
4186 }
4187 std::unique_ptr<SharedBundleCallbackInfo> callbackPtr {asyncCallbackInfo};
4188 napi_value result[CALLBACK_PARAM_SIZE] = {0};
4189 if (asyncCallbackInfo->err == NO_ERROR) {
4190 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
4191 NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &result[ARGS_POS_ONE]));
4192 CommonFunc::ConvertAllSharedBundleInfo(env, result[ARGS_POS_ONE], asyncCallbackInfo->sharedBundles);
4193 } else {
4194 result[ARGS_POS_ZERO] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
4195 GET_SHARED_BUNDLE_INFO, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
4196 }
4197 CommonFunc::NapiReturnDeferred<SharedBundleCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
4198 }
4199
GetSharedBundleInfo(napi_env env,napi_callback_info info)4200 napi_value GetSharedBundleInfo(napi_env env, napi_callback_info info)
4201 {
4202 APP_LOGD("NAPI_GetSharedBundleInfo called");
4203 NapiArg args(env, info);
4204 SharedBundleCallbackInfo *asyncCallbackInfo = new (std::nothrow) SharedBundleCallbackInfo(env);
4205 if (asyncCallbackInfo == nullptr) {
4206 APP_LOGE("asyncCallbackInfo is null");
4207 return nullptr;
4208 }
4209 std::unique_ptr<SharedBundleCallbackInfo> callbackPtr {asyncCallbackInfo};
4210 if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_THREE)) {
4211 APP_LOGE("param count invalid");
4212 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
4213 return nullptr;
4214 }
4215 if (args.GetMaxArgc() < ARGS_SIZE_TWO) {
4216 APP_LOGE("param count invalid");
4217 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
4218 return nullptr;
4219 }
4220
4221 for (size_t i = 0; i < args.GetMaxArgc(); i++) {
4222 napi_valuetype valueType = napi_undefined;
4223 napi_typeof(env, args[i], &valueType);
4224 if (i == ARGS_POS_ZERO) {
4225 if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->bundleName)) {
4226 APP_LOGE("appId %{public}s invalid", asyncCallbackInfo->bundleName.c_str());
4227 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
4228 return nullptr;
4229 }
4230 } else if (i == ARGS_POS_ONE) {
4231 if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->moduleName)) {
4232 APP_LOGE("appId %{public}s invalid", asyncCallbackInfo->moduleName.c_str());
4233 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, MODULE_NAME, TYPE_STRING);
4234 return nullptr;
4235 }
4236 } else if (i == ARGS_POS_TWO) {
4237 if (valueType == napi_function) {
4238 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
4239 break;
4240 }
4241 } else {
4242 APP_LOGE("param check error");
4243 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
4244 return nullptr;
4245 }
4246 }
4247
4248 auto promise = CommonFunc::AsyncCallNativeMethod<SharedBundleCallbackInfo>(env, asyncCallbackInfo,
4249 GET_SHARED_BUNDLE_INFO, GetSharedBundleInfoExec, GetSharedBundleInfoComplete);
4250 callbackPtr.release();
4251 APP_LOGD("call NAPI_GetSharedBundleInfo done");
4252 return promise;
4253 }
4254
CreatePermissionGrantStateObject(napi_env env,napi_value value)4255 void CreatePermissionGrantStateObject(napi_env env, napi_value value)
4256 {
4257 napi_value nPermissionDenied;
4258 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, -1, &nPermissionDenied));
4259 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "PERMISSION_DENIED",
4260 nPermissionDenied));
4261
4262 napi_value nPermissionGranted;
4263 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, 0, &nPermissionGranted));
4264 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "PERMISSION_GRANTED",
4265 nPermissionGranted));
4266 }
4267
CreateAbilityTypeObject(napi_env env,napi_value value)4268 void CreateAbilityTypeObject(napi_env env, napi_value value)
4269 {
4270 napi_value nUnknow;
4271 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(AbilityType::UNKNOWN), &nUnknow));
4272 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "UNKNOWN", nUnknow));
4273 napi_value nPage;
4274 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(AbilityType::PAGE), &nPage));
4275 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "PAGE", nPage));
4276 napi_value nService;
4277 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(AbilityType::SERVICE), &nService));
4278 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SERVICE", nService));
4279 napi_value nData;
4280 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(AbilityType::DATA), &nData));
4281 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "DATA", nData));
4282 }
4283
CreateBundleTypeObject(napi_env env,napi_value value)4284 void CreateBundleTypeObject(napi_env env, napi_value value)
4285 {
4286 napi_value nApp;
4287 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(BundleType::APP), &nApp));
4288 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "APP", nApp));
4289 napi_value nAtomicService;
4290 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
4291 static_cast<int32_t>(BundleType::ATOMIC_SERVICE), &nAtomicService));
4292 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "ATOMIC_SERVICE", nAtomicService));
4293 }
4294
CreateDisplayOrientationObject(napi_env env,napi_value value)4295 void CreateDisplayOrientationObject(napi_env env, napi_value value)
4296 {
4297 napi_value nUnspecified;
4298 NAPI_CALL_RETURN_VOID(
4299 env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::UNSPECIFIED), &nUnspecified));
4300 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "UNSPECIFIED", nUnspecified));
4301 napi_value nLandscape;
4302 NAPI_CALL_RETURN_VOID(
4303 env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::LANDSCAPE), &nLandscape));
4304 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "LANDSCAPE", nLandscape));
4305 napi_value nPortrait;
4306 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::PORTRAIT), &nPortrait));
4307 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "PORTRAIT", nPortrait));
4308 napi_value nFollowrecent;
4309 NAPI_CALL_RETURN_VOID(
4310 env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::FOLLOWRECENT), &nFollowrecent));
4311 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "FOLLOW_RECENT", nFollowrecent));
4312 napi_value nReverseLandscape;
4313 NAPI_CALL_RETURN_VOID(
4314 env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::LANDSCAPE_INVERTED), &nReverseLandscape));
4315 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "LANDSCAPE_INVERTED", nReverseLandscape));
4316 napi_value nReversePortrait;
4317 NAPI_CALL_RETURN_VOID(
4318 env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::PORTRAIT_INVERTED), &nReversePortrait));
4319 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "PORTRAIT_INVERTED", nReversePortrait));
4320 napi_value nLocked;
4321 NAPI_CALL_RETURN_VOID(
4322 env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::LOCKED), &nLocked));
4323 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "LOCKED", nLocked));
4324 CreateOrientationRelatedToSensor(env, value);
4325 }
4326
CreateOrientationRelatedToSensor(napi_env env,napi_value value)4327 void CreateOrientationRelatedToSensor(napi_env env, napi_value value)
4328 {
4329 napi_value nAutoRotation;
4330 NAPI_CALL_RETURN_VOID(
4331 env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::AUTO_ROTATION), &nAutoRotation));
4332 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "AUTO_ROTATION", nAutoRotation));
4333 napi_value nAutoRotationLandscape;
4334 NAPI_CALL_RETURN_VOID(
4335 env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::AUTO_ROTATION_LANDSCAPE),
4336 &nAutoRotationLandscape));
4337 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "AUTO_ROTATION_LANDSCAPE", nAutoRotationLandscape));
4338 napi_value nAutoRotationPortrait;
4339 NAPI_CALL_RETURN_VOID(
4340 env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::AUTO_ROTATION_PORTRAIT),
4341 &nAutoRotationPortrait));
4342 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "AUTO_ROTATION_PORTRAIT", nAutoRotationPortrait));
4343 napi_value nAutoRotationRestricted;
4344 NAPI_CALL_RETURN_VOID(
4345 env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::AUTO_ROTATION_RESTRICTED),
4346 &nAutoRotationRestricted));
4347 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "AUTO_ROTATION_RESTRICTED",
4348 nAutoRotationRestricted));
4349 napi_value nAutoRotationLandscapeRestricted;
4350 NAPI_CALL_RETURN_VOID(
4351 env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::AUTO_ROTATION_LANDSCAPE_RESTRICTED),
4352 &nAutoRotationLandscapeRestricted));
4353 NAPI_CALL_RETURN_VOID(env,
4354 napi_set_named_property(env, value, "AUTO_ROTATION_LANDSCAPE_RESTRICTED", nAutoRotationLandscapeRestricted));
4355 napi_value nAutoRotationPortraitRestricted;
4356 NAPI_CALL_RETURN_VOID(
4357 env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::AUTO_ROTATION_PORTRAIT_RESTRICTED),
4358 &nAutoRotationPortraitRestricted));
4359 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "AUTO_ROTATION_PORTRAIT_RESTRICTED",
4360 nAutoRotationPortraitRestricted));
4361 napi_value nAutoRotationUnspecified;
4362 NAPI_CALL_RETURN_VOID(env,
4363 napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::AUTO_ROTATION_UNSPECIFIED),
4364 &nAutoRotationUnspecified));
4365 NAPI_CALL_RETURN_VOID(env,
4366 napi_set_named_property(env, value, "AUTO_ROTATION_UNSPECIFIED", nAutoRotationUnspecified));
4367 napi_value nFollowDesktop;
4368 NAPI_CALL_RETURN_VOID(env,
4369 napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::FOLLOW_DESKTOP), &nFollowDesktop));
4370 NAPI_CALL_RETURN_VOID(env,
4371 napi_set_named_property(env, value, "FOLLOW_DESKTOP", nFollowDesktop));
4372 }
4373
CreateLaunchTypeObject(napi_env env,napi_value value)4374 void CreateLaunchTypeObject(napi_env env, napi_value value)
4375 {
4376 napi_value nSingleton;
4377 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(LaunchMode::SINGLETON), &nSingleton));
4378 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SINGLETON", nSingleton));
4379 napi_value nStandard;
4380 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(LaunchMode::STANDARD), &nStandard));
4381 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "STANDARD", nStandard));
4382 napi_value nMultiton;
4383 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(LaunchMode::STANDARD), &nMultiton));
4384 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "MULTITON", nMultiton));
4385 napi_value nSpecified;
4386 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(LaunchMode::SPECIFIED), &nSpecified));
4387 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SPECIFIED", nSpecified));
4388 }
4389
CreateSupportWindowModesObject(napi_env env,napi_value value)4390 void CreateSupportWindowModesObject(napi_env env, napi_value value)
4391 {
4392 napi_value nFullscreen;
4393 NAPI_CALL_RETURN_VOID(env,
4394 napi_create_int32(env, static_cast<int32_t>(SupportWindowMode::FULLSCREEN), &nFullscreen));
4395 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "FULL_SCREEN", nFullscreen));
4396
4397 napi_value nSplit;
4398 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(SupportWindowMode::SPLIT), &nSplit));
4399 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SPLIT", nSplit));
4400
4401 napi_value nFloat;
4402 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(SupportWindowMode::FLOATING), &nFloat));
4403 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "FLOATING", nFloat));
4404 }
4405
CreateModuleTypeObject(napi_env env,napi_value value)4406 void CreateModuleTypeObject(napi_env env, napi_value value)
4407 {
4408 napi_value nUnknown;
4409 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(ModuleType::UNKNOWN), &nUnknown));
4410 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "UNKNOWN", nUnknown));
4411
4412 napi_value nEntry;
4413 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(ModuleType::ENTRY), &nEntry));
4414 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "ENTRY", nEntry));
4415
4416 napi_value nFeature;
4417 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(ModuleType::FEATURE), &nFeature));
4418 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "FEATURE", nFeature));
4419
4420 napi_value nShared;
4421 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(ModuleType::SHARED), &nShared));
4422 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SHARED", nShared));
4423 }
4424
CreateCompatiblePolicyObject(napi_env env,napi_value value)4425 void CreateCompatiblePolicyObject(napi_env env, napi_value value)
4426 {
4427 napi_value nNORMAL;
4428 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(CompatiblePolicy::NORMAL), &nNORMAL));
4429 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "NORMAL", nNORMAL));
4430
4431 napi_value nBackwardCompatibility;
4432 NAPI_CALL_RETURN_VOID(env, napi_create_int32(
4433 env, static_cast<int32_t>(CompatiblePolicy::BACKWARD_COMPATIBILITY), &nBackwardCompatibility));
4434 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "BACKWARD_COMPATIBILITY", nBackwardCompatibility));
4435 }
4436
CreateProfileTypeObject(napi_env env,napi_value value)4437 void CreateProfileTypeObject(napi_env env, napi_value value)
4438 {
4439 napi_value nIntentProfile;
4440 NAPI_CALL_RETURN_VOID(env, napi_create_int32(
4441 env, static_cast<int32_t>(ProfileType::INTENT_PROFILE), &nIntentProfile));
4442 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "INTENT_PROFILE", nIntentProfile));
4443 }
4444
InnerGetAppProvisionInfo(const std::string & bundleName,int32_t userId,AppProvisionInfo & appProvisionInfo)4445 ErrCode InnerGetAppProvisionInfo(
4446 const std::string &bundleName, int32_t userId, AppProvisionInfo &appProvisionInfo)
4447 {
4448 auto iBundleMgr = CommonFunc::GetBundleMgr();
4449 if (iBundleMgr == nullptr) {
4450 APP_LOGE("iBundleMgr is null");
4451 return ERROR_BUNDLE_SERVICE_EXCEPTION;
4452 }
4453 ErrCode ret = iBundleMgr->GetAppProvisionInfo(bundleName, userId, appProvisionInfo);
4454 return CommonFunc::ConvertErrCode(ret);
4455 }
4456
GetAppProvisionInfoExec(napi_env env,void * data)4457 void GetAppProvisionInfoExec(napi_env env, void *data)
4458 {
4459 AppProvisionInfoCallbackInfo *asyncCallbackInfo = reinterpret_cast<AppProvisionInfoCallbackInfo *>(data);
4460 if (asyncCallbackInfo == nullptr) {
4461 APP_LOGE("asyncCallbackInfo is null");
4462 return;
4463 }
4464 if (asyncCallbackInfo->err == NO_ERROR) {
4465 asyncCallbackInfo->err = InnerGetAppProvisionInfo(
4466 asyncCallbackInfo->bundleName, asyncCallbackInfo->userId, asyncCallbackInfo->appProvisionInfo);
4467 }
4468 }
4469
GetAppProvisionInfoComplete(napi_env env,napi_status status,void * data)4470 void GetAppProvisionInfoComplete(napi_env env, napi_status status, void *data)
4471 {
4472 AppProvisionInfoCallbackInfo *asyncCallbackInfo =
4473 reinterpret_cast<AppProvisionInfoCallbackInfo *>(data);
4474 if (asyncCallbackInfo == nullptr) {
4475 APP_LOGE("asyncCallbackInfo is null");
4476 return;
4477 }
4478 std::unique_ptr<AppProvisionInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
4479 napi_value result[CALLBACK_PARAM_SIZE] = {0};
4480 if (asyncCallbackInfo->err == NO_ERROR) {
4481 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
4482 NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &result[ARGS_POS_ONE]));
4483 CommonFunc::ConvertAppProvisionInfo(env, asyncCallbackInfo->appProvisionInfo, result[ARGS_POS_ONE]);
4484 } else {
4485 result[ARGS_POS_ZERO] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
4486 GET_APP_PROVISION_INFO, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
4487 }
4488 CommonFunc::NapiReturnDeferred<AppProvisionInfoCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
4489 }
4490
GetAppProvisionInfo(napi_env env,napi_callback_info info)4491 napi_value GetAppProvisionInfo(napi_env env, napi_callback_info info)
4492 {
4493 APP_LOGD("napi GetAppProvisionInfo called");
4494 NapiArg args(env, info);
4495 AppProvisionInfoCallbackInfo *asyncCallbackInfo = new (std::nothrow) AppProvisionInfoCallbackInfo(env);
4496 if (asyncCallbackInfo == nullptr) {
4497 APP_LOGE("asyncCallbackInfo is null");
4498 return nullptr;
4499 }
4500 std::unique_ptr<AppProvisionInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
4501 if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_THREE)) {
4502 APP_LOGE("param count invalid");
4503 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
4504 return nullptr;
4505 }
4506 asyncCallbackInfo->userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
4507 for (size_t i = 0; i < args.GetArgc(); ++i) {
4508 napi_valuetype valueType = napi_undefined;
4509 napi_typeof(env, args[i], &valueType);
4510 if (i == ARGS_POS_ZERO) {
4511 if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->bundleName)) {
4512 APP_LOGE("bundleName invalid");
4513 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
4514 return nullptr;
4515 }
4516 CHECK_STRING_EMPTY(env, asyncCallbackInfo->bundleName, std::string{ BUNDLE_NAME });
4517 } else if (i == ARGS_POS_ONE) {
4518 if (valueType == napi_function) {
4519 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
4520 break;
4521 }
4522 if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->userId)) {
4523 APP_LOGW("parse userId failed, set this parameter to the caller userId");
4524 }
4525 } else if (i == ARGS_POS_TWO) {
4526 if (valueType == napi_function) {
4527 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
4528 break;
4529 }
4530 } else {
4531 APP_LOGE("param check error");
4532 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
4533 return nullptr;
4534 }
4535 }
4536
4537 auto promise = CommonFunc::AsyncCallNativeMethod<AppProvisionInfoCallbackInfo>(
4538 env, asyncCallbackInfo, GET_APP_PROVISION_INFO, GetAppProvisionInfoExec, GetAppProvisionInfoComplete);
4539 callbackPtr.release();
4540 APP_LOGD("call GetAppProvisionInfo done");
4541 return promise;
4542 }
4543
GetSpecifiedDistributionType(napi_env env,napi_callback_info info)4544 napi_value GetSpecifiedDistributionType(napi_env env, napi_callback_info info)
4545 {
4546 APP_LOGD("GetSpecifiedDistributionType napi called");
4547 NapiArg args(env, info);
4548 if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_ONE)) {
4549 APP_LOGE("param count invalid");
4550 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
4551 return nullptr;
4552 }
4553
4554 std::string bundleName;
4555 if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], bundleName)) {
4556 APP_LOGE("bundleName invalid");
4557 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
4558 return nullptr;
4559 }
4560
4561 auto iBundleMgr = CommonFunc::GetBundleMgr();
4562 if (iBundleMgr == nullptr) {
4563 APP_LOGE("iBundleMgr is null");
4564 napi_value businessError = BusinessError::CreateCommonError(
4565 env, ERROR_BUNDLE_SERVICE_EXCEPTION, RESOURCE_NAME_OF_GET_SPECIFIED_DISTRIBUTION_TYPE,
4566 Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
4567 napi_throw(env, businessError);
4568 return nullptr;
4569 }
4570
4571 std::string specifiedDistributionType;
4572 ErrCode ret = CommonFunc::ConvertErrCode(
4573 iBundleMgr->GetSpecifiedDistributionType(bundleName, specifiedDistributionType));
4574 if (ret != SUCCESS) {
4575 APP_LOGE_NOFUNC("GetSpecifiedDistributionType failed -n %{public}s ret:%{public}d",
4576 bundleName.c_str(), ret);
4577 napi_value businessError = BusinessError::CreateCommonError(
4578 env, ret, RESOURCE_NAME_OF_GET_SPECIFIED_DISTRIBUTION_TYPE,
4579 Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
4580 napi_throw(env, businessError);
4581 return nullptr;
4582 }
4583
4584 napi_value nSpecifiedDistributionType;
4585 napi_create_string_utf8(env, specifiedDistributionType.c_str(), NAPI_AUTO_LENGTH, &nSpecifiedDistributionType);
4586 APP_LOGD("call GetSpecifiedDistributionType done");
4587 return nSpecifiedDistributionType;
4588 }
4589
GetAdditionalInfo(napi_env env,napi_callback_info info)4590 napi_value GetAdditionalInfo(napi_env env, napi_callback_info info)
4591 {
4592 APP_LOGD("GetAdditionalInfo napi called");
4593 NapiArg args(env, info);
4594 if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_ONE)) {
4595 APP_LOGE("param count invalid");
4596 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
4597 return nullptr;
4598 }
4599
4600 std::string bundleName;
4601 if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], bundleName)) {
4602 APP_LOGE("bundleName invalid");
4603 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
4604 return nullptr;
4605 }
4606 CHECK_STRING_EMPTY(env, bundleName, std::string{ BUNDLE_NAME });
4607
4608 auto iBundleMgr = CommonFunc::GetBundleMgr();
4609 if (iBundleMgr == nullptr) {
4610 APP_LOGE("iBundleMgr is null");
4611 napi_value businessError = BusinessError::CreateCommonError(
4612 env, ERROR_BUNDLE_SERVICE_EXCEPTION, RESOURCE_NAME_OF_GET_SPECIFIED_DISTRIBUTION_TYPE,
4613 Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
4614 napi_throw(env, businessError);
4615 return nullptr;
4616 }
4617
4618 std::string additionalInfo;
4619 ErrCode ret = CommonFunc::ConvertErrCode(
4620 iBundleMgr->GetAdditionalInfo(bundleName, additionalInfo));
4621 if (ret != SUCCESS) {
4622 APP_LOGE_NOFUNC("GetAdditionalInfo %{public}s error", bundleName.c_str());
4623 napi_value businessError = BusinessError::CreateCommonError(
4624 env, ret, RESOURCE_NAME_OF_GET_ADDITIONAL_INFO, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
4625 napi_throw(env, businessError);
4626 return nullptr;
4627 }
4628
4629 napi_value nAdditionalInfo;
4630 napi_create_string_utf8(env, additionalInfo.c_str(), NAPI_AUTO_LENGTH, &nAdditionalInfo);
4631 APP_LOGD("call GetAdditionalInfo done");
4632 return nAdditionalInfo;
4633 }
4634
GetBundleInfoForSelfSync(napi_env env,napi_callback_info info)4635 napi_value GetBundleInfoForSelfSync(napi_env env, napi_callback_info info)
4636 {
4637 APP_LOGD("GetBundleInfoForSelfSync called");
4638 NapiArg args(env, info);
4639 if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_ONE)) {
4640 APP_LOGE("param count invalid");
4641 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
4642 return nullptr;
4643 }
4644 int32_t flags = 0;
4645 if (!CommonFunc::ParseInt(env, args[ARGS_POS_ZERO], flags)) {
4646 APP_LOGE("parseInt invalid");
4647 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_FLAGS, TYPE_NUMBER);
4648 return nullptr;
4649 }
4650 auto iBundleMgr = CommonFunc::GetBundleMgr();
4651 if (iBundleMgr == nullptr) {
4652 APP_LOGE("BundleMgr is null");
4653 return nullptr;
4654 }
4655 auto uid = IPCSkeleton::GetCallingUid();
4656 std::string bundleName = std::to_string(uid);
4657 int32_t userId = uid / Constants::BASE_USER_RANGE;
4658 napi_value nBundleInfo = nullptr;
4659 if (!CommonFunc::CheckBundleFlagWithPermission(flags)) {
4660 std::shared_lock<std::shared_mutex> lock(g_cacheMutex);
4661 auto item = cache.find(Query(bundleName, GET_BUNDLE_INFO, flags, userId, env));
4662 if (item != cache.end()) {
4663 APP_LOGD("GetBundleInfo param from cache");
4664 NAPI_CALL(env,
4665 napi_get_reference_value(env, item->second, &nBundleInfo));
4666 return nBundleInfo;
4667 }
4668 }
4669 BundleInfo bundleInfo;
4670 ErrCode ret = CommonFunc::ConvertErrCode(iBundleMgr->GetBundleInfoForSelf(flags, bundleInfo));
4671 if (ret != NO_ERROR) {
4672 APP_LOGE("GetBundleInfoForSelfSync failed, bundleName is %{public}s", bundleName.c_str());
4673 napi_value businessError = BusinessError::CreateCommonError(
4674 env, ret, GET_BUNDLE_INFO_FOR_SELF_SYNC, BUNDLE_PERMISSIONS);
4675 napi_throw(env, businessError);
4676 return nullptr;
4677 }
4678 NAPI_CALL(env, napi_create_object(env, &nBundleInfo));
4679 CommonFunc::ConvertBundleInfo(env, bundleInfo, nBundleInfo, flags);
4680 if (!CommonFunc::CheckBundleFlagWithPermission(flags)) {
4681 Query query(bundleName, GET_BUNDLE_INFO, flags, userId, env);
4682 CheckToCache(env, bundleInfo.uid, IPCSkeleton::GetCallingUid(), query, nBundleInfo);
4683 }
4684 return nBundleInfo;
4685 }
4686
ParamsProcessGetJsonProfile(napi_env env,napi_callback_info info,int32_t & profileType,std::string & bundleName,std::string & moduleName,int32_t & userId)4687 bool ParamsProcessGetJsonProfile(napi_env env, napi_callback_info info,
4688 int32_t& profileType, std::string& bundleName, std::string& moduleName, int32_t& userId)
4689 {
4690 NapiArg args(env, info);
4691 if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_FOUR)) {
4692 APP_LOGE("param count invalid");
4693 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
4694 return false;
4695 }
4696 if (!CommonFunc::ParseInt(env, args[ARGS_POS_ZERO], profileType)) {
4697 APP_LOGE("profileType invalid");
4698 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, PROFILE_TYPE, TYPE_NUMBER);
4699 return false;
4700 }
4701 if (g_supportedProfileList.find(profileType) == g_supportedProfileList.end()) {
4702 APP_LOGE("JS request profile error, type is %{public}d, profile not exist", profileType);
4703 BusinessError::ThrowParameterTypeError(env, ERROR_PROFILE_NOT_EXIST, PROFILE_TYPE, TYPE_NUMBER);
4704 return false;
4705 }
4706 if (!CommonFunc::ParseString(env, args[ARGS_POS_ONE], bundleName)) {
4707 APP_LOGE("bundleName invalid");
4708 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
4709 return false;
4710 }
4711 if (bundleName.empty()) {
4712 APP_LOGE("bundleName is empty");
4713 napi_value businessError = BusinessError::CreateCommonError(
4714 env, ERROR_BUNDLE_NOT_EXIST, GET_JSON_PROFILE, BUNDLE_PERMISSIONS);
4715 napi_throw(env, businessError);
4716 return false;
4717 }
4718 if (args.GetMaxArgc() >= ARGS_SIZE_THREE) {
4719 if (!CommonFunc::ParseString(env, args[ARGS_POS_TWO], moduleName)) {
4720 APP_LOGW("parse moduleName failed, try to get profile from entry module");
4721 } else if (moduleName.empty()) {
4722 APP_LOGE("moduleName is empty");
4723 napi_value businessError = BusinessError::CreateCommonError(
4724 env, ERROR_MODULE_NOT_EXIST, GET_JSON_PROFILE, BUNDLE_PERMISSIONS);
4725 napi_throw(env, businessError);
4726 return false;
4727 }
4728 }
4729 if (args.GetMaxArgc() == ARGS_SIZE_FOUR) {
4730 if (!CommonFunc::ParseInt(env, args[ARGS_POS_THREE], userId)) {
4731 APP_LOGE("userId invalid");
4732 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, USER_ID, TYPE_NUMBER);
4733 return false;
4734 }
4735 }
4736 return true;
4737 }
4738
GetJsonProfile(napi_env env,napi_callback_info info)4739 napi_value GetJsonProfile(napi_env env, napi_callback_info info)
4740 {
4741 APP_LOGD("GetJsonProfile napi called");
4742 int32_t profileType = 0;
4743 std::string bundleName;
4744 std::string moduleName;
4745 int32_t userId = Constants::UNSPECIFIED_USERID;
4746 if (!ParamsProcessGetJsonProfile(env, info, profileType, bundleName, moduleName, userId)) {
4747 APP_LOGE("paramsProcess failed");
4748 return nullptr;
4749 }
4750 auto iBundleMgr = CommonFunc::GetBundleMgr();
4751 if (iBundleMgr == nullptr) {
4752 APP_LOGE("iBundleMgr is null");
4753 return nullptr;
4754 }
4755 std::string profile;
4756 ErrCode ret = CommonFunc::ConvertErrCode(
4757 iBundleMgr->GetJsonProfile(static_cast<ProfileType>(profileType), bundleName, moduleName, profile, userId));
4758 if (ret != SUCCESS) {
4759 APP_LOGE_NOFUNC("napi GetJsonProfile err:%{public}d -n %{public}s", ret, bundleName.c_str());
4760 napi_value businessError = BusinessError::CreateCommonError(
4761 env, ret, GET_JSON_PROFILE, BUNDLE_PERMISSIONS);
4762 napi_throw(env, businessError);
4763 return nullptr;
4764 }
4765 napi_value nProfile;
4766 napi_create_string_utf8(env, profile.c_str(), NAPI_AUTO_LENGTH, &nProfile);
4767 APP_LOGD("call GetJsonProfile done");
4768 return nProfile;
4769 }
4770
InnerGetRecoverableApplicationInfo(std::vector<RecoverableApplicationInfo> & recoverableApplications)4771 static ErrCode InnerGetRecoverableApplicationInfo(std::vector<RecoverableApplicationInfo> &recoverableApplications)
4772 {
4773 auto iBundleMgr = CommonFunc::GetBundleMgr();
4774 if (iBundleMgr == nullptr) {
4775 APP_LOGE("iBundleMgr is null");
4776 return ERROR_BUNDLE_SERVICE_EXCEPTION;
4777 }
4778 ErrCode ret = iBundleMgr->GetRecoverableApplicationInfo(recoverableApplications);
4779 return CommonFunc::ConvertErrCode(ret);
4780 }
4781
GetRecoverableApplicationInfoExec(napi_env env,void * data)4782 void GetRecoverableApplicationInfoExec(napi_env env, void *data)
4783 {
4784 RecoverableApplicationCallbackInfo *asyncCallbackInfo =
4785 reinterpret_cast<RecoverableApplicationCallbackInfo *>(data);
4786 if (asyncCallbackInfo == nullptr) {
4787 return;
4788 }
4789 asyncCallbackInfo->err = InnerGetRecoverableApplicationInfo(asyncCallbackInfo->recoverableApplicationInfos);
4790 }
4791
GetRecoverableApplicationInfoExecComplete(napi_env env,napi_status status,void * data)4792 void GetRecoverableApplicationInfoExecComplete(napi_env env, napi_status status, void *data)
4793 {
4794 RecoverableApplicationCallbackInfo *asyncCallbackInfo =
4795 reinterpret_cast<RecoverableApplicationCallbackInfo *>(data);
4796 if (asyncCallbackInfo == nullptr) {
4797 return;
4798 }
4799 std::unique_ptr<RecoverableApplicationCallbackInfo> callbackPtr {asyncCallbackInfo};
4800 napi_value result[CALLBACK_PARAM_SIZE] = {0};
4801 if (asyncCallbackInfo->err == NO_ERROR) {
4802 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
4803 NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &result[ARGS_POS_ONE]));
4804 CommonFunc::ConvertRecoverableApplicationInfos(
4805 env, result[ARGS_POS_ONE], asyncCallbackInfo->recoverableApplicationInfos);
4806 } else {
4807 result[ARGS_POS_ZERO] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
4808 GET_RECOVERABLE_APPLICATION_INFO, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
4809 }
4810 CommonFunc::NapiReturnDeferred<RecoverableApplicationCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
4811 }
4812
GetRecoverableApplicationInfo(napi_env env,napi_callback_info info)4813 napi_value GetRecoverableApplicationInfo(napi_env env, napi_callback_info info)
4814 {
4815 APP_LOGD("NAPI_GetRecoverableApplicationInfo called");
4816 NapiArg args(env, info);
4817 RecoverableApplicationCallbackInfo *asyncCallbackInfo = new (std::nothrow) RecoverableApplicationCallbackInfo(env);
4818 if (asyncCallbackInfo == nullptr) {
4819 APP_LOGE("asyncCallbackInfo is null");
4820 return nullptr;
4821 }
4822 std::unique_ptr<RecoverableApplicationCallbackInfo> callbackPtr {asyncCallbackInfo};
4823 if (!args.Init(ARGS_SIZE_ZERO, ARGS_SIZE_ONE)) {
4824 APP_LOGE("param count invalid");
4825 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
4826 return nullptr;
4827 }
4828 for (size_t i = 0; i < args.GetMaxArgc(); ++i) {
4829 napi_valuetype valueType = napi_undefined;
4830 napi_typeof(env, args[i], &valueType);
4831 if (i == ARGS_POS_ZERO) {
4832 if (valueType == napi_function) {
4833 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
4834 break;
4835 }
4836 } else {
4837 APP_LOGE("param check error");
4838 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
4839 return nullptr;
4840 }
4841 }
4842 auto promise = CommonFunc::AsyncCallNativeMethod<RecoverableApplicationCallbackInfo>(
4843 env, asyncCallbackInfo, GET_RECOVERABLE_APPLICATION_INFO,
4844 GetRecoverableApplicationInfoExec, GetRecoverableApplicationInfoExecComplete);
4845 callbackPtr.release();
4846 APP_LOGD("call NAPI_GetRecoverableApplicationInfo done");
4847 return promise;
4848 }
4849
SetAdditionalInfo(napi_env env,napi_callback_info info)4850 napi_value SetAdditionalInfo(napi_env env, napi_callback_info info)
4851 {
4852 APP_LOGD("Called");
4853 NapiArg args(env, info);
4854 if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_TWO)) {
4855 APP_LOGE("Param count invalid");
4856 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
4857 return nullptr;
4858 }
4859 std::string bundleName;
4860 if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], bundleName)) {
4861 APP_LOGE("Parse bundleName failed");
4862 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
4863 return nullptr;
4864 }
4865 CHECK_STRING_EMPTY(env, bundleName, std::string{ BUNDLE_NAME });
4866 std::string additionalInfo;
4867 if (!CommonFunc::ParseString(env, args[ARGS_POS_ONE], additionalInfo)) {
4868 APP_LOGE("Parse additionalInfo failed");
4869 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, ADDITIONAL_INFO, TYPE_STRING);
4870 return nullptr;
4871 }
4872 auto iBundleMgr = CommonFunc::GetBundleMgr();
4873 if (iBundleMgr == nullptr) {
4874 APP_LOGE("Can not get iBundleMgr");
4875 BusinessError::ThrowError(env, ERROR_BUNDLE_SERVICE_EXCEPTION, ERR_MSG_BUNDLE_SERVICE_EXCEPTION);
4876 return nullptr;
4877 }
4878 ErrCode ret = CommonFunc::ConvertErrCode(iBundleMgr->SetAdditionalInfo(bundleName, additionalInfo));
4879 if (ret != NO_ERROR) {
4880 APP_LOGE("Call failed, bundleName is %{public}s", bundleName.c_str());
4881 napi_value businessError = BusinessError::CreateCommonError(
4882 env, ret, RESOURCE_NAME_OF_SET_ADDITIONAL_INFO, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
4883 napi_throw(env, businessError);
4884 return nullptr;
4885 }
4886 napi_value nRet = nullptr;
4887 NAPI_CALL(env, napi_get_undefined(env, &nRet));
4888 APP_LOGD("Call done");
4889 return nRet;
4890 }
4891
ParamsProcessCanOpenLink(napi_env env,napi_callback_info info,std::string & link)4892 ErrCode ParamsProcessCanOpenLink(napi_env env, napi_callback_info info,
4893 std::string& link)
4894 {
4895 NapiArg args(env, info);
4896 if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_ONE)) {
4897 APP_LOGE("param count invalid");
4898 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
4899 return ERROR_PARAM_CHECK_ERROR;
4900 }
4901 if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], link)) {
4902 APP_LOGW("Parse link failed");
4903 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, LINK, TYPE_STRING);
4904 return ERROR_PARAM_CHECK_ERROR;
4905 }
4906 return ERR_OK;
4907 }
4908
CanOpenLink(napi_env env,napi_callback_info info)4909 napi_value CanOpenLink(napi_env env, napi_callback_info info)
4910 {
4911 APP_LOGD("NAPI CanOpenLink call");
4912 napi_value nRet;
4913 bool canOpen = false;
4914 napi_get_boolean(env, canOpen, &nRet);
4915 std::string link;
4916 if (ParamsProcessCanOpenLink(env, info, link) != ERR_OK) {
4917 APP_LOGE("paramsProcess is invalid");
4918 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
4919 return nRet;
4920 }
4921 auto iBundleMgr = CommonFunc::GetBundleMgr();
4922 if (iBundleMgr == nullptr) {
4923 APP_LOGE("can not get iBundleMgr");
4924 BusinessError::ThrowError(env, ERROR_BUNDLE_SERVICE_EXCEPTION, ERR_MSG_BUNDLE_SERVICE_EXCEPTION);
4925 return nRet;
4926 }
4927 ErrCode ret = CommonFunc::ConvertErrCode(
4928 iBundleMgr->CanOpenLink(link, canOpen));
4929 if (ret != NO_ERROR) {
4930 APP_LOGE("CanOpenLink failed");
4931 napi_value businessError = BusinessError::CreateCommonError(
4932 env, ret, CAN_OPEN_LINK, "");
4933 napi_throw(env, businessError);
4934 return nRet;
4935 }
4936 NAPI_CALL(env, napi_get_boolean(env, canOpen, &nRet));
4937 APP_LOGD("call CanOpenLink done");
4938 return nRet;
4939 }
4940
ConvertPreinstalledApplicationInfo(napi_env env,const PreinstalledApplicationInfo & preinstalledApplicationInfo,napi_value objPreinstalledApplicationInfo)4941 void ConvertPreinstalledApplicationInfo(napi_env env, const PreinstalledApplicationInfo &preinstalledApplicationInfo,
4942 napi_value objPreinstalledApplicationInfo)
4943 {
4944 napi_value nBundleName;
4945 NAPI_CALL_RETURN_VOID(env,
4946 napi_create_string_utf8(env, preinstalledApplicationInfo.bundleName.c_str(), NAPI_AUTO_LENGTH, &nBundleName));
4947 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, objPreinstalledApplicationInfo, BUNDLE_NAME, nBundleName));
4948
4949 napi_value nModuleName;
4950 NAPI_CALL_RETURN_VOID(env,
4951 napi_create_string_utf8(env, preinstalledApplicationInfo.moduleName.c_str(), NAPI_AUTO_LENGTH, &nModuleName));
4952 NAPI_CALL_RETURN_VOID(env,
4953 napi_set_named_property(env, objPreinstalledApplicationInfo, MODULE_NAME, nModuleName));
4954
4955 napi_value nLabelId;
4956 NAPI_CALL_RETURN_VOID(env, napi_create_uint32(env, preinstalledApplicationInfo.labelId, &nLabelId));
4957 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, objPreinstalledApplicationInfo, LABEL_ID, nLabelId));
4958
4959 napi_value nIconId;
4960 NAPI_CALL_RETURN_VOID(env, napi_create_uint32(env, preinstalledApplicationInfo.iconId, &nIconId));
4961 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, objPreinstalledApplicationInfo, ICON_ID, nIconId));
4962 }
4963
4964
ProcessPreinstalledApplicationInfos(napi_env env,napi_value result,const std::vector<PreinstalledApplicationInfo> & preinstalledApplicationInfos)4965 static void ProcessPreinstalledApplicationInfos(
4966 napi_env env, napi_value result, const std::vector<PreinstalledApplicationInfo> &preinstalledApplicationInfos)
4967 {
4968 if (preinstalledApplicationInfos.size() == 0) {
4969 APP_LOGD("PreinstalledApplicationInfos is null");
4970 return;
4971 }
4972 size_t index = 0;
4973 napi_value objPreinstalledApplicationInfo;
4974 for (const auto &item : preinstalledApplicationInfos) {
4975 NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &objPreinstalledApplicationInfo));
4976 ConvertPreinstalledApplicationInfo(env, item, objPreinstalledApplicationInfo);
4977 NAPI_CALL_RETURN_VOID(env, napi_set_element(env, result, index, objPreinstalledApplicationInfo));
4978 index++;
4979 }
4980 }
4981
GetAllPreinstalledApplicationInfosComplete(napi_env env,napi_status status,void * data)4982 void GetAllPreinstalledApplicationInfosComplete(napi_env env, napi_status status, void *data)
4983 {
4984 PreinstalledApplicationInfosCallbackInfo *asyncCallbackInfo =
4985 reinterpret_cast<PreinstalledApplicationInfosCallbackInfo *>(data);
4986 if (asyncCallbackInfo == nullptr) {
4987 APP_LOGE("AsyncCallbackInfo is null");
4988 return;
4989 }
4990 std::unique_ptr<PreinstalledApplicationInfosCallbackInfo> callbackPtr {asyncCallbackInfo};
4991 napi_value result[CALLBACK_PARAM_SIZE] = {0};
4992 if (asyncCallbackInfo->err == NO_ERROR) {
4993 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
4994 NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &result[ARGS_POS_ONE]));
4995 ProcessPreinstalledApplicationInfos(env, result[ARGS_POS_ONE], asyncCallbackInfo->preinstalledApplicationInfos);
4996 } else {
4997 result[ARGS_POS_ZERO] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
4998 GET_ALL_PREINSTALLED_APP_INFOS, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
4999 }
5000 CommonFunc::NapiReturnDeferred<PreinstalledApplicationInfosCallbackInfo>(
5001 env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
5002 }
5003
InnerGetAllPreinstalledApplicationInfos(std::vector<PreinstalledApplicationInfo> & preinstalledApplicationInfos)5004 static ErrCode InnerGetAllPreinstalledApplicationInfos(
5005 std::vector<PreinstalledApplicationInfo> &preinstalledApplicationInfos)
5006 {
5007 auto iBundleMgr = CommonFunc::GetBundleMgr();
5008 if (iBundleMgr == nullptr) {
5009 APP_LOGE("IBundleMgr is null");
5010 return ERROR_BUNDLE_SERVICE_EXCEPTION;
5011 }
5012 ErrCode ret = iBundleMgr->GetAllPreinstalledApplicationInfos(preinstalledApplicationInfos);
5013 return CommonFunc::ConvertErrCode(ret);
5014 }
5015
GetAllPreinstalledApplicationInfosExec(napi_env env,void * data)5016 void GetAllPreinstalledApplicationInfosExec(napi_env env, void *data)
5017 {
5018 PreinstalledApplicationInfosCallbackInfo *asyncCallbackInfo =
5019 reinterpret_cast<PreinstalledApplicationInfosCallbackInfo *>(data);
5020 if (asyncCallbackInfo == nullptr) {
5021 APP_LOGE("AsyncCallbackInfo is null");
5022 return;
5023 }
5024 asyncCallbackInfo->err = InnerGetAllPreinstalledApplicationInfos(asyncCallbackInfo->preinstalledApplicationInfos);
5025 }
5026
GetAllPreinstalledApplicationInfos(napi_env env,napi_callback_info info)5027 napi_value GetAllPreinstalledApplicationInfos(napi_env env, napi_callback_info info)
5028 {
5029 APP_LOGD("Called");
5030 NapiArg args(env, info);
5031 PreinstalledApplicationInfosCallbackInfo *asyncCallbackInfo =
5032 new (std::nothrow) PreinstalledApplicationInfosCallbackInfo(env);
5033 if (asyncCallbackInfo == nullptr) {
5034 APP_LOGE("AsyncCallbackInfo is null");
5035 return nullptr;
5036 }
5037 std::unique_ptr<PreinstalledApplicationInfosCallbackInfo> callbackPtr {asyncCallbackInfo};
5038 if (!args.Init(ARGS_SIZE_ZERO, ARGS_SIZE_ZERO)) {
5039 APP_LOGE("Param count invalid");
5040 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
5041 return nullptr;
5042 }
5043 auto promise = CommonFunc::AsyncCallNativeMethod<PreinstalledApplicationInfosCallbackInfo>(env, asyncCallbackInfo,
5044 GET_ALL_PREINSTALLED_APP_INFOS, GetAllPreinstalledApplicationInfosExec,
5045 GetAllPreinstalledApplicationInfosComplete);
5046 callbackPtr.release();
5047 return promise;
5048 }
5049
GetAllBundleInfoByDeveloperId(napi_env env,napi_callback_info info)5050 napi_value GetAllBundleInfoByDeveloperId(napi_env env, napi_callback_info info)
5051 {
5052 APP_LOGD("Called");
5053 NapiArg args(env, info);
5054 if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_ONE)) {
5055 APP_LOGE("Param count invalid");
5056 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
5057 return nullptr;
5058 }
5059 std::string developerId;
5060 if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], developerId)) {
5061 APP_LOGE("Parse developerId failed");
5062 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, DEVELOPER_ID, TYPE_STRING);
5063 return nullptr;
5064 }
5065 CHECK_STRING_EMPTY(env, developerId, std::string{ DEVELOPER_ID });
5066 auto iBundleMgr = CommonFunc::GetBundleMgr();
5067 if (iBundleMgr == nullptr) {
5068 APP_LOGE("Can not get iBundleMgr");
5069 BusinessError::ThrowError(env, ERROR_BUNDLE_SERVICE_EXCEPTION, ERR_MSG_BUNDLE_SERVICE_EXCEPTION);
5070 return nullptr;
5071 }
5072 std::vector<BundleInfo> bundleInfos;
5073 int32_t userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
5074 ErrCode ret = CommonFunc::ConvertErrCode(
5075 iBundleMgr->GetAllBundleInfoByDeveloperId(developerId, bundleInfos, userId));
5076 if (ret != NO_ERROR) {
5077 APP_LOGE("Call failed, developerId is %{public}s", developerId.c_str());
5078 napi_value businessError = BusinessError::CreateCommonError(
5079 env, ret, GET_ALL_BUNDLE_INFO_BY_DEVELOPER_ID, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
5080 napi_throw(env, businessError);
5081 return nullptr;
5082 }
5083 napi_value nBundleInfos;
5084 NAPI_CALL(env, napi_create_array(env, &nBundleInfos));
5085 ProcessBundleInfos(env, nBundleInfos, bundleInfos,
5086 static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_APPLICATION));
5087 APP_LOGD("Call done");
5088 return nBundleInfos;
5089 }
5090
ProcessStringVec(napi_env env,napi_value result,const std::vector<std::string> & stringList)5091 static void ProcessStringVec(
5092 napi_env env, napi_value result, const std::vector<std::string> &stringList)
5093 {
5094 if (stringList.size() == 0) {
5095 APP_LOGD("stringList is null");
5096 return;
5097 }
5098 size_t index = 0;
5099 for (const auto &item : stringList) {
5100 APP_LOGD("string: %{public}s ", item.c_str());
5101 napi_value nString;
5102 NAPI_CALL_RETURN_VOID(env, napi_create_string_utf8(env, item.c_str(), NAPI_AUTO_LENGTH, &nString));
5103 NAPI_CALL_RETURN_VOID(env, napi_set_element(env, result, index, nString));
5104 index++;
5105 }
5106 }
5107
GetDeveloperIds(napi_env env,napi_callback_info info)5108 napi_value GetDeveloperIds(napi_env env, napi_callback_info info)
5109 {
5110 APP_LOGD("Called");
5111 NapiArg args(env, info);
5112 if (!args.Init(ARGS_SIZE_ZERO, ARGS_SIZE_ONE)) {
5113 APP_LOGE("Param count invalid");
5114 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
5115 return nullptr;
5116 }
5117 std::string distributionType;
5118 if (args.GetMaxArgc() >= ARGS_SIZE_ONE) {
5119 int32_t appDistributionTypeEnum = 0;
5120 if (!CommonFunc::ParseInt(env, args[ARGS_POS_ZERO], appDistributionTypeEnum)) {
5121 APP_LOGE("parseInt failed");
5122 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, APP_DISTRIBUTION_TYPE, TYPE_NUMBER);
5123 return nullptr;
5124 }
5125 if (appDistributionTypeMap.find(appDistributionTypeEnum) == appDistributionTypeMap.end()) {
5126 APP_LOGE("request error, type %{public}d is invalid", appDistributionTypeEnum);
5127 BusinessError::ThrowEnumError(env, APP_DISTRIBUTION_TYPE, APP_DISTRIBUTION_TYPE_ENUM);
5128 return nullptr;
5129 }
5130 distributionType = std::string{ appDistributionTypeMap[appDistributionTypeEnum] };
5131 }
5132
5133 auto iBundleMgr = CommonFunc::GetBundleMgr();
5134 if (iBundleMgr == nullptr) {
5135 APP_LOGE("Can not get iBundleMgr");
5136 BusinessError::ThrowError(env, ERROR_BUNDLE_SERVICE_EXCEPTION, ERR_MSG_BUNDLE_SERVICE_EXCEPTION);
5137 return nullptr;
5138 }
5139 std::vector<std::string> developerIds;
5140 int32_t userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
5141 ErrCode ret = CommonFunc::ConvertErrCode(
5142 iBundleMgr->GetDeveloperIds(distributionType, developerIds, userId));
5143 if (ret != NO_ERROR) {
5144 APP_LOGW("Call failed, appDistributionType is %{public}s", distributionType.c_str());
5145 napi_value businessError = BusinessError::CreateCommonError(
5146 env, ret, GET_DEVELOPER_IDS, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
5147 napi_throw(env, businessError);
5148 return nullptr;
5149 }
5150 napi_value nDeveloperIds;
5151 NAPI_CALL(env, napi_create_array(env, &nDeveloperIds));
5152 ProcessStringVec(env, nDeveloperIds, developerIds);
5153 APP_LOGD("Call done");
5154 return nDeveloperIds;
5155 }
5156
SwitchUninstallState(napi_env env,napi_callback_info info)5157 napi_value SwitchUninstallState(napi_env env, napi_callback_info info)
5158 {
5159 APP_LOGI("NAPI SwitchUninstallState call");
5160 NapiArg args(env, info);
5161 if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_TWO)) {
5162 APP_LOGE("Param count invalid");
5163 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
5164 return nullptr;
5165 }
5166 std::string bundleName;
5167 if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], bundleName)) {
5168 APP_LOGE("Parse bundleName failed");
5169 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
5170 return nullptr;
5171 }
5172 bool state;
5173 if (!CommonFunc::ParseBool(env, args[ARGS_POS_ONE], state)) {
5174 APP_LOGE("Parse state failed");
5175 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, STATE, TYPE_BOOLEAN);
5176 return nullptr;
5177 }
5178 auto iBundleMgr = CommonFunc::GetBundleMgr();
5179 if (iBundleMgr == nullptr) {
5180 APP_LOGE("can not get iBundleMgr");
5181 BusinessError::ThrowError(env, ERROR_BUNDLE_SERVICE_EXCEPTION, ERR_MSG_BUNDLE_SERVICE_EXCEPTION);
5182 return nullptr;
5183 }
5184 ErrCode ret = CommonFunc::ConvertErrCode(iBundleMgr->SwitchUninstallState(bundleName, state));
5185 if (ret != NO_ERROR) {
5186 APP_LOGE("SwitchUninstallState failed");
5187 napi_value businessError = BusinessError::CreateCommonError(
5188 env, ret, SWITCH_UNINSTALL_STATE, "");
5189 napi_throw(env, businessError);
5190 return nullptr;
5191 }
5192 napi_value nRet = nullptr;
5193 NAPI_CALL(env, napi_get_undefined(env, &nRet));
5194 APP_LOGD("call SwitchUninstallState done");
5195 return nRet;
5196 }
5197
InnerGetAppCloneBundleInfo(const std::string & bundleName,int32_t appIndex,int32_t bundleFlags,int32_t userId,BundleInfo & bundleInfo)5198 static ErrCode InnerGetAppCloneBundleInfo(const std::string &bundleName, int32_t appIndex,
5199 int32_t bundleFlags, int32_t userId, BundleInfo &bundleInfo)
5200 {
5201 auto iBundleMgr = CommonFunc::GetBundleMgr();
5202 if (iBundleMgr == nullptr) {
5203 APP_LOGE("can not get iBundleMgr");
5204 return ERROR_BUNDLE_SERVICE_EXCEPTION;
5205 }
5206 ErrCode ret = iBundleMgr->GetCloneBundleInfo(bundleName, bundleFlags, appIndex, bundleInfo, userId);
5207 APP_LOGD("GetCloneBundleInfo result is %{public}d", ret);
5208 return CommonFunc::ConvertErrCode(ret);
5209 }
5210
GetAppCloneBundleInfoExec(napi_env env,void * data)5211 void GetAppCloneBundleInfoExec(napi_env env, void *data)
5212 {
5213 CloneAppBundleInfoCallbackInfo *asyncCallbackInfo = reinterpret_cast<CloneAppBundleInfoCallbackInfo *>(data);
5214 if (asyncCallbackInfo == nullptr) {
5215 APP_LOGE("asyncCallbackInfo is null");
5216 return;
5217 }
5218 APP_LOGD("param: name=%{public}s,index=%{public}d,bundleFlags=%{public}d,userId=%{public}d",
5219 asyncCallbackInfo->bundleName.c_str(),
5220 asyncCallbackInfo->appIndex,
5221 asyncCallbackInfo->bundleFlags,
5222 asyncCallbackInfo->userId);
5223 asyncCallbackInfo->err =
5224 InnerGetAppCloneBundleInfo(asyncCallbackInfo->bundleName, asyncCallbackInfo->appIndex,
5225 asyncCallbackInfo->bundleFlags, asyncCallbackInfo->userId, asyncCallbackInfo->bundleInfo);
5226 }
5227
GetAppCloneBundleInfoComplete(napi_env env,napi_status status,void * data)5228 void GetAppCloneBundleInfoComplete(napi_env env, napi_status status, void *data)
5229 {
5230 CloneAppBundleInfoCallbackInfo *asyncCallbackInfo = reinterpret_cast<CloneAppBundleInfoCallbackInfo *>(data);
5231 if (asyncCallbackInfo == nullptr) {
5232 APP_LOGE("asyncCallbackInfo is null");
5233 return;
5234 }
5235 std::unique_ptr<CloneAppBundleInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
5236 napi_value result[CALLBACK_PARAM_SIZE] = {0};
5237 if (asyncCallbackInfo->err == NO_ERROR) {
5238 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
5239 NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &result[ARGS_POS_ONE]));
5240 CommonFunc::ConvertBundleInfo(env, asyncCallbackInfo->bundleInfo, result[ARGS_POS_ONE],
5241 asyncCallbackInfo->bundleFlags);
5242 } else {
5243 result[ARGS_POS_ZERO] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
5244 GET_APP_CLONE_BUNDLE_INFO, Constants::PERMISSION_GET_BUNDLE_INFO);
5245 }
5246 CommonFunc::NapiReturnDeferred<CloneAppBundleInfoCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
5247 }
5248
GetAppCloneBundleInfo(napi_env env,napi_callback_info info)5249 napi_value GetAppCloneBundleInfo(napi_env env, napi_callback_info info)
5250 {
5251 APP_LOGD("NAPI GetAppCloneBundleInfo call");
5252 NapiArg args(env, info);
5253 if (!args.Init(ARGS_SIZE_THREE, ARGS_SIZE_FOUR)) {
5254 APP_LOGE("Param count invalid");
5255 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
5256 return nullptr;
5257 }
5258 std::unique_ptr<CloneAppBundleInfoCallbackInfo> asyncCallbackInfo =
5259 std::make_unique<CloneAppBundleInfoCallbackInfo>(env);
5260 if (asyncCallbackInfo == nullptr) {
5261 APP_LOGW("asyncCallbackInfo is null");
5262 return nullptr;
5263 }
5264 if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], asyncCallbackInfo->bundleName)) {
5265 APP_LOGE("Parse bundleName failed");
5266 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
5267 return nullptr;
5268 }
5269 if (!CommonFunc::ParseInt(env, args[ARGS_POS_ONE], asyncCallbackInfo->appIndex)) {
5270 APP_LOGE("Parse appIndex failed");
5271 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, APP_INDEX, TYPE_NUMBER);
5272 return nullptr;
5273 }
5274 if (!CommonFunc::ParseInt(env, args[ARGS_POS_TWO], asyncCallbackInfo->bundleFlags)) {
5275 APP_LOGE("Parse bundleFlags failed");
5276 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_FLAGS, TYPE_NUMBER);
5277 return nullptr;
5278 }
5279 if (!CommonFunc::ParseInt(env, args[ARGS_POS_THREE], asyncCallbackInfo->userId)) {
5280 APP_LOGI("Parse userId failed, use default value");
5281 }
5282 auto promise = CommonFunc::AsyncCallNativeMethod<CloneAppBundleInfoCallbackInfo>(
5283 env, asyncCallbackInfo.get(), GET_APP_CLONE_BUNDLE_INFO,
5284 GetAppCloneBundleInfoExec, GetAppCloneBundleInfoComplete);
5285 asyncCallbackInfo.release();
5286 APP_LOGD("call GetAppCloneBundleInfo done");
5287 return promise;
5288 }
5289
InnerGetAllAppCloneBundleInfo(const std::string & bundleName,int32_t bundleFlags,int32_t userId,std::vector<BundleInfo> & bundleInfos)5290 static ErrCode InnerGetAllAppCloneBundleInfo(const std::string &bundleName, int32_t bundleFlags,
5291 int32_t userId, std::vector<BundleInfo> &bundleInfos)
5292 {
5293 auto iBundleMgr = CommonFunc::GetBundleMgr();
5294 if (iBundleMgr == nullptr) {
5295 APP_LOGE("can not get iBundleMgr");
5296 return ERROR_BUNDLE_SERVICE_EXCEPTION;
5297 }
5298 BundleInfo bundleInfoMain;
5299 ErrCode ret = iBundleMgr->GetCloneBundleInfo(bundleName, bundleFlags, 0, bundleInfoMain, userId);
5300 APP_LOGD("GetMainBundleInfo appIndex = 0, ret=%{public}d", ret);
5301 if (ret == ERR_OK) {
5302 bundleInfos.emplace_back(bundleInfoMain);
5303 }
5304 if (ret != ERR_OK && ret != ERR_BUNDLE_MANAGER_APPLICATION_DISABLED) {
5305 return CommonFunc::ConvertErrCode(ret);
5306 }
5307 // handle clone apps
5308 std::vector<int32_t> appIndexes;
5309 ErrCode getCloneIndexesRet = iBundleMgr->GetCloneAppIndexes(bundleName, appIndexes, userId);
5310 if (getCloneIndexesRet != ERR_OK) {
5311 if (ret == ERR_OK) {
5312 return SUCCESS;
5313 }
5314 return CommonFunc::ConvertErrCode(ret);
5315 }
5316 for (int32_t appIndex : appIndexes) {
5317 BundleInfo bundleInfo;
5318 ret = iBundleMgr->GetCloneBundleInfo(bundleName, bundleFlags, appIndex, bundleInfo, userId);
5319 if (ret == ERR_OK) {
5320 bundleInfos.emplace_back(bundleInfo);
5321 }
5322 }
5323 if (bundleInfos.empty()) {
5324 return ERROR_BUNDLE_IS_DISABLED;
5325 }
5326 return SUCCESS;
5327 }
5328
GetAllAppCloneBundleInfoExec(napi_env env,void * data)5329 void GetAllAppCloneBundleInfoExec(napi_env env, void *data)
5330 {
5331 CloneAppBundleInfosCallbackInfo *asyncCallbackInfo = reinterpret_cast<CloneAppBundleInfosCallbackInfo *>(data);
5332 if (asyncCallbackInfo == nullptr) {
5333 APP_LOGE("asyncCallbackInfo is null");
5334 return;
5335 }
5336 APP_LOGD("param: name=%{public}s,bundleFlags=%{public}d,userId=%{public}d",
5337 asyncCallbackInfo->bundleName.c_str(),
5338 asyncCallbackInfo->bundleFlags,
5339 asyncCallbackInfo->userId);
5340 asyncCallbackInfo->err =
5341 InnerGetAllAppCloneBundleInfo(asyncCallbackInfo->bundleName, asyncCallbackInfo->bundleFlags,
5342 asyncCallbackInfo->userId, asyncCallbackInfo->bundleInfos);
5343 }
5344
CloneAppBundleInfos(napi_env env,napi_value result,const std::vector<BundleInfo> & bundleInfos,int32_t flags)5345 static void CloneAppBundleInfos(
5346 napi_env env, napi_value result, const std::vector<BundleInfo> &bundleInfos, int32_t flags)
5347 {
5348 if (bundleInfos.size() == 0) {
5349 APP_LOGD("bundleInfos is null");
5350 return;
5351 }
5352 size_t index = 0;
5353 for (const auto &item : bundleInfos) {
5354 napi_value objBundleInfo;
5355 NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &objBundleInfo));
5356 CommonFunc::ConvertBundleInfo(env, item, objBundleInfo, flags);
5357 NAPI_CALL_RETURN_VOID(env, napi_set_element(env, result, index++, objBundleInfo));
5358 }
5359 }
5360
GetAllAppCloneBundleInfoComplete(napi_env env,napi_status status,void * data)5361 void GetAllAppCloneBundleInfoComplete(napi_env env, napi_status status, void *data)
5362 {
5363 CloneAppBundleInfosCallbackInfo *asyncCallbackInfo = reinterpret_cast<CloneAppBundleInfosCallbackInfo *>(data);
5364 if (asyncCallbackInfo == nullptr) {
5365 APP_LOGE("asyncCallbackInfo is null");
5366 return;
5367 }
5368 std::unique_ptr<CloneAppBundleInfosCallbackInfo> callbackPtr {asyncCallbackInfo};
5369 napi_value result[CALLBACK_PARAM_SIZE] = {0};
5370 if (asyncCallbackInfo->err == NO_ERROR) {
5371 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
5372 NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &result[ARGS_POS_ONE]));
5373 CloneAppBundleInfos(env, result[ARGS_POS_ONE], asyncCallbackInfo->bundleInfos, asyncCallbackInfo->bundleFlags);
5374 } else {
5375 result[ARGS_POS_ZERO] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
5376 GET_ALL_APP_CLONE_BUNDLE_INFO, Constants::PERMISSION_GET_BUNDLE_INFO);
5377 }
5378 CommonFunc::NapiReturnDeferred<CloneAppBundleInfosCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
5379 }
5380
GetAllAppCloneBundleInfo(napi_env env,napi_callback_info info)5381 napi_value GetAllAppCloneBundleInfo(napi_env env, napi_callback_info info)
5382 {
5383 APP_LOGD("NAPI GetAllAppCloneBundleInfo call");
5384 NapiArg args(env, info);
5385 if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_THREE)) {
5386 APP_LOGE("Param count invalid");
5387 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
5388 return nullptr;
5389 }
5390 std::unique_ptr<CloneAppBundleInfosCallbackInfo> asyncCallbackInfo =
5391 std::make_unique<CloneAppBundleInfosCallbackInfo>(env);
5392 if (asyncCallbackInfo == nullptr) {
5393 APP_LOGW("asyncCallbackInfo is null");
5394 return nullptr;
5395 }
5396 if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], asyncCallbackInfo->bundleName)) {
5397 APP_LOGE("Parse bundleName failed");
5398 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
5399 return nullptr;
5400 }
5401 if (!CommonFunc::ParseInt(env, args[ARGS_POS_ONE], asyncCallbackInfo->bundleFlags)) {
5402 APP_LOGE("Parse bundleFlags failed");
5403 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_FLAGS, TYPE_NUMBER);
5404 return nullptr;
5405 }
5406 if (!CommonFunc::ParseInt(env, args[ARGS_POS_TWO], asyncCallbackInfo->userId)) {
5407 APP_LOGI("Parse userId failed, use default value");
5408 }
5409 auto promise = CommonFunc::AsyncCallNativeMethod<CloneAppBundleInfosCallbackInfo>(
5410 env, asyncCallbackInfo.get(), GET_ALL_APP_CLONE_BUNDLE_INFO,
5411 GetAllAppCloneBundleInfoExec, GetAllAppCloneBundleInfoComplete);
5412 asyncCallbackInfo.release();
5413 APP_LOGD("call GetAllAppCloneBundleInfo done");
5414 return promise;
5415 }
5416
CreateMultiAppModeTypeObject(napi_env env,napi_value value)5417 void CreateMultiAppModeTypeObject(napi_env env, napi_value value)
5418 {
5419 napi_value nUnspecified;
5420 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(MultiAppModeType::UNSPECIFIED),
5421 &nUnspecified));
5422 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, UNSPECIFIED, nUnspecified));
5423
5424 napi_value nMultiInstance;
5425 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(MultiAppModeType::MULTI_INSTANCE),
5426 &nMultiInstance));
5427 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, MULTI_INSTANCE, nMultiInstance));
5428
5429 napi_value nAppClone;
5430 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(MultiAppModeType::APP_CLONE),
5431 &nAppClone));
5432 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, APP_CLONE, nAppClone));
5433 }
5434 }
5435 }
5436