1 /*
2 * Copyright (c) 2022-2023 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 "bundle_errors.h"
22 #include "bundle_mgr_client.h"
23 #include "bundle_mgr_interface.h"
24 #include "bundle_mgr_proxy.h"
25 #include "business_error.h"
26 #include "bundle_constants.h"
27 #include "common_func.h"
28 #include "hap_module_info.h"
29 #ifdef BUNDLE_FRAMEWORK_GET_ABILITY_ICON_ENABLED
30 #include "image_source.h"
31 #include "pixel_map_napi.h"
32 #endif
33 #include "ipc_skeleton.h"
34 #include "napi_arg.h"
35 #include "napi_constants.h"
36
37 namespace OHOS {
38 namespace AppExecFwk {
39 namespace {
40 constexpr const char* MODULE_NAME = "moduleName";
41 constexpr const char* ABILITY_NAME = "abilityName";
42 constexpr const char* BUNDLE_NAME = "bundleName";
43 constexpr const char* ABILITY_INFO = "abilityInfo";
44 constexpr const char* IS_ENABLE = "isEnable";
45 constexpr const char* USER_ID = "userId";
46 constexpr const char* BUNDLE_FLAGS = "bundleFlags";
47 constexpr const char* APP_FLAGS = "appFlags";
48 constexpr const char* ABILITY_FLAGS = "abilityFlags";
49 constexpr const char* STRING_TYPE = "napi_string";
50 constexpr const char* GET_LAUNCH_WANT_FOR_BUNDLE = "GetLaunchWantForBundle";
51 constexpr const char* ERR_MSG_BUNDLE_SERVICE_EXCEPTION = "Bundle manager service is excepted.";
52 const std::string GET_BUNDLE_ARCHIVE_INFO = "GetBundleArchiveInfo";
53 const std::string GET_BUNDLE_NAME_BY_UID = "GetBundleNameByUid";
54 const std::string QUERY_ABILITY_INFOS = "QueryAbilityInfos";
55 const std::string QUERY_ABILITY_INFOS_SYNC = "QueryAbilityInfosSync";
56 const std::string QUERY_EXTENSION_INFOS = "QueryExtensionInfos";
57 const std::string GET_BUNDLE_INFO = "GetBundleInfo";
58 const std::string GET_BUNDLE_INFOS = "GetBundleInfos";
59 const std::string GET_APPLICATION_INFO = "GetApplicationInfo";
60 const std::string GET_APPLICATION_INFOS = "GetApplicationInfos";
61 const std::string GET_PERMISSION_DEF = "GetPermissionDef";
62 const std::string PERMISSION_NAME = "permissionName";
63 const std::string BUNDLE_PERMISSIONS = "ohos.permission.GET_BUNDLE_INFO or ohos.permission.GET_BUNDLE_INFO_PRIVILEGED";
64 const std::string PARAM_TYPE_CHECK_ERROR = "param type check error";
65 const std::string PARAM_TYPE_CHECK_ERROR_WITH_POS = "param type check error, error position : ";
66 const std::string GET_BUNDLE_INFO_SYNC = "GetBundleInfoSync";
67 const std::string GET_APPLICATION_INFO_SYNC = "GetApplicationInfoSync";
68 const std::string GET_ALL_SHARED_BUNDLE_INFO = "GetAllSharedBundleInfo";
69 const std::string GET_SHARED_BUNDLE_INFO = "GetSharedBundleInfo";
70 const std::string INVALID_WANT_ERROR =
71 "implicit query condition, at least one query param(action entities uri type) non-empty.";
72 const std::string GET_APP_PROVISION_INFO = "GetAppProvisionInfo";
73 const std::string RESOURCE_NAME_OF_GET_SPECIFIED_DISTRIBUTION_TYPE = "GetSpecifiedDistributionType";
74 const std::string RESOURCE_NAME_OF_GET_ADDITIONAL_INFO = "GetAdditionalInfo";
75 const std::string GET_BUNDLE_INFO_FOR_SELF_SYNC = "GetBundleInfoForSelfSync";
76 } // namespace
77 using namespace OHOS::AAFwk;
78 static std::shared_ptr<ClearCacheListener> g_clearCacheListener;
79 static std::unordered_map<Query, napi_ref, QueryHash> cache;
80 static std::string g_ownBundleName;
81 static std::mutex g_ownBundleNameMutex;
82 static std::shared_mutex g_cacheMutex;
83 namespace {
84 const std::string PARAMETER_BUNDLE_NAME = "bundleName";
85 }
86
ClearCacheListener(const EventFwk::CommonEventSubscribeInfo & subscribeInfo)87 ClearCacheListener::ClearCacheListener(const EventFwk::CommonEventSubscribeInfo &subscribeInfo)
88 : EventFwk::CommonEventSubscriber(subscribeInfo)
89 {}
90
OnReceiveEvent(const EventFwk::CommonEventData & data)91 void ClearCacheListener::OnReceiveEvent(const EventFwk::CommonEventData &data)
92 {
93 APP_LOGD("clear bms cache");
94 std::unique_lock<std::shared_mutex> lock(g_cacheMutex);
95 cache.clear();
96 }
97
RegisterClearCacheListener()98 void RegisterClearCacheListener()
99 {
100 if (g_clearCacheListener != nullptr) {
101 return;
102 }
103 APP_LOGD("register clear cache listener");
104 EventFwk::MatchingSkills matchingSkills;
105 matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_PACKAGE_ADDED);
106 matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_PACKAGE_CHANGED);
107 matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_PACKAGE_REMOVED);
108 EventFwk::CommonEventSubscribeInfo subscribeInfo(matchingSkills);
109 g_clearCacheListener = std::make_shared<ClearCacheListener>(subscribeInfo);
110 (void)EventFwk::CommonEventManager::SubscribeCommonEvent(g_clearCacheListener);
111 }
112
InnerGetBundleArchiveInfo(std::string & hapFilePath,int32_t flags,BundleInfo & bundleInfo)113 static ErrCode InnerGetBundleArchiveInfo(std::string &hapFilePath, int32_t flags, BundleInfo &bundleInfo)
114 {
115 auto iBundleMgr = CommonFunc::GetBundleMgr();
116 if (iBundleMgr == nullptr) {
117 APP_LOGE("iBundleMgr is null");
118 return ERROR_BUNDLE_SERVICE_EXCEPTION;
119 }
120 ErrCode ret = iBundleMgr->GetBundleArchiveInfoV9(hapFilePath, flags, bundleInfo);
121 APP_LOGD("GetBundleArchiveInfoV9 ErrCode : %{public}d", ret);
122 return CommonFunc::ConvertErrCode(ret);
123 }
124
GetBundleArchiveInfoExec(napi_env env,void * data)125 void GetBundleArchiveInfoExec(napi_env env, void *data)
126 {
127 GetBundleArchiveInfoCallbackInfo *asyncCallbackInfo = reinterpret_cast<GetBundleArchiveInfoCallbackInfo *>(data);
128 if (asyncCallbackInfo == nullptr) {
129 APP_LOGE("asyncCallbackInfo is null");
130 return;
131 }
132 asyncCallbackInfo->err = InnerGetBundleArchiveInfo(
133 asyncCallbackInfo->hapFilePath, asyncCallbackInfo->flags, asyncCallbackInfo->bundleInfo);
134 }
135
GetBundleArchiveInfoComplete(napi_env env,napi_status status,void * data)136 void GetBundleArchiveInfoComplete(napi_env env, napi_status status, void *data)
137 {
138 GetBundleArchiveInfoCallbackInfo *asyncCallbackInfo = reinterpret_cast<GetBundleArchiveInfoCallbackInfo *>(data);
139 if (asyncCallbackInfo == nullptr) {
140 APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
141 return;
142 }
143 std::unique_ptr<GetBundleArchiveInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
144 napi_value result[ARGS_SIZE_TWO] = {0};
145 if (asyncCallbackInfo->err == NO_ERROR) {
146 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
147 NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &result[ARGS_POS_ONE]));
148 CommonFunc::ConvertBundleInfo(env,
149 asyncCallbackInfo->bundleInfo, result[ARGS_POS_ONE], asyncCallbackInfo->flags);
150 } else {
151 result[ARGS_POS_ZERO] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
152 GET_BUNDLE_ARCHIVE_INFO, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
153 }
154 CommonFunc::NapiReturnDeferred<GetBundleArchiveInfoCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
155 }
156
GetBundleArchiveInfo(napi_env env,napi_callback_info info)157 napi_value GetBundleArchiveInfo(napi_env env, napi_callback_info info)
158 {
159 APP_LOGD("begin to GetBundleArchiveInfo");
160 NapiArg args(env, info);
161 GetBundleArchiveInfoCallbackInfo *asyncCallbackInfo = new (std::nothrow) GetBundleArchiveInfoCallbackInfo(env);
162 if (asyncCallbackInfo == nullptr) {
163 APP_LOGE("asyncCallbackInfo is null");
164 return nullptr;
165 }
166 std::unique_ptr<GetBundleArchiveInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
167 if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_THREE)) {
168 APP_LOGE("param count invalid.");
169 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
170 return nullptr;
171 }
172 for (size_t i = 0; i < args.GetMaxArgc(); ++i) {
173 napi_valuetype valueType = napi_undefined;
174 napi_typeof(env, args[i], &valueType);
175 if ((i == ARGS_POS_ZERO) && (valueType == napi_string)) {
176 if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->hapFilePath)) {
177 APP_LOGE("hapFilePath %{public}s invalid!", asyncCallbackInfo->hapFilePath.c_str());
178 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
179 return nullptr;
180 }
181 } else if ((i == ARGS_POS_ONE) && (valueType == napi_number)) {
182 CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->flags);
183 } else if (i == ARGS_POS_TWO) {
184 if (valueType == napi_function) {
185 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
186 }
187 break;
188 } else {
189 APP_LOGE("param check error");
190 std::string errMsg = PARAM_TYPE_CHECK_ERROR_WITH_POS + std::to_string(i + 1);
191 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, errMsg);
192 return nullptr;
193 }
194 }
195 auto promise = CommonFunc::AsyncCallNativeMethod<GetBundleArchiveInfoCallbackInfo>(
196 env, asyncCallbackInfo, GET_BUNDLE_ARCHIVE_INFO, GetBundleArchiveInfoExec, GetBundleArchiveInfoComplete);
197 callbackPtr.release();
198 APP_LOGD("call GetBundleArchiveInfo done");
199 return promise;
200 }
201
InnerGetBundleNameByUid(int32_t uid,std::string & bundleName)202 static ErrCode InnerGetBundleNameByUid(int32_t uid, std::string &bundleName)
203 {
204 auto iBundleMgr = CommonFunc::GetBundleMgr();
205 if (iBundleMgr == nullptr) {
206 APP_LOGE("iBundleMgr is null");
207 return ERROR_BUNDLE_SERVICE_EXCEPTION;
208 }
209 ErrCode ret = iBundleMgr->GetNameForUid(uid, bundleName);
210 APP_LOGD("GetNameForUid ErrCode : %{public}d", ret);
211 return CommonFunc::ConvertErrCode(ret);
212 }
213
InnerGetApplicationInfo(const std::string & bundleName,int32_t flags,int32_t userId,ApplicationInfo & appInfo)214 static ErrCode InnerGetApplicationInfo(const std::string &bundleName, int32_t flags,
215 int32_t userId, ApplicationInfo &appInfo)
216 {
217 auto iBundleMgr = CommonFunc::GetBundleMgr();
218 if (iBundleMgr == nullptr) {
219 APP_LOGE("iBundleMgr is null");
220 return ERROR_BUNDLE_SERVICE_EXCEPTION;
221 }
222 ErrCode ret = iBundleMgr->GetApplicationInfoV9(bundleName, flags, userId, appInfo);
223 return CommonFunc::ConvertErrCode(ret);
224 }
225
InnerGetApplicationInfos(int32_t flags,int32_t userId,std::vector<ApplicationInfo> & appInfos)226 static ErrCode InnerGetApplicationInfos(int32_t flags,
227 int32_t userId, std::vector<ApplicationInfo> &appInfos)
228 {
229 auto iBundleMgr = CommonFunc::GetBundleMgr();
230 if (iBundleMgr == nullptr) {
231 APP_LOGE("iBundleMgr is null");
232 return ERROR_BUNDLE_SERVICE_EXCEPTION;
233 }
234 ErrCode ret = iBundleMgr->GetApplicationInfosV9(flags, userId, appInfos);
235 return CommonFunc::ConvertErrCode(ret);
236 }
237
ProcessApplicationInfos(napi_env env,napi_value result,const std::vector<ApplicationInfo> & appInfos)238 static void ProcessApplicationInfos(
239 napi_env env, napi_value result, const std::vector<ApplicationInfo> &appInfos)
240 {
241 if (appInfos.size() == 0) {
242 APP_LOGD("appInfos is null");
243 return;
244 }
245 size_t index = 0;
246 for (const auto &item : appInfos) {
247 APP_LOGD("name{%s}, bundleName{%s} ", item.name.c_str(), item.bundleName.c_str());
248 napi_value objAppInfo;
249 NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &objAppInfo));
250 CommonFunc::ConvertApplicationInfo(env, objAppInfo, item);
251 NAPI_CALL_RETURN_VOID(env, napi_set_element(env, result, index, objAppInfo));
252 index++;
253 }
254 }
255
GetBundleNameByUidExec(napi_env env,void * data)256 void GetBundleNameByUidExec(napi_env env, void *data)
257 {
258 GetBundleNameByUidCallbackInfo *asyncCallbackInfo = reinterpret_cast<GetBundleNameByUidCallbackInfo *>(data);
259 if (asyncCallbackInfo == nullptr) {
260 APP_LOGE("asyncCallbackInfo is null");
261 return;
262 }
263 bool queryOwn = (asyncCallbackInfo->uid == IPCSkeleton::GetCallingUid());
264 if (queryOwn) {
265 std::lock_guard<std::mutex> lock(g_ownBundleNameMutex);
266 if (!g_ownBundleName.empty()) {
267 APP_LOGD("query own bundleName, has cache, no need to query from host");
268 asyncCallbackInfo->bundleName = g_ownBundleName;
269 asyncCallbackInfo->err = NO_ERROR;
270 return;
271 }
272 }
273 asyncCallbackInfo->err = InnerGetBundleNameByUid(asyncCallbackInfo->uid, asyncCallbackInfo->bundleName);
274 if ((asyncCallbackInfo->err == NO_ERROR) && queryOwn && g_ownBundleName.empty()) {
275 APP_LOGD("put own bundleName to cache");
276 std::lock_guard<std::mutex> lock(g_ownBundleNameMutex);
277 g_ownBundleName = asyncCallbackInfo->bundleName;
278 }
279 }
280
GetBundleNameByUidComplete(napi_env env,napi_status status,void * data)281 void GetBundleNameByUidComplete(napi_env env, napi_status status, void *data)
282 {
283 GetBundleNameByUidCallbackInfo *asyncCallbackInfo = reinterpret_cast<GetBundleNameByUidCallbackInfo *>(data);
284 if (asyncCallbackInfo == nullptr) {
285 APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
286 return;
287 }
288 std::unique_ptr<GetBundleNameByUidCallbackInfo> callbackPtr {asyncCallbackInfo};
289 napi_value result[2] = {0};
290 if (asyncCallbackInfo->err == NO_ERROR) {
291 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
292 NAPI_CALL_RETURN_VOID(env,
293 napi_create_string_utf8(env, asyncCallbackInfo->bundleName.c_str(), NAPI_AUTO_LENGTH, &result[1]));
294 } else {
295 result[0] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
296 GET_BUNDLE_NAME_BY_UID, BUNDLE_PERMISSIONS);
297 }
298 CommonFunc::NapiReturnDeferred<GetBundleNameByUidCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
299 }
300
GetApplicationInfoComplete(napi_env env,napi_status status,void * data)301 void GetApplicationInfoComplete(napi_env env, napi_status status, void *data)
302 {
303 ApplicationInfoCallbackInfo *asyncCallbackInfo =
304 reinterpret_cast<ApplicationInfoCallbackInfo *>(data);
305 if (asyncCallbackInfo == nullptr) {
306 APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
307 return;
308 }
309 std::unique_ptr<ApplicationInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
310 napi_value result[CALLBACK_PARAM_SIZE] = {0};
311 if (asyncCallbackInfo->err == NO_ERROR) {
312 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
313 NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &result[ARGS_POS_ONE]));
314 CommonFunc::ConvertApplicationInfo(env, result[ARGS_POS_ONE], asyncCallbackInfo->appInfo);
315 } else {
316 result[ARGS_POS_ZERO] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
317 GET_APPLICATION_INFO, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
318 }
319 CommonFunc::NapiReturnDeferred<ApplicationInfoCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
320 }
321
GetApplicationInfosComplete(napi_env env,napi_status status,void * data)322 void GetApplicationInfosComplete(napi_env env, napi_status status, void *data)
323 {
324 ApplicationInfosCallbackInfo *asyncCallbackInfo =
325 reinterpret_cast<ApplicationInfosCallbackInfo *>(data);
326 if (asyncCallbackInfo == nullptr) {
327 APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
328 return;
329 }
330 std::unique_ptr<ApplicationInfosCallbackInfo> callbackPtr {asyncCallbackInfo};
331 napi_value result[CALLBACK_PARAM_SIZE] = {0};
332 if (asyncCallbackInfo->err == NO_ERROR) {
333 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
334 NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &result[ARGS_POS_ONE]));
335 ProcessApplicationInfos(env, result[ARGS_POS_ONE], asyncCallbackInfo->appInfos);
336 } else {
337 result[ARGS_POS_ZERO] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
338 GET_APPLICATION_INFOS, Constants::PERMISSION_GET_INSTALLED_BUNDLE_LIST);
339 }
340 CommonFunc::NapiReturnDeferred<ApplicationInfosCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
341 }
342
GetApplicationInfoExec(napi_env env,void * data)343 void GetApplicationInfoExec(napi_env env, void *data)
344 {
345 ApplicationInfoCallbackInfo *asyncCallbackInfo = reinterpret_cast<ApplicationInfoCallbackInfo *>(data);
346 if (asyncCallbackInfo == nullptr) {
347 APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
348 return;
349 }
350 asyncCallbackInfo->err = InnerGetApplicationInfo(asyncCallbackInfo->bundleName,
351 asyncCallbackInfo->flags, asyncCallbackInfo->userId, asyncCallbackInfo->appInfo);
352 }
353
GetApplicationInfosExec(napi_env env,void * data)354 void GetApplicationInfosExec(napi_env env, void *data)
355 {
356 ApplicationInfosCallbackInfo *asyncCallbackInfo = reinterpret_cast<ApplicationInfosCallbackInfo *>(data);
357 if (asyncCallbackInfo == nullptr) {
358 APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
359 return;
360 }
361 asyncCallbackInfo->err = InnerGetApplicationInfos(asyncCallbackInfo->flags,
362 asyncCallbackInfo->userId, asyncCallbackInfo->appInfos);
363 }
364
GetBundleNameByUid(napi_env env,napi_callback_info info)365 napi_value GetBundleNameByUid(napi_env env, napi_callback_info info)
366 {
367 APP_LOGD("begin to GetBundleNameByUid");
368 NapiArg args(env, info);
369 GetBundleNameByUidCallbackInfo *asyncCallbackInfo = new (std::nothrow) GetBundleNameByUidCallbackInfo(env);
370 if (asyncCallbackInfo == nullptr) {
371 APP_LOGE("asyncCallbackInfo is null");
372 return nullptr;
373 }
374 std::unique_ptr<GetBundleNameByUidCallbackInfo> callbackPtr {asyncCallbackInfo};
375 if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_TWO)) {
376 APP_LOGE("param count invalid.");
377 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
378 return nullptr;
379 }
380 for (size_t i = 0; i < args.GetMaxArgc(); ++i) {
381 napi_valuetype valueType = napi_undefined;
382 napi_typeof(env, args[i], &valueType);
383 if ((i == ARGS_POS_ZERO) && (valueType == napi_number)) {
384 CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->uid);
385 } else if (i == ARGS_POS_ONE) {
386 if (valueType == napi_function) {
387 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
388 }
389 break;
390 } else {
391 APP_LOGE("param check error");
392 std::string errMsg = PARAM_TYPE_CHECK_ERROR_WITH_POS + std::to_string(i + 1);
393 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, errMsg);
394 return nullptr;
395 }
396 }
397 auto promise = CommonFunc::AsyncCallNativeMethod<GetBundleNameByUidCallbackInfo>(
398 env, asyncCallbackInfo, GET_BUNDLE_NAME_BY_UID, GetBundleNameByUidExec, GetBundleNameByUidComplete);
399 callbackPtr.release();
400 APP_LOGD("call GetBundleNameByUid done");
401 return promise;
402 }
403
GetApplicationInfo(napi_env env,napi_callback_info info)404 napi_value GetApplicationInfo(napi_env env, napi_callback_info info)
405 {
406 APP_LOGD("NAPI_GetApplicationInfo called");
407 NapiArg args(env, info);
408 ApplicationInfoCallbackInfo *asyncCallbackInfo = new (std::nothrow) ApplicationInfoCallbackInfo(env);
409 if (asyncCallbackInfo == nullptr) {
410 APP_LOGE("asyncCallbackInfo is null.");
411 return nullptr;
412 }
413 std::unique_ptr<ApplicationInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
414 if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_FOUR)) {
415 APP_LOGE("param count invalid.");
416 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
417 return nullptr;
418 }
419 asyncCallbackInfo->userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
420 if (args.GetMaxArgc() < ARGS_SIZE_TWO) {
421 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
422 return nullptr;
423 }
424 for (size_t i = 0; i < args.GetMaxArgc(); i++) {
425 napi_valuetype valueType = napi_undefined;
426 napi_typeof(env, args[i], &valueType);
427 if (i == ARGS_POS_ZERO) {
428 if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->bundleName)) {
429 APP_LOGE("appId %{public}s invalid!", asyncCallbackInfo->bundleName.c_str());
430 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
431 return nullptr;
432 }
433 } else if (i == ARGS_SIZE_ONE) {
434 if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->flags)) {
435 APP_LOGE("Flags %{public}d invalid!", asyncCallbackInfo->flags);
436 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, APP_FLAGS, TYPE_NUMBER);
437 return nullptr;
438 }
439 } else if (i == ARGS_SIZE_TWO) {
440 if (valueType == napi_function) {
441 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
442 break;
443 }
444 if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->userId)) {
445 APP_LOGW("Parse userId failed, set this parameter to the caller userId!");
446 }
447 } else if (i == ARGS_SIZE_THREE) {
448 if (valueType == napi_function) {
449 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
450 }
451 break;
452 } else {
453 APP_LOGE("param check error");
454 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
455 return nullptr;
456 }
457 }
458 auto promise = CommonFunc::AsyncCallNativeMethod<ApplicationInfoCallbackInfo>(
459 env, asyncCallbackInfo, GET_APPLICATION_INFO, GetApplicationInfoExec, GetApplicationInfoComplete);
460 callbackPtr.release();
461 APP_LOGD("call NAPI_GetApplicationInfo done.");
462 return promise;
463 }
464
GetApplicationInfos(napi_env env,napi_callback_info info)465 napi_value GetApplicationInfos(napi_env env, napi_callback_info info)
466 {
467 APP_LOGD("NAPI_GetApplicationInfos called");
468 NapiArg args(env, info);
469 ApplicationInfosCallbackInfo *asyncCallbackInfo = new (std::nothrow) ApplicationInfosCallbackInfo(env);
470 if (asyncCallbackInfo == nullptr) {
471 APP_LOGE("asyncCallbackInfo is null.");
472 return nullptr;
473 }
474 std::unique_ptr<ApplicationInfosCallbackInfo> callbackPtr {asyncCallbackInfo};
475 if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_THREE)) {
476 APP_LOGE("param count invalid.");
477 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
478 return nullptr;
479 }
480 asyncCallbackInfo->userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
481 if (args.GetMaxArgc() < ARGS_SIZE_ONE) {
482 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
483 return nullptr;
484 }
485 for (size_t i = 0; i < args.GetMaxArgc(); ++i) {
486 napi_valuetype valueType = napi_undefined;
487 napi_typeof(env, args[i], &valueType);
488 if (i == ARGS_POS_ZERO) {
489 if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->flags)) {
490 APP_LOGE("Flags %{public}d invalid!", asyncCallbackInfo->flags);
491 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, APP_FLAGS, TYPE_NUMBER);
492 return nullptr;
493 }
494 } else if (i == ARGS_POS_ONE) {
495 if (valueType == napi_function) {
496 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
497 break;
498 }
499 if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->userId)) {
500 APP_LOGW("Parse userId failed, set this parameter to the caller userId!");
501 }
502 } else if (i == ARGS_POS_TWO) {
503 if (valueType == napi_function) {
504 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
505 }
506 break;
507 } else {
508 APP_LOGE("param check error");
509 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
510 return nullptr;
511 }
512 }
513 auto promise = CommonFunc::AsyncCallNativeMethod<ApplicationInfosCallbackInfo>(
514 env, asyncCallbackInfo, GET_APPLICATION_INFOS, GetApplicationInfosExec, GetApplicationInfosComplete);
515 callbackPtr.release();
516 APP_LOGD("call NAPI_GetApplicationInfos done.");
517 return promise;
518 }
519
InnerQueryAbilityInfos(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos)520 static ErrCode InnerQueryAbilityInfos(const Want &want,
521 int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos)
522 {
523 auto iBundleMgr = CommonFunc::GetBundleMgr();
524 if (iBundleMgr == nullptr) {
525 APP_LOGE("iBundleMgr is null");
526 return ERROR_BUNDLE_SERVICE_EXCEPTION;
527 }
528 ErrCode ret = iBundleMgr->QueryAbilityInfosV9(want, flags, userId, abilityInfos);
529 APP_LOGD("QueryAbilityInfosV9 ErrCode : %{public}d", ret);
530 return CommonFunc::ConvertErrCode(ret);
531 }
532
InnerSetApplicationEnabled(const std::string & bundleName,bool & isEnable)533 static ErrCode InnerSetApplicationEnabled(const std::string &bundleName, bool &isEnable)
534 {
535 auto bundleMgr = CommonFunc::GetBundleMgr();
536 if (bundleMgr == nullptr) {
537 APP_LOGE("CommonFunc::GetBundleMgr failed.");
538 return ERROR_BUNDLE_SERVICE_EXCEPTION;
539 }
540 ErrCode ret = bundleMgr->SetApplicationEnabled(bundleName, isEnable);
541 return CommonFunc::ConvertErrCode(ret);
542 }
543
InnerIsApplicationEnabled(const std::string & bundleName,bool & isEnable)544 static ErrCode InnerIsApplicationEnabled(const std::string &bundleName, bool &isEnable)
545 {
546 auto bundleMgr = CommonFunc::GetBundleMgr();
547 if (bundleMgr == nullptr) {
548 APP_LOGE("CommonFunc::GetBundleMgr failed.");
549 return ERROR_BUNDLE_SERVICE_EXCEPTION;
550 }
551 ErrCode ret = bundleMgr->IsApplicationEnabled(bundleName, isEnable);
552 return CommonFunc::ConvertErrCode(ret);
553 }
554
InnerSetAbilityEnabled(const AbilityInfo & abilityInfo,bool & isEnable)555 static ErrCode InnerSetAbilityEnabled(const AbilityInfo &abilityInfo, bool &isEnable)
556 {
557 auto bundleMgr = CommonFunc::GetBundleMgr();
558 if (bundleMgr == nullptr) {
559 APP_LOGE("CommonFunc::GetBundleMgr failed.");
560 return ERROR_BUNDLE_SERVICE_EXCEPTION;
561 }
562 ErrCode ret = bundleMgr->SetAbilityEnabled(abilityInfo, isEnable);
563 return CommonFunc::ConvertErrCode(ret);
564 }
565
InnerIsAbilityEnabled(const AbilityInfo & abilityInfo,bool & isEnable)566 static ErrCode InnerIsAbilityEnabled(const AbilityInfo &abilityInfo, bool &isEnable)
567 {
568 auto bundleMgr = CommonFunc::GetBundleMgr();
569 if (bundleMgr == nullptr) {
570 APP_LOGE("CommonFunc::GetBundleMgr failed.");
571 return ERROR_BUNDLE_SERVICE_EXCEPTION;
572 }
573 ErrCode ret = bundleMgr->IsAbilityEnabled(abilityInfo, isEnable);
574 return CommonFunc::ConvertErrCode(ret);
575 }
576
InnerGetAbilityLabel(const std::string & bundleName,const std::string & moduleName,const std::string & abilityName,std::string & abilityLabel)577 static ErrCode InnerGetAbilityLabel(const std::string &bundleName, const std::string &moduleName,
578 const std::string &abilityName, std::string &abilityLabel)
579 {
580 auto bundleMgr = CommonFunc::GetBundleMgr();
581 if (bundleMgr == nullptr) {
582 APP_LOGE("CommonFunc::GetBundleMgr failed.");
583 return ERROR_SYSTEM_ABILITY_NOT_FOUND;
584 }
585 ErrCode ret = bundleMgr->GetAbilityLabel(bundleName, moduleName, abilityName, abilityLabel);
586 return CommonFunc::ConvertErrCode(ret);
587 }
588
589 #ifdef BUNDLE_FRAMEWORK_GET_ABILITY_ICON_ENABLED
LoadImageFile(const uint8_t * data,size_t len)590 static std::shared_ptr<Media::PixelMap> LoadImageFile(const uint8_t *data, size_t len)
591 {
592 APP_LOGD("begin LoadImageFile");
593 uint32_t errorCode = 0;
594 Media::SourceOptions opts;
595 std::unique_ptr<Media::ImageSource> imageSource = Media::ImageSource::CreateImageSource(data, len, opts, errorCode);
596 if (errorCode != 0) {
597 APP_LOGE("failed to create image source err is %{public}d", errorCode);
598 return nullptr;
599 }
600
601 Media::DecodeOptions decodeOpts;
602 auto pixelMapPtr = imageSource->CreatePixelMap(decodeOpts, errorCode);
603 if (errorCode != 0) {
604 APP_LOGE("failed to create pixelmap err %{public}d", errorCode);
605 return nullptr;
606 }
607 APP_LOGD("LoadImageFile finish");
608 return std::shared_ptr<Media::PixelMap>(std::move(pixelMapPtr));
609 }
610
InnerGetAbilityIcon(const std::string & bundleName,const std::string & moduleName,const std::string & abilityName,std::shared_ptr<Media::PixelMap> & pixelMap)611 static ErrCode InnerGetAbilityIcon(const std::string &bundleName, const std::string &moduleName,
612 const std::string &abilityName, std::shared_ptr<Media::PixelMap> &pixelMap)
613 {
614 auto bundleMgr = CommonFunc::GetBundleMgr();
615 if (bundleMgr == nullptr) {
616 APP_LOGE("CommonFunc::GetBundleMgr failed.");
617 return ERROR_SYSTEM_ABILITY_NOT_FOUND;
618 }
619 if (bundleName.empty() || moduleName.empty() || abilityName.empty()) {
620 APP_LOGE("GetAbilityIcon check param failed.");
621 return ERROR_PARAM_CHECK_ERROR;
622 }
623 std::unique_ptr<uint8_t[]> mediaDataPtr = nullptr;
624 size_t len = 0;
625 ErrCode ret = bundleMgr->GetMediaData(bundleName, moduleName, abilityName, mediaDataPtr, len);
626 if (ret != ERR_OK) {
627 APP_LOGE("get media data failed");
628 return CommonFunc::ConvertErrCode(ret);
629 }
630 if (mediaDataPtr == nullptr || len == 0) {
631 return ERROR_BUNDLE_SERVICE_EXCEPTION;
632 }
633 auto pixelMapPtr = LoadImageFile(mediaDataPtr.get(), len);
634 if (pixelMapPtr == nullptr) {
635 APP_LOGE("loadImageFile failed");
636 return ERROR_BUNDLE_SERVICE_EXCEPTION;
637 }
638 pixelMap = std::move(pixelMapPtr);
639 return SUCCESS;
640 }
641 #endif
642
CheckAbilityInfoCache(napi_env env,const Query & query,const OHOS::AAFwk::Want & want,std::vector<AbilityInfo> abilityInfos,napi_value jsObject)643 static void CheckAbilityInfoCache(napi_env env, const Query &query,
644 const OHOS::AAFwk::Want &want, std::vector<AbilityInfo> abilityInfos, napi_value jsObject)
645 {
646 ElementName element = want.GetElement();
647 if (element.GetBundleName().empty() || element.GetAbilityName().empty()) {
648 return;
649 }
650
651 uint32_t explicitQueryResultLen = 1;
652 if (abilityInfos.size() != explicitQueryResultLen ||
653 abilityInfos[0].uid != IPCSkeleton::GetCallingUid()) {
654 return;
655 }
656
657 napi_ref cacheAbilityInfo = nullptr;
658 NAPI_CALL_RETURN_VOID(env, napi_create_reference(env, jsObject, NAPI_RETURN_ONE, &cacheAbilityInfo));
659 std::unique_lock<std::shared_mutex> lock(g_cacheMutex);
660 cache[query] = cacheAbilityInfo;
661 }
662
CheckAbilityInfoCache(napi_env env,const Query & query,const AbilityCallbackInfo * info,napi_value jsObject)663 static void CheckAbilityInfoCache(
664 napi_env env, const Query &query, const AbilityCallbackInfo *info, napi_value jsObject)
665 {
666 if (info == nullptr) {
667 return;
668 }
669 CheckAbilityInfoCache(env, query, info->want, info->abilityInfos, jsObject);
670 }
671
QueryAbilityInfosExec(napi_env env,void * data)672 void QueryAbilityInfosExec(napi_env env, void *data)
673 {
674 AbilityCallbackInfo *asyncCallbackInfo = reinterpret_cast<AbilityCallbackInfo *>(data);
675 if (asyncCallbackInfo == nullptr) {
676 APP_LOGE("asyncCallbackInfo is null");
677 return;
678 }
679 {
680 std::shared_lock<std::shared_mutex> lock(g_cacheMutex);
681 auto item = cache.find(Query(asyncCallbackInfo->want.ToString(),
682 QUERY_ABILITY_INFOS, asyncCallbackInfo->flags, asyncCallbackInfo->userId, env));
683 if (item != cache.end()) {
684 asyncCallbackInfo->isSavedInCache = true;
685 APP_LOGD("has cache, no need to query from host.");
686 return;
687 }
688 }
689 asyncCallbackInfo->err = InnerQueryAbilityInfos(asyncCallbackInfo->want, asyncCallbackInfo->flags,
690 asyncCallbackInfo->userId, asyncCallbackInfo->abilityInfos);
691 }
692
QueryAbilityInfosComplete(napi_env env,napi_status status,void * data)693 void QueryAbilityInfosComplete(napi_env env, napi_status status, void *data)
694 {
695 AbilityCallbackInfo *asyncCallbackInfo = reinterpret_cast<AbilityCallbackInfo *>(data);
696 if (asyncCallbackInfo == nullptr) {
697 APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
698 return;
699 }
700 std::unique_ptr<AbilityCallbackInfo> callbackPtr {asyncCallbackInfo};
701 napi_value result[2] = {0};
702 if (asyncCallbackInfo->err == NO_ERROR) {
703 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
704 if (asyncCallbackInfo->isSavedInCache) {
705 std::shared_lock<std::shared_mutex> lock(g_cacheMutex);
706 auto item = cache.find(Query(asyncCallbackInfo->want.ToString(),
707 QUERY_ABILITY_INFOS, asyncCallbackInfo->flags, asyncCallbackInfo->userId, env));
708 if (item == cache.end()) {
709 APP_LOGE("cannot find result in cache in %{public}s", __func__);
710 return;
711 }
712 NAPI_CALL_RETURN_VOID(env, napi_get_reference_value(env, item->second, &result[1]));
713 } else {
714 NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &result[1]));
715 CommonFunc::ConvertAbilityInfos(env, asyncCallbackInfo->abilityInfos, result[1]);
716 Query query(asyncCallbackInfo->want.ToString(),
717 QUERY_ABILITY_INFOS, asyncCallbackInfo->flags, asyncCallbackInfo->userId, env);
718 CheckAbilityInfoCache(env, query, asyncCallbackInfo, result[1]);
719 }
720 } else {
721 result[0] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
722 QUERY_ABILITY_INFOS, BUNDLE_PERMISSIONS);
723 }
724 CommonFunc::NapiReturnDeferred<AbilityCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
725 }
726
QueryAbilityInfos(napi_env env,napi_callback_info info)727 napi_value QueryAbilityInfos(napi_env env, napi_callback_info info)
728 {
729 APP_LOGD("begin to QueryAbilityInfos");
730 NapiArg args(env, info);
731 AbilityCallbackInfo *asyncCallbackInfo = new (std::nothrow) AbilityCallbackInfo(env);
732 if (asyncCallbackInfo == nullptr) {
733 APP_LOGE("asyncCallbackInfo is null");
734 return nullptr;
735 }
736 asyncCallbackInfo->userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
737 std::unique_ptr<AbilityCallbackInfo> callbackPtr {asyncCallbackInfo};
738 if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_FOUR)) {
739 APP_LOGE("param count invalid.");
740 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
741 return nullptr;
742 }
743 for (size_t i = 0; i < args.GetMaxArgc(); ++i) {
744 napi_valuetype valueType = napi_undefined;
745 napi_typeof(env, args[i], &valueType);
746 if ((i == ARGS_POS_ZERO) && (valueType == napi_object)) {
747 if (!CommonFunc::ParseWantPerformance(env, args[i], asyncCallbackInfo->want)) {
748 APP_LOGE("invalid want");
749 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, INVALID_WANT_ERROR);
750 return nullptr;
751 }
752 } else if ((i == ARGS_POS_ONE) && (valueType == napi_number)) {
753 CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->flags);
754 } else if (i == ARGS_POS_TWO) {
755 if (valueType == napi_function) {
756 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
757 break;
758 }
759 if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->userId)) {
760 APP_LOGW("Parse userId failed, set this parameter to the caller userId!");
761 }
762 } else if (i == ARGS_POS_THREE) {
763 if (valueType == napi_function) {
764 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
765 }
766 break;
767 } else {
768 APP_LOGE("param check error");
769 std::string errMsg = PARAM_TYPE_CHECK_ERROR_WITH_POS + std::to_string(i + 1);
770 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, errMsg);
771 return nullptr;
772 }
773 }
774 auto promise = CommonFunc::AsyncCallNativeMethod<AbilityCallbackInfo>(
775 env, asyncCallbackInfo, QUERY_ABILITY_INFOS, QueryAbilityInfosExec, QueryAbilityInfosComplete);
776 callbackPtr.release();
777 APP_LOGD("call QueryAbilityInfos done");
778 return promise;
779 }
780
ParamsProcessQueryAbilityInfosSync(napi_env env,napi_callback_info info,OHOS::AAFwk::Want & want,int32_t & abilityFlags,int32_t & userId)781 ErrCode ParamsProcessQueryAbilityInfosSync(napi_env env, napi_callback_info info,
782 OHOS::AAFwk::Want& want, int32_t& abilityFlags, int32_t& userId)
783 {
784 NapiArg args(env, info);
785 if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_THREE)) {
786 APP_LOGE("param count invalid");
787 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
788 return ERROR_PARAM_CHECK_ERROR;
789 }
790 for (size_t i = 0; i < args.GetMaxArgc(); ++i) {
791 napi_valuetype valueType = napi_undefined;
792 napi_typeof(env, args[i], &valueType);
793 if (i == ARGS_POS_ZERO) {
794 if (!CommonFunc::ParseWantPerformance(env, args[i], want)) {
795 APP_LOGE("invalid want");
796 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, INVALID_WANT_ERROR);
797 return ERROR_PARAM_CHECK_ERROR;
798 }
799 } else if (i == ARGS_POS_ONE) {
800 if (!CommonFunc::ParseInt(env, args[i], abilityFlags)) {
801 APP_LOGE("abilityFlags %{public}d invalid!", abilityFlags);
802 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, ABILITY_FLAGS, TYPE_NUMBER);
803 }
804 } else if (i == ARGS_POS_TWO) {
805 if (!CommonFunc::ParseInt(env, args[i], userId)) {
806 APP_LOGW("Parse userId failed, set this parameter to the caller userId!");
807 }
808 } else {
809 APP_LOGE("parameter is invalid");
810 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
811 return ERROR_PARAM_CHECK_ERROR;
812 }
813 }
814 if (userId == Constants::UNSPECIFIED_USERID) {
815 userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
816 }
817 return ERR_OK;
818 }
819
QueryAbilityInfosSync(napi_env env,napi_callback_info info)820 napi_value QueryAbilityInfosSync(napi_env env, napi_callback_info info)
821 {
822 APP_LOGD("NAPI QueryAbilityInfosSync call");
823 OHOS::AAFwk::Want want;
824 int32_t abilityFlags = 0;
825 int32_t userId = Constants::UNSPECIFIED_USERID;
826 if (ParamsProcessQueryAbilityInfosSync(env, info, want, abilityFlags, userId) != ERR_OK) {
827 APP_LOGE("paramsProcess is invalid");
828 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
829 return nullptr;
830 }
831 napi_value nAbilityInfos = nullptr;
832 {
833 std::shared_lock<std::shared_mutex> lock(g_cacheMutex);
834 auto item = cache.find(Query(want.ToString(),
835 QUERY_ABILITY_INFOS_SYNC, abilityFlags, userId, env));
836 if (item != cache.end()) {
837 APP_LOGD("QueryAbilityInfosSync param from cache");
838 NAPI_CALL(env,
839 napi_get_reference_value(env, item->second, &nAbilityInfos));
840 return nAbilityInfos;
841 }
842 }
843 auto iBundleMgr = CommonFunc::GetBundleMgr();
844 if (iBundleMgr == nullptr) {
845 APP_LOGE("can not get iBundleMgr");
846 BusinessError::ThrowError(env, ERROR_BUNDLE_SERVICE_EXCEPTION, ERR_MSG_BUNDLE_SERVICE_EXCEPTION);
847 return nullptr;
848 }
849 std::vector<AbilityInfo> abilityInfos;
850 ErrCode ret = CommonFunc::ConvertErrCode(
851 iBundleMgr->QueryAbilityInfosV9(want, abilityFlags, userId, abilityInfos));
852 if (ret != NO_ERROR) {
853 APP_LOGE("QueryAbilityInfosV9 failed");
854 napi_value businessError = BusinessError::CreateCommonError(
855 env, ret, QUERY_ABILITY_INFOS_SYNC, BUNDLE_PERMISSIONS);
856 napi_throw(env, businessError);
857 return nullptr;
858 }
859 NAPI_CALL(env, napi_create_array(env, &nAbilityInfos));
860 CommonFunc::ConvertAbilityInfos(env, abilityInfos, nAbilityInfos);
861 Query query(want.ToString(),
862 QUERY_ABILITY_INFOS_SYNC, abilityFlags, userId, env);
863 CheckAbilityInfoCache(env, query, want, abilityInfos, nAbilityInfos);
864 APP_LOGD("call QueryAbilityInfosSync done");
865 return nAbilityInfos;
866 }
867
InnerQueryExtensionInfos(ExtensionCallbackInfo * info)868 static ErrCode InnerQueryExtensionInfos(ExtensionCallbackInfo *info)
869 {
870 if (info == nullptr) {
871 APP_LOGE("ExtensionCallbackInfo is null");
872 return ERROR_BUNDLE_SERVICE_EXCEPTION;
873 }
874 auto iBundleMgr = CommonFunc::GetBundleMgr();
875 if (iBundleMgr == nullptr) {
876 APP_LOGE("iBundleMgr is null");
877 return ERROR_BUNDLE_SERVICE_EXCEPTION;
878 }
879 ErrCode ret = ERR_OK;
880 if (info->extensionAbilityType == static_cast<int32_t>(ExtensionAbilityType::UNSPECIFIED)) {
881 APP_LOGD("query extensionAbilityInfo without type");
882 ret = iBundleMgr->QueryExtensionAbilityInfosV9(info->want, info->flags, info->userId, info->extensionInfos);
883 } else {
884 ExtensionAbilityType type = static_cast<ExtensionAbilityType>(info->extensionAbilityType);
885 APP_LOGD("query extensionAbilityInfo with type %{public}d", info->extensionAbilityType);
886 ret = iBundleMgr->QueryExtensionAbilityInfosV9(
887 info->want, type, info->flags, info->userId, info->extensionInfos);
888 }
889 APP_LOGD("QueryExtensionAbilityInfosV9 ErrCode : %{public}d", ret);
890 return CommonFunc::ConvertErrCode(ret);
891 }
892
HandleExtensionCache(napi_env env,const Query & query,const ExtensionCallbackInfo * info,napi_value jsObject)893 static void HandleExtensionCache(
894 napi_env env, const Query &query, const ExtensionCallbackInfo *info, napi_value jsObject)
895 {
896 if (info == nullptr) {
897 return;
898 }
899
900 ElementName element = info->want.GetElement();
901 if (element.GetBundleName().empty() || element.GetAbilityName().empty()) {
902 return;
903 }
904
905 uint32_t explicitQueryResultLen = 1;
906 if (info->extensionInfos.size() != explicitQueryResultLen ||
907 info->extensionInfos[0].uid != IPCSkeleton::GetCallingUid()) {
908 return;
909 }
910
911 napi_ref cacheExtensionInfo = nullptr;
912 NAPI_CALL_RETURN_VOID(env, napi_create_reference(env, jsObject, NAPI_RETURN_ONE, &cacheExtensionInfo));
913 std::unique_lock<std::shared_mutex> lock(g_cacheMutex);
914 cache[query] = cacheExtensionInfo;
915 }
916
QueryExtensionInfosExec(napi_env env,void * data)917 void QueryExtensionInfosExec(napi_env env, void *data)
918 {
919 ExtensionCallbackInfo *asyncCallbackInfo = reinterpret_cast<ExtensionCallbackInfo *>(data);
920 if (asyncCallbackInfo == nullptr) {
921 APP_LOGE("asyncCallbackInfo is null");
922 return;
923 }
924 {
925 std::shared_lock<std::shared_mutex> lock(g_cacheMutex);
926 std::string key = asyncCallbackInfo->want.ToString() + std::to_string(asyncCallbackInfo->extensionAbilityType);
927 auto item = cache.find(
928 Query(key, QUERY_EXTENSION_INFOS, asyncCallbackInfo->flags, asyncCallbackInfo->userId, env));
929 if (item != cache.end()) {
930 asyncCallbackInfo->isSavedInCache = true;
931 APP_LOGD("extension has cache, no need to query from host.");
932 return;
933 }
934 }
935 asyncCallbackInfo->err = InnerQueryExtensionInfos(asyncCallbackInfo);
936 }
937
QueryExtensionInfosComplete(napi_env env,napi_status status,void * data)938 void QueryExtensionInfosComplete(napi_env env, napi_status status, void *data)
939 {
940 ExtensionCallbackInfo *asyncCallbackInfo = reinterpret_cast<ExtensionCallbackInfo *>(data);
941 if (asyncCallbackInfo == nullptr) {
942 APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
943 return;
944 }
945 std::unique_ptr<ExtensionCallbackInfo> callbackPtr {asyncCallbackInfo};
946 napi_value result[2] = {0};
947 if (asyncCallbackInfo->err == NO_ERROR) {
948 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
949 NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &result[1]));
950 std::string key = asyncCallbackInfo->want.ToString() + std::to_string(asyncCallbackInfo->extensionAbilityType);
951 Query query(key, QUERY_EXTENSION_INFOS, asyncCallbackInfo->flags, asyncCallbackInfo->userId, env);
952 if (asyncCallbackInfo->isSavedInCache) {
953 // get from cache
954 std::shared_lock<std::shared_mutex> lock(g_cacheMutex);
955 auto item = cache.find(query);
956 if (item != cache.end()) {
957 NAPI_CALL_RETURN_VOID(env, napi_get_reference_value(env, item->second, &result[1]));
958 } else {
959 APP_LOGE("extension not in cache");
960 asyncCallbackInfo->isSavedInCache = false;
961 }
962 } else {
963 CommonFunc::ConvertExtensionInfos(env, asyncCallbackInfo->extensionInfos, result[1]);
964 // optionally save to cache
965 HandleExtensionCache(env, query, asyncCallbackInfo, result[1]);
966 }
967 } else {
968 result[0] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
969 QUERY_EXTENSION_INFOS, BUNDLE_PERMISSIONS);
970 }
971 CommonFunc::NapiReturnDeferred<ExtensionCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
972 }
973
QueryExtensionInfos(napi_env env,napi_callback_info info)974 napi_value QueryExtensionInfos(napi_env env, napi_callback_info info)
975 {
976 APP_LOGD("begin to QueryExtensionInfos");
977 NapiArg args(env, info);
978 ExtensionCallbackInfo *asyncCallbackInfo = new (std::nothrow) ExtensionCallbackInfo(env);
979 if (asyncCallbackInfo == nullptr) {
980 APP_LOGE("asyncCallbackInfo is null");
981 return nullptr;
982 }
983 asyncCallbackInfo->userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
984 std::unique_ptr<ExtensionCallbackInfo> callbackPtr {asyncCallbackInfo};
985 if (!args.Init(ARGS_SIZE_THREE, ARGS_SIZE_FIVE)) {
986 APP_LOGE("param count invalid");
987 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
988 return nullptr;
989 }
990 for (size_t i = 0; i < args.GetMaxArgc(); ++i) {
991 napi_valuetype valueType = napi_undefined;
992 napi_typeof(env, args[i], &valueType);
993 if ((i == ARGS_POS_ZERO) && (valueType == napi_object)) {
994 if (!CommonFunc::ParseWant(env, args[i], asyncCallbackInfo->want)) {
995 APP_LOGE("invalid want");
996 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, INVALID_WANT_ERROR);
997 return nullptr;
998 }
999 } else if ((i == ARGS_POS_ONE) && (valueType == napi_number)) {
1000 CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->extensionAbilityType);
1001 } else if ((i == ARGS_POS_TWO) && (valueType == napi_number)) {
1002 CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->flags);
1003 } else if (i == ARGS_POS_THREE) {
1004 if (valueType == napi_function) {
1005 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
1006 break;
1007 }
1008 if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->userId)) {
1009 APP_LOGW("Parse userId failed, set this parameter to the caller userId!");
1010 }
1011 } else if (i == ARGS_POS_FOUR) {
1012 if (valueType == napi_function) {
1013 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
1014 }
1015 break;
1016 } else {
1017 APP_LOGE("param check error");
1018 std::string errMsg = PARAM_TYPE_CHECK_ERROR_WITH_POS + std::to_string(i + 1);
1019 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, errMsg);
1020 return nullptr;
1021 }
1022 }
1023 auto promise = CommonFunc::AsyncCallNativeMethod<ExtensionCallbackInfo>(
1024 env, asyncCallbackInfo, QUERY_EXTENSION_INFOS, QueryExtensionInfosExec, QueryExtensionInfosComplete);
1025 callbackPtr.release();
1026 APP_LOGD("call QueryExtensionInfos done");
1027 return promise;
1028 }
1029
CreateAbilityFlagObject(napi_env env,napi_value value)1030 void CreateAbilityFlagObject(napi_env env, napi_value value)
1031 {
1032 napi_value nGetAbilityInfoDefault;
1033 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
1034 GetAbilityInfoFlag::GET_ABILITY_INFO_DEFAULT), &nGetAbilityInfoDefault));
1035 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_ABILITY_INFO_DEFAULT",
1036 nGetAbilityInfoDefault));
1037
1038 napi_value nGetAbilityInfoWithPermission;
1039 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
1040 GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_PERMISSION), &nGetAbilityInfoWithPermission));
1041 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_ABILITY_INFO_WITH_PERMISSION",
1042 nGetAbilityInfoWithPermission));
1043
1044 napi_value nGetAbilityInfoWithApplication;
1045 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
1046 GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_APPLICATION), &nGetAbilityInfoWithApplication));
1047 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_ABILITY_INFO_WITH_APPLICATION",
1048 nGetAbilityInfoWithApplication));
1049
1050 napi_value nGetAbilityInfoWithMetadata;
1051 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
1052 GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_METADATA), &nGetAbilityInfoWithMetadata));
1053 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_ABILITY_INFO_WITH_METADATA",
1054 nGetAbilityInfoWithMetadata));
1055
1056 napi_value nGetAbilityInfoWithDisabled;
1057 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
1058 GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_DISABLE), &nGetAbilityInfoWithDisabled));
1059 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_ABILITY_INFO_WITH_DISABLE",
1060 nGetAbilityInfoWithDisabled));
1061
1062 napi_value nGetAbilityInfOnlySystemApp;
1063 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
1064 GetAbilityInfoFlag::GET_ABILITY_INFO_ONLY_SYSTEM_APP), &nGetAbilityInfOnlySystemApp));
1065 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_ABILITY_INFO_ONLY_SYSTEM_APP",
1066 nGetAbilityInfOnlySystemApp));
1067 }
1068
GetAbilityLabelExec(napi_env env,void * data)1069 void GetAbilityLabelExec(napi_env env, void *data)
1070 {
1071 AbilityLabelCallbackInfo *asyncCallbackInfo = reinterpret_cast<AbilityLabelCallbackInfo *>(data);
1072 if (asyncCallbackInfo == nullptr) {
1073 APP_LOGE("%{public}s, asyncCallbackInfo == nullptr.", __func__);
1074 return;
1075 }
1076 asyncCallbackInfo->err = InnerGetAbilityLabel(asyncCallbackInfo->bundleName,
1077 asyncCallbackInfo->moduleName, asyncCallbackInfo->abilityName, asyncCallbackInfo->abilityLabel);
1078 }
1079
GetAbilityLabelComplete(napi_env env,napi_status status,void * data)1080 void GetAbilityLabelComplete(napi_env env, napi_status status, void *data)
1081 {
1082 AbilityLabelCallbackInfo *asyncCallbackInfo = reinterpret_cast<AbilityLabelCallbackInfo *>(data);
1083 if (asyncCallbackInfo == nullptr) {
1084 APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
1085 return;
1086 }
1087 std::unique_ptr<AbilityLabelCallbackInfo> callbackPtr {asyncCallbackInfo};
1088 napi_value result[2] = {0};
1089 if (asyncCallbackInfo->err == NO_ERROR) {
1090 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
1091 NAPI_CALL_RETURN_VOID(env, napi_create_string_utf8(env, asyncCallbackInfo->abilityLabel.c_str(),
1092 NAPI_AUTO_LENGTH, &result[1]));
1093 } else {
1094 APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
1095 result[0] = BusinessError::CreateCommonError(
1096 env, asyncCallbackInfo->err, "GetAbilityLabel", Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
1097 }
1098 CommonFunc::NapiReturnDeferred<AbilityLabelCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
1099 }
1100
GetAbilityLabel(napi_env env,napi_callback_info info)1101 napi_value GetAbilityLabel(napi_env env, napi_callback_info info)
1102 {
1103 APP_LOGD("begin to GetAbilityLabel");
1104 #ifdef GLOBAL_RESMGR_ENABLE
1105 NapiArg args(env, info);
1106 AbilityLabelCallbackInfo *asyncCallbackInfo = new (std::nothrow) AbilityLabelCallbackInfo(env);
1107 if (asyncCallbackInfo == nullptr) {
1108 APP_LOGE("asyncCallbackInfo is null.");
1109 return nullptr;
1110 }
1111 std::unique_ptr<AbilityLabelCallbackInfo> callbackPtr {asyncCallbackInfo};
1112 if (!args.Init(ARGS_SIZE_THREE, ARGS_SIZE_FOUR)) {
1113 APP_LOGE("Napi func init failed");
1114 return nullptr;
1115 }
1116 if (args.GetMaxArgc() >= ARGS_SIZE_THREE) {
1117 if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], asyncCallbackInfo->bundleName)) {
1118 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
1119 return nullptr;
1120 }
1121 if (!CommonFunc::ParseString(env, args[ARGS_POS_ONE], asyncCallbackInfo->moduleName)) {
1122 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, MODULE_NAME, TYPE_STRING);
1123 return nullptr;
1124 }
1125 if (!CommonFunc::ParseString(env, args[ARGS_POS_TWO], asyncCallbackInfo->abilityName)) {
1126 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, ABILITY_NAME, TYPE_STRING);
1127 return nullptr;
1128 }
1129 if (args.GetMaxArgc() == ARGS_SIZE_FOUR) {
1130 napi_valuetype valueType = napi_undefined;
1131 napi_typeof(env, args[ARGS_POS_THREE], &valueType);
1132 if (valueType == napi_function) {
1133 NAPI_CALL(env, napi_create_reference(env, args[ARGS_POS_THREE],
1134 NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
1135 }
1136 }
1137 } else {
1138 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1139 return nullptr;
1140 }
1141 auto promise = CommonFunc::AsyncCallNativeMethod<AbilityLabelCallbackInfo>(
1142 env, asyncCallbackInfo, "GetAbilityLabel", GetAbilityLabelExec, GetAbilityLabelComplete);
1143 callbackPtr.release();
1144 APP_LOGD("call GetAbilityLabel done.");
1145 return promise;
1146 #else
1147 APP_LOGE("SystemCapability.BundleManager.BundleFramework.Resource not supported.");
1148 napi_value error = BusinessError::CreateCommonError(env, ERROR_SYSTEM_ABILITY_NOT_FOUND, "getAbilityLabel");
1149 napi_throw(env, error);
1150 return nullptr;
1151 #endif
1152 }
1153
1154 #ifdef BUNDLE_FRAMEWORK_GET_ABILITY_ICON_ENABLED
GetAbilityIconExec(napi_env env,void * data)1155 void GetAbilityIconExec(napi_env env, void *data)
1156 {
1157 AbilityIconCallbackInfo *asyncCallbackInfo = reinterpret_cast<AbilityIconCallbackInfo *>(data);
1158 if (asyncCallbackInfo == nullptr) {
1159 APP_LOGE("%{public}s, asyncCallbackInfo == nullptr.", __func__);
1160 return;
1161 }
1162 asyncCallbackInfo->err = InnerGetAbilityIcon(asyncCallbackInfo->bundleName,
1163 asyncCallbackInfo->moduleName, asyncCallbackInfo->abilityName, asyncCallbackInfo->pixelMap);
1164 }
1165
GetAbilityIconComplete(napi_env env,napi_status status,void * data)1166 void GetAbilityIconComplete(napi_env env, napi_status status, void *data)
1167 {
1168 AbilityIconCallbackInfo *asyncCallbackInfo = reinterpret_cast<AbilityIconCallbackInfo *>(data);
1169 if (asyncCallbackInfo == nullptr) {
1170 APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
1171 return;
1172 }
1173 std::unique_ptr<AbilityIconCallbackInfo> callbackPtr {asyncCallbackInfo};
1174 napi_value result[2] = {0};
1175 if (asyncCallbackInfo->err == NO_ERROR) {
1176 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
1177 result[1] = Media::PixelMapNapi::CreatePixelMap(env, asyncCallbackInfo->pixelMap);
1178 } else {
1179 APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
1180 result[0] = BusinessError::CreateCommonError(
1181 env, asyncCallbackInfo->err, "GetAbilityIcon", Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
1182 }
1183 CommonFunc::NapiReturnDeferred<AbilityIconCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
1184 }
1185 #endif
1186
GetAbilityIcon(napi_env env,napi_callback_info info)1187 napi_value GetAbilityIcon(napi_env env, napi_callback_info info)
1188 {
1189 APP_LOGD("begin to GetAbilityIcon");
1190 #ifdef BUNDLE_FRAMEWORK_GET_ABILITY_ICON_ENABLED
1191 NapiArg args(env, info);
1192 AbilityIconCallbackInfo *asyncCallbackInfo = new (std::nothrow) AbilityIconCallbackInfo(env);
1193 if (asyncCallbackInfo == nullptr) {
1194 APP_LOGE("asyncCallbackInfo is null.");
1195 return nullptr;
1196 }
1197 std::unique_ptr<AbilityIconCallbackInfo> callbackPtr {asyncCallbackInfo};
1198 if (!args.Init(ARGS_SIZE_THREE, ARGS_SIZE_FOUR)) {
1199 APP_LOGE("Napi func init failed");
1200 return nullptr;
1201 }
1202
1203 if (args.GetMaxArgc() >= ARGS_SIZE_THREE) {
1204 if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], asyncCallbackInfo->bundleName)) {
1205 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
1206 return nullptr;
1207 }
1208 if (!CommonFunc::ParseString(env, args[ARGS_POS_ONE], asyncCallbackInfo->moduleName)) {
1209 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, MODULE_NAME, TYPE_STRING);
1210 return nullptr;
1211 }
1212 if (!CommonFunc::ParseString(env, args[ARGS_POS_TWO], asyncCallbackInfo->abilityName)) {
1213 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, ABILITY_NAME, TYPE_STRING);
1214 return nullptr;
1215 }
1216 if (args.GetMaxArgc() == ARGS_SIZE_FOUR) {
1217 napi_valuetype valueType = napi_undefined;
1218 napi_typeof(env, args[ARGS_POS_THREE], &valueType);
1219 if (valueType == napi_function) {
1220 NAPI_CALL(env, napi_create_reference(env, args[ARGS_POS_THREE],
1221 NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
1222 }
1223 }
1224 } else {
1225 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1226 return nullptr;
1227 }
1228 auto promise = CommonFunc::AsyncCallNativeMethod<AbilityIconCallbackInfo>(
1229 env, asyncCallbackInfo, "GetAbilityIcon", GetAbilityIconExec, GetAbilityIconComplete);
1230 callbackPtr.release();
1231 APP_LOGD("call GetAbilityIcon done.");
1232 return promise;
1233 #else
1234 APP_LOGE("SystemCapability.BundleManager.BundleFramework.Resource not supported.");
1235 napi_value error = BusinessError::CreateCommonError(env, ERROR_SYSTEM_ABILITY_NOT_FOUND, "getAbilityIcon");
1236 napi_throw(env, error);
1237 return nullptr;
1238 #endif
1239 }
1240
SetApplicationEnabledExec(napi_env env,void * data)1241 void SetApplicationEnabledExec(napi_env env, void *data)
1242 {
1243 ApplicationEnableCallbackInfo *asyncCallbackInfo = reinterpret_cast<ApplicationEnableCallbackInfo *>(data);
1244 if (asyncCallbackInfo == nullptr) {
1245 APP_LOGE("%{public}s, asyncCallbackInfo == nullptr.", __func__);
1246 return;
1247 }
1248 asyncCallbackInfo->err = InnerSetApplicationEnabled(asyncCallbackInfo->bundleName,
1249 asyncCallbackInfo->isEnable);
1250 }
1251
SetApplicationEnabledComplete(napi_env env,napi_status status,void * data)1252 void SetApplicationEnabledComplete(napi_env env, napi_status status, void *data)
1253 {
1254 ApplicationEnableCallbackInfo *asyncCallbackInfo = reinterpret_cast<ApplicationEnableCallbackInfo *>(data);
1255 if (asyncCallbackInfo == nullptr) {
1256 APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
1257 return;
1258 }
1259 std::unique_ptr<ApplicationEnableCallbackInfo> callbackPtr {asyncCallbackInfo};
1260 napi_value result[1] = {0};
1261 if (asyncCallbackInfo->err == NO_ERROR) {
1262 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
1263 } else {
1264 APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
1265 result[0] = BusinessError::CreateCommonError(
1266 env, asyncCallbackInfo->err, "SetApplicationEnabled", Constants::PERMISSION_CHANGE_ABILITY_ENABLED_STATE);
1267 }
1268 CommonFunc::NapiReturnDeferred<ApplicationEnableCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_ONE);
1269 }
1270
SetApplicationEnabled(napi_env env,napi_callback_info info)1271 napi_value SetApplicationEnabled(napi_env env, napi_callback_info info)
1272 {
1273 APP_LOGD("begin to SetApplicationEnabled");
1274 NapiArg args(env, info);
1275 ApplicationEnableCallbackInfo *asyncCallbackInfo = new (std::nothrow) ApplicationEnableCallbackInfo(env);
1276 if (asyncCallbackInfo == nullptr) {
1277 APP_LOGE("asyncCallbackInfo is null.");
1278 return nullptr;
1279 }
1280 std::unique_ptr<ApplicationEnableCallbackInfo> callbackPtr {asyncCallbackInfo};
1281 if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_THREE)) {
1282 APP_LOGE("Napi func init failed");
1283 return nullptr;
1284 }
1285 if (args.GetMaxArgc() >= ARGS_SIZE_TWO) {
1286 if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], asyncCallbackInfo->bundleName)) {
1287 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
1288 return nullptr;
1289 }
1290 if (!CommonFunc::ParseBool(env, args[ARGS_POS_ONE], asyncCallbackInfo->isEnable)) {
1291 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, IS_ENABLE, TYPE_BOOLEAN);
1292 return nullptr;
1293 }
1294 if (args.GetMaxArgc() == ARGS_SIZE_THREE) {
1295 napi_valuetype valueType = napi_undefined;
1296 napi_typeof(env, args[ARGS_POS_TWO], &valueType);
1297 if (valueType == napi_function) {
1298 NAPI_CALL(env, napi_create_reference(env, args[ARGS_POS_TWO],
1299 NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
1300 }
1301 }
1302 } else {
1303 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1304 return nullptr;
1305 }
1306 auto promise = CommonFunc::AsyncCallNativeMethod<ApplicationEnableCallbackInfo>(
1307 env, asyncCallbackInfo, "SetApplicationEnabled", SetApplicationEnabledExec, SetApplicationEnabledComplete);
1308 callbackPtr.release();
1309 APP_LOGD("call SetApplicationEnabled done.");
1310 return promise;
1311 }
1312
SetAbilityEnabledExec(napi_env env,void * data)1313 void SetAbilityEnabledExec(napi_env env, void *data)
1314 {
1315 AbilityEnableCallbackInfo *asyncCallbackInfo = reinterpret_cast<AbilityEnableCallbackInfo *>(data);
1316 if (asyncCallbackInfo == nullptr) {
1317 APP_LOGE("%{public}s, asyncCallbackInfo == nullptr.", __func__);
1318 return;
1319 }
1320 asyncCallbackInfo->err = InnerSetAbilityEnabled(asyncCallbackInfo->abilityInfo,
1321 asyncCallbackInfo->isEnable);
1322 }
1323
SetAbilityEnabledComplete(napi_env env,napi_status status,void * data)1324 void SetAbilityEnabledComplete(napi_env env, napi_status status, void *data)
1325 {
1326 AbilityEnableCallbackInfo *asyncCallbackInfo = reinterpret_cast<AbilityEnableCallbackInfo *>(data);
1327 if (asyncCallbackInfo == nullptr) {
1328 APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
1329 return;
1330 }
1331 std::unique_ptr<AbilityEnableCallbackInfo> callbackPtr {asyncCallbackInfo};
1332 napi_value result[1] = {0};
1333 if (asyncCallbackInfo->err == NO_ERROR) {
1334 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
1335 } else {
1336 APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
1337 result[0] = BusinessError::CreateCommonError(
1338 env, asyncCallbackInfo->err, "SetAbilityEnabled", Constants::PERMISSION_CHANGE_ABILITY_ENABLED_STATE);
1339 }
1340 CommonFunc::NapiReturnDeferred<AbilityEnableCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_ONE);
1341 }
1342
SetAbilityEnabled(napi_env env,napi_callback_info info)1343 napi_value SetAbilityEnabled(napi_env env, napi_callback_info info)
1344 {
1345 APP_LOGD("begin to SetAbilityEnabled");
1346 NapiArg args(env, info);
1347 AbilityEnableCallbackInfo *asyncCallbackInfo = new (std::nothrow) AbilityEnableCallbackInfo(env);
1348 if (asyncCallbackInfo == nullptr) {
1349 APP_LOGE("asyncCallbackInfo is null.");
1350 return nullptr;
1351 }
1352 std::unique_ptr<AbilityEnableCallbackInfo> callbackPtr {asyncCallbackInfo};
1353 if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_THREE)) {
1354 APP_LOGE("Napi func init failed");
1355 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1356 return nullptr;
1357 }
1358 if (args.GetMaxArgc() >= ARGS_SIZE_TWO) {
1359 if (!CommonFunc::ParseAbilityInfo(env, args[ARGS_POS_ZERO], asyncCallbackInfo->abilityInfo)) {
1360 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, ABILITY_INFO, TYPE_OBJECT);
1361 return nullptr;
1362 }
1363 if (!CommonFunc::ParseBool(env, args[ARGS_POS_ONE], asyncCallbackInfo->isEnable)) {
1364 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, IS_ENABLE, TYPE_BOOLEAN);
1365 return nullptr;
1366 }
1367 if (args.GetMaxArgc() == ARGS_SIZE_THREE) {
1368 napi_valuetype valueType = napi_undefined;
1369 napi_typeof(env, args[ARGS_POS_TWO], &valueType);
1370 if (valueType == napi_function) {
1371 NAPI_CALL(env, napi_create_reference(env, args[ARGS_POS_TWO],
1372 NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
1373 }
1374 }
1375 } else {
1376 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1377 return nullptr;
1378 }
1379 auto promise = CommonFunc::AsyncCallNativeMethod<AbilityEnableCallbackInfo>(
1380 env, asyncCallbackInfo, "SetAbilityEnabled", SetAbilityEnabledExec, SetAbilityEnabledComplete);
1381 callbackPtr.release();
1382 APP_LOGD("call SetAbilityEnabled done.");
1383 return promise;
1384 }
1385
IsApplicationEnabledExec(napi_env env,void * data)1386 void IsApplicationEnabledExec(napi_env env, void *data)
1387 {
1388 ApplicationEnableCallbackInfo *asyncCallbackInfo = reinterpret_cast<ApplicationEnableCallbackInfo *>(data);
1389 if (asyncCallbackInfo == nullptr) {
1390 APP_LOGE("%{public}s, asyncCallbackInfo == nullptr.", __func__);
1391 return;
1392 }
1393 asyncCallbackInfo->err = InnerIsApplicationEnabled(asyncCallbackInfo->bundleName,
1394 asyncCallbackInfo->isEnable);
1395 }
1396
IsApplicationEnabledComplete(napi_env env,napi_status status,void * data)1397 void IsApplicationEnabledComplete(napi_env env, napi_status status, void *data)
1398 {
1399 ApplicationEnableCallbackInfo *asyncCallbackInfo = reinterpret_cast<ApplicationEnableCallbackInfo *>(data);
1400 if (asyncCallbackInfo == nullptr) {
1401 APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
1402 return;
1403 }
1404 std::unique_ptr<ApplicationEnableCallbackInfo> callbackPtr {asyncCallbackInfo};
1405 napi_value result[ARGS_POS_TWO] = {0};
1406 if (asyncCallbackInfo->err == NO_ERROR) {
1407 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
1408 NAPI_CALL_RETURN_VOID(env, napi_get_boolean(env, asyncCallbackInfo->isEnable, &result[ARGS_POS_ONE]));
1409 } else {
1410 APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
1411 result[0] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err, "", "");
1412 }
1413 CommonFunc::NapiReturnDeferred<ApplicationEnableCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
1414 }
1415
IsApplicationEnabled(napi_env env,napi_callback_info info)1416 napi_value IsApplicationEnabled(napi_env env, napi_callback_info info)
1417 {
1418 APP_LOGD("begin to IsApplicationEnabled");
1419 NapiArg args(env, info);
1420 ApplicationEnableCallbackInfo *asyncCallbackInfo = new (std::nothrow) ApplicationEnableCallbackInfo(env);
1421 if (asyncCallbackInfo == nullptr) {
1422 APP_LOGE("asyncCallbackInfo is null.");
1423 return nullptr;
1424 }
1425 std::unique_ptr<ApplicationEnableCallbackInfo> callbackPtr {asyncCallbackInfo};
1426 if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_TWO)) {
1427 APP_LOGE("Napi func init failed");
1428 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1429 return nullptr;
1430 }
1431 if (args.GetMaxArgc() >= ARGS_SIZE_ONE) {
1432 if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], asyncCallbackInfo->bundleName)) {
1433 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
1434 return nullptr;
1435 }
1436 if (args.GetMaxArgc() == ARGS_POS_TWO) {
1437 napi_valuetype valueType = napi_undefined;
1438 napi_typeof(env, args[ARGS_POS_ONE], &valueType);
1439 if (valueType == napi_function) {
1440 NAPI_CALL(env, napi_create_reference(env, args[ARGS_POS_ONE],
1441 NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
1442 }
1443 }
1444 } else {
1445 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1446 return nullptr;
1447 }
1448 auto promise = CommonFunc::AsyncCallNativeMethod<ApplicationEnableCallbackInfo>(
1449 env, asyncCallbackInfo, "IsSetApplicationEnabled", IsApplicationEnabledExec, IsApplicationEnabledComplete);
1450 callbackPtr.release();
1451 APP_LOGD("call IsSetApplicationEnabled done.");
1452 return promise;
1453 }
1454
IsAbilityEnabledExec(napi_env env,void * data)1455 void IsAbilityEnabledExec(napi_env env, void *data)
1456 {
1457 AbilityEnableCallbackInfo *asyncCallbackInfo = reinterpret_cast<AbilityEnableCallbackInfo *>(data);
1458 if (asyncCallbackInfo == nullptr) {
1459 APP_LOGE("%{public}s, asyncCallbackInfo == nullptr.", __func__);
1460 return;
1461 }
1462 asyncCallbackInfo->err = InnerIsAbilityEnabled(asyncCallbackInfo->abilityInfo,
1463 asyncCallbackInfo->isEnable);
1464 }
1465
IsAbilityEnabledComplete(napi_env env,napi_status status,void * data)1466 void IsAbilityEnabledComplete(napi_env env, napi_status status, void *data)
1467 {
1468 AbilityEnableCallbackInfo *asyncCallbackInfo = reinterpret_cast<AbilityEnableCallbackInfo *>(data);
1469 if (asyncCallbackInfo == nullptr) {
1470 APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
1471 return;
1472 }
1473 std::unique_ptr<AbilityEnableCallbackInfo> callbackPtr {asyncCallbackInfo};
1474 napi_value result[ARGS_POS_TWO] = {0};
1475 if (asyncCallbackInfo->err == NO_ERROR) {
1476 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
1477 NAPI_CALL_RETURN_VOID(env, napi_get_boolean(env, asyncCallbackInfo->isEnable, &result[ARGS_POS_ONE]));
1478 } else {
1479 APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
1480 result[0] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err, "", "");
1481 }
1482 CommonFunc::NapiReturnDeferred<AbilityEnableCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
1483 }
1484
IsAbilityEnabled(napi_env env,napi_callback_info info)1485 napi_value IsAbilityEnabled(napi_env env, napi_callback_info info)
1486 {
1487 APP_LOGI("begin to IsAbilityEnabled");
1488 NapiArg args(env, info);
1489 AbilityEnableCallbackInfo *asyncCallbackInfo = new (std::nothrow) AbilityEnableCallbackInfo(env);
1490 if (asyncCallbackInfo == nullptr) {
1491 APP_LOGE("asyncCallbackInfo is null.");
1492 return nullptr;
1493 }
1494 std::unique_ptr<AbilityEnableCallbackInfo> callbackPtr {asyncCallbackInfo};
1495 if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_TWO)) {
1496 APP_LOGE("Napi func init failed");
1497 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1498 return nullptr;
1499 }
1500 if (args.GetMaxArgc() >= ARGS_SIZE_ONE) {
1501 if (!CommonFunc::ParseAbilityInfo(env, args[ARGS_POS_ZERO], asyncCallbackInfo->abilityInfo)) {
1502 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, ABILITY_INFO, TYPE_OBJECT);
1503 return nullptr;
1504 }
1505 if (args.GetMaxArgc() == ARGS_SIZE_TWO) {
1506 napi_valuetype valueType = napi_undefined;
1507 napi_typeof(env, args[ARGS_POS_ONE], &valueType);
1508 if (valueType == napi_function) {
1509 NAPI_CALL(env, napi_create_reference(env, args[ARGS_POS_ONE],
1510 NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
1511 }
1512 }
1513 } else {
1514 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1515 return nullptr;
1516 }
1517 auto promise = CommonFunc::AsyncCallNativeMethod<AbilityEnableCallbackInfo>(
1518 env, asyncCallbackInfo, "IsAbilityEnabled", IsAbilityEnabledExec, IsAbilityEnabledComplete);
1519 callbackPtr.release();
1520 APP_LOGD("call SetAbilityEnabled done.");
1521 return promise;
1522 }
1523
InnerCleanBundleCacheCallback(const std::string & bundleName,const OHOS::sptr<CleanCacheCallback> & cleanCacheCallback)1524 static ErrCode InnerCleanBundleCacheCallback(
1525 const std::string& bundleName, const OHOS::sptr<CleanCacheCallback>& cleanCacheCallback)
1526 {
1527 if (cleanCacheCallback == nullptr) {
1528 APP_LOGE("callback nullptr");
1529 return ERROR_BUNDLE_SERVICE_EXCEPTION;
1530 }
1531 auto iBundleMgr = CommonFunc::GetBundleMgr();
1532 if (iBundleMgr == nullptr) {
1533 APP_LOGE("can not get iBundleMgr");
1534 return ERROR_BUNDLE_SERVICE_EXCEPTION;
1535 }
1536 int32_t userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
1537 ErrCode result = iBundleMgr->CleanBundleCacheFiles(bundleName, cleanCacheCallback, userId);
1538 if (result != ERR_OK) {
1539 APP_LOGE("CleanBundleDataFiles call error");
1540 }
1541 return CommonFunc::ConvertErrCode(result);
1542 }
1543
CleanBundleCacheFilesExec(napi_env env,void * data)1544 void CleanBundleCacheFilesExec(napi_env env, void *data)
1545 {
1546 CleanBundleCacheCallbackInfo* asyncCallbackInfo = reinterpret_cast<CleanBundleCacheCallbackInfo*>(data);
1547 if (asyncCallbackInfo == nullptr) {
1548 APP_LOGE("error CleanBundleCacheCallbackInfo is nullptr");
1549 return;
1550 }
1551 if (asyncCallbackInfo->cleanCacheCallback == nullptr) {
1552 asyncCallbackInfo->cleanCacheCallback = new (std::nothrow) CleanCacheCallback();
1553 }
1554 asyncCallbackInfo->err =
1555 InnerCleanBundleCacheCallback(asyncCallbackInfo->bundleName, asyncCallbackInfo->cleanCacheCallback);
1556 }
1557
CleanBundleCacheFilesComplete(napi_env env,napi_status status,void * data)1558 void CleanBundleCacheFilesComplete(napi_env env, napi_status status, void *data)
1559 {
1560 CleanBundleCacheCallbackInfo* asyncCallbackInfo = reinterpret_cast<CleanBundleCacheCallbackInfo*>(data);
1561 std::unique_ptr<CleanBundleCacheCallbackInfo> callbackPtr {asyncCallbackInfo};
1562 napi_value result[1] = { 0 };
1563 if ((asyncCallbackInfo->err == NO_ERROR) && (asyncCallbackInfo->cleanCacheCallback != nullptr)) {
1564 // wait for OnCleanCacheFinished
1565 uv_sem_wait(&(asyncCallbackInfo->cleanCacheCallback->uvSem_));
1566 asyncCallbackInfo->err = asyncCallbackInfo->cleanCacheCallback->GetErr() ?
1567 NO_ERROR : ERROR_BUNDLE_SERVICE_EXCEPTION;
1568 }
1569 // implement callback or promise
1570 if (asyncCallbackInfo->err == NO_ERROR) {
1571 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
1572 } else {
1573 result[0] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
1574 "CleanBundleCacheFiles", Constants::PERMISSION_REMOVECACHEFILE);
1575 }
1576 CommonFunc::NapiReturnDeferred<CleanBundleCacheCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_ONE);
1577 }
1578
CleanBundleCacheFiles(napi_env env,napi_callback_info info)1579 napi_value CleanBundleCacheFiles(napi_env env, napi_callback_info info)
1580 {
1581 APP_LOGD("napi begin to CleanBundleCacheFiles");
1582 NapiArg args(env, info);
1583 CleanBundleCacheCallbackInfo *asyncCallbackInfo = new (std::nothrow) CleanBundleCacheCallbackInfo(env);
1584 if (asyncCallbackInfo == nullptr) {
1585 APP_LOGE("CleanBundleCacheFiles asyncCallbackInfo is null.");
1586 return nullptr;
1587 }
1588 std::unique_ptr<CleanBundleCacheCallbackInfo> callbackPtr {asyncCallbackInfo};
1589 if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_TWO)) {
1590 APP_LOGE("CleanBundleCacheFiles napi func init failed");
1591 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1592 return nullptr;
1593 }
1594 size_t maxArgc = args.GetMaxArgc();
1595 if (maxArgc >= ARGS_SIZE_ONE) {
1596 if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], asyncCallbackInfo->bundleName)) {
1597 APP_LOGE("CleanBundleCacheFiles bundleName is not a string!");
1598 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, PARAMETER_BUNDLE_NAME, TYPE_STRING);
1599 return nullptr;
1600 }
1601 if (maxArgc >= ARGS_SIZE_TWO) {
1602 napi_valuetype valueType = napi_undefined;
1603 napi_typeof(env, args[ARGS_POS_ONE], &valueType);
1604 if (valueType == napi_function) {
1605 NAPI_CALL(env, napi_create_reference(env, args[ARGS_POS_ONE],
1606 NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
1607 }
1608 }
1609 } else {
1610 APP_LOGE("param error.");
1611 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1612 return nullptr;
1613 }
1614 auto promise = CommonFunc::AsyncCallNativeMethod<CleanBundleCacheCallbackInfo>(
1615 env, asyncCallbackInfo, "CleanBundleCacheFiles", CleanBundleCacheFilesExec, CleanBundleCacheFilesComplete);
1616 callbackPtr.release();
1617 APP_LOGD("napi call CleanBundleCacheFiles done");
1618 return promise;
1619 }
1620
InnerGetLaunchWantForBundleExec(const std::string & bundleName,Want & want,int32_t userId)1621 static ErrCode InnerGetLaunchWantForBundleExec(
1622 const std::string& bundleName, Want &want, int32_t userId)
1623 {
1624 auto iBundleMgr = CommonFunc::GetBundleMgr();
1625 if (iBundleMgr == nullptr) {
1626 APP_LOGE("can not get iBundleMgr");
1627 return ERROR_BUNDLE_SERVICE_EXCEPTION;
1628 }
1629
1630 ErrCode result = iBundleMgr->GetLaunchWantForBundle(bundleName, want, userId);
1631 if (result != ERR_OK) {
1632 APP_LOGE("GetLaunchWantForBundle call error");
1633 }
1634
1635 return CommonFunc::ConvertErrCode(result);
1636 }
1637
GetLaunchWantForBundleExec(napi_env env,void * data)1638 void GetLaunchWantForBundleExec(napi_env env, void *data)
1639 {
1640 LaunchWantCallbackInfo* asyncCallbackInfo = reinterpret_cast<LaunchWantCallbackInfo*>(data);
1641 if (asyncCallbackInfo == nullptr) {
1642 APP_LOGE("error LaunchWantCallbackInfo is nullptr");
1643 return;
1644 }
1645
1646 asyncCallbackInfo->err = InnerGetLaunchWantForBundleExec(
1647 asyncCallbackInfo->bundleName, asyncCallbackInfo->want, asyncCallbackInfo->userId);
1648 }
1649
GetLaunchWantForBundleComplete(napi_env env,napi_status status,void * data)1650 void GetLaunchWantForBundleComplete(napi_env env, napi_status status, void *data)
1651 {
1652 LaunchWantCallbackInfo *asyncCallbackInfo = reinterpret_cast<LaunchWantCallbackInfo *>(data);
1653 if (asyncCallbackInfo == nullptr) {
1654 APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
1655 return;
1656 }
1657
1658 std::unique_ptr<LaunchWantCallbackInfo> callbackPtr {asyncCallbackInfo};
1659 napi_value result[ARGS_POS_TWO] = {0};
1660 if (asyncCallbackInfo->err == NO_ERROR) {
1661 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
1662 NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &result[1]));
1663 CommonFunc::ConvertWantInfo(env, result[1], asyncCallbackInfo->want);
1664 } else {
1665 result[0] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err, GET_LAUNCH_WANT_FOR_BUNDLE,
1666 Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
1667 }
1668
1669 CommonFunc::NapiReturnDeferred<LaunchWantCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
1670 }
1671
GetLaunchWantForBundle(napi_env env,napi_callback_info info)1672 napi_value GetLaunchWantForBundle(napi_env env, napi_callback_info info)
1673 {
1674 APP_LOGD("napi begin to GetLaunchWantForBundle");
1675 NapiArg args(env, info);
1676 LaunchWantCallbackInfo *asyncCallbackInfo = new (std::nothrow) LaunchWantCallbackInfo(env);
1677 if (asyncCallbackInfo == nullptr) {
1678 APP_LOGE("GetLaunchWantForBundle asyncCallbackInfo is null.");
1679 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1680 return nullptr;
1681 }
1682 asyncCallbackInfo->userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
1683 std::unique_ptr<LaunchWantCallbackInfo> callbackPtr {asyncCallbackInfo};
1684 if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_THREE)) {
1685 APP_LOGE("GetLaunchWantForBundle napi func init failed");
1686 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1687 return nullptr;
1688 }
1689 size_t maxArgc = args.GetMaxArgc();
1690 for (size_t i = 0; i < maxArgc; ++i) {
1691 napi_valuetype valueType = napi_undefined;
1692 napi_typeof(env, args[i], &valueType);
1693 if (i == ARGS_POS_ZERO) {
1694 if (valueType != napi_string) {
1695 APP_LOGE("GetLaunchWantForBundle bundleName is not a string!");
1696 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, STRING_TYPE);
1697 return nullptr;
1698 }
1699 CommonFunc::ParseString(env, args[i], asyncCallbackInfo->bundleName);
1700 if (asyncCallbackInfo->bundleName.size() == 0) {
1701 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, STRING_TYPE);
1702 return nullptr;
1703 }
1704 } else if (i == ARGS_POS_ONE) {
1705 if (valueType == napi_function) {
1706 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
1707 break;
1708 }
1709 if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->userId)) {
1710 APP_LOGW("Parse userId failed, set this parameter to the caller userId!");
1711 }
1712 } else if (i == ARGS_POS_TWO) {
1713 if (valueType == napi_function) {
1714 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
1715 break;
1716 }
1717 } else {
1718 APP_LOGE("GetLaunchWantForBundle arg err!");
1719 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1720 return nullptr;
1721 }
1722 }
1723 auto promise = CommonFunc::AsyncCallNativeMethod<LaunchWantCallbackInfo>(
1724 env, asyncCallbackInfo, "GetLaunchWantForBundle", GetLaunchWantForBundleExec, GetLaunchWantForBundleComplete);
1725 callbackPtr.release();
1726 APP_LOGD("napi call GetLaunchWantForBundle done");
1727 return promise;
1728 }
1729
GetAbilityFromBundleInfo(const BundleInfo & bundleInfo,const std::string & abilityName,const std::string & moduleName,AbilityInfo & targetAbilityInfo)1730 ErrCode GetAbilityFromBundleInfo(const BundleInfo& bundleInfo, const std::string& abilityName,
1731 const std::string& moduleName, AbilityInfo& targetAbilityInfo)
1732 {
1733 bool ifExists = false;
1734 for (const auto& hapModuleInfo : bundleInfo.hapModuleInfos) {
1735 for (const auto& abilityInfo : hapModuleInfo.abilityInfos) {
1736 if (abilityInfo.name == abilityName && abilityInfo.moduleName == moduleName) {
1737 if (!abilityInfo.enabled) {
1738 APP_LOGI("ability disabled");
1739 return ERR_BUNDLE_MANAGER_ABILITY_DISABLED;
1740 }
1741 ifExists = true;
1742 targetAbilityInfo = abilityInfo;
1743 break;
1744 }
1745 }
1746 if (ifExists) {
1747 break;
1748 }
1749 }
1750 if (!ifExists) {
1751 APP_LOGE("ability not exist");
1752 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
1753 }
1754 return ERR_OK;
1755 }
1756
GetExtensionFromBundleInfo(const BundleInfo & bundleInfo,const std::string & abilityName,const std::string & moduleName,ExtensionAbilityInfo & targetExtensionInfo)1757 ErrCode GetExtensionFromBundleInfo(const BundleInfo& bundleInfo, const std::string& abilityName,
1758 const std::string& moduleName, ExtensionAbilityInfo& targetExtensionInfo)
1759 {
1760 bool ifExists = false;
1761 for (const auto& hapModuleInfo : bundleInfo.hapModuleInfos) {
1762 for (const auto& extensionInfo : hapModuleInfo.extensionInfos) {
1763 if (extensionInfo.name == abilityName && extensionInfo.moduleName == moduleName) {
1764 ifExists = true;
1765 targetExtensionInfo = extensionInfo;
1766 break;
1767 }
1768 if (!extensionInfo.enabled) {
1769 APP_LOGI("extension disabled");
1770 return ERR_BUNDLE_MANAGER_ABILITY_DISABLED;
1771 }
1772 }
1773 if (ifExists) {
1774 break;
1775 }
1776 }
1777 if (!ifExists) {
1778 APP_LOGE("ability not exist");
1779 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
1780 }
1781 return ERR_OK;
1782 }
1783
InnerGetProfile(GetProfileCallbackInfo & info)1784 static ErrCode InnerGetProfile(GetProfileCallbackInfo &info)
1785 {
1786 auto iBundleMgr = CommonFunc::GetBundleMgr();
1787 if (iBundleMgr == nullptr) {
1788 APP_LOGE("can not get iBundleMgr");
1789 return ERROR_BUNDLE_SERVICE_EXCEPTION;
1790 }
1791
1792 if (info.abilityName.empty()) {
1793 APP_LOGE("InnerGetProfile failed due to empty abilityName");
1794 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
1795 }
1796
1797 if (info.moduleName.empty()) {
1798 APP_LOGE("InnerGetProfile failed due to empty moduleName");
1799 return ERR_BUNDLE_MANAGER_MODULE_NOT_EXIST;
1800 }
1801 auto baseFlag = static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE) +
1802 static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_METADATA) +
1803 static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_DISABLE);
1804 ErrCode result;
1805 BundleMgrClient client;
1806 BundleInfo bundleInfo;
1807 if (info.type == ProfileType::ABILITY_PROFILE) {
1808 auto getAbilityFlag = baseFlag +
1809 static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_ABILITY);
1810 result = iBundleMgr->GetBundleInfoForSelf(getAbilityFlag, bundleInfo);
1811 if (result != ERR_OK) {
1812 APP_LOGE("GetBundleInfoForSelf failed");
1813 return result;
1814 }
1815 AbilityInfo targetAbilityInfo;
1816 result = GetAbilityFromBundleInfo(
1817 bundleInfo, info.abilityName, info.moduleName, targetAbilityInfo);
1818 if (result != ERR_OK) {
1819 return result;
1820 }
1821 if (!client.GetProfileFromAbility(targetAbilityInfo, info.metadataName, info.profileVec)) {
1822 APP_LOGE("GetProfileFromExtension failed");
1823 return ERR_BUNDLE_MANAGER_PROFILE_NOT_EXIST;
1824 }
1825 return ERR_OK;
1826 }
1827
1828 if (info.type == ProfileType::EXTENSION_PROFILE) {
1829 auto getExtensionFlag = baseFlag +
1830 static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_EXTENSION_ABILITY);
1831 result = iBundleMgr->GetBundleInfoForSelf(getExtensionFlag, bundleInfo);
1832 if (result != ERR_OK) {
1833 APP_LOGE("GetBundleInfoForSelf failed");
1834 return result;
1835 }
1836
1837 ExtensionAbilityInfo targetExtensionInfo;
1838 result = GetExtensionFromBundleInfo(
1839 bundleInfo, info.abilityName, info.moduleName, targetExtensionInfo);
1840 if (result != ERR_OK) {
1841 return result;
1842 }
1843 if (!client.GetProfileFromExtension(targetExtensionInfo, info.metadataName, info.profileVec)) {
1844 APP_LOGE("GetProfileFromExtension failed");
1845 return ERR_BUNDLE_MANAGER_PROFILE_NOT_EXIST;
1846 }
1847 return ERR_OK;
1848 }
1849
1850 APP_LOGE("InnerGetProfile failed due to type is invalid");
1851 return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
1852 }
1853
GetProfileExec(napi_env env,void * data)1854 void GetProfileExec(napi_env env, void *data)
1855 {
1856 GetProfileCallbackInfo* asyncCallbackInfo = reinterpret_cast<GetProfileCallbackInfo*>(data);
1857 if (asyncCallbackInfo == nullptr) {
1858 APP_LOGE("error GetProfileCallbackInfo is nullptr");
1859 return;
1860 }
1861
1862 ErrCode result = InnerGetProfile(*asyncCallbackInfo);
1863 asyncCallbackInfo->err = CommonFunc::ConvertErrCode(result);
1864 }
1865
GetProfileComplete(napi_env env,napi_status status,void * data)1866 void GetProfileComplete(napi_env env, napi_status status, void *data)
1867 {
1868 GetProfileCallbackInfo *asyncCallbackInfo = reinterpret_cast<GetProfileCallbackInfo *>(data);
1869 if (asyncCallbackInfo == nullptr) {
1870 APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
1871 return;
1872 }
1873
1874 std::unique_ptr<GetProfileCallbackInfo> callbackPtr {asyncCallbackInfo};
1875 napi_value result[ARGS_POS_TWO] = {0};
1876 if (asyncCallbackInfo->err == NO_ERROR) {
1877 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
1878 NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &result[1]));
1879 CommonFunc::ConvertStringArrays(env, asyncCallbackInfo->profileVec, result[1]);
1880 } else {
1881 result[0] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err, "", "");
1882 }
1883
1884 CommonFunc::NapiReturnDeferred<GetProfileCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
1885 }
1886
GetProfile(napi_env env,napi_callback_info info,const ProfileType & profileType)1887 napi_value GetProfile(napi_env env, napi_callback_info info, const ProfileType &profileType)
1888 {
1889 APP_LOGD("napi begin to GetProfile");
1890 NapiArg args(env, info);
1891 GetProfileCallbackInfo *asyncCallbackInfo = new (std::nothrow) GetProfileCallbackInfo(env);
1892 if (asyncCallbackInfo == nullptr) {
1893 APP_LOGE("GetProfile asyncCallbackInfo is null.");
1894 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1895 return nullptr;
1896 }
1897
1898 asyncCallbackInfo->type = profileType;
1899 std::unique_ptr<GetProfileCallbackInfo> callbackPtr {asyncCallbackInfo};
1900 if (!args.Init(ARGS_POS_TWO, ARGS_SIZE_FOUR)) {
1901 APP_LOGE("GetProfile napi func init failed");
1902 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1903 return nullptr;
1904 }
1905 size_t maxArgc = args.GetMaxArgc();
1906 for (size_t i = 0; i < maxArgc; ++i) {
1907 napi_valuetype valueType = napi_undefined;
1908 napi_typeof(env, args[i], &valueType);
1909 if (i == ARGS_POS_ZERO) {
1910 if (valueType != napi_string) {
1911 APP_LOGE("GetProfile moduleName is not a string!");
1912 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, MODULE_NAME, STRING_TYPE);
1913 return nullptr;
1914 }
1915 CommonFunc::ParseString(env, args[i], asyncCallbackInfo->moduleName);
1916 } else if (i == ARGS_POS_ONE) {
1917 if (valueType != napi_string) {
1918 APP_LOGE("GetProfile abilityName is not a string!");
1919 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, ABILITY_NAME, STRING_TYPE);
1920 return nullptr;
1921 }
1922 CommonFunc::ParseString(env, args[i], asyncCallbackInfo->abilityName);
1923 } else if (i == ARGS_POS_TWO) {
1924 if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->metadataName)) {
1925 APP_LOGW("Parse metadataName failed, The default value is undefined!");
1926 }
1927 } else if (i == ARGS_POS_THREE) {
1928 if (valueType == napi_function) {
1929 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
1930 break;
1931 }
1932 } else {
1933 APP_LOGE("GetProfile arg err!");
1934 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1935 return nullptr;
1936 }
1937 }
1938 auto promise = CommonFunc::AsyncCallNativeMethod<GetProfileCallbackInfo>(
1939 env, asyncCallbackInfo, "GetProfile", GetProfileExec, GetProfileComplete);
1940 callbackPtr.release();
1941 APP_LOGD("napi call GetProfile done");
1942 return promise;
1943 }
1944
GetProfileByAbility(napi_env env,napi_callback_info info)1945 napi_value GetProfileByAbility(napi_env env, napi_callback_info info)
1946 {
1947 APP_LOGD("napi begin to GetProfileByAbility");
1948 return GetProfile(env, info, ProfileType::ABILITY_PROFILE);
1949 }
1950
GetProfileByExAbility(napi_env env,napi_callback_info info)1951 napi_value GetProfileByExAbility(napi_env env, napi_callback_info info)
1952 {
1953 APP_LOGD("napi begin to GetProfileByExAbility");
1954 return GetProfile(env, info, ProfileType::EXTENSION_PROFILE);
1955 }
1956
CreateExtensionAbilityFlagObject(napi_env env,napi_value value)1957 void CreateExtensionAbilityFlagObject(napi_env env, napi_value value)
1958 {
1959 napi_value nGetExtensionAbilityInfoDefault;
1960 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
1961 GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_DEFAULT), &nGetExtensionAbilityInfoDefault));
1962 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_EXTENSION_ABILITY_INFO_DEFAULT",
1963 nGetExtensionAbilityInfoDefault));
1964
1965 napi_value nGetExtensionAbilityInfoWithPermission;
1966 NAPI_CALL_RETURN_VOID(env,
1967 napi_create_int32(env, static_cast<int32_t>(
1968 GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_PERMISSION),
1969 &nGetExtensionAbilityInfoWithPermission));
1970 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_EXTENSION_ABILITY_INFO_WITH_PERMISSION",
1971 nGetExtensionAbilityInfoWithPermission));
1972
1973 napi_value nGetExtensionAbilityInfoWithApplication;
1974 NAPI_CALL_RETURN_VOID(env,
1975 napi_create_int32(env, static_cast<int32_t>(
1976 GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_APPLICATION),
1977 &nGetExtensionAbilityInfoWithApplication));
1978 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_EXTENSION_ABILITY_INFO_WITH_APPLICATION",
1979 nGetExtensionAbilityInfoWithApplication));
1980
1981 napi_value nGetExtensionAbilityInfoWithMetadata;
1982 NAPI_CALL_RETURN_VOID(env,
1983 napi_create_int32(env, static_cast<int32_t>(
1984 GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_METADATA),
1985 &nGetExtensionAbilityInfoWithMetadata));
1986 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_EXTENSION_ABILITY_INFO_WITH_METADATA",
1987 nGetExtensionAbilityInfoWithMetadata));
1988 }
1989
CreateExtensionAbilityTypeObject(napi_env env,napi_value value)1990 void CreateExtensionAbilityTypeObject(napi_env env, napi_value value)
1991 {
1992 napi_value nForm;
1993 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::FORM), &nForm));
1994 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "FORM", nForm));
1995
1996 napi_value nWorkSchedule;
1997 NAPI_CALL_RETURN_VOID(env,
1998 napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::WORK_SCHEDULER), &nWorkSchedule));
1999 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "WORK_SCHEDULER", nWorkSchedule));
2000
2001 napi_value nInputMethod;
2002 NAPI_CALL_RETURN_VOID(env,
2003 napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::INPUTMETHOD), &nInputMethod));
2004 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "INPUT_METHOD", nInputMethod));
2005
2006 napi_value nService;
2007 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::SERVICE), &nService));
2008 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SERVICE", nService));
2009
2010 napi_value nAccessibility;
2011 NAPI_CALL_RETURN_VOID(env,
2012 napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::ACCESSIBILITY), &nAccessibility));
2013 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "ACCESSIBILITY", nAccessibility));
2014
2015 napi_value nDataShare;
2016 NAPI_CALL_RETURN_VOID(env,
2017 napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::DATASHARE), &nDataShare));
2018 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "DATA_SHARE", nDataShare));
2019
2020 napi_value nFileShare;
2021 NAPI_CALL_RETURN_VOID(env,
2022 napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::FILESHARE), &nFileShare));
2023 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "FILE_SHARE", nFileShare));
2024
2025 napi_value nStaticSubscriber;
2026 NAPI_CALL_RETURN_VOID(env,
2027 napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::STATICSUBSCRIBER), &nStaticSubscriber));
2028 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "STATIC_SUBSCRIBER", nStaticSubscriber));
2029
2030 napi_value nWallpaper;
2031 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
2032 static_cast<int32_t>(ExtensionAbilityType::WALLPAPER), &nWallpaper));
2033 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "WALLPAPER", nWallpaper));
2034
2035 napi_value nBackup;
2036 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
2037 static_cast<int32_t>(ExtensionAbilityType::BACKUP), &nBackup));
2038 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "BACKUP", nBackup));
2039
2040 napi_value nWindow;
2041 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
2042 static_cast<int32_t>(ExtensionAbilityType::WINDOW), &nWindow));
2043 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "WINDOW", nWindow));
2044
2045 napi_value nEnterpriseAdmin;
2046 NAPI_CALL_RETURN_VOID(env,
2047 napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::ENTERPRISE_ADMIN), &nEnterpriseAdmin));
2048 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "ENTERPRISE_ADMIN", nEnterpriseAdmin));
2049
2050 napi_value nTHUMBNAIL;
2051 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
2052 static_cast<int32_t>(ExtensionAbilityType::THUMBNAIL), &nTHUMBNAIL));
2053 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "THUMBNAIL", nTHUMBNAIL));
2054
2055 napi_value nPREVIEW;
2056 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
2057 static_cast<int32_t>(ExtensionAbilityType::PREVIEW), &nPREVIEW));
2058 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "PREVIEW", nPREVIEW));
2059
2060 napi_value nPrint;
2061 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
2062 static_cast<int32_t>(ExtensionAbilityType::PRINT), &nPrint));
2063 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "PRINT", nPrint));
2064
2065 napi_value nShare;
2066 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
2067 static_cast<int32_t>(ExtensionAbilityType::SHARE), &nShare));
2068 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SHARE", nShare));
2069
2070 napi_value nAction;
2071 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
2072 static_cast<int32_t>(ExtensionAbilityType::ACTION), &nAction));
2073 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "ACTION", nAction));
2074
2075 napi_value nAuthorization;
2076 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
2077 static_cast<int32_t>(ExtensionAbilityType::APP_ACCOUNT_AUTHORIZATION), &nAuthorization));
2078 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "APP_ACCOUNT_AUTHORIZATION", nAuthorization));
2079
2080 napi_value nUI;
2081 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
2082 static_cast<int32_t>(ExtensionAbilityType::UI), &nUI));
2083 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "UI", nUI));
2084
2085 napi_value nPush;
2086 NAPI_CALL_RETURN_VOID(env,
2087 napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::PUSH), &nPush));
2088 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "PUSH", nPush));
2089
2090 napi_value nDriver;
2091 NAPI_CALL_RETURN_VOID(env,
2092 napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::DRIVER), &nDriver));
2093 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "DRIVER", nDriver));
2094
2095 napi_value nUnspecified;
2096 NAPI_CALL_RETURN_VOID(env,
2097 napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::UNSPECIFIED), &nUnspecified));
2098 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "UNSPECIFIED", nUnspecified));
2099
2100 napi_value nSysDialogUserAuth;
2101 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
2102 static_cast<int32_t>(ExtensionAbilityType::SYSDIALOG_USERAUTH), &nSysDialogUserAuth));
2103 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SYSDIALOG_USERAUTH", nSysDialogUserAuth));
2104
2105 napi_value nSysDialogCommon;
2106 NAPI_CALL_RETURN_VOID(env,
2107 napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::SYSDIALOG_COMMON), &nSysDialogCommon));
2108 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SYSDIALOG_COMMON", nSysDialogCommon));
2109
2110 napi_value nMediaControl;
2111 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
2112 static_cast<int32_t>(ExtensionAbilityType::SYSPICKER_MEDIACONTROL), &nMediaControl));
2113 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SYSPICKER_MEDIACONTROL", nMediaControl));
2114
2115 napi_value nSysDialogAtomicServicePanel;
2116 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
2117 static_cast<int32_t>(ExtensionAbilityType::SYSDIALOG_ATOMICSERVICEPANEL), &nSysDialogAtomicServicePanel));
2118 NAPI_CALL_RETURN_VOID(env,
2119 napi_set_named_property(env, value, "SYSDIALOG_ATOMICSERVICEPANEL", nSysDialogAtomicServicePanel));
2120
2121 napi_value nSysDialogPower;
2122 NAPI_CALL_RETURN_VOID(env,
2123 napi_create_int32(env, static_cast<int32_t>(ExtensionAbilityType::SYSDIALOG_POWER), &nSysDialogPower));
2124 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SYSDIALOG_POWER", nSysDialogPower));
2125
2126 napi_value nSysPickerShare;
2127 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
2128 static_cast<int32_t>(ExtensionAbilityType::SYSPICKER_SHARE), &nSysPickerShare));
2129 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SYSPICKER_SHARE", nSysPickerShare));
2130
2131 napi_value nSysHmsAccount;
2132 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
2133 static_cast<int32_t>(ExtensionAbilityType::HMS_ACCOUNT), &nSysHmsAccount));
2134 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "HMS_ACCOUNT", nSysHmsAccount));
2135
2136 napi_value nSysCommonUI;
2137 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
2138 static_cast<int32_t>(ExtensionAbilityType::SYS_COMMON_UI), &nSysCommonUI));
2139 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SYS_COMMON_UI", nSysCommonUI));
2140 }
2141
CreateApplicationFlagObject(napi_env env,napi_value value)2142 void CreateApplicationFlagObject(napi_env env, napi_value value)
2143 {
2144 napi_value nGetApplicationInfoDefault;
2145 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
2146 GetApplicationFlag::GET_APPLICATION_INFO_DEFAULT), &nGetApplicationInfoDefault));
2147 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_APPLICATION_INFO_DEFAULT",
2148 nGetApplicationInfoDefault));
2149
2150 napi_value nGetApplicationInfoWithPermission;
2151 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
2152 GetApplicationFlag::GET_APPLICATION_INFO_WITH_PERMISSION), &nGetApplicationInfoWithPermission));
2153 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_APPLICATION_INFO_WITH_PERMISSION",
2154 nGetApplicationInfoWithPermission));
2155
2156 napi_value nGetApplicationInfoWithMetadata;
2157 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
2158 GetApplicationFlag::GET_APPLICATION_INFO_WITH_METADATA), &nGetApplicationInfoWithMetadata));
2159 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_APPLICATION_INFO_WITH_METADATA",
2160 nGetApplicationInfoWithMetadata));
2161
2162 napi_value nGetApplicationInfoWithDisable;
2163 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
2164 GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE), &nGetApplicationInfoWithDisable));
2165 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_APPLICATION_INFO_WITH_DISABLE",
2166 nGetApplicationInfoWithDisable));
2167 }
2168
InnerGetPermissionDef(const std::string & permissionName,PermissionDef & permissionDef)2169 static ErrCode InnerGetPermissionDef(const std::string &permissionName, PermissionDef &permissionDef)
2170 {
2171 auto iBundleMgr = CommonFunc::GetBundleMgr();
2172 if (iBundleMgr == nullptr) {
2173 APP_LOGE("can not get iBundleMgr");
2174 return ERROR_BUNDLE_SERVICE_EXCEPTION;
2175 }
2176 ErrCode ret = iBundleMgr->GetPermissionDef(permissionName, permissionDef);
2177 return CommonFunc::ConvertErrCode(ret);
2178 }
2179
GetPermissionDefExec(napi_env env,void * data)2180 void GetPermissionDefExec(napi_env env, void *data)
2181 {
2182 AsyncPermissionDefineCallbackInfo *asyncCallbackInfo = reinterpret_cast<AsyncPermissionDefineCallbackInfo *>(data);
2183 if (asyncCallbackInfo == nullptr) {
2184 APP_LOGE("%{public}s, asyncCallbackInfo == nullptr.", __func__);
2185 return;
2186 }
2187 if (asyncCallbackInfo->err == NO_ERROR) {
2188 asyncCallbackInfo->err = InnerGetPermissionDef(asyncCallbackInfo->permissionName,
2189 asyncCallbackInfo->permissionDef);
2190 }
2191 }
2192
GetPermissionDefComplete(napi_env env,napi_status status,void * data)2193 void GetPermissionDefComplete(napi_env env, napi_status status, void *data)
2194 {
2195 AsyncPermissionDefineCallbackInfo *asyncCallbackInfo = reinterpret_cast<AsyncPermissionDefineCallbackInfo *>(data);
2196 if (asyncCallbackInfo == nullptr) {
2197 APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
2198 return;
2199 }
2200 std::unique_ptr<AsyncPermissionDefineCallbackInfo> callbackPtr {asyncCallbackInfo};
2201 napi_value result[ARGS_SIZE_TWO] = {0};
2202 if (asyncCallbackInfo->err == NO_ERROR) {
2203 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
2204 NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &result[ARGS_POS_ONE]));
2205 CommonFunc::ConvertPermissionDef(env, result[ARGS_POS_ONE], asyncCallbackInfo->permissionDef);
2206 } else {
2207 result[0] = BusinessError::CreateCommonError(
2208 env, asyncCallbackInfo->err, GET_PERMISSION_DEF, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
2209 }
2210 CommonFunc::NapiReturnDeferred<AsyncPermissionDefineCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
2211 }
2212
2213 /**
2214 * Promise and async callback
2215 */
GetPermissionDef(napi_env env,napi_callback_info info)2216 napi_value GetPermissionDef(napi_env env, napi_callback_info info)
2217 {
2218 APP_LOGD("GetPermissionDef called");
2219 NapiArg args(env, info);
2220 AsyncPermissionDefineCallbackInfo *asyncCallbackInfo = new (std::nothrow) AsyncPermissionDefineCallbackInfo(env);
2221 if (asyncCallbackInfo == nullptr) {
2222 APP_LOGE("asyncCallbackInfo is null.");
2223 return nullptr;
2224 }
2225 std::unique_ptr<AsyncPermissionDefineCallbackInfo> callbackPtr {asyncCallbackInfo};
2226 if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_TWO)) {
2227 APP_LOGE("param count invalid");
2228 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2229 return nullptr;
2230 }
2231 for (size_t i = 0; i < args.GetMaxArgc(); ++i) {
2232 napi_valuetype valuetype = napi_undefined;
2233 NAPI_CALL(env, napi_typeof(env, args[i], &valuetype));
2234 if (i == ARGS_POS_ZERO) {
2235 if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->permissionName)) {
2236 APP_LOGE("permissionName invalid!");
2237 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, PERMISSION_NAME, TYPE_STRING);
2238 return nullptr;
2239 }
2240 } else if (i == ARGS_POS_ONE) {
2241 if (valuetype == napi_function) {
2242 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
2243 } else {
2244 APP_LOGD("GetPermissionDef extra arg ignored");
2245 }
2246 } else {
2247 APP_LOGE("GetPermissionDef arg err!");
2248 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR);
2249 return nullptr;
2250 }
2251 }
2252
2253 auto promise = CommonFunc::AsyncCallNativeMethod<AsyncPermissionDefineCallbackInfo>(
2254 env, asyncCallbackInfo, "GetPermissionDef", GetPermissionDefExec, GetPermissionDefComplete);
2255 callbackPtr.release();
2256 return promise;
2257 }
2258
CheckToCache(napi_env env,int32_t uid,int32_t callingUid,const Query & query,napi_value jsObject)2259 static void CheckToCache(napi_env env, int32_t uid, int32_t callingUid, const Query &query, napi_value jsObject)
2260 {
2261 if (uid != callingUid) {
2262 APP_LOGD("uid %{public}d and callingUid %{public}d not equal", uid, callingUid);
2263 return;
2264 }
2265 APP_LOGD("put applicationInfo to cache");
2266 napi_ref cacheApplicationInfo = nullptr;
2267 NAPI_CALL_RETURN_VOID(env, napi_create_reference(env, jsObject, NAPI_RETURN_ONE, &cacheApplicationInfo));
2268 std::unique_lock<std::shared_mutex> lock(g_cacheMutex);
2269 cache[query] = cacheApplicationInfo;
2270 }
2271
GetApplicationInfoSync(napi_env env,napi_callback_info info)2272 napi_value GetApplicationInfoSync(napi_env env, napi_callback_info info)
2273 {
2274 APP_LOGD("NAPI GetApplicationInfoSync call");
2275 NapiArg args(env, info);
2276 if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_THREE)) {
2277 APP_LOGE("param count invalid");
2278 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2279 return nullptr;
2280 }
2281 std::string bundleName;
2282 int32_t flags = 0;
2283 int32_t userId = Constants::UNSPECIFIED_USERID;
2284 for (size_t i = 0; i < args.GetArgc(); ++i) {
2285 napi_valuetype valueType = napi_undefined;
2286 napi_typeof(env, args[i], &valueType);
2287 if (i == ARGS_POS_ZERO) {
2288 if (!CommonFunc::ParseString(env, args[i], bundleName)) {
2289 APP_LOGE("bundleName %{public}s invalid", bundleName.c_str());
2290 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
2291 return nullptr;
2292 }
2293 } else if (i == ARGS_POS_ONE) {
2294 if (!CommonFunc::ParseInt(env, args[i], flags)) {
2295 APP_LOGE("parseInt failed");
2296 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, APP_FLAGS, TYPE_NUMBER);
2297 return nullptr;
2298 }
2299 } else if (i == ARGS_POS_TWO) {
2300 if (!CommonFunc::ParseInt(env, args[i], userId)) {
2301 APP_LOGW("userId parseInt failed");
2302 }
2303 } else {
2304 APP_LOGE("parameter is invalid");
2305 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
2306 return nullptr;
2307 }
2308 }
2309 if (bundleName.size() == 0) {
2310 napi_value businessError = BusinessError::CreateCommonError(
2311 env, ERROR_BUNDLE_NOT_EXIST, GET_BUNDLE_INFO_SYNC, BUNDLE_PERMISSIONS);
2312 napi_throw(env, businessError);
2313 return nullptr;
2314 }
2315 if (userId == Constants::UNSPECIFIED_USERID) {
2316 userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
2317 }
2318 napi_value nApplicationInfo = nullptr;
2319 {
2320 std::shared_lock<std::shared_mutex> lock(g_cacheMutex);
2321 auto item = cache.find(Query(bundleName, GET_APPLICATION_INFO, flags, userId, env));
2322 if (item != cache.end()) {
2323 APP_LOGD("getApplicationInfo param from cache");
2324 NAPI_CALL(env,
2325 napi_get_reference_value(env, item->second, &nApplicationInfo));
2326 return nApplicationInfo;
2327 }
2328 }
2329 auto iBundleMgr = CommonFunc::GetBundleMgr();
2330 if (iBundleMgr == nullptr) {
2331 APP_LOGE("can not get iBundleMgr");
2332 return nullptr;
2333 }
2334 AppExecFwk::ApplicationInfo appInfo;
2335 ErrCode ret = CommonFunc::ConvertErrCode(
2336 iBundleMgr->GetApplicationInfoV9(bundleName, flags, userId, appInfo));
2337 if (ret != NO_ERROR) {
2338 APP_LOGE("GetApplicationInfo failed");
2339 napi_value businessError = BusinessError::CreateCommonError(
2340 env, ret, GET_BUNDLE_INFO_SYNC, BUNDLE_PERMISSIONS);
2341 napi_throw(env, businessError);
2342 return nullptr;
2343 }
2344 NAPI_CALL(env, napi_create_object(env, &nApplicationInfo));
2345 CommonFunc::ConvertApplicationInfo(env, nApplicationInfo, appInfo);
2346 Query query(bundleName, GET_APPLICATION_INFO, flags, userId, env);
2347 CheckToCache(env, appInfo.uid, IPCSkeleton::GetCallingUid(), query, nApplicationInfo);
2348 return nApplicationInfo;
2349 }
2350
GetBundleInfoSync(napi_env env,napi_callback_info info)2351 napi_value GetBundleInfoSync(napi_env env, napi_callback_info info)
2352 {
2353 APP_LOGD("NAPI GetBundleInfoSync call");
2354 NapiArg args(env, info);
2355 if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_THREE)) {
2356 APP_LOGE("param count invalid");
2357 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2358 return nullptr;
2359 }
2360 std::string bundleName;
2361 int32_t flags = 0;
2362 int32_t userId = Constants::UNSPECIFIED_USERID;
2363 for (size_t i = 0; i < args.GetArgc(); ++i) {
2364 napi_valuetype valueType = napi_undefined;
2365 NAPI_CALL(env, napi_typeof(env, args[i], &valueType));
2366 if (i == ARGS_POS_ZERO) {
2367 if (!CommonFunc::ParseString(env, args[i], bundleName)) {
2368 APP_LOGE("bundleName %{public}s invalid", bundleName.c_str());
2369 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
2370 return nullptr;
2371 }
2372 } else if (i == ARGS_POS_ONE) {
2373 if (!CommonFunc::ParseInt(env, args[i], flags)) {
2374 APP_LOGE("parseInt failed");
2375 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_FLAGS, TYPE_NUMBER);
2376 return nullptr;
2377 }
2378 } else if (i == ARGS_POS_TWO) {
2379 if ((valueType == napi_number) && (!CommonFunc::ParseInt(env, args[i], userId))) {
2380 APP_LOGE("parseInt failed");
2381 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, USER_ID, TYPE_NUMBER);
2382 return nullptr;
2383 }
2384 } else {
2385 APP_LOGE("parameter is invalid");
2386 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
2387 return nullptr;
2388 }
2389 }
2390 if (bundleName.size() == 0) {
2391 napi_value businessError = BusinessError::CreateCommonError(
2392 env, ERROR_BUNDLE_NOT_EXIST, GET_BUNDLE_INFO_SYNC, BUNDLE_PERMISSIONS);
2393 napi_throw(env, businessError);
2394 return nullptr;
2395 }
2396 if (userId == Constants::UNSPECIFIED_USERID) {
2397 userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
2398 }
2399 napi_value nBundleInfo = nullptr;
2400 {
2401 std::shared_lock<std::shared_mutex> lock(g_cacheMutex);
2402 auto item = cache.find(Query(bundleName, GET_BUNDLE_INFO, flags, userId, env));
2403 if (item != cache.end()) {
2404 APP_LOGD("GetBundleInfo param from cache");
2405 NAPI_CALL(env,
2406 napi_get_reference_value(env, item->second, &nBundleInfo));
2407 return nBundleInfo;
2408 }
2409 }
2410 auto iBundleMgr = CommonFunc::GetBundleMgr();
2411 if (iBundleMgr == nullptr) {
2412 APP_LOGE("BundleMgr is null");
2413 return nullptr;
2414 }
2415 BundleInfo bundleInfo;
2416 ErrCode ret = CommonFunc::ConvertErrCode(iBundleMgr->GetBundleInfoV9(bundleName, flags, bundleInfo, userId));
2417 if (ret != NO_ERROR) {
2418 APP_LOGE("GetBundleInfo failed");
2419 napi_value businessError = BusinessError::CreateCommonError(
2420 env, ret, GET_BUNDLE_INFO_SYNC, BUNDLE_PERMISSIONS);
2421 napi_throw(env, businessError);
2422 return nullptr;
2423 }
2424 NAPI_CALL(env, napi_create_object(env, &nBundleInfo));
2425 CommonFunc::ConvertBundleInfo(env, bundleInfo, nBundleInfo, flags);
2426 Query query(bundleName, GET_BUNDLE_INFO, flags, userId, env);
2427 CheckToCache(env, bundleInfo.uid, IPCSkeleton::GetCallingUid(), query, nBundleInfo);
2428 return nBundleInfo;
2429 }
2430
InnerGetBundleInfos(int32_t flags,int32_t userId,std::vector<BundleInfo> & bundleInfos)2431 static ErrCode InnerGetBundleInfos(int32_t flags,
2432 int32_t userId, std::vector<BundleInfo> &bundleInfos)
2433 {
2434 auto iBundleMgr = CommonFunc::GetBundleMgr();
2435 if (iBundleMgr == nullptr) {
2436 APP_LOGE("iBundleMgr is null");
2437 return ERROR_BUNDLE_SERVICE_EXCEPTION;
2438 }
2439 ErrCode ret = iBundleMgr->GetBundleInfosV9(flags, bundleInfos, userId);
2440 return CommonFunc::ConvertErrCode(ret);
2441 }
2442
CreateBundleFlagObject(napi_env env,napi_value value)2443 void CreateBundleFlagObject(napi_env env, napi_value value)
2444 {
2445 napi_value nBundleInfoDefault;
2446 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_DEFAULT),
2447 &nBundleInfoDefault));
2448 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_DEFAULT",
2449 nBundleInfoDefault));
2450
2451 napi_value nGetBundleInfoWithApplication;
2452 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
2453 GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_APPLICATION), &nGetBundleInfoWithApplication));
2454 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_APPLICATION",
2455 nGetBundleInfoWithApplication));
2456
2457 napi_value nGetBundleInfoWithHapModule;
2458 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
2459 GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE), &nGetBundleInfoWithHapModule));
2460 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_HAP_MODULE",
2461 nGetBundleInfoWithHapModule));
2462
2463 napi_value nGetBundleInfoWithAbility;
2464 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
2465 GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_ABILITY), &nGetBundleInfoWithAbility));
2466 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_ABILITY",
2467 nGetBundleInfoWithAbility));
2468
2469 napi_value nGetBundleInfoWithExtensionAbility;
2470 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
2471 GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_EXTENSION_ABILITY), &nGetBundleInfoWithExtensionAbility));
2472 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_EXTENSION_ABILITY",
2473 nGetBundleInfoWithExtensionAbility));
2474
2475 napi_value nGetBundleInfoWithRequestedPermission;
2476 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
2477 GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_REQUESTED_PERMISSION), &nGetBundleInfoWithRequestedPermission));
2478 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_REQUESTED_PERMISSION",
2479 nGetBundleInfoWithRequestedPermission));
2480
2481 napi_value nGetBundleInfoWithMetadata;
2482 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
2483 GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_METADATA), &nGetBundleInfoWithMetadata));
2484 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_METADATA",
2485 nGetBundleInfoWithMetadata));
2486
2487 napi_value nGetBundleInfoWithDisable;
2488 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
2489 GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_DISABLE), &nGetBundleInfoWithDisable));
2490 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_DISABLE",
2491 nGetBundleInfoWithDisable));
2492
2493 napi_value nGetBundleInfoWithSignatureInfo;
2494 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(
2495 GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_SIGNATURE_INFO), &nGetBundleInfoWithSignatureInfo));
2496 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_INFO_WITH_SIGNATURE_INFO",
2497 nGetBundleInfoWithSignatureInfo));
2498 }
2499
InnerGetBundleInfo(const std::string & bundleName,int32_t flags,int32_t userId,BundleInfo & bundleInfo)2500 static ErrCode InnerGetBundleInfo(const std::string &bundleName, int32_t flags,
2501 int32_t userId, BundleInfo &bundleInfo)
2502 {
2503 auto iBundleMgr = CommonFunc::GetBundleMgr();
2504 if (iBundleMgr == nullptr) {
2505 APP_LOGE("iBundleMgr is null");
2506 return ERROR_BUNDLE_SERVICE_EXCEPTION;
2507 }
2508 ErrCode ret = iBundleMgr->GetBundleInfoV9(bundleName, flags, bundleInfo, userId);
2509 return CommonFunc::ConvertErrCode(ret);
2510 }
2511
InnerGetBundleInfoForSelf(int32_t flags,BundleInfo & bundleInfo)2512 static ErrCode InnerGetBundleInfoForSelf(int32_t flags, BundleInfo &bundleInfo)
2513 {
2514 auto iBundleMgr = CommonFunc::GetBundleMgr();
2515 if (iBundleMgr == nullptr) {
2516 APP_LOGE("iBundleMgr is null");
2517 return ERROR_BUNDLE_SERVICE_EXCEPTION;
2518 }
2519 ErrCode ret = iBundleMgr->GetBundleInfoForSelf(flags, bundleInfo);
2520 return CommonFunc::ConvertErrCode(ret);
2521 }
2522
ProcessBundleInfos(napi_env env,napi_value result,const std::vector<BundleInfo> & bundleInfos,int32_t flags)2523 static void ProcessBundleInfos(
2524 napi_env env, napi_value result, const std::vector<BundleInfo> &bundleInfos, int32_t flags)
2525 {
2526 if (bundleInfos.size() == 0) {
2527 APP_LOGD("bundleInfos is null");
2528 return;
2529 }
2530 size_t index = 0;
2531 for (const auto &item : bundleInfos) {
2532 APP_LOGD("name{%s}, bundleName{%s} ", item.name.c_str(), item.name.c_str());
2533 napi_value objBundleInfo;
2534 NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &objBundleInfo));
2535 CommonFunc::ConvertBundleInfo(env, item, objBundleInfo, flags);
2536 NAPI_CALL_RETURN_VOID(env, napi_set_element(env, result, index, objBundleInfo));
2537 index++;
2538 }
2539 }
2540
GetBundleInfosComplete(napi_env env,napi_status status,void * data)2541 void GetBundleInfosComplete(napi_env env, napi_status status, void *data)
2542 {
2543 BundleInfosCallbackInfo *asyncCallbackInfo =
2544 reinterpret_cast<BundleInfosCallbackInfo *>(data);
2545 if (asyncCallbackInfo == nullptr) {
2546 APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
2547 return;
2548 }
2549 std::unique_ptr<BundleInfosCallbackInfo> callbackPtr {asyncCallbackInfo};
2550 napi_value result[CALLBACK_PARAM_SIZE] = {0};
2551 if (asyncCallbackInfo->err == NO_ERROR) {
2552 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
2553 NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &result[ARGS_POS_ONE]));
2554 ProcessBundleInfos(env, result[ARGS_POS_ONE], asyncCallbackInfo->bundleInfos, asyncCallbackInfo->flags);
2555 } else {
2556 result[ARGS_POS_ZERO] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
2557 GET_BUNDLE_INFOS, Constants::PERMISSION_GET_INSTALLED_BUNDLE_LIST);
2558 }
2559 CommonFunc::NapiReturnDeferred<BundleInfosCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
2560 }
2561
GetBundleInfoComplete(napi_env env,napi_status status,void * data)2562 void GetBundleInfoComplete(napi_env env, napi_status status, void *data)
2563 {
2564 BundleInfoCallbackInfo *asyncCallbackInfo =
2565 reinterpret_cast<BundleInfoCallbackInfo *>(data);
2566 if (asyncCallbackInfo == nullptr) {
2567 APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
2568 return;
2569 }
2570 std::unique_ptr<BundleInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
2571 napi_value result[CALLBACK_PARAM_SIZE] = {0};
2572 if (asyncCallbackInfo->err == NO_ERROR) {
2573 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
2574 if (asyncCallbackInfo->isSavedInCache) {
2575 std::shared_lock<std::shared_mutex> lock(g_cacheMutex);
2576 auto item = cache.find(Query(
2577 asyncCallbackInfo->bundleName, GET_BUNDLE_INFO,
2578 asyncCallbackInfo->flags, asyncCallbackInfo->userId, env));
2579 if (item == cache.end()) {
2580 APP_LOGE("cannot find result in cache in %{public}s", __func__);
2581 return;
2582 }
2583 NAPI_CALL_RETURN_VOID(env, napi_get_reference_value(env, item->second, &result[ARGS_POS_ONE]));
2584 } else {
2585 NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &result[ARGS_POS_ONE]));
2586 CommonFunc::ConvertBundleInfo(env,
2587 asyncCallbackInfo->bundleInfo, result[ARGS_POS_ONE], asyncCallbackInfo->flags);
2588 Query query(
2589 asyncCallbackInfo->bundleName, GET_BUNDLE_INFO,
2590 asyncCallbackInfo->flags, asyncCallbackInfo->userId, env);
2591 CheckToCache(
2592 env, asyncCallbackInfo->bundleInfo.uid, IPCSkeleton::GetCallingUid(), query, result[ARGS_POS_ONE]);
2593 }
2594 } else {
2595 result[ARGS_POS_ZERO] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
2596 GET_BUNDLE_INFO, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
2597 }
2598 CommonFunc::NapiReturnDeferred<BundleInfoCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
2599 }
2600
GetBundleInfoExec(napi_env env,void * data)2601 void GetBundleInfoExec(napi_env env, void *data)
2602 {
2603 BundleInfoCallbackInfo *asyncCallbackInfo = reinterpret_cast<BundleInfoCallbackInfo *>(data);
2604 if (asyncCallbackInfo == nullptr) {
2605 APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
2606 return;
2607 }
2608 if (asyncCallbackInfo->err == NO_ERROR) {
2609 {
2610 std::shared_lock<std::shared_mutex> lock(g_cacheMutex);
2611 auto item = cache.find(Query(asyncCallbackInfo->bundleName,
2612 GET_BUNDLE_INFO, asyncCallbackInfo->flags, asyncCallbackInfo->userId, env));
2613 if (item != cache.end()) {
2614 asyncCallbackInfo->isSavedInCache = true;
2615 APP_LOGD("GetBundleInfo param from cache");
2616 return;
2617 }
2618 }
2619 asyncCallbackInfo->err = InnerGetBundleInfo(asyncCallbackInfo->bundleName,
2620 asyncCallbackInfo->flags, asyncCallbackInfo->userId, asyncCallbackInfo->bundleInfo);
2621 }
2622 }
2623
GetBundleInfoForSelfExec(napi_env env,void * data)2624 void GetBundleInfoForSelfExec(napi_env env, void *data)
2625 {
2626 BundleInfoCallbackInfo *asyncCallbackInfo = reinterpret_cast<BundleInfoCallbackInfo *>(data);
2627 if (asyncCallbackInfo == nullptr) {
2628 APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
2629 return;
2630 }
2631 if (asyncCallbackInfo->err != NO_ERROR) {
2632 return;
2633 }
2634 auto uid = IPCSkeleton::GetCallingUid();
2635 asyncCallbackInfo->uid = uid;
2636 asyncCallbackInfo->bundleName = std::to_string(uid);
2637 asyncCallbackInfo->userId = uid / Constants::BASE_USER_RANGE;
2638 {
2639 std::shared_lock<std::shared_mutex> lock(g_cacheMutex);
2640 auto item = cache.find(Query(
2641 asyncCallbackInfo->bundleName, GET_BUNDLE_INFO,
2642 asyncCallbackInfo->flags, asyncCallbackInfo->userId, env));
2643 if (item != cache.end()) {
2644 asyncCallbackInfo->isSavedInCache = true;
2645 APP_LOGD("GetBundleInfo param from cache");
2646 return;
2647 }
2648 }
2649 asyncCallbackInfo->err = InnerGetBundleInfoForSelf(
2650 asyncCallbackInfo->flags, asyncCallbackInfo->bundleInfo);
2651 }
2652
GetBundleInfo(napi_env env,napi_callback_info info)2653 napi_value GetBundleInfo(napi_env env, napi_callback_info info)
2654 {
2655 APP_LOGD("NAPI_GetBundleInfo called");
2656 NapiArg args(env, info);
2657 BundleInfoCallbackInfo *asyncCallbackInfo = new (std::nothrow) BundleInfoCallbackInfo(env);
2658 if (asyncCallbackInfo == nullptr) {
2659 APP_LOGE("asyncCallbackInfo is null.");
2660 return nullptr;
2661 }
2662 std::unique_ptr<BundleInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
2663 if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_FOUR)) {
2664 APP_LOGE("param count invalid.");
2665 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2666 return nullptr;
2667 }
2668 asyncCallbackInfo->uid = IPCSkeleton::GetCallingUid();
2669 asyncCallbackInfo->userId = asyncCallbackInfo->uid / Constants::BASE_USER_RANGE;
2670 if (args.GetMaxArgc() < ARGS_SIZE_TWO) {
2671 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2672 return nullptr;
2673 }
2674 for (size_t i = 0; i < args.GetMaxArgc(); i++) {
2675 napi_valuetype valueType = napi_undefined;
2676 napi_typeof(env, args[i], &valueType);
2677 if (i == ARGS_POS_ZERO) {
2678 if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->bundleName)) {
2679 APP_LOGE("appId %{public}s invalid!", asyncCallbackInfo->bundleName.c_str());
2680 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
2681 return nullptr;
2682 }
2683 } else if (i == ARGS_POS_ONE) {
2684 if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->flags)) {
2685 APP_LOGE("Flags %{public}d invalid!", asyncCallbackInfo->flags);
2686 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_FLAGS, TYPE_NUMBER);
2687 return nullptr;
2688 }
2689 } else if (i == ARGS_POS_TWO) {
2690 if (valueType == napi_function) {
2691 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
2692 break;
2693 }
2694 if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->userId)) {
2695 APP_LOGW("Parse userId failed, set this parameter to the caller userId!");
2696 }
2697 } else if (i == ARGS_POS_THREE) {
2698 if (valueType == napi_function) {
2699 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
2700 }
2701 break;
2702 } else {
2703 APP_LOGE("param check error");
2704 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
2705 return nullptr;
2706 }
2707 }
2708 auto promise = CommonFunc::AsyncCallNativeMethod<BundleInfoCallbackInfo>(
2709 env, asyncCallbackInfo, GET_BUNDLE_INFO, GetBundleInfoExec, GetBundleInfoComplete);
2710 callbackPtr.release();
2711 APP_LOGD("call NAPI_GetBundleInfo done.");
2712 return promise;
2713 }
2714
GetBundleInfosExec(napi_env env,void * data)2715 void GetBundleInfosExec(napi_env env, void *data)
2716 {
2717 BundleInfosCallbackInfo *asyncCallbackInfo = reinterpret_cast<BundleInfosCallbackInfo *>(data);
2718 if (asyncCallbackInfo == nullptr) {
2719 APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
2720 return;
2721 }
2722 asyncCallbackInfo->err = InnerGetBundleInfos(asyncCallbackInfo->flags,
2723 asyncCallbackInfo->userId, asyncCallbackInfo->bundleInfos);
2724 }
2725
GetBundleInfos(napi_env env,napi_callback_info info)2726 napi_value GetBundleInfos(napi_env env, napi_callback_info info)
2727 {
2728 APP_LOGD("NAPI_GetBundleInfos called");
2729 NapiArg args(env, info);
2730 BundleInfosCallbackInfo *asyncCallbackInfo = new (std::nothrow) BundleInfosCallbackInfo(env);
2731 if (asyncCallbackInfo == nullptr) {
2732 APP_LOGE("asyncCallbackInfo is null.");
2733 return nullptr;
2734 }
2735 std::unique_ptr<BundleInfosCallbackInfo> callbackPtr {asyncCallbackInfo};
2736 if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_THREE)) {
2737 APP_LOGE("param count invalid.");
2738 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2739 return nullptr;
2740 }
2741 asyncCallbackInfo->userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
2742 if (args.GetMaxArgc() < ARGS_SIZE_ONE) {
2743 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2744 return nullptr;
2745 }
2746 for (size_t i = 0; i < args.GetMaxArgc(); ++i) {
2747 napi_valuetype valueType = napi_undefined;
2748 napi_typeof(env, args[i], &valueType);
2749 if (i == ARGS_POS_ZERO) {
2750 if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->flags)) {
2751 APP_LOGE("Flags %{public}d invalid!", asyncCallbackInfo->flags);
2752 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_FLAGS, TYPE_NUMBER);
2753 return nullptr;
2754 }
2755 } else if (i == ARGS_POS_ONE) {
2756 if (valueType == napi_function) {
2757 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
2758 break;
2759 }
2760 if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->userId)) {
2761 APP_LOGW("Parse userId failed, set this parameter to the caller userId!");
2762 }
2763 } else if (i == ARGS_POS_TWO) {
2764 if (valueType == napi_function) {
2765 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
2766 break;
2767 }
2768 } else {
2769 APP_LOGE("param check error");
2770 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
2771 return nullptr;
2772 }
2773 }
2774 auto promise = CommonFunc::AsyncCallNativeMethod<BundleInfosCallbackInfo>(
2775 env, asyncCallbackInfo, GET_BUNDLE_INFOS, GetBundleInfosExec, GetBundleInfosComplete);
2776 callbackPtr.release();
2777 APP_LOGD("call NAPI_GetBundleInfos done.");
2778 return promise;
2779 }
2780
GetBundleInfoForSelf(napi_env env,napi_callback_info info)2781 napi_value GetBundleInfoForSelf(napi_env env, napi_callback_info info)
2782 {
2783 APP_LOGD("GetBundleInfoForSelf called");
2784 NapiArg args(env, info);
2785 BundleInfoCallbackInfo *asyncCallbackInfo = new (std::nothrow) BundleInfoCallbackInfo(env);
2786 if (asyncCallbackInfo == nullptr) {
2787 APP_LOGE("asyncCallbackInfo is null.");
2788 return nullptr;
2789 }
2790 std::unique_ptr<BundleInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
2791 if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_TWO)) {
2792 APP_LOGE("param count invalid.");
2793 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2794 return nullptr;
2795 }
2796 for (size_t i = 0; i < args.GetArgc(); ++i) {
2797 napi_valuetype valueType = napi_undefined;
2798 napi_typeof(env, args[i], &valueType);
2799 if (i == ARGS_POS_ZERO) {
2800 if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->flags)) {
2801 APP_LOGE("Flags invalid!");
2802 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_FLAGS, TYPE_NUMBER);
2803 return nullptr;
2804 }
2805 } else if (i == ARGS_POS_ONE) {
2806 if (valueType == napi_function) {
2807 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
2808 }
2809 } else {
2810 APP_LOGE("param check error");
2811 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
2812 return nullptr;
2813 }
2814 }
2815 auto promise = CommonFunc::AsyncCallNativeMethod<BundleInfoCallbackInfo>(
2816 env, asyncCallbackInfo, "GetBundleInfoForSelf", GetBundleInfoForSelfExec, GetBundleInfoComplete);
2817 callbackPtr.release();
2818 APP_LOGD("call GetBundleInfoForSelf done.");
2819 return promise;
2820 }
2821
InnerGetAllSharedBundleInfo(std::vector<SharedBundleInfo> & sharedBundles)2822 static ErrCode InnerGetAllSharedBundleInfo(std::vector<SharedBundleInfo> &sharedBundles)
2823 {
2824 auto iBundleMgr = CommonFunc::GetBundleMgr();
2825 if (iBundleMgr == nullptr) {
2826 APP_LOGE("iBundleMgr is null");
2827 return ERROR_BUNDLE_SERVICE_EXCEPTION;
2828 }
2829 ErrCode ret = iBundleMgr->GetAllSharedBundleInfo(sharedBundles);
2830 return CommonFunc::ConvertErrCode(ret);
2831 }
2832
GetAllSharedBundleInfoExec(napi_env env,void * data)2833 void GetAllSharedBundleInfoExec(napi_env env, void *data)
2834 {
2835 SharedBundleCallbackInfo *asyncCallbackInfo = reinterpret_cast<SharedBundleCallbackInfo *>(data);
2836 if (asyncCallbackInfo == nullptr) {
2837 APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
2838 return;
2839 }
2840 asyncCallbackInfo->err = InnerGetAllSharedBundleInfo(asyncCallbackInfo->sharedBundles);
2841 }
2842
GetAllSharedBundleInfoComplete(napi_env env,napi_status status,void * data)2843 void GetAllSharedBundleInfoComplete(napi_env env, napi_status status, void *data)
2844 {
2845 SharedBundleCallbackInfo *asyncCallbackInfo =
2846 reinterpret_cast<SharedBundleCallbackInfo *>(data);
2847 if (asyncCallbackInfo == nullptr) {
2848 APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
2849 return;
2850 }
2851 std::unique_ptr<SharedBundleCallbackInfo> callbackPtr {asyncCallbackInfo};
2852 napi_value result[CALLBACK_PARAM_SIZE] = {0};
2853 if (asyncCallbackInfo->err == NO_ERROR) {
2854 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
2855 NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &result[ARGS_POS_ONE]));
2856 CommonFunc::ConvertAllSharedBundleInfo(env, result[ARGS_POS_ONE], asyncCallbackInfo->sharedBundles);
2857 } else {
2858 result[ARGS_POS_ZERO] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
2859 GET_ALL_SHARED_BUNDLE_INFO, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
2860 }
2861 CommonFunc::NapiReturnDeferred<SharedBundleCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
2862 }
2863
GetAllSharedBundleInfo(napi_env env,napi_callback_info info)2864 napi_value GetAllSharedBundleInfo(napi_env env, napi_callback_info info)
2865 {
2866 APP_LOGD("NAPI_GetAllSharedBundleInfo called");
2867 NapiArg args(env, info);
2868 SharedBundleCallbackInfo *asyncCallbackInfo = new (std::nothrow) SharedBundleCallbackInfo(env);
2869 if (asyncCallbackInfo == nullptr) {
2870 APP_LOGE("asyncCallbackInfo is null.");
2871 return nullptr;
2872 }
2873 std::unique_ptr<SharedBundleCallbackInfo> callbackPtr {asyncCallbackInfo};
2874 if (!args.Init(ARGS_SIZE_ZERO, ARGS_SIZE_ONE)) {
2875 APP_LOGE("param count invalid.");
2876 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2877 return nullptr;
2878 }
2879 if (args.GetMaxArgc() < ARGS_SIZE_ZERO) {
2880 APP_LOGE("param count invalid.");
2881 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2882 return nullptr;
2883 }
2884 for (size_t i = 0; i < args.GetMaxArgc(); ++i) {
2885 napi_valuetype valueType = napi_undefined;
2886 napi_typeof(env, args[i], &valueType);
2887 if (i == ARGS_POS_ZERO) {
2888 if (valueType == napi_function) {
2889 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
2890 break;
2891 }
2892 } else {
2893 APP_LOGE("param check error");
2894 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
2895 return nullptr;
2896 }
2897 }
2898 auto promise = CommonFunc::AsyncCallNativeMethod<SharedBundleCallbackInfo>(env, asyncCallbackInfo,
2899 GET_ALL_SHARED_BUNDLE_INFO, GetAllSharedBundleInfoExec, GetAllSharedBundleInfoComplete);
2900 callbackPtr.release();
2901 APP_LOGD("call NAPI_GetAllSharedBundleInfo done.");
2902 return promise;
2903 }
2904
InnerGetSharedBundleInfo(const std::string & bundleName,const std::string & moduleName,std::vector<SharedBundleInfo> & sharedBundles)2905 static ErrCode InnerGetSharedBundleInfo(const std::string &bundleName, const std::string &moduleName,
2906 std::vector<SharedBundleInfo> &sharedBundles)
2907 {
2908 auto iBundleMgr = CommonFunc::GetBundleMgr();
2909 if (iBundleMgr == nullptr) {
2910 APP_LOGE("iBundleMgr is null");
2911 return ERROR_BUNDLE_SERVICE_EXCEPTION;
2912 }
2913 ErrCode ret = iBundleMgr->GetSharedBundleInfo(bundleName, moduleName, sharedBundles);
2914 return CommonFunc::ConvertErrCode(ret);
2915 }
2916
GetSharedBundleInfoExec(napi_env env,void * data)2917 void GetSharedBundleInfoExec(napi_env env, void *data)
2918 {
2919 SharedBundleCallbackInfo *asyncCallbackInfo = reinterpret_cast<SharedBundleCallbackInfo *>(data);
2920 if (asyncCallbackInfo == nullptr) {
2921 APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
2922 return;
2923 }
2924 asyncCallbackInfo->err = InnerGetSharedBundleInfo(asyncCallbackInfo->bundleName, asyncCallbackInfo->moduleName,
2925 asyncCallbackInfo->sharedBundles);
2926 }
2927
GetSharedBundleInfoComplete(napi_env env,napi_status status,void * data)2928 void GetSharedBundleInfoComplete(napi_env env, napi_status status, void *data)
2929 {
2930 SharedBundleCallbackInfo *asyncCallbackInfo =
2931 reinterpret_cast<SharedBundleCallbackInfo *>(data);
2932 if (asyncCallbackInfo == nullptr) {
2933 APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
2934 return;
2935 }
2936 std::unique_ptr<SharedBundleCallbackInfo> callbackPtr {asyncCallbackInfo};
2937 napi_value result[CALLBACK_PARAM_SIZE] = {0};
2938 if (asyncCallbackInfo->err == NO_ERROR) {
2939 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
2940 NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &result[ARGS_POS_ONE]));
2941 CommonFunc::ConvertAllSharedBundleInfo(env, result[ARGS_POS_ONE], asyncCallbackInfo->sharedBundles);
2942 } else {
2943 result[ARGS_POS_ZERO] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
2944 GET_SHARED_BUNDLE_INFO, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
2945 }
2946 CommonFunc::NapiReturnDeferred<SharedBundleCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
2947 }
2948
GetSharedBundleInfo(napi_env env,napi_callback_info info)2949 napi_value GetSharedBundleInfo(napi_env env, napi_callback_info info)
2950 {
2951 APP_LOGD("NAPI_GetSharedBundleInfo called");
2952 NapiArg args(env, info);
2953 SharedBundleCallbackInfo *asyncCallbackInfo = new (std::nothrow) SharedBundleCallbackInfo(env);
2954 if (asyncCallbackInfo == nullptr) {
2955 APP_LOGE("asyncCallbackInfo is null.");
2956 return nullptr;
2957 }
2958 std::unique_ptr<SharedBundleCallbackInfo> callbackPtr {asyncCallbackInfo};
2959 if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_THREE)) {
2960 APP_LOGE("param count invalid.");
2961 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2962 return nullptr;
2963 }
2964 if (args.GetMaxArgc() < ARGS_SIZE_TWO) {
2965 APP_LOGE("param count invalid.");
2966 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2967 return nullptr;
2968 }
2969
2970 for (size_t i = 0; i < args.GetMaxArgc(); i++) {
2971 napi_valuetype valueType = napi_undefined;
2972 napi_typeof(env, args[i], &valueType);
2973 if (i == ARGS_POS_ZERO) {
2974 if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->bundleName)) {
2975 APP_LOGE("appId %{public}s invalid!", asyncCallbackInfo->bundleName.c_str());
2976 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
2977 return nullptr;
2978 }
2979 } else if (i == ARGS_POS_ONE) {
2980 if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->moduleName)) {
2981 APP_LOGE("appId %{public}s invalid!", asyncCallbackInfo->moduleName.c_str());
2982 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, MODULE_NAME, TYPE_STRING);
2983 return nullptr;
2984 }
2985 } else if (i == ARGS_POS_TWO) {
2986 if (valueType == napi_function) {
2987 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
2988 break;
2989 }
2990 } else {
2991 APP_LOGE("param check error");
2992 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
2993 return nullptr;
2994 }
2995 }
2996
2997 auto promise = CommonFunc::AsyncCallNativeMethod<SharedBundleCallbackInfo>(env, asyncCallbackInfo,
2998 GET_SHARED_BUNDLE_INFO, GetSharedBundleInfoExec, GetSharedBundleInfoComplete);
2999 callbackPtr.release();
3000 APP_LOGD("call NAPI_GetSharedBundleInfo done.");
3001 return promise;
3002 }
3003
CreatePermissionGrantStateObject(napi_env env,napi_value value)3004 void CreatePermissionGrantStateObject(napi_env env, napi_value value)
3005 {
3006 napi_value nPermissionDenied;
3007 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, -1, &nPermissionDenied));
3008 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "PERMISSION_DENIED",
3009 nPermissionDenied));
3010
3011 napi_value nPermissionGranted;
3012 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, 0, &nPermissionGranted));
3013 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "PERMISSION_GRANTED",
3014 nPermissionGranted));
3015 }
3016
CreateAbilityTypeObject(napi_env env,napi_value value)3017 void CreateAbilityTypeObject(napi_env env, napi_value value)
3018 {
3019 napi_value nUnknow;
3020 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(AbilityType::UNKNOWN), &nUnknow));
3021 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "UNKNOWN", nUnknow));
3022 napi_value nPage;
3023 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(AbilityType::PAGE), &nPage));
3024 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "PAGE", nPage));
3025 napi_value nService;
3026 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(AbilityType::SERVICE), &nService));
3027 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SERVICE", nService));
3028 napi_value nData;
3029 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(AbilityType::DATA), &nData));
3030 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "DATA", nData));
3031 }
3032
CreateBundleTypeObject(napi_env env,napi_value value)3033 void CreateBundleTypeObject(napi_env env, napi_value value)
3034 {
3035 napi_value nApp;
3036 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(BundleType::APP), &nApp));
3037 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "APP", nApp));
3038 napi_value nAtomicService;
3039 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env,
3040 static_cast<int32_t>(BundleType::ATOMIC_SERVICE), &nAtomicService));
3041 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "ATOMIC_SERVICE", nAtomicService));
3042 }
3043
CreateDisplayOrientationObject(napi_env env,napi_value value)3044 void CreateDisplayOrientationObject(napi_env env, napi_value value)
3045 {
3046 napi_value nUnspecified;
3047 NAPI_CALL_RETURN_VOID(
3048 env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::UNSPECIFIED), &nUnspecified));
3049 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "UNSPECIFIED", nUnspecified));
3050 napi_value nLandscape;
3051 NAPI_CALL_RETURN_VOID(
3052 env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::LANDSCAPE), &nLandscape));
3053 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "LANDSCAPE", nLandscape));
3054 napi_value nPortrait;
3055 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::PORTRAIT), &nPortrait));
3056 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "PORTRAIT", nPortrait));
3057 napi_value nFollowrecent;
3058 NAPI_CALL_RETURN_VOID(
3059 env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::FOLLOWRECENT), &nFollowrecent));
3060 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "FOLLOW_RECENT", nFollowrecent));
3061 napi_value nReverseLandscape;
3062 NAPI_CALL_RETURN_VOID(
3063 env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::LANDSCAPE_INVERTED), &nReverseLandscape));
3064 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "LANDSCAPE_INVERTED", nReverseLandscape));
3065 napi_value nReversePortrait;
3066 NAPI_CALL_RETURN_VOID(
3067 env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::PORTRAIT_INVERTED), &nReversePortrait));
3068 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "PORTRAIT_INVERTED", nReversePortrait));
3069 napi_value nAutoRotation;
3070 NAPI_CALL_RETURN_VOID(
3071 env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::AUTO_ROTATION), &nAutoRotation));
3072 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "AUTO_ROTATION", nAutoRotation));
3073 napi_value nAutoRotationLandscape;
3074 NAPI_CALL_RETURN_VOID(
3075 env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::AUTO_ROTATION_LANDSCAPE),
3076 &nAutoRotationLandscape));
3077 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "AUTO_ROTATION_LANDSCAPE", nAutoRotationLandscape));
3078 napi_value nAutoRotationPortrait;
3079 NAPI_CALL_RETURN_VOID(
3080 env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::AUTO_ROTATION_PORTRAIT),
3081 &nAutoRotationPortrait));
3082 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "AUTO_ROTATION_PORTRAIT", nAutoRotationPortrait));
3083 napi_value nAutoRotationRestricted;
3084 NAPI_CALL_RETURN_VOID(
3085 env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::AUTO_ROTATION_RESTRICTED),
3086 &nAutoRotationRestricted));
3087 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "AUTO_ROTATION_RESTRICTED",
3088 nAutoRotationRestricted));
3089 napi_value nAutoRotationLandscapeRestricted;
3090 NAPI_CALL_RETURN_VOID(
3091 env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::AUTO_ROTATION_LANDSCAPE_RESTRICTED),
3092 &nAutoRotationLandscapeRestricted));
3093 NAPI_CALL_RETURN_VOID(env,
3094 napi_set_named_property(env, value, "AUTO_ROTATION_LANDSCAPE_RESTRICTED", nAutoRotationLandscapeRestricted));
3095 napi_value nAutoRotationPortraitRestricted;
3096 NAPI_CALL_RETURN_VOID(
3097 env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::AUTO_ROTATION_PORTRAIT_RESTRICTED),
3098 &nAutoRotationPortraitRestricted));
3099 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "AUTO_ROTATION_PORTRAIT_RESTRICTED",
3100 nAutoRotationPortraitRestricted));
3101 napi_value nLocked;
3102 NAPI_CALL_RETURN_VOID(
3103 env, napi_create_int32(env, static_cast<int32_t>(DisplayOrientation::LOCKED), &nLocked));
3104 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "LOCKED", nLocked));
3105 }
3106
CreateLaunchTypeObject(napi_env env,napi_value value)3107 void CreateLaunchTypeObject(napi_env env, napi_value value)
3108 {
3109 napi_value nSingleton;
3110 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(LaunchMode::SINGLETON), &nSingleton));
3111 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SINGLETON", nSingleton));
3112 napi_value nStandard;
3113 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(LaunchMode::STANDARD), &nStandard));
3114 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "STANDARD", nStandard));
3115 napi_value nMultiton;
3116 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(LaunchMode::STANDARD), &nMultiton));
3117 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "MULTITON", nMultiton));
3118 napi_value nSpecified;
3119 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(LaunchMode::SPECIFIED), &nSpecified));
3120 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SPECIFIED", nSpecified));
3121 }
3122
CreateSupportWindowModesObject(napi_env env,napi_value value)3123 void CreateSupportWindowModesObject(napi_env env, napi_value value)
3124 {
3125 napi_value nFullscreen;
3126 NAPI_CALL_RETURN_VOID(env,
3127 napi_create_int32(env, static_cast<int32_t>(SupportWindowMode::FULLSCREEN), &nFullscreen));
3128 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "FULL_SCREEN", nFullscreen));
3129
3130 napi_value nSplit;
3131 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(SupportWindowMode::SPLIT), &nSplit));
3132 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SPLIT", nSplit));
3133
3134 napi_value nFloat;
3135 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(SupportWindowMode::FLOATING), &nFloat));
3136 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "FLOATING", nFloat));
3137 }
3138
CreateModuleTypeObject(napi_env env,napi_value value)3139 void CreateModuleTypeObject(napi_env env, napi_value value)
3140 {
3141 napi_value nUnknown;
3142 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(ModuleType::UNKNOWN), &nUnknown));
3143 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "UNKNOWN", nUnknown));
3144
3145 napi_value nEntry;
3146 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(ModuleType::ENTRY), &nEntry));
3147 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "ENTRY", nEntry));
3148
3149 napi_value nFeature;
3150 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(ModuleType::FEATURE), &nFeature));
3151 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "FEATURE", nFeature));
3152
3153 napi_value nShared;
3154 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(ModuleType::SHARED), &nShared));
3155 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SHARED", nShared));
3156 }
3157
CreateCompatiblePolicyObject(napi_env env,napi_value value)3158 void CreateCompatiblePolicyObject(napi_env env, napi_value value)
3159 {
3160 napi_value nNORMAL;
3161 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(CompatiblePolicy::NORMAL), &nNORMAL));
3162 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "NORMAL", nNORMAL));
3163
3164 napi_value nBackwardCompatibility;
3165 NAPI_CALL_RETURN_VOID(env, napi_create_int32(
3166 env, static_cast<int32_t>(CompatiblePolicy::BACKWARD_COMPATIBILITY), &nBackwardCompatibility));
3167 NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "BACKWARD_COMPATIBILITY", nBackwardCompatibility));
3168 }
3169
InnerGetAppProvisionInfo(const std::string & bundleName,int32_t userId,AppProvisionInfo & appProvisionInfo)3170 ErrCode InnerGetAppProvisionInfo(
3171 const std::string &bundleName, int32_t userId, AppProvisionInfo &appProvisionInfo)
3172 {
3173 auto iBundleMgr = CommonFunc::GetBundleMgr();
3174 if (iBundleMgr == nullptr) {
3175 APP_LOGE("iBundleMgr is null");
3176 return ERROR_BUNDLE_SERVICE_EXCEPTION;
3177 }
3178 ErrCode ret = iBundleMgr->GetAppProvisionInfo(bundleName, userId, appProvisionInfo);
3179 return CommonFunc::ConvertErrCode(ret);
3180 }
3181
GetAppProvisionInfoExec(napi_env env,void * data)3182 void GetAppProvisionInfoExec(napi_env env, void *data)
3183 {
3184 AppProvisionInfoCallbackInfo *asyncCallbackInfo = reinterpret_cast<AppProvisionInfoCallbackInfo *>(data);
3185 if (asyncCallbackInfo == nullptr) {
3186 APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
3187 return;
3188 }
3189 if (asyncCallbackInfo->err == NO_ERROR) {
3190 asyncCallbackInfo->err = InnerGetAppProvisionInfo(
3191 asyncCallbackInfo->bundleName, asyncCallbackInfo->userId, asyncCallbackInfo->appProvisionInfo);
3192 }
3193 }
3194
GetAppProvisionInfoComplete(napi_env env,napi_status status,void * data)3195 void GetAppProvisionInfoComplete(napi_env env, napi_status status, void *data)
3196 {
3197 AppProvisionInfoCallbackInfo *asyncCallbackInfo =
3198 reinterpret_cast<AppProvisionInfoCallbackInfo *>(data);
3199 if (asyncCallbackInfo == nullptr) {
3200 APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
3201 return;
3202 }
3203 std::unique_ptr<AppProvisionInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
3204 napi_value result[CALLBACK_PARAM_SIZE] = {0};
3205 if (asyncCallbackInfo->err == NO_ERROR) {
3206 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_POS_ZERO]));
3207 NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &result[ARGS_POS_ONE]));
3208 CommonFunc::ConvertAppProvisionInfo(env, asyncCallbackInfo->appProvisionInfo, result[ARGS_POS_ONE]);
3209 } else {
3210 result[ARGS_POS_ZERO] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
3211 GET_APP_PROVISION_INFO, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
3212 }
3213 CommonFunc::NapiReturnDeferred<AppProvisionInfoCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
3214 }
3215
GetAppProvisionInfo(napi_env env,napi_callback_info info)3216 napi_value GetAppProvisionInfo(napi_env env, napi_callback_info info)
3217 {
3218 APP_LOGD("napi GetAppProvisionInfo called");
3219 NapiArg args(env, info);
3220 AppProvisionInfoCallbackInfo *asyncCallbackInfo = new (std::nothrow) AppProvisionInfoCallbackInfo(env);
3221 if (asyncCallbackInfo == nullptr) {
3222 APP_LOGE("asyncCallbackInfo is null.");
3223 return nullptr;
3224 }
3225 std::unique_ptr<AppProvisionInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
3226 if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_THREE)) {
3227 APP_LOGE("param count invalid.");
3228 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
3229 return nullptr;
3230 }
3231 asyncCallbackInfo->userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
3232 for (size_t i = 0; i < args.GetArgc(); ++i) {
3233 napi_valuetype valueType = napi_undefined;
3234 napi_typeof(env, args[i], &valueType);
3235 if (i == ARGS_POS_ZERO) {
3236 if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->bundleName)) {
3237 APP_LOGE("bundleName invalid!");
3238 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
3239 return nullptr;
3240 }
3241 } else if (i == ARGS_POS_ONE) {
3242 if (valueType == napi_function) {
3243 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
3244 break;
3245 }
3246 if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->userId)) {
3247 APP_LOGW("parse userId failed, set this parameter to the caller userId.");
3248 }
3249 } else if (i == ARGS_POS_TWO) {
3250 if (valueType == napi_function) {
3251 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
3252 break;
3253 }
3254 } else {
3255 APP_LOGE("param check error");
3256 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
3257 return nullptr;
3258 }
3259 }
3260
3261 auto promise = CommonFunc::AsyncCallNativeMethod<AppProvisionInfoCallbackInfo>(
3262 env, asyncCallbackInfo, GET_APP_PROVISION_INFO, GetAppProvisionInfoExec, GetAppProvisionInfoComplete);
3263 callbackPtr.release();
3264 APP_LOGD("call GetAppProvisionInfo done.");
3265 return promise;
3266 }
3267
GetSpecifiedDistributionType(napi_env env,napi_callback_info info)3268 napi_value GetSpecifiedDistributionType(napi_env env, napi_callback_info info)
3269 {
3270 APP_LOGD("GetSpecifiedDistributionType napi called");
3271 NapiArg args(env, info);
3272 if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_ONE)) {
3273 APP_LOGE("param count invalid.");
3274 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
3275 return nullptr;
3276 }
3277
3278 std::string bundleName;
3279 if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], bundleName)) {
3280 APP_LOGE("bundleName invalid!");
3281 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
3282 return nullptr;
3283 }
3284
3285 auto iBundleMgr = CommonFunc::GetBundleMgr();
3286 if (iBundleMgr == nullptr) {
3287 APP_LOGE("iBundleMgr is null");
3288 napi_value businessError = BusinessError::CreateCommonError(
3289 env, ERROR_BUNDLE_SERVICE_EXCEPTION, RESOURCE_NAME_OF_GET_SPECIFIED_DISTRIBUTION_TYPE,
3290 Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
3291 napi_throw(env, businessError);
3292 return nullptr;
3293 }
3294
3295 std::string specifiedDistributionType;
3296 ErrCode ret = CommonFunc::ConvertErrCode(
3297 iBundleMgr->GetSpecifiedDistributionType(bundleName, specifiedDistributionType));
3298 if (ret != SUCCESS) {
3299 napi_value businessError = BusinessError::CreateCommonError(
3300 env, ret, RESOURCE_NAME_OF_GET_SPECIFIED_DISTRIBUTION_TYPE,
3301 Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
3302 napi_throw(env, businessError);
3303 return nullptr;
3304 }
3305
3306 napi_value nSpecifiedDistributionType;
3307 napi_create_string_utf8(env, specifiedDistributionType.c_str(), NAPI_AUTO_LENGTH, &nSpecifiedDistributionType);
3308 APP_LOGD("call GetSpecifiedDistributionType done.");
3309 return nSpecifiedDistributionType;
3310 }
3311
GetAdditionalInfo(napi_env env,napi_callback_info info)3312 napi_value GetAdditionalInfo(napi_env env, napi_callback_info info)
3313 {
3314 APP_LOGD("GetAdditionalInfo napi called");
3315 NapiArg args(env, info);
3316 if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_ONE)) {
3317 APP_LOGE("param count invalid.");
3318 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
3319 return nullptr;
3320 }
3321
3322 std::string bundleName;
3323 if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], bundleName)) {
3324 APP_LOGE("bundleName invalid!");
3325 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
3326 return nullptr;
3327 }
3328
3329 auto iBundleMgr = CommonFunc::GetBundleMgr();
3330 if (iBundleMgr == nullptr) {
3331 APP_LOGE("iBundleMgr is null");
3332 napi_value businessError = BusinessError::CreateCommonError(
3333 env, ERROR_BUNDLE_SERVICE_EXCEPTION, RESOURCE_NAME_OF_GET_SPECIFIED_DISTRIBUTION_TYPE,
3334 Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
3335 napi_throw(env, businessError);
3336 return nullptr;
3337 }
3338
3339 std::string additionalInfo;
3340 ErrCode ret = CommonFunc::ConvertErrCode(
3341 iBundleMgr->GetAdditionalInfo(bundleName, additionalInfo));
3342 if (ret != SUCCESS) {
3343 napi_value businessError = BusinessError::CreateCommonError(
3344 env, ret, RESOURCE_NAME_OF_GET_ADDITIONAL_INFO, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
3345 napi_throw(env, businessError);
3346 return nullptr;
3347 }
3348
3349 napi_value nAdditionalInfo;
3350 napi_create_string_utf8(env, additionalInfo.c_str(), NAPI_AUTO_LENGTH, &nAdditionalInfo);
3351 APP_LOGD("call GetAdditionalInfo done.");
3352 return nAdditionalInfo;
3353 }
3354
GetBundleInfoForSelfSync(napi_env env,napi_callback_info info)3355 napi_value GetBundleInfoForSelfSync(napi_env env, napi_callback_info info)
3356 {
3357 APP_LOGD("GetBundleInfoForSelfSync called");
3358 NapiArg args(env, info);
3359 if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_ONE)) {
3360 APP_LOGE("param count invalid");
3361 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
3362 return nullptr;
3363 }
3364 int32_t flags = 0;
3365 if (!CommonFunc::ParseInt(env, args[ARGS_POS_ZERO], flags)) {
3366 APP_LOGE("parseInt invalid!");
3367 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_FLAGS, TYPE_NUMBER);
3368 return nullptr;
3369 }
3370 auto iBundleMgr = CommonFunc::GetBundleMgr();
3371 if (iBundleMgr == nullptr) {
3372 APP_LOGE("BundleMgr is null");
3373 return nullptr;
3374 }
3375 std::string bundleName;
3376 auto uid = IPCSkeleton::GetCallingUid();
3377 bundleName = std::to_string(uid);
3378 int32_t userId = uid / Constants::BASE_USER_RANGE;
3379 napi_value nBundleInfo = nullptr;
3380 {
3381 std::shared_lock<std::shared_mutex> lock(g_cacheMutex);
3382 auto item = cache.find(Query(bundleName, GET_BUNDLE_INFO, flags, userId, env));
3383 if (item != cache.end()) {
3384 APP_LOGD("GetBundleInfo param from cache");
3385 NAPI_CALL(env,
3386 napi_get_reference_value(env, item->second, &nBundleInfo));
3387 return nBundleInfo;
3388 }
3389 }
3390 BundleInfo bundleInfo;
3391 ErrCode ret = CommonFunc::ConvertErrCode(iBundleMgr->GetBundleInfoForSelf(flags, bundleInfo));
3392 if (ret != NO_ERROR) {
3393 APP_LOGE("GetBundleInfoForSelfSync failed");
3394 napi_value businessError = BusinessError::CreateCommonError(
3395 env, ret, GET_BUNDLE_INFO_FOR_SELF_SYNC, BUNDLE_PERMISSIONS);
3396 napi_throw(env, businessError);
3397 return nullptr;
3398 }
3399 NAPI_CALL(env, napi_create_object(env, &nBundleInfo));
3400 CommonFunc::ConvertBundleInfo(env, bundleInfo, nBundleInfo, flags);
3401 Query query(bundleName, GET_BUNDLE_INFO, flags, userId, env);
3402 CheckToCache(env, bundleInfo.uid, IPCSkeleton::GetCallingUid(), query, nBundleInfo);
3403 return nBundleInfo;
3404 }
3405 }
3406 }