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