• 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_get_undefined(env, &result[0]);
202             NAPI_CALL_RETURN_VOID(env, napi_resolve_deferred(env, asyncCallbackInfo->deferred, result[0]));
203         } else {
204             NAPI_CALL_RETURN_VOID(env, napi_reject_deferred(env, asyncCallbackInfo->deferred, result[0]));
205         }
206     } else {
207         napi_value callback = nullptr;
208         napi_value placeHolder = nullptr;
209         NAPI_CALL_RETURN_VOID(env, napi_get_reference_value(env, asyncCallbackInfo->callback, &callback));
210         NAPI_CALL_RETURN_VOID(env, napi_call_function(env, nullptr, callback,
211             sizeof(result) / sizeof(result[0]), result, &placeHolder));
212     }
213 }
214 
SetHapModuleUpgradeFlag(napi_env env,napi_callback_info info)215 napi_value SetHapModuleUpgradeFlag(napi_env env, napi_callback_info info)
216 {
217     APP_LOGD("NAPI_SetHapModuleUpgradeFlag start");
218     NapiArg args(env, info);
219     if (!args.Init(ARGS_SIZE_THREE, ARGS_SIZE_FOUR)) {
220         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
221         return nullptr;
222     }
223     SetHapModuleUpgradeFlagCallbackInfo *asyncCallbackInfo =
224         new (std::nothrow) SetHapModuleUpgradeFlagCallbackInfo(env);
225     if (asyncCallbackInfo == nullptr) {
226         return nullptr;
227     }
228     std::unique_ptr<SetHapModuleUpgradeFlagCallbackInfo> callbackPtr {asyncCallbackInfo};
229     if (args.GetMaxArgc() >= ARGS_SIZE_THREE) {
230         if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], asyncCallbackInfo->bundleName)) {
231             BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
232             return nullptr;
233         }
234         if (!CommonFunc::ParseString(env, args[ARGS_POS_ONE], asyncCallbackInfo->moduleName)) {
235             BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, MODULE_NAME, TYPE_STRING);
236             return nullptr;
237         }
238         if (!CommonFunc::ParseInt(env, args[ARGS_POS_TWO], asyncCallbackInfo->upgradeFlag)) {
239             BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, UPGRADE_FLAG, TYPE_NUMBER);
240             return nullptr;
241         }
242         if (args.GetMaxArgc() == ARGS_SIZE_FOUR) {
243             napi_valuetype valueType = napi_undefined;
244             napi_typeof(env, args[ARGS_POS_THREE], &valueType);
245             if (valueType == napi_function) {
246                 NAPI_CALL(env, napi_create_reference(env, args[ARGS_POS_THREE],
247                     NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
248             }
249         }
250     } else {
251         APP_LOGE("parameters error");
252         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
253         return nullptr;
254     }
255 
256     auto promise = CommonFunc::AsyncCallNativeMethod<SetHapModuleUpgradeFlagCallbackInfo>(
257         env, asyncCallbackInfo, RESOURCE_NAME_OF_SET_HAP_MODULE_UPGRADE_FLAG,
258         SetHapModuleUpgradeFlagExec, SetHapModuleUpgradeFlagComplete);
259     callbackPtr.release();
260     APP_LOGD("call SetHapModuleUpgradeFlag done");
261     return promise;
262 }
263 
CreateUpgradeFlagObject(napi_env env,napi_value value)264 void CreateUpgradeFlagObject(napi_env env, napi_value value)
265 {
266     napi_value nNotUpgrade;
267     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(UpgradeFlag::NOT_UPGRADE), &nNotUpgrade));
268     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "NOT_UPGRADE", nNotUpgrade));
269 
270     napi_value nSingleUpgrade;
271     NAPI_CALL_RETURN_VOID(
272         env, napi_create_int32(env, static_cast<int32_t>(UpgradeFlag::SINGLE_UPGRADE), &nSingleUpgrade));
273     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SINGLE_UPGRADE", nSingleUpgrade));
274 
275     napi_value nRelationUpgrade;
276     NAPI_CALL_RETURN_VOID(
277         env, napi_create_int32(env, static_cast<int32_t>(UpgradeFlag::RELATION_UPGRADE), &nRelationUpgrade));
278     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "RELATION_UPGRADE", nRelationUpgrade));
279 }
280 
CreateBundlePackFlagObject(napi_env env,napi_value value)281 void CreateBundlePackFlagObject(napi_env env, napi_value value)
282 {
283     napi_value nGetPackInfoAll;
284     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(BundlePackFlag::GET_PACK_INFO_ALL),
285         &nGetPackInfoAll));
286     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_PACK_INFO_ALL", nGetPackInfoAll));
287 
288     napi_value nGetPackages;
289     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(BundlePackFlag::GET_PACKAGES),
290         &nGetPackages));
291     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_PACKAGES", nGetPackages));
292 
293     napi_value nGetBundleSummary;
294     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(BundlePackFlag::GET_BUNDLE_SUMMARY),
295         &nGetBundleSummary));
296     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_BUNDLE_SUMMARY", nGetBundleSummary));
297 
298     napi_value nGetModuleSummary;
299     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast<int32_t>(BundlePackFlag::GET_MODULE_SUMMARY),
300         &nGetModuleSummary));
301     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "GET_MODULE_SUMMARY", nGetModuleSummary));
302 }
303 
ConvertSummaryApp(napi_env env,napi_value & app,const BundlePackInfo & bundlePackInfo)304 static void ConvertSummaryApp(napi_env env, napi_value &app, const BundlePackInfo &bundlePackInfo)
305 {
306     napi_value bundleName;
307     NAPI_CALL_RETURN_VOID(env,
308         napi_create_string_utf8(env, bundlePackInfo.summary.app.bundleName.c_str(), NAPI_AUTO_LENGTH, &bundleName));
309     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, app, "bundleName", bundleName));
310     napi_value version;
311     NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &version));
312     napi_value versionName;
313     NAPI_CALL_RETURN_VOID(env,
314         napi_create_string_utf8(env, bundlePackInfo.summary.app.version.name.c_str(), NAPI_AUTO_LENGTH, &versionName));
315     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, version, "name", versionName));
316     napi_value versionCode;
317     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, bundlePackInfo.summary.app.version.code, &versionCode));
318     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, version, "code", versionCode));
319     napi_value minCompatibleVersionCode;
320     NAPI_CALL_RETURN_VOID(env,
321         napi_create_int32(env, bundlePackInfo.summary.app.version.minCompatibleVersionCode, &minCompatibleVersionCode));
322     NAPI_CALL_RETURN_VOID(
323         env, napi_set_named_property(env, version, "minCompatibleVersionCode", minCompatibleVersionCode));
324     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, app, "version", version));
325 }
326 
ConvertModulesApiVersion(napi_env env,napi_value & modulesObject,const OHOS::AppExecFwk::PackageModule & module)327 static void ConvertModulesApiVersion(
328     napi_env env, napi_value &modulesObject, const OHOS::AppExecFwk::PackageModule &module)
329 {
330     napi_value apiVersion;
331     NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &apiVersion));
332     napi_value releaseType;
333     NAPI_CALL_RETURN_VOID(
334         env, napi_create_string_utf8(env, module.apiVersion.releaseType.c_str(), NAPI_AUTO_LENGTH, &releaseType));
335     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, apiVersion, "releaseType", releaseType));
336     napi_value compatible;
337     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, module.apiVersion.compatible, &compatible));
338     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, apiVersion, "compatible", compatible));
339     napi_value target;
340     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, module.apiVersion.target, &target));
341     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, apiVersion, "target", target));
342 
343     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, modulesObject, "apiVersion", apiVersion));
344 }
345 
ConvertDeviceType(napi_env env,napi_value & Object,std::vector<std::string> deviceTypes)346 static void ConvertDeviceType(napi_env env, napi_value &Object, std::vector<std::string> deviceTypes)
347 {
348     napi_value nDeviceTypes;
349     NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &nDeviceTypes));
350     size_t typeIndex = 0;
351     for (const auto &type : deviceTypes) {
352         napi_value typeValue;
353         NAPI_CALL_RETURN_VOID(env, napi_create_string_utf8(env, type.c_str(), NAPI_AUTO_LENGTH, &typeValue));
354         NAPI_CALL_RETURN_VOID(env, napi_set_element(env, nDeviceTypes, typeIndex, typeValue));
355         typeIndex++;
356     }
357     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, Object, "deviceTypes", nDeviceTypes));
358 }
359 
ConvertDistro(napi_env env,napi_value & modulesObject,const PackageModule & module)360 static void ConvertDistro(napi_env env, napi_value &modulesObject, const PackageModule &module)
361 {
362     napi_value distro;
363     NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &distro));
364     napi_value deliveryWithInstall;
365     NAPI_CALL_RETURN_VOID(env, napi_get_boolean(env, module.distro.deliveryWithInstall, &deliveryWithInstall));
366     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, distro, "deliveryWithInstall", deliveryWithInstall));
367     napi_value installationFree;
368     NAPI_CALL_RETURN_VOID(env, napi_get_boolean(env, module.distro.installationFree, &installationFree));
369     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, distro, "installationFree", installationFree));
370     napi_value moduleName;
371     NAPI_CALL_RETURN_VOID(
372         env, napi_create_string_utf8(env, module.distro.moduleName.c_str(), NAPI_AUTO_LENGTH, &moduleName));
373     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, distro, "moduleName", moduleName));
374     napi_value moduleType;
375     NAPI_CALL_RETURN_VOID(
376         env, napi_create_string_utf8(env, module.distro.moduleType.c_str(), NAPI_AUTO_LENGTH, &moduleType));
377     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, distro, "moduleType", moduleType));
378 
379     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, modulesObject, "distro", distro));
380 }
381 
ConvertFormsInfo(napi_env env,napi_value & abilityObject,const std::vector<OHOS::AppExecFwk::AbilityFormInfo> & forms)382 static void ConvertFormsInfo(napi_env env, napi_value &abilityObject,
383     const std::vector<OHOS::AppExecFwk::AbilityFormInfo> &forms)
384 {
385     napi_value formsArray;
386     NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &formsArray));
387     size_t index = 0;
388     for (const auto &form : forms) {
389         napi_value formObject;
390         NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &formObject));
391         napi_value name;
392         NAPI_CALL_RETURN_VOID(env, napi_create_string_utf8(env, form.name.c_str(), NAPI_AUTO_LENGTH, &name));
393         NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, formObject, "name", name));
394         napi_value type;
395         NAPI_CALL_RETURN_VOID(env, napi_create_string_utf8(env, form.type.c_str(), NAPI_AUTO_LENGTH, &type));
396         NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, formObject, "type", type));
397         napi_value updateEnabled;
398         NAPI_CALL_RETURN_VOID(env, napi_get_boolean(env, form.updateEnabled, &updateEnabled));
399         NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, formObject, "updateEnabled", updateEnabled));
400         napi_value scheduledUpdateTime;
401         NAPI_CALL_RETURN_VOID(env, napi_create_string_utf8(env, form.scheduledUpdateTime.c_str(),
402             NAPI_AUTO_LENGTH, &scheduledUpdateTime));
403         NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, formObject, "scheduledUpdateTime",
404             scheduledUpdateTime));
405         napi_value updateDuration;
406         NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, form.updateDuration, &updateDuration));
407         NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, formObject, "updateDuration", updateDuration));
408         napi_value supportDimensions;
409         NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &supportDimensions));
410         size_t indexValue = 0;
411         for (const auto &dimension : form.supportDimensions) {
412             napi_value value;
413             NAPI_CALL_RETURN_VOID(
414                 env, napi_create_string_utf8(env, dimension.c_str(), NAPI_AUTO_LENGTH, &value));
415             NAPI_CALL_RETURN_VOID(env, napi_set_element(env, supportDimensions, indexValue, value));
416             indexValue++;
417         }
418         NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, formObject, "supportDimensions", supportDimensions));
419         napi_value defaultDimension;
420         NAPI_CALL_RETURN_VOID(
421             env, napi_create_string_utf8(env, form.defaultDimension.c_str(), NAPI_AUTO_LENGTH, &defaultDimension));
422         NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, formObject, "defaultDimension", defaultDimension));
423         NAPI_CALL_RETURN_VOID(env, napi_set_element(env, formsArray, index, formObject));
424         index++;
425     }
426     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, abilityObject, "forms", formsArray));
427 }
428 
ConvertAbilities(napi_env env,napi_value & modulesObject,const PackageModule & module)429 static void ConvertAbilities(napi_env env, napi_value &modulesObject, const PackageModule &module)
430 {
431     napi_value abilities;
432     NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &abilities));
433     size_t index = 0;
434     for (const auto &ability : module.abilities) {
435         napi_value abilityObject;
436         NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &abilityObject));
437         napi_value name;
438         NAPI_CALL_RETURN_VOID(env, napi_create_string_utf8(env, ability.name.c_str(), NAPI_AUTO_LENGTH, &name));
439         NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, abilityObject, "name", name));
440         napi_value label;
441         NAPI_CALL_RETURN_VOID(env, napi_create_string_utf8(env, ability.label.c_str(), NAPI_AUTO_LENGTH, &label));
442         NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, abilityObject, "label", label));
443         napi_value visible;
444         NAPI_CALL_RETURN_VOID(env, napi_get_boolean(env, ability.visible, &visible));
445         NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, abilityObject, "visible", visible));
446         napi_value nExported;
447         NAPI_CALL_RETURN_VOID(env, napi_get_boolean(env, ability.visible, &nExported));
448         NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, abilityObject, "exported", nExported));
449         ConvertFormsInfo(env, abilityObject, ability.forms);
450         NAPI_CALL_RETURN_VOID(env, napi_set_element(env, abilities, index, abilityObject));
451         index++;
452     }
453     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, modulesObject, "abilities", abilities));
454 }
455 
ConvertExtensionAbilities(napi_env env,napi_value & modulesObject,const OHOS::AppExecFwk::PackageModule & module)456 static void ConvertExtensionAbilities(
457     napi_env env, napi_value &modulesObject, const OHOS::AppExecFwk::PackageModule &module)
458 {
459     napi_value extensionAbilities;
460     NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &extensionAbilities));
461     size_t index = 0;
462     for (const auto &extensionAbility : module.extensionAbilities) {
463         napi_value abilityObject;
464         NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &abilityObject));
465         napi_value name;
466         NAPI_CALL_RETURN_VOID(
467             env, napi_create_string_utf8(env, extensionAbility.name.c_str(), NAPI_AUTO_LENGTH, &name));
468         NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, abilityObject, "name", name));
469         ConvertFormsInfo(env, abilityObject, extensionAbility.forms);
470         NAPI_CALL_RETURN_VOID(env, napi_set_element(env, extensionAbilities, index, abilityObject));
471         index++;
472     }
473     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, modulesObject, "extensionAbilities", extensionAbilities));
474 }
475 
ConvertSummaryModules(napi_env env,napi_value & modulesArray,const BundlePackInfo & bundlePackInfo)476 static void ConvertSummaryModules(
477     napi_env env, napi_value &modulesArray, const BundlePackInfo &bundlePackInfo)
478 {
479     size_t index = 0;
480     for (const auto &module : bundlePackInfo.summary.modules) {
481         napi_value modulesObject;
482         NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &modulesObject));
483         napi_value mainAbility;
484         NAPI_CALL_RETURN_VOID(
485             env, napi_create_string_utf8(env, module.mainAbility.c_str(), NAPI_AUTO_LENGTH, &mainAbility));
486         NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, modulesObject, "mainAbility", mainAbility));
487         ConvertModulesApiVersion(env, modulesObject, module);
488         ConvertDeviceType(env, modulesObject, module.deviceType);
489         ConvertDistro(env, modulesObject, module);
490         ConvertAbilities(env, modulesObject, module);
491         ConvertExtensionAbilities(env, modulesObject, module);
492         NAPI_CALL_RETURN_VOID(env, napi_set_element(env, modulesArray, index, modulesObject));
493         index++;
494     }
495 }
496 
ConvertPackageSummary(napi_env env,napi_value & jsSummary,const BundlePackInfo & bundlePackInfo)497 static void ConvertPackageSummary(
498     napi_env env, napi_value &jsSummary, const BundlePackInfo &bundlePackInfo)
499 {
500     napi_value app;
501     NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &app));
502     ConvertSummaryApp(env, app, bundlePackInfo);
503     napi_value modules;
504     NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &modules));
505     ConvertSummaryModules(env, modules, bundlePackInfo);
506     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, jsSummary, "app", app));
507     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, jsSummary, "modules", modules));
508 }
509 
ConvertPackages(napi_env env,napi_value & jsPackagesArray,const BundlePackInfo & bundlePackInfo)510 static void ConvertPackages(
511     napi_env env, napi_value &jsPackagesArray, const BundlePackInfo &bundlePackInfo)
512 {
513     size_t index = 0;
514     for (const auto &package : bundlePackInfo.packages) {
515         napi_value jsPackagesObject;
516         NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &jsPackagesObject));
517         ConvertDeviceType(env, jsPackagesObject, package.deviceType);
518         napi_value packageName;
519         NAPI_CALL_RETURN_VOID(env, napi_create_string_utf8(env, package.name.c_str(), NAPI_AUTO_LENGTH, &packageName));
520         NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, jsPackagesObject, "name", packageName));
521         napi_value moduleType;
522         NAPI_CALL_RETURN_VOID(
523             env, napi_create_string_utf8(env, package.moduleType.c_str(), NAPI_AUTO_LENGTH, &moduleType));
524         NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, jsPackagesObject, "moduleType", moduleType));
525         napi_value deliveryWithInstall;
526         NAPI_CALL_RETURN_VOID(env, napi_get_boolean(env, package.deliveryWithInstall, &deliveryWithInstall));
527         NAPI_CALL_RETURN_VOID(
528             env, napi_set_named_property(env, jsPackagesObject, "deliveryWithInstall", deliveryWithInstall));
529         NAPI_CALL_RETURN_VOID(env, napi_set_element(env, jsPackagesArray, index, jsPackagesObject));
530         index++;
531     }
532 }
533 
ConvertBundlePackInfo(napi_env env,napi_value & result,int32_t flag,const BundlePackInfo & bundlePackInfo)534 static void ConvertBundlePackInfo(
535     napi_env env, napi_value &result, int32_t flag, const BundlePackInfo &bundlePackInfo)
536 {
537     NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &result));
538     if (static_cast<uint32_t>(flag) & BundlePackFlag::GET_PACKAGES) {
539         napi_value jsPackagesArray;
540         NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &jsPackagesArray));
541         ConvertPackages(env, jsPackagesArray, bundlePackInfo);
542         NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, result, "packages", jsPackagesArray));
543         return;
544     }
545     if (static_cast<uint32_t>(flag) & BundlePackFlag::GET_BUNDLE_SUMMARY) {
546         napi_value jsSummary;
547         NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &jsSummary));
548         ConvertPackageSummary(env, jsSummary, bundlePackInfo);
549         NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, result, "summary", jsSummary));
550         return;
551     }
552     if (static_cast<uint32_t>(flag) & BundlePackFlag::GET_MODULE_SUMMARY) {
553         napi_value jsSummary;
554         NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &jsSummary));
555         napi_value modules;
556         NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &modules));
557         ConvertSummaryModules(env, modules, bundlePackInfo);
558         NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, jsSummary, "modules", modules));
559         NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, result, "summary", jsSummary));
560         return;
561     }
562     napi_value jsSummary;
563     NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &jsSummary));
564     ConvertPackageSummary(env, jsSummary, bundlePackInfo);
565     napi_value jsPackagesArray;
566     NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &jsPackagesArray));
567     ConvertPackages(env, jsPackagesArray, bundlePackInfo);
568     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, result, "packages", jsPackagesArray));
569     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, result, "summary", jsSummary));
570 }
571 
InnerGetBundlePackInfo(const std::string & bundleName,int32_t flags,BundlePackInfo & bundlePackInfo)572 static ErrCode InnerGetBundlePackInfo(const std::string &bundleName, int32_t flags, BundlePackInfo &bundlePackInfo)
573 {
574     auto iBundleMgr = CommonFunc::GetBundleMgr();
575     if (iBundleMgr == nullptr) {
576         APP_LOGE("can not get iBundleMgr");
577         return ERROR_BUNDLE_SERVICE_EXCEPTION;
578     }
579     auto ret = iBundleMgr->GetBundlePackInfo(bundleName, flags, bundlePackInfo);
580     if (ret != ERR_OK) {
581         APP_LOGE("InnerGetBundlePackInfo failed");
582     }
583     return CommonFunc::ConvertErrCode(ret);
584 }
585 
GetBundlePackInfoExec(napi_env env,void * data)586 void GetBundlePackInfoExec(napi_env env, void *data)
587 {
588     GetBundlePackInfoCallbackInfo *asyncCallbackInfo =
589         reinterpret_cast<GetBundlePackInfoCallbackInfo*>(data);
590     if (asyncCallbackInfo == nullptr) {
591         APP_LOGE("%{public}s, asyncCallbackInfo == nullptr.", __func__);
592         return;
593     }
594     asyncCallbackInfo->err = InnerGetBundlePackInfo(asyncCallbackInfo->bundleName,
595         asyncCallbackInfo->bundlePackFlag, asyncCallbackInfo->bundlePackInfo);
596 }
597 
GetBundlePackInfoComplete(napi_env env,napi_status status,void * data)598 void GetBundlePackInfoComplete(napi_env env, napi_status status, void *data)
599 {
600     GetBundlePackInfoCallbackInfo *asyncCallbackInfo = reinterpret_cast<GetBundlePackInfoCallbackInfo*>(data);
601     if (asyncCallbackInfo == nullptr) {
602         APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
603         return;
604     }
605     std::unique_ptr<GetBundlePackInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
606     napi_value result[ARGS_SIZE_TWO] = {0};
607     if (asyncCallbackInfo->err == SUCCESS) {
608         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
609         ConvertBundlePackInfo(env, result[ARGS_SIZE_ONE],
610             asyncCallbackInfo->bundlePackFlag, asyncCallbackInfo->bundlePackInfo);
611     } else {
612         result[0] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
613             RESOURCE_NAME_OF_GET_BUNDLE_PACK_INFO, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
614         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_SIZE_ONE]));
615     }
616     if (asyncCallbackInfo->deferred) {
617         if (asyncCallbackInfo->err == SUCCESS) {
618             NAPI_CALL_RETURN_VOID(env, napi_resolve_deferred(env, asyncCallbackInfo->deferred, result[ARGS_SIZE_ONE]));
619         } else {
620             NAPI_CALL_RETURN_VOID(env, napi_reject_deferred(env, asyncCallbackInfo->deferred, result[0]));
621         }
622     } else {
623         napi_value callback = nullptr;
624         napi_value placeHolder = nullptr;
625         NAPI_CALL_RETURN_VOID(env, napi_get_reference_value(env, asyncCallbackInfo->callback, &callback));
626         NAPI_CALL_RETURN_VOID(env, napi_call_function(env, nullptr, callback,
627             sizeof(result) / sizeof(result[0]), result, &placeHolder));
628     }
629 }
630 
GetBundlePackInfo(napi_env env,napi_callback_info info)631 napi_value GetBundlePackInfo(napi_env env, napi_callback_info info)
632 {
633     APP_LOGD("NAPI_GetBundlePackInfo start");
634     NapiArg args(env, info);
635     if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_THREE)) {
636         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
637         return nullptr;
638     }
639     GetBundlePackInfoCallbackInfo *asyncCallbackInfo = new (std::nothrow) GetBundlePackInfoCallbackInfo(env);
640     if (asyncCallbackInfo == nullptr) {
641         return nullptr;
642     }
643     std::unique_ptr<GetBundlePackInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
644     if (args.GetMaxArgc() >= ARGS_SIZE_TWO) {
645         if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], asyncCallbackInfo->bundleName)) {
646             BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
647             return nullptr;
648         }
649         if (!CommonFunc::ParseInt(env, args[ARGS_POS_ONE], asyncCallbackInfo->bundlePackFlag)) {
650             BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_PACK_FLAG, TYPE_NUMBER);
651             return nullptr;
652         }
653         if (args.GetMaxArgc() == ARGS_SIZE_THREE) {
654             napi_valuetype valueType = napi_undefined;
655             napi_typeof(env, args[ARGS_POS_TWO], &valueType);
656             if (valueType == napi_function) {
657                 NAPI_CALL(env, napi_create_reference(env, args[ARGS_POS_TWO],
658                     NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
659             }
660         }
661     } else {
662         APP_LOGE("parameters error");
663         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
664         return nullptr;
665     }
666     if (std::find(BUNDLE_PACK_FLAGS.begin(), BUNDLE_PACK_FLAGS.end(), asyncCallbackInfo->bundlePackFlag) ==
667         BUNDLE_PACK_FLAGS.end()) {
668         BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_PACK_FLAG, "BundlePackFlag");
669         return nullptr;
670     }
671     auto promise = CommonFunc::AsyncCallNativeMethod<GetBundlePackInfoCallbackInfo>(
672         env, asyncCallbackInfo, RESOURCE_NAME_OF_GET_BUNDLE_PACK_INFO,
673         GetBundlePackInfoExec, GetBundlePackInfoComplete);
674     callbackPtr.release();
675     APP_LOGD("call GetBundlePackInfo end");
676     return promise;
677 }
678 
ConvertDispatcherVersion(napi_env env,napi_value & value,const std::string & version,const std::string & dispatchAPI)679 static void ConvertDispatcherVersion(
680     napi_env env, napi_value &value, const std::string &version, const std::string &dispatchAPI)
681 {
682     NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &value));
683     napi_value napiVersion;
684     NAPI_CALL_RETURN_VOID(env, napi_create_string_utf8(env, version.c_str(), NAPI_AUTO_LENGTH, &napiVersion));
685     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "version", napiVersion));
686     napi_value napiDispatchAPIVersion;
687     NAPI_CALL_RETURN_VOID(env, napi_create_string_utf8(env, dispatchAPI.c_str(), NAPI_AUTO_LENGTH,
688         &napiDispatchAPIVersion));
689     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "dispatchAPIVersion", napiDispatchAPIVersion));
690 }
691 
InnerGetDispatchInfo(std::string & version,std::string & dispatchAPI)692 static ErrCode InnerGetDispatchInfo(std::string &version, std::string &dispatchAPI)
693 {
694     auto iBundleMgr = CommonFunc::GetBundleMgr();
695     if (iBundleMgr == nullptr) {
696         APP_LOGE("can not get iBundleMgr");
697         return ERROR_BUNDLE_SERVICE_EXCEPTION;
698     }
699     if (!iBundleMgr->VerifySystemApi(Constants::INVALID_API_VERSION)) {
700         APP_LOGE("non-system app calling system api");
701         return ERROR_NOT_SYSTEM_APP;
702     }
703     if (!iBundleMgr->VerifyCallingPermission(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
704         APP_LOGE("GetDispatchInfo failed due to permission denied");
705         return ERROR_PERMISSION_DENIED_ERROR;
706     }
707     version = DISPATCH_INFO_VERSION;
708     dispatchAPI = DISPATCH_INFO_DISPATCH_API;
709     return SUCCESS;
710 }
711 
GetDispatchInfoExec(napi_env env,void * data)712 void GetDispatchInfoExec(napi_env env, void *data)
713 {
714     GetDispatchInfoCallbackInfo *asyncCallbackInfo =
715         reinterpret_cast<GetDispatchInfoCallbackInfo*>(data);
716     if (asyncCallbackInfo == nullptr) {
717         APP_LOGE("%{public}s, asyncCallbackInfo == nullptr.", __func__);
718         return;
719     }
720     asyncCallbackInfo->err = InnerGetDispatchInfo(asyncCallbackInfo->version, asyncCallbackInfo->dispatchAPI);
721 }
722 
GetDispatchInfoComplete(napi_env env,napi_status status,void * data)723 void GetDispatchInfoComplete(napi_env env, napi_status status, void *data)
724 {
725     GetDispatchInfoCallbackInfo *asyncCallbackInfo = reinterpret_cast<GetDispatchInfoCallbackInfo*>(data);
726     if (asyncCallbackInfo == nullptr) {
727         APP_LOGE("asyncCallbackInfo is null in %{public}s", __func__);
728         return;
729     }
730     std::unique_ptr<GetDispatchInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
731     napi_value result[ARGS_SIZE_TWO] = {0};
732     if (asyncCallbackInfo->err == SUCCESS) {
733         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
734         ConvertDispatcherVersion(env, result[ARGS_SIZE_ONE],
735             asyncCallbackInfo->version, asyncCallbackInfo->dispatchAPI);
736     } else {
737         result[0] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
738             RESOURCE_NAME_OF_GET_DISPATCH_INFO, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
739         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[ARGS_SIZE_ONE]));
740     }
741     if (asyncCallbackInfo->deferred) {
742         if (asyncCallbackInfo->err == SUCCESS) {
743             NAPI_CALL_RETURN_VOID(env, napi_resolve_deferred(env, asyncCallbackInfo->deferred, result[ARGS_SIZE_ONE]));
744         } else {
745             NAPI_CALL_RETURN_VOID(env, napi_reject_deferred(env, asyncCallbackInfo->deferred, result[0]));
746         }
747     } else {
748         napi_value callback = nullptr;
749         napi_value placeHolder = nullptr;
750         NAPI_CALL_RETURN_VOID(env, napi_get_reference_value(env, asyncCallbackInfo->callback, &callback));
751         NAPI_CALL_RETURN_VOID(env, napi_call_function(env, nullptr, callback,
752             sizeof(result) / sizeof(result[0]), result, &placeHolder));
753     }
754 }
755 
GetDispatchInfo(napi_env env,napi_callback_info info)756 napi_value GetDispatchInfo(napi_env env, napi_callback_info info)
757 {
758     APP_LOGD("NAPI_GetDispatchInfo start");
759     NapiArg args(env, info);
760     if (!args.Init(ARGS_SIZE_ZERO, ARGS_SIZE_ONE)) {
761         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
762         return nullptr;
763     }
764     GetDispatchInfoCallbackInfo *asyncCallbackInfo = new (std::nothrow) GetDispatchInfoCallbackInfo(env);
765     if (asyncCallbackInfo == nullptr) {
766         return nullptr;
767     }
768     std::unique_ptr<GetDispatchInfoCallbackInfo> callbackPtr {asyncCallbackInfo};
769     if (args.GetMaxArgc() >= ARGS_SIZE_ONE) {
770         napi_valuetype valueType = napi_undefined;
771         napi_typeof(env, args[ARGS_POS_ZERO], &valueType);
772         if (valueType == napi_function) {
773             NAPI_CALL(env, napi_create_reference(env, args[ARGS_POS_ZERO],
774                 NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
775         }
776     }
777     auto promise = CommonFunc::AsyncCallNativeMethod<GetDispatchInfoCallbackInfo>(
778         env, asyncCallbackInfo, RESOURCE_NAME_OF_GET_DISPATCH_INFO,
779         GetDispatchInfoExec, GetDispatchInfoComplete);
780     callbackPtr.release();
781     APP_LOGD("call GetDispatchInfo end");
782     return promise;
783 }
784 } // AppExecFwk
785 } // OHOS