• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #include "free_install.h"
16 
17 #include <string>
18 
19 #include "app_log_wrapper.h"
20 #include "bundle_errors.h"
21 #include "bundle_mgr_interface.h"
22 #include "bundle_mgr_proxy.h"
23 #include "business_error.h"
24 #include "common_func.h"
25 #include "napi_arg.h"
26 #include "napi_constants.h"
27 
28 namespace OHOS {
29 namespace AppExecFwk {
30 namespace {
31 enum class UpgradeFlag {
32     NOT_UPGRADE = 0,
33     SINGLE_UPGRADE = 1,
34     RELATION_UPGRADE = 2,
35 };
36 const std::vector<int32_t> BUNDLE_PACK_FLAGS = {
37     BundlePackFlag::GET_PACK_INFO_ALL,
38     BundlePackFlag::GET_PACKAGES,
39     BundlePackFlag::GET_BUNDLE_SUMMARY,
40     BundlePackFlag::GET_MODULE_SUMMARY,
41 };
42 const std::string RESOURCE_NAME_OF_IS_HAP_MODULE_REMOVABLE = "isHapModuleRemovable";
43 const std::string RESOURCE_NAME_OF_SET_HAP_MODULE_UPGRADE_FLAG = "setHapModuleUpgradeFlag";
44 const std::string RESOURCE_NAME_OF_GET_BUNDLE_PACK_INFO = "getBundlePackInfo";
45 const std::string RESOURCE_NAME_OF_GET_DISPATCH_INFO = "getDispatchInfo";
46 const std::string DISPATCH_INFO_VERSION = "1";
47 const std::string DISPATCH_INFO_DISPATCH_API = "1.0";
48 const std::string BUNDLE_NAME = "bundleName";
49 const std::string MODULE_NAME = "moduleName";
50 const std::string UPGRADE_FLAG = "upgradeFlag";
51 const std::string BUNDLE_PACK_FLAG = "bundlePackFlag";
52 }
53 
InnerIsHapModuleRemovable(const std::string & bundleName,const std::string & moduleName,bool & isRemovable)54 static ErrCode InnerIsHapModuleRemovable(const std::string &bundleName,
55     const std::string &moduleName, bool &isRemovable)
56 {
57     auto iBundleMgr = CommonFunc::GetBundleMgr();
58     if (iBundleMgr == nullptr) {
59         APP_LOGE("can not get iBundleMgr");
60         return ERROR_BUNDLE_SERVICE_EXCEPTION;
61     }
62     auto result = iBundleMgr->IsModuleRemovable(bundleName, moduleName, isRemovable);
63     if (result != ERR_OK) {
64         APP_LOGE("InnerIsHapModuleRemovable::IsModuleRemovable failed");
65     }
66     return CommonFunc::ConvertErrCode(result);
67 }
68 
IsHapModuleRemovableExec(napi_env env,void * data)69 void IsHapModuleRemovableExec(napi_env env, void *data)
70 {
71     HapModuleRemovableCallbackInfo *asyncCallbackInfo = reinterpret_cast<HapModuleRemovableCallbackInfo*>(data);
72     if (asyncCallbackInfo == nullptr) {
73         APP_LOGE("%{public}s, asyncCallbackInfo == nullptr.", __func__);
74         return;
75     }
76     asyncCallbackInfo->err = InnerIsHapModuleRemovable(asyncCallbackInfo->bundleName,
77         asyncCallbackInfo->moduleName, asyncCallbackInfo->result);
78 }
79 
IsHapModuleRemovableComplete(napi_env env,napi_status status,void * data)80 void IsHapModuleRemovableComplete(napi_env env, napi_status status, void *data)
81 {
82     HapModuleRemovableCallbackInfo *asyncCallbackInfo = reinterpret_cast<HapModuleRemovableCallbackInfo*>(data);
83     if (asyncCallbackInfo == nullptr) {
84         APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
85         return;
86     }
87     std::unique_ptr<HapModuleRemovableCallbackInfo> callbackPtr {asyncCallbackInfo};
88     napi_value result[ARGS_SIZE_TWO] = {0};
89     if (asyncCallbackInfo->err == SUCCESS) {
90         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
91         NAPI_CALL_RETURN_VOID(env, napi_get_boolean(env, asyncCallbackInfo->result, &result[ARGS_SIZE_ONE]));
92     } else {
93         result[0] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
94             RESOURCE_NAME_OF_IS_HAP_MODULE_REMOVABLE, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
95         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_SIZE_ONE]));
96     }
97     if (asyncCallbackInfo->deferred) {
98         if (asyncCallbackInfo->err == SUCCESS) {
99             NAPI_CALL_RETURN_VOID(env, napi_resolve_deferred(env, asyncCallbackInfo->deferred, result[ARGS_SIZE_ONE]));
100         } else {
101             NAPI_CALL_RETURN_VOID(env, napi_reject_deferred(env, asyncCallbackInfo->deferred, result[0]));
102         }
103     } else {
104         napi_value callback = nullptr;
105         napi_value placeHolder = nullptr;
106         NAPI_CALL_RETURN_VOID(env, napi_get_reference_value(env, asyncCallbackInfo->callback, &callback));
107         NAPI_CALL_RETURN_VOID(env, napi_call_function(env, nullptr, callback,
108             sizeof(result) / sizeof(result[0]), result, &placeHolder));
109     }
110 }
111 
IsHapModuleRemovable(napi_env env,napi_callback_info info)112 napi_value IsHapModuleRemovable(napi_env env, napi_callback_info info)
113 {
114     APP_LOGD("NAPI_IsHapModuleRemovable start");
115     NapiArg args(env, info);
116     if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_THREE)) {
117         APP_LOGE("param count invalid.");
118         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
119         return nullptr;
120     }
121     HapModuleRemovableCallbackInfo *asyncCallbackInfo = new (std::nothrow) HapModuleRemovableCallbackInfo(env);
122     if (asyncCallbackInfo == nullptr) {
123         APP_LOGE("asyncCallbackInfo is null");
124         return nullptr;
125     }
126     std::unique_ptr<HapModuleRemovableCallbackInfo> callbackPtr {asyncCallbackInfo};
127     if (args.GetMaxArgc() >= ARGS_SIZE_TWO) {
128         if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], asyncCallbackInfo->bundleName)) {
129             BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
130             return nullptr;
131         }
132         if (!CommonFunc::ParseString(env, args[ARGS_POS_ONE], asyncCallbackInfo->moduleName)) {
133             BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, MODULE_NAME, TYPE_STRING);
134             return nullptr;
135         }
136         if (args.GetMaxArgc() == ARGS_SIZE_THREE) {
137             napi_valuetype valueType = napi_undefined;
138             napi_typeof(env, args[ARGS_POS_TWO], &valueType);
139             if (valueType == napi_function) {
140                 NAPI_CALL(env, napi_create_reference(env, args[ARGS_POS_TWO],
141                     NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
142             }
143         }
144     } else {
145         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
146         return nullptr;
147     }
148     auto promise = CommonFunc::AsyncCallNativeMethod<HapModuleRemovableCallbackInfo>(
149         env, asyncCallbackInfo, RESOURCE_NAME_OF_IS_HAP_MODULE_REMOVABLE,
150         IsHapModuleRemovableExec, IsHapModuleRemovableComplete);
151     callbackPtr.release();
152     APP_LOGD("call IsHapModuleRemovable done");
153     return promise;
154 }
155 
InnerSetHapModuleUpgradeFlag(const std::string & bundleName,const std::string & moduleName,int32_t upgradeFlag)156 static ErrCode InnerSetHapModuleUpgradeFlag(const std::string &bundleName,
157     const std::string &moduleName, int32_t upgradeFlag)
158 {
159     auto iBundleMgr = CommonFunc::GetBundleMgr();
160     if (iBundleMgr == nullptr) {
161         APP_LOGE("can not get iBundleMgr");
162         return ERROR_BUNDLE_SERVICE_EXCEPTION;
163     }
164     auto result = iBundleMgr->SetModuleUpgradeFlag(bundleName, moduleName, upgradeFlag);
165     if (result != ERR_OK) {
166         APP_LOGE("InnerSetHapModuleUpgradeFlag::SetModuleUpgradeFlag failed");
167     }
168     return CommonFunc::ConvertErrCode(result);
169 }
170 
SetHapModuleUpgradeFlagExec(napi_env env,void * data)171 void SetHapModuleUpgradeFlagExec(napi_env env, void *data)
172 {
173     SetHapModuleUpgradeFlagCallbackInfo *asyncCallbackInfo =
174         reinterpret_cast<SetHapModuleUpgradeFlagCallbackInfo*>(data);
175     if (asyncCallbackInfo == nullptr) {
176         APP_LOGE("%{public}s, asyncCallbackInfo == nullptr.", __func__);
177         return;
178     }
179     asyncCallbackInfo->err = InnerSetHapModuleUpgradeFlag(asyncCallbackInfo->bundleName,
180         asyncCallbackInfo->moduleName, asyncCallbackInfo->upgradeFlag);
181 }
182 
SetHapModuleUpgradeFlagComplete(napi_env env,napi_status status,void * data)183 void SetHapModuleUpgradeFlagComplete(napi_env env, napi_status status, void *data)
184 {
185     SetHapModuleUpgradeFlagCallbackInfo *asyncCallbackInfo =
186         reinterpret_cast<SetHapModuleUpgradeFlagCallbackInfo*>(data);
187     if (asyncCallbackInfo == nullptr) {
188         APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
189         return;
190     }
191     std::unique_ptr<SetHapModuleUpgradeFlagCallbackInfo> callbackPtr {asyncCallbackInfo};
192     napi_value result[ARGS_SIZE_ONE] = {0};
193     if (asyncCallbackInfo->err == SUCCESS) {
194         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
195     } else {
196         result[0] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
197             RESOURCE_NAME_OF_SET_HAP_MODULE_UPGRADE_FLAG, Constants::PERMISSION_INSTALL_BUNDLE);
198     }
199     if (asyncCallbackInfo->deferred) {
200         if (asyncCallbackInfo->err == SUCCESS) {
201             NAPI_CALL_RETURN_VOID(env, napi_resolve_deferred(env, asyncCallbackInfo->deferred, result[0]));
202         } else {
203             NAPI_CALL_RETURN_VOID(env, napi_reject_deferred(env, asyncCallbackInfo->deferred, result[0]));
204         }
205     } else {
206         napi_value callback = nullptr;
207         napi_value placeHolder = nullptr;
208         NAPI_CALL_RETURN_VOID(env, napi_get_reference_value(env, asyncCallbackInfo->callback, &callback));
209         NAPI_CALL_RETURN_VOID(env, napi_call_function(env, nullptr, callback,
210             sizeof(result) / sizeof(result[0]), result, &placeHolder));
211     }
212 }
213 
SetHapModuleUpgradeFlag(napi_env env,napi_callback_info info)214 napi_value SetHapModuleUpgradeFlag(napi_env env, napi_callback_info info)
215 {
216     APP_LOGD("NAPI_SetHapModuleUpgradeFlag start");
217     NapiArg args(env, info);
218     if (!args.Init(ARGS_SIZE_THREE, ARGS_SIZE_FOUR)) {
219         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
220         return nullptr;
221     }
222     SetHapModuleUpgradeFlagCallbackInfo *asyncCallbackInfo =
223         new (std::nothrow) SetHapModuleUpgradeFlagCallbackInfo(env);
224     if (asyncCallbackInfo == nullptr) {
225         return nullptr;
226     }
227     std::unique_ptr<SetHapModuleUpgradeFlagCallbackInfo> callbackPtr {asyncCallbackInfo};
228     if (args.GetMaxArgc() >= ARGS_SIZE_THREE) {
229         if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], asyncCallbackInfo->bundleName)) {
230             BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
231             return nullptr;
232         }
233         if (!CommonFunc::ParseString(env, args[ARGS_POS_ONE], asyncCallbackInfo->moduleName)) {
234             BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, MODULE_NAME, TYPE_STRING);
235             return nullptr;
236         }
237         if (!CommonFunc::ParseInt(env, args[ARGS_POS_TWO], asyncCallbackInfo->upgradeFlag)) {
238             BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, UPGRADE_FLAG, TYPE_NUMBER);
239             return nullptr;
240         }
241         if (args.GetMaxArgc() == ARGS_SIZE_FOUR) {
242             napi_valuetype valueType = napi_undefined;
243             napi_typeof(env, args[ARGS_POS_THREE], &valueType);
244             if (valueType == napi_function) {
245                 NAPI_CALL(env, napi_create_reference(env, args[ARGS_POS_THREE],
246                     NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
247             }
248         }
249     } else {
250         APP_LOGE("parameters error");
251         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
252         return nullptr;
253     }
254 
255     auto promise = CommonFunc::AsyncCallNativeMethod<SetHapModuleUpgradeFlagCallbackInfo>(
256         env, asyncCallbackInfo, RESOURCE_NAME_OF_SET_HAP_MODULE_UPGRADE_FLAG,
257         SetHapModuleUpgradeFlagExec, SetHapModuleUpgradeFlagComplete);
258     callbackPtr.release();
259     APP_LOGD("call SetHapModuleUpgradeFlag done");
260     return promise;
261 }
262 
CreateUpgradeFlagObject(napi_env env,napi_value value)263 void CreateUpgradeFlagObject(napi_env env, napi_value value)
264 {
265     napi_value nNotUpgrade;
266     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(UpgradeFlag::NOT_UPGRADE), &nNotUpgrade));
267     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "NOT_UPGRADE", nNotUpgrade));
268 
269     napi_value nSingleUpgrade;
270     NAPI_CALL_RETURN_VOID(
271         env, napi_create_int32(env, static_cast<int32_t>(UpgradeFlag::SINGLE_UPGRADE), &nSingleUpgrade));
272     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SINGLE_UPGRADE", nSingleUpgrade));
273 
274     napi_value nRelationUpgrade;
275     NAPI_CALL_RETURN_VOID(
276         env, napi_create_int32(env, static_cast<int32_t>(UpgradeFlag::RELATION_UPGRADE), &nRelationUpgrade));
277     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "RELATION_UPGRADE", nRelationUpgrade));
278 }
279 
CreateBundlePackFlagObject(napi_env env,napi_value value)280 void CreateBundlePackFlagObject(napi_env env, napi_value value)
281 {
282     napi_value nGetPackInfoAll;
283     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(BundlePackFlag::GET_PACK_INFO_ALL),
284         &nGetPackInfoAll));
285     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_PACK_INFO_ALL", nGetPackInfoAll));
286 
287     napi_value nGetPackages;
288     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(BundlePackFlag::GET_PACKAGES),
289         &nGetPackages));
290     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_PACKAGES", nGetPackages));
291 
292     napi_value nGetBundleSummary;
293     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(BundlePackFlag::GET_BUNDLE_SUMMARY),
294         &nGetBundleSummary));
295     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_SUMMARY", nGetBundleSummary));
296 
297     napi_value nGetModuleSummary;
298     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(BundlePackFlag::GET_MODULE_SUMMARY),
299         &nGetModuleSummary));
300     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_MODULE_SUMMARY", nGetModuleSummary));
301 }
302 
ConvertSummaryApp(napi_env env,napi_value & app,const BundlePackInfo & bundlePackInfo)303 static void ConvertSummaryApp(napi_env env, napi_value &app, const BundlePackInfo &bundlePackInfo)
304 {
305     napi_value bundleName;
306     NAPI_CALL_RETURN_VOID(env,
307         napi_create_string_utf8(env, bundlePackInfo.summary.app.bundleName.c_str(), NAPI_AUTO_LENGTH, &bundleName));
308     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, app, "bundleName", bundleName));
309     napi_value version;
310     NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &version));
311     napi_value versionName;
312     NAPI_CALL_RETURN_VOID(env,
313         napi_create_string_utf8(env, bundlePackInfo.summary.app.version.name.c_str(), NAPI_AUTO_LENGTH, &versionName));
314     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, version, "name", versionName));
315     napi_value versionCode;
316     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, bundlePackInfo.summary.app.version.code, &versionCode));
317     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, version, "code", versionCode));
318     napi_value minCompatibleVersionCode;
319     NAPI_CALL_RETURN_VOID(env,
320         napi_create_int32(env, bundlePackInfo.summary.app.version.minCompatibleVersionCode, &minCompatibleVersionCode));
321     NAPI_CALL_RETURN_VOID(
322         env, napi_set_named_property(env, version, "minCompatibleVersionCode", minCompatibleVersionCode));
323     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, app, "version", version));
324 }
325 
ConvertModulesApiVersion(napi_env env,napi_value & modulesObject,const OHOS::AppExecFwk::PackageModule & module)326 static void ConvertModulesApiVersion(
327     napi_env env, napi_value &modulesObject, const OHOS::AppExecFwk::PackageModule &module)
328 {
329     napi_value apiVersion;
330     NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &apiVersion));
331     napi_value releaseType;
332     NAPI_CALL_RETURN_VOID(
333         env, napi_create_string_utf8(env, module.apiVersion.releaseType.c_str(), NAPI_AUTO_LENGTH, &releaseType));
334     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, apiVersion, "releaseType", releaseType));
335     napi_value compatible;
336     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, module.apiVersion.compatible, &compatible));
337     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, apiVersion, "compatible", compatible));
338     napi_value target;
339     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, module.apiVersion.target, &target));
340     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, apiVersion, "target", target));
341 
342     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, modulesObject, "apiVersion", apiVersion));
343 }
344 
ConvertDeviceType(napi_env env,napi_value & Object,std::vector<std::string> deviceTypes)345 static void ConvertDeviceType(napi_env env, napi_value &Object, std::vector<std::string> deviceTypes)
346 {
347     napi_value nDeviceTypes;
348     NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &nDeviceTypes));
349     size_t typeIndex = 0;
350     for (const auto &type : deviceTypes) {
351         napi_value typeValue;
352         NAPI_CALL_RETURN_VOID(env, napi_create_string_utf8(env, type.c_str(), NAPI_AUTO_LENGTH, &typeValue));
353         NAPI_CALL_RETURN_VOID(env, napi_set_element(env, nDeviceTypes, typeIndex, typeValue));
354         typeIndex++;
355     }
356     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, Object, "deviceTypes", nDeviceTypes));
357 }
358 
ConvertDistro(napi_env env,napi_value & modulesObject,const PackageModule & module)359 static void ConvertDistro(napi_env env, napi_value &modulesObject, const PackageModule &module)
360 {
361     napi_value distro;
362     NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &distro));
363     napi_value deliveryWithInstall;
364     NAPI_CALL_RETURN_VOID(env, napi_get_boolean(env, module.distro.deliveryWithInstall, &deliveryWithInstall));
365     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, distro, "deliveryWithInstall", deliveryWithInstall));
366     napi_value installationFree;
367     NAPI_CALL_RETURN_VOID(env, napi_get_boolean(env, module.distro.installationFree, &installationFree));
368     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, distro, "installationFree", installationFree));
369     napi_value moduleName;
370     NAPI_CALL_RETURN_VOID(
371         env, napi_create_string_utf8(env, module.distro.moduleName.c_str(), NAPI_AUTO_LENGTH, &moduleName));
372     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, distro, "moduleName", moduleName));
373     napi_value moduleType;
374     NAPI_CALL_RETURN_VOID(
375         env, napi_create_string_utf8(env, module.distro.moduleType.c_str(), NAPI_AUTO_LENGTH, &moduleType));
376     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, distro, "moduleType", moduleType));
377 
378     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, modulesObject, "distro", distro));
379 }
380 
ConvertFormsInfo(napi_env env,napi_value & abilityObject,const std::vector<OHOS::AppExecFwk::AbilityFormInfo> & forms)381 static void ConvertFormsInfo(napi_env env, napi_value &abilityObject,
382     const std::vector<OHOS::AppExecFwk::AbilityFormInfo> &forms)
383 {
384     napi_value formsArray;
385     NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &formsArray));
386     size_t index = 0;
387     for (const auto &form : forms) {
388         napi_value formObject;
389         NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &formObject));
390         napi_value name;
391         NAPI_CALL_RETURN_VOID(env, napi_create_string_utf8(env, form.name.c_str(), NAPI_AUTO_LENGTH, &name));
392         NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, formObject, "name", name));
393         napi_value type;
394         NAPI_CALL_RETURN_VOID(env, napi_create_string_utf8(env, form.type.c_str(), NAPI_AUTO_LENGTH, &type));
395         NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, formObject, "type", type));
396         napi_value updateEnabled;
397         NAPI_CALL_RETURN_VOID(env, napi_get_boolean(env, form.updateEnabled, &updateEnabled));
398         NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, formObject, "updateEnabled", updateEnabled));
399         napi_value scheduledUpdateTime;
400         NAPI_CALL_RETURN_VOID(env, napi_create_string_utf8(env, form.scheduledUpdateTime.c_str(),
401             NAPI_AUTO_LENGTH, &scheduledUpdateTime));
402         NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, formObject, "scheduledUpdateTime",
403             scheduledUpdateTime));
404         napi_value updateDuration;
405         NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, form.updateDuration, &updateDuration));
406         NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, formObject, "updateDuration", updateDuration));
407         napi_value supportDimensions;
408         NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &supportDimensions));
409         size_t indexValue = 0;
410         for (const auto &dimension : form.supportDimensions) {
411             napi_value value;
412             NAPI_CALL_RETURN_VOID(
413                 env, napi_create_string_utf8(env, dimension.c_str(), NAPI_AUTO_LENGTH, &value));
414             NAPI_CALL_RETURN_VOID(env, napi_set_element(env, supportDimensions, indexValue, value));
415             indexValue++;
416         }
417         NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, formObject, "supportDimensions", supportDimensions));
418         napi_value defaultDimension;
419         NAPI_CALL_RETURN_VOID(
420             env, napi_create_string_utf8(env, form.defaultDimension.c_str(), NAPI_AUTO_LENGTH, &defaultDimension));
421         NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, formObject, "defaultDimension", defaultDimension));
422         NAPI_CALL_RETURN_VOID(env, napi_set_element(env, formsArray, index, formObject));
423         index++;
424     }
425     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, abilityObject, "forms", formsArray));
426 }
427 
ConvertAbilities(napi_env env,napi_value & modulesObject,const PackageModule & module)428 static void ConvertAbilities(napi_env env, napi_value &modulesObject, const PackageModule &module)
429 {
430     napi_value abilities;
431     NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &abilities));
432     size_t index = 0;
433     for (const auto &ability : module.abilities) {
434         napi_value abilityObject;
435         NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &abilityObject));
436         napi_value name;
437         NAPI_CALL_RETURN_VOID(env, napi_create_string_utf8(env, ability.name.c_str(), NAPI_AUTO_LENGTH, &name));
438         NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, abilityObject, "name", name));
439         napi_value label;
440         NAPI_CALL_RETURN_VOID(env, napi_create_string_utf8(env, ability.label.c_str(), NAPI_AUTO_LENGTH, &label));
441         NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, abilityObject, "label", label));
442         napi_value visible;
443         NAPI_CALL_RETURN_VOID(env, napi_get_boolean(env, ability.visible, &visible));
444         NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, abilityObject, "visible", visible));
445         napi_value nExported;
446         NAPI_CALL_RETURN_VOID(env, napi_get_boolean(env, ability.visible, &nExported));
447         NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, abilityObject, "exported", nExported));
448         ConvertFormsInfo(env, abilityObject, ability.forms);
449         NAPI_CALL_RETURN_VOID(env, napi_set_element(env, abilities, index, abilityObject));
450         index++;
451     }
452     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, modulesObject, "abilities", abilities));
453 }
454 
ConvertExtensionAbilities(napi_env env,napi_value & modulesObject,const OHOS::AppExecFwk::PackageModule & module)455 static void ConvertExtensionAbilities(
456     napi_env env, napi_value &modulesObject, const OHOS::AppExecFwk::PackageModule &module)
457 {
458     napi_value extensionAbilities;
459     NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &extensionAbilities));
460     size_t index = 0;
461     for (const auto &extensionAbility : module.extensionAbilities) {
462         napi_value abilityObject;
463         NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &abilityObject));
464         napi_value name;
465         NAPI_CALL_RETURN_VOID(
466             env, napi_create_string_utf8(env, extensionAbility.name.c_str(), NAPI_AUTO_LENGTH, &name));
467         NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, abilityObject, "name", name));
468         ConvertFormsInfo(env, abilityObject, extensionAbility.forms);
469         NAPI_CALL_RETURN_VOID(env, napi_set_element(env, extensionAbilities, index, abilityObject));
470         index++;
471     }
472     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, modulesObject, "extensionAbilities", extensionAbilities));
473 }
474 
ConvertSummaryModules(napi_env env,napi_value & modulesArray,const BundlePackInfo & bundlePackInfo)475 static void ConvertSummaryModules(
476     napi_env env, napi_value &modulesArray, const BundlePackInfo &bundlePackInfo)
477 {
478     size_t index = 0;
479     for (const auto &module : bundlePackInfo.summary.modules) {
480         napi_value modulesObject;
481         NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &modulesObject));
482         napi_value mainAbility;
483         NAPI_CALL_RETURN_VOID(
484             env, napi_create_string_utf8(env, module.mainAbility.c_str(), NAPI_AUTO_LENGTH, &mainAbility));
485         NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, modulesObject, "mainAbility", mainAbility));
486         ConvertModulesApiVersion(env, modulesObject, module);
487         ConvertDeviceType(env, modulesObject, module.deviceType);
488         ConvertDistro(env, modulesObject, module);
489         ConvertAbilities(env, modulesObject, module);
490         ConvertExtensionAbilities(env, modulesObject, module);
491         NAPI_CALL_RETURN_VOID(env, napi_set_element(env, modulesArray, index, modulesObject));
492         index++;
493     }
494 }
495 
ConvertPackageSummary(napi_env env,napi_value & jsSummary,const BundlePackInfo & bundlePackInfo)496 static void ConvertPackageSummary(
497     napi_env env, napi_value &jsSummary, const BundlePackInfo &bundlePackInfo)
498 {
499     napi_value app;
500     NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &app));
501     ConvertSummaryApp(env, app, bundlePackInfo);
502     napi_value modules;
503     NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &modules));
504     ConvertSummaryModules(env, modules, bundlePackInfo);
505     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, jsSummary, "app", app));
506     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, jsSummary, "modules", modules));
507 }
508 
ConvertPackages(napi_env env,napi_value & jsPackagesArray,const BundlePackInfo & bundlePackInfo)509 static void ConvertPackages(
510     napi_env env, napi_value &jsPackagesArray, const BundlePackInfo &bundlePackInfo)
511 {
512     size_t index = 0;
513     for (const auto &package : bundlePackInfo.packages) {
514         napi_value jsPackagesObject;
515         NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &jsPackagesObject));
516         ConvertDeviceType(env, jsPackagesObject, package.deviceType);
517         napi_value packageName;
518         NAPI_CALL_RETURN_VOID(env, napi_create_string_utf8(env, package.name.c_str(), NAPI_AUTO_LENGTH, &packageName));
519         NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, jsPackagesObject, "name", packageName));
520         napi_value moduleType;
521         NAPI_CALL_RETURN_VOID(
522             env, napi_create_string_utf8(env, package.moduleType.c_str(), NAPI_AUTO_LENGTH, &moduleType));
523         NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, jsPackagesObject, "moduleType", moduleType));
524         napi_value deliveryWithInstall;
525         NAPI_CALL_RETURN_VOID(env, napi_get_boolean(env, package.deliveryWithInstall, &deliveryWithInstall));
526         NAPI_CALL_RETURN_VOID(
527             env, napi_set_named_property(env, jsPackagesObject, "deliveryWithInstall", deliveryWithInstall));
528         NAPI_CALL_RETURN_VOID(env, napi_set_element(env, jsPackagesArray, index, jsPackagesObject));
529         index++;
530     }
531 }
532 
ConvertBundlePackInfo(napi_env env,napi_value & result,int32_t flag,const BundlePackInfo & bundlePackInfo)533 static void ConvertBundlePackInfo(
534     napi_env env, napi_value &result, int32_t flag, const BundlePackInfo &bundlePackInfo)
535 {
536     NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &result));
537     if (static_cast<uint32_t>(flag) & BundlePackFlag::GET_PACKAGES) {
538         napi_value jsPackagesArray;
539         NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &jsPackagesArray));
540         ConvertPackages(env, jsPackagesArray, bundlePackInfo);
541         NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, result, "packages", jsPackagesArray));
542         return;
543     }
544     if (static_cast<uint32_t>(flag) & BundlePackFlag::GET_BUNDLE_SUMMARY) {
545         napi_value jsSummary;
546         NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &jsSummary));
547         ConvertPackageSummary(env, jsSummary, bundlePackInfo);
548         NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, result, "summary", jsSummary));
549         return;
550     }
551     if (static_cast<uint32_t>(flag) & BundlePackFlag::GET_MODULE_SUMMARY) {
552         napi_value jsSummary;
553         NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &jsSummary));
554         napi_value modules;
555         NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &modules));
556         ConvertSummaryModules(env, modules, bundlePackInfo);
557         NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, jsSummary, "modules", modules));
558         NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, result, "summary", jsSummary));
559         return;
560     }
561     napi_value jsSummary;
562     NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &jsSummary));
563     ConvertPackageSummary(env, jsSummary, bundlePackInfo);
564     napi_value jsPackagesArray;
565     NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &jsPackagesArray));
566     ConvertPackages(env, jsPackagesArray, bundlePackInfo);
567     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, result, "packages", jsPackagesArray));
568     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, result, "summary", jsSummary));
569 }
570 
InnerGetBundlePackInfo(const std::string & bundleName,int32_t flags,BundlePackInfo & bundlePackInfo)571 static ErrCode InnerGetBundlePackInfo(const std::string &bundleName, int32_t flags, BundlePackInfo &bundlePackInfo)
572 {
573     auto iBundleMgr = CommonFunc::GetBundleMgr();
574     if (iBundleMgr == nullptr) {
575         APP_LOGE("can not get iBundleMgr");
576         return ERROR_BUNDLE_SERVICE_EXCEPTION;
577     }
578     auto ret = iBundleMgr->GetBundlePackInfo(bundleName, flags, bundlePackInfo);
579     if (ret != ERR_OK) {
580         APP_LOGE("InnerGetBundlePackInfo failed");
581     }
582     return CommonFunc::ConvertErrCode(ret);
583 }
584 
GetBundlePackInfoExec(napi_env env,void * data)585 void GetBundlePackInfoExec(napi_env env, void *data)
586 {
587     GetBundlePackInfoCallbackInfo *asyncCallbackInfo =
588         reinterpret_cast<GetBundlePackInfoCallbackInfo*>(data);
589     if (asyncCallbackInfo == nullptr) {
590         APP_LOGE("%{public}s, asyncCallbackInfo == nullptr.", __func__);
591         return;
592     }
593     asyncCallbackInfo->err = InnerGetBundlePackInfo(asyncCallbackInfo->bundleName,
594         asyncCallbackInfo->bundlePackFlag, asyncCallbackInfo->bundlePackInfo);
595 }
596 
GetBundlePackInfoComplete(napi_env env,napi_status status,void * data)597 void GetBundlePackInfoComplete(napi_env env, napi_status status, void *data)
598 {
599     GetBundlePackInfoCallbackInfo *asyncCallbackInfo = reinterpret_cast<GetBundlePackInfoCallbackInfo*>(data);
600     if (asyncCallbackInfo == nullptr) {
601         APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
602         return;
603     }
604     std::unique_ptr<GetBundlePackInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
605     napi_value result[ARGS_SIZE_TWO] = {0};
606     if (asyncCallbackInfo->err == SUCCESS) {
607         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
608         ConvertBundlePackInfo(env, result[ARGS_SIZE_ONE],
609             asyncCallbackInfo->bundlePackFlag, asyncCallbackInfo->bundlePackInfo);
610     } else {
611         result[0] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
612             RESOURCE_NAME_OF_GET_BUNDLE_PACK_INFO, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
613         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_SIZE_ONE]));
614     }
615     if (asyncCallbackInfo->deferred) {
616         if (asyncCallbackInfo->err == SUCCESS) {
617             NAPI_CALL_RETURN_VOID(env, napi_resolve_deferred(env, asyncCallbackInfo->deferred, result[ARGS_SIZE_ONE]));
618         } else {
619             NAPI_CALL_RETURN_VOID(env, napi_reject_deferred(env, asyncCallbackInfo->deferred, result[0]));
620         }
621     } else {
622         napi_value callback = nullptr;
623         napi_value placeHolder = nullptr;
624         NAPI_CALL_RETURN_VOID(env, napi_get_reference_value(env, asyncCallbackInfo->callback, &callback));
625         NAPI_CALL_RETURN_VOID(env, napi_call_function(env, nullptr, callback,
626             sizeof(result) / sizeof(result[0]), result, &placeHolder));
627     }
628 }
629 
GetBundlePackInfo(napi_env env,napi_callback_info info)630 napi_value GetBundlePackInfo(napi_env env, napi_callback_info info)
631 {
632     APP_LOGD("NAPI_GetBundlePackInfo start");
633     NapiArg args(env, info);
634     if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_THREE)) {
635         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
636         return nullptr;
637     }
638     GetBundlePackInfoCallbackInfo *asyncCallbackInfo = new (std::nothrow) GetBundlePackInfoCallbackInfo(env);
639     if (asyncCallbackInfo == nullptr) {
640         return nullptr;
641     }
642     std::unique_ptr<GetBundlePackInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
643     if (args.GetMaxArgc() >= ARGS_SIZE_TWO) {
644         if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], asyncCallbackInfo->bundleName)) {
645             BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
646             return nullptr;
647         }
648         if (!CommonFunc::ParseInt(env, args[ARGS_POS_ONE], asyncCallbackInfo->bundlePackFlag)) {
649             BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_PACK_FLAG, TYPE_NUMBER);
650             return nullptr;
651         }
652         if (args.GetMaxArgc() == ARGS_SIZE_THREE) {
653             napi_valuetype valueType = napi_undefined;
654             napi_typeof(env, args[ARGS_POS_TWO], &valueType);
655             if (valueType == napi_function) {
656                 NAPI_CALL(env, napi_create_reference(env, args[ARGS_POS_TWO],
657                     NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
658             }
659         }
660     } else {
661         APP_LOGE("parameters error");
662         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
663         return nullptr;
664     }
665     if (std::find(BUNDLE_PACK_FLAGS.begin(), BUNDLE_PACK_FLAGS.end(), asyncCallbackInfo->bundlePackFlag) ==
666         BUNDLE_PACK_FLAGS.end()) {
667         BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_PACK_FLAG, "BundlePackFlag");
668         return nullptr;
669     }
670     auto promise = CommonFunc::AsyncCallNativeMethod<GetBundlePackInfoCallbackInfo>(
671         env, asyncCallbackInfo, RESOURCE_NAME_OF_GET_BUNDLE_PACK_INFO,
672         GetBundlePackInfoExec, GetBundlePackInfoComplete);
673     callbackPtr.release();
674     APP_LOGD("call GetBundlePackInfo end");
675     return promise;
676 }
677 
ConvertDispatcherVersion(napi_env env,napi_value & value,const std::string & version,const std::string & dispatchAPI)678 static void ConvertDispatcherVersion(
679     napi_env env, napi_value &value, const std::string &version, const std::string &dispatchAPI)
680 {
681     NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &value));
682     napi_value napiVersion;
683     NAPI_CALL_RETURN_VOID(env, napi_create_string_utf8(env, version.c_str(), NAPI_AUTO_LENGTH, &napiVersion));
684     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "version", napiVersion));
685     napi_value napiDispatchAPIVersion;
686     NAPI_CALL_RETURN_VOID(env, napi_create_string_utf8(env, dispatchAPI.c_str(), NAPI_AUTO_LENGTH,
687         &napiDispatchAPIVersion));
688     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "dispatchAPIVersion", napiDispatchAPIVersion));
689 }
690 
InnerGetDispatchInfo(std::string & version,std::string & dispatchAPI)691 static ErrCode InnerGetDispatchInfo(std::string &version, std::string &dispatchAPI)
692 {
693     auto iBundleMgr = CommonFunc::GetBundleMgr();
694     if (iBundleMgr == nullptr) {
695         APP_LOGE("can not get iBundleMgr");
696         return ERROR_BUNDLE_SERVICE_EXCEPTION;
697     }
698     if (!iBundleMgr->VerifySystemApi(Constants::INVALID_API_VERSION)) {
699         APP_LOGE("non-system app calling system api");
700         return ERROR_NOT_SYSTEM_APP;
701     }
702     if (!iBundleMgr->VerifyCallingPermission(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
703         APP_LOGE("GetDispatchInfo failed due to permission denied");
704         return ERROR_PERMISSION_DENIED_ERROR;
705     }
706     version = DISPATCH_INFO_VERSION;
707     dispatchAPI = DISPATCH_INFO_DISPATCH_API;
708     return SUCCESS;
709 }
710 
GetDispatchInfoExec(napi_env env,void * data)711 void GetDispatchInfoExec(napi_env env, void *data)
712 {
713     GetDispatchInfoCallbackInfo *asyncCallbackInfo =
714         reinterpret_cast<GetDispatchInfoCallbackInfo*>(data);
715     if (asyncCallbackInfo == nullptr) {
716         APP_LOGE("%{public}s, asyncCallbackInfo == nullptr.", __func__);
717         return;
718     }
719     asyncCallbackInfo->err = InnerGetDispatchInfo(asyncCallbackInfo->version, asyncCallbackInfo->dispatchAPI);
720 }
721 
GetDispatchInfoComplete(napi_env env,napi_status status,void * data)722 void GetDispatchInfoComplete(napi_env env, napi_status status, void *data)
723 {
724     GetDispatchInfoCallbackInfo *asyncCallbackInfo = reinterpret_cast<GetDispatchInfoCallbackInfo*>(data);
725     if (asyncCallbackInfo == nullptr) {
726         APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
727         return;
728     }
729     std::unique_ptr<GetDispatchInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
730     napi_value result[ARGS_SIZE_TWO] = {0};
731     if (asyncCallbackInfo->err == SUCCESS) {
732         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
733         ConvertDispatcherVersion(env, result[ARGS_SIZE_ONE],
734             asyncCallbackInfo->version, asyncCallbackInfo->dispatchAPI);
735     } else {
736         result[0] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
737             RESOURCE_NAME_OF_GET_DISPATCH_INFO, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
738         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_SIZE_ONE]));
739     }
740     if (asyncCallbackInfo->deferred) {
741         if (asyncCallbackInfo->err == SUCCESS) {
742             NAPI_CALL_RETURN_VOID(env, napi_resolve_deferred(env, asyncCallbackInfo->deferred, result[ARGS_SIZE_ONE]));
743         } else {
744             NAPI_CALL_RETURN_VOID(env, napi_reject_deferred(env, asyncCallbackInfo->deferred, result[0]));
745         }
746     } else {
747         napi_value callback = nullptr;
748         napi_value placeHolder = nullptr;
749         NAPI_CALL_RETURN_VOID(env, napi_get_reference_value(env, asyncCallbackInfo->callback, &callback));
750         NAPI_CALL_RETURN_VOID(env, napi_call_function(env, nullptr, callback,
751             sizeof(result) / sizeof(result[0]), result, &placeHolder));
752     }
753 }
754 
GetDispatchInfo(napi_env env,napi_callback_info info)755 napi_value GetDispatchInfo(napi_env env, napi_callback_info info)
756 {
757     APP_LOGD("NAPI_GetDispatchInfo start");
758     NapiArg args(env, info);
759     if (!args.Init(ARGS_SIZE_ZERO, ARGS_SIZE_ONE)) {
760         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
761         return nullptr;
762     }
763     GetDispatchInfoCallbackInfo *asyncCallbackInfo = new (std::nothrow) GetDispatchInfoCallbackInfo(env);
764     if (asyncCallbackInfo == nullptr) {
765         return nullptr;
766     }
767     std::unique_ptr<GetDispatchInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
768     if (args.GetMaxArgc() >= ARGS_SIZE_ONE) {
769         napi_valuetype valueType = napi_undefined;
770         napi_typeof(env, args[ARGS_POS_ZERO], &valueType);
771         if (valueType == napi_function) {
772             NAPI_CALL(env, napi_create_reference(env, args[ARGS_POS_ZERO],
773                 NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
774         }
775     }
776     auto promise = CommonFunc::AsyncCallNativeMethod<GetDispatchInfoCallbackInfo>(
777         env, asyncCallbackInfo, RESOURCE_NAME_OF_GET_DISPATCH_INFO,
778         GetDispatchInfoExec, GetDispatchInfoComplete);
779     callbackPtr.release();
780     APP_LOGD("call GetDispatchInfo end");
781     return promise;
782 }
783 } // AppExecFwk
784 } // OHOS