• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
16 #include <unordered_map>
17 
18 #include "installer.h"
19 
20 #include "appexecfwk_errors.h"
21 #include "app_log_wrapper.h"
22 #include "bundle_errors.h"
23 #include "bundle_death_recipient.h"
24 #include "bundle_mgr_interface.h"
25 #include "bundle_mgr_proxy.h"
26 #include "business_error.h"
27 #include "common_func.h"
28 #include "if_system_ability_manager.h"
29 #include "installer_callback.h"
30 #include "napi_arg.h"
31 #include "napi_constants.h"
32 #include "system_ability_definition.h"
33 #include "ipc_skeleton.h"
34 
35 namespace OHOS {
36 namespace AppExecFwk {
37 namespace {
38 // resource name
39 const char* RESOURCE_NAME_OF_GET_BUNDLE_INSTALLER = "GetBundleInstaller";
40 const char* RESOURCE_NAME_OF_GET_BUNDLE_INSTALLER_SYNC = "GetBundleInstallerSync";
41 const char* RESOURCE_NAME_OF_INSTALL = "Install";
42 const char* RESOURCE_NAME_OF_UNINSTALL = "Uninstall";
43 const char* RESOURCE_NAME_OF_RECOVER = "Recover";
44 const char* RESOURCE_NAME_OF_UPDATE_BUNDLE_FOR_SELF = "UpdateBundleForSelf";
45 const char* RESOURCE_NAME_OF_UNINSTALL_AND_RECOVER = "UninstallAndRecover";
46 const char* EMPTY_STRING = "";
47 // install message
48 constexpr const char* INSTALL_PERMISSION =
49     "ohos.permission.INSTALL_BUNDLE or "
50     "ohos.permission.INSTALL_ENTERPRISE_BUNDLE or "
51     "ohos.permission.INSTALL_ENTERPRISE_MDM_BUNDLE or "
52     "ohos.permission.INSTALL_ENTERPRISE_NORMAL_BUNDLE or"
53     "ohos.permission.INSTALL_INTERNALTESTING_BUNDLE";
54 constexpr const char* UNINSTALL_PERMISSION = "ohos.permission.INSTALL_BUNDLE or ohos.permission.UNINSTALL_BUNDLE";
55 constexpr const char* RECOVER_PERMISSION = "ohos.permission.INSTALL_BUNDLE or ohos.permission.RECOVER_BUNDLE";
56 constexpr const char* INSTALL_SELF_PERMISSION = "ohos.permission.INSTALL_SELF_BUNDLE";
57 constexpr const char* PARAMETERS = "parameters";
58 constexpr const char* CORRESPONDING_TYPE = "corresponding type";
59 constexpr const char* FUNCTION_TYPE = "napi_function";
60 constexpr const char* CALLBACK = "callback";
61 // property name
62 const char* USER_ID = "userId";
63 const char* INSTALL_FLAG = "installFlag";
64 const char* IS_KEEP_DATA = "isKeepData";
65 const char* CROWD_TEST_DEADLINE = "crowdtestDeadline";
66 const char* MODULE_NAME = "moduleName";
67 const char* HASH_VALUE = "hashValue";
68 const char* HASH_PARAMS = "hashParams";
69 const char* BUNDLE_NAME = "bundleName";
70 const char* APP_INDEX = "appIndex";
71 const char* FILE_PATH = "filePath";
72 const char* ADD_EXT_RESOURCE = "AddExtResource";
73 const char* REMOVE_EXT_RESOURCE = "RemoveExtResource";
74 const char* VERSION_CODE = "versionCode";
75 const char* SHARED_BUNDLE_DIR_PATHS = "sharedBundleDirPaths";
76 const char* SPECIFIED_DISTRIBUTION_TYPE = "specifiedDistributionType";
77 const char* ADDITIONAL_INFO = "additionalInfo";
78 const char* VERIFY_CODE_PARAM = "verifyCodeParams";
79 const char* SIGNATURE_FILE_PATH = "signatureFilePath";
80 const char* PGO_PARAM = "pgoParams";
81 const char* PGO_FILE_PATH = "pgoFilePath";
82 const char* KEY = "key";
83 const char* VALUE = "value";
84 const char* HAPS_FILE_NEEDED =
85     "BusinessError 401: Parameter error. parameter hapFiles is needed for code signature";
86 const char* CREATE_APP_CLONE = "CreateAppClone";
87 const char* DESTROY_APP_CLONE = "destroyAppClone";
88 const char* INSTALL_PREEXISTING_APP = "installPreexistingApp";
89 constexpr int32_t FIRST_PARAM = 0;
90 constexpr int32_t SECOND_PARAM = 1;
91 
92 constexpr int32_t SPECIFIED_DISTRIBUTION_TYPE_MAX_SIZE = 128;
93 constexpr int32_t ADDITIONAL_INFO_MAX_SIZE = 3000;
94 constexpr int32_t ILLEGAL_APP_INDEX = -1;
95 } // namespace
96 napi_ref thread_local g_classBundleInstaller;
97 bool g_isSystemApp = false;
98 
~AsyncInstallCallbackInfo()99 AsyncInstallCallbackInfo::~AsyncInstallCallbackInfo()
100 {
101     if (callback) {
102         napi_delete_reference(env, callback);
103         callback = nullptr;
104     }
105     if (asyncWork) {
106         napi_delete_async_work(env, asyncWork);
107         asyncWork = nullptr;
108     }
109 }
110 
~AsyncGetBundleInstallerCallbackInfo()111 AsyncGetBundleInstallerCallbackInfo::~AsyncGetBundleInstallerCallbackInfo()
112 {
113     if (callback) {
114         napi_delete_reference(env, callback);
115         callback = nullptr;
116     }
117     if (asyncWork) {
118         napi_delete_async_work(env, asyncWork);
119         asyncWork = nullptr;
120     }
121 }
122 
GetBundleInstallerCompleted(napi_env env,napi_status status,void * data)123 void GetBundleInstallerCompleted(napi_env env, napi_status status, void *data)
124 {
125     AsyncGetBundleInstallerCallbackInfo *asyncCallbackInfo =
126         reinterpret_cast<AsyncGetBundleInstallerCallbackInfo *>(data);
127     std::unique_ptr<AsyncGetBundleInstallerCallbackInfo> callbackPtr {asyncCallbackInfo};
128 
129     napi_value m_classBundleInstaller = nullptr;
130     NAPI_CALL_RETURN_VOID(env, napi_get_reference_value(env, g_classBundleInstaller,
131         &m_classBundleInstaller));
132     napi_value result[CALLBACK_PARAM_SIZE] = {0};
133     auto iBundleMgr = CommonFunc::GetBundleMgr();
134     if (iBundleMgr == nullptr) {
135         APP_LOGE("can not get iBundleMgr");
136         return;
137     }
138     if (!g_isSystemApp && !iBundleMgr->VerifySystemApi(Constants::INVALID_API_VERSION)) {
139         APP_LOGE("non-system app calling system api");
140         result[0] = BusinessError::CreateCommonError(
141             env, ERROR_NOT_SYSTEM_APP, RESOURCE_NAME_OF_GET_BUNDLE_INSTALLER, INSTALL_PERMISSION);
142         if (callbackPtr->deferred) {
143             NAPI_CALL_RETURN_VOID(env, napi_reject_deferred(env, asyncCallbackInfo->deferred, result[0]));
144         } else {
145             napi_value callback = nullptr;
146             napi_value placeHolder = nullptr;
147             NAPI_CALL_RETURN_VOID(env, napi_get_reference_value(env, asyncCallbackInfo->callback, &callback));
148             NAPI_CALL_RETURN_VOID(env, napi_call_function(env, nullptr, callback,
149                 sizeof(result) / sizeof(result[0]), result, &placeHolder));
150         }
151         return;
152     }
153     g_isSystemApp = true;
154     NAPI_CALL_RETURN_VOID(env, napi_new_instance(env, m_classBundleInstaller, 0, nullptr, &result[SECOND_PARAM]));
155 
156     if (callbackPtr->deferred) {
157         NAPI_CALL_RETURN_VOID(env, napi_resolve_deferred(env, callbackPtr->deferred, result[SECOND_PARAM]));
158     } else {
159         napi_value callback = CommonFunc::WrapVoidToJS(env);
160         NAPI_CALL_RETURN_VOID(env, napi_get_reference_value(env, callbackPtr->callback, &callback));
161         napi_value undefined = CommonFunc::WrapVoidToJS(env);
162         NAPI_CALL_RETURN_VOID(env, napi_get_undefined(env, &undefined));
163         napi_value callResult = CommonFunc::WrapVoidToJS(env);
164         NAPI_CALL_RETURN_VOID(env, napi_call_function(env, undefined, callback, CALLBACK_PARAM_SIZE,
165             &result[FIRST_PARAM], &callResult));
166     }
167 }
168 
169 /**
170  * Promise and async callback
171  */
GetBundleInstaller(napi_env env,napi_callback_info info)172 napi_value GetBundleInstaller(napi_env env, napi_callback_info info)
173 {
174     APP_LOGI_NOFUNC("napi GetBundleInstaller called");
175     NapiArg args(env, info);
176     if (!args.Init(FIRST_PARAM, SECOND_PARAM)) {
177         APP_LOGE("GetBundleInstaller args init failed");
178         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
179         return nullptr;
180     }
181     std::unique_ptr<AsyncGetBundleInstallerCallbackInfo> callbackPtr =
182         std::make_unique<AsyncGetBundleInstallerCallbackInfo>(env);
183 
184     auto argc = args.GetMaxArgc();
185     APP_LOGD("GetBundleInstaller argc = [%{public}zu]", argc);
186     // check param
187     if (argc == SECOND_PARAM) {
188         napi_value arg = args.GetArgv(argc - SECOND_PARAM);
189         if (arg == nullptr) {
190             APP_LOGE("the param is nullptr");
191             BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
192             return nullptr;
193         }
194         napi_valuetype valuetype = napi_undefined;
195         NAPI_CALL(env, napi_typeof(env, arg, &valuetype));
196         if (valuetype != napi_function) {
197             APP_LOGE("the param type is invalid");
198             BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, CALLBACK, FUNCTION_TYPE);
199             return nullptr;
200         }
201         NAPI_CALL(env, napi_create_reference(env, arg, NAPI_RETURN_ONE, &callbackPtr->callback));
202     }
203 
204     auto executeFunc = [](napi_env env, void *data) {};
205     napi_value promise = CommonFunc::AsyncCallNativeMethod(
206         env,
207         callbackPtr.get(),
208         RESOURCE_NAME_OF_GET_BUNDLE_INSTALLER,
209         executeFunc,
210         GetBundleInstallerCompleted);
211     callbackPtr.release();
212     APP_LOGI_NOFUNC("call GetBundleInstaller done");
213     return promise;
214 }
215 
GetBundleInstallerSync(napi_env env,napi_callback_info info)216 napi_value GetBundleInstallerSync(napi_env env, napi_callback_info info)
217 {
218     APP_LOGI("NAPI GetBundleInstallerSync called");
219     napi_value m_classBundleInstaller = nullptr;
220     NAPI_CALL(env, napi_get_reference_value(env, g_classBundleInstaller,
221         &m_classBundleInstaller));
222     auto iBundleMgr = CommonFunc::GetBundleMgr();
223     if (iBundleMgr == nullptr) {
224         APP_LOGE("can not get iBundleMgr");
225         return nullptr;
226     }
227     if (!g_isSystemApp && !iBundleMgr->VerifySystemApi(Constants::INVALID_API_VERSION)) {
228         APP_LOGE("non-system app calling system api");
229         napi_value businessError = BusinessError::CreateCommonError(
230             env, ERROR_NOT_SYSTEM_APP, RESOURCE_NAME_OF_GET_BUNDLE_INSTALLER_SYNC, INSTALL_PERMISSION);
231         napi_throw(env, businessError);
232         return nullptr;
233     }
234     g_isSystemApp = true;
235     napi_value nBundleInstaller = nullptr;
236     NAPI_CALL(env, napi_new_instance(env, m_classBundleInstaller, 0, nullptr, &nBundleInstaller));
237     APP_LOGD("call GetBundleInstallerSync done");
238     return nBundleInstaller;
239     APP_LOGI("call GetBundleInstallerSync done");
240 }
241 
CreateErrCodeMap(std::unordered_map<int32_t,int32_t> & errCodeMap)242 static void CreateErrCodeMap(std::unordered_map<int32_t, int32_t> &errCodeMap)
243 {
244     errCodeMap = {
245         { IStatusReceiver::SUCCESS, SUCCESS},
246         { IStatusReceiver::ERR_INSTALL_INTERNAL_ERROR, ERROR_BUNDLE_SERVICE_EXCEPTION },
247         { IStatusReceiver::ERR_INSTALL_HOST_INSTALLER_FAILED, ERROR_BUNDLE_SERVICE_EXCEPTION },
248         { IStatusReceiver::ERR_INSTALLD_PARAM_ERROR, ERROR_BUNDLE_SERVICE_EXCEPTION },
249         { IStatusReceiver::ERR_INSTALLD_GET_PROXY_ERROR, ERROR_BUNDLE_SERVICE_EXCEPTION },
250         { IStatusReceiver::ERR_INSTALL_INSTALLD_SERVICE_ERROR, ERROR_BUNDLE_SERVICE_EXCEPTION },
251         { IStatusReceiver::ERR_UNINSTALL_BUNDLE_MGR_SERVICE_ERROR, ERROR_BUNDLE_SERVICE_EXCEPTION },
252         { IStatusReceiver::ERR_FAILED_SERVICE_DIED, ERROR_BUNDLE_SERVICE_EXCEPTION },
253         { IStatusReceiver::ERR_FAILED_GET_INSTALLER_PROXY, ERROR_BUNDLE_SERVICE_EXCEPTION },
254         { IStatusReceiver::ERR_USER_CREATE_FAILED, ERROR_BUNDLE_SERVICE_EXCEPTION },
255         { IStatusReceiver::ERR_USER_REMOVE_FAILED, ERROR_BUNDLE_SERVICE_EXCEPTION },
256         { IStatusReceiver::ERR_UNINSTALL_KILLING_APP_ERROR, ERROR_BUNDLE_SERVICE_EXCEPTION },
257         { IStatusReceiver::ERR_INSTALL_GENERATE_UID_ERROR, ERROR_BUNDLE_SERVICE_EXCEPTION },
258         { IStatusReceiver::ERR_INSTALL_STATE_ERROR, ERROR_BUNDLE_SERVICE_EXCEPTION },
259         { IStatusReceiver::ERR_RECOVER_NOT_ALLOWED, ERROR_BUNDLE_SERVICE_EXCEPTION },
260         { IStatusReceiver::ERR_RECOVER_GET_BUNDLEPATH_ERROR, ERROR_BUNDLE_SERVICE_EXCEPTION },
261         { IStatusReceiver::ERR_UNINSTALL_AND_RECOVER_NOT_PREINSTALLED_BUNDLE, ERROR_BUNDLE_NOT_PREINSTALLED },
262         { IStatusReceiver::ERR_UNINSTALL_SYSTEM_APP_ERROR, ERROR_UNINSTALL_PREINSTALL_APP_FAILED },
263         { IStatusReceiver::ERR_INSTALL_PARSE_FAILED, ERROR_INSTALL_PARSE_FAILED },
264         { IStatusReceiver::ERR_INSTALL_PARSE_UNEXPECTED, ERROR_INSTALL_PARSE_FAILED },
265         { IStatusReceiver::ERR_INSTALL_PARSE_MISSING_BUNDLE, ERROR_INSTALL_PARSE_FAILED },
266         { IStatusReceiver::ERR_INSTALL_PARSE_NO_PROFILE, ERROR_INSTALL_PARSE_FAILED },
267         { IStatusReceiver::ERR_INSTALL_PARSE_BAD_PROFILE, ERROR_INSTALL_PARSE_FAILED },
268         { IStatusReceiver::ERR_INSTALL_PARSE_PROFILE_PROP_TYPE_ERROR, ERROR_INSTALL_PARSE_FAILED },
269         { IStatusReceiver::ERR_INSTALL_PARSE_PROFILE_MISSING_PROP, ERROR_INSTALL_PARSE_FAILED },
270         { IStatusReceiver::ERR_INSTALL_PARSE_PERMISSION_ERROR, ERROR_INSTALL_PARSE_FAILED },
271         { IStatusReceiver::ERR_INSTALL_PARSE_PROFILE_PROP_CHECK_ERROR, ERROR_INSTALL_PARSE_FAILED },
272         { IStatusReceiver::ERR_INSTALL_PARSE_RPCID_FAILED, ERROR_INSTALL_PARSE_FAILED },
273         { IStatusReceiver::ERR_INSTALL_PARSE_NATIVE_SO_FAILED, ERROR_INSTALL_PARSE_FAILED },
274         { IStatusReceiver::ERR_INSTALL_PARSE_AN_FAILED, ERROR_INSTALL_PARSE_FAILED },
275         { IStatusReceiver::ERR_INSTALL_PARSE_MISSING_ABILITY, ERROR_INSTALL_PARSE_FAILED },
276         { IStatusReceiver::ERR_INSTALL_FAILED_PROFILE_PARSE_FAIL, ERROR_INSTALL_PARSE_FAILED },
277         { IStatusReceiver::ERR_INSTALL_VERIFICATION_FAILED, ERROR_INSTALL_VERIFY_SIGNATURE_FAILED },
278         { IStatusReceiver::ERR_INSTALL_FAILED_INCOMPATIBLE_SIGNATURE, ERROR_INSTALL_VERIFY_SIGNATURE_FAILED },
279         { IStatusReceiver::ERR_INSTALL_FAILED_INVALID_SIGNATURE_FILE_PATH, ERROR_INSTALL_VERIFY_SIGNATURE_FAILED },
280         { IStatusReceiver::ERR_INSTALL_FAILED_BAD_BUNDLE_SIGNATURE_FILE, ERROR_INSTALL_VERIFY_SIGNATURE_FAILED },
281         { IStatusReceiver::ERR_INSTALL_FAILED_NO_BUNDLE_SIGNATURE, ERROR_INSTALL_VERIFY_SIGNATURE_FAILED },
282         { IStatusReceiver::ERR_INSTALL_FAILED_VERIFY_APP_PKCS7_FAIL, ERROR_INSTALL_VERIFY_SIGNATURE_FAILED },
283         { IStatusReceiver::ERR_INSTALL_FAILED_APP_SOURCE_NOT_TRUESTED, ERROR_INSTALL_VERIFY_SIGNATURE_FAILED },
284         { IStatusReceiver::ERR_INSTALL_FAILED_BAD_DIGEST, ERROR_INSTALL_VERIFY_SIGNATURE_FAILED },
285         { IStatusReceiver::ERR_INSTALL_FAILED_BUNDLE_INTEGRITY_VERIFICATION_FAILURE,
286             ERROR_INSTALL_VERIFY_SIGNATURE_FAILED },
287         { IStatusReceiver::ERR_INSTALL_FAILED_BAD_PUBLICKEY, ERROR_INSTALL_VERIFY_SIGNATURE_FAILED },
288         { IStatusReceiver::ERR_INSTALL_FAILED_BAD_BUNDLE_SIGNATURE, ERROR_INSTALL_VERIFY_SIGNATURE_FAILED },
289         { IStatusReceiver::ERR_INSTALL_FAILED_NO_PROFILE_BLOCK_FAIL, ERROR_INSTALL_VERIFY_SIGNATURE_FAILED },
290         { IStatusReceiver::ERR_INSTALL_FAILED_BUNDLE_SIGNATURE_VERIFICATION_FAILURE,
291             ERROR_INSTALL_VERIFY_SIGNATURE_FAILED },
292         { IStatusReceiver::ERR_INSTALL_FAILED_VERIFY_SOURCE_INIT_FAIL, ERROR_INSTALL_VERIFY_SIGNATURE_FAILED },
293         { IStatusReceiver::ERR_INSTALL_SINGLETON_INCOMPATIBLE, ERROR_INSTALL_VERIFY_SIGNATURE_FAILED },
294         { IStatusReceiver::ERR_INSTALL_FAILED_INCONSISTENT_SIGNATURE, ERROR_INSTALL_FAILED_INCONSISTENT_SIGNATURE },
295         { IStatusReceiver::ERR_INSTALL_PARAM_ERROR, ERROR_BUNDLE_NOT_EXIST },
296         { IStatusReceiver::ERR_UNINSTALL_PARAM_ERROR, ERROR_BUNDLE_NOT_EXIST },
297         { IStatusReceiver::ERR_RECOVER_INVALID_BUNDLE_NAME, ERROR_BUNDLE_NOT_EXIST },
298         { IStatusReceiver::ERR_UNINSTALL_INVALID_NAME, ERROR_BUNDLE_NOT_EXIST },
299         { IStatusReceiver::ERR_INSTALL_INVALID_BUNDLE_FILE, ERROR_INSTALL_HAP_FILEPATH_INVALID },
300         { IStatusReceiver::ERR_INSTALL_FAILED_MODULE_NAME_EMPTY, ERROR_MODULE_NOT_EXIST },
301         { IStatusReceiver::ERR_INSTALL_FAILED_MODULE_NAME_DUPLICATE, ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
302         { IStatusReceiver::ERR_INSTALL_FAILED_CHECK_HAP_HASH_PARAM, ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
303         { IStatusReceiver::ERR_UNINSTALL_MISSING_INSTALLED_BUNDLE, ERROR_BUNDLE_NOT_EXIST },
304         { IStatusReceiver::ERR_UNINSTALL_MISSING_INSTALLED_MODULE, ERROR_MODULE_NOT_EXIST },
305         { IStatusReceiver::ERR_USER_NOT_INSTALL_HAP, ERROR_BUNDLE_NOT_EXIST },
306         { IStatusReceiver::ERR_INSTALL_FILE_PATH_INVALID, ERROR_INSTALL_HAP_FILEPATH_INVALID },
307         { IStatusReceiver::ERR_INSTALL_PERMISSION_DENIED, ERROR_PERMISSION_DENIED_ERROR },
308         { IStatusReceiver::ERR_UNINSTALL_PERMISSION_DENIED, ERROR_PERMISSION_DENIED_ERROR },
309         { IStatusReceiver::ERR_INSTALL_GRANT_REQUEST_PERMISSIONS_FAILED, ERROR_INSTALL_PERMISSION_CHECK_ERROR },
310         { IStatusReceiver::ERR_INSTALL_UPDATE_HAP_TOKEN_FAILED, ERROR_INSTALL_PERMISSION_CHECK_ERROR },
311         { IStatusReceiver::ERR_INSTALLD_CREATE_DIR_FAILED, ERROR_BUNDLE_SERVICE_EXCEPTION },
312         { IStatusReceiver::ERR_INSTALLD_CHOWN_FAILED, ERROR_BUNDLE_SERVICE_EXCEPTION },
313         { IStatusReceiver::ERR_INSTALLD_CREATE_DIR_EXIST, ERROR_BUNDLE_SERVICE_EXCEPTION },
314         { IStatusReceiver::ERR_INSTALLD_REMOVE_DIR_FAILED, ERROR_BUNDLE_SERVICE_EXCEPTION },
315         { IStatusReceiver::ERR_INSTALLD_EXTRACT_FILES_FAILED, ERROR_BUNDLE_SERVICE_EXCEPTION },
316         { IStatusReceiver::ERR_INSTALLD_RNAME_DIR_FAILED, ERROR_BUNDLE_SERVICE_EXCEPTION },
317         { IStatusReceiver::ERR_INSTALLD_CLEAN_DIR_FAILED, ERROR_BUNDLE_SERVICE_EXCEPTION },
318         { IStatusReceiver::ERR_INSTALL_ENTRY_ALREADY_EXIST, ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
319         { IStatusReceiver::ERR_INSTALL_ALREADY_EXIST, ERROR_INSTALL_ALREADY_EXIST },
320         { IStatusReceiver::ERR_INSTALL_BUNDLENAME_NOT_SAME, ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
321         { IStatusReceiver::ERR_INSTALL_VERSIONCODE_NOT_SAME, ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
322         { IStatusReceiver::ERR_INSTALL_VERSIONNAME_NOT_SAME, ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
323         { IStatusReceiver::ERR_INSTALL_MINCOMPATIBLE_VERSIONCODE_NOT_SAME,
324             ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
325         { IStatusReceiver::ERR_INSTALL_VENDOR_NOT_SAME, ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
326         { IStatusReceiver::ERR_INSTALL_RELEASETYPE_NOT_SAME, ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
327         { IStatusReceiver::ERR_INSTALL_RELEASETYPE_TARGET_NOT_SAME, ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
328         { IStatusReceiver::ERR_INSTALL_RELEASETYPE_COMPATIBLE_NOT_SAME, ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
329         { IStatusReceiver::ERR_INSTALL_SINGLETON_NOT_SAME, ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
330         { IStatusReceiver::ERR_INSTALL_ZERO_USER_WITH_NO_SINGLETON, ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
331         { IStatusReceiver::ERR_INSTALL_CHECK_SYSCAP_FAILED, ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
332         { IStatusReceiver::ERR_INSTALL_APPTYPE_NOT_SAME, ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
333         { IStatusReceiver::ERR_INSTALL_URI_DUPLICATE, ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
334         { IStatusReceiver::ERR_INSTALL_VERSION_NOT_COMPATIBLE, ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
335         { IStatusReceiver::ERR_INSTALL_APP_DISTRIBUTION_TYPE_NOT_SAME, ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
336         { IStatusReceiver::ERR_INSTALL_APP_PROVISION_TYPE_NOT_SAME, ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
337         { IStatusReceiver::ERR_INSTALL_SO_INCOMPATIBLE, ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
338         { IStatusReceiver::ERR_INSTALL_AN_INCOMPATIBLE, ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
339         { IStatusReceiver::ERR_INSTALL_TYPE_ERROR, ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
340         { IStatusReceiver::ERR_INSTALL_TYPE_ERROR, ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
341         { IStatusReceiver::ERR_INSTALL_NOT_UNIQUE_DISTRO_MODULE_NAME, ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
342         { IStatusReceiver::ERR_INSTALL_INCONSISTENT_MODULE_NAME, ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
343         { IStatusReceiver::ERR_INSTALL_INVALID_NUMBER_OF_ENTRY_HAP, ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
344         { IStatusReceiver::ERR_INSTALL_ASAN_ENABLED_NOT_SAME, ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
345         { IStatusReceiver::ERR_INSTALL_ASAN_ENABLED_NOT_SUPPORT, ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT},
346         { IStatusReceiver::ERR_INSTALL_BUNDLE_TYPE_NOT_SAME, ERROR_INSTALL_PARSE_FAILED},
347         { IStatusReceiver::ERR_INSTALL_DISK_MEM_INSUFFICIENT, ERROR_INSTALL_NO_DISK_SPACE_LEFT },
348         { IStatusReceiver::ERR_USER_NOT_EXIST, ERROR_INVALID_USER_ID },
349         { IStatusReceiver::ERR_INSTALL_VERSION_DOWNGRADE, ERROR_INSTALL_VERSION_DOWNGRADE },
350         { IStatusReceiver::ERR_INSTALL_DEVICE_TYPE_NOT_SUPPORTED, ERROR_INSTALL_PARSE_FAILED },
351         { IStatusReceiver::ERR_INSTALL_PARSE_PROFILE_PROP_SIZE_CHECK_ERROR, ERROR_INSTALL_PARSE_FAILED },
352         { IStatusReceiver::ERR_INSTALL_DEPENDENT_MODULE_NOT_EXIST, ERROR_INSTALL_DEPENDENT_MODULE_NOT_EXIST },
353         { IStatusReceiver::ERR_INSTALL_SHARE_APP_LIBRARY_NOT_ALLOWED, ERROR_INSTALL_SHARE_APP_LIBRARY_NOT_ALLOWED },
354         { IStatusReceiver::ERR_INSTALL_COMPATIBLE_POLICY_NOT_SAME, ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
355         { IStatusReceiver::ERR_INSTALL_FILE_IS_SHARED_LIBRARY, ERROR_INSTALL_FILE_IS_SHARED_LIBRARY },
356         { IStatusReceiver::ERR_OVERLAY_INSTALLATION_FAILED_INTERNAL_ERROR, ERROR_BUNDLE_SERVICE_EXCEPTION },
357         { IStatusReceiver::ERR_OVERLAY_INSTALLATION_FAILED_INVALID_BUNDLE_NAME, ERROR_BUNDLE_NOT_EXIST },
358         { IStatusReceiver::ERR_OVERLAY_INSTALLATION_FAILED_INVALID_MODULE_NAME, ERROR_MODULE_NOT_EXIST},
359         { IStatusReceiver::ERR_OVERLAY_INSTALLATION_FAILED_ERROR_HAP_TYPE, ERROR_INVALID_TYPE },
360         { IStatusReceiver::ERR_OVERLAY_INSTALLATION_FAILED_ERROR_BUNDLE_TYPE, ERROR_INVALID_TYPE },
361         { IStatusReceiver::ERR_OVERLAY_INSTALLATION_FAILED_TARGET_BUNDLE_NAME_MISSED, ERROR_INSTALL_PARSE_FAILED },
362         { IStatusReceiver::ERR_OVERLAY_INSTALLATION_FAILED_TARGET_MODULE_NAME_MISSED, ERROR_INSTALL_PARSE_FAILED },
363         { IStatusReceiver::ERR_OVERLAY_INSTALLATION_FAILED_TARGET_BUNDLE_NAME_NOT_SAME,
364             ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
365         { IStatusReceiver::ERR_OVERLAY_INSTALLATION_FAILED_INTERNAL_EXTERNAL_OVERLAY_EXISTED_SIMULTANEOUSLY,
366             ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
367         { IStatusReceiver::ERR_OVERLAY_INSTALLATION_FAILED_TARGET_PRIORITY_NOT_SAME,
368             ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
369         { IStatusReceiver::ERR_OVERLAY_INSTALLATION_FAILED_INVALID_PRIORITY, ERROR_INSTALL_PARSE_FAILED },
370         { IStatusReceiver::ERR_OVERLAY_INSTALLATION_FAILED_INCONSISTENT_VERSION_CODE,
371             ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
372         { IStatusReceiver::ERR_OVERLAY_INSTALLATION_FAILED_SERVICE_EXCEPTION, ERROR_BUNDLE_SERVICE_EXCEPTION },
373         { IStatusReceiver::ERR_OVERLAY_INSTALLATION_FAILED_BUNDLE_NAME_SAME_WITH_TARGET_BUNDLE_NAME,
374             ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT},
375         { IStatusReceiver::ERR_OVERLAY_INSTALLATION_FAILED_NO_SYSTEM_APPLICATION_FOR_EXTERNAL_OVERLAY,
376             ERROR_INSTALL_HAP_OVERLAY_CHECK_FAILED },
377         { IStatusReceiver::ERR_OVERLAY_INSTALLATION_FAILED_DIFFERENT_SIGNATURE_CERTIFICATE,
378             ERROR_INSTALL_VERIFY_SIGNATURE_FAILED },
379         { IStatusReceiver::ERR_OVERLAY_INSTALLATION_FAILED_TARGET_BUNDLE_IS_OVERLAY_BUNDLE,
380             ERROR_INSTALL_HAP_OVERLAY_CHECK_FAILED },
381         {IStatusReceiver::ERR_OVERLAY_INSTALLATION_FAILED_TARGET_MODULE_IS_OVERLAY_MODULE,
382             ERROR_INSTALL_HAP_OVERLAY_CHECK_FAILED },
383         { IStatusReceiver::ERR_OVERLAY_INSTALLATION_FAILED_OVERLAY_TYPE_NOT_SAME,
384             ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
385         { IStatusReceiver::ERR_OVERLAY_INSTALLATION_FAILED_INVALID_BUNDLE_DIR, ERROR_BUNDLE_SERVICE_EXCEPTION },
386         { IStatusReceiver::ERR_APPEXECFWK_UNINSTALL_SHARE_APP_LIBRARY_IS_NOT_EXIST,
387             ERROR_UNINSTALL_SHARE_APP_LIBRARY_IS_NOT_EXIST},
388         { IStatusReceiver::ERR_APPEXECFWK_UNINSTALL_SHARE_APP_LIBRARY_IS_RELIED,
389             ERROR_UNINSTALL_SHARE_APP_LIBRARY_IS_RELIED},
390         { IStatusReceiver::ERR_APPEXECFWK_UNINSTALL_BUNDLE_IS_SHARED_LIBRARY,
391             ERROR_UNINSTALL_BUNDLE_IS_SHARED_BUNDLE},
392         { IStatusReceiver::ERR_INSATLL_CHECK_PROXY_DATA_URI_FAILED,
393             ERROR_INSTALL_WRONG_DATA_PROXY_URI},
394         { IStatusReceiver::ERR_INSATLL_CHECK_PROXY_DATA_PERMISSION_FAILED,
395             ERROR_INSTALL_WRONG_DATA_PROXY_PERMISSION},
396         { IStatusReceiver::ERR_INSTALL_FAILED_DEBUG_NOT_SAME, ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
397         { IStatusReceiver::ERR_INSTALL_DISALLOWED, ERROR_DISALLOW_INSTALL},
398         { IStatusReceiver::ERR_INSTALL_ISOLATION_MODE_FAILED, ERROR_INSTALL_WRONG_MODE_ISOLATION },
399         { IStatusReceiver::ERR_UNINSTALL_DISALLOWED, ERROR_DISALLOW_UNINSTALL },
400         { IStatusReceiver::ERR_INSTALL_CODE_SIGNATURE_FAILED, ERROR_INSTALL_CODE_SIGNATURE_FAILED },
401         { IStatusReceiver::ERR_INSTALL_CODE_SIGNATURE_FILE_IS_INVALID, ERROR_INSTALL_CODE_SIGNATURE_FAILED},
402         { IStatusReceiver::ERR_UNINSTALL_FROM_BMS_EXTENSION_FAILED, ERROR_BUNDLE_NOT_EXIST},
403         { IStatusReceiver::ERR_INSTALL_SELF_UPDATE_NOT_MDM, ERROR_INSTALL_SELF_UPDATE_NOT_MDM},
404         { IStatusReceiver::ERR_INSTALL_ENTERPRISE_BUNDLE_NOT_ALLOWED, ERROR_INSTALL_ENTERPRISE_BUNDLE_NOT_ALLOWED},
405         { IStatusReceiver::ERR_INSTALL_EXISTED_ENTERPRISE_BUNDLE_NOT_ALLOWED,
406             ERROR_INSTALL_EXISTED_ENTERPRISE_NOT_ALLOWED_ERROR},
407         { IStatusReceiver::ERR_INSTALL_SELF_UPDATE_BUNDLENAME_NOT_SAME, ERROR_INSTALL_SELF_UPDATE_BUNDLENAME_NOT_SAME},
408         { IStatusReceiver::ERR_INSTALL_GWP_ASAN_ENABLED_NOT_SAME, ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT},
409         { IStatusReceiver::ERR_INSTALL_DEBUG_BUNDLE_NOT_ALLOWED, ERROR_INSTALL_DEBUG_BUNDLE_NOT_ALLOWED},
410         { IStatusReceiver::ERR_INSTALL_CHECK_ENCRYPTION_FAILED, ERROR_INSTALL_CODE_SIGNATURE_FAILED },
411         { IStatusReceiver::ERR_INSTALL_CODE_SIGNATURE_DELIVERY_FILE_FAILED, ERROR_INSTALL_CODE_SIGNATURE_FAILED},
412         { IStatusReceiver::ERR_INSTALL_CODE_SIGNATURE_REMOVE_FILE_FAILED, ERROR_INSTALL_CODE_SIGNATURE_FAILED},
413         { IStatusReceiver::ERR_INSTALL_CODE_APP_CONTROLLED_FAILED, ERROR_INSTALL_FAILED_CONTROLLED},
414         { IStatusReceiver::ERR_INSTALL_NATIVE_FAILED, ERROR_INSTALL_NATIVE_FAILED},
415         { IStatusReceiver::ERR_UNINSTALL_NATIVE_FAILED, ERROR_UNINSTALL_NATIVE_FAILED},
416         { IStatusReceiver::ERR_UNINSTALL_DISPOSED_RULE_DENIED, ERROR_APPLICATION_UNINSTALL},
417         { IStatusReceiver::ERR_NATIVE_HNP_EXTRACT_FAILED, ERROR_INSTALL_NATIVE_FAILED},
418         { IStatusReceiver::ERR_UNINSTALL_CONTROLLED, ERROR_BUNDLE_CAN_NOT_BE_UNINSTALLED },
419         { IStatusReceiver::ERR_INSTALL_DEBUG_ENCRYPTED_BUNDLE_FAILED, ERROR_INSTALL_PARSE_FAILED }
420     };
421 }
422 
ConvertInstallResult(InstallResult & installResult)423 static void ConvertInstallResult(InstallResult &installResult)
424 {
425     APP_LOGD("ConvertInstallResult msg %{public}s, errCode is %{public}d", installResult.resultMsg.c_str(),
426         installResult.resultCode);
427     std::unordered_map<int32_t, int32_t> errCodeMap;
428     CreateErrCodeMap(errCodeMap);
429     auto iter = errCodeMap.find(installResult.resultCode);
430     if (iter != errCodeMap.end()) {
431         installResult.resultCode = iter->second;
432         return;
433     }
434     installResult.resultCode = ERROR_BUNDLE_SERVICE_EXCEPTION;
435 }
436 
ParseHashParam(napi_env env,napi_value args,std::string & key,std::string & value)437 static bool ParseHashParam(napi_env env, napi_value args, std::string &key, std::string &value)
438 {
439     APP_LOGD("start to parse moduleName");
440     bool ret = CommonFunc::ParseStringPropertyFromObject(env, args, MODULE_NAME, true, key);
441     if (!ret || key.empty()) {
442         APP_LOGE("param string moduleName is empty");
443         return false;
444     }
445     APP_LOGD("ParseHashParam moduleName=%{public}s", key.c_str());
446 
447     APP_LOGD("start to parse hashValue");
448     ret = CommonFunc::ParseStringPropertyFromObject(env, args, HASH_VALUE, true, value);
449     if (!ret || value.empty()) {
450         APP_LOGE("param string hashValue is empty");
451         return false;
452     }
453     APP_LOGD("ParseHashParam hashValue=%{public}s", value.c_str());
454     return true;
455 }
456 
ParseHashParams(napi_env env,napi_value args,std::map<std::string,std::string> & hashParams)457 static bool ParseHashParams(napi_env env, napi_value args, std::map<std::string, std::string> &hashParams)
458 {
459     APP_LOGD("start to parse hashParams");
460     std::vector<napi_value> valueVec;
461     bool res = CommonFunc::ParsePropertyArray(env, args, HASH_PARAMS, valueVec);
462     if (!res) {
463         APP_LOGW("hashParams type error,using default value");
464         return true;
465     }
466     if (valueVec.empty()) {
467         APP_LOGW("hashParams is empty,using default value");
468         return true;
469     }
470     for (const auto &property : valueVec) {
471         std::string key;
472         std::string value;
473         if (!ParseHashParam(env, property, key, value)) {
474             APP_LOGE("parse hash param failed");
475             return false;
476         }
477         if (hashParams.find(key) != hashParams.end()) {
478             APP_LOGE("moduleName(%{public}s) is duplicate", key.c_str());
479             return false;
480         }
481         hashParams.emplace(key, value);
482     }
483     return true;
484 }
485 
ParseVerifyCodeParam(napi_env env,napi_value args,std::string & key,std::string & value)486 static bool ParseVerifyCodeParam(napi_env env, napi_value args, std::string &key, std::string &value)
487 {
488     APP_LOGD("start to parse moduleName");
489     bool ret = CommonFunc::ParseStringPropertyFromObject(env, args, MODULE_NAME, true, key);
490     if (!ret || key.empty()) {
491         APP_LOGE("param string moduleName is empty");
492         return false;
493     }
494     APP_LOGD("ParseVerifyCodeParam moduleName is %{public}s", key.c_str());
495 
496     APP_LOGD("start to parse signatureFilePath");
497     ret = CommonFunc::ParseStringPropertyFromObject(env, args, SIGNATURE_FILE_PATH, true, value);
498     if (!ret || value.empty()) {
499         APP_LOGE("param string signatureFilePath is empty");
500         return false;
501     }
502     APP_LOGD("ParseVerifyCodeParam signatureFilePath is %{public}s", value.c_str());
503     return true;
504 }
505 
ParseVerifyCodeParams(napi_env env,napi_value args,std::map<std::string,std::string> & verifyCodeParams)506 static bool ParseVerifyCodeParams(napi_env env, napi_value args, std::map<std::string, std::string> &verifyCodeParams)
507 {
508     APP_LOGD("start to parse verifyCodeParams");
509     std::vector<napi_value> valueVec;
510     bool res = CommonFunc::ParsePropertyArray(env, args, VERIFY_CODE_PARAM, valueVec);
511     if (!res) {
512         APP_LOGW("verifyCodeParams type error, using default value");
513         return true;
514     }
515     if (valueVec.empty()) {
516         APP_LOGW("verifyCodeParams is empty, using default value");
517         return true;
518     }
519     for (const auto &property : valueVec) {
520         std::string key;
521         std::string value;
522         if (!ParseVerifyCodeParam(env, property, key, value)) {
523             APP_LOGE("parse verify code param failed");
524             return false;
525         }
526         if (verifyCodeParams.find(key) != verifyCodeParams.end()) {
527             APP_LOGE("moduleName(%{public}s) is duplicate", key.c_str());
528             return false;
529         }
530         verifyCodeParams.emplace(key, value);
531     }
532     return true;
533 }
534 
ParseParameter(napi_env env,napi_value args,std::string & key,std::string & value)535 static bool ParseParameter(napi_env env, napi_value args, std::string &key, std::string &value)
536 {
537     APP_LOGD("start to parse parameter");
538     bool ret = CommonFunc::ParseStringPropertyFromObject(env, args, KEY, true, key);
539     if (!ret || key.empty()) {
540         APP_LOGE("param key is empty");
541         return false;
542     }
543     APP_LOGD("ParseParameter key is %{public}s", key.c_str());
544 
545     APP_LOGD("start to parse value");
546     ret = CommonFunc::ParseStringPropertyFromObject(env, args, VALUE, true, value);
547     if (!ret || value.empty()) {
548         APP_LOGE("param value is empty");
549         return false;
550     }
551     APP_LOGD("ParseParameter value is %{public}s", value.c_str());
552     return true;
553 }
554 
ParseParameters(napi_env env,napi_value args,std::map<std::string,std::string> & parameters)555 static bool ParseParameters(napi_env env, napi_value args, std::map<std::string, std::string> &parameters)
556 {
557     APP_LOGD("start to parse parameters");
558     std::vector<napi_value> valueVec;
559     bool res = CommonFunc::ParsePropertyArray(env, args, PARAMETERS, valueVec);
560     if (!res) {
561         APP_LOGW("parameters type error, using default value");
562         return true;
563     }
564     if (valueVec.empty()) {
565         APP_LOGW("parameters is empty, using default value");
566         return true;
567     }
568     for (const auto &property : valueVec) {
569         std::string key;
570         std::string value;
571         if (!ParseParameter(env, property, key, value)) {
572             APP_LOGE("parse parameter failed");
573             return false;
574         }
575         if (parameters.find(key) != parameters.end()) {
576             APP_LOGE("key(%{public}s) is duplicate", key.c_str());
577             return false;
578         }
579         parameters.emplace(key, value);
580     }
581     return true;
582 }
583 
ParsePgoParam(napi_env env,napi_value args,std::string & key,std::string & value)584 static bool ParsePgoParam(napi_env env, napi_value args, std::string &key, std::string &value)
585 {
586     APP_LOGD("start to parse moduleName");
587     bool ret = CommonFunc::ParseStringPropertyFromObject(env, args, MODULE_NAME, true, key);
588     if (!ret || key.empty()) {
589         APP_LOGE("param string moduleName is empty");
590         return false;
591     }
592     APP_LOGD("ParsePgoParam moduleName is %{public}s", key.c_str());
593 
594     APP_LOGD("start to parse pgoFilePath");
595     ret = CommonFunc::ParseStringPropertyFromObject(env, args, PGO_FILE_PATH, true, value);
596     if (!ret || value.empty()) {
597         APP_LOGE("param string pgoFilePath is empty");
598         return false;
599     }
600     APP_LOGD("ParsePgoParam pgoFilePath is %{public}s", value.c_str());
601     return true;
602 }
603 
ParsePgoParams(napi_env env,napi_value args,std::map<std::string,std::string> & pgoParams)604 static bool ParsePgoParams(napi_env env, napi_value args, std::map<std::string, std::string> &pgoParams)
605 {
606     APP_LOGD("start to parse pgoParams");
607     std::vector<napi_value> valueVec;
608     bool res = CommonFunc::ParsePropertyArray(env, args, PGO_PARAM, valueVec);
609     if (!res) {
610         APP_LOGW("pgoParams type error, using default value");
611         return true;
612     }
613     if (valueVec.empty()) {
614         APP_LOGW("pgoParams is empty, using default value");
615         return true;
616     }
617     for (const auto &property : valueVec) {
618         std::string key;
619         std::string value;
620         if (!ParsePgoParam(env, property, key, value)) {
621             APP_LOGW("parse pgo param failed");
622             continue;
623         }
624         pgoParams.emplace(key, value);
625     }
626     return true;
627 }
628 
ParseBundleName(napi_env env,napi_value args,std::string & bundleName)629 static bool ParseBundleName(napi_env env, napi_value args, std::string &bundleName)
630 {
631     APP_LOGD("start to parse bundleName");
632     PropertyInfo propertyInfo = {
633         .propertyName = BUNDLE_NAME,
634         .isNecessary = true,
635         .propertyType = napi_string
636     };
637     napi_value property = nullptr;
638     bool res = CommonFunc::ParsePropertyFromObject(env, args, propertyInfo, property);
639     if (!res) {
640         APP_LOGE("parse bundleName failed, bundleName is %{public}s", bundleName.c_str());
641         return res;
642     }
643     if (property != nullptr) {
644         if (!CommonFunc::ParseString(env, property, bundleName)) {
645             APP_LOGE("ParseString failed");
646             return false;
647         }
648     }
649     APP_LOGD("param bundleName is %{public}s", bundleName.c_str());
650     return true;
651 }
652 
ParseModuleName(napi_env env,napi_value args,std::string & moduleName)653 static bool ParseModuleName(napi_env env, napi_value args, std::string &moduleName)
654 {
655     APP_LOGD("start to parse moduleName");
656     PropertyInfo propertyInfo = {
657         .propertyName = MODULE_NAME,
658         .isNecessary = false,
659         .propertyType = napi_string
660     };
661     napi_value property = nullptr;
662     bool res = CommonFunc::ParsePropertyFromObject(env, args, propertyInfo, property);
663     if (!res) {
664         APP_LOGE("parse moduleName failed");
665         return res;
666     }
667     if (property != nullptr) {
668         if (!CommonFunc::ParseString(env, property, moduleName)) {
669             APP_LOGE("ParseString failed");
670             return false;
671         }
672     }
673     return true;
674 }
675 
ParseVersionCode(napi_env env,napi_value args,int32_t & versionCode)676 static bool ParseVersionCode(napi_env env, napi_value args, int32_t &versionCode)
677 {
678     APP_LOGD("start to parse versionCode");
679     PropertyInfo propertyInfo = {
680         .propertyName = VERSION_CODE,
681         .isNecessary = false,
682         .propertyType = napi_number
683     };
684     napi_value property = nullptr;
685     bool res = CommonFunc::ParsePropertyFromObject(env, args, propertyInfo, property);
686     if (!res) {
687         APP_LOGE("parse versionCode failed");
688         return res;
689     }
690     if (property != nullptr) {
691         PARSE_PROPERTY(env, property, int32, versionCode);
692     }
693     APP_LOGD("param versionCode is %{public}d", versionCode);
694     return true;
695 }
696 
ParseUserId(napi_env env,napi_value args,int32_t & userId)697 static bool ParseUserId(napi_env env, napi_value args, int32_t &userId)
698 {
699     APP_LOGD("start to parse userId");
700     PropertyInfo propertyInfo = {
701         .propertyName = USER_ID,
702         .isNecessary = false,
703         .propertyType = napi_number
704     };
705     napi_value property = nullptr;
706     bool res = CommonFunc::ParsePropertyFromObject(env, args, propertyInfo, property);
707     if (!res) {
708         APP_LOGE("parse userId failed");
709         return res;
710     }
711     if (property != nullptr) {
712         PARSE_PROPERTY(env, property, int32, userId);
713     }
714     APP_LOGD("param userId is %{public}d", userId);
715     return true;
716 }
717 
ParseAppIndex(napi_env env,napi_value args,int32_t & appIndex)718 static bool ParseAppIndex(napi_env env, napi_value args, int32_t &appIndex)
719 {
720     APP_LOGD("start to parse appIndex");
721     PropertyInfo propertyInfo = {
722         .propertyName = APP_INDEX,
723         .isNecessary = true,
724         .propertyType = napi_number
725     };
726     napi_value property = nullptr;
727     bool res = CommonFunc::ParsePropertyFromObject(env, args, propertyInfo, property);
728     if (!res) {
729         APP_LOGE("parse appIndex failed");
730         return res;
731     }
732     if (property != nullptr) {
733         PARSE_PROPERTY(env, property, int32, appIndex);
734     }
735     APP_LOGD("param appIndex is %{public}d", appIndex);
736     return true;
737 }
738 
ParseInstallFlag(napi_env env,napi_value args,InstallFlag & installFlag)739 static bool ParseInstallFlag(napi_env env, napi_value args, InstallFlag &installFlag)
740 {
741     APP_LOGD("start to parse installFlag");
742     PropertyInfo propertyInfo = {
743         .propertyName = INSTALL_FLAG,
744         .isNecessary = false,
745         .propertyType = napi_number
746     };
747     napi_value property = nullptr;
748     bool res = CommonFunc::ParsePropertyFromObject(env, args, propertyInfo, property);
749     if (!res) {
750         APP_LOGE("parse installFlag failed");
751         return res;
752     }
753 
754     if (property != nullptr) {
755         int32_t flag = 0;
756         PARSE_PROPERTY(env, property, int32, flag);
757         APP_LOGD("param installFlag is %{public}d", flag);
758         if ((flag != static_cast<int32_t>(OHOS::AppExecFwk::InstallFlag::NORMAL)) &&
759             (flag != static_cast<int32_t>(OHOS::AppExecFwk::InstallFlag::REPLACE_EXISTING)) &&
760             (flag != static_cast<int32_t>(OHOS::AppExecFwk::InstallFlag::FREE_INSTALL))) {
761             APP_LOGE("invalid installFlag param");
762             return false;
763         }
764         installFlag = static_cast<OHOS::AppExecFwk::InstallFlag>(flag);
765     }
766     return true;
767 }
768 
ParseIsKeepData(napi_env env,napi_value args,bool & isKeepData)769 static bool ParseIsKeepData(napi_env env, napi_value args, bool &isKeepData)
770 {
771     APP_LOGD("start to parse isKeepData");
772     PropertyInfo propertyInfo = {
773         .propertyName = IS_KEEP_DATA,
774         .isNecessary = false,
775         .propertyType = napi_boolean
776     };
777     napi_value property = nullptr;
778     bool res = CommonFunc::ParsePropertyFromObject(env, args, propertyInfo, property);
779     if (!res) {
780         APP_LOGE("parse isKeepData failed");
781         return res;
782     }
783     if (property != nullptr) {
784         PARSE_PROPERTY(env, property, bool, isKeepData);
785     }
786     APP_LOGD("param isKeepData is %{public}d", isKeepData);
787     return true;
788 }
789 
ParseCrowdtestDeadline(napi_env env,napi_value args,int64_t & crowdtestDeadline)790 static bool ParseCrowdtestDeadline(napi_env env, napi_value args, int64_t &crowdtestDeadline)
791 {
792     APP_LOGD("start to parse crowdtestDeadline");
793     PropertyInfo propertyInfo = {
794         .propertyName = CROWD_TEST_DEADLINE,
795         .isNecessary = false,
796         .propertyType = napi_number
797     };
798     napi_value property = nullptr;
799     bool res = CommonFunc::ParsePropertyFromObject(env, args, propertyInfo, property);
800     if (!res) {
801         APP_LOGE("parse crowdtestDeadline failed");
802         return res;
803     }
804     if (property != nullptr) {
805         PARSE_PROPERTY(env, property, int64, crowdtestDeadline);
806     }
807     return true;
808 }
809 
ParseSharedBundleDirPaths(napi_env env,napi_value args,std::vector<std::string> & sharedBundleDirPaths)810 static bool ParseSharedBundleDirPaths(napi_env env, napi_value args, std::vector<std::string> &sharedBundleDirPaths)
811 {
812     APP_LOGD("start to parse sharedBundleDirPaths");
813     std::vector<napi_value> valueVec;
814     bool res = CommonFunc::ParsePropertyArray(env, args, SHARED_BUNDLE_DIR_PATHS, valueVec);
815     if (!res) {
816         APP_LOGE("parse sharedBundleDirPaths failed");
817         return res;
818     }
819     if (valueVec.empty()) {
820         APP_LOGD("sharedBundleDirPaths is empty");
821         return true;
822     }
823     for (const auto &value : valueVec) {
824         std::string path;
825         if (!CommonFunc::ParseString(env, value, path)) {
826             APP_LOGE("parse sharedBundleDirPaths element failed");
827             return false;
828         }
829         sharedBundleDirPaths.emplace_back(path);
830     }
831     return true;
832 }
833 
ParseSpecifiedDistributionType(napi_env env,napi_value args,std::string & specifiedDistributionType)834 static bool ParseSpecifiedDistributionType(napi_env env, napi_value args, std::string &specifiedDistributionType)
835 {
836     APP_LOGD("start to parse specifiedDistributionType");
837     PropertyInfo propertyInfo = {
838         .propertyName = SPECIFIED_DISTRIBUTION_TYPE,
839         .isNecessary = false,
840         .propertyType = napi_string
841     };
842     napi_value property = nullptr;
843     bool res = CommonFunc::ParsePropertyFromObject(env, args, propertyInfo, property);
844     if (!res) {
845         APP_LOGE("parse specifiedDistributionType failed");
846         return res;
847     }
848     if (property != nullptr) {
849         if (!CommonFunc::ParseString(env, property, specifiedDistributionType)) {
850             APP_LOGE("ParseString failed");
851             return false;
852         }
853     }
854     APP_LOGD("param specifiedDistributionType is %{public}s", specifiedDistributionType.c_str());
855     return true;
856 }
857 
ParseAdditionalInfo(napi_env env,napi_value args,std::string & additionalInfo)858 static bool ParseAdditionalInfo(napi_env env, napi_value args, std::string &additionalInfo)
859 {
860     APP_LOGD("start to parse the additionalInfo");
861     PropertyInfo propertyInfo = {
862         .propertyName = ADDITIONAL_INFO,
863         .isNecessary = false,
864         .propertyType = napi_string
865     };
866     napi_value property = nullptr;
867     bool res = CommonFunc::ParsePropertyFromObject(env, args, propertyInfo, property);
868     if (!res) {
869         APP_LOGE("parse additionalInfo failed");
870         return res;
871     }
872     if (property != nullptr) {
873         if (!CommonFunc::ParseString(env, property, additionalInfo)) {
874             APP_LOGE("ParseString failed");
875             return false;
876         }
877     }
878     APP_LOGD("param additionalInfo is %{public}s", additionalInfo.c_str());
879     return true;
880 }
881 
CheckInstallParam(napi_env env,InstallParam & installParam)882 static bool CheckInstallParam(napi_env env, InstallParam &installParam)
883 {
884     if (installParam.specifiedDistributionType.size() > SPECIFIED_DISTRIBUTION_TYPE_MAX_SIZE) {
885         APP_LOGE("Parse specifiedDistributionType size failed");
886         BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR,
887             "BusinessError 401: The size of specifiedDistributionType is greater than 128");
888         return false;
889     }
890     if (installParam.additionalInfo.size() > ADDITIONAL_INFO_MAX_SIZE) {
891         APP_LOGE("Parse additionalInfo size failed");
892         BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR,
893             "BusinessError 401: The size of additionalInfo is greater than 3000");
894         return false;
895     }
896     return true;
897 }
898 
ParseInstallParam(napi_env env,napi_value args,InstallParam & installParam)899 static bool ParseInstallParam(napi_env env, napi_value args, InstallParam &installParam)
900 {
901     if (!ParseHashParams(env, args, installParam.hashParams)) {
902         return false;
903     }
904     if (!ParseVerifyCodeParams(env, args, installParam.verifyCodeParams)) {
905         return false;
906     }
907     if (!ParsePgoParams(env, args, installParam.pgoParams)) {
908         return false;
909     }
910     if (!ParseUserId(env, args, installParam.userId)) {
911         APP_LOGW("Parse userId failed,using default value");
912     }
913     if (!ParseInstallFlag(env, args, installParam.installFlag)) {
914         APP_LOGW("Parse installFlag failed,using default value");
915     }
916     if (!ParseIsKeepData(env, args, installParam.isKeepData)) {
917         APP_LOGW("Parse isKeepData failed,using default value");
918     }
919     if (!ParseCrowdtestDeadline(env, args, installParam.crowdtestDeadline)) {
920         APP_LOGW("Parse crowdtestDeadline failed,using default value");
921     }
922     if (!ParseSharedBundleDirPaths(env, args, installParam.sharedBundleDirPaths)) {
923         APP_LOGW("Parse sharedBundleDirPaths failed,using default value");
924     }
925     if (!ParseSpecifiedDistributionType(env, args, installParam.specifiedDistributionType)) {
926         APP_LOGW("Parse specifiedDistributionType failed,using default value");
927     }
928     if (!ParseAdditionalInfo(env, args, installParam.additionalInfo)) {
929         APP_LOGW("Parse additionalInfo failed,using default value");
930     }
931     if (!ParseParameters(env, args, installParam.parameters)) {
932         APP_LOGW("Parse parameters failed,using default value");
933     }
934     return true;
935 }
936 
ParseUninstallParam(napi_env env,napi_value args,UninstallParam & uninstallParam)937 static bool ParseUninstallParam(napi_env env, napi_value args, UninstallParam &uninstallParam)
938 {
939     if (!ParseBundleName(env, args, uninstallParam.bundleName) ||
940         !ParseModuleName(env, args, uninstallParam.moduleName) ||
941         !ParseVersionCode(env, args, uninstallParam.versionCode) ||
942         !ParseUserId(env, args, uninstallParam.userId)) {
943             APP_LOGE("Parse UninstallParam faied");
944             return false;
945     }
946     return true;
947 }
948 
CreateProxyErrCode(std::unordered_map<int32_t,int32_t> & errCodeMap)949 static void CreateProxyErrCode(std::unordered_map<int32_t, int32_t> &errCodeMap)
950 {
951     errCodeMap = {
952         { ERR_APPEXECFWK_INSTALL_PARAM_ERROR, IStatusReceiver::ERR_INSTALL_PARAM_ERROR },
953         { ERR_APPEXECFWK_INSTALL_INTERNAL_ERROR, IStatusReceiver::ERR_INSTALL_INTERNAL_ERROR },
954         { ERR_APPEXECFWK_INSTALL_FILE_PATH_INVALID, IStatusReceiver::ERR_INSTALL_FILE_PATH_INVALID },
955         { ERR_APPEXECFWK_INSTALL_DISK_MEM_INSUFFICIENT, IStatusReceiver::ERR_INSTALL_DISK_MEM_INSUFFICIENT },
956         { ERR_BUNDLEMANAGER_INSTALL_CODE_SIGNATURE_FILE_IS_INVALID,
957             IStatusReceiver::ERR_INSTALL_CODE_SIGNATURE_FILE_IS_INVALID}
958     };
959 }
960 
InstallExecuter(napi_env env,void * data)961 void InstallExecuter(napi_env env, void *data)
962 {
963     AsyncInstallCallbackInfo *asyncCallbackInfo = reinterpret_cast<AsyncInstallCallbackInfo *>(data);
964     if (asyncCallbackInfo == nullptr) {
965         APP_LOGE("asyncCallbackInfo is nullptr");
966         return;
967     }
968     const std::vector<std::string> bundleFilePath = asyncCallbackInfo->hapFiles;
969     InstallResult &installResult = asyncCallbackInfo->installResult;
970     if (bundleFilePath.empty() && asyncCallbackInfo->installParam.sharedBundleDirPaths.empty()) {
971         installResult.resultCode = static_cast<int32_t>(IStatusReceiver::ERR_INSTALL_FILE_PATH_INVALID);
972         return;
973     }
974     auto iBundleInstaller = CommonFunc::GetBundleInstaller();
975     if ((iBundleInstaller == nullptr) || (iBundleInstaller->AsObject() == nullptr)) {
976         APP_LOGE("can not get iBundleInstaller");
977         installResult.resultCode = static_cast<int32_t>(IStatusReceiver::ERR_INSTALL_INTERNAL_ERROR);
978         return;
979     }
980 
981     sptr<InstallerCallback> callback = new (std::nothrow) InstallerCallback();
982     sptr<BundleDeathRecipient> recipient(new (std::nothrow) BundleDeathRecipient(callback));
983     if (callback == nullptr || recipient == nullptr) {
984         APP_LOGE("callback or death recipient is nullptr");
985         installResult.resultCode = static_cast<int32_t>(IStatusReceiver::ERR_INSTALL_INTERNAL_ERROR);
986         return;
987     }
988     iBundleInstaller->AsObject()->AddDeathRecipient(recipient);
989 
990     ErrCode res = iBundleInstaller->StreamInstall(bundleFilePath, asyncCallbackInfo->installParam, callback);
991     if (res == ERR_OK) {
992         installResult.resultCode = callback->GetResultCode();
993         APP_LOGD("InnerInstall resultCode %{public}d", installResult.resultCode);
994         installResult.resultMsg = callback->GetResultMsg();
995         APP_LOGD("InnerInstall resultMsg %{public}s", installResult.resultMsg.c_str());
996         return;
997     }
998     APP_LOGE("install failed due to %{public}d", res);
999     std::unordered_map<int32_t, int32_t> proxyErrCodeMap;
1000     CreateProxyErrCode(proxyErrCodeMap);
1001     if (proxyErrCodeMap.find(res) != proxyErrCodeMap.end()) {
1002         installResult.resultCode = proxyErrCodeMap.at(res);
1003     } else {
1004         installResult.resultCode = IStatusReceiver::ERR_INSTALL_INTERNAL_ERROR;
1005     }
1006 }
1007 
GetFunctionName(const InstallOption & option)1008 static std::string GetFunctionName(const InstallOption &option)
1009 {
1010     if (option == InstallOption::INSTALL) {
1011         return RESOURCE_NAME_OF_INSTALL;
1012     } else if (option == InstallOption::RECOVER) {
1013         return RESOURCE_NAME_OF_RECOVER;
1014     } else if (option == InstallOption::UNINSTALL) {
1015         return RESOURCE_NAME_OF_UNINSTALL;
1016     } else if (option == InstallOption::UPDATE_BUNDLE_FOR_SELF) {
1017         return RESOURCE_NAME_OF_UPDATE_BUNDLE_FOR_SELF;
1018     } else if (option == InstallOption::UNINSTALL_AND_RECOVER) {
1019         return RESOURCE_NAME_OF_UNINSTALL_AND_RECOVER;
1020     }
1021     return EMPTY_STRING;
1022 }
1023 
OperationCompleted(napi_env env,napi_status status,void * data)1024 void OperationCompleted(napi_env env, napi_status status, void *data)
1025 {
1026     AsyncInstallCallbackInfo *asyncCallbackInfo = reinterpret_cast<AsyncInstallCallbackInfo *>(data);
1027     std::unique_ptr<AsyncInstallCallbackInfo> callbackPtr {asyncCallbackInfo};
1028     napi_value result[CALLBACK_PARAM_SIZE] = {0};
1029     ConvertInstallResult(callbackPtr->installResult);
1030     if (callbackPtr->installResult.resultCode != SUCCESS) {
1031         switch (callbackPtr->option) {
1032             case InstallOption::INSTALL:
1033                 result[FIRST_PARAM] = BusinessError::CreateCommonError(env, callbackPtr->installResult.resultCode,
1034                     RESOURCE_NAME_OF_INSTALL, INSTALL_PERMISSION);
1035                 break;
1036             case InstallOption::RECOVER:
1037                 result[FIRST_PARAM] = BusinessError::CreateCommonError(env, callbackPtr->installResult.resultCode,
1038                     RESOURCE_NAME_OF_RECOVER, RECOVER_PERMISSION);
1039                 break;
1040             case InstallOption::UNINSTALL:
1041                 result[FIRST_PARAM] = BusinessError::CreateCommonError(env, callbackPtr->installResult.resultCode,
1042                     RESOURCE_NAME_OF_UNINSTALL, UNINSTALL_PERMISSION);
1043                 break;
1044             case InstallOption::UPDATE_BUNDLE_FOR_SELF:
1045                 result[FIRST_PARAM] = BusinessError::CreateCommonError(env, callbackPtr->installResult.resultCode,
1046                     RESOURCE_NAME_OF_UPDATE_BUNDLE_FOR_SELF, INSTALL_SELF_PERMISSION);
1047                 break;
1048             case InstallOption::UNINSTALL_AND_RECOVER:
1049                 result[FIRST_PARAM] = BusinessError::CreateCommonError(env, callbackPtr->installResult.resultCode,
1050                     RESOURCE_NAME_OF_UNINSTALL_AND_RECOVER, UNINSTALL_PERMISSION);
1051                 break;
1052             default:
1053                 break;
1054         }
1055     } else {
1056         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[FIRST_PARAM]));
1057     }
1058     callbackPtr->err = callbackPtr->installResult.resultCode;
1059     APP_LOGI("installer callback");
1060     CommonFunc::NapiReturnDeferred<AsyncInstallCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_ONE);
1061 }
1062 
1063 /**
1064  * Promise and async callback
1065  */
Install(napi_env env,napi_callback_info info)1066 napi_value Install(napi_env env, napi_callback_info info)
1067 {
1068     APP_LOGI("Install called");
1069     // obtain arguments of install interface
1070     NapiArg args(env, info);
1071     if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_THREE)) {
1072         APP_LOGE("init param failed");
1073         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1074         return nullptr;
1075     }
1076     auto argc = args.GetMaxArgc();
1077     APP_LOGD("the number of argc is  %{public}zu", argc);
1078     if (argc < ARGS_SIZE_ONE) {
1079         APP_LOGE("the params number is incorrect");
1080         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1081         return nullptr;
1082     }
1083     std::unique_ptr<AsyncInstallCallbackInfo> callbackPtr = std::make_unique<AsyncInstallCallbackInfo>(env);
1084     callbackPtr->option = InstallOption::INSTALL;
1085     for (size_t i = 0; i < argc; ++i) {
1086         napi_valuetype valueType = napi_undefined;
1087         napi_typeof(env, args[i], &valueType);
1088         if (i == ARGS_POS_ZERO) {
1089             if (!CommonFunc::ParseStringArray(env, callbackPtr->hapFiles, args[i])) {
1090                 APP_LOGE("Flags %{public}s invalid", callbackPtr->bundleName.c_str());
1091                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, PARAMETERS, CORRESPONDING_TYPE);
1092                 return nullptr;
1093             }
1094         } else if (i == ARGS_POS_ONE) {
1095             if (valueType == napi_function) {
1096                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &callbackPtr->callback));
1097                 break;
1098             }
1099             if (valueType == napi_object && !ParseInstallParam(env, args[i], callbackPtr->installParam)) {
1100                 APP_LOGE("Parse installParam failed");
1101                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, PARAMETERS, CORRESPONDING_TYPE);
1102                 return nullptr;
1103             }
1104         } else if (i == ARGS_POS_TWO) {
1105             if (valueType == napi_function) {
1106                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &callbackPtr->callback));
1107                 break;
1108             }
1109         } else {
1110             APP_LOGE("param check error");
1111             BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, PARAMETERS, CORRESPONDING_TYPE);
1112             return nullptr;
1113         }
1114     }
1115     if (!CheckInstallParam(env, callbackPtr->installParam)) {
1116         return nullptr;
1117     }
1118     if (callbackPtr->hapFiles.empty() && !callbackPtr->installParam.verifyCodeParams.empty()) {
1119         BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, HAPS_FILE_NEEDED);
1120         return nullptr;
1121     }
1122     auto promise = CommonFunc::AsyncCallNativeMethod(env, callbackPtr.get(), RESOURCE_NAME_OF_INSTALL, InstallExecuter,
1123         OperationCompleted);
1124     callbackPtr.release();
1125     APP_LOGI("call Install done");
1126     return promise;
1127 }
1128 
UninstallOrRecoverExecuter(napi_env env,void * data)1129 void UninstallOrRecoverExecuter(napi_env env, void *data)
1130 {
1131     AsyncInstallCallbackInfo *asyncCallbackInfo = reinterpret_cast<AsyncInstallCallbackInfo *>(data);
1132     if (asyncCallbackInfo == nullptr) {
1133         APP_LOGE("asyncCallbackInfo is nullptr");
1134         return;
1135     }
1136     const std::string bundleName = asyncCallbackInfo->bundleName;
1137     InstallResult &installResult = asyncCallbackInfo->installResult;
1138     if (bundleName.empty()) {
1139         installResult.resultCode = static_cast<int32_t>(IStatusReceiver::ERR_RECOVER_INVALID_BUNDLE_NAME);
1140         return;
1141     }
1142     auto iBundleInstaller = CommonFunc::GetBundleInstaller();
1143     if ((iBundleInstaller == nullptr) || (iBundleInstaller->AsObject() == nullptr)) {
1144         APP_LOGE("can not get iBundleInstaller");
1145         installResult.resultCode = static_cast<int32_t>(IStatusReceiver::ERR_INSTALL_INTERNAL_ERROR);
1146         return;
1147     }
1148 
1149     sptr<InstallerCallback> callback = new (std::nothrow) InstallerCallback();
1150     sptr<BundleDeathRecipient> recipient(new (std::nothrow) BundleDeathRecipient(callback));
1151     if (callback == nullptr || recipient == nullptr) {
1152         APP_LOGE("callback or death recipient is nullptr");
1153         installResult.resultCode = static_cast<int32_t>(IStatusReceiver::ERR_INSTALL_INTERNAL_ERROR);
1154         return;
1155     }
1156     iBundleInstaller->AsObject()->AddDeathRecipient(recipient);
1157     if (asyncCallbackInfo->option == InstallOption::RECOVER) {
1158         iBundleInstaller->Recover(bundleName, asyncCallbackInfo->installParam, callback);
1159     } else if (asyncCallbackInfo->option == InstallOption::UNINSTALL) {
1160         iBundleInstaller->Uninstall(bundleName, asyncCallbackInfo->installParam, callback);
1161     } else {
1162         APP_LOGE("error install option");
1163         installResult.resultCode = static_cast<int32_t>(IStatusReceiver::ERR_INSTALL_INTERNAL_ERROR);
1164         return;
1165     }
1166     installResult.resultMsg = callback->GetResultMsg();
1167     APP_LOGD("InnerRecover resultMsg %{public}s", installResult.resultMsg.c_str());
1168     installResult.resultCode = callback->GetResultCode();
1169     APP_LOGD("InnerRecover resultCode %{public}d", installResult.resultCode);
1170 }
1171 
UninstallByUninstallParamExecuter(napi_env env,void * data)1172 void UninstallByUninstallParamExecuter(napi_env env, void* data)
1173 {
1174     AsyncInstallCallbackInfo *asyncCallbackInfo = reinterpret_cast<AsyncInstallCallbackInfo *>(data);
1175     if (asyncCallbackInfo == nullptr) {
1176         APP_LOGE("asyncCallbackInfo is nullptr");
1177         return;
1178     }
1179     const std::string bundleName = asyncCallbackInfo->uninstallParam.bundleName;
1180     InstallResult &installResult = asyncCallbackInfo->installResult;
1181     if (bundleName.empty()) {
1182         installResult.resultCode =
1183             static_cast<int32_t>(IStatusReceiver::ERR_APPEXECFWK_UNINSTALL_SHARE_APP_LIBRARY_IS_NOT_EXIST);
1184         return;
1185     }
1186     auto iBundleInstaller = CommonFunc::GetBundleInstaller();
1187     if ((iBundleInstaller == nullptr) || (iBundleInstaller->AsObject() == nullptr)) {
1188         APP_LOGE("can not get iBundleInstaller");
1189         installResult.resultCode = static_cast<int32_t>(IStatusReceiver::ERR_INSTALL_INTERNAL_ERROR);
1190         return;
1191     }
1192     sptr<InstallerCallback> callback = new (std::nothrow) InstallerCallback();
1193     sptr<BundleDeathRecipient> recipient(new (std::nothrow) BundleDeathRecipient(callback));
1194     if (callback == nullptr || recipient == nullptr) {
1195         APP_LOGE("callback or death recipient is nullptr");
1196         installResult.resultCode = static_cast<int32_t>(IStatusReceiver::ERR_INSTALL_INTERNAL_ERROR);
1197         return;
1198     }
1199     iBundleInstaller->AsObject()->AddDeathRecipient(recipient);
1200     iBundleInstaller->Uninstall(asyncCallbackInfo->uninstallParam, callback);
1201     installResult.resultMsg = callback->GetResultMsg();
1202     installResult.resultCode = callback->GetResultCode();
1203 }
1204 
UninstallByUninstallParam(napi_env env,napi_callback_info info,std::unique_ptr<AsyncInstallCallbackInfo> & callbackPtr)1205 napi_value UninstallByUninstallParam(napi_env env, napi_callback_info info,
1206     std::unique_ptr<AsyncInstallCallbackInfo> &callbackPtr)
1207 {
1208     NapiArg args(env, info);
1209     if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_TWO)) {
1210         APP_LOGE("init param failed");
1211         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1212         return nullptr;
1213     }
1214     for (size_t i = 0; i < args.GetMaxArgc(); ++i) {
1215         napi_valuetype valueType = napi_undefined;
1216         napi_typeof(env, args[i], &valueType);
1217         if (i == ARGS_POS_ZERO) {
1218             if (!ParseUninstallParam(env, args[i], callbackPtr->uninstallParam)) {
1219                 APP_LOGE("parse uninstallParam failed");
1220                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, PARAMETERS, CORRESPONDING_TYPE);
1221                 return nullptr;
1222             }
1223         } else if ((i == ARGS_POS_ONE) && (valueType == napi_function)) {
1224             NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &callbackPtr->callback));
1225             break;
1226         } else {
1227             APP_LOGE("param check error");
1228             BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, PARAMETERS, CORRESPONDING_TYPE);
1229             return nullptr;
1230         }
1231     }
1232     auto promise = CommonFunc::AsyncCallNativeMethod(env, callbackPtr.get(), GetFunctionName(callbackPtr->option),
1233         UninstallByUninstallParamExecuter, OperationCompleted);
1234     callbackPtr.release();
1235     return promise;
1236 }
1237 
UninstallOrRecover(napi_env env,napi_callback_info info,std::unique_ptr<AsyncInstallCallbackInfo> & callbackPtr)1238 napi_value UninstallOrRecover(napi_env env, napi_callback_info info,
1239     std::unique_ptr<AsyncInstallCallbackInfo> &callbackPtr)
1240 {
1241     APP_LOGD("UninstallOrRecover by bundleName called");
1242     // obtain arguments of install interface
1243     NapiArg args(env, info);
1244     if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_THREE)) {
1245         APP_LOGE("init param failed");
1246         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1247         return nullptr;
1248     }
1249 
1250     auto argc = args.GetMaxArgc();
1251     APP_LOGD("the number of argc is  %{public}zu", argc);
1252     if (argc < ARGS_SIZE_ONE) {
1253         APP_LOGE("the params number is incorrect");
1254         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1255         return nullptr;
1256     }
1257 
1258     for (size_t i = 0; i < args.GetMaxArgc(); ++i) {
1259         napi_valuetype valueType = napi_undefined;
1260         napi_typeof(env, args[i], &valueType);
1261         if (i == ARGS_POS_ZERO) {
1262             if (!CommonFunc::ParseString(env, args[i], callbackPtr->bundleName)) {
1263                 APP_LOGE("Flags %{public}s invalid", callbackPtr->bundleName.c_str());
1264                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, PARAMETERS, CORRESPONDING_TYPE);
1265                 return nullptr;
1266             }
1267         } else if (i == ARGS_POS_ONE) {
1268             if (valueType == napi_function) {
1269                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &callbackPtr->callback));
1270                 break;
1271             }
1272             if (valueType == napi_object && !ParseInstallParam(env, args[i], callbackPtr->installParam)) {
1273                 APP_LOGE("Parse installParam.hashParams failed");
1274                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, PARAMETERS, CORRESPONDING_TYPE);
1275                 return nullptr;
1276             }
1277         } else if (i == ARGS_POS_TWO) {
1278             if (valueType == napi_function) {
1279                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &callbackPtr->callback));
1280                 break;
1281             }
1282         } else {
1283             APP_LOGE("param check error");
1284             BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, PARAMETERS, CORRESPONDING_TYPE);
1285             return nullptr;
1286         }
1287     }
1288 
1289     auto promise = CommonFunc::AsyncCallNativeMethod(env, callbackPtr.get(), GetFunctionName(callbackPtr->option),
1290         UninstallOrRecoverExecuter, OperationCompleted);
1291     callbackPtr.release();
1292     return promise;
1293 }
1294 
Recover(napi_env env,napi_callback_info info)1295 napi_value Recover(napi_env env, napi_callback_info info)
1296 {
1297     APP_LOGI("Recover called");
1298     std::unique_ptr<AsyncInstallCallbackInfo> callbackPtr = std::make_unique<AsyncInstallCallbackInfo>(env);
1299     callbackPtr->option = InstallOption::RECOVER;
1300     APP_LOGI("call Recover done");
1301     return UninstallOrRecover(env, info, callbackPtr);
1302 }
1303 
Uninstall(napi_env env,napi_callback_info info)1304 napi_value Uninstall(napi_env env, napi_callback_info info)
1305 {
1306     APP_LOGI_NOFUNC("Uninstall called");
1307     std::unique_ptr<AsyncInstallCallbackInfo> callbackPtr = std::make_unique<AsyncInstallCallbackInfo>(env);
1308     callbackPtr->option = InstallOption::UNINSTALL;
1309     // uninstall uninstallParam
1310     NapiArg args(env, info);
1311     args.Init(ARGS_SIZE_ONE, ARGS_SIZE_THREE);
1312     napi_valuetype firstType = napi_undefined;
1313     napi_typeof(env, args[FIRST_PARAM], &firstType);
1314     if (firstType == napi_object) {
1315         return UninstallByUninstallParam(env, info, callbackPtr);
1316     }
1317     APP_LOGI_NOFUNC("call Uninstall done");
1318     return UninstallOrRecover(env, info, callbackPtr);
1319 }
1320 
BundleInstallerConstructor(napi_env env,napi_callback_info info)1321 napi_value BundleInstallerConstructor(napi_env env, napi_callback_info info)
1322 {
1323     napi_value jsthis = nullptr;
1324     NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &jsthis, nullptr));
1325     return jsthis;
1326 }
1327 
1328 /**
1329  * Promise and async callback
1330  */
UpdateBundleForSelf(napi_env env,napi_callback_info info)1331 napi_value UpdateBundleForSelf(napi_env env, napi_callback_info info)
1332 {
1333     APP_LOGI("UpdateBundleForSelf called");
1334     // obtain arguments of install interface
1335     NapiArg args(env, info);
1336     if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_THREE)) {
1337         APP_LOGE("init param failed");
1338         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1339         return nullptr;
1340     }
1341     auto argc = args.GetMaxArgc();
1342     std::unique_ptr<AsyncInstallCallbackInfo> callbackPtr = std::make_unique<AsyncInstallCallbackInfo>(env);
1343     callbackPtr->option = InstallOption::UPDATE_BUNDLE_FOR_SELF;
1344     for (size_t i = 0; i < argc; ++i) {
1345         napi_valuetype valueType = napi_undefined;
1346         napi_typeof(env, args[i], &valueType);
1347         if (i == ARGS_POS_ZERO) {
1348             if (!CommonFunc::ParseStringArray(env, callbackPtr->hapFiles, args[i])) {
1349                 APP_LOGE("Flags %{public}s invalid", callbackPtr->bundleName.c_str());
1350                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, PARAMETERS, CORRESPONDING_TYPE);
1351                 return nullptr;
1352             }
1353         } else if (i == ARGS_POS_ONE) {
1354             if (valueType == napi_function) {
1355                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &callbackPtr->callback));
1356                 break;
1357             }
1358             if (valueType == napi_object && !ParseInstallParam(env, args[i], callbackPtr->installParam)) {
1359                 APP_LOGE("Parse installParam failed");
1360                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, PARAMETERS, CORRESPONDING_TYPE);
1361                 return nullptr;
1362             }
1363         } else if (i == ARGS_POS_TWO) {
1364             if (valueType == napi_function) {
1365                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &callbackPtr->callback));
1366                 break;
1367             }
1368         } else {
1369             APP_LOGE("param check error");
1370             BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, PARAMETERS, CORRESPONDING_TYPE);
1371             return nullptr;
1372         }
1373     }
1374     if (!CheckInstallParam(env, callbackPtr->installParam)) {
1375         return nullptr;
1376     }
1377     if (callbackPtr->hapFiles.empty() && !callbackPtr->installParam.verifyCodeParams.empty()) {
1378         BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, HAPS_FILE_NEEDED);
1379         return nullptr;
1380     }
1381     callbackPtr->installParam.isSelfUpdate = true;
1382     auto promise = CommonFunc::AsyncCallNativeMethod(env, callbackPtr.get(), RESOURCE_NAME_OF_INSTALL, InstallExecuter,
1383         OperationCompleted);
1384     callbackPtr.release();
1385     APP_LOGI("call UpdateBundleForSelf done");
1386     return promise;
1387 }
1388 
UninstallAndRecoverExecuter(napi_env env,void * data)1389 void UninstallAndRecoverExecuter(napi_env env, void *data)
1390 {
1391     AsyncInstallCallbackInfo *asyncCallbackInfo = reinterpret_cast<AsyncInstallCallbackInfo *>(data);
1392     if (asyncCallbackInfo == nullptr) {
1393         APP_LOGE("asyncCallbackInfo is nullptr");
1394         return;
1395     }
1396     const std::string bundleName = asyncCallbackInfo->bundleName;
1397     InstallResult &installResult = asyncCallbackInfo->installResult;
1398     if (bundleName.empty()) {
1399         installResult.resultCode = static_cast<int32_t>(IStatusReceiver::ERR_RECOVER_INVALID_BUNDLE_NAME);
1400         return;
1401     }
1402     auto iBundleInstaller = CommonFunc::GetBundleInstaller();
1403     if ((iBundleInstaller == nullptr) || (iBundleInstaller->AsObject() == nullptr)) {
1404         APP_LOGE("can not get iBundleInstaller");
1405         installResult.resultCode = static_cast<int32_t>(IStatusReceiver::ERR_INSTALL_INTERNAL_ERROR);
1406         return;
1407     }
1408     sptr<InstallerCallback> callback = new (std::nothrow) InstallerCallback();
1409     sptr<BundleDeathRecipient> recipient(new (std::nothrow) BundleDeathRecipient(callback));
1410     if (callback == nullptr || recipient == nullptr) {
1411         APP_LOGE("callback or death recipient is nullptr");
1412         installResult.resultCode = static_cast<int32_t>(IStatusReceiver::ERR_INSTALL_INTERNAL_ERROR);
1413         return;
1414     }
1415     iBundleInstaller->AsObject()->AddDeathRecipient(recipient);
1416     iBundleInstaller->UninstallAndRecover(bundleName, asyncCallbackInfo->installParam, callback);
1417     installResult.resultMsg = callback->GetResultMsg();
1418     installResult.resultCode = callback->GetResultCode();
1419 }
1420 
UninstallAndRecover(napi_env env,napi_callback_info info)1421 napi_value UninstallAndRecover(napi_env env, napi_callback_info info)
1422 {
1423     APP_LOGI("UninstallAndRecover called");
1424     NapiArg args(env, info);
1425     if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_TWO)) {
1426         APP_LOGE("init param failed");
1427         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1428         return nullptr;
1429     }
1430     std::unique_ptr<AsyncInstallCallbackInfo> callbackPtr = std::make_unique<AsyncInstallCallbackInfo>(env);
1431     callbackPtr->option = InstallOption::UNINSTALL_AND_RECOVER;
1432     for (size_t i = 0; i < args.GetArgc(); ++i) {
1433         napi_valuetype valueType = napi_undefined;
1434         napi_typeof(env, args[i], &valueType);
1435         if (i == ARGS_POS_ZERO) {
1436             if (!CommonFunc::ParseString(env, args[i], callbackPtr->bundleName)) {
1437                 APP_LOGE("bundleName %{public}s invalid!", callbackPtr->bundleName.c_str());
1438                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
1439                 return nullptr;
1440             }
1441         } else if (i == ARGS_POS_ONE) {
1442             if (valueType != napi_object || !ParseInstallParam(env, args[i], callbackPtr->installParam)) {
1443                 APP_LOGW("Parse installParam failed");
1444             }
1445         } else {
1446             APP_LOGE("The number of parameters is incorrect.");
1447             BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1448             return nullptr;
1449         }
1450     }
1451     auto promise = CommonFunc::AsyncCallNativeMethod(env, callbackPtr.get(), RESOURCE_NAME_OF_UNINSTALL_AND_RECOVER,
1452         UninstallAndRecoverExecuter, OperationCompleted);
1453     callbackPtr.release();
1454     APP_LOGI("call UninstallAndRecover done");
1455     return promise;
1456 }
1457 
InnerAddExtResource(const std::string & bundleName,const std::vector<std::string> & filePaths)1458 ErrCode InnerAddExtResource(
1459     const std::string &bundleName, const std::vector<std::string> &filePaths)
1460 {
1461     auto extResourceManager = CommonFunc::GetExtendResourceManager();
1462     if (extResourceManager == nullptr) {
1463         APP_LOGE("extResourceManager is null");
1464         return ERROR_BUNDLE_SERVICE_EXCEPTION;
1465     }
1466 
1467     std::vector<std::string> destFiles;
1468     ErrCode ret = extResourceManager->CopyFiles(filePaths, destFiles);
1469     if (ret != ERR_OK) {
1470         APP_LOGE("CopyFiles failed");
1471         return CommonFunc::ConvertErrCode(ret);
1472     }
1473 
1474     ret = extResourceManager->AddExtResource(bundleName, destFiles);
1475     if (ret != ERR_OK) {
1476         APP_LOGE("AddExtResource failed");
1477     }
1478 
1479     return CommonFunc::ConvertErrCode(ret);
1480 }
1481 
AddExtResourceExec(napi_env env,void * data)1482 void AddExtResourceExec(napi_env env, void *data)
1483 {
1484     ExtResourceCallbackInfo *asyncCallbackInfo = reinterpret_cast<ExtResourceCallbackInfo *>(data);
1485     if (asyncCallbackInfo == nullptr) {
1486         APP_LOGE("asyncCallbackInfo is null");
1487         return;
1488     }
1489     asyncCallbackInfo->err = InnerAddExtResource(
1490         asyncCallbackInfo->bundleName, asyncCallbackInfo->filePaths);
1491 }
1492 
AddExtResourceComplete(napi_env env,napi_status status,void * data)1493 void AddExtResourceComplete(napi_env env, napi_status status, void *data)
1494 {
1495     ExtResourceCallbackInfo *asyncCallbackInfo = reinterpret_cast<ExtResourceCallbackInfo *>(data);
1496     if (asyncCallbackInfo == nullptr) {
1497         APP_LOGE("asyncCallbackInfo is null");
1498         return;
1499     }
1500 
1501     std::unique_ptr<ExtResourceCallbackInfo> callbackPtr {asyncCallbackInfo};
1502     napi_value result[ARGS_POS_TWO] = {0};
1503     if (asyncCallbackInfo->err == NO_ERROR) {
1504         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
1505     } else {
1506         result[0] = BusinessError::CreateCommonError(
1507             env, asyncCallbackInfo->err, ADD_EXT_RESOURCE, Constants::PERMISSION_INSTALL_BUNDLE);
1508     }
1509 
1510     CommonFunc::NapiReturnDeferred<ExtResourceCallbackInfo>(
1511         env, asyncCallbackInfo, result, ARGS_SIZE_ONE);
1512 }
1513 
AddExtResource(napi_env env,napi_callback_info info)1514 napi_value AddExtResource(napi_env env, napi_callback_info info)
1515 {
1516     APP_LOGD("AddExtResource called");
1517     NapiArg args(env, info);
1518     ExtResourceCallbackInfo *asyncCallbackInfo = new (std::nothrow) ExtResourceCallbackInfo(env);
1519     if (asyncCallbackInfo == nullptr) {
1520         APP_LOGE("asyncCallbackInfo is null");
1521         return nullptr;
1522     }
1523     std::unique_ptr<ExtResourceCallbackInfo> callbackPtr {asyncCallbackInfo};
1524     if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_TWO)) {
1525         APP_LOGE("param count invalid");
1526         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1527         return nullptr;
1528     }
1529     for (size_t i = 0; i < args.GetArgc(); ++i) {
1530         napi_valuetype valueType = napi_undefined;
1531         napi_typeof(env, args[i], &valueType);
1532         if (i == ARGS_POS_ZERO) {
1533             if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->bundleName)) {
1534                 APP_LOGE("bundleName invalid");
1535                 BusinessError::ThrowParameterTypeError(
1536                     env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
1537                 return nullptr;
1538             }
1539         } else if (i == ARGS_POS_ONE) {
1540             if (CommonFunc::ParseStringArray(env, asyncCallbackInfo->filePaths, args[i]) == nullptr) {
1541                 APP_LOGE("filePaths invalid");
1542                 BusinessError::ThrowParameterTypeError(
1543                     env, ERROR_PARAM_CHECK_ERROR, FILE_PATH, TYPE_ARRAY);
1544                 return nullptr;
1545             }
1546         }
1547     }
1548     auto promise = CommonFunc::AsyncCallNativeMethod<ExtResourceCallbackInfo>(
1549         env, asyncCallbackInfo, "AddExtResource", AddExtResourceExec, AddExtResourceComplete);
1550     callbackPtr.release();
1551     APP_LOGD("call AddExtResource done");
1552     return promise;
1553 }
1554 
InnerRemoveExtResource(const std::string & bundleName,const std::vector<std::string> & moduleNames)1555 ErrCode InnerRemoveExtResource(
1556     const std::string &bundleName, const std::vector<std::string> &moduleNames)
1557 {
1558     auto extResourceManager = CommonFunc::GetExtendResourceManager();
1559     if (extResourceManager == nullptr) {
1560         APP_LOGE("extResourceManager is null");
1561         return ERROR_BUNDLE_SERVICE_EXCEPTION;
1562     }
1563 
1564     ErrCode ret = extResourceManager->RemoveExtResource(bundleName, moduleNames);
1565     if (ret != ERR_OK) {
1566         APP_LOGE("RemoveExtResource failed");
1567     }
1568 
1569     return CommonFunc::ConvertErrCode(ret);
1570 }
1571 
RemoveExtResourceExec(napi_env env,void * data)1572 void RemoveExtResourceExec(napi_env env, void *data)
1573 {
1574     ExtResourceCallbackInfo *asyncCallbackInfo = reinterpret_cast<ExtResourceCallbackInfo *>(data);
1575     if (asyncCallbackInfo == nullptr) {
1576         APP_LOGE("asyncCallbackInfo is null");
1577         return;
1578     }
1579     asyncCallbackInfo->err = InnerRemoveExtResource(
1580         asyncCallbackInfo->bundleName, asyncCallbackInfo->moduleNames);
1581 }
1582 
RemoveExtResourceComplete(napi_env env,napi_status status,void * data)1583 void RemoveExtResourceComplete(napi_env env, napi_status status, void *data)
1584 {
1585     ExtResourceCallbackInfo *asyncCallbackInfo = reinterpret_cast<ExtResourceCallbackInfo *>(data);
1586     if (asyncCallbackInfo == nullptr) {
1587         APP_LOGE("asyncCallbackInfo is null");
1588         return;
1589     }
1590 
1591     std::unique_ptr<ExtResourceCallbackInfo> callbackPtr {asyncCallbackInfo};
1592     napi_value result[ARGS_POS_TWO] = {0};
1593     if (asyncCallbackInfo->err == NO_ERROR) {
1594         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
1595     } else {
1596         result[0] = BusinessError::CreateCommonError(
1597             env, asyncCallbackInfo->err, REMOVE_EXT_RESOURCE, Constants::PERMISSION_INSTALL_BUNDLE);
1598     }
1599 
1600     CommonFunc::NapiReturnDeferred<ExtResourceCallbackInfo>(
1601         env, asyncCallbackInfo, result, ARGS_SIZE_ONE);
1602 }
1603 
RemoveExtResource(napi_env env,napi_callback_info info)1604 napi_value RemoveExtResource(napi_env env, napi_callback_info info)
1605 {
1606     APP_LOGD("RemoveExtResource called");
1607     NapiArg args(env, info);
1608     ExtResourceCallbackInfo *asyncCallbackInfo = new (std::nothrow) ExtResourceCallbackInfo(env);
1609     if (asyncCallbackInfo == nullptr) {
1610         APP_LOGE("asyncCallbackInfo is null");
1611         return nullptr;
1612     }
1613     std::unique_ptr<ExtResourceCallbackInfo> callbackPtr {asyncCallbackInfo};
1614     if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_TWO)) {
1615         APP_LOGE("param count invalid");
1616         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1617         return nullptr;
1618     }
1619     for (size_t i = 0; i < args.GetArgc(); ++i) {
1620         napi_valuetype valueType = napi_undefined;
1621         napi_typeof(env, args[i], &valueType);
1622         if (i == ARGS_POS_ZERO) {
1623             if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->bundleName)) {
1624                 APP_LOGE("bundleName invalid");
1625                 BusinessError::ThrowParameterTypeError(
1626                     env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
1627                 return nullptr;
1628             }
1629         } else if (i == ARGS_POS_ONE) {
1630             if (CommonFunc::ParseStringArray(env, asyncCallbackInfo->moduleNames, args[i]) == nullptr) {
1631                 APP_LOGE("moduleNames invalid");
1632                 BusinessError::ThrowParameterTypeError(
1633                     env, ERROR_PARAM_CHECK_ERROR, MODULE_NAME, TYPE_ARRAY);
1634                 return nullptr;
1635             }
1636         }
1637     }
1638     auto promise = CommonFunc::AsyncCallNativeMethod<ExtResourceCallbackInfo>(
1639         env, asyncCallbackInfo, "RemoveExtResource", RemoveExtResourceExec, RemoveExtResourceComplete);
1640     callbackPtr.release();
1641     APP_LOGD("call RemoveExtResource done");
1642     return promise;
1643 }
1644 
InnerCreateAppClone(std::string & bundleName,int32_t userId,int32_t & appIndex)1645 static ErrCode InnerCreateAppClone(std::string &bundleName, int32_t userId, int32_t &appIndex)
1646 {
1647     auto iBundleMgr = CommonFunc::GetBundleMgr();
1648     if (iBundleMgr == nullptr) {
1649         APP_LOGE("can not get iBundleMgr");
1650         return ERROR_BUNDLE_SERVICE_EXCEPTION;
1651     }
1652     auto iBundleInstaller = iBundleMgr->GetBundleInstaller();
1653     if ((iBundleInstaller == nullptr) || (iBundleInstaller->AsObject() == nullptr)) {
1654         APP_LOGE("can not get iBundleInstaller");
1655         return ERROR_BUNDLE_SERVICE_EXCEPTION;
1656     }
1657     ErrCode result = iBundleInstaller->InstallCloneApp(bundleName, userId, appIndex);
1658     APP_LOGD("InstallCloneApp result is %{public}d", result);
1659     return result;
1660 }
1661 
CreateAppCloneExec(napi_env env,void * data)1662 void CreateAppCloneExec(napi_env env, void *data)
1663 {
1664     CreateAppCloneCallbackInfo *asyncCallbackInfo = reinterpret_cast<CreateAppCloneCallbackInfo *>(data);
1665     if (asyncCallbackInfo == nullptr) {
1666         APP_LOGE("asyncCallbackInfo is null");
1667         return;
1668     }
1669     APP_LOGD("CreateAppCloneExec param: bundleName = %{public}s, userId = %{public}d, appIndex = %{public}d",
1670         asyncCallbackInfo->bundleName.c_str(),
1671         asyncCallbackInfo->userId,
1672         asyncCallbackInfo->appIndex);
1673     asyncCallbackInfo->err =
1674         InnerCreateAppClone(asyncCallbackInfo->bundleName, asyncCallbackInfo->userId, asyncCallbackInfo->appIndex);
1675 }
1676 
CreateAppCloneComplete(napi_env env,napi_status status,void * data)1677 void CreateAppCloneComplete(napi_env env, napi_status status, void *data)
1678 {
1679     CreateAppCloneCallbackInfo *asyncCallbackInfo = reinterpret_cast<CreateAppCloneCallbackInfo *>(data);
1680     if (asyncCallbackInfo == nullptr) {
1681         APP_LOGE("asyncCallbackInfo is null");
1682         return;
1683     }
1684     std::unique_ptr<CreateAppCloneCallbackInfo> callbackPtr {asyncCallbackInfo};
1685     asyncCallbackInfo->err = CommonFunc::ConvertErrCode(asyncCallbackInfo->err);
1686     APP_LOGD("CreateAppCloneComplete err is %{public}d, appIndex is %{public}d",
1687         asyncCallbackInfo->err,
1688         asyncCallbackInfo->appIndex);
1689     napi_value result[ARGS_SIZE_TWO] = {0};
1690     if (asyncCallbackInfo->err == SUCCESS) {
1691         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[FIRST_PARAM]));
1692         NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, asyncCallbackInfo->appIndex, &result[SECOND_PARAM]));
1693     } else {
1694         result[FIRST_PARAM] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
1695             CREATE_APP_CLONE, Constants::PERMISSION_INSTALL_CLONE_BUNDLE);
1696     }
1697     CommonFunc::NapiReturnDeferred<CreateAppCloneCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
1698 }
1699 
ParseAppCloneParam(napi_env env,napi_value args,int32_t & userId,int32_t & appIndex)1700 void ParseAppCloneParam(napi_env env, napi_value args, int32_t &userId, int32_t &appIndex)
1701 {
1702     if (!ParseUserId(env, args, userId)) {
1703         APP_LOGI("parse userId failed. assign a default value = %{public}d", userId);
1704     }
1705     if (ParseAppIndex(env, args, appIndex)) {
1706         if (appIndex == 0) {
1707             APP_LOGI("parse appIndex success, but appIndex is 0, assign a value: %{public}d", ILLEGAL_APP_INDEX);
1708             appIndex = ILLEGAL_APP_INDEX;
1709         }
1710     } else {
1711         APP_LOGI("parse appIndex failed. assign a default value = %{public}d", appIndex);
1712     }
1713 }
1714 
CreateAppClone(napi_env env,napi_callback_info info)1715 napi_value CreateAppClone(napi_env env, napi_callback_info info)
1716 {
1717     APP_LOGI("begin to CreateAppClone");
1718     NapiArg args(env, info);
1719     std::unique_ptr<CreateAppCloneCallbackInfo> asyncCallbackInfo = std::make_unique<CreateAppCloneCallbackInfo>(env);
1720     if (asyncCallbackInfo == nullptr) {
1721         APP_LOGW("asyncCallbackInfo is null");
1722         return nullptr;
1723     }
1724     if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_TWO)) {
1725         APP_LOGW("param count invalid");
1726         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1727         return nullptr;
1728     }
1729     size_t argc = args.GetMaxArgc();
1730     for (size_t i = 0; i < argc; ++i) {
1731         napi_valuetype valueType = napi_undefined;
1732         napi_typeof(env, args[i], &valueType);
1733         if (i == ARGS_POS_ZERO) {
1734             if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->bundleName)) {
1735                 APP_LOGW("parse bundleName failed");
1736                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
1737                 return nullptr;
1738             }
1739         } else if (i == ARGS_POS_ONE) {
1740             if (valueType == napi_object) {
1741                 ParseAppCloneParam(env, args[i], asyncCallbackInfo->userId, asyncCallbackInfo->appIndex);
1742             }
1743         } else {
1744             APP_LOGW("The number of parameters is incorrect");
1745             BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1746             return nullptr;
1747         }
1748     }
1749     if (asyncCallbackInfo->userId == Constants::UNSPECIFIED_USERID) {
1750         asyncCallbackInfo->userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
1751     }
1752     auto promise = CommonFunc::AsyncCallNativeMethod<CreateAppCloneCallbackInfo>(
1753         env, asyncCallbackInfo.get(), CREATE_APP_CLONE, CreateAppCloneExec, CreateAppCloneComplete);
1754     asyncCallbackInfo.release();
1755     APP_LOGI("call napi CreateAppClone done");
1756     return promise;
1757 }
1758 
InnerDestroyAppClone(std::string & bundleName,int32_t userId,int32_t appIndex,DestroyAppCloneParam & destroyAppCloneParam)1759 static ErrCode InnerDestroyAppClone(std::string &bundleName, int32_t userId, int32_t appIndex,
1760                                     DestroyAppCloneParam &destroyAppCloneParam)
1761 {
1762     auto iBundleMgr = CommonFunc::GetBundleMgr();
1763     if (iBundleMgr == nullptr) {
1764         APP_LOGE("can not get iBundleMgr");
1765         return ERROR_BUNDLE_SERVICE_EXCEPTION;
1766     }
1767     auto iBundleInstaller = iBundleMgr->GetBundleInstaller();
1768     if ((iBundleInstaller == nullptr) || (iBundleInstaller->AsObject() == nullptr)) {
1769         APP_LOGE("can not get iBundleInstaller");
1770         return ERROR_BUNDLE_SERVICE_EXCEPTION;
1771     }
1772     ErrCode result = iBundleInstaller->UninstallCloneApp(bundleName, userId, appIndex, destroyAppCloneParam);
1773     APP_LOGD("UninstallCloneApp result is %{public}d", result);
1774     return result;
1775 }
1776 
DestroyAppCloneExec(napi_env env,void * data)1777 void DestroyAppCloneExec(napi_env env, void *data)
1778 {
1779     CreateAppCloneCallbackInfo *asyncCallbackInfo = reinterpret_cast<CreateAppCloneCallbackInfo *>(data);
1780     if (asyncCallbackInfo == nullptr) {
1781         APP_LOGE("asyncCallbackInfo is null");
1782         return;
1783     }
1784     APP_LOGD("DestroyAppCloneExec param: bundleName = %{public}s, userId = %{public}d, appIndex = %{public}d",
1785         asyncCallbackInfo->bundleName.c_str(),
1786         asyncCallbackInfo->userId,
1787         asyncCallbackInfo->appIndex);
1788     asyncCallbackInfo->err =
1789     InnerDestroyAppClone(asyncCallbackInfo->bundleName, asyncCallbackInfo->userId,
1790                          asyncCallbackInfo->appIndex, asyncCallbackInfo->destroyAppCloneParam);
1791 }
1792 
DestroyAppCloneComplete(napi_env env,napi_status status,void * data)1793 void DestroyAppCloneComplete(napi_env env, napi_status status, void *data)
1794 {
1795     CreateAppCloneCallbackInfo *asyncCallbackInfo = reinterpret_cast<CreateAppCloneCallbackInfo *>(data);
1796     if (asyncCallbackInfo == nullptr) {
1797         APP_LOGE("asyncCallbackInfo is null");
1798         return;
1799     }
1800     std::unique_ptr<CreateAppCloneCallbackInfo> callbackPtr {asyncCallbackInfo};
1801     asyncCallbackInfo->err = CommonFunc::ConvertErrCode(asyncCallbackInfo->err);
1802     APP_LOGD("DestroyAppCloneComplete err is %{public}d, appIndex is %{public}d",
1803         asyncCallbackInfo->err,
1804         asyncCallbackInfo->appIndex);
1805     napi_value result[ARGS_SIZE_TWO] = {0};
1806     if (asyncCallbackInfo->err == SUCCESS) {
1807         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[FIRST_PARAM]));
1808     } else {
1809         result[FIRST_PARAM] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
1810             DESTROY_APP_CLONE, Constants::PERMISSION_UNINSTALL_CLONE_BUNDLE);
1811     }
1812     CommonFunc::NapiReturnDeferred<CreateAppCloneCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_ONE);
1813 }
1814 
ParseDestroyAppCloneParam(napi_env env,napi_value args,napi_valuetype valueType,int32_t & userId,DestroyAppCloneParam & destroyAppCloneParam)1815 static bool ParseDestroyAppCloneParam(napi_env env, napi_value args, napi_valuetype valueType, int32_t &userId,
1816                                       DestroyAppCloneParam &destroyAppCloneParam)
1817 {
1818     if (valueType == napi_number && !CommonFunc::ParseInt(env, args, userId)) {
1819         APP_LOGW("parse userId failed,set this parameter to the caller userId");
1820     } else if (valueType == napi_object) {
1821         if (!ParseUserId(env, args, destroyAppCloneParam.userId)) {
1822             APP_LOGW("parse userId failed,using default value");
1823         } else {
1824             userId = destroyAppCloneParam.userId;
1825         }
1826         if (!ParseParameters(env, args, destroyAppCloneParam.parameters)) {
1827             APP_LOGW("parse parameters failed,using default value");
1828         }
1829     }
1830     return true;
1831 }
1832 
DestroyAppClone(napi_env env,napi_callback_info info)1833 napi_value DestroyAppClone(napi_env env, napi_callback_info info)
1834 {
1835     APP_LOGI("begin to destroyAppClone");
1836     NapiArg args(env, info);
1837     std::unique_ptr<CreateAppCloneCallbackInfo> asyncCallbackInfo = std::make_unique<CreateAppCloneCallbackInfo>(env);
1838     if (asyncCallbackInfo == nullptr) {
1839         APP_LOGW("asyncCallbackInfo is null");
1840         return nullptr;
1841     }
1842     if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_THREE)) {
1843         APP_LOGW("param count invalid");
1844         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1845         return nullptr;
1846     }
1847     size_t argc = args.GetMaxArgc();
1848     for (size_t i = 0; i < argc; ++i) {
1849         napi_valuetype valueType = napi_undefined;
1850         napi_typeof(env, args[i], &valueType);
1851         if (i == ARGS_POS_ZERO) {
1852             if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->bundleName)) {
1853                 APP_LOGW("parse bundleName failed");
1854                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
1855                 return nullptr;
1856             }
1857         } else if (i == ARGS_POS_ONE) {
1858             if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->appIndex)) {
1859                 APP_LOGW("parse appIndex failed");
1860                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, APP_INDEX, TYPE_NUMBER);
1861                 return nullptr;
1862             }
1863         } else if (i == ARGS_POS_TWO) {
1864             if (!ParseDestroyAppCloneParam(
1865                 env, args[i], valueType, asyncCallbackInfo->userId, asyncCallbackInfo->destroyAppCloneParam)) {
1866                 APP_LOGW("parse destroyAppCloneParam failed");
1867             }
1868         } else {
1869             APP_LOGE("The number of parameters is incorrect");
1870             BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1871             return nullptr;
1872         }
1873     }
1874     if (asyncCallbackInfo->userId == Constants::UNSPECIFIED_USERID) {
1875         asyncCallbackInfo->userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
1876     }
1877     auto promise = CommonFunc::AsyncCallNativeMethod<CreateAppCloneCallbackInfo>(
1878         env, asyncCallbackInfo.get(), DESTROY_APP_CLONE, DestroyAppCloneExec, DestroyAppCloneComplete);
1879     asyncCallbackInfo.release();
1880     APP_LOGI("call napi destroyAppTwin done");
1881     return promise;
1882 }
1883 
InnerInstallPreexistingApp(std::string & bundleName,int32_t userId)1884 static ErrCode InnerInstallPreexistingApp(std::string &bundleName, int32_t userId)
1885 {
1886     auto iBundleMgr = CommonFunc::GetBundleMgr();
1887     if (iBundleMgr == nullptr) {
1888         APP_LOGE("can not get iBundleMgr");
1889         return ERROR_BUNDLE_SERVICE_EXCEPTION;
1890     }
1891     auto iBundleInstaller = iBundleMgr->GetBundleInstaller();
1892     if ((iBundleInstaller == nullptr) || (iBundleInstaller->AsObject() == nullptr)) {
1893         APP_LOGE("can not get iBundleInstaller");
1894         return ERROR_BUNDLE_SERVICE_EXCEPTION;
1895     }
1896     ErrCode result = iBundleInstaller->InstallExisted(bundleName, userId);
1897     APP_LOGD("result is %{public}d", result);
1898     return result;
1899 }
1900 
InstallPreexistingAppExec(napi_env env,void * data)1901 void InstallPreexistingAppExec(napi_env env, void *data)
1902 {
1903     InstallPreexistingAppCallbackInfo *asyncCallbackInfo = reinterpret_cast<InstallPreexistingAppCallbackInfo *>(data);
1904     if (asyncCallbackInfo == nullptr) {
1905         APP_LOGE("asyncCallbackInfo is null");
1906         return;
1907     }
1908     APP_LOGD("param: bundleName = %{public}s, userId = %{public}d",
1909         asyncCallbackInfo->bundleName.c_str(),
1910         asyncCallbackInfo->userId);
1911     asyncCallbackInfo->err =
1912         InnerInstallPreexistingApp(asyncCallbackInfo->bundleName, asyncCallbackInfo->userId);
1913 }
1914 
InstallPreexistingAppComplete(napi_env env,napi_status status,void * data)1915 void InstallPreexistingAppComplete(napi_env env, napi_status status, void *data)
1916 {
1917     InstallPreexistingAppCallbackInfo *asyncCallbackInfo = reinterpret_cast<InstallPreexistingAppCallbackInfo *>(data);
1918     if (asyncCallbackInfo == nullptr) {
1919         APP_LOGE("asyncCallbackInfo is null");
1920         return;
1921     }
1922     std::unique_ptr<InstallPreexistingAppCallbackInfo> callbackPtr {asyncCallbackInfo};
1923     asyncCallbackInfo->err = CommonFunc::ConvertErrCode(asyncCallbackInfo->err);
1924     APP_LOGD("err is %{public}d", asyncCallbackInfo->err);
1925 
1926     napi_value result[ARGS_SIZE_ONE] = {0};
1927     if (asyncCallbackInfo->err == SUCCESS) {
1928         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[FIRST_PARAM]));
1929     } else {
1930         result[FIRST_PARAM] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
1931             INSTALL_PREEXISTING_APP, Constants::PERMISSION_INSTALL_BUNDLE);
1932     }
1933     CommonFunc::NapiReturnDeferred<InstallPreexistingAppCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_ONE);
1934 }
1935 
InstallPreexistingApp(napi_env env,napi_callback_info info)1936 napi_value InstallPreexistingApp(napi_env env, napi_callback_info info)
1937 {
1938     APP_LOGI("begin");
1939     NapiArg args(env, info);
1940     std::unique_ptr<InstallPreexistingAppCallbackInfo> asyncCallbackInfo
1941         = std::make_unique<InstallPreexistingAppCallbackInfo>(env);
1942     if (asyncCallbackInfo == nullptr) {
1943         APP_LOGW("asyncCallbackInfo is null");
1944         return nullptr;
1945     }
1946     if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_TWO)) {
1947         APP_LOGW("param count invalid");
1948         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1949         return nullptr;
1950     }
1951     size_t argc = args.GetMaxArgc();
1952     for (size_t i = 0; i < argc; ++i) {
1953         if (i == ARGS_POS_ZERO) {
1954             if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->bundleName)) {
1955                 APP_LOGW("parse bundleName failed");
1956                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
1957                 return nullptr;
1958             }
1959         } else if (i == ARGS_POS_ONE) {
1960             if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->userId)) {
1961                 APP_LOGW("parse userId failed");
1962             }
1963         } else {
1964             APP_LOGW("The number of parameters is incorrect");
1965             BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1966             return nullptr;
1967         }
1968     }
1969     if (asyncCallbackInfo->userId == Constants::UNSPECIFIED_USERID) {
1970         asyncCallbackInfo->userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
1971     }
1972     auto promise = CommonFunc::AsyncCallNativeMethod<InstallPreexistingAppCallbackInfo>(
1973         env, asyncCallbackInfo.get(), INSTALL_PREEXISTING_APP,
1974         InstallPreexistingAppExec, InstallPreexistingAppComplete);
1975     asyncCallbackInfo.release();
1976     APP_LOGI("call napi done");
1977     return promise;
1978 }
1979 } // AppExecFwk
1980 } // OHOS