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