• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "napi_common_ability.h"
17 
18 #include <dlfcn.h>
19 #include <uv.h>
20 
21 #include "ability_util.h"
22 #include "hilog_wrapper.h"
23 #include "js_napi_common_ability.h"
24 #include "js_runtime_utils.h"
25 #include "napi_common_util.h"
26 #include "napi_context.h"
27 #include "napi_base_context.h"
28 #include "napi_remote_object.h"
29 #include "securec.h"
30 
31 using namespace OHOS::AbilityRuntime;
32 
33 namespace OHOS {
34 namespace AppExecFwk {
35 napi_ref thread_local g_contextObject = nullptr;
36 napi_ref thread_local g_dataAbilityHelper = nullptr;
37 bool thread_local g_dataAbilityHelperStatus = false;
38 const int32_t ERR_ABILITY_START_SUCCESS = 0;
39 const int32_t ERR_ABILITY_QUERY_FAILED = 1;
40 const int32_t ERR_NETWORK_UNAVAILABLE = 2;
41 const int32_t ERR_SYSTEM_ERROR = 3;
42 const int32_t ERR_LOADING_ERROR = 4;
43 const int32_t ERR_CONCURRENT_TASKS_WAITING_FOR_RETRY = 5;
44 const int32_t ERR_FREE_INSTALL_NOT_SUPPORTED = 6;
45 const int32_t ERR_SERVICE_ERROR = 7;
46 const int32_t ERR_PERMISSION_VERIFY_FAILED = 8;
47 const int32_t ERR_PARAMETER_INVALID = 9;
48 const int32_t ERR_REMOTE_INCOMPATIBLE = 10;
49 const int32_t ERR_DEVICE_OFFLINE = 11;
50 const int32_t ERR_FREE_INSTALL_TIMEOUT = 12;
51 const int32_t ERR_NOT_TOP_ABILITY = 13;
52 const int32_t ERR_TARGET_BUNDLE_NOT_EXIST = 14;
53 const int32_t ERR_CONTINUE_FREE_INSTALL_FAILED = 15;
54 const int32_t ERR_PARAM_INVALID = 202;
55 const std::map<int32_t, int32_t> START_ABILITY_ERROR_CODE_MAP = {
56     { NAPI_ERR_NO_ERROR, ERR_ABILITY_START_SUCCESS },
57     { NAPI_ERR_NO_PERMISSION, ERR_PERMISSION_VERIFY_FAILED },
58     { NAPI_ERR_ACE_ABILITY, ERR_ABILITY_QUERY_FAILED },
59     { NAPI_ERR_PARAM_INVALID, ERR_PARAM_INVALID },
60     { NAPI_ERR_ABILITY_TYPE_INVALID, ERR_ABILITY_QUERY_FAILED },
61     { NAPI_ERR_ABILITY_CALL_INVALID, ERR_ABILITY_QUERY_FAILED },
62     { ERR_OK, ERR_ABILITY_START_SUCCESS },
63     { RESOLVE_ABILITY_ERR, ERR_ABILITY_QUERY_FAILED },
64     { CHECK_PERMISSION_FAILED, ERR_PERMISSION_VERIFY_FAILED },
65     { RESOLVE_CALL_NO_PERMISSIONS, ERR_PERMISSION_VERIFY_FAILED },
66     { FA_FREE_INSTALL_QUERY_ERROR, ERR_ABILITY_QUERY_FAILED },
67     { HAG_QUERY_TIMEOUT, ERR_ABILITY_QUERY_FAILED },
68     { FA_NETWORK_UNAVAILABLE, ERR_NETWORK_UNAVAILABLE },
69     { FA_FREE_INSTALL_SERVICE_ERROR, ERR_SYSTEM_ERROR },
70     { FA_CRASH, ERR_SYSTEM_ERROR },
71     { FA_TIMEOUT, ERR_SYSTEM_ERROR },
72     { UNKNOWN_EXCEPTION, ERR_SYSTEM_ERROR },
73     { NOT_SUPPORT_PA_ON_SAME_DEVICE, ERR_SYSTEM_ERROR },
74     { FA_INTERNET_ERROR, ERR_SYSTEM_ERROR },
75     { JUMP_TO_THE_APPLICATION_MARKET_UPGRADE, ERR_SYSTEM_ERROR },
76     { USER_GIVES_UP, ERR_LOADING_ERROR },
77     { INSTALLATION_ERROR_IN_FREE_INSTALL, ERR_LOADING_ERROR },
78     { HAP_PACKAGE_DOWNLOAD_TIMED_OUT, ERR_LOADING_ERROR },
79     { CONCURRENT_TASKS_WAITING_FOR_RETRY, ERR_CONCURRENT_TASKS_WAITING_FOR_RETRY },
80     { FA_PACKAGE_DOES_NOT_SUPPORT_FREE_INSTALL, ERR_FREE_INSTALL_NOT_SUPPORTED },
81     { NOT_ALLOWED_TO_PULL_THIS_FA, ERR_SERVICE_ERROR },
82     { NOT_SUPPORT_CROSS_DEVICE_FREE_INSTALL_PA, ERR_SERVICE_ERROR },
83     { DMS_PERMISSION_DENIED, ERR_PERMISSION_VERIFY_FAILED },
84     { DMS_COMPONENT_ACCESS_PERMISSION_DENIED, ERR_PERMISSION_VERIFY_FAILED },
85     { DMS_ACCOUNT_ACCESS_PERMISSION_DENIED, ERR_PERMISSION_VERIFY_FAILED },
86     { INVALID_PARAMETERS_ERR, ERR_PARAMETER_INVALID },
87     { INVALID_REMOTE_PARAMETERS_ERR, ERR_PARAMETER_INVALID },
88     { REMOTE_DEVICE_NOT_COMPATIBLE, ERR_REMOTE_INCOMPATIBLE },
89     { DEVICE_OFFLINE_ERR, ERR_DEVICE_OFFLINE },
90     { FREE_INSTALL_TIMEOUT, ERR_FREE_INSTALL_TIMEOUT },
91     { NOT_TOP_ABILITY, ERR_NOT_TOP_ABILITY },
92     { TARGET_BUNDLE_NOT_EXIST, ERR_TARGET_BUNDLE_NOT_EXIST },
93     { CONTINUE_FREE_INSTALL_FAILED, ERR_CONTINUE_FREE_INSTALL_FAILED }
94 };
95 
96 using NAPICreateJsRemoteObject = napi_value (*)(napi_env env, const sptr<IRemoteObject> target);
97 static std::map<ConnectionKey, sptr<NAPIAbilityConnection>, KeyCompare> g_connects;
98 static std::recursive_mutex g_connectionsLock;
99 static int64_t g_serialNumber = 0;
100 
101 class ConnectionManager
102 {
103 public:
ConnectionManager(std::map<ConnectionKey,sptr<NAPIAbilityConnection>,KeyCompare> & connects,std::recursive_mutex & connectionsLock)104     ConnectionManager(std::map<ConnectionKey, sptr<NAPIAbilityConnection>, KeyCompare> &connects,
105         std::recursive_mutex &connectionsLock) : connects_(connects), connectionsLock_(connectionsLock)
106     {}
RemoveConnection(std::string deviceId,std::string bundleName,std::string abilityName)107     void RemoveConnection(std::string deviceId, std::string bundleName, std::string abilityName)
108     {
109         HILOG_INFO("RemoveConnection connects_.size:%{public}zu", connects_.size());
110         std::lock_guard<std::recursive_mutex> lock(connectionsLock_);
111         auto item = std::find_if(connects_.begin(), connects_.end(),
112             [deviceId, bundleName, abilityName](const auto &obj) {
113                 return (deviceId == obj.first.want.GetDeviceId()) &&
114                        (bundleName == obj.first.want.GetBundle()) &&
115                        (abilityName == obj.first.want.GetElement().GetAbilityName());
116             });
117         if (item != connects_.end()) {
118             // match deviceid & bundlename && abilityname
119             connects_.erase(item);
120             HILOG_INFO("RemoveConnection erase connects_.size:%{public}zu", connects_.size());
121         }
122     }
123 private:
124     std::map<ConnectionKey, sptr<NAPIAbilityConnection>, KeyCompare> &connects_;
125     std::recursive_mutex &connectionsLock_;
126 };
127 std::unique_ptr<ConnectionManager> g_connectionManager;
128 
SetGlobalClassContext(napi_env env,napi_value constructor)129 napi_status SetGlobalClassContext(napi_env env, napi_value constructor)
130 {
131     return napi_create_reference(env, constructor, 1, &g_contextObject);
132 }
133 
GetGlobalClassContext(napi_env env)134 napi_value GetGlobalClassContext(napi_env env)
135 {
136     napi_value constructor;
137     NAPI_CALL(env, napi_get_reference_value(env, g_contextObject, &constructor));
138     return constructor;
139 }
140 
SaveGlobalDataAbilityHelper(napi_env env,napi_value constructor)141 napi_status SaveGlobalDataAbilityHelper(napi_env env, napi_value constructor)
142 {
143     return napi_create_reference(env, constructor, 1, &g_dataAbilityHelper);
144 }
145 
GetGlobalDataAbilityHelper(napi_env env)146 napi_value GetGlobalDataAbilityHelper(napi_env env)
147 {
148     napi_value constructor;
149     NAPI_CALL(env, napi_get_reference_value(env, g_dataAbilityHelper, &constructor));
150     return constructor;
151 }
152 
GetDataAbilityHelperStatus()153 bool& GetDataAbilityHelperStatus()
154 {
155     return g_dataAbilityHelperStatus;
156 }
157 
CheckAbilityType(AbilityType typeInAbility,AbilityType typeWant)158 bool CheckAbilityType(AbilityType typeInAbility, AbilityType typeWant)
159 {
160     switch (typeWant) {
161         case AbilityType::PAGE:
162             if (typeInAbility == AbilityType::PAGE || typeInAbility == AbilityType::DATA) {
163                 return true;
164             }
165             return false;
166         default:
167             return typeInAbility != AbilityType::PAGE;
168     }
169     return false;
170 }
171 
CheckAbilityType(const CBBase * cbBase)172 bool CheckAbilityType(const CBBase *cbBase)
173 {
174     if (cbBase == nullptr) {
175         HILOG_ERROR("%{public}s cbBase == nullptr", __func__);
176         return false;
177     }
178 
179     if (cbBase->ability == nullptr) {
180         HILOG_ERROR("%{public}s cbBase->ability == nullptr", __func__);
181         return false;
182     }
183 
184     const std::shared_ptr<AbilityInfo> info = cbBase->ability->GetAbilityInfo();
185     if (info == nullptr) {
186         HILOG_ERROR("%{public}s info == nullptr", __func__);
187         return false;
188     }
189     return CheckAbilityType((AbilityType)info->type, cbBase->abilityType);
190 }
191 
CheckAbilityType(const AsyncJSCallbackInfo * asyncCallbackInfo)192 bool CheckAbilityType(const AsyncJSCallbackInfo *asyncCallbackInfo)
193 {
194     HILOG_INFO("%{public}s called.", __func__);
195     if (asyncCallbackInfo == nullptr) {
196         HILOG_ERROR("%{public}s asyncCallbackInfo == nullptr", __func__);
197         return false;
198     }
199 
200     if (asyncCallbackInfo->ability == nullptr) {
201         HILOG_ERROR("%{public}s ability == nullptr", __func__);
202         return false;
203     }
204 
205     const std::shared_ptr<AbilityInfo> info = asyncCallbackInfo->ability->GetAbilityInfo();
206     if (info == nullptr) {
207         HILOG_ERROR("%{public}s info == nullptr", __func__);
208         return false;
209     }
210     HILOG_INFO("%{public}s end.", __func__);
211     return CheckAbilityType((AbilityType)info->type, asyncCallbackInfo->abilityType);
212 }
213 
CheckAbilityType(const AsyncCallbackInfo * asyncCallbackInfo)214 bool CheckAbilityType(const AsyncCallbackInfo *asyncCallbackInfo)
215 {
216     HILOG_INFO("%{public}s called.", __func__);
217     if (asyncCallbackInfo == nullptr) {
218         HILOG_ERROR("%{public}s asyncCallbackInfo == nullptr", __func__);
219         return false;
220     }
221 
222     if (asyncCallbackInfo->ability == nullptr) {
223         HILOG_ERROR("%{public}s ability == nullptr", __func__);
224         return false;
225     }
226 
227     const std::shared_ptr<AbilityInfo> info = asyncCallbackInfo->ability->GetAbilityInfo();
228     if (info == nullptr) {
229         HILOG_ERROR("%{public}s info == nullptr", __func__);
230         return false;
231     }
232 
233     HILOG_INFO("%{public}s end.", __func__);
234     return CheckAbilityType((AbilityType)info->type, asyncCallbackInfo->abilityType);
235 }
236 
GetContinueAbilityOptionsInfoCommon(const napi_env & env,const napi_value & value,ContinueAbilityOptionsInfo & info)237 napi_value GetContinueAbilityOptionsInfoCommon(
238     const napi_env &env, const napi_value &value, ContinueAbilityOptionsInfo &info)
239 {
240     HILOG_INFO("%{public}s.", __func__);
241     napi_value result = nullptr;
242 
243     // reversible?: boolean
244     if (GetContinueAbilityOptionsReversible(env, value, info) == nullptr) {
245         return nullptr;
246     }
247 
248     // deviceId?: string
249     if (GetContinueAbilityOptionsDeviceID(env, value, info) == nullptr) {
250         return nullptr;
251     }
252 
253     napi_get_null(env, &result);
254     HILOG_INFO("%{public}s.", __func__);
255     return result;
256 }
257 
GetContinueAbilityOptionsReversible(const napi_env & env,const napi_value & value,ContinueAbilityOptionsInfo & info)258 napi_value GetContinueAbilityOptionsReversible(
259     const napi_env &env, const napi_value &value, ContinueAbilityOptionsInfo &info)
260 {
261     HILOG_INFO("%{public}s.", __func__);
262     napi_valuetype valuetype = napi_undefined;
263     napi_value result = nullptr;
264     bool hasProperty = false;
265     bool reversible = false;
266 
267     NAPI_CALL(env, napi_has_named_property(env, value, "reversible", &hasProperty));
268     if (hasProperty) {
269         napi_get_named_property(env, value, "reversible", &result);
270         NAPI_CALL(env, napi_typeof(env, result, &valuetype));
271         if (valuetype != napi_boolean) {
272             HILOG_ERROR("%{public}s, Wrong argument type. Bool expected.", __func__);
273             return nullptr;
274         }
275         napi_get_value_bool(env, result, &reversible);
276         info.reversible = reversible;
277     }
278     HILOG_INFO("%{public}s.", __func__);
279     return result;
280 }
281 
GetContinueAbilityOptionsDeviceID(const napi_env & env,const napi_value & value,ContinueAbilityOptionsInfo & info)282 napi_value GetContinueAbilityOptionsDeviceID(
283     const napi_env &env, const napi_value &value, ContinueAbilityOptionsInfo &info)
284 {
285     HILOG_INFO("%{public}s.", __func__);
286     napi_valuetype valuetype = napi_undefined;
287     napi_value result = nullptr;
288     bool hasProperty = false;
289     char str[STR_MAX_SIZE] = {0};
290     size_t strLen = 0;
291 
292     NAPI_CALL(env, napi_has_named_property(env, value, "deviceId", &hasProperty));
293     if (hasProperty) {
294         napi_get_named_property(env, value, "deviceId", &result);
295         NAPI_CALL(env, napi_typeof(env, result, &valuetype));
296         if (valuetype != napi_string) {
297             HILOG_ERROR("%{public}s, Wrong argument type. String expected.", __func__);
298             return nullptr;
299         }
300         NAPI_CALL(env, napi_get_value_string_utf8(env, result, str, STR_MAX_SIZE - 1, &strLen));
301         info.deviceId = str;
302     }
303     HILOG_INFO("%{public}s.", __func__);
304     return result;
305 }
306 
WrapAppInfo(napi_env env,const ApplicationInfo & appInfo)307 napi_value WrapAppInfo(napi_env env, const ApplicationInfo &appInfo)
308 {
309     HILOG_INFO("%{public}s.", __func__);
310     napi_value result = nullptr;
311     napi_value proValue = nullptr;
312     NAPI_CALL(env, napi_create_object(env, &result));
313     NAPI_CALL(env, napi_create_string_utf8(env, appInfo.name.c_str(), NAPI_AUTO_LENGTH, &proValue));
314     NAPI_CALL(env, napi_set_named_property(env, result, "name", proValue));
315 
316     NAPI_CALL(env, napi_create_string_utf8(env, appInfo.description.c_str(), NAPI_AUTO_LENGTH, &proValue));
317     NAPI_CALL(env, napi_set_named_property(env, result, "description", proValue));
318 
319     NAPI_CALL(env, napi_create_int32(env, appInfo.descriptionId, &proValue));
320     NAPI_CALL(env, napi_set_named_property(env, result, "descriptionId", proValue));
321 
322     NAPI_CALL(env, napi_get_boolean(env, appInfo.isSystemApp, &proValue));
323     NAPI_CALL(env, napi_set_named_property(env, result, "systemApp", proValue));
324     NAPI_CALL(env, napi_get_boolean(env, appInfo.enabled, &proValue));
325     NAPI_CALL(env, napi_set_named_property(env, result, "enabled", proValue));
326     NAPI_CALL(env, napi_create_string_utf8(env, appInfo.label.c_str(), NAPI_AUTO_LENGTH, &proValue));
327     NAPI_CALL(env, napi_set_named_property(env, result, "label", proValue));
328     NAPI_CALL(env, napi_create_string_utf8(env, std::to_string(appInfo.labelId).c_str(), NAPI_AUTO_LENGTH, &proValue));
329     NAPI_CALL(env, napi_set_named_property(env, result, "labelId", proValue));
330     NAPI_CALL(env, napi_create_string_utf8(env, appInfo.iconPath.c_str(), NAPI_AUTO_LENGTH, &proValue));
331     NAPI_CALL(env, napi_set_named_property(env, result, "icon", proValue));
332     NAPI_CALL(env, napi_create_string_utf8(env, std::to_string(appInfo.iconId).c_str(), NAPI_AUTO_LENGTH, &proValue));
333     NAPI_CALL(env, napi_set_named_property(env, result, "iconId", proValue));
334     NAPI_CALL(env, napi_create_string_utf8(env, appInfo.process.c_str(), NAPI_AUTO_LENGTH, &proValue));
335     NAPI_CALL(env, napi_set_named_property(env, result, "process", proValue));
336     NAPI_CALL(env, napi_create_int32(env, appInfo.supportedModes, &proValue));
337     NAPI_CALL(env, napi_set_named_property(env, result, "supportedModes", proValue));
338 
339     (void)WrapProperties(env, appInfo.moduleSourceDirs, "moduleSourceDirs", result);
340     (void)WrapProperties(env, appInfo.permissions, "permissions", result);
341     (void)WrapModuleInfos(env, appInfo, result);
342     NAPI_CALL(env, napi_create_string_utf8(env, appInfo.entryDir.c_str(), NAPI_AUTO_LENGTH, &proValue));
343     NAPI_CALL(env, napi_set_named_property(env, result, "entryDir", proValue));
344     HILOG_INFO("%{public}s end.", __func__);
345     return result;
346 }
347 
GetStartAbilityErrorCode(ErrCode innerErrorCode)348 int32_t GetStartAbilityErrorCode(ErrCode innerErrorCode)
349 {
350     auto iter = START_ABILITY_ERROR_CODE_MAP.find(innerErrorCode);
351     if (iter != START_ABILITY_ERROR_CODE_MAP.end()) {
352         return iter->second;
353     }
354     return ERR_ABILITY_QUERY_FAILED;
355 }
356 
357 /**
358  * @brief GetFilesDir asynchronous processing function.
359  *
360  * @param env The environment that the Node-API call is invoked under.
361  * @param data Point to asynchronous processing of data.
362  */
GetFilesDirExecuteCallback(napi_env env,void * data)363 void GetFilesDirExecuteCallback(napi_env env, void *data)
364 {
365     HILOG_INFO("%{public}s called", __func__);
366     AsyncJSCallbackInfo *asyncCallbackInfo = static_cast<AsyncJSCallbackInfo *>(data);
367     if (asyncCallbackInfo == nullptr) {
368         HILOG_ERROR("%{public}s. asyncCallbackInfo is null", __func__);
369         return;
370     }
371 
372     asyncCallbackInfo->error_code = NAPI_ERR_NO_ERROR;
373     asyncCallbackInfo->native_data.data_type = NVT_NONE;
374     if (asyncCallbackInfo->ability == nullptr) {
375         HILOG_ERROR("%{public}s ability == nullptr", __func__);
376         asyncCallbackInfo->error_code = NAPI_ERR_ACE_ABILITY;
377         return;
378     }
379 
380     if (!CheckAbilityType(asyncCallbackInfo)) {
381         HILOG_ERROR("%{public}s wrong ability type", __func__);
382         asyncCallbackInfo->error_code = NAPI_ERR_ABILITY_TYPE_INVALID;
383         asyncCallbackInfo->native_data.data_type = NVT_UNDEFINED;
384         return;
385     }
386 
387     asyncCallbackInfo->native_data.data_type = NVT_STRING;
388     std::shared_ptr<AbilityRuntime::AbilityContext> abilityContext = asyncCallbackInfo->ability->GetAbilityContext();
389     if (abilityContext == nullptr) {
390         HILOG_ERROR("%{public}s GetAbilityContext is nullptr", __func__);
391         asyncCallbackInfo->error_code = NAPI_ERR_ACE_ABILITY;
392         return;
393     }
394     asyncCallbackInfo->native_data.str_value = abilityContext->GetFilesDir();
395     HILOG_INFO("%{public}s end. filesDir=%{public}s", __func__, asyncCallbackInfo->native_data.str_value.c_str());
396 }
397 
IsUpdatingConfigurationsExecuteCallback(napi_env env,void * data)398 void IsUpdatingConfigurationsExecuteCallback(napi_env env, void *data)
399 {
400     HILOG_INFO("%{public}s called", __func__);
401     AsyncJSCallbackInfo *asyncCallbackInfo = static_cast<AsyncJSCallbackInfo *>(data);
402     if (asyncCallbackInfo == nullptr) {
403         HILOG_ERROR("%{public}s. asyncCallbackInfo is null", __func__);
404         return;
405     }
406 
407     asyncCallbackInfo->error_code = NAPI_ERR_NO_ERROR;
408     asyncCallbackInfo->native_data.data_type = NVT_NONE;
409     if (asyncCallbackInfo->ability == nullptr) {
410         HILOG_ERROR("%{public}s ability == nullptr", __func__);
411         asyncCallbackInfo->error_code = NAPI_ERR_ACE_ABILITY;
412         return;
413     }
414 
415     if (!CheckAbilityType(asyncCallbackInfo)) {
416         HILOG_ERROR("%{public}s wrong ability type", __func__);
417         asyncCallbackInfo->error_code = NAPI_ERR_ABILITY_TYPE_INVALID;
418         asyncCallbackInfo->native_data.data_type = NVT_UNDEFINED;
419         return;
420     }
421 
422     asyncCallbackInfo->native_data.data_type = NVT_BOOL;
423     asyncCallbackInfo->native_data.bool_value = asyncCallbackInfo->ability->IsUpdatingConfigurations();
424     HILOG_INFO("%{public}s end", __func__);
425 }
426 
427 /**
428  * @brief PrintDrawnCompleted asynchronous processing function.
429  *
430  * @param env The environment that the Node-API call is invoked under.
431  * @param data Point to asynchronous processing of data.
432  */
PrintDrawnCompletedExecuteCallback(napi_env env,void * data)433 void PrintDrawnCompletedExecuteCallback(napi_env env, void *data)
434 {
435     HILOG_INFO("%{public}s called", __func__);
436     AsyncJSCallbackInfo *asyncCallbackInfo = static_cast<AsyncJSCallbackInfo *>(data);
437     if (asyncCallbackInfo == nullptr) {
438         HILOG_ERROR("%{public}s. asyncCallbackInfo is null", __func__);
439         return;
440     }
441 
442     asyncCallbackInfo->error_code = NAPI_ERR_NO_ERROR;
443     asyncCallbackInfo->native_data.data_type = NVT_NONE;
444     if (asyncCallbackInfo->ability == nullptr) {
445         HILOG_ERROR("%{public}s ability == nullptr", __func__);
446         asyncCallbackInfo->error_code = NAPI_ERR_ACE_ABILITY;
447         return;
448     }
449 
450     if (!CheckAbilityType(asyncCallbackInfo)) {
451         HILOG_ERROR("%{public}s wrong ability type", __func__);
452         asyncCallbackInfo->error_code = NAPI_ERR_ABILITY_TYPE_INVALID;
453         asyncCallbackInfo->native_data.data_type = NVT_UNDEFINED;
454         return;
455     }
456 
457     asyncCallbackInfo->native_data.data_type = NVT_NONE;
458     asyncCallbackInfo->native_data.bool_value = asyncCallbackInfo->ability->PrintDrawnCompleted();
459     HILOG_INFO("%{public}s end", __func__);
460 }
461 
NAPI_GetFilesDirWrap(napi_env env,napi_callback_info info,AsyncJSCallbackInfo * asyncCallbackInfo)462 napi_value NAPI_GetFilesDirWrap(napi_env env, napi_callback_info info, AsyncJSCallbackInfo *asyncCallbackInfo)
463 {
464     HILOG_INFO("%{public}s called", __func__);
465     size_t argc = ARGS_MAX_COUNT;
466     napi_value args[ARGS_MAX_COUNT] = {nullptr};
467     napi_value jsthis = nullptr;
468     void *data = nullptr;
469 
470     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &jsthis, &data));
471 
472     if (argc > ARGS_ONE) {
473         HILOG_INFO("%{public}s called, parameters is invalid.", __func__);
474         return nullptr;
475     }
476 
477     if (argc == ARGS_ONE) {
478         if (!CreateAsyncCallback(env, args[PARAM0], asyncCallbackInfo)) {
479             HILOG_INFO("%{public}s called, the first parameter is invalid.", __func__);
480             return nullptr;
481         }
482     }
483 
484     AsyncParamEx asyncParamEx;
485     if (asyncCallbackInfo->cbInfo.callback != nullptr) {
486         HILOG_INFO("%{public}s called. asyncCallback.", __func__);
487         asyncParamEx.resource = "NAPI_GetFilesDirCallback";
488         asyncParamEx.execute = GetFilesDirExecuteCallback;
489         asyncParamEx.complete = CompleteAsyncCallbackWork;
490 
491         return ExecuteAsyncCallbackWork(env, asyncCallbackInfo, &asyncParamEx);
492     } else {
493         HILOG_INFO("%{public}s called. promise.", __func__);
494         asyncParamEx.resource = "NAPI_GetFilesDirPromise";
495         asyncParamEx.execute = GetFilesDirExecuteCallback;
496         asyncParamEx.complete = CompletePromiseCallbackWork;
497 
498         return ExecutePromiseCallbackWork(env, asyncCallbackInfo, &asyncParamEx);
499     }
500 }
NAPI_GetFilesDirCommon(napi_env env,napi_callback_info info,AbilityType abilityType)501 napi_value NAPI_GetFilesDirCommon(napi_env env, napi_callback_info info, AbilityType abilityType)
502 {
503     HILOG_INFO("%{public}s called", __func__);
504     AsyncJSCallbackInfo *asyncCallbackInfo = CreateAsyncJSCallbackInfo(env);
505     if (asyncCallbackInfo == nullptr) {
506         HILOG_INFO("%{public}s called. Invoke CreateAsyncJSCallbackInfo failed.", __func__);
507         return WrapVoidToJS(env);
508     }
509 
510     asyncCallbackInfo->abilityType = abilityType;
511     napi_value ret = NAPI_GetFilesDirWrap(env, info, asyncCallbackInfo);
512     if (ret == nullptr) {
513         HILOG_ERROR("%{public}s ret == nullptr", __func__);
514         FreeAsyncJSCallbackInfo(&asyncCallbackInfo);
515         ret = WrapVoidToJS(env);
516     }
517     HILOG_INFO("%{public}s end", __func__);
518     return ret;
519 }
520 
GetOrCreateDistributedDirExecuteCallback(napi_env env,void * data)521 void GetOrCreateDistributedDirExecuteCallback(napi_env env, void *data)
522 {
523     HILOG_INFO("%{public}s called", __func__);
524     AsyncJSCallbackInfo *asyncCallbackInfo = static_cast<AsyncJSCallbackInfo *>(data);
525     if (asyncCallbackInfo == nullptr) {
526         HILOG_ERROR("%{public}s. asyncCallbackInfo is null", __func__);
527         return;
528     }
529 
530     asyncCallbackInfo->error_code = NAPI_ERR_NO_ERROR;
531     asyncCallbackInfo->native_data.data_type = NVT_NONE;
532     if (asyncCallbackInfo->ability == nullptr) {
533         HILOG_ERROR("%{public}s ability == nullptr", __func__);
534         asyncCallbackInfo->error_code = NAPI_ERR_ACE_ABILITY;
535         return;
536     }
537 
538     if (!CheckAbilityType(asyncCallbackInfo)) {
539         HILOG_ERROR("%{public}s wrong ability type", __func__);
540         asyncCallbackInfo->error_code = NAPI_ERR_ABILITY_TYPE_INVALID;
541         asyncCallbackInfo->native_data.data_type = NVT_UNDEFINED;
542         return;
543     }
544 
545     asyncCallbackInfo->native_data.data_type = NVT_STRING;
546     std::shared_ptr<AbilityRuntime::AbilityContext> abilityContext = asyncCallbackInfo->ability->GetAbilityContext();
547     if (abilityContext == nullptr) {
548         HILOG_ERROR("%{public}s GetAbilityContext is nullptr", __func__);
549         asyncCallbackInfo->error_code = NAPI_ERR_ACE_ABILITY;
550         return;
551     }
552     asyncCallbackInfo->native_data.str_value = abilityContext->GetDistributedFilesDir();
553     HILOG_INFO("%{public}s end. filesDir=%{public}s", __func__, asyncCallbackInfo->native_data.str_value.c_str());
554 }
555 
556 /**
557  * @brief GetFilesDir processing function.
558  *
559  * @param env The environment that the Node-API call is invoked under.
560  * @param asyncCallbackInfo Process data asynchronously.
561  *
562  * @return Return JS data successfully, otherwise return nullptr.
563  */
NAPI_GetOrCreateDistributedDirWrap(napi_env env,napi_callback_info info,AsyncJSCallbackInfo * asyncCallbackInfo)564 napi_value NAPI_GetOrCreateDistributedDirWrap(
565     napi_env env, napi_callback_info info, AsyncJSCallbackInfo *asyncCallbackInfo)
566 {
567     HILOG_INFO("%{public}s called", __func__);
568     size_t argc = ARGS_MAX_COUNT;
569     napi_value args[ARGS_MAX_COUNT] = {nullptr};
570     napi_value jsthis = nullptr;
571     void *data = nullptr;
572 
573     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &jsthis, &data));
574 
575     if (argc > ARGS_ONE) {
576         HILOG_ERROR("%{public}s called, parameters is invalid.", __func__);
577         return nullptr;
578     }
579 
580     if (argc == ARGS_ONE) {
581         if (!CreateAsyncCallback(env, args[PARAM0], asyncCallbackInfo)) {
582             HILOG_ERROR("%{public}s called, the first parameter is invalid.", __func__);
583             return nullptr;
584         }
585     }
586 
587     AsyncParamEx asyncParamEx;
588     if (asyncCallbackInfo->cbInfo.callback != nullptr) {
589         HILOG_INFO("%{public}s called. asyncCallback.", __func__);
590         asyncParamEx.resource = "NAPI_GetFilesDirCallback";
591         asyncParamEx.execute = GetOrCreateDistributedDirExecuteCallback;
592         asyncParamEx.complete = CompleteAsyncCallbackWork;
593 
594         return ExecuteAsyncCallbackWork(env, asyncCallbackInfo, &asyncParamEx);
595     } else {
596         HILOG_INFO("%{public}s called. promise.", __func__);
597         asyncParamEx.resource = "NAPI_GetFilesDirPromise";
598         asyncParamEx.execute = GetOrCreateDistributedDirExecuteCallback;
599         asyncParamEx.complete = CompletePromiseCallbackWork;
600 
601         return ExecutePromiseCallbackWork(env, asyncCallbackInfo, &asyncParamEx);
602     }
603 }
604 
NAPI_GetOrCreateDistributedDirCommon(napi_env env,napi_callback_info info,AbilityType abilityType)605 napi_value NAPI_GetOrCreateDistributedDirCommon(napi_env env, napi_callback_info info, AbilityType abilityType)
606 {
607     HILOG_INFO("%{public}s called", __func__);
608     AsyncJSCallbackInfo *asyncCallbackInfo = CreateAsyncJSCallbackInfo(env);
609     if (asyncCallbackInfo == nullptr) {
610         HILOG_ERROR("%{public}s called. Invoke CreateAsyncJSCallbackInfo failed.", __func__);
611         return WrapVoidToJS(env);
612     }
613 
614     asyncCallbackInfo->abilityType = abilityType;
615     napi_value ret = NAPI_GetOrCreateDistributedDirWrap(env, info, asyncCallbackInfo);
616     if (ret == nullptr) {
617         HILOG_ERROR("%{public}s ret == nullptr", __func__);
618         FreeAsyncJSCallbackInfo(&asyncCallbackInfo);
619         ret = WrapVoidToJS(env);
620     }
621     HILOG_INFO("%{public}s end", __func__);
622     return ret;
623 }
624 
625 /**
626  * @brief GetCacheDir asynchronous processing function.
627  *
628  * @param env The environment that the Node-API call is invoked under.
629  * @param data Point to asynchronous processing of data.
630  */
GetCacheDirExecuteCallback(napi_env env,void * data)631 void GetCacheDirExecuteCallback(napi_env env, void *data)
632 {
633     HILOG_INFO("%{public}s called", __func__);
634     AsyncJSCallbackInfo *asyncCallbackInfo = static_cast<AsyncJSCallbackInfo *>(data);
635     if (asyncCallbackInfo == nullptr) {
636         HILOG_ERROR("%{public}s. asyncCallbackInfo is null", __func__);
637         return;
638     }
639 
640     asyncCallbackInfo->error_code = NAPI_ERR_NO_ERROR;
641     asyncCallbackInfo->native_data.data_type = NVT_NONE;
642     if (asyncCallbackInfo->ability == nullptr) {
643         HILOG_ERROR("%{public}s ability == nullptr", __func__);
644         asyncCallbackInfo->error_code = NAPI_ERR_ACE_ABILITY;
645         return;
646     }
647 
648     if (!CheckAbilityType(asyncCallbackInfo)) {
649         HILOG_ERROR("%{public}s wrong ability type", __func__);
650         asyncCallbackInfo->error_code = NAPI_ERR_ABILITY_TYPE_INVALID;
651         asyncCallbackInfo->native_data.data_type = NVT_UNDEFINED;
652         return;
653     }
654 
655     asyncCallbackInfo->native_data.data_type = NVT_STRING;
656     std::shared_ptr<AbilityRuntime::AbilityContext> abilityContext = asyncCallbackInfo->ability->GetAbilityContext();
657     if (abilityContext == nullptr) {
658         HILOG_ERROR("%{public}s GetAbilityContext is nullptr", __func__);
659         asyncCallbackInfo->error_code = NAPI_ERR_ACE_ABILITY;
660         return;
661     }
662     asyncCallbackInfo->native_data.str_value = abilityContext->GetCacheDir();
663     HILOG_INFO("%{public}s end. CacheDir=%{public}s", __func__, asyncCallbackInfo->native_data.str_value.c_str());
664 }
665 
666 /**
667  * @brief NAPI_GetCacheDirWrap processing function.
668  *
669  * @param env The environment that the Node-API call is invoked under.
670  * @param asyncCallbackInfo Process data asynchronously.
671  *
672  * @return Return JS data successfully, otherwise return nullptr.
673  */
NAPI_GetCacheDirWrap(napi_env env,napi_callback_info info,AsyncJSCallbackInfo * asyncCallbackInfo)674 napi_value NAPI_GetCacheDirWrap(napi_env env, napi_callback_info info, AsyncJSCallbackInfo *asyncCallbackInfo)
675 {
676     HILOG_INFO("%{public}s called", __func__);
677     size_t argc = ARGS_MAX_COUNT;
678     napi_value args[ARGS_MAX_COUNT] = {nullptr};
679     napi_value jsthis = nullptr;
680     void *data = nullptr;
681 
682     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &jsthis, &data));
683 
684     if (argc > ARGS_ONE) {
685         HILOG_ERROR("%{public}s called, parameters is invalid.", __func__);
686         return nullptr;
687     }
688 
689     if (argc == ARGS_ONE) {
690         if (!CreateAsyncCallback(env, args[PARAM0], asyncCallbackInfo)) {
691             HILOG_ERROR("%{public}s called, the first parameter is invalid.", __func__);
692             return nullptr;
693         }
694     }
695 
696     AsyncParamEx asyncParamEx;
697     if (asyncCallbackInfo->cbInfo.callback != nullptr) {
698         HILOG_INFO("%{public}s called. asyncCallback.", __func__);
699         asyncParamEx.resource = "NAPI_GetCacheDirCallback";
700         asyncParamEx.execute = GetCacheDirExecuteCallback;
701         asyncParamEx.complete = CompleteAsyncCallbackWork;
702 
703         return ExecuteAsyncCallbackWork(env, asyncCallbackInfo, &asyncParamEx);
704     } else {
705         HILOG_INFO("%{public}s called. promise.", __func__);
706         asyncParamEx.resource = "NAPI_GetCacheDirPromise";
707         asyncParamEx.execute = GetCacheDirExecuteCallback;
708         asyncParamEx.complete = CompletePromiseCallbackWork;
709 
710         return ExecutePromiseCallbackWork(env, asyncCallbackInfo, &asyncParamEx);
711     }
712 }
713 
NAPI_GetCacheDirCommon(napi_env env,napi_callback_info info,AbilityType abilityType)714 napi_value NAPI_GetCacheDirCommon(napi_env env, napi_callback_info info, AbilityType abilityType)
715 {
716     HILOG_INFO("%{public}s called", __func__);
717     AsyncJSCallbackInfo *asyncCallbackInfo = CreateAsyncJSCallbackInfo(env);
718     if (asyncCallbackInfo == nullptr) {
719         HILOG_ERROR("%{public}s called. Invoke CreateAsyncJSCallbackInfo failed.", __func__);
720         return WrapVoidToJS(env);
721     }
722 
723     asyncCallbackInfo->abilityType = abilityType;
724     napi_value ret = NAPI_GetCacheDirWrap(env, info, asyncCallbackInfo);
725     if (ret == nullptr) {
726         HILOG_ERROR("%{public}s ret == nullptr", __func__);
727         FreeAsyncJSCallbackInfo(&asyncCallbackInfo);
728         ret = WrapVoidToJS(env);
729     }
730     HILOG_INFO("%{public}s end", __func__);
731     return ret;
732 }
733 
734 /**
735  * @brief GetExternalCacheDir asynchronous processing function.
736  *
737  * @param env The environment that the Node-API call is invoked under.
738  * @param data Point to asynchronous processing of data.
739  */
GetExternalCacheDirExecuteCallback(napi_env env,void * data)740 void GetExternalCacheDirExecuteCallback(napi_env env, void *data)
741 {
742     HILOG_INFO("%{public}s called", __func__);
743     AsyncJSCallbackInfo *asyncCallbackInfo = static_cast<AsyncJSCallbackInfo *>(data);
744     if (asyncCallbackInfo == nullptr) {
745         HILOG_ERROR("%{public}s. asyncCallbackInfo is null", __func__);
746         return;
747     }
748 
749     asyncCallbackInfo->error_code = NAPI_ERR_NO_ERROR;
750     asyncCallbackInfo->native_data.data_type = NVT_NONE;
751     if (asyncCallbackInfo->ability == nullptr) {
752         HILOG_ERROR("%{public}s ability == nullptr", __func__);
753         asyncCallbackInfo->error_code = NAPI_ERR_ACE_ABILITY;
754         return;
755     }
756 
757     if (!CheckAbilityType(asyncCallbackInfo)) {
758         HILOG_ERROR("%{public}s wrong ability type", __func__);
759         asyncCallbackInfo->error_code = NAPI_ERR_ABILITY_TYPE_INVALID;
760         asyncCallbackInfo->native_data.data_type = NVT_UNDEFINED;
761         return;
762     }
763 
764     asyncCallbackInfo->native_data.data_type = NVT_STRING;
765     asyncCallbackInfo->native_data.str_value = asyncCallbackInfo->ability->GetExternalCacheDir();
766     HILOG_INFO(
767         "%{public}s end. ExternalCacheDir=%{private}s", __func__, asyncCallbackInfo->native_data.str_value.c_str());
768 }
769 
770 /**
771  * @brief NAPI_GetExternalCacheDirWrap processing function.
772  *
773  * @param env The environment that the Node-API call is invoked under.
774  * @param asyncCallbackInfo Process data asynchronously.
775  *
776  * @return Return JS data successfully, otherwise return nullptr.
777  */
NAPI_GetExternalCacheDirWrap(napi_env env,napi_callback_info info,AsyncJSCallbackInfo * asyncCallbackInfo)778 napi_value NAPI_GetExternalCacheDirWrap(napi_env env, napi_callback_info info, AsyncJSCallbackInfo *asyncCallbackInfo)
779 {
780     HILOG_INFO("%{public}s called", __func__);
781     size_t argc = ARGS_MAX_COUNT;
782     napi_value args[ARGS_MAX_COUNT] = {nullptr};
783     napi_value jsthis = nullptr;
784     void *data = nullptr;
785 
786     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &jsthis, &data));
787 
788     if (argc > ARGS_ONE) {
789         HILOG_INFO("%{public}s called, parameters is invalid.", __func__);
790         return nullptr;
791     }
792 
793     if (argc == ARGS_ONE) {
794         if (!CreateAsyncCallback(env, args[PARAM0], asyncCallbackInfo)) {
795             HILOG_INFO("%{public}s called, the first parameter is invalid.", __func__);
796             return nullptr;
797         }
798     }
799 
800     AsyncParamEx asyncParamEx;
801     if (asyncCallbackInfo->cbInfo.callback != nullptr) {
802         HILOG_INFO("%{public}s called. asyncCallback.", __func__);
803         asyncParamEx.resource = "NAPI_GetExternalCacheDirCallback";
804         asyncParamEx.execute = GetExternalCacheDirExecuteCallback;
805         asyncParamEx.complete = CompleteAsyncCallbackWork;
806 
807         return ExecuteAsyncCallbackWork(env, asyncCallbackInfo, &asyncParamEx);
808     } else {
809         HILOG_INFO("%{public}s called. promise.", __func__);
810         asyncParamEx.resource = "NAPI_GetExternalCacheDirPromise";
811         asyncParamEx.execute = GetExternalCacheDirExecuteCallback;
812         asyncParamEx.complete = CompletePromiseCallbackWork;
813 
814         return ExecutePromiseCallbackWork(env, asyncCallbackInfo, &asyncParamEx);
815     }
816 }
817 
NAPI_GetExternalCacheDirCommon(napi_env env,napi_callback_info info,AbilityType abilityType)818 napi_value NAPI_GetExternalCacheDirCommon(napi_env env, napi_callback_info info, AbilityType abilityType)
819 {
820     HILOG_INFO("%{public}s called", __func__);
821     AsyncJSCallbackInfo *asyncCallbackInfo = CreateAsyncJSCallbackInfo(env);
822     if (asyncCallbackInfo == nullptr) {
823         HILOG_INFO("%{public}s called. Invoke CreateAsyncJSCallbackInfo failed.", __func__);
824         return WrapVoidToJS(env);
825     }
826 
827     asyncCallbackInfo->abilityType = abilityType;
828     napi_value ret = NAPI_GetExternalCacheDirWrap(env, info, asyncCallbackInfo);
829     if (ret == nullptr) {
830         HILOG_ERROR("%{public}s ret == nullptr", __func__);
831         FreeAsyncJSCallbackInfo(&asyncCallbackInfo);
832         ret = WrapVoidToJS(env);
833     }
834     HILOG_INFO("%{public}s end", __func__);
835     return ret;
836 }
837 
NAPI_IsUpdatingConfigurationsWrap(napi_env env,napi_callback_info info,AsyncJSCallbackInfo * asyncCallbackInfo)838 napi_value NAPI_IsUpdatingConfigurationsWrap(
839     napi_env env, napi_callback_info info, AsyncJSCallbackInfo *asyncCallbackInfo)
840 {
841     HILOG_INFO("%{public}s called", __func__);
842     size_t argc = ARGS_MAX_COUNT;
843     napi_value args[ARGS_MAX_COUNT] = {nullptr};
844     napi_value jsthis = nullptr;
845     void *data = nullptr;
846 
847     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &jsthis, &data));
848 
849     if (argc > ARGS_ONE) {
850         HILOG_INFO("%{public}s called, parameters is invalid.", __func__);
851         return nullptr;
852     }
853 
854     if (argc == ARGS_ONE) {
855         if (!CreateAsyncCallback(env, args[PARAM0], asyncCallbackInfo)) {
856             HILOG_INFO("%{public}s called, the first parameter is invalid.", __func__);
857             return nullptr;
858         }
859     }
860 
861     AsyncParamEx asyncParamEx;
862     if (asyncCallbackInfo->cbInfo.callback != nullptr) {
863         HILOG_INFO("%{public}s called. asyncCallback.", __func__);
864         asyncParamEx.resource = "NAPI_IsUpdatingConfigurationsCallback";
865         asyncParamEx.execute = IsUpdatingConfigurationsExecuteCallback;
866         asyncParamEx.complete = CompleteAsyncCallbackWork;
867 
868         return ExecuteAsyncCallbackWork(env, asyncCallbackInfo, &asyncParamEx);
869     } else {
870         HILOG_INFO("%{public}s called. promise.", __func__);
871         asyncParamEx.resource = "NAPI_IsUpdatingConfigurationsPromise";
872         asyncParamEx.execute = IsUpdatingConfigurationsExecuteCallback;
873         asyncParamEx.complete = CompletePromiseCallbackWork;
874 
875         return ExecutePromiseCallbackWork(env, asyncCallbackInfo, &asyncParamEx);
876     }
877 }
878 
NAPI_PrintDrawnCompletedWrap(napi_env env,napi_callback_info info,AsyncJSCallbackInfo * asyncCallbackInfo)879 napi_value NAPI_PrintDrawnCompletedWrap(napi_env env, napi_callback_info info, AsyncJSCallbackInfo *asyncCallbackInfo)
880 {
881     HILOG_INFO("%{public}s called", __func__);
882     size_t argc = ARGS_MAX_COUNT;
883     napi_value args[ARGS_MAX_COUNT] = {nullptr};
884     napi_value jsthis = nullptr;
885     void *data = nullptr;
886 
887     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &jsthis, &data));
888 
889     if (argc > ARGS_ONE) {
890         HILOG_INFO("%{public}s called, parameters is invalid.", __func__);
891         return nullptr;
892     }
893 
894     if (argc == ARGS_ONE) {
895         if (!CreateAsyncCallback(env, args[PARAM0], asyncCallbackInfo)) {
896             HILOG_INFO("%{public}s called, the first parameter is invalid.", __func__);
897             return nullptr;
898         }
899     }
900 
901     AsyncParamEx asyncParamEx;
902     if (asyncCallbackInfo->cbInfo.callback != nullptr) {
903         HILOG_INFO("%{public}s called. asyncCallback.", __func__);
904         asyncParamEx.resource = "NAPI_PrintDrawnCompletedCallback";
905         asyncParamEx.execute = PrintDrawnCompletedExecuteCallback;
906         asyncParamEx.complete = CompleteAsyncVoidCallbackWork;
907 
908         return ExecuteAsyncCallbackWork(env, asyncCallbackInfo, &asyncParamEx);
909     } else {
910         HILOG_INFO("%{public}s called. promise.", __func__);
911         asyncParamEx.resource = "NAPI_PrintDrawnCompletedPromise";
912         asyncParamEx.execute = PrintDrawnCompletedExecuteCallback;
913         asyncParamEx.complete = CompletePromiseVoidCallbackWork;
914 
915         return ExecutePromiseCallbackWork(env, asyncCallbackInfo, &asyncParamEx);
916     }
917 }
918 
NAPI_IsUpdatingConfigurationsCommon(napi_env env,napi_callback_info info,AbilityType abilityType)919 napi_value NAPI_IsUpdatingConfigurationsCommon(napi_env env, napi_callback_info info, AbilityType abilityType)
920 {
921     HILOG_INFO("%{public}s called", __func__);
922     AsyncJSCallbackInfo *asyncCallbackInfo = CreateAsyncJSCallbackInfo(env);
923     if (asyncCallbackInfo == nullptr) {
924         HILOG_INFO("%{public}s called. Invoke CreateAsyncJSCallbackInfo failed.", __func__);
925         return WrapVoidToJS(env);
926     }
927 
928     asyncCallbackInfo->abilityType = abilityType;
929     napi_value ret = NAPI_IsUpdatingConfigurationsWrap(env, info, asyncCallbackInfo);
930     if (ret == nullptr) {
931         HILOG_ERROR("%{public}s ret == nullptr", __func__);
932         FreeAsyncJSCallbackInfo(&asyncCallbackInfo);
933         ret = WrapVoidToJS(env);
934     }
935     HILOG_INFO("%{public}s end", __func__);
936     return ret;
937 }
938 
NAPI_PrintDrawnCompletedCommon(napi_env env,napi_callback_info info,AbilityType abilityType)939 napi_value NAPI_PrintDrawnCompletedCommon(napi_env env, napi_callback_info info, AbilityType abilityType)
940 {
941     HILOG_INFO("%{public}s called", __func__);
942     AsyncJSCallbackInfo *asyncCallbackInfo = CreateAsyncJSCallbackInfo(env);
943     if (asyncCallbackInfo == nullptr) {
944         HILOG_INFO("%{public}s called. Invoke CreateAsyncJSCallbackInfo failed.", __func__);
945         return WrapVoidToJS(env);
946     }
947 
948     asyncCallbackInfo->abilityType = abilityType;
949     napi_value ret = NAPI_PrintDrawnCompletedWrap(env, info, asyncCallbackInfo);
950     if (ret == nullptr) {
951         HILOG_ERROR("%{public}s ret == nullptr", __func__);
952         FreeAsyncJSCallbackInfo(&asyncCallbackInfo);
953         ret = WrapVoidToJS(env);
954     }
955     HILOG_INFO("%{public}s end", __func__);
956     return ret;
957 }
958 
959 /**
960  * @brief Create asynchronous data.
961  *
962  * @param env The environment that the Node-API call is invoked under.
963  *
964  * @return Return a pointer to AppTypeCB on success, nullptr on failure.
965  */
CreateAppTypeCBInfo(napi_env env)966 AppTypeCB *CreateAppTypeCBInfo(napi_env env)
967 {
968     HILOG_INFO("%{public}s, called.", __func__);
969     napi_value global = nullptr;
970     NAPI_CALL(env, napi_get_global(env, &global));
971 
972     napi_value abilityObj = nullptr;
973     NAPI_CALL(env, napi_get_named_property(env, global, "ability", &abilityObj));
974 
975     Ability *ability = nullptr;
976     NAPI_CALL(env, napi_get_value_external(env, abilityObj, reinterpret_cast<void **>(&ability)));
977 
978     AppTypeCB *appTypeCB = new (std::nothrow) AppTypeCB;
979     if (appTypeCB == nullptr) {
980         HILOG_ERROR("%{public}s, appTypeCB == nullptr.", __func__);
981         return nullptr;
982     }
983     appTypeCB->cbBase.cbInfo.env = env;
984     appTypeCB->cbBase.asyncWork = nullptr;
985     appTypeCB->cbBase.deferred = nullptr;
986     appTypeCB->cbBase.ability = ability;
987 
988     HILOG_INFO("%{public}s, end.", __func__);
989     return appTypeCB;
990 }
991 
992 /**
993  * @brief GetAppType asynchronous processing function.
994  *
995  * @param env The environment that the Node-API call is invoked under.
996  * @param data Point to asynchronous processing of data.
997  */
GetAppTypeExecuteCB(napi_env env,void * data)998 void GetAppTypeExecuteCB(napi_env env, void *data)
999 {
1000     HILOG_INFO("NAPI_GetApplicationInfo, worker pool thread execute.");
1001     AppTypeCB *appTypeCB = static_cast<AppTypeCB *>(data);
1002     if (appTypeCB == nullptr) {
1003         HILOG_ERROR("NAPI_GetApplicationInfo,appTypeCB == nullptr");
1004         return;
1005     }
1006 
1007     appTypeCB->cbBase.errCode = NAPI_ERR_NO_ERROR;
1008     if (appTypeCB->cbBase.ability == nullptr) {
1009         HILOG_ERROR("NAPI_GetApplicationInfo,ability == nullptr");
1010         appTypeCB->cbBase.errCode = NAPI_ERR_ACE_ABILITY;
1011         return;
1012     }
1013 
1014     if (!CheckAbilityType(&appTypeCB->cbBase)) {
1015         HILOG_ERROR("NAPI_GetApplicationInfo,wrong ability type");
1016         appTypeCB->cbBase.errCode = NAPI_ERR_ABILITY_TYPE_INVALID;
1017         return;
1018     }
1019 
1020     appTypeCB->name = appTypeCB->cbBase.ability->GetAppType();
1021     HILOG_INFO("NAPI_GetApplicationInfo, worker pool thread execute end.");
1022 }
1023 
1024 /**
1025  * @brief The callback at the end of the asynchronous callback.
1026  *
1027  * @param env The environment that the Node-API call is invoked under.
1028  * @param data Point to asynchronous processing of data.
1029  */
GetAppTypeAsyncCompleteCB(napi_env env,napi_status status,void * data)1030 void GetAppTypeAsyncCompleteCB(napi_env env, napi_status status, void *data)
1031 {
1032     HILOG_INFO("NAPI_GetApplicationInfo, main event thread complete.");
1033     AppTypeCB *appTypeCB = static_cast<AppTypeCB *>(data);
1034     napi_value callback = nullptr;
1035     napi_value undefined = nullptr;
1036     napi_value result[ARGS_TWO] = {nullptr};
1037     napi_value callResult = nullptr;
1038     NAPI_CALL_RETURN_VOID(env, napi_get_undefined(env, &undefined));
1039 
1040     result[PARAM0] = GetCallbackErrorValue(env, appTypeCB->cbBase.errCode);
1041     if (appTypeCB->cbBase.errCode == NAPI_ERR_NO_ERROR) {
1042         NAPI_CALL_RETURN_VOID(env,
1043             napi_create_string_utf8(
1044                 env, appTypeCB->cbBase.ability->GetAppType().c_str(), NAPI_AUTO_LENGTH, &result[PARAM1]));
1045     } else {
1046         result[PARAM1] = WrapUndefinedToJS(env);
1047     }
1048     NAPI_CALL_RETURN_VOID(env, napi_get_reference_value(env, appTypeCB->cbBase.cbInfo.callback, &callback));
1049     NAPI_CALL_RETURN_VOID(env, napi_call_function(env, undefined, callback, ARGS_TWO, &result[PARAM0], &callResult));
1050 
1051     if (appTypeCB->cbBase.cbInfo.callback != nullptr) {
1052         NAPI_CALL_RETURN_VOID(env, napi_delete_reference(env, appTypeCB->cbBase.cbInfo.callback));
1053     }
1054     NAPI_CALL_RETURN_VOID(env, napi_delete_async_work(env, appTypeCB->cbBase.asyncWork));
1055     delete appTypeCB;
1056     appTypeCB = nullptr;
1057     HILOG_INFO("NAPI_GetApplicationInfo, main event thread complete end.");
1058 }
1059 
1060 /**
1061  * @brief The callback at the end of the Promise callback.
1062  *
1063  * @param env The environment that the Node-API call is invoked under.
1064  * @param data Point to asynchronous processing of data.
1065  */
GetAppTypePromiseCompleteCB(napi_env env,napi_status status,void * data)1066 void GetAppTypePromiseCompleteCB(napi_env env, napi_status status, void *data)
1067 {
1068     HILOG_INFO("GetAppTypePromiseCompleteCB, main event thread complete.");
1069     AppTypeCB *appTypeCB = static_cast<AppTypeCB *>(data);
1070     napi_value result = nullptr;
1071     if (appTypeCB->cbBase.errCode == NAPI_ERR_NO_ERROR) {
1072         napi_create_string_utf8(env, appTypeCB->cbBase.ability->GetAppType().c_str(), NAPI_AUTO_LENGTH, &result);
1073         napi_resolve_deferred(env, appTypeCB->cbBase.deferred, result);
1074     } else {
1075         result = GetCallbackErrorValue(env, appTypeCB->cbBase.errCode);
1076         napi_reject_deferred(env, appTypeCB->cbBase.deferred, result);
1077     }
1078 
1079     napi_delete_async_work(env, appTypeCB->cbBase.asyncWork);
1080     delete appTypeCB;
1081     appTypeCB = nullptr;
1082     HILOG_INFO("GetAppTypePromiseCompleteCB, main event thread complete end.");
1083 }
1084 
1085 /**
1086  * @brief GetAppType Async.
1087  *
1088  * @param env The environment that the Node-API call is invoked under.
1089  * @param args Indicates the arguments passed into the callback.
1090  * @param argcPromise Asynchronous data processing.
1091  * @param appTypeCB Process data asynchronously.
1092  *
1093  * @return Return JS data successfully, otherwise return nullptr.
1094  */
GetAppTypeAsync(napi_env env,napi_value * args,const size_t argCallback,AppTypeCB * appTypeCB)1095 napi_value GetAppTypeAsync(napi_env env, napi_value *args, const size_t argCallback, AppTypeCB *appTypeCB)
1096 {
1097     HILOG_INFO("%{public}s, asyncCallback.", __func__);
1098     if (args == nullptr || appTypeCB == nullptr) {
1099         HILOG_ERROR("%{public}s, param == nullptr.", __func__);
1100         return nullptr;
1101     }
1102     napi_value resourceName = nullptr;
1103     NAPI_CALL(env, napi_create_string_latin1(env, __func__, NAPI_AUTO_LENGTH, &resourceName));
1104 
1105     napi_valuetype valuetype = napi_undefined;
1106     NAPI_CALL(env, napi_typeof(env, args[argCallback], &valuetype));
1107     if (valuetype == napi_function) {
1108         NAPI_CALL(env, napi_create_reference(env, args[argCallback], 1, &appTypeCB->cbBase.cbInfo.callback));
1109     }
1110     NAPI_CALL(env,
1111         napi_create_async_work(env,
1112             nullptr,
1113             resourceName,
1114             GetAppTypeExecuteCB,
1115             GetAppTypeAsyncCompleteCB,
1116             static_cast<void *>(appTypeCB),
1117             &appTypeCB->cbBase.asyncWork));
1118     NAPI_CALL(env, napi_queue_async_work(env, appTypeCB->cbBase.asyncWork));
1119     napi_value result = nullptr;
1120     NAPI_CALL(env, napi_get_null(env, &result));
1121     HILOG_INFO("%{public}s, asyncCallback end.", __func__);
1122     return result;
1123 }
1124 
1125 /**
1126  * @brief GetAppType Promise.
1127  *
1128  * @param env The environment that the Node-API call is invoked under.
1129  * @param appTypeCB Process data asynchronously.
1130  *
1131  * @return Return JS data successfully, otherwise return nullptr.
1132  */
GetAppTypePromise(napi_env env,AppTypeCB * appTypeCB)1133 napi_value GetAppTypePromise(napi_env env, AppTypeCB *appTypeCB)
1134 {
1135     HILOG_INFO("%{public}s, promise.", __func__);
1136     if (appTypeCB == nullptr) {
1137         HILOG_ERROR("%{public}s, param == nullptr.", __func__);
1138         return nullptr;
1139     }
1140     napi_value resourceName = nullptr;
1141     NAPI_CALL(env, napi_create_string_latin1(env, __func__, NAPI_AUTO_LENGTH, &resourceName));
1142     napi_deferred deferred;
1143     napi_value promise = nullptr;
1144     NAPI_CALL(env, napi_create_promise(env, &deferred, &promise));
1145     appTypeCB->cbBase.deferred = deferred;
1146 
1147     NAPI_CALL(env,
1148         napi_create_async_work(env,
1149             nullptr,
1150             resourceName,
1151             GetAppTypeExecuteCB,
1152             GetAppTypePromiseCompleteCB,
1153             static_cast<void *>(appTypeCB),
1154             &appTypeCB->cbBase.asyncWork));
1155     NAPI_CALL(env, napi_queue_async_work(env, appTypeCB->cbBase.asyncWork));
1156     HILOG_INFO("%{public}s, promise end.", __func__);
1157     return promise;
1158 }
1159 
1160 /**
1161  * @brief GetAppType processing function.
1162  *
1163  * @param env The environment that the Node-API call is invoked under.
1164  * @param appTypeCB Process data asynchronously.
1165  *
1166  * @return Return JS data successfully, otherwise return nullptr.
1167  */
GetAppTypeWrap(napi_env env,napi_callback_info info,AppTypeCB * appTypeCB)1168 napi_value GetAppTypeWrap(napi_env env, napi_callback_info info, AppTypeCB *appTypeCB)
1169 {
1170     HILOG_INFO("%{public}s, asyncCallback.", __func__);
1171     if (appTypeCB == nullptr) {
1172         HILOG_ERROR("%{public}s, appTypeCB == nullptr.", __func__);
1173         return nullptr;
1174     }
1175 
1176     size_t argcAsync = 1;
1177     const size_t argcPromise = 0;
1178     const size_t argCountWithAsync = argcPromise + ARGS_ASYNC_COUNT;
1179     napi_value args[ARGS_MAX_COUNT] = {nullptr};
1180     napi_value ret = nullptr;
1181 
1182     NAPI_CALL(env, napi_get_cb_info(env, info, &argcAsync, args, nullptr, nullptr));
1183     if (argcAsync > argCountWithAsync || argcAsync > ARGS_MAX_COUNT) {
1184         HILOG_ERROR("%{public}s, Wrong argument count.", __func__);
1185         return nullptr;
1186     }
1187 
1188     if (argcAsync > argcPromise) {
1189         ret = GetAppTypeAsync(env, args, 0, appTypeCB);
1190     } else {
1191         ret = GetAppTypePromise(env, appTypeCB);
1192     }
1193     HILOG_INFO("%{public}s, asyncCallback end.", __func__);
1194     return ret;
1195 }
1196 
1197 /**
1198  * @brief Obtains the type of this application.
1199  *
1200  * @param env The environment that the Node-API call is invoked under.
1201  * @param info The callback info passed into the callback function.
1202  *
1203  * @return The return value from NAPI C++ to JS for the module.
1204  */
NAPI_GetAppTypeCommon(napi_env env,napi_callback_info info,AbilityType abilityType)1205 napi_value NAPI_GetAppTypeCommon(napi_env env, napi_callback_info info, AbilityType abilityType)
1206 {
1207     HILOG_INFO("%{public}s called.", __func__);
1208     AppTypeCB *appTypeCB = CreateAppTypeCBInfo(env);
1209     if (appTypeCB == nullptr) {
1210         return WrapVoidToJS(env);
1211     }
1212 
1213     appTypeCB->cbBase.errCode = NAPI_ERR_NO_ERROR;
1214     appTypeCB->cbBase.abilityType = abilityType;
1215     napi_value ret = GetAppTypeWrap(env, info, appTypeCB);
1216     if (ret == nullptr) {
1217         HILOG_ERROR("%{public}s, ret == nullptr.", __func__);
1218         if (appTypeCB != nullptr) {
1219             delete appTypeCB;
1220             appTypeCB = nullptr;
1221         }
1222         ret = WrapVoidToJS(env);
1223     }
1224     HILOG_INFO("%{public}s, end.", __func__);
1225     return ret;
1226 }
1227 
1228 #ifdef SUPPORT_GRAPHICS
GetDisplayOrientationWrap(napi_env env,napi_callback_info info,AsyncJSCallbackInfo * asyncCallbackInfo)1229 napi_value GetDisplayOrientationWrap(napi_env env, napi_callback_info info, AsyncJSCallbackInfo *asyncCallbackInfo)
1230 {
1231     HILOG_DEBUG("%{public}s called.", __func__);
1232     size_t argc = ARGS_MAX_COUNT;
1233     napi_value args[ARGS_MAX_COUNT] = {nullptr};
1234     napi_value jsthis = nullptr;
1235     void *data = nullptr;
1236 
1237     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &jsthis, &data));
1238 
1239     if (!UnwrapParamGetDisplayOrientationWrap(env, argc, args, asyncCallbackInfo)) {
1240         HILOG_INFO("%{public}s called. Invoke UnwrapParamGetDisplayOrientationWrap fail", __func__);
1241         return nullptr;
1242     }
1243 
1244     AsyncParamEx asyncParamEx;
1245     if (asyncCallbackInfo->cbInfo.callback != nullptr) {
1246         HILOG_INFO("%{public}s called. asyncCallback.", __func__);
1247         asyncParamEx.resource = "NAPI_GetDisplayOrientationWrapCallback";
1248         asyncParamEx.execute = GetDisplayOrientationExecuteCallback;
1249         asyncParamEx.complete = CompleteAsyncCallbackWork;
1250 
1251         return ExecuteAsyncCallbackWork(env, asyncCallbackInfo, &asyncParamEx);
1252     } else {
1253         HILOG_INFO("%{public}s called. promise.", __func__);
1254         asyncParamEx.resource = "NAPI_GetDisplayOrientationWrapPromise";
1255         asyncParamEx.execute = GetDisplayOrientationExecuteCallback;
1256         asyncParamEx.complete = CompletePromiseCallbackWork;
1257 
1258         return ExecutePromiseCallbackWork(env, asyncCallbackInfo, &asyncParamEx);
1259     }
1260 }
1261 
GetDisplayOrientationExecuteCallback(napi_env env,void * data)1262 void GetDisplayOrientationExecuteCallback(napi_env env, void *data)
1263 {
1264     HILOG_INFO("%{public}s called.", __func__);
1265     AsyncJSCallbackInfo *asyncCallbackInfo = static_cast<AsyncJSCallbackInfo *>(data);
1266     if (asyncCallbackInfo == nullptr) {
1267         HILOG_ERROR("%{public}s asyncCallbackInfo is null", __func__);
1268         return;
1269     }
1270 
1271     asyncCallbackInfo->error_code = NAPI_ERR_NO_ERROR;
1272     asyncCallbackInfo->native_data.data_type = NVT_NONE;
1273 
1274     if (asyncCallbackInfo->ability == nullptr) {
1275         HILOG_ERROR("%{public}s ability is null", __func__);
1276         asyncCallbackInfo->error_code = NAPI_ERR_ACE_ABILITY;
1277         return;
1278     }
1279 
1280     if (!CheckAbilityType(asyncCallbackInfo)) {
1281         HILOG_ERROR("%{public}s wrong ability type", __func__);
1282         asyncCallbackInfo->error_code = NAPI_ERR_ABILITY_TYPE_INVALID;
1283         asyncCallbackInfo->native_data.data_type = NVT_UNDEFINED;
1284         return;
1285     }
1286 
1287     asyncCallbackInfo->native_data.data_type = NVT_INT32;
1288     asyncCallbackInfo->native_data.int32_value = asyncCallbackInfo->ability->GetDisplayOrientation();
1289     HILOG_INFO("%{public}s end.", __func__);
1290 }
1291 
UnwrapParamGetDisplayOrientationWrap(napi_env env,size_t argc,napi_value * argv,AsyncJSCallbackInfo * asyncCallbackInfo)1292 bool UnwrapParamGetDisplayOrientationWrap(napi_env env, size_t argc, napi_value *argv,
1293     AsyncJSCallbackInfo *asyncCallbackInfo)
1294 {
1295     HILOG_INFO("%{public}s called, argc=%{public}zu", __func__, argc);
1296     const size_t argcMax = 1;
1297     if (argc > argcMax || argc < argcMax - 1) {
1298         HILOG_ERROR("%{public}s, Params is invalid.", __func__);
1299         return false;
1300     }
1301 
1302     if (argc == argcMax) {
1303         if (!CreateAsyncCallback(env, argv[PARAM0], asyncCallbackInfo)) {
1304             HILOG_INFO("%{public}s, the first parameter is invalid.", __func__);
1305             return false;
1306         }
1307     }
1308 
1309     return true;
1310 }
1311 
NAPI_GetDisplayOrientationCommon(napi_env env,napi_callback_info info,AbilityType abilityType)1312 napi_value NAPI_GetDisplayOrientationCommon(napi_env env, napi_callback_info info, AbilityType abilityType)
1313 {
1314     HILOG_DEBUG("%{public}s called.", __func__);
1315     AsyncJSCallbackInfo *asyncCallbackInfo = CreateAsyncJSCallbackInfo(env);
1316     if (asyncCallbackInfo == nullptr) {
1317         HILOG_ERROR("%{public}s. Invoke CreateAsyncJSCallbackInfo failed.", __func__);
1318         return WrapVoidToJS(env);
1319     }
1320 
1321     asyncCallbackInfo->error_code = NAPI_ERR_NO_ERROR;
1322     asyncCallbackInfo->abilityType = abilityType;
1323     napi_value ret = GetDisplayOrientationWrap(env, info, asyncCallbackInfo);
1324     if (ret == nullptr) {
1325         HILOG_ERROR("%{public}s, ret == nullptr.", __func__);
1326         FreeAsyncJSCallbackInfo(&asyncCallbackInfo);
1327         ret = WrapVoidToJS(env);
1328     }
1329     HILOG_DEBUG("%{public}s, end.", __func__);
1330     return ret;
1331 }
1332 #endif
1333 
1334 /**
1335  * @brief Create asynchronous data.
1336  *
1337  * @param env The environment that the Node-API call is invoked under.
1338  *
1339  * @return Return a pointer to AbilityInfoCB on success, nullptr on failure.
1340  */
CreateAbilityInfoCBInfo(napi_env env)1341 AbilityInfoCB *CreateAbilityInfoCBInfo(napi_env env)
1342 {
1343     HILOG_INFO("%{public}s called.", __func__);
1344     napi_value global = nullptr;
1345     NAPI_CALL(env, napi_get_global(env, &global));
1346 
1347     napi_value abilityObj = nullptr;
1348     NAPI_CALL(env, napi_get_named_property(env, global, "ability", &abilityObj));
1349 
1350     Ability *ability = nullptr;
1351     NAPI_CALL(env, napi_get_value_external(env, abilityObj, reinterpret_cast<void **>(&ability)));
1352 
1353     AbilityInfoCB *abilityInfoCB = new (std::nothrow) AbilityInfoCB;
1354     if (abilityInfoCB == nullptr) {
1355         HILOG_ERROR("%{public}s, abilityInfoCB == nullptr.", __func__);
1356         return nullptr;
1357     }
1358     abilityInfoCB->cbBase.cbInfo.env = env;
1359     abilityInfoCB->cbBase.asyncWork = nullptr;
1360     abilityInfoCB->cbBase.deferred = nullptr;
1361     abilityInfoCB->cbBase.ability = ability;
1362 
1363     HILOG_INFO("%{public}s end.", __func__);
1364     return abilityInfoCB;
1365 }
1366 
WrapAbilityInfo(napi_env env,const AbilityInfo & abilityInfo)1367 napi_value WrapAbilityInfo(napi_env env, const AbilityInfo &abilityInfo)
1368 {
1369     HILOG_INFO("%{public}s called.", __func__);
1370     napi_value result = nullptr;
1371     napi_value proValue = nullptr;
1372     NAPI_CALL(env, napi_create_object(env, &result));
1373     NAPI_CALL(env, napi_create_string_utf8(env, abilityInfo.bundleName.c_str(), NAPI_AUTO_LENGTH, &proValue));
1374     NAPI_CALL(env, napi_set_named_property(env, result, "bundleName", proValue));
1375 
1376     NAPI_CALL(env, napi_create_string_utf8(env, abilityInfo.name.c_str(), NAPI_AUTO_LENGTH, &proValue));
1377     NAPI_CALL(env, napi_set_named_property(env, result, "name", proValue));
1378 
1379     NAPI_CALL(env, napi_create_string_utf8(env, abilityInfo.label.c_str(), NAPI_AUTO_LENGTH, &proValue));
1380     NAPI_CALL(env, napi_set_named_property(env, result, "label", proValue));
1381 
1382     NAPI_CALL(env, napi_create_string_utf8(env, abilityInfo.description.c_str(), NAPI_AUTO_LENGTH, &proValue));
1383     NAPI_CALL(env, napi_set_named_property(env, result, "description", proValue));
1384 
1385     NAPI_CALL(env, napi_create_string_utf8(env, abilityInfo.iconPath.c_str(), NAPI_AUTO_LENGTH, &proValue));
1386     NAPI_CALL(env, napi_set_named_property(env, result, "icon", proValue));
1387 
1388     NAPI_CALL(env, napi_create_string_utf8(env, abilityInfo.moduleName.c_str(), NAPI_AUTO_LENGTH, &proValue));
1389     NAPI_CALL(env, napi_set_named_property(env, result, "moduleName", proValue));
1390 
1391     NAPI_CALL(env, napi_create_string_utf8(env, abilityInfo.process.c_str(), NAPI_AUTO_LENGTH, &proValue));
1392     NAPI_CALL(env, napi_set_named_property(env, result, "process", proValue));
1393 
1394     NAPI_CALL(env, napi_create_int32(env, static_cast<int32_t>(abilityInfo.type), &proValue));
1395     NAPI_CALL(env, napi_set_named_property(env, result, "type", proValue));
1396 
1397     NAPI_CALL(env, napi_create_int32(env, static_cast<int32_t>(abilityInfo.orientation), &proValue));
1398     NAPI_CALL(env, napi_set_named_property(env, result, "orientation", proValue));
1399 
1400     NAPI_CALL(env, napi_create_int32(env, static_cast<int32_t>(abilityInfo.launchMode), &proValue));
1401     NAPI_CALL(env, napi_set_named_property(env, result, "launchMode", proValue));
1402 
1403     NAPI_CALL(env, napi_create_string_utf8(env, abilityInfo.uri.c_str(), NAPI_AUTO_LENGTH, &proValue));
1404     NAPI_CALL(env, napi_set_named_property(env, result, "uri", proValue));
1405 
1406     NAPI_CALL(env, napi_create_string_utf8(env, abilityInfo.readPermission.c_str(), NAPI_AUTO_LENGTH, &proValue));
1407     NAPI_CALL(env, napi_set_named_property(env, result, "readPermission", proValue));
1408 
1409     NAPI_CALL(env, napi_create_string_utf8(env, abilityInfo.writePermission.c_str(), NAPI_AUTO_LENGTH, &proValue));
1410     NAPI_CALL(env, napi_set_named_property(env, result, "writePermission", proValue));
1411 
1412     NAPI_CALL(env, napi_create_string_utf8(env, abilityInfo.targetAbility.c_str(), NAPI_AUTO_LENGTH, &proValue));
1413     NAPI_CALL(env, napi_set_named_property(env, result, "targetAbility", proValue));
1414 
1415     NAPI_CALL(env, napi_create_int32(env, abilityInfo.labelId, &proValue));
1416     NAPI_CALL(env, napi_set_named_property(env, result, "labelId", proValue));
1417 
1418     NAPI_CALL(env, napi_create_int32(env, abilityInfo.descriptionId, &proValue));
1419     NAPI_CALL(env, napi_set_named_property(env, result, "descriptionId", proValue));
1420 
1421     NAPI_CALL(env, napi_create_int32(env, abilityInfo.iconId, &proValue));
1422     NAPI_CALL(env, napi_set_named_property(env, result, "iconId", proValue));
1423 
1424     NAPI_CALL(env, napi_create_int32(env, abilityInfo.formEntity, &proValue));
1425     NAPI_CALL(env, napi_set_named_property(env, result, "formEntity", proValue));
1426 
1427     NAPI_CALL(env, napi_create_int32(env, abilityInfo.minFormHeight, &proValue));
1428     NAPI_CALL(env, napi_set_named_property(env, result, "minFormHeight", proValue));
1429 
1430     NAPI_CALL(env, napi_create_int32(env, abilityInfo.defaultFormHeight, &proValue));
1431     NAPI_CALL(env, napi_set_named_property(env, result, "defaultFormHeight", proValue));
1432 
1433     NAPI_CALL(env, napi_create_int32(env, abilityInfo.minFormWidth, &proValue));
1434     NAPI_CALL(env, napi_set_named_property(env, result, "minFormWidth", proValue));
1435 
1436     NAPI_CALL(env, napi_create_int32(env, abilityInfo.defaultFormWidth, &proValue));
1437     NAPI_CALL(env, napi_set_named_property(env, result, "defaultFormWidth", proValue));
1438 
1439     NAPI_CALL(env, napi_create_int32(env, abilityInfo.backgroundModes, &proValue));
1440     NAPI_CALL(env, napi_set_named_property(env, result, "backgroundModes", proValue));
1441 
1442     NAPI_CALL(env, napi_create_int32(env, static_cast<int32_t>(abilityInfo.subType), &proValue));
1443     NAPI_CALL(env, napi_set_named_property(env, result, "subType", proValue));
1444 
1445     NAPI_CALL(env, napi_get_boolean(env, abilityInfo.visible, &proValue));
1446     NAPI_CALL(env, napi_set_named_property(env, result, "isVisible", proValue));
1447 
1448     NAPI_CALL(env, napi_get_boolean(env, abilityInfo.formEnabled, &proValue));
1449     NAPI_CALL(env, napi_set_named_property(env, result, "formEnabled", proValue));
1450 
1451     (void)WrapProperties(env, abilityInfo.permissions, "permissions", result);
1452     (void)WrapProperties(env, abilityInfo.deviceCapabilities, "deviceCapabilities", result);
1453     (void)WrapProperties(env, abilityInfo.deviceTypes, "deviceTypes", result);
1454 
1455     napi_value applicationInfo = nullptr;
1456     applicationInfo = WrapAppInfo(env, abilityInfo.applicationInfo);
1457     NAPI_CALL(env, napi_set_named_property(env, result, "applicationInfo", applicationInfo));
1458     HILOG_INFO("%{public}s end.", __func__);
1459     return result;
1460 }
1461 
WrapProperties(napi_env env,const std::vector<std::string> properties,const std::string & proName,napi_value & result)1462 napi_value WrapProperties(napi_env env, const std::vector<std::string> properties, const std::string &proName,
1463     napi_value &result)
1464 {
1465     napi_value jsArrayProperties = nullptr;
1466     NAPI_CALL(env, napi_create_array(env, &jsArrayProperties));
1467     napi_value proValue = nullptr;
1468     for (size_t i = 0; i < properties.size(); i++) {
1469         NAPI_CALL(
1470             env, napi_create_string_utf8(env, properties.at(i).c_str(), NAPI_AUTO_LENGTH, &proValue));
1471         NAPI_CALL(env, napi_set_element(env, jsArrayProperties, i, proValue));
1472     }
1473     NAPI_CALL(env, napi_set_named_property(env, result, proName.c_str(), jsArrayProperties));
1474     return result;
1475 }
1476 
WrapModuleInfos(napi_env env,const ApplicationInfo & appInfo,napi_value & result)1477 napi_value WrapModuleInfos(napi_env env, const ApplicationInfo &appInfo, napi_value &result)
1478 {
1479     napi_value jsArrayModuleInfo = nullptr;
1480     napi_value jsModuleInfoObject = nullptr;
1481     napi_value proValue = nullptr;
1482     NAPI_CALL(env, napi_create_array(env, &jsArrayModuleInfo));
1483     for (size_t i = 0; i < appInfo.moduleInfos.size(); i++) {
1484         NAPI_CALL(env, napi_create_object(env, &jsModuleInfoObject));
1485         proValue = nullptr;
1486         NAPI_CALL(env,
1487             napi_create_string_utf8(env, appInfo.moduleInfos.at(i).moduleName.c_str(), NAPI_AUTO_LENGTH, &proValue));
1488         NAPI_CALL(env, napi_set_named_property(env, jsModuleInfoObject, "moduleName", proValue));
1489 
1490         NAPI_CALL(env,
1491             napi_create_string_utf8(
1492                 env, appInfo.moduleInfos.at(i).moduleSourceDir.c_str(), NAPI_AUTO_LENGTH, &proValue));
1493         NAPI_CALL(env, napi_set_named_property(env, jsModuleInfoObject, "moduleSourceDir", proValue));
1494         NAPI_CALL(env, napi_set_element(env, jsArrayModuleInfo, i, jsModuleInfoObject));
1495     }
1496     NAPI_CALL(env, napi_set_named_property(env, result, "moduleInfos", jsArrayModuleInfo));
1497     return nullptr;
1498 }
1499 
ConvertAbilityInfo(napi_env env,const AbilityInfo & abilityInfo)1500 napi_value ConvertAbilityInfo(napi_env env, const AbilityInfo &abilityInfo)
1501 {
1502     return WrapAbilityInfo(env, abilityInfo);
1503 }
1504 
1505 /**
1506  * @brief GetAbilityInfo asynchronous processing function.
1507  *
1508  * @param env The environment that the Node-API call is invoked under.
1509  * @param data Point to asynchronous processing of data.
1510  */
GetAbilityInfoExecuteCB(napi_env env,void * data)1511 void GetAbilityInfoExecuteCB(napi_env env, void *data)
1512 {
1513     HILOG_INFO("NAPI_GetApplicationInfo, worker pool thread execute.");
1514     AbilityInfoCB *abilityInfoCB = static_cast<AbilityInfoCB *>(data);
1515     if (abilityInfoCB == nullptr) {
1516         HILOG_ERROR("NAPI_GetApplicationInfo, abilityInfoCB == nullptr");
1517         return;
1518     }
1519 
1520     abilityInfoCB->cbBase.errCode = NAPI_ERR_NO_ERROR;
1521     if (abilityInfoCB->cbBase.ability == nullptr) {
1522         HILOG_ERROR("NAPI_GetApplicationInfo, ability == nullptr");
1523         abilityInfoCB->cbBase.errCode = NAPI_ERR_ACE_ABILITY;
1524         return;
1525     }
1526 
1527     if (!CheckAbilityType(&abilityInfoCB->cbBase)) {
1528         HILOG_ERROR("NAPI_GetApplicationInfo,wrong ability type");
1529         abilityInfoCB->cbBase.errCode = NAPI_ERR_ABILITY_TYPE_INVALID;
1530         return;
1531     }
1532 
1533     std::shared_ptr<AbilityInfo> abilityInfoPtr = abilityInfoCB->cbBase.ability->GetAbilityInfo();
1534     if (abilityInfoPtr != nullptr) {
1535         abilityInfoCB->abilityInfo = *abilityInfoPtr;
1536     } else {
1537         abilityInfoCB->cbBase.errCode = NAPI_ERR_ABILITY_CALL_INVALID;
1538     }
1539     HILOG_INFO("NAPI_GetApplicationInfo, worker pool thread execute end.");
1540 }
1541 
1542 /**
1543  * @brief The callback at the end of the asynchronous callback.
1544  *
1545  * @param env The environment that the Node-API call is invoked under.
1546  * @param data Point to asynchronous processing of data.
1547  */
GetAbilityInfoAsyncCompleteCB(napi_env env,napi_status status,void * data)1548 void GetAbilityInfoAsyncCompleteCB(napi_env env, napi_status status, void *data)
1549 {
1550     HILOG_INFO("NAPI_GetApplicationInfo, main event thread complete.");
1551     AbilityInfoCB *abilityInfoCB = static_cast<AbilityInfoCB *>(data);
1552     napi_value callback = nullptr;
1553     napi_value undefined = nullptr;
1554     napi_value result[ARGS_TWO] = {nullptr};
1555     napi_value callResult = nullptr;
1556     NAPI_CALL_RETURN_VOID(env, napi_get_undefined(env, &undefined));
1557     result[PARAM0] = GetCallbackErrorValue(env, abilityInfoCB->cbBase.errCode);
1558     if (abilityInfoCB->cbBase.errCode == NAPI_ERR_NO_ERROR) {
1559         result[PARAM1] = WrapAbilityInfo(env, abilityInfoCB->abilityInfo);
1560     } else {
1561         result[PARAM1] = WrapUndefinedToJS(env);
1562     }
1563     NAPI_CALL_RETURN_VOID(env, napi_get_reference_value(env, abilityInfoCB->cbBase.cbInfo.callback, &callback));
1564     NAPI_CALL_RETURN_VOID(env, napi_call_function(env, undefined, callback, ARGS_TWO, &result[PARAM0], &callResult));
1565 
1566     if (abilityInfoCB->cbBase.cbInfo.callback != nullptr) {
1567         NAPI_CALL_RETURN_VOID(env, napi_delete_reference(env, abilityInfoCB->cbBase.cbInfo.callback));
1568     }
1569     NAPI_CALL_RETURN_VOID(env, napi_delete_async_work(env, abilityInfoCB->cbBase.asyncWork));
1570     delete abilityInfoCB;
1571     abilityInfoCB = nullptr;
1572     HILOG_INFO("NAPI_GetApplicationInfo, main event thread complete end.");
1573 }
1574 
1575 /**
1576  * @brief The callback at the end of the Promise callback.
1577  *
1578  * @param env The environment that the Node-API call is invoked under.
1579  * @param data Point to asynchronous processing of data.
1580  */
GetAbilityInfoPromiseCompleteCB(napi_env env,napi_status status,void * data)1581 void GetAbilityInfoPromiseCompleteCB(napi_env env, napi_status status, void *data)
1582 {
1583     HILOG_INFO("NAPI_GetApplicationInfo, main event thread complete.");
1584     AbilityInfoCB *abilityInfoCB = static_cast<AbilityInfoCB *>(data);
1585     napi_value result = nullptr;
1586     if (abilityInfoCB->cbBase.errCode == NAPI_ERR_NO_ERROR) {
1587         result = WrapAbilityInfo(env, abilityInfoCB->abilityInfo);
1588         napi_resolve_deferred(env, abilityInfoCB->cbBase.deferred, result);
1589     } else {
1590         result = GetCallbackErrorValue(env, abilityInfoCB->cbBase.errCode);
1591         napi_reject_deferred(env, abilityInfoCB->cbBase.deferred, result);
1592     }
1593 
1594     napi_delete_async_work(env, abilityInfoCB->cbBase.asyncWork);
1595     delete abilityInfoCB;
1596     abilityInfoCB = nullptr;
1597     HILOG_INFO("NAPI_GetApplicationInfo, main event thread complete end.");
1598 }
1599 
1600 /**
1601  * @brief GetAbilityInfo Async.
1602  *
1603  * @param env The environment that the Node-API call is invoked under.
1604  * @param args Indicates the arguments passed into the callback.
1605  * @param argcPromise Asynchronous data processing.
1606  * @param abilityInfoCB Process data asynchronously.
1607  *
1608  * @return Return JS data successfully, otherwise return nullptr.
1609  */
GetAbilityInfoAsync(napi_env env,napi_value * args,const size_t argCallback,AbilityInfoCB * abilityInfoCB)1610 napi_value GetAbilityInfoAsync(napi_env env, napi_value *args, const size_t argCallback, AbilityInfoCB *abilityInfoCB)
1611 {
1612     HILOG_INFO("%{public}s, asyncCallback.", __func__);
1613     if (args == nullptr || abilityInfoCB == nullptr) {
1614         HILOG_ERROR("%{public}s, param == nullptr.", __func__);
1615         return nullptr;
1616     }
1617     napi_value resourceName = nullptr;
1618     NAPI_CALL(env, napi_create_string_latin1(env, __func__, NAPI_AUTO_LENGTH, &resourceName));
1619 
1620     napi_valuetype valuetype = napi_undefined;
1621     NAPI_CALL(env, napi_typeof(env, args[argCallback], &valuetype));
1622     if (valuetype == napi_function) {
1623         NAPI_CALL(env, napi_create_reference(env, args[argCallback], 1, &abilityInfoCB->cbBase.cbInfo.callback));
1624     }
1625     NAPI_CALL(env,
1626         napi_create_async_work(env,
1627             nullptr,
1628             resourceName,
1629             GetAbilityInfoExecuteCB,
1630             GetAbilityInfoAsyncCompleteCB,
1631             static_cast<void *>(abilityInfoCB),
1632             &abilityInfoCB->cbBase.asyncWork));
1633     NAPI_CALL(env, napi_queue_async_work(env, abilityInfoCB->cbBase.asyncWork));
1634     napi_value result = nullptr;
1635     NAPI_CALL(env, napi_get_null(env, &result));
1636     HILOG_INFO("%{public}s, asyncCallback end.", __func__);
1637     return result;
1638 }
1639 
1640 /**
1641  * @brief GetAbilityInfo Promise.
1642  *
1643  * @param env The environment that the Node-API call is invoked under.
1644  * @param abilityInfoCB Process data asynchronously.
1645  *
1646  * @return Return JS data successfully, otherwise return nullptr.
1647  */
GetAbilityInfoPromise(napi_env env,AbilityInfoCB * abilityInfoCB)1648 napi_value GetAbilityInfoPromise(napi_env env, AbilityInfoCB *abilityInfoCB)
1649 {
1650     HILOG_INFO("%{public}s, promise.", __func__);
1651     if (abilityInfoCB == nullptr) {
1652         HILOG_ERROR("%{public}s, param == nullptr.", __func__);
1653         return nullptr;
1654     }
1655     napi_value resourceName = nullptr;
1656     NAPI_CALL(env, napi_create_string_latin1(env, __func__, NAPI_AUTO_LENGTH, &resourceName));
1657     napi_deferred deferred;
1658     napi_value promise = nullptr;
1659     NAPI_CALL(env, napi_create_promise(env, &deferred, &promise));
1660     abilityInfoCB->cbBase.deferred = deferred;
1661 
1662     NAPI_CALL(env,
1663         napi_create_async_work(env,
1664             nullptr,
1665             resourceName,
1666             GetAbilityInfoExecuteCB,
1667             GetAbilityInfoPromiseCompleteCB,
1668             static_cast<void *>(abilityInfoCB),
1669             &abilityInfoCB->cbBase.asyncWork));
1670     NAPI_CALL(env, napi_queue_async_work(env, abilityInfoCB->cbBase.asyncWork));
1671     HILOG_INFO("%{public}s, promise end.", __func__);
1672     return promise;
1673 }
1674 
1675 /**
1676  * @brief GetAbilityInfo processing function.
1677  *
1678  * @param env The environment that the Node-API call is invoked under.
1679  * @param abilityInfoCB Process data asynchronously.
1680  *
1681  * @return Return JS data successfully, otherwise return nullptr.
1682  */
GetAbilityInfoWrap(napi_env env,napi_callback_info info,AbilityInfoCB * abilityInfoCB)1683 napi_value GetAbilityInfoWrap(napi_env env, napi_callback_info info, AbilityInfoCB *abilityInfoCB)
1684 {
1685     HILOG_INFO("%{public}s, asyncCallback.", __func__);
1686     if (abilityInfoCB == nullptr) {
1687         HILOG_ERROR("%{public}s, abilityInfoCB == nullptr.", __func__);
1688         return nullptr;
1689     }
1690 
1691     size_t argcAsync = 1;
1692     const size_t argcPromise = 0;
1693     const size_t argCountWithAsync = argcPromise + ARGS_ASYNC_COUNT;
1694     napi_value args[ARGS_MAX_COUNT] = {nullptr};
1695     napi_value ret = nullptr;
1696 
1697     NAPI_CALL(env, napi_get_cb_info(env, info, &argcAsync, args, nullptr, nullptr));
1698     if (argcAsync > argCountWithAsync || argcAsync > ARGS_MAX_COUNT) {
1699         HILOG_ERROR("%{public}s, Wrong argument count.", __func__);
1700         return nullptr;
1701     }
1702 
1703     if (argcAsync > argcPromise) {
1704         ret = GetAbilityInfoAsync(env, args, 0, abilityInfoCB);
1705     } else {
1706         ret = GetAbilityInfoPromise(env, abilityInfoCB);
1707     }
1708     HILOG_INFO("%{public}s, asyncCallback end.", __func__);
1709     return ret;
1710 }
1711 
1712 /**
1713  * @brief Obtains information about the current ability.
1714  *
1715  * @param env The environment that the Node-API call is invoked under.
1716  * @param info The callback info passed into the callback function.
1717  *
1718  * @return The return value from NAPI C++ to JS for the module.
1719  */
NAPI_GetAbilityInfoCommon(napi_env env,napi_callback_info info,AbilityType abilityType)1720 napi_value NAPI_GetAbilityInfoCommon(napi_env env, napi_callback_info info, AbilityType abilityType)
1721 {
1722     HILOG_INFO("%{public}s called.", __func__);
1723     AbilityInfoCB *abilityInfoCB = CreateAbilityInfoCBInfo(env);
1724     if (abilityInfoCB == nullptr) {
1725         return WrapVoidToJS(env);
1726     }
1727 
1728     abilityInfoCB->cbBase.errCode = NAPI_ERR_NO_ERROR;
1729     abilityInfoCB->cbBase.abilityType = abilityType;
1730     napi_value ret = GetAbilityInfoWrap(env, info, abilityInfoCB);
1731     if (ret == nullptr) {
1732         HILOG_ERROR("%{public}s ret == nullptr", __func__);
1733         if (abilityInfoCB != nullptr) {
1734             delete abilityInfoCB;
1735             abilityInfoCB = nullptr;
1736         }
1737         ret = WrapVoidToJS(env);
1738     }
1739     HILOG_INFO("%{public}s end.", __func__);
1740     return ret;
1741 }
1742 
1743 /**
1744  * @brief Create asynchronous data.
1745  *
1746  * @param env The environment that the Node-API call is invoked under.
1747  *
1748  * @return Return a pointer to HapModuleInfoCB on success, nullptr on failure.
1749  */
CreateHapModuleInfoCBInfo(napi_env env)1750 HapModuleInfoCB *CreateHapModuleInfoCBInfo(napi_env env)
1751 {
1752     HILOG_INFO("%{public}s called.", __func__);
1753     napi_value global = nullptr;
1754     NAPI_CALL(env, napi_get_global(env, &global));
1755 
1756     napi_value abilityObj = nullptr;
1757     NAPI_CALL(env, napi_get_named_property(env, global, "ability", &abilityObj));
1758 
1759     Ability *ability = nullptr;
1760     NAPI_CALL(env, napi_get_value_external(env, abilityObj, reinterpret_cast<void **>(&ability)));
1761 
1762     HapModuleInfoCB *hapModuleInfoCB = new (std::nothrow) HapModuleInfoCB;
1763     if (hapModuleInfoCB == nullptr) {
1764         HILOG_ERROR("%{public}s, hapModuleInfoCB == nullptr.", __func__);
1765         return nullptr;
1766     }
1767     hapModuleInfoCB->cbBase.cbInfo.env = env;
1768     hapModuleInfoCB->cbBase.asyncWork = nullptr;
1769     hapModuleInfoCB->cbBase.deferred = nullptr;
1770     hapModuleInfoCB->cbBase.ability = ability;
1771 
1772     HILOG_INFO("%{public}s end.", __func__);
1773     return hapModuleInfoCB;
1774 }
1775 
WrapHapModuleInfo(napi_env env,const HapModuleInfoCB & hapModuleInfoCB)1776 napi_value WrapHapModuleInfo(napi_env env, const HapModuleInfoCB &hapModuleInfoCB)
1777 {
1778     HILOG_INFO("%{public}s called.", __func__);
1779     napi_value result = nullptr;
1780     napi_value proValue = nullptr;
1781     NAPI_CALL(env, napi_create_object(env, &result));
1782     NAPI_CALL(
1783         env, napi_create_string_utf8(env, hapModuleInfoCB.hapModuleInfo.name.c_str(), NAPI_AUTO_LENGTH, &proValue));
1784     NAPI_CALL(env, napi_set_named_property(env, result, "name", proValue));
1785 
1786     NAPI_CALL(env,
1787         napi_create_string_utf8(env, hapModuleInfoCB.hapModuleInfo.description.c_str(), NAPI_AUTO_LENGTH, &proValue));
1788     NAPI_CALL(env, napi_set_named_property(env, result, "description", proValue));
1789 
1790     NAPI_CALL(
1791         env, napi_create_string_utf8(env, hapModuleInfoCB.hapModuleInfo.iconPath.c_str(), NAPI_AUTO_LENGTH, &proValue));
1792     NAPI_CALL(env, napi_set_named_property(env, result, "icon", proValue));
1793 
1794     NAPI_CALL(
1795         env, napi_create_string_utf8(env, hapModuleInfoCB.hapModuleInfo.label.c_str(), NAPI_AUTO_LENGTH, &proValue));
1796     NAPI_CALL(env, napi_set_named_property(env, result, "label", proValue));
1797 
1798     NAPI_CALL(env,
1799         napi_create_string_utf8(env, hapModuleInfoCB.hapModuleInfo.backgroundImg.c_str(), NAPI_AUTO_LENGTH, &proValue));
1800     NAPI_CALL(env, napi_set_named_property(env, result, "backgroundImg", proValue));
1801 
1802     NAPI_CALL(env,
1803         napi_create_string_utf8(env, hapModuleInfoCB.hapModuleInfo.moduleName.c_str(), NAPI_AUTO_LENGTH, &proValue));
1804     NAPI_CALL(env, napi_set_named_property(env, result, "moduleName", proValue));
1805 
1806     NAPI_CALL(env, napi_create_int32(env, hapModuleInfoCB.hapModuleInfo.supportedModes, &proValue));
1807     NAPI_CALL(env, napi_set_named_property(env, result, "supportedModes", proValue));
1808 
1809     NAPI_CALL(env, napi_create_int32(env, hapModuleInfoCB.hapModuleInfo.descriptionId, &proValue));
1810     NAPI_CALL(env, napi_set_named_property(env, result, "descriptionId", proValue));
1811 
1812     NAPI_CALL(env, napi_create_int32(env, hapModuleInfoCB.hapModuleInfo.labelId, &proValue));
1813     NAPI_CALL(env, napi_set_named_property(env, result, "labelId", proValue));
1814 
1815     NAPI_CALL(env, napi_create_int32(env, hapModuleInfoCB.hapModuleInfo.iconId, &proValue));
1816     NAPI_CALL(env, napi_set_named_property(env, result, "iconId", proValue));
1817 
1818     NAPI_CALL(env,
1819         napi_create_string_utf8(
1820             env, hapModuleInfoCB.hapModuleInfo.mainAbility.c_str(), NAPI_AUTO_LENGTH, &proValue));
1821     NAPI_CALL(env, napi_set_named_property(env, result, "mainAbilityName", proValue));
1822 
1823     NAPI_CALL(env, napi_get_boolean(env, hapModuleInfoCB.hapModuleInfo.installationFree, &proValue));
1824     NAPI_CALL(env, napi_set_named_property(env, result, "installationFree", proValue));
1825 
1826     napi_value jsArrayreqCapabilities = nullptr;
1827     NAPI_CALL(env, napi_create_array(env, &jsArrayreqCapabilities));
1828     for (size_t i = 0; i < hapModuleInfoCB.hapModuleInfo.reqCapabilities.size(); i++) {
1829         proValue = nullptr;
1830         NAPI_CALL(env,
1831             napi_create_string_utf8(
1832                 env, hapModuleInfoCB.hapModuleInfo.reqCapabilities.at(i).c_str(), NAPI_AUTO_LENGTH, &proValue));
1833         NAPI_CALL(env, napi_set_element(env, jsArrayreqCapabilities, i, proValue));
1834     }
1835     NAPI_CALL(env, napi_set_named_property(env, result, "reqCapabilities", jsArrayreqCapabilities));
1836 
1837     napi_value jsArraydeviceTypes = nullptr;
1838     NAPI_CALL(env, napi_create_array(env, &jsArraydeviceTypes));
1839     for (size_t i = 0; i < hapModuleInfoCB.hapModuleInfo.deviceTypes.size(); i++) {
1840         proValue = nullptr;
1841         NAPI_CALL(env,
1842             napi_create_string_utf8(
1843                 env, hapModuleInfoCB.hapModuleInfo.deviceTypes.at(i).c_str(), NAPI_AUTO_LENGTH, &proValue));
1844         NAPI_CALL(env, napi_set_element(env, jsArraydeviceTypes, i, proValue));
1845     }
1846     NAPI_CALL(env, napi_set_named_property(env, result, "deviceTypes", jsArraydeviceTypes));
1847 
1848     napi_value abilityInfos = nullptr;
1849     NAPI_CALL(env, napi_create_array(env, &abilityInfos));
1850     for (size_t i = 0; i < hapModuleInfoCB.hapModuleInfo.abilityInfos.size(); i++) {
1851         napi_value abilityInfo = nullptr;
1852         abilityInfo = WrapAbilityInfo(env, hapModuleInfoCB.hapModuleInfo.abilityInfos.at(i));
1853         NAPI_CALL(env, napi_set_element(env, abilityInfos, i, abilityInfo));
1854     }
1855     NAPI_CALL(env, napi_set_named_property(env, result, "abilityInfo", abilityInfos));
1856     HILOG_INFO("%{public}s end.", __func__);
1857     return result;
1858 }
1859 
GetHapModuleInfoExecuteCB(napi_env env,void * data)1860 void GetHapModuleInfoExecuteCB(napi_env env, void *data)
1861 {
1862     HILOG_INFO("NAPI_GetHapModuleInfo, worker pool thread execute.");
1863     HapModuleInfoCB *hapModuleInfoCB = static_cast<HapModuleInfoCB *>(data);
1864     if (hapModuleInfoCB == nullptr) {
1865         HILOG_ERROR("NAPI_GetHapModuleInfo, hapModuleInfoCB == nullptr");
1866         return;
1867     }
1868 
1869     hapModuleInfoCB->cbBase.errCode = NAPI_ERR_NO_ERROR;
1870     if (hapModuleInfoCB->cbBase.ability == nullptr) {
1871         HILOG_ERROR("NAPI_GetHapModuleInfo, ability == nullptr");
1872         hapModuleInfoCB->cbBase.errCode = NAPI_ERR_ACE_ABILITY;
1873         return;
1874     }
1875 
1876     if (!CheckAbilityType(&hapModuleInfoCB->cbBase)) {
1877         HILOG_ERROR("NAPI_GetHapModuleInfo,wrong ability type");
1878         hapModuleInfoCB->cbBase.errCode = NAPI_ERR_ABILITY_TYPE_INVALID;
1879         return;
1880     }
1881 
1882     std::shared_ptr<HapModuleInfo> hapModuleInfoPtr = hapModuleInfoCB->cbBase.ability->GetHapModuleInfo();
1883     if (hapModuleInfoPtr != nullptr) {
1884         hapModuleInfoCB->hapModuleInfo = *hapModuleInfoPtr;
1885     } else {
1886         hapModuleInfoCB->cbBase.errCode = NAPI_ERR_ABILITY_CALL_INVALID;
1887     }
1888     HILOG_INFO("NAPI_GetHapModuleInfo, worker pool thread execute end.");
1889 }
1890 
GetHapModuleInfoAsyncCompleteCB(napi_env env,napi_status status,void * data)1891 void GetHapModuleInfoAsyncCompleteCB(napi_env env, napi_status status, void *data)
1892 {
1893     HILOG_INFO("NAPI_GetHapModuleInfo, main event thread complete.");
1894     HapModuleInfoCB *hapModuleInfoCB = static_cast<HapModuleInfoCB *>(data);
1895     napi_value callback = nullptr;
1896     napi_value undefined = nullptr;
1897     napi_value result[ARGS_TWO] = {nullptr};
1898     napi_value callResult = nullptr;
1899     NAPI_CALL_RETURN_VOID(env, napi_get_undefined(env, &undefined));
1900     result[PARAM0] = GetCallbackErrorValue(env, hapModuleInfoCB->cbBase.errCode);
1901     if (hapModuleInfoCB->cbBase.errCode == NAPI_ERR_NO_ERROR) {
1902         result[PARAM1] = WrapHapModuleInfo(env, *hapModuleInfoCB);
1903     } else {
1904         result[PARAM1] = WrapUndefinedToJS(env);
1905     }
1906     NAPI_CALL_RETURN_VOID(env, napi_get_reference_value(env, hapModuleInfoCB->cbBase.cbInfo.callback, &callback));
1907     NAPI_CALL_RETURN_VOID(env, napi_call_function(env, undefined, callback, ARGS_TWO, &result[PARAM0], &callResult));
1908 
1909     if (hapModuleInfoCB->cbBase.cbInfo.callback != nullptr) {
1910         NAPI_CALL_RETURN_VOID(env, napi_delete_reference(env, hapModuleInfoCB->cbBase.cbInfo.callback));
1911     }
1912     NAPI_CALL_RETURN_VOID(env, napi_delete_async_work(env, hapModuleInfoCB->cbBase.asyncWork));
1913     delete hapModuleInfoCB;
1914     hapModuleInfoCB = nullptr;
1915     HILOG_INFO("NAPI_GetHapModuleInfo, main event thread complete end.");
1916 }
1917 
GetHapModuleInfoPromiseCompleteCB(napi_env env,napi_status status,void * data)1918 void GetHapModuleInfoPromiseCompleteCB(napi_env env, napi_status status, void *data)
1919 {
1920     HILOG_INFO("NAPI_GetHapModuleInfo, main event thread complete.");
1921     HapModuleInfoCB *hapModuleInfoCB = static_cast<HapModuleInfoCB *>(data);
1922     napi_value result = nullptr;
1923     if (hapModuleInfoCB->cbBase.errCode == NAPI_ERR_NO_ERROR) {
1924         result = WrapHapModuleInfo(env, *hapModuleInfoCB);
1925         napi_resolve_deferred(env, hapModuleInfoCB->cbBase.deferred, result);
1926     } else {
1927         result = GetCallbackErrorValue(env, hapModuleInfoCB->cbBase.errCode);
1928         napi_reject_deferred(env, hapModuleInfoCB->cbBase.deferred, result);
1929     }
1930 
1931     napi_delete_async_work(env, hapModuleInfoCB->cbBase.asyncWork);
1932     delete hapModuleInfoCB;
1933     hapModuleInfoCB = nullptr;
1934     HILOG_INFO("NAPI_GetHapModuleInfo, main event thread complete end.");
1935 }
1936 
1937 /**
1938  * @brief GetHapModuleInfo Async.
1939  *
1940  * @param env The environment that the Node-API call is invoked under.
1941  * @param args Indicates the arguments passed into the callback.
1942  * @param argcPromise Asynchronous data processing.
1943  * @param hapModuleInfoCB Process data asynchronously.
1944  *
1945  * @return Return JS data successfully, otherwise return nullptr.
1946  */
GetHapModuleInfoAsync(napi_env env,napi_value * args,const size_t argCallback,HapModuleInfoCB * hapModuleInfoCB)1947 napi_value GetHapModuleInfoAsync(
1948     napi_env env, napi_value *args, const size_t argCallback, HapModuleInfoCB *hapModuleInfoCB)
1949 {
1950     HILOG_INFO("%{public}s, asyncCallback.", __func__);
1951     if (args == nullptr || hapModuleInfoCB == nullptr) {
1952         HILOG_ERROR("%{public}s, param == nullptr.", __func__);
1953         return nullptr;
1954     }
1955     napi_value resourceName = nullptr;
1956     NAPI_CALL(env, napi_create_string_latin1(env, __func__, NAPI_AUTO_LENGTH, &resourceName));
1957 
1958     napi_valuetype valuetype = napi_undefined;
1959     NAPI_CALL(env, napi_typeof(env, args[argCallback], &valuetype));
1960     if (valuetype == napi_function) {
1961         NAPI_CALL(env, napi_create_reference(env, args[argCallback], 1, &hapModuleInfoCB->cbBase.cbInfo.callback));
1962     }
1963     NAPI_CALL(env,
1964         napi_create_async_work(env,
1965             nullptr,
1966             resourceName,
1967             GetHapModuleInfoExecuteCB,
1968             GetHapModuleInfoAsyncCompleteCB,
1969             static_cast<void *>(hapModuleInfoCB),
1970             &hapModuleInfoCB->cbBase.asyncWork));
1971     NAPI_CALL(env, napi_queue_async_work(env, hapModuleInfoCB->cbBase.asyncWork));
1972     napi_value result = nullptr;
1973     NAPI_CALL(env, napi_get_null(env, &result));
1974     HILOG_INFO("%{public}s, asyncCallback end.", __func__);
1975     return result;
1976 }
1977 
1978 /**
1979  * @brief GetHapModuleInfo Promise.
1980  *
1981  * @param env The environment that the Node-API call is invoked under.
1982  * @param hapModuleInfoCB Process data asynchronously.
1983  *
1984  * @return Return JS data successfully, otherwise return nullptr.
1985  */
GetHapModuleInfoPromise(napi_env env,HapModuleInfoCB * hapModuleInfoCB)1986 napi_value GetHapModuleInfoPromise(napi_env env, HapModuleInfoCB *hapModuleInfoCB)
1987 {
1988     HILOG_INFO("%{public}s, promise.", __func__);
1989     if (hapModuleInfoCB == nullptr) {
1990         HILOG_ERROR("%{public}s, param == nullptr.", __func__);
1991         return nullptr;
1992     }
1993     napi_value resourceName = nullptr;
1994     NAPI_CALL(env, napi_create_string_latin1(env, __func__, NAPI_AUTO_LENGTH, &resourceName));
1995     napi_deferred deferred;
1996     napi_value promise = nullptr;
1997     NAPI_CALL(env, napi_create_promise(env, &deferred, &promise));
1998     hapModuleInfoCB->cbBase.deferred = deferred;
1999 
2000     NAPI_CALL(env,
2001         napi_create_async_work(env,
2002             nullptr,
2003             resourceName,
2004             GetHapModuleInfoExecuteCB,
2005             GetHapModuleInfoPromiseCompleteCB,
2006             static_cast<void *>(hapModuleInfoCB),
2007             &hapModuleInfoCB->cbBase.asyncWork));
2008     NAPI_CALL(env, napi_queue_async_work(env, hapModuleInfoCB->cbBase.asyncWork));
2009     HILOG_INFO("%{public}s, promise end.", __func__);
2010     return promise;
2011 }
2012 
GetHapModuleInfoWrap(napi_env env,napi_callback_info info,HapModuleInfoCB * hapModuleInfoCB)2013 napi_value GetHapModuleInfoWrap(napi_env env, napi_callback_info info, HapModuleInfoCB *hapModuleInfoCB)
2014 {
2015     HILOG_INFO("%{public}s, asyncCallback.", __func__);
2016     if (hapModuleInfoCB == nullptr) {
2017         HILOG_ERROR("%{public}s, hapModuleInfoCB == nullptr.", __func__);
2018         return nullptr;
2019     }
2020 
2021     size_t argcAsync = 1;
2022     const size_t argcPromise = 0;
2023     const size_t argCountWithAsync = argcPromise + ARGS_ASYNC_COUNT;
2024     napi_value args[ARGS_MAX_COUNT] = {nullptr};
2025     napi_value ret = nullptr;
2026 
2027     NAPI_CALL(env, napi_get_cb_info(env, info, &argcAsync, args, nullptr, nullptr));
2028     if (argcAsync > argCountWithAsync || argcAsync > ARGS_MAX_COUNT) {
2029         HILOG_ERROR("%{public}s, Wrong argument count.", __func__);
2030         return nullptr;
2031     }
2032 
2033     if (argcAsync > argcPromise) {
2034         ret = GetHapModuleInfoAsync(env, args, 0, hapModuleInfoCB);
2035     } else {
2036         ret = GetHapModuleInfoPromise(env, hapModuleInfoCB);
2037     }
2038     HILOG_INFO("%{public}s, asyncCallback end.", __func__);
2039     return ret;
2040 }
2041 
2042 /**
2043  * @brief Obtains the HapModuleInfo object of the application.
2044  *
2045  * @param env The environment that the Node-API call is invoked under.
2046  * @param info The callback info passed into the callback function.
2047  *
2048  * @return The return value from NAPI C++ to JS for the module.
2049  */
NAPI_GetHapModuleInfoCommon(napi_env env,napi_callback_info info,AbilityType abilityType)2050 napi_value NAPI_GetHapModuleInfoCommon(napi_env env, napi_callback_info info, AbilityType abilityType)
2051 {
2052     HILOG_INFO("%{public}s called.", __func__);
2053     HapModuleInfoCB *hapModuleInfoCB = CreateHapModuleInfoCBInfo(env);
2054     if (hapModuleInfoCB == nullptr) {
2055         return WrapVoidToJS(env);
2056     }
2057 
2058     hapModuleInfoCB->cbBase.errCode = NAPI_ERR_NO_ERROR;
2059     hapModuleInfoCB->cbBase.abilityType = abilityType;
2060     napi_value ret = GetHapModuleInfoWrap(env, info, hapModuleInfoCB);
2061     if (ret == nullptr) {
2062         HILOG_ERROR("%{public}s ret == nullptr", __func__);
2063         if (hapModuleInfoCB != nullptr) {
2064             delete hapModuleInfoCB;
2065             hapModuleInfoCB = nullptr;
2066         }
2067         ret = WrapVoidToJS(env);
2068     }
2069     HILOG_INFO("%{public}s end.", __func__);
2070     return ret;
2071 }
2072 
2073 /**
2074  * @brief Create asynchronous data.
2075  *
2076  * @param env The environment that the Node-API call is invoked under.
2077  *
2078  * @return Return a pointer to AppVersionInfoCB on success, nullptr on failure.
2079  */
CreateAppVersionInfoCBInfo(napi_env env)2080 AppVersionInfoCB *CreateAppVersionInfoCBInfo(napi_env env)
2081 {
2082     HILOG_INFO("%{public}s called.", __func__);
2083     napi_value global = nullptr;
2084     NAPI_CALL(env, napi_get_global(env, &global));
2085 
2086     napi_value abilityObj = nullptr;
2087     NAPI_CALL(env, napi_get_named_property(env, global, "ability", &abilityObj));
2088 
2089     Ability *ability = nullptr;
2090     NAPI_CALL(env, napi_get_value_external(env, abilityObj, reinterpret_cast<void **>(&ability)));
2091 
2092     AppVersionInfoCB *appVersionInfoCB = new (std::nothrow) AppVersionInfoCB;
2093     if (appVersionInfoCB == nullptr) {
2094         HILOG_ERROR("%{public}s, appVersionInfoCB == nullptr.", __func__);
2095         return nullptr;
2096     }
2097     appVersionInfoCB->cbBase.cbInfo.env = env;
2098     appVersionInfoCB->cbBase.asyncWork = nullptr;
2099     appVersionInfoCB->cbBase.deferred = nullptr;
2100     appVersionInfoCB->cbBase.ability = ability;
2101 
2102     HILOG_INFO("%{public}s end.", __func__);
2103     return appVersionInfoCB;
2104 }
2105 
SaveAppVersionInfo(AppVersionInfo & appVersionInfo,const std::string appName,const std::string versionName,const int32_t versionCode)2106 void SaveAppVersionInfo(AppVersionInfo &appVersionInfo, const std::string appName, const std::string versionName,
2107     const int32_t versionCode)
2108 {
2109     HILOG_INFO("%{public}s called.", __func__);
2110     appVersionInfo.appName = appName;
2111     appVersionInfo.versionName = versionName;
2112     appVersionInfo.versionCode = versionCode;
2113     HILOG_INFO("%{public}s end.", __func__);
2114 }
2115 
WrapAppVersionInfo(napi_env env,const AppVersionInfoCB & appVersionInfoCB)2116 napi_value WrapAppVersionInfo(napi_env env, const AppVersionInfoCB &appVersionInfoCB)
2117 {
2118     HILOG_INFO("%{public}s called.", __func__);
2119     napi_value result = nullptr;
2120     napi_value proValue = nullptr;
2121     NAPI_CALL(env, napi_create_object(env, &result));
2122     NAPI_CALL(env,
2123         napi_create_string_utf8(env, appVersionInfoCB.appVersionInfo.appName.c_str(), NAPI_AUTO_LENGTH, &proValue));
2124     NAPI_CALL(env, napi_set_named_property(env, result, "appName", proValue));
2125 
2126     NAPI_CALL(env,
2127         napi_create_string_utf8(env, appVersionInfoCB.appVersionInfo.versionName.c_str(), NAPI_AUTO_LENGTH, &proValue));
2128     NAPI_CALL(env, napi_set_named_property(env, result, "versionName", proValue));
2129 
2130     NAPI_CALL(env, napi_create_int32(env, appVersionInfoCB.appVersionInfo.versionCode, &proValue));
2131     NAPI_CALL(env, napi_set_named_property(env, result, "versionCode", proValue));
2132 
2133     HILOG_INFO("%{public}s end.", __func__);
2134     return result;
2135 }
2136 
GetAppVersionInfoExecuteCB(napi_env env,void * data)2137 void GetAppVersionInfoExecuteCB(napi_env env, void *data)
2138 {
2139     HILOG_INFO("NAPI_GetAppVersionInfo, worker pool thread execute.");
2140     AppVersionInfoCB *appVersionInfoCB = static_cast<AppVersionInfoCB *>(data);
2141     if (appVersionInfoCB == nullptr) {
2142         HILOG_ERROR("NAPI_GetAppVersionInfo, appVersionInfoCB == nullptr");
2143         return;
2144     }
2145 
2146     appVersionInfoCB->cbBase.errCode = NAPI_ERR_NO_ERROR;
2147     if (appVersionInfoCB->cbBase.ability == nullptr) {
2148         HILOG_ERROR("NAPI_GetAppVersionInfo, ability == nullptr");
2149         appVersionInfoCB->cbBase.errCode = NAPI_ERR_ACE_ABILITY;
2150         return;
2151     }
2152 
2153     if (!CheckAbilityType(&appVersionInfoCB->cbBase)) {
2154         HILOG_ERROR("NAPI_GetAppVersionInfo,wrong ability type");
2155         appVersionInfoCB->cbBase.errCode = NAPI_ERR_ABILITY_TYPE_INVALID;
2156         return;
2157     }
2158 
2159     std::shared_ptr<ApplicationInfo> appInfoPtr = appVersionInfoCB->cbBase.ability->GetApplicationInfo();
2160     if (appInfoPtr != nullptr) {
2161         SaveAppVersionInfo(appVersionInfoCB->appVersionInfo, appInfoPtr->name, appInfoPtr->versionName,
2162             appInfoPtr->versionCode);
2163     } else {
2164         appVersionInfoCB->cbBase.errCode = NAPI_ERR_ABILITY_CALL_INVALID;
2165     }
2166     HILOG_INFO("NAPI_GetAppVersionInfo, worker pool thread execute end.");
2167 }
2168 
GetAppVersionInfoAsyncCompleteCB(napi_env env,napi_status status,void * data)2169 void GetAppVersionInfoAsyncCompleteCB(napi_env env, napi_status status, void *data)
2170 {
2171     HILOG_INFO("NAPI_GetAppVersionInfo, main event thread complete.");
2172     AppVersionInfoCB *appVersionInfoCB = static_cast<AppVersionInfoCB *>(data);
2173     napi_value callback = nullptr;
2174     napi_value undefined = nullptr;
2175     napi_value result[ARGS_TWO] = {nullptr};
2176     napi_value callResult = nullptr;
2177     NAPI_CALL_RETURN_VOID(env, napi_get_undefined(env, &undefined));
2178     result[PARAM0] = GetCallbackErrorValue(env, appVersionInfoCB->cbBase.errCode);
2179     if (appVersionInfoCB->cbBase.errCode == NAPI_ERR_NO_ERROR) {
2180         result[PARAM1] = WrapAppVersionInfo(env, *appVersionInfoCB);
2181     } else {
2182         result[PARAM1] = WrapUndefinedToJS(env);
2183     }
2184     NAPI_CALL_RETURN_VOID(env, napi_get_reference_value(env, appVersionInfoCB->cbBase.cbInfo.callback, &callback));
2185     NAPI_CALL_RETURN_VOID(env, napi_call_function(env, undefined, callback, ARGS_TWO, &result[PARAM0], &callResult));
2186 
2187     if (appVersionInfoCB->cbBase.cbInfo.callback != nullptr) {
2188         NAPI_CALL_RETURN_VOID(env, napi_delete_reference(env, appVersionInfoCB->cbBase.cbInfo.callback));
2189     }
2190     NAPI_CALL_RETURN_VOID(env, napi_delete_async_work(env, appVersionInfoCB->cbBase.asyncWork));
2191     delete appVersionInfoCB;
2192     appVersionInfoCB = nullptr;
2193     HILOG_INFO("NAPI_GetAppVersionInfo, main event thread complete end.");
2194 }
2195 
GetAppVersionInfoPromiseCompleteCB(napi_env env,napi_status status,void * data)2196 void GetAppVersionInfoPromiseCompleteCB(napi_env env, napi_status status, void *data)
2197 {
2198     HILOG_INFO("NAPI_GetAppVersionInfo, main event thread complete.");
2199     AppVersionInfoCB *appVersionInfoCB = static_cast<AppVersionInfoCB *>(data);
2200     napi_value result = nullptr;
2201     if (appVersionInfoCB->cbBase.errCode == NAPI_ERR_NO_ERROR) {
2202         result = WrapAppVersionInfo(env, *appVersionInfoCB);
2203         napi_resolve_deferred(env, appVersionInfoCB->cbBase.deferred, result);
2204     } else {
2205         result = GetCallbackErrorValue(env, appVersionInfoCB->cbBase.errCode);
2206         napi_reject_deferred(env, appVersionInfoCB->cbBase.deferred, result);
2207     }
2208 
2209     napi_delete_async_work(env, appVersionInfoCB->cbBase.asyncWork);
2210     delete appVersionInfoCB;
2211     appVersionInfoCB = nullptr;
2212     HILOG_INFO("NAPI_GetAppVersionInfo, main event thread complete end.");
2213 }
2214 
2215 /**
2216  * @brief GetAppVersionInfo Async.
2217  *
2218  * @param env The environment that the Node-API call is invoked under.
2219  * @param args Indicates the arguments passed into the callback.
2220  * @param argcPromise Asynchronous data processing.
2221  * @param AppVersionInfoCB Process data asynchronously.
2222  *
2223  * @return Return JS data successfully, otherwise return nullptr.
2224  */
GetAppVersionInfoAsync(napi_env env,napi_value * args,const size_t argCallback,AppVersionInfoCB * appVersionInfoCB)2225 napi_value GetAppVersionInfoAsync(
2226     napi_env env, napi_value *args, const size_t argCallback, AppVersionInfoCB *appVersionInfoCB)
2227 {
2228     HILOG_INFO("%{public}s, asyncCallback.", __func__);
2229     if (args == nullptr || appVersionInfoCB == nullptr) {
2230         HILOG_ERROR("%{public}s, param == nullptr.", __func__);
2231         return nullptr;
2232     }
2233     napi_value resourceName = nullptr;
2234     NAPI_CALL(env, napi_create_string_latin1(env, __func__, NAPI_AUTO_LENGTH, &resourceName));
2235 
2236     napi_valuetype valuetype = napi_undefined;
2237     NAPI_CALL(env, napi_typeof(env, args[argCallback], &valuetype));
2238     if (valuetype == napi_function) {
2239         NAPI_CALL(env, napi_create_reference(env, args[argCallback], 1, &appVersionInfoCB->cbBase.cbInfo.callback));
2240     }
2241     NAPI_CALL(
2242         env, napi_create_async_work(env, nullptr, resourceName, GetAppVersionInfoExecuteCB,
2243                  GetAppVersionInfoAsyncCompleteCB, static_cast<void *>(appVersionInfoCB),
2244                  &appVersionInfoCB->cbBase.asyncWork));
2245     NAPI_CALL(env, napi_queue_async_work(env, appVersionInfoCB->cbBase.asyncWork));
2246     napi_value result = nullptr;
2247     NAPI_CALL(env, napi_get_null(env, &result));
2248     HILOG_INFO("%{public}s, asyncCallback end.", __func__);
2249     return result;
2250 }
2251 
2252 /**
2253  * @brief GetAppVersionInfo Promise.
2254  *
2255  * @param env The environment that the Node-API call is invoked under.
2256  * @param AppVersionInfoCB Process data asynchronously.
2257  *
2258  * @return Return JS data successfully, otherwise return nullptr.
2259  */
GetAppVersionInfoPromise(napi_env env,AppVersionInfoCB * appVersionInfoCB)2260 napi_value GetAppVersionInfoPromise(napi_env env, AppVersionInfoCB *appVersionInfoCB)
2261 {
2262     HILOG_INFO("%{public}s, promise.", __func__);
2263     if (appVersionInfoCB == nullptr) {
2264         HILOG_ERROR("%{public}s, param == nullptr.", __func__);
2265         return nullptr;
2266     }
2267     napi_value resourceName = nullptr;
2268     NAPI_CALL(env, napi_create_string_latin1(env, __func__, NAPI_AUTO_LENGTH, &resourceName));
2269     napi_deferred deferred;
2270     napi_value promise = nullptr;
2271     NAPI_CALL(env, napi_create_promise(env, &deferred, &promise));
2272     appVersionInfoCB->cbBase.deferred = deferred;
2273 
2274     NAPI_CALL(
2275         env, napi_create_async_work(env, nullptr, resourceName, GetAppVersionInfoExecuteCB,
2276                  GetAppVersionInfoPromiseCompleteCB, static_cast<void *>(appVersionInfoCB),
2277                  &appVersionInfoCB->cbBase.asyncWork));
2278     NAPI_CALL(env, napi_queue_async_work(env, appVersionInfoCB->cbBase.asyncWork));
2279     HILOG_INFO("%{public}s, promise end.", __func__);
2280     return promise;
2281 }
2282 
GetAppVersionInfoWrap(napi_env env,napi_callback_info info,AppVersionInfoCB * appVersionInfoCB)2283 napi_value GetAppVersionInfoWrap(napi_env env, napi_callback_info info, AppVersionInfoCB *appVersionInfoCB)
2284 {
2285     HILOG_INFO("%{public}s, asyncCallback.", __func__);
2286     if (appVersionInfoCB == nullptr) {
2287         HILOG_ERROR("%{public}s, appVersionInfoCB == nullptr.", __func__);
2288         return nullptr;
2289     }
2290 
2291     size_t argcAsync = 1;
2292     const size_t argcPromise = 0;
2293     const size_t argCountWithAsync = argcPromise + ARGS_ASYNC_COUNT;
2294     napi_value args[ARGS_MAX_COUNT] = {nullptr};
2295     napi_value ret = nullptr;
2296 
2297     NAPI_CALL(env, napi_get_cb_info(env, info, &argcAsync, args, nullptr, nullptr));
2298     if (argcAsync > argCountWithAsync || argcAsync > ARGS_MAX_COUNT) {
2299         HILOG_ERROR("%{public}s, Wrong argument count.", __func__);
2300         return nullptr;
2301     }
2302 
2303     if (argcAsync > argcPromise) {
2304         ret = GetAppVersionInfoAsync(env, args, 0, appVersionInfoCB);
2305     } else {
2306         ret = GetAppVersionInfoPromise(env, appVersionInfoCB);
2307     }
2308     HILOG_INFO("%{public}s, asyncCallback end.", __func__);
2309     return ret;
2310 }
2311 
2312 /**
2313  * @brief Obtains the AppVersionInfo object of the application.
2314  *
2315  * @param env The environment that the Node-API call is invoked under.
2316  * @param info The callback info passed into the callback function.
2317  *
2318  * @return The return value from NAPI C++ to JS for the module.
2319  */
NAPI_GetAppVersionInfoCommon(napi_env env,napi_callback_info info,AbilityType abilityType)2320 napi_value NAPI_GetAppVersionInfoCommon(napi_env env, napi_callback_info info, AbilityType abilityType)
2321 {
2322     HILOG_INFO("%{public}s called.", __func__);
2323     AppVersionInfoCB *appVersionInfoCB = CreateAppVersionInfoCBInfo(env);
2324     if (appVersionInfoCB == nullptr) {
2325         return WrapVoidToJS(env);
2326     }
2327 
2328     appVersionInfoCB->cbBase.errCode = NAPI_ERR_NO_ERROR;
2329     appVersionInfoCB->cbBase.abilityType = abilityType;
2330     napi_value ret = GetAppVersionInfoWrap(env, info, appVersionInfoCB);
2331     if (ret == nullptr) {
2332         HILOG_ERROR("%{public}s ret == nullptr", __func__);
2333         if (appVersionInfoCB != nullptr) {
2334             delete appVersionInfoCB;
2335             appVersionInfoCB = nullptr;
2336         }
2337         ret = WrapVoidToJS(env);
2338     }
2339     HILOG_INFO("%{public}s end.", __func__);
2340     return ret;
2341 }
2342 
2343 /**
2344  * @brief Create asynchronous data.
2345  *
2346  * @param env The environment that the Node-API call is invoked under.
2347  *
2348  * @return Return a pointer to AsyncCallbackInfo on success, nullptr on failure
2349  */
CreateAsyncCallbackInfo(napi_env env)2350 AsyncCallbackInfo *CreateAsyncCallbackInfo(napi_env env)
2351 {
2352     HILOG_INFO("%{public}s called.", __func__);
2353     if (env == nullptr) {
2354         HILOG_INFO("%{public}s env == nullptr.", __func__);
2355         return nullptr;
2356     }
2357 
2358     napi_status ret;
2359     napi_value global = nullptr;
2360     const napi_extended_error_info *errorInfo = nullptr;
2361     ret = napi_get_global(env, &global);
2362     if (ret != napi_ok) {
2363         napi_get_last_error_info(env, &errorInfo);
2364         HILOG_ERROR("%{public}s get_global=%{public}d err:%{public}s", __func__, ret, errorInfo->error_message);
2365     }
2366 
2367     napi_value abilityObj = nullptr;
2368     ret = napi_get_named_property(env, global, "ability", &abilityObj);
2369     if (ret != napi_ok) {
2370         napi_get_last_error_info(env, &errorInfo);
2371         HILOG_ERROR("%{public}s get_named_property=%{public}d err:%{public}s", __func__, ret, errorInfo->error_message);
2372     }
2373 
2374     Ability *ability = nullptr;
2375     ret = napi_get_value_external(env, abilityObj, reinterpret_cast<void **>(&ability));
2376     if (ret != napi_ok) {
2377         napi_get_last_error_info(env, &errorInfo);
2378         HILOG_ERROR("%{public}s get_value_external=%{public}d err:%{public}s", __func__, ret, errorInfo->error_message);
2379     }
2380 
2381     AsyncCallbackInfo *asyncCallbackInfo = new (std::nothrow) AsyncCallbackInfo;
2382     if (asyncCallbackInfo == nullptr) {
2383         HILOG_ERROR("%{public}s asyncCallbackInfo == nullptr", __func__);
2384         return nullptr;
2385     }
2386     asyncCallbackInfo->cbInfo.env = env;
2387     asyncCallbackInfo->asyncWork = nullptr;
2388     asyncCallbackInfo->deferred = nullptr;
2389     asyncCallbackInfo->ability = ability;
2390     asyncCallbackInfo->native_result = false;
2391     asyncCallbackInfo->errCode = NAPI_ERR_NO_ERROR;
2392     asyncCallbackInfo->abilityType = AbilityType::UNKNOWN;
2393 
2394     HILOG_INFO("%{public}s end.", __func__);
2395     return asyncCallbackInfo;
2396 }
2397 
GetContextAsyncExecuteCB(napi_env env,void * data)2398 void GetContextAsyncExecuteCB(napi_env env, void *data)
2399 {
2400     HILOG_INFO("GetContextAsync, worker pool thread execute.");
2401     AsyncCallbackInfo *asyncCallbackInfo = static_cast<AsyncCallbackInfo *>(data);
2402     if (asyncCallbackInfo == nullptr) {
2403         HILOG_ERROR("GetContextAsync, asyncCallbackInfo == nullptr");
2404         return;
2405     }
2406     asyncCallbackInfo->errCode = NAPI_ERR_NO_ERROR;
2407     if (asyncCallbackInfo->ability == nullptr) {
2408         HILOG_ERROR("GetContextAsync, ability == nullptr");
2409         asyncCallbackInfo->errCode = NAPI_ERR_ACE_ABILITY;
2410         return;
2411     }
2412 
2413     if (!CheckAbilityType(asyncCallbackInfo)) {
2414         HILOG_ERROR("GetContextAsync,wrong ability type");
2415         asyncCallbackInfo->errCode = NAPI_ERR_ABILITY_TYPE_INVALID;
2416         return;
2417     }
2418     HILOG_INFO("GetContextAsync, worker pool thread execute end.");
2419 }
2420 
GetContextAsync(napi_env env,napi_value * args,const size_t argCallback,AsyncCallbackInfo * asyncCallbackInfo)2421 napi_value GetContextAsync(
2422     napi_env env, napi_value *args, const size_t argCallback, AsyncCallbackInfo *asyncCallbackInfo)
2423 {
2424     HILOG_INFO("%{public}s, asyncCallback.", __func__);
2425     if (args == nullptr || asyncCallbackInfo == nullptr) {
2426         HILOG_ERROR("%{public}s, param == nullptr.", __func__);
2427         return nullptr;
2428     }
2429     napi_value resourceName = nullptr;
2430     napi_create_string_latin1(env, __func__, NAPI_AUTO_LENGTH, &resourceName);
2431 
2432     napi_valuetype valuetype = napi_undefined;
2433     napi_typeof(env, args[argCallback], &valuetype);
2434     if (valuetype == napi_function) {
2435         napi_create_reference(env, args[argCallback], 1, &asyncCallbackInfo->cbInfo.callback);
2436     }
2437     napi_create_async_work(
2438         env,
2439         nullptr,
2440         resourceName,
2441         GetContextAsyncExecuteCB,
2442         [](napi_env env, napi_status status, void *data) {
2443             HILOG_INFO("GetContextAsync, main event thread complete.");
2444             AsyncCallbackInfo *asyncCallbackInfo = static_cast<AsyncCallbackInfo *>(data);
2445             napi_value callback = nullptr;
2446             napi_value undefined = nullptr;
2447             napi_value result[ARGS_TWO] = {nullptr};
2448             napi_value callResult = nullptr;
2449             napi_get_undefined(env, &undefined);
2450             result[PARAM0] = GetCallbackErrorValue(env, asyncCallbackInfo->errCode);
2451             if (asyncCallbackInfo->errCode == NAPI_ERR_NO_ERROR) {
2452                 napi_new_instance(env, GetGlobalClassContext(env), 0, nullptr, &result[PARAM1]);
2453             } else {
2454                 result[PARAM1] = WrapUndefinedToJS(env);
2455             }
2456             napi_get_reference_value(env, asyncCallbackInfo->cbInfo.callback, &callback);
2457             napi_call_function(env, undefined, callback, ARGS_TWO, &result[PARAM0], &callResult);
2458 
2459             if (asyncCallbackInfo->cbInfo.callback != nullptr) {
2460                 napi_delete_reference(env, asyncCallbackInfo->cbInfo.callback);
2461             }
2462             napi_delete_async_work(env, asyncCallbackInfo->asyncWork);
2463             delete asyncCallbackInfo;
2464             asyncCallbackInfo = nullptr;
2465             HILOG_INFO("GetContextAsync, main event thread complete end.");
2466         },
2467         static_cast<void *>(asyncCallbackInfo),
2468         &asyncCallbackInfo->asyncWork);
2469     napi_queue_async_work(env, asyncCallbackInfo->asyncWork);
2470     napi_value result = nullptr;
2471     napi_get_null(env, &result);
2472     HILOG_INFO("%{public}s, asyncCallback end.", __func__);
2473     return result;
2474 }
2475 
GetContextPromise(napi_env env,AsyncCallbackInfo * asyncCallbackInfo)2476 napi_value GetContextPromise(napi_env env, AsyncCallbackInfo *asyncCallbackInfo)
2477 {
2478     HILOG_INFO("%{public}s, promise.", __func__);
2479     if (asyncCallbackInfo == nullptr) {
2480         HILOG_ERROR("%{public}s, param == nullptr.", __func__);
2481         return nullptr;
2482     }
2483     napi_value resourceName = nullptr;
2484     napi_create_string_latin1(env, __func__, NAPI_AUTO_LENGTH, &resourceName);
2485     napi_deferred deferred;
2486     napi_value promise = nullptr;
2487     napi_create_promise(env, &deferred, &promise);
2488     asyncCallbackInfo->deferred = deferred;
2489 
2490     napi_create_async_work(
2491         env,
2492         nullptr,
2493         resourceName,
2494         GetContextAsyncExecuteCB,
2495         [](napi_env env, napi_status status, void *data) {
2496             HILOG_INFO("GetContextPromise, main event thread complete.");
2497             AsyncCallbackInfo *asyncCallbackInfo = static_cast<AsyncCallbackInfo *>(data);
2498             napi_value result = nullptr;
2499             if (asyncCallbackInfo->errCode == NAPI_ERR_NO_ERROR) {
2500                 napi_new_instance(env, GetGlobalClassContext(env), 0, nullptr, &result);
2501                 napi_resolve_deferred(env, asyncCallbackInfo->deferred, result);
2502             } else {
2503                 result = GetCallbackErrorValue(env, asyncCallbackInfo->errCode);
2504                 napi_reject_deferred(env, asyncCallbackInfo->deferred, result);
2505             }
2506 
2507             napi_delete_async_work(env, asyncCallbackInfo->asyncWork);
2508             delete asyncCallbackInfo;
2509             asyncCallbackInfo = nullptr;
2510             HILOG_INFO("GetContextPromise, main event thread complete end.");
2511         },
2512         static_cast<void *>(asyncCallbackInfo),
2513         &asyncCallbackInfo->asyncWork);
2514     napi_queue_async_work(env, asyncCallbackInfo->asyncWork);
2515     HILOG_INFO("%{public}s, promise end.", __func__);
2516     return promise;
2517 }
2518 
2519 /**
2520  * @brief GetContext processing function.
2521  *
2522  * @param env The environment that the Node-API call is invoked under.
2523  * @param asyncCallbackInfo Process data asynchronously.
2524  *
2525  * @return Return JS data successfully, otherwise return nullptr.
2526  */
GetContextWrap(napi_env env,napi_callback_info info,AsyncCallbackInfo * asyncCallbackInfo)2527 napi_value GetContextWrap(napi_env env, napi_callback_info info, AsyncCallbackInfo *asyncCallbackInfo)
2528 {
2529     HILOG_INFO("%{public}s, called.", __func__);
2530     if (asyncCallbackInfo == nullptr) {
2531         HILOG_ERROR("%{public}s, asyncCallbackInfo == nullptr.", __func__);
2532         return nullptr;
2533     }
2534 
2535     asyncCallbackInfo->errCode = NAPI_ERR_NO_ERROR;
2536     if (!CheckAbilityType(asyncCallbackInfo)) {
2537         HILOG_ERROR("%{public}s,wrong ability type", __func__);
2538         asyncCallbackInfo->errCode = NAPI_ERR_ABILITY_TYPE_INVALID;
2539         return nullptr;
2540     }
2541 
2542     napi_value result = nullptr;
2543     napi_new_instance(env, GetGlobalClassContext(env), 0, nullptr, &result);
2544     HILOG_INFO("%{public}s, end.", __func__);
2545     return result;
2546 }
2547 
2548 /**
2549  * @brief Get context.
2550  *
2551  * @param env The environment that the Node-API call is invoked under.
2552  * @param info The callback info passed into the callback function.
2553  *
2554  * @return The return value from NAPI C++ to JS for the module.
2555  */
NAPI_GetContextCommon(napi_env env,napi_callback_info info,AbilityType abilityType)2556 napi_value NAPI_GetContextCommon(napi_env env, napi_callback_info info, AbilityType abilityType)
2557 {
2558     HILOG_INFO("%{public}s, called.", __func__);
2559     AsyncCallbackInfo *asyncCallbackInfo = CreateAsyncCallbackInfo(env);
2560     if (asyncCallbackInfo == nullptr) {
2561         HILOG_ERROR("%{public}s asyncCallbackInfo == nullptr", __func__);
2562         return WrapVoidToJS(env);
2563     }
2564 
2565     asyncCallbackInfo->errCode = NAPI_ERR_NO_ERROR;
2566     asyncCallbackInfo->abilityType = abilityType;
2567     napi_value ret = GetContextWrap(env, info, asyncCallbackInfo);
2568 
2569     delete asyncCallbackInfo;
2570     asyncCallbackInfo = nullptr;
2571 
2572     if (ret == nullptr) {
2573         ret = WrapVoidToJS(env);
2574         HILOG_ERROR("%{public}s ret == nullptr", __func__);
2575     } else {
2576         HILOG_INFO("%{public}s, end.", __func__);
2577     }
2578     return ret;
2579 }
2580 
GetWantExecuteCB(napi_env env,void * data)2581 void GetWantExecuteCB(napi_env env, void *data)
2582 {
2583     HILOG_INFO("%{public}s, called.", __func__);
2584     AsyncCallbackInfo *asyncCallbackInfo = static_cast<AsyncCallbackInfo *>(data);
2585     if (asyncCallbackInfo == nullptr) {
2586         HILOG_ERROR("%{public}s, asyncCallbackInfo == nullptr", __func__);
2587         return;
2588     }
2589     asyncCallbackInfo->errCode = NAPI_ERR_NO_ERROR;
2590     if (asyncCallbackInfo->ability == nullptr) {
2591         HILOG_ERROR("%{public}s, ability == nullptr", __func__);
2592         asyncCallbackInfo->errCode = NAPI_ERR_ACE_ABILITY;
2593         return;
2594     }
2595 
2596     if (!CheckAbilityType(asyncCallbackInfo)) {
2597         HILOG_ERROR("%{public}s, wrong ability type", __func__);
2598         asyncCallbackInfo->errCode = NAPI_ERR_ABILITY_TYPE_INVALID;
2599         return;
2600     }
2601 
2602     std::shared_ptr<AAFwk::Want> ptrWant = asyncCallbackInfo->ability->GetWant();
2603     if (ptrWant != nullptr) {
2604         asyncCallbackInfo->param.want = *ptrWant;
2605     } else {
2606         asyncCallbackInfo->errCode = NAPI_ERR_ABILITY_CALL_INVALID;
2607     }
2608     HILOG_INFO("%{public}s, end.", __func__);
2609 }
2610 
GetWantAsync(napi_env env,napi_value * args,const size_t argCallback,AsyncCallbackInfo * asyncCallbackInfo)2611 napi_value GetWantAsync(napi_env env, napi_value *args, const size_t argCallback, AsyncCallbackInfo *asyncCallbackInfo)
2612 {
2613     HILOG_INFO("%{public}s, asyncCallback.", __func__);
2614     if (args == nullptr || asyncCallbackInfo == nullptr) {
2615         HILOG_ERROR("%{public}s, param == nullptr.", __func__);
2616         return nullptr;
2617     }
2618     napi_value resourceName = nullptr;
2619     napi_create_string_latin1(env, __func__, NAPI_AUTO_LENGTH, &resourceName);
2620 
2621     napi_valuetype valuetype = napi_undefined;
2622     napi_typeof(env, args[argCallback], &valuetype);
2623     if (valuetype == napi_function) {
2624         napi_create_reference(env, args[argCallback], 1, &asyncCallbackInfo->cbInfo.callback);
2625     }
2626     napi_create_async_work(
2627         env,
2628         nullptr,
2629         resourceName,
2630         GetWantExecuteCB,
2631         [](napi_env env, napi_status status, void *data) {
2632             HILOG_INFO("GetWantAsync, main event thread complete.");
2633             AsyncCallbackInfo *asyncCallbackInfo = static_cast<AsyncCallbackInfo *>(data);
2634             napi_value callback = nullptr;
2635             napi_value undefined = nullptr;
2636             napi_value result[ARGS_TWO] = {nullptr};
2637             napi_value callResult = nullptr;
2638             napi_get_undefined(env, &undefined);
2639             result[PARAM0] = GetCallbackErrorValue(env, asyncCallbackInfo->errCode);
2640             if (asyncCallbackInfo->errCode == NAPI_ERR_NO_ERROR) {
2641                 result[PARAM1] = WrapWant(env, asyncCallbackInfo->param.want);
2642             } else {
2643                 result[PARAM1] = WrapUndefinedToJS(env);
2644             }
2645             napi_get_reference_value(env, asyncCallbackInfo->cbInfo.callback, &callback);
2646             napi_call_function(env, undefined, callback, ARGS_TWO, &result[PARAM0], &callResult);
2647 
2648             if (asyncCallbackInfo->cbInfo.callback != nullptr) {
2649                 napi_delete_reference(env, asyncCallbackInfo->cbInfo.callback);
2650             }
2651             napi_delete_async_work(env, asyncCallbackInfo->asyncWork);
2652             delete asyncCallbackInfo;
2653             asyncCallbackInfo = nullptr;
2654             HILOG_INFO("GetWantAsync, main event thread complete end.");
2655         },
2656         static_cast<void *>(asyncCallbackInfo),
2657         &asyncCallbackInfo->asyncWork);
2658     napi_queue_async_work(env, asyncCallbackInfo->asyncWork);
2659     napi_value result = nullptr;
2660     napi_get_null(env, &result);
2661     HILOG_INFO("%{public}s, asyncCallback end.", __func__);
2662     return result;
2663 }
2664 
GetWantPromise(napi_env env,AsyncCallbackInfo * asyncCallbackInfo)2665 napi_value GetWantPromise(napi_env env, AsyncCallbackInfo *asyncCallbackInfo)
2666 {
2667     HILOG_INFO("%{public}s, promise.", __func__);
2668     if (asyncCallbackInfo == nullptr) {
2669         HILOG_ERROR("%{public}s, param == nullptr.", __func__);
2670         return nullptr;
2671     }
2672     napi_value resourceName = nullptr;
2673     napi_create_string_latin1(env, __func__, NAPI_AUTO_LENGTH, &resourceName);
2674     napi_deferred deferred;
2675     napi_value promise = nullptr;
2676     napi_create_promise(env, &deferred, &promise);
2677     asyncCallbackInfo->deferred = deferred;
2678 
2679     napi_create_async_work(
2680         env,
2681         nullptr,
2682         resourceName,
2683         GetWantExecuteCB,
2684         [](napi_env env, napi_status status, void *data) {
2685             HILOG_INFO("GetWantPromise, main event thread complete.");
2686             AsyncCallbackInfo *asyncCallbackInfo = static_cast<AsyncCallbackInfo *>(data);
2687             napi_value result = nullptr;
2688             if (asyncCallbackInfo->errCode == NAPI_ERR_NO_ERROR) {
2689                 result = WrapWant(env, asyncCallbackInfo->param.want);
2690                 napi_resolve_deferred(env, asyncCallbackInfo->deferred, result);
2691             } else {
2692                 result = GetCallbackErrorValue(env, asyncCallbackInfo->errCode);
2693                 napi_reject_deferred(env, asyncCallbackInfo->deferred, result);
2694             }
2695 
2696             napi_delete_async_work(env, asyncCallbackInfo->asyncWork);
2697             delete asyncCallbackInfo;
2698             asyncCallbackInfo = nullptr;
2699             HILOG_INFO("GetWantPromise, main event thread complete end.");
2700         },
2701         static_cast<void *>(asyncCallbackInfo),
2702         &asyncCallbackInfo->asyncWork);
2703     napi_queue_async_work(env, asyncCallbackInfo->asyncWork);
2704     HILOG_INFO("%{public}s, promise end.", __func__);
2705     return promise;
2706 }
2707 
2708 /**
2709  * @brief GetWantWrap processing function.
2710  *
2711  * @param env The environment that the Node-API call is invoked under.
2712  * @param asyncCallbackInfo Process data asynchronously.
2713  *
2714  * @return Return JS data successfully, otherwise return nullptr.
2715  */
GetWantWrap(napi_env env,napi_callback_info info,AsyncCallbackInfo * asyncCallbackInfo)2716 napi_value GetWantWrap(napi_env env, napi_callback_info info, AsyncCallbackInfo *asyncCallbackInfo)
2717 {
2718     HILOG_INFO("%{public}s, asyncCallback.", __func__);
2719     if (asyncCallbackInfo == nullptr) {
2720         HILOG_ERROR("%{public}s, asyncCallbackInfo == nullptr.", __func__);
2721         return nullptr;
2722     }
2723 
2724     size_t argcAsync = 1;
2725     const size_t argcPromise = 0;
2726     const size_t argCountWithAsync = argcPromise + ARGS_ASYNC_COUNT;
2727     napi_value args[ARGS_MAX_COUNT] = {nullptr};
2728     napi_value ret = nullptr;
2729 
2730     NAPI_CALL(env, napi_get_cb_info(env, info, &argcAsync, args, nullptr, nullptr));
2731     if (argcAsync > argCountWithAsync || argcAsync > ARGS_MAX_COUNT) {
2732         HILOG_ERROR("%{public}s, Wrong argument count.", __func__);
2733         return nullptr;
2734     }
2735 
2736     if (argcAsync > argcPromise) {
2737         ret = GetWantAsync(env, args, 0, asyncCallbackInfo);
2738     } else {
2739         ret = GetWantPromise(env, asyncCallbackInfo);
2740     }
2741     HILOG_INFO("%{public}s, asyncCallback end.", __func__);
2742     return ret;
2743 }
2744 
2745 /**
2746  * @brief Get want.
2747  *
2748  * @param env The environment that the Node-API call is invoked under.
2749  * @param info The callback info passed into the callback function.
2750  *
2751  * @return The return value from NAPI C++ to JS for the module.
2752  */
NAPI_GetWantCommon(napi_env env,napi_callback_info info,AbilityType abilityType)2753 napi_value NAPI_GetWantCommon(napi_env env, napi_callback_info info, AbilityType abilityType)
2754 {
2755     AsyncCallbackInfo *asyncCallbackInfo = CreateAsyncCallbackInfo(env);
2756     if (asyncCallbackInfo == nullptr) {
2757         HILOG_ERROR("%{public}s, asyncCallbackInfo == nullptr", __func__);
2758         return WrapVoidToJS(env);
2759     }
2760 
2761     asyncCallbackInfo->errCode = NAPI_ERR_NO_ERROR;
2762     asyncCallbackInfo->abilityType = abilityType;
2763     napi_value ret = GetWantWrap(env, info, asyncCallbackInfo);
2764     if (ret == nullptr) {
2765         HILOG_ERROR("%{public}s, ret == nullptr", __func__);
2766         if (asyncCallbackInfo != nullptr) {
2767             delete asyncCallbackInfo;
2768             asyncCallbackInfo = nullptr;
2769         }
2770         ret = WrapVoidToJS(env);
2771     }
2772     return ret;
2773 }
2774 
2775 /**
2776  * @brief Create asynchronous data.
2777  *
2778  * @param env The environment that the Node-API call is invoked under.
2779  *
2780  * @return Return a pointer to AbilityNameCB on success, nullptr on failure.
2781  */
CreateAbilityNameCBInfo(napi_env env)2782 AbilityNameCB *CreateAbilityNameCBInfo(napi_env env)
2783 {
2784     HILOG_INFO("%{public}s, called.", __func__);
2785     napi_value global = nullptr;
2786     NAPI_CALL(env, napi_get_global(env, &global));
2787 
2788     napi_value abilityObj = nullptr;
2789     NAPI_CALL(env, napi_get_named_property(env, global, "ability", &abilityObj));
2790 
2791     Ability *ability = nullptr;
2792     NAPI_CALL(env, napi_get_value_external(env, abilityObj, reinterpret_cast<void **>(&ability)));
2793 
2794     AbilityNameCB *abilityNameCB = new (std::nothrow) AbilityNameCB;
2795     if (abilityNameCB == nullptr) {
2796         HILOG_ERROR("%{public}s, abilityNameCB == nullptr.", __func__);
2797         return nullptr;
2798     }
2799     abilityNameCB->cbBase.cbInfo.env = env;
2800     abilityNameCB->cbBase.asyncWork = nullptr;
2801     abilityNameCB->cbBase.deferred = nullptr;
2802     abilityNameCB->cbBase.ability = ability;
2803 
2804     HILOG_INFO("%{public}s, end.", __func__);
2805     return abilityNameCB;
2806 }
2807 
WrapAbilityName(napi_env env,AbilityNameCB * abilityNameCB)2808 napi_value WrapAbilityName(napi_env env, AbilityNameCB *abilityNameCB)
2809 {
2810     HILOG_INFO("%{public}s, called.", __func__);
2811     if (abilityNameCB == nullptr) {
2812         HILOG_ERROR("%{public}s, Invalid param(abilityNameCB == nullptr)", __func__);
2813         return nullptr;
2814     }
2815     napi_value result = nullptr;
2816     NAPI_CALL(env, napi_create_string_utf8(env, abilityNameCB->name.c_str(), NAPI_AUTO_LENGTH, &result));
2817     HILOG_INFO("%{public}s, end.", __func__);
2818     return result;
2819 }
2820 
2821 /**
2822  * @brief GetAbilityName asynchronous processing function.
2823  *
2824  * @param env The environment that the Node-API call is invoked under.
2825  * @param data Point to asynchronous processing of data.
2826  */
GetAbilityNameExecuteCB(napi_env env,void * data)2827 void GetAbilityNameExecuteCB(napi_env env, void *data)
2828 {
2829     HILOG_INFO("%{public}s, called.", __func__);
2830     AbilityNameCB *abilityNameCB = static_cast<AbilityNameCB *>(data);
2831     if (abilityNameCB == nullptr) {
2832         HILOG_ERROR("%{public}s, abilityNameCB == nullptr", __func__);
2833         return;
2834     }
2835     abilityNameCB->cbBase.errCode = NAPI_ERR_NO_ERROR;
2836     if (abilityNameCB->cbBase.ability == nullptr) {
2837         HILOG_ERROR("%{public}s, ability == nullptr", __func__);
2838         abilityNameCB->cbBase.errCode = NAPI_ERR_ACE_ABILITY;
2839         return;
2840     }
2841 
2842     if (!CheckAbilityType(&abilityNameCB->cbBase)) {
2843         HILOG_ERROR("%{public}s, wrong ability type", __func__);
2844         abilityNameCB->cbBase.errCode = NAPI_ERR_ABILITY_TYPE_INVALID;
2845         return;
2846     }
2847 
2848     abilityNameCB->name = abilityNameCB->cbBase.ability->GetAbilityName();
2849     HILOG_INFO("%{public}s, end.", __func__);
2850 }
2851 
2852 /**
2853  * @brief The callback at the end of the asynchronous callback.
2854  *
2855  * @param env The environment that the Node-API call is invoked under.
2856  * @param data Point to asynchronous processing of data.
2857  */
GetAbilityNameAsyncCompleteCB(napi_env env,napi_status status,void * data)2858 void GetAbilityNameAsyncCompleteCB(napi_env env, napi_status status, void *data)
2859 {
2860     HILOG_INFO("%{public}s, called.", __func__);
2861     AbilityNameCB *abilityNameCB = static_cast<AbilityNameCB *>(data);
2862     napi_value callback = nullptr;
2863     napi_value undefined = nullptr;
2864     napi_value result[ARGS_TWO] = {nullptr};
2865     napi_value callResult = nullptr;
2866     NAPI_CALL_RETURN_VOID(env, napi_get_undefined(env, &undefined));
2867     result[PARAM0] = GetCallbackErrorValue(env, abilityNameCB->cbBase.errCode);
2868     if (abilityNameCB->cbBase.errCode == NAPI_ERR_NO_ERROR) {
2869         result[PARAM1] = WrapAbilityName(env, abilityNameCB);
2870     } else {
2871         result[PARAM1] = WrapUndefinedToJS(env);
2872     }
2873     NAPI_CALL_RETURN_VOID(env, napi_get_reference_value(env, abilityNameCB->cbBase.cbInfo.callback, &callback));
2874     NAPI_CALL_RETURN_VOID(env, napi_call_function(env, undefined, callback, ARGS_TWO, &result[PARAM0], &callResult));
2875     if (abilityNameCB->cbBase.cbInfo.callback != nullptr) {
2876         NAPI_CALL_RETURN_VOID(env, napi_delete_reference(env, abilityNameCB->cbBase.cbInfo.callback));
2877     }
2878     NAPI_CALL_RETURN_VOID(env, napi_delete_async_work(env, abilityNameCB->cbBase.asyncWork));
2879     delete abilityNameCB;
2880     abilityNameCB = nullptr;
2881     HILOG_INFO("%{public}s, end.", __func__);
2882 }
2883 
2884 /**
2885  * @brief The callback at the end of the Promise callback.
2886  *
2887  * @param env The environment that the Node-API call is invoked under.
2888  * @param data Point to asynchronous processing of data.
2889  */
GetAbilityNamePromiseCompleteCB(napi_env env,napi_status status,void * data)2890 void GetAbilityNamePromiseCompleteCB(napi_env env, napi_status status, void *data)
2891 {
2892     HILOG_INFO("NAPI_GetAbilityName, main event thread complete.");
2893     AbilityNameCB *abilityNameCB = static_cast<AbilityNameCB *>(data);
2894     napi_value result = nullptr;
2895     if (abilityNameCB->cbBase.errCode == NAPI_ERR_NO_ERROR) {
2896         result = WrapAbilityName(env, abilityNameCB);
2897         napi_resolve_deferred(env, abilityNameCB->cbBase.deferred, result);
2898     } else {
2899         result = GetCallbackErrorValue(env, abilityNameCB->cbBase.errCode);
2900         napi_reject_deferred(env, abilityNameCB->cbBase.deferred, result);
2901     }
2902 
2903     napi_delete_async_work(env, abilityNameCB->cbBase.asyncWork);
2904     delete abilityNameCB;
2905     abilityNameCB = nullptr;
2906     HILOG_INFO("NAPI_GetAbilityName, main event thread complete end.");
2907 }
2908 
2909 /**
2910  * @brief GetAbilityName Async.
2911  *
2912  * @param env The environment that the Node-API call is invoked under.
2913  * @param args Indicates the arguments passed into the callback.
2914  * @param argcPromise Asynchronous data processing.
2915  * @param abilityNameCB Process data asynchronously.
2916  *
2917  * @return Return JS data successfully, otherwise return nullptr.
2918  */
GetAbilityNameAsync(napi_env env,napi_value * args,const size_t argCallback,AbilityNameCB * abilityNameCB)2919 napi_value GetAbilityNameAsync(napi_env env, napi_value *args, const size_t argCallback, AbilityNameCB *abilityNameCB)
2920 {
2921     HILOG_INFO("%{public}s, asyncCallback.", __func__);
2922     if (args == nullptr || abilityNameCB == nullptr) {
2923         HILOG_ERROR("%{public}s, param == nullptr.", __func__);
2924         return nullptr;
2925     }
2926     napi_value resourceName = nullptr;
2927     NAPI_CALL(env, napi_create_string_latin1(env, __func__, NAPI_AUTO_LENGTH, &resourceName));
2928 
2929     napi_valuetype valuetype = napi_undefined;
2930     NAPI_CALL(env, napi_typeof(env, args[argCallback], &valuetype));
2931     if (valuetype == napi_function) {
2932         NAPI_CALL(env, napi_create_reference(env, args[argCallback], 1, &abilityNameCB->cbBase.cbInfo.callback));
2933     }
2934     NAPI_CALL(env,
2935         napi_create_async_work(env,
2936             nullptr,
2937             resourceName,
2938             GetAbilityNameExecuteCB,
2939             GetAbilityNameAsyncCompleteCB,
2940             static_cast<void *>(abilityNameCB),
2941             &abilityNameCB->cbBase.asyncWork));
2942     NAPI_CALL(env, napi_queue_async_work(env, abilityNameCB->cbBase.asyncWork));
2943     napi_value result = nullptr;
2944     NAPI_CALL(env, napi_get_null(env, &result));
2945     HILOG_INFO("%{public}s, asyncCallback end.", __func__);
2946     return result;
2947 }
2948 
2949 /**
2950  * @brief GetAbilityName Promise.
2951  *
2952  * @param env The environment that the Node-API call is invoked under.
2953  * @param abilityNameCB Process data asynchronously.
2954  *
2955  * @return Return JS data successfully, otherwise return nullptr.
2956  */
GetAbilityNamePromise(napi_env env,AbilityNameCB * abilityNameCB)2957 napi_value GetAbilityNamePromise(napi_env env, AbilityNameCB *abilityNameCB)
2958 {
2959     HILOG_INFO("%{public}s, promise.", __func__);
2960     if (abilityNameCB == nullptr) {
2961         HILOG_ERROR("%{public}s, param == nullptr.", __func__);
2962         return nullptr;
2963     }
2964     napi_value resourceName = nullptr;
2965     NAPI_CALL(env, napi_create_string_latin1(env, __func__, NAPI_AUTO_LENGTH, &resourceName));
2966     napi_deferred deferred;
2967     napi_value promise = nullptr;
2968     NAPI_CALL(env, napi_create_promise(env, &deferred, &promise));
2969     abilityNameCB->cbBase.deferred = deferred;
2970 
2971     NAPI_CALL(env,
2972         napi_create_async_work(env,
2973             nullptr,
2974             resourceName,
2975             GetAbilityNameExecuteCB,
2976             GetAbilityNamePromiseCompleteCB,
2977             static_cast<void *>(abilityNameCB),
2978             &abilityNameCB->cbBase.asyncWork));
2979     NAPI_CALL(env, napi_queue_async_work(env, abilityNameCB->cbBase.asyncWork));
2980     HILOG_INFO("%{public}s, promise end.", __func__);
2981     return promise;
2982 }
2983 
2984 /**
2985  * @brief GetAbilityName processing function.
2986  *
2987  * @param env The environment that the Node-API call is invoked under.
2988  * @param abilityNameCB Process data asynchronously.
2989  *
2990  * @return Return JS data successfully, otherwise return nullptr.
2991  */
GetAbilityNameWrap(napi_env env,napi_callback_info info,AbilityNameCB * abilityNameCB)2992 napi_value GetAbilityNameWrap(napi_env env, napi_callback_info info, AbilityNameCB *abilityNameCB)
2993 {
2994     HILOG_INFO("%{public}s, asyncCallback.", __func__);
2995     if (abilityNameCB == nullptr) {
2996         HILOG_ERROR("%{public}s, abilityNameCB == nullptr.", __func__);
2997         return nullptr;
2998     }
2999 
3000     size_t argcAsync = 1;
3001     const size_t argcPromise = 0;
3002     const size_t argCountWithAsync = argcPromise + ARGS_ASYNC_COUNT;
3003     napi_value args[ARGS_MAX_COUNT] = {nullptr};
3004     napi_value ret = nullptr;
3005 
3006     NAPI_CALL(env, napi_get_cb_info(env, info, &argcAsync, args, nullptr, nullptr));
3007     if (argcAsync > argCountWithAsync || argcAsync > ARGS_MAX_COUNT) {
3008         HILOG_ERROR("%{public}s, Wrong argument count.", __func__);
3009         return nullptr;
3010     }
3011 
3012     if (argcAsync > argcPromise) {
3013         ret = GetAbilityNameAsync(env, args, 0, abilityNameCB);
3014     } else {
3015         ret = GetAbilityNamePromise(env, abilityNameCB);
3016     }
3017     HILOG_INFO("%{public}s, asyncCallback end.", __func__);
3018     return ret;
3019 }
3020 
3021 /**
3022  * @brief Obtains the class name in this ability name, without the prefixed bundle name.
3023  *
3024  * @param env The environment that the Node-API call is invoked under.
3025  * @param info The callback info passed into the callback function.
3026  *
3027  * @return The return value from NAPI C++ to JS for the module.
3028  */
NAPI_GetAbilityNameCommon(napi_env env,napi_callback_info info,AbilityType abilityType)3029 napi_value NAPI_GetAbilityNameCommon(napi_env env, napi_callback_info info, AbilityType abilityType)
3030 {
3031     HILOG_INFO("%{public}s called.", __func__);
3032     AbilityNameCB *ablityNameCB = CreateAbilityNameCBInfo(env);
3033     if (ablityNameCB == nullptr) {
3034         HILOG_ERROR("%{public}s ablityNameCB == nullptr", __func__);
3035         return WrapVoidToJS(env);
3036     }
3037 
3038     ablityNameCB->cbBase.errCode = NAPI_ERR_NO_ERROR;
3039     ablityNameCB->cbBase.abilityType = abilityType;
3040     napi_value ret = GetAbilityNameWrap(env, info, ablityNameCB);
3041     if (ret == nullptr) {
3042         HILOG_ERROR("%{public}s ret == nullptr", __func__);
3043         if (ablityNameCB != nullptr) {
3044             delete ablityNameCB;
3045             ablityNameCB = nullptr;
3046         }
3047         ret = WrapVoidToJS(env);
3048     }
3049     HILOG_INFO("%{public}s end.", __func__);
3050     return ret;
3051 }
3052 
UnwrapAbilityStartSettingForNumber(napi_env env,const std::string key,napi_value param,AAFwk::AbilityStartSetting & setting)3053 void UnwrapAbilityStartSettingForNumber(
3054     napi_env env, const std::string key, napi_value param, AAFwk::AbilityStartSetting &setting)
3055 {
3056     int32_t natValue32 = 0;
3057     double natValueDouble = 0.0;
3058     bool isReadValue32 = false;
3059     bool isReadDouble = false;
3060     if (napi_get_value_int32(env, param, &natValue32) == napi_ok) {
3061         HILOG_INFO("%{public}s called. Property value=%{private}d.", __func__, natValue32);
3062         isReadValue32 = true;
3063     }
3064 
3065     if (napi_get_value_double(env, param, &natValueDouble) == napi_ok) {
3066         HILOG_INFO("%{public}s called. Property value=%{private}lf.", __func__, natValueDouble);
3067         isReadDouble = true;
3068     }
3069 
3070     if (isReadValue32 && isReadDouble) {
3071         if (abs(natValueDouble - natValue32 * 1.0) > 0.0) {
3072             setting.AddProperty(key, std::to_string(natValueDouble));
3073         } else {
3074             setting.AddProperty(key, std::to_string(natValue32));
3075         }
3076     } else if (isReadValue32) {
3077         setting.AddProperty(key, std::to_string(natValue32));
3078     } else if (isReadDouble) {
3079         setting.AddProperty(key, std::to_string(natValueDouble));
3080     }
3081 }
3082 
UnwrapAbilityStartSetting(napi_env env,napi_value param,AAFwk::AbilityStartSetting & setting)3083 bool UnwrapAbilityStartSetting(napi_env env, napi_value param, AAFwk::AbilityStartSetting &setting)
3084 {
3085     HILOG_INFO("%{public}s called.", __func__);
3086 
3087     if (!IsTypeForNapiValue(env, param, napi_object)) {
3088         return false;
3089     }
3090 
3091     napi_valuetype jsValueType = napi_undefined;
3092     napi_value jsProNameList = nullptr;
3093     uint32_t jsProCount = 0;
3094 
3095     NAPI_CALL_BASE(env, napi_get_property_names(env, param, &jsProNameList), false);
3096     NAPI_CALL_BASE(env, napi_get_array_length(env, jsProNameList, &jsProCount), false);
3097     HILOG_INFO("%{public}s called. Property size=%{public}d.", __func__, jsProCount);
3098 
3099     napi_value jsProName = nullptr;
3100     napi_value jsProValue = nullptr;
3101     for (uint32_t index = 0; index < jsProCount; index++) {
3102         NAPI_CALL_BASE(env, napi_get_element(env, jsProNameList, index, &jsProName), false);
3103 
3104         std::string strProName = UnwrapStringFromJS(env, jsProName);
3105         HILOG_INFO("%{public}s called. Property name=%{public}s.", __func__, strProName.c_str());
3106         NAPI_CALL_BASE(env, napi_get_named_property(env, param, strProName.c_str(), &jsProValue), false);
3107         NAPI_CALL_BASE(env, napi_typeof(env, jsProValue, &jsValueType), false);
3108 
3109         switch (jsValueType) {
3110             case napi_string: {
3111                 std::string natValue = UnwrapStringFromJS(env, jsProValue);
3112                 HILOG_INFO("%{public}s called. Property value=%{private}s.", __func__, natValue.c_str());
3113                 setting.AddProperty(strProName, natValue);
3114                 break;
3115             }
3116             case napi_boolean: {
3117                 bool natValue = false;
3118                 NAPI_CALL_BASE(env, napi_get_value_bool(env, jsProValue, &natValue), false);
3119                 HILOG_INFO("%{public}s called. Property value=%{public}s.", __func__, natValue ? "true" : "false");
3120                 setting.AddProperty(strProName, std::to_string(natValue));
3121                 break;
3122             }
3123             case napi_number:
3124                 UnwrapAbilityStartSettingForNumber(env, strProName, jsProValue, setting);
3125                 break;
3126             default:
3127                 break;
3128         }
3129     }
3130 
3131     return true;
3132 }
3133 
3134 /**
3135  * @brief Parse the parameters.
3136  *
3137  * @param param Indicates the parameters saved the parse result.
3138  * @param env The environment that the Node-API call is invoked under.
3139  * @param args Indicates the arguments passed into the callback.
3140  *
3141  * @return The return value from NAPI C++ to JS for the module.
3142  */
UnwrapParamForWant(napi_env env,napi_value args,AbilityType abilityType,CallAbilityParam & param)3143 bool UnwrapParamForWant(napi_env env, napi_value args, AbilityType abilityType, CallAbilityParam &param)
3144 {
3145     HILOG_INFO("%{public}s called.", __func__);
3146     bool ret = false;
3147     napi_valuetype valueType = napi_undefined;
3148     param.setting = nullptr;
3149     NAPI_CALL_BASE(env, napi_typeof(env, args, &valueType), false);
3150     if (valueType != napi_object) {
3151         HILOG_ERROR("%{public}s, Wrong argument type.", __func__);
3152         return false;
3153     }
3154 
3155     napi_value jsWant = GetPropertyValueByPropertyName(env, args, "want", napi_object);
3156     if (jsWant == nullptr) {
3157         HILOG_ERROR("%{public}s, jsWant == nullptr", __func__);
3158         return false;
3159     }
3160 
3161     ret = UnwrapWant(env, jsWant, param.want);
3162 
3163     napi_value jsSettingObj = GetPropertyValueByPropertyName(env, args, "abilityStartSetting", napi_object);
3164     if (jsSettingObj != nullptr) {
3165         param.setting = AbilityStartSetting::GetEmptySetting();
3166         if (!UnwrapAbilityStartSetting(env, jsSettingObj, *(param.setting))) {
3167             HILOG_ERROR("%{public}s, unwrap abilityStartSetting falied.", __func__);
3168         }
3169         HILOG_INFO("%{public}s abilityStartSetting", __func__);
3170     }
3171 
3172     HILOG_INFO("%{public}s end.", __func__);
3173     return ret;
3174 }
3175 
StartAbilityExecuteCB(napi_env env,void * data)3176 void StartAbilityExecuteCB(napi_env env, void *data)
3177 {
3178     HILOG_INFO("%{public}s called.", __func__);
3179     AsyncCallbackInfo *asyncCallbackInfo = (AsyncCallbackInfo *)data;
3180     if (asyncCallbackInfo == nullptr) {
3181         HILOG_ERROR("%{public}s asyncCallbackInfo == nullptr", __func__);
3182         return;
3183     }
3184     if (asyncCallbackInfo->errCode != NAPI_ERR_NO_ERROR) {
3185         HILOG_ERROR("%{public}s errCode:%{public}d", __func__, asyncCallbackInfo->errCode);
3186         return;
3187     }
3188     if (asyncCallbackInfo->ability == nullptr) {
3189         asyncCallbackInfo->errCode = NAPI_ERR_ACE_ABILITY;
3190         HILOG_ERROR("%{public}s ability == nullptr", __func__);
3191         return;
3192     }
3193     if (!CheckAbilityType(asyncCallbackInfo)) {
3194         HILOG_ERROR("%{public}s wrong ability type", __func__);
3195         asyncCallbackInfo->errCode = NAPI_ERR_ABILITY_TYPE_INVALID;
3196         return;
3197     }
3198 #ifdef SUPPORT_GRAPHICS
3199     // inherit split mode
3200     auto windowMode = asyncCallbackInfo->ability->GetCurrentWindowMode();
3201     if (windowMode == AbilityWindowConfiguration::MULTI_WINDOW_DISPLAY_PRIMARY ||
3202         windowMode == AbilityWindowConfiguration::MULTI_WINDOW_DISPLAY_SECONDARY) {
3203         asyncCallbackInfo->param.want.SetParam(Want::PARAM_RESV_WINDOW_MODE, windowMode);
3204     }
3205     HILOG_INFO("window mode is %{public}d", windowMode);
3206 
3207     // follow orientation
3208     asyncCallbackInfo->param.want.SetParam("ohos.aafwk.Orientation", 0);
3209     if (windowMode != AbilityWindowConfiguration::MULTI_WINDOW_DISPLAY_FLOATING) {
3210         auto orientation = asyncCallbackInfo->ability->GetDisplayOrientation();
3211         asyncCallbackInfo->param.want.SetParam("ohos.aafwk.Orientation", orientation);
3212         HILOG_DEBUG("%{public}s display orientation is %{public}d", __func__, orientation);
3213     }
3214 #endif
3215     ErrCode ret = ERR_OK;
3216     if (asyncCallbackInfo->param.setting == nullptr) {
3217         HILOG_INFO("%{public}s param.setting == nullptr call StartAbility.", __func__);
3218         ret = asyncCallbackInfo->ability->StartAbility(asyncCallbackInfo->param.want);
3219     } else {
3220         HILOG_INFO("%{public}s param.setting != nullptr call StartAbility.", __func__);
3221         ret = asyncCallbackInfo->ability->StartAbility(asyncCallbackInfo->param.want,
3222             *(asyncCallbackInfo->param.setting));
3223     }
3224     if (ret != ERR_OK) {
3225         asyncCallbackInfo->errCode = ret;
3226     }
3227     HILOG_INFO("%{public}s end. ret:%{public}d", __func__, ret);
3228 }
3229 
StartAbilityCallbackCompletedCB(napi_env env,napi_status status,void * data)3230 void StartAbilityCallbackCompletedCB(napi_env env, napi_status status, void *data)
3231 {
3232     HILOG_INFO("%{public}s called.", __func__);
3233     AsyncCallbackInfo *asyncCallbackInfo = static_cast<AsyncCallbackInfo *>(data);
3234     napi_value callback = nullptr;
3235     napi_value undefined = nullptr;
3236     napi_value result[ARGS_TWO] = {nullptr};
3237     napi_value callResult = nullptr;
3238     napi_get_undefined(env, &undefined);
3239 
3240     int32_t errCode = GetStartAbilityErrorCode(asyncCallbackInfo->errCode);
3241     result[PARAM0] = GetCallbackErrorValue(env, errCode);
3242     if (asyncCallbackInfo->errCode == NAPI_ERR_NO_ERROR) {
3243         napi_create_int32(env, 0, &result[PARAM1]);
3244     } else {
3245         result[PARAM1] = WrapUndefinedToJS(env);
3246     }
3247 
3248     napi_get_reference_value(env, asyncCallbackInfo->cbInfo.callback, &callback);
3249     napi_call_function(env, undefined, callback, ARGS_TWO, &result[PARAM0], &callResult);
3250 
3251     if (asyncCallbackInfo->cbInfo.callback != nullptr) {
3252         napi_delete_reference(env, asyncCallbackInfo->cbInfo.callback);
3253     }
3254     napi_delete_async_work(env, asyncCallbackInfo->asyncWork);
3255     delete asyncCallbackInfo;
3256     asyncCallbackInfo = nullptr;
3257     HILOG_INFO("%{public}s end.", __func__);
3258 }
3259 
StartAbilityPromiseCompletedCB(napi_env env,napi_status status,void * data)3260 void StartAbilityPromiseCompletedCB(napi_env env, napi_status status, void *data)
3261 {
3262     HILOG_INFO("%{public}s called.", __func__);
3263     AsyncCallbackInfo *asyncCallbackInfo = static_cast<AsyncCallbackInfo *>(data);
3264     napi_value result = nullptr;
3265     if (asyncCallbackInfo->errCode == NAPI_ERR_NO_ERROR) {
3266         napi_create_int32(env, 0, &result);
3267         napi_resolve_deferred(env, asyncCallbackInfo->deferred, result);
3268     } else {
3269         int32_t errCode = GetStartAbilityErrorCode(asyncCallbackInfo->errCode);
3270         result = GetCallbackErrorValue(env, errCode);
3271         napi_reject_deferred(env, asyncCallbackInfo->deferred, result);
3272     }
3273 
3274     napi_delete_async_work(env, asyncCallbackInfo->asyncWork);
3275     HILOG_INFO("%{public}s, end.", __func__);
3276     delete asyncCallbackInfo;
3277 }
3278 
StartAbilityAsync(napi_env env,napi_value * args,const size_t argCallback,AsyncCallbackInfo * asyncCallbackInfo)3279 napi_value StartAbilityAsync(
3280     napi_env env, napi_value *args, const size_t argCallback, AsyncCallbackInfo *asyncCallbackInfo)
3281 {
3282     HILOG_INFO("%{public}s async call.", __func__);
3283     if (args == nullptr || asyncCallbackInfo == nullptr) {
3284         HILOG_ERROR("%{public}s, param == nullptr.", __func__);
3285         return nullptr;
3286     }
3287     napi_value resourceName = nullptr;
3288     NAPI_CALL(env, napi_create_string_latin1(env, __func__, NAPI_AUTO_LENGTH, &resourceName));
3289 
3290     napi_valuetype valuetype = napi_undefined;
3291     NAPI_CALL(env, napi_typeof(env, args[argCallback], &valuetype));
3292     if (valuetype == napi_function) {
3293         NAPI_CALL(env, napi_create_reference(env, args[argCallback], 1, &asyncCallbackInfo->cbInfo.callback));
3294     }
3295 
3296     NAPI_CALL(env,
3297         napi_create_async_work(env,
3298             nullptr,
3299             resourceName,
3300             StartAbilityExecuteCB,
3301             StartAbilityCallbackCompletedCB,
3302             static_cast<void *>(asyncCallbackInfo),
3303             &asyncCallbackInfo->asyncWork));
3304     NAPI_CALL(env, napi_queue_async_work(env, asyncCallbackInfo->asyncWork));
3305 
3306     HILOG_INFO("%{public}s async end.", __func__);
3307     return WrapVoidToJS(env);
3308 }
3309 
StartAbilityPromise(napi_env env,AsyncCallbackInfo * asyncCallbackInfo)3310 napi_value StartAbilityPromise(napi_env env, AsyncCallbackInfo *asyncCallbackInfo)
3311 {
3312     HILOG_INFO("%{public}s promise call.", __func__);
3313     if (asyncCallbackInfo == nullptr) {
3314         HILOG_ERROR("%{public}s, param == nullptr.", __func__);
3315         return nullptr;
3316     }
3317     napi_value resourceName;
3318     NAPI_CALL(env, napi_create_string_latin1(env, __func__, NAPI_AUTO_LENGTH, &resourceName));
3319     napi_deferred deferred;
3320     napi_value promise = nullptr;
3321     NAPI_CALL(env, napi_create_promise(env, &deferred, &promise));
3322     asyncCallbackInfo->deferred = deferred;
3323 
3324     NAPI_CALL(env,
3325         napi_create_async_work(env,
3326             nullptr,
3327             resourceName,
3328             StartAbilityExecuteCB,
3329             StartAbilityPromiseCompletedCB,
3330             static_cast<void *>(asyncCallbackInfo),
3331             &asyncCallbackInfo->asyncWork));
3332     NAPI_CALL(env, napi_queue_async_work(env, asyncCallbackInfo->asyncWork));
3333     HILOG_INFO("%{public}s promise end.", __func__);
3334     return promise;
3335 }
3336 
3337 /**
3338  * @brief StartAbility processing function.
3339  *
3340  * @param env The environment that the Node-API call is invoked under.
3341  * @param asyncCallbackInfo Process data asynchronously.
3342  *
3343  * @return Return JS data successfully, otherwise return nullptr.
3344  */
StartAbilityWrap(napi_env env,napi_callback_info info,AsyncCallbackInfo * asyncCallbackInfo)3345 napi_value StartAbilityWrap(napi_env env, napi_callback_info info, AsyncCallbackInfo *asyncCallbackInfo)
3346 {
3347     HILOG_INFO("%{public}s called.", __func__);
3348     size_t argcAsync = 2;
3349     const size_t argcPromise = 1;
3350     const size_t argCountWithAsync = argcPromise + ARGS_ASYNC_COUNT;
3351     napi_value args[ARGS_MAX_COUNT] = {nullptr};
3352     napi_value ret = nullptr;
3353     asyncCallbackInfo->errCode = NAPI_ERR_NO_ERROR;
3354     NAPI_CALL(env, napi_get_cb_info(env, info, &argcAsync, args, nullptr, nullptr));
3355     if (argcAsync > argCountWithAsync || argcAsync > ARGS_MAX_COUNT) {
3356         HILOG_ERROR("%{public}s, Wrong argument count.", __func__);
3357         asyncCallbackInfo->errCode = NAPI_ERR_PARAM_INVALID;
3358     } else {
3359         CallAbilityParam param;
3360         if (UnwrapParamForWant(env, args[PARAM0], asyncCallbackInfo->abilityType, param)) {
3361             asyncCallbackInfo->param = param;
3362         } else {
3363             HILOG_ERROR("%{public}s, call UnwrapParamForWant failed.", __func__);
3364             asyncCallbackInfo->errCode = NAPI_ERR_PARAM_INVALID;
3365         }
3366     }
3367     if (argcAsync > argcPromise) {
3368         ret = StartAbilityAsync(env, args, 1, asyncCallbackInfo);
3369     } else {
3370         ret = StartAbilityPromise(env, asyncCallbackInfo);
3371     }
3372 
3373     HILOG_INFO("%{public}s end.", __func__);
3374     return ret;
3375 }
3376 
3377 /**
3378  * @brief startAbility.
3379  *
3380  * @param env The environment that the Node-API call is invoked under.
3381  * @param info The callback info passed into the callback function.
3382  *
3383  * @return The return value from NAPI C++ to JS for the module.
3384  */
NAPI_StartAbilityCommon(napi_env env,napi_callback_info info,AbilityType abilityType)3385 napi_value NAPI_StartAbilityCommon(napi_env env, napi_callback_info info, AbilityType abilityType)
3386 {
3387     HILOG_INFO("%{public}s called.", __func__);
3388     AsyncCallbackInfo *asyncCallbackInfo = CreateAsyncCallbackInfo(env);
3389     if (asyncCallbackInfo == nullptr) {
3390         HILOG_ERROR("%{public}s asyncCallbackInfo == nullpter", __func__);
3391         return WrapVoidToJS(env);
3392     }
3393 
3394     asyncCallbackInfo->errCode = NAPI_ERR_NO_ERROR;
3395     asyncCallbackInfo->abilityType = abilityType;
3396     napi_value ret = StartAbilityWrap(env, info, asyncCallbackInfo);
3397     if (ret == nullptr) {
3398         HILOG_ERROR("%{public}s ret == nullpter", __func__);
3399         if (asyncCallbackInfo != nullptr) {
3400             delete asyncCallbackInfo;
3401             asyncCallbackInfo = nullptr;
3402         }
3403         ret = WrapVoidToJS(env);
3404     }
3405     HILOG_INFO("%{public}s end.", __func__);
3406     return ret;
3407 }
3408 
UnwrapParamStopAbilityWrap(napi_env env,size_t argc,napi_value * argv,AsyncJSCallbackInfo * asyncCallbackInfo)3409 bool UnwrapParamStopAbilityWrap(napi_env env, size_t argc, napi_value *argv, AsyncJSCallbackInfo *asyncCallbackInfo)
3410 {
3411     HILOG_INFO("%{public}s called, argc=%{public}zu", __func__, argc);
3412     const size_t argcMax = 2;
3413     if (argc > argcMax || argc < argcMax - 1) {
3414         HILOG_ERROR("%{public}s, Params is invalid.", __func__);
3415         return false;
3416     }
3417 
3418     if (argc == argcMax) {
3419         if (!CreateAsyncCallback(env, argv[PARAM1], asyncCallbackInfo)) {
3420             HILOG_INFO("%{public}s, the second parameter is invalid.", __func__);
3421             return false;
3422         }
3423     }
3424 
3425     return UnwrapWant(env, argv[PARAM0], asyncCallbackInfo->param.want);
3426 }
3427 
StopAbilityExecuteCallback(napi_env env,void * data)3428 void StopAbilityExecuteCallback(napi_env env, void *data)
3429 {
3430     HILOG_INFO("%{public}s called.", __func__);
3431     AsyncJSCallbackInfo *asyncCallbackInfo = static_cast<AsyncJSCallbackInfo *>(data);
3432     if (asyncCallbackInfo == nullptr) {
3433         HILOG_ERROR("%{public}s asyncCallbackInfo is null", __func__);
3434         return;
3435     }
3436 
3437     asyncCallbackInfo->error_code = NAPI_ERR_NO_ERROR;
3438     asyncCallbackInfo->native_data.data_type = NVT_NONE;
3439 
3440     if (asyncCallbackInfo->ability == nullptr) {
3441         HILOG_ERROR("%{public}s ability is null", __func__);
3442         asyncCallbackInfo->error_code = NAPI_ERR_ACE_ABILITY;
3443         return;
3444     }
3445 
3446     if (!CheckAbilityType(asyncCallbackInfo)) {
3447         HILOG_ERROR("%{public}s wrong ability type", __func__);
3448         asyncCallbackInfo->error_code = NAPI_ERR_ABILITY_TYPE_INVALID;
3449         asyncCallbackInfo->native_data.data_type = NVT_UNDEFINED;
3450         return;
3451     }
3452 
3453     asyncCallbackInfo->native_data.data_type = NVT_BOOL;
3454     asyncCallbackInfo->native_data.bool_value = asyncCallbackInfo->ability->StopAbility(asyncCallbackInfo->param.want);
3455     HILOG_INFO("%{public}s end.", __func__);
3456 }
3457 
StopAbilityWrap(napi_env env,napi_callback_info info,AsyncJSCallbackInfo * asyncCallbackInfo)3458 napi_value StopAbilityWrap(napi_env env, napi_callback_info info, AsyncJSCallbackInfo *asyncCallbackInfo)
3459 {
3460     HILOG_INFO("%{public}s called.", __func__);
3461     size_t argc = ARGS_MAX_COUNT;
3462     napi_value args[ARGS_MAX_COUNT] = {nullptr};
3463     napi_value jsthis = nullptr;
3464     void *data = nullptr;
3465 
3466     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &jsthis, &data));
3467 
3468     if (!UnwrapParamStopAbilityWrap(env, argc, args, asyncCallbackInfo)) {
3469         HILOG_INFO("%{public}s called. Invoke UnwrapParamStopAbility fail", __func__);
3470         return nullptr;
3471     }
3472 
3473     AsyncParamEx asyncParamEx;
3474     if (asyncCallbackInfo->cbInfo.callback != nullptr) {
3475         HILOG_INFO("%{public}s called. asyncCallback.", __func__);
3476         asyncParamEx.resource = "NAPI_StopAbilityWrapCallback";
3477         asyncParamEx.execute = StopAbilityExecuteCallback;
3478         asyncParamEx.complete = CompleteAsyncCallbackWork;
3479 
3480         return ExecuteAsyncCallbackWork(env, asyncCallbackInfo, &asyncParamEx);
3481     } else {
3482         HILOG_INFO("%{public}s called. promise.", __func__);
3483         asyncParamEx.resource = "NAPI_StopAbilityWrapPromise";
3484         asyncParamEx.execute = StopAbilityExecuteCallback;
3485         asyncParamEx.complete = CompletePromiseCallbackWork;
3486 
3487         return ExecutePromiseCallbackWork(env, asyncCallbackInfo, &asyncParamEx);
3488     }
3489 }
3490 
3491 /**
3492  * @brief stopAbility.
3493  *
3494  * @param env The environment that the Node-API call is invoked under.
3495  * @param info The callback info passed into the callback function.
3496  *
3497  * @return The return value from NAPI C++ to JS for the module.
3498  */
NAPI_StopAbilityCommon(napi_env env,napi_callback_info info,AbilityType abilityType)3499 napi_value NAPI_StopAbilityCommon(napi_env env, napi_callback_info info, AbilityType abilityType)
3500 {
3501     HILOG_INFO("%{public}s called.", __func__);
3502     AsyncJSCallbackInfo *asyncCallbackInfo = CreateAsyncJSCallbackInfo(env);
3503     if (asyncCallbackInfo == nullptr) {
3504         HILOG_ERROR("%{public}s. Invoke CreateAsyncJSCallbackInfo failed.", __func__);
3505         return WrapVoidToJS(env);
3506     }
3507 
3508     asyncCallbackInfo->error_code = NAPI_ERR_NO_ERROR;
3509     asyncCallbackInfo->abilityType = abilityType;
3510     napi_value ret = StopAbilityWrap(env, info, asyncCallbackInfo);
3511     if (ret == nullptr) {
3512         HILOG_ERROR("%{public}s. ret == nullptr", __func__);
3513         FreeAsyncJSCallbackInfo(&asyncCallbackInfo);
3514         ret = WrapVoidToJS(env);
3515     }
3516     HILOG_INFO("%{public}s end.", __func__);
3517     return ret;
3518 }
3519 
AddConnectionCallback(std::shared_ptr<ConnectionCallback> callback)3520 void NAPIAbilityConnection::AddConnectionCallback(std::shared_ptr<ConnectionCallback> callback)
3521 {
3522     std::lock_guard<std::mutex> guard(lock_);
3523     callbacks_.emplace_back(callback);
3524 }
3525 
GetConnectionState() const3526 int NAPIAbilityConnection::GetConnectionState() const
3527 {
3528     std::lock_guard<std::mutex> guard(lock_);
3529     return connectionState_;
3530 }
3531 
SetConnectionState(int connectionState)3532 void NAPIAbilityConnection::SetConnectionState(int connectionState)
3533 {
3534     std::lock_guard<std::mutex> guard(lock_);
3535     connectionState_ = connectionState;
3536 }
3537 
GetCallbackSize()3538 size_t NAPIAbilityConnection::GetCallbackSize()
3539 {
3540     std::lock_guard<std::mutex> guard(lock_);
3541     return callbacks_.size();
3542 }
3543 
ReomveAllCallbacks(ConnectRemoveKeyType key)3544 size_t NAPIAbilityConnection::ReomveAllCallbacks(ConnectRemoveKeyType key)
3545 {
3546     HILOG_DEBUG("ReomveAllCallbacks begin");
3547     size_t result = 0;
3548     std::lock_guard<std::mutex> guard(lock_);
3549     for (auto it = callbacks_.begin(); it != callbacks_.end();) {
3550         auto callback = *it;
3551         if (callback && callback->removeKey == key) {
3552             it = callbacks_.erase(it);
3553             result++;
3554         } else {
3555             ++it;
3556         }
3557     }
3558     HILOG_DEBUG("ReomveAllCallbacks removed size:%{public}zu, left size:%{public}zu", result, callbacks_.size());
3559     return result;
3560 }
3561 
UvWorkOnAbilityConnectDone(uv_work_t * work,int status)3562 void UvWorkOnAbilityConnectDone(uv_work_t *work, int status)
3563 {
3564     HILOG_INFO("UvWorkOnAbilityConnectDone, uv_queue_work");
3565     std::unique_ptr<uv_work_t> managedWork(work);
3566     if (work == nullptr) {
3567         HILOG_ERROR("UvWorkOnAbilityConnectDone, work is null");
3568         return;
3569     }
3570     // JS Thread
3571     std::unique_ptr<ConnectAbilityCB> connectAbilityCB(static_cast<ConnectAbilityCB *>(work->data));
3572     if (connectAbilityCB == nullptr) {
3573         HILOG_ERROR("UvWorkOnAbilityConnectDone, connectAbilityCB is null");
3574         return;
3575     }
3576     CallbackInfo &cbInfo = connectAbilityCB->cbBase.cbInfo;
3577     napi_handle_scope scope = nullptr;
3578     napi_open_handle_scope(cbInfo.env, &scope);
3579     if (scope == nullptr) {
3580         HILOG_ERROR("napi_open_handle_scope failed");
3581         return;
3582     }
3583     napi_value result[ARGS_TWO] = {nullptr};
3584     result[PARAM0] =
3585         WrapElementName(cbInfo.env, connectAbilityCB->abilityConnectionCB.elementName);
3586 
3587     napi_value globalValue;
3588     napi_get_global(cbInfo.env, &globalValue);
3589     napi_value func;
3590     napi_get_named_property(cbInfo.env, globalValue, "requireNapi", &func);
3591 
3592     napi_value rpcInfo;
3593     napi_create_string_utf8(cbInfo.env, "rpc", NAPI_AUTO_LENGTH, &rpcInfo);
3594     napi_value funcArgv[1] = { rpcInfo };
3595     napi_value returnValue;
3596     napi_call_function(cbInfo.env, globalValue, func, 1, funcArgv, &returnValue);
3597 
3598     napi_value jsRemoteObject = NAPI_ohos_rpc_CreateJsRemoteObject(
3599         cbInfo.env, connectAbilityCB->abilityConnectionCB.connection);
3600     result[PARAM1] = jsRemoteObject;
3601 
3602     napi_value callback = nullptr;
3603     napi_value undefined = nullptr;
3604     napi_get_undefined(cbInfo.env, &undefined);
3605     napi_value callResult = nullptr;
3606     napi_get_reference_value(cbInfo.env, cbInfo.callback, &callback);
3607 
3608     napi_call_function(
3609         cbInfo.env, undefined, callback, ARGS_TWO, &result[PARAM0], &callResult);
3610     if (cbInfo.callback != nullptr) {
3611         napi_delete_reference(cbInfo.env, cbInfo.callback);
3612     }
3613     napi_close_handle_scope(cbInfo.env, scope);
3614     HILOG_INFO("UvWorkOnAbilityConnectDone, uv_queue_work end");
3615 }
3616 
HandleOnAbilityConnectDone(ConnectionCallback & callback,int resultCode)3617 void NAPIAbilityConnection::HandleOnAbilityConnectDone(ConnectionCallback &callback, int resultCode)
3618 {
3619     HILOG_INFO("%{public}s called.", __func__);
3620     uv_loop_s *loop = nullptr;
3621     napi_get_uv_event_loop(callback.env, &loop);
3622     if (loop == nullptr) {
3623         HILOG_ERROR("%{public}s, loop == nullptr.", __func__);
3624         return;
3625     }
3626 
3627     uv_work_t *work = new(std::nothrow) uv_work_t;
3628     if (work == nullptr) {
3629         HILOG_ERROR("%{public}s, work == nullptr.", __func__);
3630         return;
3631     }
3632 
3633     ConnectAbilityCB *connectAbilityCB = new (std::nothrow) ConnectAbilityCB;
3634     if (connectAbilityCB == nullptr) {
3635         HILOG_ERROR("%{public}s, connectAbilityCB == nullptr.", __func__);
3636         if (work != nullptr) {
3637             delete work;
3638             work = nullptr;
3639         }
3640         return;
3641     }
3642     connectAbilityCB->cbBase.cbInfo.env = callback.env;
3643     connectAbilityCB->cbBase.cbInfo.callback = callback.connectCallbackRef;
3644     callback.connectCallbackRef = nullptr;
3645     connectAbilityCB->abilityConnectionCB.elementName = element_;
3646     connectAbilityCB->abilityConnectionCB.resultCode = resultCode;
3647     connectAbilityCB->abilityConnectionCB.connection = serviceRemoteObject_;
3648     work->data = static_cast<void *>(connectAbilityCB);
3649 
3650     int rev = uv_queue_work(
3651         loop, work, [](uv_work_t *work) {}, UvWorkOnAbilityConnectDone);
3652     if (rev != 0) {
3653         if (connectAbilityCB != nullptr) {
3654             delete connectAbilityCB;
3655             connectAbilityCB = nullptr;
3656         }
3657         if (work != nullptr) {
3658             delete work;
3659             work = nullptr;
3660         }
3661     }
3662 }
3663 
OnAbilityConnectDone(const AppExecFwk::ElementName & element,const sptr<IRemoteObject> & remoteObject,int resultCode)3664 void NAPIAbilityConnection::OnAbilityConnectDone(
3665     const AppExecFwk::ElementName &element, const sptr<IRemoteObject> &remoteObject, int resultCode)
3666 {
3667     HILOG_INFO("%{public}s bundleName:%{public}s abilityName:%{public}s, resultCode:%{public}d",
3668         __func__, element.GetBundleName().c_str(), element.GetAbilityName().c_str(), resultCode);
3669     if (remoteObject == nullptr) {
3670         HILOG_ERROR("%{public}s, remoteObject == nullptr.", __func__);
3671         return;
3672     }
3673     std::lock_guard<std::mutex> guard(lock_);
3674     element_ = element;
3675     serviceRemoteObject_ = remoteObject;
3676     for (const auto &callback : callbacks_) {
3677         HandleOnAbilityConnectDone(*callback, resultCode);
3678     }
3679     connectionState_ = CONNECTION_STATE_CONNECTED;
3680     HILOG_INFO("%{public}s, end.", __func__);
3681 }
3682 
UvWorkOnAbilityDisconnectDone(uv_work_t * work,int status)3683 void UvWorkOnAbilityDisconnectDone(uv_work_t *work, int status)
3684 {
3685     HILOG_INFO("UvWorkOnAbilityDisconnectDone, uv_queue_work");
3686     std::unique_ptr<uv_work_t> managedWork(work);
3687     if (work == nullptr) {
3688         HILOG_ERROR("UvWorkOnAbilityDisconnectDone, work is null");
3689         return;
3690     }
3691     // JS Thread
3692     std::unique_ptr<ConnectAbilityCB> connectAbilityCB(static_cast<ConnectAbilityCB *>(work->data));
3693     if (connectAbilityCB == nullptr) {
3694         HILOG_ERROR("UvWorkOnAbilityDisconnectDone, connectAbilityCB is null");
3695         return;
3696     }
3697     CallbackInfo &cbInfo = connectAbilityCB->cbBase.cbInfo;
3698     napi_handle_scope scope = nullptr;
3699     napi_open_handle_scope(cbInfo.env, &scope);
3700     if (scope == nullptr) {
3701         HILOG_ERROR("napi_open_handle_scope failed");
3702         return;
3703     }
3704     napi_value result = WrapElementName(cbInfo.env, connectAbilityCB->abilityConnectionCB.elementName);
3705     if (cbInfo.callback != nullptr) {
3706         napi_value callback = nullptr;
3707         napi_value callResult = nullptr;
3708         napi_value undefined = nullptr;
3709         napi_get_undefined(cbInfo.env, &undefined);
3710         napi_get_reference_value(cbInfo.env, cbInfo.callback, &callback);
3711         napi_call_function(cbInfo.env, undefined, callback, ARGS_ONE, &result, &callResult);
3712         napi_delete_reference(cbInfo.env, cbInfo.callback);
3713         cbInfo.callback = nullptr;
3714     }
3715     napi_close_handle_scope(cbInfo.env, scope);
3716 
3717     // release connect
3718     if (g_connectionManager) {
3719         g_connectionManager->RemoveConnection(connectAbilityCB->abilityConnectionCB.elementName.GetDeviceID(),
3720                                               connectAbilityCB->abilityConnectionCB.elementName.GetBundleName(),
3721                                               connectAbilityCB->abilityConnectionCB.elementName.GetAbilityName());
3722     }
3723     HILOG_INFO("UvWorkOnAbilityDisconnectDone, uv_queue_work end");
3724 }
3725 
HandleOnAbilityDisconnectDone(ConnectionCallback & callback,int resultCode)3726 void NAPIAbilityConnection::HandleOnAbilityDisconnectDone(ConnectionCallback &callback, int resultCode)
3727 {
3728     HILOG_INFO("%{public}s called.", __func__);
3729     uv_loop_s *loop = nullptr;
3730     napi_get_uv_event_loop(callback.env, &loop);
3731     if (loop == nullptr) {
3732         HILOG_ERROR("%{public}s, loop == nullptr.", __func__);
3733         return;
3734     }
3735 
3736     uv_work_t *work = new(std::nothrow) uv_work_t;
3737     if (work == nullptr) {
3738         HILOG_ERROR("%{public}s, work == nullptr.", __func__);
3739         return;
3740     }
3741 
3742     ConnectAbilityCB *connectAbilityCB = new (std::nothrow) ConnectAbilityCB;
3743     if (connectAbilityCB == nullptr) {
3744         HILOG_ERROR("%{public}s, connectAbilityCB == nullptr.", __func__);
3745         if (work != nullptr) {
3746             delete work;
3747             work = nullptr;
3748         }
3749         return;
3750     }
3751 
3752     connectAbilityCB->cbBase.cbInfo.env = callback.env;
3753     connectAbilityCB->cbBase.cbInfo.callback = callback.disconnectCallbackRef;
3754     callback.disconnectCallbackRef = nullptr;
3755     connectAbilityCB->abilityConnectionCB.elementName = element_;
3756     connectAbilityCB->abilityConnectionCB.resultCode = resultCode;
3757     work->data = static_cast<void *>(connectAbilityCB);
3758 
3759     int rev = uv_queue_work(
3760         loop, work, [](uv_work_t *work) {}, UvWorkOnAbilityDisconnectDone);
3761     if (rev != 0) {
3762         if (connectAbilityCB != nullptr) {
3763             delete connectAbilityCB;
3764             connectAbilityCB = nullptr;
3765         }
3766         if (work != nullptr) {
3767             delete work;
3768             work = nullptr;
3769         }
3770     }
3771 }
3772 
OnAbilityDisconnectDone(const AppExecFwk::ElementName & element,int resultCode)3773 void NAPIAbilityConnection::OnAbilityDisconnectDone(const AppExecFwk::ElementName &element, int resultCode)
3774 {
3775     HILOG_INFO("%{public}s bundleName:%{public}s abilityName:%{public}s, resultCode:%{public}d",
3776         __func__, element.GetBundleName().c_str(), element.GetAbilityName().c_str(), resultCode);
3777     std::lock_guard<std::mutex> guard(lock_);
3778     element_ = element;
3779     for (const auto &callback : callbacks_) {
3780         HandleOnAbilityDisconnectDone(*callback, resultCode);
3781     }
3782     connectionState_ = CONNECTION_STATE_DISCONNECTED;
3783     HILOG_INFO("%{public}s, end.", __func__);
3784 }
3785 
3786 /**
3787  * @brief AcquireDataAbilityHelper.
3788  *
3789  * @param env The environment that the Node-API call is invoked under.
3790  * @param info The callback info passed into the callback function.
3791  *
3792  * @return The return value from NAPI C++ to JS for the module.
3793  */
NAPI_AcquireDataAbilityHelperCommon(napi_env env,napi_callback_info info,AbilityType abilityType)3794 napi_value NAPI_AcquireDataAbilityHelperCommon(napi_env env, napi_callback_info info, AbilityType abilityType)
3795 {
3796     HILOG_INFO("%{public}s,called", __func__);
3797     DataAbilityHelperCB *dataAbilityHelperCB = new DataAbilityHelperCB;
3798     dataAbilityHelperCB->cbBase.cbInfo.env = env;
3799     dataAbilityHelperCB->cbBase.ability = nullptr; // temporary value assignment
3800     dataAbilityHelperCB->cbBase.errCode = NAPI_ERR_NO_ERROR;
3801     dataAbilityHelperCB->cbBase.abilityType = abilityType;
3802     napi_value ret = AcquireDataAbilityHelperWrap(env, info, dataAbilityHelperCB);
3803     if (ret == nullptr) {
3804         HILOG_ERROR("%{public}s, ret == nullptr", __func__);
3805         if (dataAbilityHelperCB != nullptr) {
3806             delete dataAbilityHelperCB;
3807             dataAbilityHelperCB = nullptr;
3808         }
3809         ret = WrapVoidToJS(env);
3810     }
3811     HILOG_INFO("%{public}s,end", __func__);
3812     return ret;
3813 }
3814 
3815 /**
3816  * @brief acquireDataAbilityHelper processing function.
3817  *
3818  * @param env The environment that the Node-API call is invoked under.
3819  * @param dataAbilityHelperCB Process data asynchronously.
3820  *
3821  * @return Return JS data successfully, otherwise return nullptr.
3822  */
AcquireDataAbilityHelperWrap(napi_env env,napi_callback_info info,DataAbilityHelperCB * dataAbilityHelperCB)3823 napi_value AcquireDataAbilityHelperWrap(napi_env env, napi_callback_info info, DataAbilityHelperCB *dataAbilityHelperCB)
3824 {
3825     HILOG_INFO("%{public}s,called", __func__);
3826     if (dataAbilityHelperCB == nullptr) {
3827         HILOG_ERROR("%{public}s,dataAbilityHelperCB == nullptr", __func__);
3828         return nullptr;
3829     }
3830 
3831     size_t requireArgc = ARGS_TWO;
3832     size_t argc = ARGS_TWO;
3833     napi_value args[ARGS_TWO] = {nullptr};
3834     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, nullptr, nullptr));
3835     if (argc > requireArgc) {
3836         HILOG_ERROR("%{public}s, Wrong argument count.", __func__);
3837         return nullptr;
3838     }
3839 
3840     size_t uriIndex = PARAM0;
3841     bool stageMode = false;
3842     napi_status status = OHOS::AbilityRuntime::IsStageContext(env, args[0], stageMode);
3843     if (status != napi_ok) {
3844         HILOG_INFO("argv[0] is not a context, FA Model");
3845     } else {
3846         uriIndex = PARAM1;
3847         HILOG_INFO("argv[0] is a context, Stage Model: %{public}d", stageMode);
3848     }
3849 
3850     if (!stageMode) {
3851         auto ability = OHOS::AbilityRuntime::GetCurrentAbility(env);
3852         if (ability == nullptr) {
3853             HILOG_ERROR("Failed to get native context instance");
3854             return nullptr;
3855         }
3856         dataAbilityHelperCB->cbBase.ability = ability;
3857 
3858         if (!CheckAbilityType(&dataAbilityHelperCB->cbBase)) {
3859             dataAbilityHelperCB->cbBase.errCode = NAPI_ERR_ABILITY_TYPE_INVALID;
3860             HILOG_ERROR("%{public}s ability type invalid.", __func__);
3861             return nullptr;
3862         }
3863     }
3864 
3865     napi_valuetype valuetype = napi_undefined;
3866     NAPI_CALL(env, napi_typeof(env, args[uriIndex], &valuetype));
3867     if (valuetype != napi_string) {
3868         HILOG_ERROR("%{public}s, Wrong argument type.", __func__);
3869         return nullptr;
3870     }
3871 
3872     napi_value result = nullptr;
3873     NAPI_CALL(env, napi_new_instance(env, GetGlobalDataAbilityHelper(env), uriIndex + 1, &args[PARAM0], &result));
3874 
3875     if (!IsTypeForNapiValue(env, result, napi_object)) {
3876         HILOG_ERROR("%{public}s, IsTypeForNapiValue isn`t object", __func__);
3877         return nullptr;
3878     }
3879 
3880     if (IsTypeForNapiValue(env, result, napi_null)) {
3881         HILOG_ERROR("%{public}s, IsTypeForNapiValue is null", __func__);
3882         return nullptr;
3883     }
3884 
3885     if (IsTypeForNapiValue(env, result, napi_undefined)) {
3886         HILOG_ERROR("%{public}s, IsTypeForNapiValue is undefined", __func__);
3887         return nullptr;
3888     }
3889 
3890     if (!GetDataAbilityHelperStatus()) {
3891         HILOG_ERROR("%{public}s, GetDataAbilityHelperStatus is false", __func__);
3892         return nullptr;
3893     }
3894 
3895     delete dataAbilityHelperCB;
3896     dataAbilityHelperCB = nullptr;
3897     HILOG_INFO("%{public}s,end", __func__);
3898     return result;
3899 }
3900 
UnwrapParamForWantAgent(napi_env & env,napi_value & args,AbilityRuntime::WantAgent::WantAgent * & wantAgent)3901 napi_value UnwrapParamForWantAgent(napi_env &env, napi_value &args, AbilityRuntime::WantAgent::WantAgent *&wantAgent)
3902 {
3903     napi_valuetype valuetype = napi_undefined;
3904     NAPI_CALL(env, napi_typeof(env, args, &valuetype));
3905     NAPI_ASSERT(env, valuetype == napi_object, "Wrong argument type. Object expected.");
3906     napi_value wantAgentParam = nullptr;
3907     napi_value result = nullptr;
3908 
3909     bool hasProperty = false;
3910     NAPI_CALL(env, napi_has_named_property(env, args, "wantAgent", &hasProperty));
3911     if (hasProperty) {
3912         napi_get_named_property(env, args, "wantAgent", &wantAgentParam);
3913         NAPI_CALL(env, napi_typeof(env, wantAgentParam, &valuetype));
3914         NAPI_ASSERT(env, valuetype == napi_object, "Wrong argument type. Object expected.");
3915         napi_unwrap(env, wantAgentParam, reinterpret_cast<void **>(&wantAgent));
3916     }
3917 
3918     napi_get_null(env, &result);
3919     return result;
3920 }
3921 
StartBackgroundRunningExecuteCB(napi_env env,void * data)3922 void StartBackgroundRunningExecuteCB(napi_env env, void *data)
3923 {
3924     HILOG_INFO("%{public}s called.", __func__);
3925     AsyncCallbackInfo *asyncCallbackInfo = (AsyncCallbackInfo *)data;
3926     if (asyncCallbackInfo == nullptr) {
3927         HILOG_ERROR("%{public}s asyncCallbackInfo == nullptr", __func__);
3928         return;
3929     }
3930     if (asyncCallbackInfo->errCode == NAPI_ERR_PARAM_INVALID) {
3931         HILOG_ERROR("parse input param failed");
3932         return;
3933     }
3934     if (asyncCallbackInfo->ability == nullptr) {
3935         asyncCallbackInfo->errCode = NAPI_ERR_ACE_ABILITY;
3936         HILOG_ERROR("%{public}s ability == nullptr", __func__);
3937         return;
3938     }
3939     const std::shared_ptr<AbilityInfo> info = asyncCallbackInfo->ability->GetAbilityInfo();
3940     if (info == nullptr) {
3941         HILOG_ERROR("abilityinfo is null");
3942         asyncCallbackInfo->errCode = NAPI_ERR_ACE_ABILITY;
3943         return;
3944     }
3945 
3946     AbilityRuntime::WantAgent::WantAgent wantAgentObj;
3947     if (!asyncCallbackInfo->wantAgent) {
3948         HILOG_WARN("input param without wantAgent");
3949         wantAgentObj = AbilityRuntime::WantAgent::WantAgent();
3950     } else {
3951         wantAgentObj = *asyncCallbackInfo->wantAgent;
3952     }
3953     asyncCallbackInfo->errCode = asyncCallbackInfo->ability->StartBackgroundRunning(wantAgentObj);
3954 
3955     HILOG_INFO("%{public}s end.", __func__);
3956 }
3957 
BackgroundRunningCallbackCompletedCB(napi_env env,napi_status status,void * data)3958 void BackgroundRunningCallbackCompletedCB(napi_env env, napi_status status, void *data)
3959 {
3960     HILOG_INFO("%{public}s called.", __func__);
3961     AsyncCallbackInfo *asyncCallbackInfo = static_cast<AsyncCallbackInfo *>(data);
3962     napi_value callback = nullptr;
3963     napi_value undefined = nullptr;
3964     napi_value result[ARGS_TWO] = {nullptr};
3965     napi_value callResult = nullptr;
3966     napi_get_undefined(env, &undefined);
3967     if (asyncCallbackInfo->errCode == NAPI_ERR_NO_ERROR) {
3968         result[0] = WrapUndefinedToJS(env);
3969         napi_create_int32(env, 0, &result[1]);
3970     } else {
3971         result[1] = WrapUndefinedToJS(env);
3972         result[0] = GetCallbackErrorValue(env, asyncCallbackInfo->errCode);
3973     }
3974 
3975     napi_get_reference_value(env, asyncCallbackInfo->cbInfo.callback, &callback);
3976     napi_call_function(env, undefined, callback, ARGS_TWO, result, &callResult);
3977 
3978     if (asyncCallbackInfo->cbInfo.callback != nullptr) {
3979         napi_delete_reference(env, asyncCallbackInfo->cbInfo.callback);
3980     }
3981     napi_delete_async_work(env, asyncCallbackInfo->asyncWork);
3982     delete asyncCallbackInfo;
3983     asyncCallbackInfo = nullptr;
3984     HILOG_INFO("%{public}s end.", __func__);
3985 }
3986 
BackgroundRunningPromiseCompletedCB(napi_env env,napi_status status,void * data)3987 void BackgroundRunningPromiseCompletedCB(napi_env env, napi_status status, void *data)
3988 {
3989     HILOG_INFO("%{public}s called.", __func__);
3990     AsyncCallbackInfo *asyncCallbackInfo = static_cast<AsyncCallbackInfo *>(data);
3991     napi_value result = nullptr;
3992     if (asyncCallbackInfo->errCode == NAPI_ERR_NO_ERROR) {
3993         napi_create_int32(env, 0, &result);
3994         napi_resolve_deferred(env, asyncCallbackInfo->deferred, result);
3995     } else {
3996         result = GetCallbackErrorValue(env, asyncCallbackInfo->errCode);
3997         napi_reject_deferred(env, asyncCallbackInfo->deferred, result);
3998     }
3999 
4000     napi_delete_async_work(env, asyncCallbackInfo->asyncWork);
4001     HILOG_INFO("%{public}s, end.", __func__);
4002     delete asyncCallbackInfo;
4003 }
4004 
StartBackgroundRunningAsync(napi_env env,napi_value * args,const size_t argCallback,AsyncCallbackInfo * asyncCallbackInfo)4005 napi_value StartBackgroundRunningAsync(
4006     napi_env env, napi_value *args, const size_t argCallback, AsyncCallbackInfo *asyncCallbackInfo)
4007 {
4008     HILOG_INFO("%{public}s asyncCallback.", __func__);
4009     if (args == nullptr || asyncCallbackInfo == nullptr) {
4010         HILOG_ERROR("%{public}s, param == nullptr.", __func__);
4011         return nullptr;
4012     }
4013     napi_value resourceName = nullptr;
4014     NAPI_CALL(env, napi_create_string_latin1(env, __func__, NAPI_AUTO_LENGTH, &resourceName));
4015 
4016     napi_valuetype valuetype = napi_undefined;
4017     NAPI_CALL(env, napi_typeof(env, args[argCallback], &valuetype));
4018     if (valuetype == napi_function) {
4019         NAPI_CALL(env, napi_create_reference(env, args[argCallback], 1, &asyncCallbackInfo->cbInfo.callback));
4020     }
4021 
4022     NAPI_CALL(env,
4023         napi_create_async_work(env,
4024             nullptr,
4025             resourceName,
4026             StartBackgroundRunningExecuteCB,
4027             BackgroundRunningCallbackCompletedCB,
4028             static_cast<void *>(asyncCallbackInfo),
4029             &asyncCallbackInfo->asyncWork));
4030     NAPI_CALL(env, napi_queue_async_work(env, asyncCallbackInfo->asyncWork));
4031 
4032     HILOG_INFO("%{public}s asyncCallback end.", __func__);
4033     return WrapVoidToJS(env);
4034 }
4035 
StartBackgroundRunningPromise(napi_env env,AsyncCallbackInfo * asyncCallbackInfo)4036 napi_value StartBackgroundRunningPromise(napi_env env, AsyncCallbackInfo *asyncCallbackInfo)
4037 {
4038     HILOG_INFO("%{public}s, promise.", __func__);
4039     if (asyncCallbackInfo == nullptr) {
4040         HILOG_ERROR("%{public}s, param == nullptr.", __func__);
4041         return nullptr;
4042     }
4043     napi_value resourceName;
4044     NAPI_CALL(env, napi_create_string_latin1(env, __func__, NAPI_AUTO_LENGTH, &resourceName));
4045     napi_deferred deferred;
4046     napi_value promise = nullptr;
4047     NAPI_CALL(env, napi_create_promise(env, &deferred, &promise));
4048     asyncCallbackInfo->deferred = deferred;
4049 
4050     NAPI_CALL(env,
4051         napi_create_async_work(env,
4052             nullptr,
4053             resourceName,
4054             StartBackgroundRunningExecuteCB,
4055             BackgroundRunningPromiseCompletedCB,
4056             static_cast<void *>(asyncCallbackInfo),
4057             &asyncCallbackInfo->asyncWork));
4058     NAPI_CALL(env, napi_queue_async_work(env, asyncCallbackInfo->asyncWork));
4059     HILOG_INFO("%{public}s, end.", __func__);
4060     return promise;
4061 }
4062 
StartBackgroundRunningWrap(napi_env & env,napi_callback_info & info,AsyncCallbackInfo * asyncCallbackInfo)4063 napi_value StartBackgroundRunningWrap(napi_env &env, napi_callback_info &info, AsyncCallbackInfo *asyncCallbackInfo)
4064 {
4065     HILOG_INFO("%{public}s called.", __func__);
4066     size_t paramNums = 3;
4067     const size_t minParamNums = 2;
4068     const size_t maxParamNums = 3;
4069     napi_value args[maxParamNums] = {nullptr};
4070     napi_value ret = nullptr;
4071 
4072     NAPI_CALL(env, napi_get_cb_info(env, info, &paramNums, args, NULL, NULL));
4073 
4074     if (paramNums < minParamNums || paramNums > maxParamNums) {
4075         HILOG_ERROR("%{public}s, Wrong argument count.", __func__);
4076         return nullptr;
4077     }
4078 
4079     if (UnwrapParamForWantAgent(env, args[1], asyncCallbackInfo->wantAgent) == nullptr) {
4080         asyncCallbackInfo->errCode = NAPI_ERR_PARAM_INVALID;
4081     }
4082 
4083     if (paramNums == maxParamNums) {
4084         ret = StartBackgroundRunningAsync(env, args, maxParamNums - 1, asyncCallbackInfo);
4085     } else {
4086         ret = StartBackgroundRunningPromise(env, asyncCallbackInfo);
4087     }
4088 
4089     HILOG_INFO("%{public}s end.", __func__);
4090     return ret;
4091 }
4092 
NAPI_StartBackgroundRunningCommon(napi_env env,napi_callback_info info)4093 napi_value NAPI_StartBackgroundRunningCommon(napi_env env, napi_callback_info info)
4094 {
4095     HILOG_INFO("%{public}s called.", __func__);
4096     AsyncCallbackInfo *asyncCallbackInfo = CreateAsyncCallbackInfo(env);
4097     if (asyncCallbackInfo == nullptr) {
4098         HILOG_ERROR("%{public}s asyncCallbackInfo == nullpter", __func__);
4099         return WrapVoidToJS(env);
4100     }
4101 
4102     asyncCallbackInfo->errCode = NAPI_ERR_NO_ERROR;
4103     napi_value ret = StartBackgroundRunningWrap(env, info, asyncCallbackInfo);
4104     if (ret == nullptr) {
4105         HILOG_ERROR("%{public}s ret == nullpter", __func__);
4106         if (asyncCallbackInfo != nullptr) {
4107             delete asyncCallbackInfo;
4108             asyncCallbackInfo = nullptr;
4109         }
4110         ret = WrapVoidToJS(env);
4111     }
4112     HILOG_INFO("%{public}s end.", __func__);
4113     return ret;
4114 }
4115 
CancelBackgroundRunningExecuteCB(napi_env env,void * data)4116 void CancelBackgroundRunningExecuteCB(napi_env env, void *data)
4117 {
4118     AsyncCallbackInfo *asyncCallbackInfo = static_cast<AsyncCallbackInfo *>(data);
4119     if (asyncCallbackInfo->ability != nullptr) {
4120         asyncCallbackInfo->errCode = asyncCallbackInfo->ability->StopBackgroundRunning();
4121     } else {
4122         HILOG_ERROR("NAPI_PACancelBackgroundRunning, ability == nullptr");
4123     }
4124 }
4125 
CancelBackgroundRunningAsync(napi_env env,napi_value * args,const size_t argCallback,AsyncCallbackInfo * asyncCallbackInfo)4126 napi_value CancelBackgroundRunningAsync(
4127     napi_env env, napi_value *args, const size_t argCallback, AsyncCallbackInfo *asyncCallbackInfo)
4128 {
4129     HILOG_INFO("%{public}s, asyncCallback.", __func__);
4130     if (args == nullptr || asyncCallbackInfo == nullptr) {
4131         HILOG_ERROR("%{public}s, param == nullptr.", __func__);
4132         return nullptr;
4133     }
4134     napi_value resourceName = nullptr;
4135     napi_create_string_latin1(env, __func__, NAPI_AUTO_LENGTH, &resourceName);
4136 
4137     napi_valuetype valuetype = napi_undefined;
4138     napi_typeof(env, args[argCallback], &valuetype);
4139     if (valuetype == napi_function) {
4140         napi_create_reference(env, args[argCallback], 1, &asyncCallbackInfo->cbInfo.callback);
4141     }
4142 
4143     napi_create_async_work(
4144         env,
4145         nullptr,
4146         resourceName,
4147         CancelBackgroundRunningExecuteCB,
4148         BackgroundRunningCallbackCompletedCB,
4149         static_cast<void *>(asyncCallbackInfo),
4150         &asyncCallbackInfo->asyncWork);
4151     napi_queue_async_work(env, asyncCallbackInfo->asyncWork);
4152     napi_value result = nullptr;
4153     napi_get_null(env, &result);
4154     HILOG_INFO("%{public}s, asyncCallback end", __func__);
4155     return result;
4156 }
4157 
CancelBackgroundRunningPromise(napi_env env,AsyncCallbackInfo * asyncCallbackInfo)4158 napi_value CancelBackgroundRunningPromise(napi_env env, AsyncCallbackInfo *asyncCallbackInfo)
4159 {
4160     HILOG_INFO("%{public}s, promise.", __func__);
4161     if (asyncCallbackInfo == nullptr) {
4162         HILOG_ERROR("%{public}s, param == nullptr.", __func__);
4163         return nullptr;
4164     }
4165     napi_value resourceName = nullptr;
4166     napi_create_string_latin1(env, __func__, NAPI_AUTO_LENGTH, &resourceName);
4167     napi_deferred deferred;
4168     napi_value promise = nullptr;
4169     napi_create_promise(env, &deferred, &promise);
4170 
4171     asyncCallbackInfo->deferred = deferred;
4172 
4173     napi_create_async_work(
4174         env,
4175         nullptr,
4176         resourceName,
4177         CancelBackgroundRunningExecuteCB,
4178         BackgroundRunningPromiseCompletedCB,
4179         static_cast<void *>(asyncCallbackInfo),
4180         &asyncCallbackInfo->asyncWork);
4181     napi_queue_async_work(env, asyncCallbackInfo->asyncWork);
4182     HILOG_INFO("%{public}s, promise end", __func__);
4183     return promise;
4184 }
4185 
CancelBackgroundRunningWrap(napi_env & env,napi_callback_info & info,AsyncCallbackInfo * asyncCallbackInfo)4186 napi_value CancelBackgroundRunningWrap(napi_env &env, napi_callback_info &info, AsyncCallbackInfo *asyncCallbackInfo)
4187 {
4188     HILOG_INFO("%{public}s called.", __func__);
4189     size_t argcAsync = 1;
4190     const size_t argcPromise = 0;
4191     const size_t argCountWithAsync = argcPromise + ARGS_ASYNC_COUNT;
4192     napi_value args[ARGS_MAX_COUNT] = {nullptr};
4193     napi_value ret = nullptr;
4194 
4195     NAPI_CALL(env, napi_get_cb_info(env, info, &argcAsync, args, NULL, NULL));
4196     if (argcAsync > argCountWithAsync || argcAsync > ARGS_MAX_COUNT) {
4197         HILOG_ERROR("%{public}s, Wrong argument count.", __func__);
4198         return nullptr;
4199     }
4200 
4201     if (argcAsync > argcPromise) {
4202         ret = CancelBackgroundRunningAsync(env, args, 0, asyncCallbackInfo);
4203     } else {
4204         ret = CancelBackgroundRunningPromise(env, asyncCallbackInfo);
4205     }
4206 
4207     HILOG_INFO("%{public}s end.", __func__);
4208     return ret;
4209 }
4210 
NAPI_CancelBackgroundRunningCommon(napi_env env,napi_callback_info info)4211 napi_value NAPI_CancelBackgroundRunningCommon(napi_env env, napi_callback_info info)
4212 {
4213     HILOG_INFO("%{public}s called.", __func__);
4214     AsyncCallbackInfo *asyncCallbackInfo = CreateAsyncCallbackInfo(env);
4215     if (asyncCallbackInfo == nullptr) {
4216         HILOG_ERROR("%{public}s asyncCallbackInfo == nullpter", __func__);
4217         return WrapVoidToJS(env);
4218     }
4219 
4220     asyncCallbackInfo->errCode = NAPI_ERR_NO_ERROR;
4221     napi_value ret = CancelBackgroundRunningWrap(env, info, asyncCallbackInfo);
4222     if (ret == nullptr) {
4223         HILOG_ERROR("%{public}s ret == nullpter", __func__);
4224         if (asyncCallbackInfo != nullptr) {
4225             delete asyncCallbackInfo;
4226             asyncCallbackInfo = nullptr;
4227         }
4228         ret = WrapVoidToJS(env);
4229     }
4230     HILOG_INFO("%{public}s end.", __func__);
4231     return ret;
4232 }
4233 
TerminateAbilityWrap(napi_env env,napi_callback_info info,AsyncCallbackInfo * asyncCallbackInfo)4234 napi_value TerminateAbilityWrap(napi_env env, napi_callback_info info, AsyncCallbackInfo *asyncCallbackInfo)
4235 {
4236     HILOG_INFO("%{public}s, asyncCallback.", __func__);
4237     if (asyncCallbackInfo == nullptr) {
4238         HILOG_ERROR("%{public}s, asyncCallbackInfo == nullptr.", __func__);
4239         return nullptr;
4240     }
4241 
4242     size_t argcAsync = 1;
4243     const size_t argcPromise = 0;
4244     const size_t argCountWithAsync = argcPromise + ARGS_ASYNC_COUNT;
4245     napi_value args[ARGS_MAX_COUNT] = {nullptr};
4246     napi_value ret = nullptr;
4247 
4248     NAPI_CALL(env, napi_get_cb_info(env, info, &argcAsync, args, nullptr, nullptr));
4249     if (argcAsync > argCountWithAsync || argcAsync > ARGS_MAX_COUNT) {
4250         HILOG_ERROR("%{public}s, Wrong argument count.", __func__);
4251         return nullptr;
4252     }
4253 
4254     if (argcAsync > argcPromise) {
4255         ret = TerminateAbilityAsync(env, args, 0, asyncCallbackInfo);
4256     } else {
4257         ret = TerminateAbilityPromise(env, asyncCallbackInfo);
4258     }
4259     HILOG_INFO("%{public}s, asyncCallback end", __func__);
4260     return ret;
4261 }
4262 
TerminateAbilityAsync(napi_env env,napi_value * args,const size_t argCallback,AsyncCallbackInfo * asyncCallbackInfo)4263 napi_value TerminateAbilityAsync(
4264     napi_env env, napi_value *args, const size_t argCallback, AsyncCallbackInfo *asyncCallbackInfo)
4265 {
4266     HILOG_INFO("%{public}s, asyncCallback.", __func__);
4267     if (args == nullptr || asyncCallbackInfo == nullptr) {
4268         HILOG_ERROR("%{public}s, param == nullptr.", __func__);
4269         return nullptr;
4270     }
4271     napi_value resourceName = nullptr;
4272     NAPI_CALL(env, napi_create_string_latin1(env, __func__, NAPI_AUTO_LENGTH, &resourceName));
4273 
4274     napi_valuetype valuetype = napi_undefined;
4275     NAPI_CALL(env, napi_typeof(env, args[argCallback], &valuetype));
4276     if (valuetype == napi_function) {
4277         NAPI_CALL(env, napi_create_reference(env, args[argCallback], 1, &asyncCallbackInfo->cbInfo.callback));
4278     }
4279 
4280     NAPI_CALL(env, napi_create_async_work(env, nullptr, resourceName,
4281         [](napi_env env, void *data) {
4282             HILOG_INFO("%{public}s, worker pool thread execute.", __func__);
4283             AsyncCallbackInfo *asyncCallbackInfo = static_cast<AsyncCallbackInfo *>(data);
4284             if (asyncCallbackInfo->ability != nullptr) {
4285                 asyncCallbackInfo->ability->TerminateAbility();
4286             } else {
4287                 HILOG_ERROR("%{public}s, ability == nullptr", __func__);
4288             }
4289             HILOG_INFO("%{public}s, worker pool thread execute end.", __func__);
4290         },
4291         [](napi_env env, napi_status status, void *data) {
4292             HILOG_INFO("%{public}s, main event thread complete.", __func__);
4293             AsyncCallbackInfo *asyncCallbackInfo = static_cast<AsyncCallbackInfo *>(data);
4294             napi_value callback = nullptr;
4295             napi_value undefined = nullptr;
4296             napi_value result[ARGS_TWO] = {nullptr};
4297             napi_value callResult = nullptr;
4298             napi_get_undefined(env, &undefined);
4299             result[PARAM0] = GetCallbackErrorValue(env, NO_ERROR);
4300             napi_get_null(env, &result[PARAM1]);
4301             napi_get_reference_value(env, asyncCallbackInfo->cbInfo.callback, &callback);
4302             napi_call_function(env, undefined, callback, ARGS_TWO, &result[PARAM0], &callResult);
4303 
4304             if (asyncCallbackInfo->cbInfo.callback != nullptr) {
4305                 napi_delete_reference(env, asyncCallbackInfo->cbInfo.callback);
4306             }
4307             napi_delete_async_work(env, asyncCallbackInfo->asyncWork);
4308             delete asyncCallbackInfo;
4309             HILOG_INFO("%{public}s, main event thread complete end.", __func__);
4310         },
4311         static_cast<void *>(asyncCallbackInfo),
4312         &asyncCallbackInfo->asyncWork));
4313     NAPI_CALL(env, napi_queue_async_work(env, asyncCallbackInfo->asyncWork));
4314     napi_value result = nullptr;
4315     NAPI_CALL(env, napi_get_null(env, &result));
4316     HILOG_INFO("%{public}s, asyncCallback end", __func__);
4317     return result;
4318 }
4319 
TerminateAbilityPromise(napi_env env,AsyncCallbackInfo * asyncCallbackInfo)4320 napi_value TerminateAbilityPromise(napi_env env, AsyncCallbackInfo *asyncCallbackInfo)
4321 {
4322     HILOG_INFO("%{public}s, promise.", __func__);
4323     if (asyncCallbackInfo == nullptr) {
4324         HILOG_ERROR("%{public}s, param == nullptr.", __func__);
4325         return nullptr;
4326     }
4327     napi_value resourceName = nullptr;
4328     NAPI_CALL(env, napi_create_string_latin1(env, __func__, NAPI_AUTO_LENGTH, &resourceName));
4329     napi_deferred deferred;
4330     napi_value promise = nullptr;
4331     NAPI_CALL(env, napi_create_promise(env, &deferred, &promise));
4332 
4333     asyncCallbackInfo->deferred = deferred;
4334 
4335     NAPI_CALL(env, napi_create_async_work(env, nullptr, resourceName,
4336         [](napi_env env, void *data) {
4337             HILOG_INFO("%{public}s, worker pool thread execute.", __func__);
4338             AsyncCallbackInfo *asyncCallbackInfo = static_cast<AsyncCallbackInfo *>(data);
4339             if (asyncCallbackInfo->ability != nullptr) {
4340                 asyncCallbackInfo->ability->TerminateAbility();
4341             } else {
4342                 HILOG_INFO("%{public}s, ability == nullptr", __func__);
4343             }
4344             HILOG_INFO("%{public}s, worker pool thread execute end.", __func__);
4345         },
4346         [](napi_env env, napi_status status, void *data) {
4347             HILOG_INFO("%{public}s, main event thread complete.", __func__);
4348             AsyncCallbackInfo *asyncCallbackInfo = static_cast<AsyncCallbackInfo *>(data);
4349             napi_value result = nullptr;
4350             napi_get_null(env, &result);
4351             napi_resolve_deferred(env, asyncCallbackInfo->deferred, result);
4352             napi_delete_async_work(env, asyncCallbackInfo->asyncWork);
4353             delete asyncCallbackInfo;
4354             HILOG_INFO("%{public}s, main event thread complete end.", __func__);
4355         },
4356         static_cast<void *>(asyncCallbackInfo),
4357         &asyncCallbackInfo->asyncWork));
4358     NAPI_CALL(env, napi_queue_async_work(env, asyncCallbackInfo->asyncWork));
4359     HILOG_INFO("%{public}s, promise end", __func__);
4360     return promise;
4361 }
4362 
NAPI_TerminateAbilityCommon(napi_env env,napi_callback_info info)4363 napi_value NAPI_TerminateAbilityCommon(napi_env env, napi_callback_info info)
4364 {
4365     HILOG_INFO("%{public}s,called", __func__);
4366     AsyncCallbackInfo *asyncCallbackInfo = CreateAsyncCallbackInfo(env);
4367     if (asyncCallbackInfo == nullptr) {
4368         HILOG_ERROR("%{public}s,asyncCallbackInfo == nullptr", __func__);
4369         return WrapVoidToJS(env);
4370     }
4371 
4372     napi_value ret = TerminateAbilityWrap(env, info, asyncCallbackInfo);
4373     if (ret == nullptr) {
4374         HILOG_ERROR("%{public}s,ret == nullptr", __func__);
4375         if (asyncCallbackInfo != nullptr) {
4376             delete asyncCallbackInfo;
4377             asyncCallbackInfo = nullptr;
4378         }
4379         ret = WrapVoidToJS(env);
4380     }
4381     HILOG_INFO("%{public}s,end", __func__);
4382     return ret;
4383 }
4384 
JsNapiCommon()4385 JsNapiCommon::JsNapiCommon() : ability_(nullptr), connects_(g_connects),
4386     connectionsLock_(g_connectionsLock), serialNumber_(g_serialNumber)
4387 {
4388     if (!g_connectionManager) {
4389         g_connectionManager = std::make_unique<ConnectionManager>(connects_, connectionsLock_);
4390     }
4391 }
4392 
JsConnectAbility(NativeEngine & engine,NativeCallbackInfo & info,const AbilityType abilityType)4393 NativeValue* JsNapiCommon::JsConnectAbility(
4394     NativeEngine &engine, NativeCallbackInfo &info, const AbilityType abilityType)
4395 {
4396     HILOG_DEBUG("%{public}s is called", __func__);
4397     if (info.argc != ARGS_TWO) {
4398         HILOG_ERROR("input params count error, argc=%{public}zu", info.argc);
4399         return engine.CreateUndefined();
4400     }
4401     if (!g_connectionManager) {
4402         g_connectionManager = std::make_unique<ConnectionManager>(connects_, connectionsLock_);
4403     }
4404     std::lock_guard<std::recursive_mutex> lock(connectionsLock_);
4405     auto env = reinterpret_cast<napi_env>(&engine);
4406     auto firstParam = reinterpret_cast<napi_value>(info.argv[PARAM0]);
4407     auto secondParam = reinterpret_cast<napi_value>(info.argv[PARAM1]);
4408     Want want;
4409     if (!UnwrapWant(env, firstParam, want)) {
4410         HILOG_ERROR("called. Invoke UnwrapWant fail");
4411         return engine.CreateUndefined();
4412     }
4413 
4414     auto connectionCallback = std::make_shared<ConnectionCallback>(env, secondParam, this);
4415     bool result = false;
4416     int32_t errorVal = static_cast<int32_t>(NAPI_ERR_NO_ERROR);
4417     int64_t id = 0;
4418     sptr<NAPIAbilityConnection> abilityConnection = nullptr;
4419     if (CheckAbilityType(abilityType)) {
4420         abilityConnection = FindConnectionLocked(want, id);
4421         if (abilityConnection) {
4422             HILOG_INFO("find abilityConnection exist, current callbackSize: %{public}zu.",
4423                 abilityConnection->GetCallbackSize());
4424             // Add callback to connection
4425             abilityConnection->AddConnectionCallback(connectionCallback);
4426             // Judge connection-state
4427             auto connectionState = abilityConnection->GetConnectionState();
4428             if (connectionState == CONNECTION_STATE_CONNECTED) {
4429                 HILOG_INFO("Ability is connected, callback to client.");
4430                 abilityConnection->HandleOnAbilityConnectDone(*connectionCallback, ERR_OK);
4431                 return CreateJsValue(engine, id);
4432             } else if (connectionState == CONNECTION_STATE_CONNECTING) {
4433                 HILOG_INFO("Ability is connecting, just wait callback.");
4434                 return CreateJsValue(engine, id);
4435             } else {
4436                 HILOG_ERROR("AbilityConnection has disconnected, erase it.");
4437                 RemoveConnectionLocked(want);
4438                 return engine.CreateUndefined();
4439             }
4440         } else {
4441             result = CreateConnectionAndConnectAbilityLocked(connectionCallback, want, id);
4442         }
4443     } else {
4444         errorVal = static_cast<int32_t>(NAPI_ERR_ABILITY_TYPE_INVALID);
4445     }
4446 
4447     if (errorVal != static_cast<int32_t>(NAPI_ERR_NO_ERROR) || result == false) {
4448         HILOG_ERROR("CommonJsConnectAbility failed.");
4449         // return error code in onFailed async callback
4450         napi_value callback = nullptr;
4451         napi_value undefined = nullptr;
4452         napi_value resultVal = nullptr;
4453         napi_value callResult = nullptr;
4454         int errorCode = NO_ERROR;
4455         switch (errorVal) {
4456             case NAPI_ERR_ACE_ABILITY:
4457                 errorCode = ABILITY_NOT_FOUND;
4458                 break;
4459             case NAPI_ERR_PARAM_INVALID:
4460                 errorCode = INVALID_PARAMETER;
4461                 break;
4462             default:
4463                 break;
4464         }
4465         NAPI_CALL_BASE(env, napi_create_int32(env, errorCode, &resultVal), engine.CreateUndefined());
4466         NAPI_CALL_BASE(
4467             env, napi_get_reference_value(env, connectionCallback->failedCallbackRef, &callback),
4468             engine.CreateUndefined());
4469         NAPI_CALL_BASE(env, napi_call_function(env, undefined, callback, ARGS_ONE, &resultVal, &callResult),
4470             engine.CreateUndefined());
4471         RemoveConnectionLocked(want);
4472     }
4473     return CreateJsValue(engine, id);
4474 }
4475 
JsDisConnectAbility(NativeEngine & engine,NativeCallbackInfo & info,const AbilityType abilityType)4476 NativeValue* JsNapiCommon::JsDisConnectAbility(
4477     NativeEngine &engine, NativeCallbackInfo &info, const AbilityType abilityType)
4478 {
4479     HILOG_DEBUG("%{public}s is called", __func__);
4480     if (info.argc == ARGS_ZERO || info.argc > ARGS_TWO) {
4481         HILOG_ERROR("input params count error, argc=%{public}zu", info.argc);
4482         return engine.CreateUndefined();
4483     }
4484     std::lock_guard<std::recursive_mutex> lock(connectionsLock_);
4485     auto errorVal = std::make_shared<int32_t>(static_cast<int32_t>(NAPI_ERR_NO_ERROR));
4486     int64_t id = 0;
4487     sptr<NAPIAbilityConnection> abilityConnection = nullptr;
4488     if (!ConvertFromJsValue(engine, info.argv[PARAM0], id)) {
4489         HILOG_ERROR("input params int error");
4490         return engine.CreateUndefined();
4491     }
4492     auto item = std::find_if(connects_.begin(), connects_.end(),
4493         [&id](const std::map<ConnectionKey, sptr<NAPIAbilityConnection>>::value_type &obj) {
4494             return id == obj.first.id;
4495         });
4496     if (item != connects_.end()) {
4497         abilityConnection = item->second;
4498         HILOG_DEBUG("find conn ability exist");
4499     } else {
4500         HILOG_ERROR("there is no ability to disconnect.");
4501         return engine.CreateUndefined();
4502     }
4503     auto execute = [obj = this, value = errorVal, abilityType, abilityConnection] () {
4504         if (obj->ability_ == nullptr) {
4505             *value = static_cast<int32_t>(NAPI_ERR_ACE_ABILITY);
4506             HILOG_ERROR("task execute error, the ability is nullptr.");
4507             return;
4508         }
4509         if (!obj->CheckAbilityType(abilityType)) {
4510             *value = static_cast<int32_t>(NAPI_ERR_ABILITY_TYPE_INVALID);
4511             return;
4512         }
4513         *value = obj->ability_->DisconnectAbility(abilityConnection);
4514     };
4515     auto complete = [obj = this, value = errorVal]
4516         (NativeEngine &engine, AsyncTask &task, const int32_t status) {
4517         if (*value != static_cast<int32_t>(NAPI_ERR_NO_ERROR)) {
4518             task.Reject(engine, CreateJsError(engine, *value, "DisconnectAbility failed."));
4519             return;
4520         }
4521         task.Resolve(engine, CreateJsValue(engine, *value));
4522     };
4523     NativeValue *lastParam = (info.argc == ARGS_ONE) ? nullptr : info.argv[PARAM1];
4524     NativeValue *result = nullptr;
4525     AsyncTask::Schedule("JsNapiCommon::JsDisConnectAbility",
4526         engine, CreateAsyncTaskWithLastParam(engine, lastParam, std::move(execute), std::move(complete), &result));
4527     return result;
4528 }
4529 
CreateConnectionAndConnectAbilityLocked(std::shared_ptr<ConnectionCallback> callback,const Want & want,int64_t & id)4530 bool JsNapiCommon::CreateConnectionAndConnectAbilityLocked(
4531     std::shared_ptr<ConnectionCallback> callback, const Want &want, int64_t &id)
4532 {
4533     HILOG_DEBUG("Create new connection");
4534     // Create connection
4535     sptr<NAPIAbilityConnection> connection(new (std::nothrow) NAPIAbilityConnection());
4536     ConnectionKey key;
4537     id = serialNumber_;
4538     key.id = id;
4539     key.want = want;
4540     connects_.emplace(key, connection);
4541     if (serialNumber_ < INT32_MAX) {
4542         serialNumber_++;
4543     } else {
4544         serialNumber_ = 0;
4545     }
4546     // Set callback
4547     connection->AddConnectionCallback(callback);
4548 
4549     // connectAbility
4550     if (ability_ == nullptr) {
4551         HILOG_ERROR("ConnectAbility, the ability is nullptr");
4552         return false;
4553     }
4554     connection->SetConnectionState(CONNECTION_STATE_CONNECTING);
4555     return ability_->ConnectAbility(want, connection);
4556 }
4557 
FindConnectionLocked(const Want & want,int64_t & id)4558 sptr<NAPIAbilityConnection> JsNapiCommon::FindConnectionLocked(const Want &want, int64_t &id)
4559 {
4560     HILOG_DEBUG("%{public}s uri:%{public}s", __func__, want.GetElement().GetURI().c_str());
4561     std::string deviceId = want.GetElement().GetDeviceID();
4562     std::string bundleName = want.GetBundle();
4563     std::string abilityName = want.GetElement().GetAbilityName();
4564     auto iter = std::find_if(connects_.begin(),
4565         connects_.end(), [&deviceId, &bundleName, &abilityName](const std::map<ConnectionKey,
4566         sptr<NAPIAbilityConnection>>::value_type &obj) {
4567             return (deviceId == obj.first.want.GetElement().GetDeviceID()) &&
4568                    (bundleName == obj.first.want.GetBundle()) &&
4569                    (abilityName == obj.first.want.GetElement().GetAbilityName());
4570         });
4571     if (iter != connects_.end()) {
4572         HILOG_DEBUG("find connection exist");
4573         auto connection = iter->second;
4574         if (connection == nullptr) {
4575             HILOG_ERROR("connection is nullptr");
4576             connects_.erase(iter);
4577             return nullptr;
4578         }
4579         id = iter->first.id;
4580         return connection;
4581     }
4582     return nullptr;
4583 }
4584 
RemoveAllCallbacksLocked()4585 void JsNapiCommon::RemoveAllCallbacksLocked()
4586 {
4587     HILOG_DEBUG("RemoveAllCallbacksLocked initial size:%{public}zu", connects_.size());
4588     std::lock_guard<std::recursive_mutex> lock(connectionsLock_);
4589     for (auto it = connects_.begin(); it != connects_.end();) {
4590         auto connection = it->second;
4591         if (!connection) {
4592             HILOG_ERROR("connection is nullptr");
4593             it = connects_.erase(it);
4594             continue;
4595         }
4596         connection->ReomveAllCallbacks(this);
4597         if (connection->GetCallbackSize() == 0) {
4598             it = connects_.erase(it);
4599         } else {
4600             ++it;
4601         }
4602     }
4603     HILOG_DEBUG("RemoveAllCallbacksLocked end size:%{public}zu", connects_.size());
4604 }
4605 
RemoveConnectionLocked(const Want & want)4606 void JsNapiCommon::RemoveConnectionLocked(const Want &want)
4607 {
4608     std::string deviceId = want.GetElement().GetDeviceID();
4609     std::string bundleName = want.GetBundle();
4610     std::string abilityName = want.GetElement().GetAbilityName();
4611     auto iter = std::find_if(connects_.begin(),
4612         connects_.end(), [&deviceId, &bundleName, &abilityName](const std::map<ConnectionKey,
4613         sptr<NAPIAbilityConnection>>::value_type &obj) {
4614             return (deviceId == obj.first.want.GetElement().GetDeviceID()) &&
4615                    (bundleName == obj.first.want.GetBundle()) &&
4616                    (abilityName == obj.first.want.GetElement().GetAbilityName());
4617         });
4618     connects_.erase(iter);
4619 }
4620 
JsGetContext(NativeEngine & engine,NativeCallbackInfo & info,const AbilityType abilityType)4621 NativeValue* JsNapiCommon::JsGetContext(
4622     NativeEngine &engine, NativeCallbackInfo &info, const AbilityType abilityType)
4623 {
4624     if (!CheckAbilityType(abilityType)) {
4625         HILOG_ERROR("ability type error");
4626         return engine.CreateUndefined();
4627     }
4628 
4629     return CreateNapiJSContext(engine);
4630 }
4631 
JsGetFilesDir(NativeEngine & engine,NativeCallbackInfo & info,const AbilityType abilityType)4632 NativeValue* JsNapiCommon::JsGetFilesDir(NativeEngine &engine, NativeCallbackInfo &info, const AbilityType abilityType)
4633 {
4634     HILOG_DEBUG("JsGetFilesDir called");
4635     if (info.argc > ARGS_ONE) {
4636         HILOG_ERROR("JsGetFilesDir input params count error, argc=%{public}zu", info.argc);
4637         return engine.CreateUndefined();
4638     }
4639 
4640     auto errorVal = std::make_shared<int32_t>(static_cast<int32_t>(NAPI_ERR_NO_ERROR));
4641     std::shared_ptr<JsFilesDir> filesDir = std::make_shared<JsFilesDir>();
4642     auto execute = [obj = this, dir = filesDir, abilityType, value = errorVal] () {
4643         if (obj->ability_ == nullptr) {
4644             *value = static_cast<int32_t>(NAPI_ERR_ACE_ABILITY);
4645             HILOG_ERROR("JsGetFilesDir task execute error, the ability is nullptr");
4646             return;
4647         }
4648         if (!obj->CheckAbilityType(abilityType)) {
4649             *value = static_cast<int32_t>(NAPI_ERR_ABILITY_TYPE_INVALID);
4650             return;
4651         }
4652         auto context = obj->ability_->GetAbilityContext();
4653         if (context == nullptr) {
4654             *value = static_cast<int32_t>(NAPI_ERR_ABILITY_CALL_INVALID);
4655             HILOG_ERROR("JsGetFilesDir task execute error, the abilitycontext is nullptr");
4656             return;
4657         }
4658         dir->name = context->GetFilesDir();
4659     };
4660     auto complete = [obj = this, dir = filesDir, value = errorVal]
4661         (NativeEngine &engine, AsyncTask &task, int32_t status) {
4662         if (*value != static_cast<int32_t>(NAPI_ERR_NO_ERROR) || dir == nullptr) {
4663             auto ecode = dir == nullptr ? static_cast<int32_t>(NAPI_ERR_ABILITY_CALL_INVALID) : *value;
4664             task.Reject(engine, CreateJsError(engine, ecode, obj->ConvertErrorCode(ecode)));
4665             return;
4666         }
4667         task.Resolve(engine, CreateJsValue(engine, dir->name));
4668     };
4669 
4670     auto callback = info.argc == ARGS_ZERO ? nullptr : info.argv[PARAM0];
4671     NativeValue *result = nullptr;
4672     AsyncTask::Schedule("JsNapiCommon::JsGetFilesDir",
4673         engine, CreateAsyncTaskWithLastParam(engine, callback, std::move(execute), std::move(complete), &result));
4674     return result;
4675 }
4676 
JsIsUpdatingConfigurations(NativeEngine & engine,NativeCallbackInfo & info,const AbilityType abilityType)4677 NativeValue* JsNapiCommon::JsIsUpdatingConfigurations(
4678     NativeEngine &engine, NativeCallbackInfo &info, const AbilityType abilityType)
4679 {
4680     HILOG_DEBUG("JsIsUpdatingConfigurations called");
4681     if (info.argc > ARGS_ONE) {
4682         HILOG_ERROR("JsIsUpdatingConfigurations input params count error, argc=%{public}zu", info.argc);
4683         return engine.CreateUndefined();
4684     }
4685 
4686     auto errorVal = std::make_shared<int32_t>(static_cast<int32_t>(NAPI_ERR_NO_ERROR));
4687     std::shared_ptr<JsConfigurations> config = std::make_shared<JsConfigurations>();
4688     auto execute = [obj = this, data = config, value = errorVal, abilityType] () {
4689         if (obj->ability_ == nullptr) {
4690             *value = static_cast<int32_t>(NAPI_ERR_ACE_ABILITY);
4691             HILOG_ERROR("JsIsUpdatingConfigurations task execute error, the ability is nullptr");
4692             return;
4693         }
4694         if (!obj->CheckAbilityType(abilityType)) {
4695             *value = static_cast<int32_t>(NAPI_ERR_ABILITY_TYPE_INVALID);
4696             return;
4697         }
4698         if (data == nullptr) {
4699             *value = static_cast<int32_t>(NAPI_ERR_ABILITY_CALL_INVALID);
4700             HILOG_ERROR("JsIsUpdatingConfigurations task execute error, param is nullptr");
4701             return;
4702         }
4703         data->status = obj->ability_->IsUpdatingConfigurations();
4704     };
4705     auto complete = [obj = this, info = config, value = errorVal]
4706         (NativeEngine &engine, AsyncTask &task, int32_t status) {
4707         if (*value != static_cast<int32_t>(NAPI_ERR_NO_ERROR) || info == nullptr) {
4708             auto ecode = info == nullptr ? static_cast<int32_t>(NAPI_ERR_ABILITY_CALL_INVALID) : *value;
4709             task.Reject(engine, CreateJsError(engine, ecode, obj->ConvertErrorCode(ecode)));
4710             return;
4711         }
4712         task.Resolve(engine, engine.CreateBoolean(info->status));
4713     };
4714 
4715     auto callback = info.argc == ARGS_ZERO ? nullptr : info.argv[PARAM0];
4716     NativeValue *result = nullptr;
4717     AsyncTask::Schedule("JsNapiCommon::JsIsUpdatingConfigurations",
4718         engine, CreateAsyncTaskWithLastParam(engine, callback, std::move(execute), std::move(complete), &result));
4719 
4720     return result;
4721 }
4722 
JsPrintDrawnCompleted(NativeEngine & engine,NativeCallbackInfo & info,const AbilityType abilityType)4723 NativeValue* JsNapiCommon::JsPrintDrawnCompleted(
4724     NativeEngine &engine, NativeCallbackInfo &info, const AbilityType abilityType)
4725 {
4726     HILOG_DEBUG("JsPrintDrawnCompleted called");
4727     if (info.argc > ARGS_ONE) {
4728         HILOG_ERROR("JsPrintDrawnCompleted input params count error, argc=%{public}zu", info.argc);
4729         return engine.CreateUndefined();
4730     }
4731     auto errorVal = std::make_shared<int32_t>(static_cast<int32_t>(NAPI_ERR_NO_ERROR));
4732     std::shared_ptr<JsDrawnCompleted> drawComplete = std::make_shared<JsDrawnCompleted>();
4733     auto execute = [obj = this, data = drawComplete, value = errorVal, abilityType] () {
4734         if (obj->ability_ == nullptr) {
4735             *value = static_cast<int32_t>(NAPI_ERR_ACE_ABILITY);
4736             HILOG_ERROR("JsPrintDrawnCompleted task execute error, the ability is nullptr");
4737             return;
4738         }
4739         if (!obj->CheckAbilityType(abilityType)) {
4740             *value = static_cast<int32_t>(NAPI_ERR_ABILITY_TYPE_INVALID);
4741             return;
4742         }
4743         if (data == nullptr) {
4744             *value = static_cast<int32_t>(NAPI_ERR_ABILITY_CALL_INVALID);
4745             HILOG_ERROR("JsPrintDrawnCompleted task execute error, data is nullptr");
4746             return;
4747         }
4748         data->status = obj->ability_->PrintDrawnCompleted();
4749     };
4750     auto complete = [obj = this, draw = drawComplete, value = errorVal]
4751         (NativeEngine &engine, AsyncTask &task, int32_t status) {
4752         if (*value != static_cast<int32_t>(NAPI_ERR_NO_ERROR) || draw == nullptr) {
4753             auto ecode = draw == nullptr ? static_cast<int32_t>(NAPI_ERR_ABILITY_CALL_INVALID) : *value;
4754             task.Reject(engine, CreateJsError(engine, ecode, obj->ConvertErrorCode(ecode)));
4755             return;
4756         }
4757         task.Resolve(engine, engine.CreateNull());
4758     };
4759 
4760     auto callback = info.argc == ARGS_ZERO ? nullptr : info.argv[PARAM0];
4761     NativeValue *result = nullptr;
4762     AsyncTask::Schedule("JsNapiCommon::JsPrintDrawnCompleted",
4763         engine, CreateAsyncTaskWithLastParam(engine, callback, std::move(execute), std::move(complete), &result));
4764 
4765     return result;
4766 }
4767 
JsGetCacheDir(NativeEngine & engine,NativeCallbackInfo & info,const AbilityType abilityType)4768 NativeValue* JsNapiCommon::JsGetCacheDir(NativeEngine &engine, NativeCallbackInfo &info, const AbilityType abilityType)
4769 {
4770     HILOG_DEBUG("JsGetCacheDir called");
4771     if (info.argc > ARGS_ONE) {
4772         HILOG_ERROR("JsGetCacheDir input params count error, argc=%{public}zu", info.argc);
4773         return engine.CreateUndefined();
4774     }
4775     auto errorVal = std::make_shared<int32_t>(static_cast<int32_t>(NAPI_ERR_NO_ERROR));
4776     std::shared_ptr<JsCacheDir> cacheDir = std::make_shared<JsCacheDir>();
4777     auto execute = [obj = this, dir = cacheDir, value = errorVal, abilityType] () {
4778         if (obj->ability_ == nullptr) {
4779             *value = static_cast<int32_t>(NAPI_ERR_ACE_ABILITY);
4780             HILOG_ERROR("JsGetCacheDir task execute error, the ability is nullptr");
4781             return;
4782         }
4783         if (!obj->CheckAbilityType(abilityType)) {
4784             *value = static_cast<int32_t>(NAPI_ERR_ABILITY_TYPE_INVALID);
4785             return;
4786         }
4787         auto context = obj->ability_->GetAbilityContext();
4788         if (context == nullptr) {
4789             *value = static_cast<int32_t>(NAPI_ERR_ABILITY_CALL_INVALID);
4790             HILOG_ERROR("JsGetCacheDir task execute error, the abilitycontext is nullptr");
4791             return;
4792         }
4793         dir->name = context->GetCacheDir();
4794     };
4795     auto complete = [obj = this, dir = cacheDir, value = errorVal]
4796         (NativeEngine &engine, AsyncTask &task, int32_t status) {
4797         if (*value != static_cast<int32_t>(NAPI_ERR_NO_ERROR) || dir == nullptr) {
4798             auto ecode = dir == nullptr ? static_cast<int32_t>(NAPI_ERR_ABILITY_CALL_INVALID) : *value;
4799             task.Reject(engine, CreateJsError(engine, ecode, obj->ConvertErrorCode(ecode)));
4800             return;
4801         }
4802         task.Resolve(engine, CreateJsValue(engine, dir->name));
4803     };
4804 
4805     auto callback = info.argc == ARGS_ZERO ? nullptr : info.argv[PARAM0];
4806     NativeValue *result = nullptr;
4807     AsyncTask::Schedule("JsNapiCommon::JsGetCacheDir",
4808         engine, CreateAsyncTaskWithLastParam(engine, callback, std::move(execute), std::move(complete), &result));
4809 
4810     return result;
4811 }
4812 
JsGetCtxAppType(NativeEngine & engine,NativeCallbackInfo & info,const AbilityType abilityType)4813 NativeValue* JsNapiCommon::JsGetCtxAppType(
4814     NativeEngine &engine, NativeCallbackInfo &info, const AbilityType abilityType)
4815 {
4816     HILOG_DEBUG("called");
4817     if (info.argc > ARGS_ONE) {
4818         HILOG_ERROR("input params count error, argc=%{public}zu", info.argc);
4819         return engine.CreateUndefined();
4820     }
4821 
4822     auto errorVal = std::make_shared<int32_t>(static_cast<int32_t>(NAPI_ERR_NO_ERROR));
4823     std::shared_ptr<JsCtxAppType> type = std::make_shared<JsCtxAppType>();
4824     auto execute = [obj = this, apptype = type, value = errorVal, abilityType] () {
4825         if (obj->ability_ == nullptr) {
4826             *value = static_cast<int32_t>(NAPI_ERR_ACE_ABILITY);
4827             HILOG_ERROR("task execute error, the ability is nullptr");
4828             return;
4829         }
4830         if (!obj->CheckAbilityType(abilityType)) {
4831             *value = static_cast<int32_t>(NAPI_ERR_ABILITY_TYPE_INVALID);
4832             return;
4833         }
4834         if (apptype == nullptr) {
4835             *value = static_cast<int32_t>(NAPI_ERR_ABILITY_CALL_INVALID);
4836             return;
4837         }
4838         apptype->name = obj->ability_->GetAppType();
4839     };
4840     auto complete = [obj = this, apptype = type, value = errorVal]
4841         (NativeEngine &engine, AsyncTask &task, int32_t status) {
4842         if (*value != static_cast<int32_t>(NAPI_ERR_NO_ERROR) || apptype == nullptr) {
4843             auto ecode = apptype == nullptr ? static_cast<int32_t>(NAPI_ERR_ABILITY_CALL_INVALID) : *value;
4844             task.Reject(engine, CreateJsError(engine, ecode, obj->ConvertErrorCode(ecode)));
4845             return;
4846         }
4847         task.Resolve(engine, CreateJsValue(engine, apptype->name));
4848     };
4849 
4850     auto callback = info.argc == ARGS_ZERO ? nullptr : info.argv[PARAM0];
4851     NativeValue *result = nullptr;
4852     AsyncTask::Schedule("JsNapiCommon::JsGetCtxAppType",
4853         engine, CreateAsyncTaskWithLastParam(engine, callback, std::move(execute), std::move(complete), &result));
4854 
4855     return result;
4856 }
4857 
JsGetCtxHapModuleInfo(NativeEngine & engine,NativeCallbackInfo & info,const AbilityType abilityType)4858 NativeValue* JsNapiCommon::JsGetCtxHapModuleInfo(
4859     NativeEngine &engine, NativeCallbackInfo &info, const AbilityType abilityType)
4860 {
4861     HILOG_DEBUG("called");
4862     if (info.argc > ARGS_ONE) {
4863         HILOG_ERROR("input params count error, argc=%{public}zu", info.argc);
4864         return engine.CreateUndefined();
4865     }
4866     auto errorVal = std::make_shared<int32_t>(static_cast<int32_t>(NAPI_ERR_NO_ERROR));
4867     std::shared_ptr<JsHapModuleInfo> infoData = std::make_shared<JsHapModuleInfo>();
4868     auto execute = [obj = this, hapMod = infoData, value = errorVal, abilityType] () {
4869         if (obj->ability_ == nullptr) {
4870             *value = static_cast<int32_t>(NAPI_ERR_ACE_ABILITY);
4871             HILOG_ERROR("task execute error, the ability is nullptr");
4872             return;
4873         }
4874         if (!obj->CheckAbilityType(abilityType)) {
4875             *value = static_cast<int32_t>(NAPI_ERR_ABILITY_TYPE_INVALID);
4876             return;
4877         }
4878         auto getInfo = obj->ability_->GetHapModuleInfo();
4879         if (getInfo != nullptr && hapMod != nullptr) {
4880             hapMod->hapModInfo = *getInfo;
4881         } else {
4882             HILOG_ERROR("GetHapModuleInfo return nullptr");
4883             *value = static_cast<int32_t>(NAPI_ERR_ABILITY_CALL_INVALID);
4884         }
4885     };
4886     auto complete = [obj = this, info = infoData, value = errorVal]
4887         (NativeEngine &engine, AsyncTask &task, int32_t status) {
4888         if (*value != static_cast<int32_t>(NAPI_ERR_NO_ERROR) || info == nullptr) {
4889             auto ecode = info == nullptr ? static_cast<int32_t>(NAPI_ERR_ABILITY_CALL_INVALID) : *value;
4890             task.Reject(engine, CreateJsError(engine, ecode, obj->ConvertErrorCode(ecode)));
4891             return;
4892         }
4893         task.Resolve(engine, obj->CreateHapModuleInfo(engine, info));
4894     };
4895 
4896     auto callback = info.argc == ARGS_ZERO ? nullptr : info.argv[PARAM0];
4897     NativeValue *result = nullptr;
4898     AsyncTask::Schedule("JsNapiCommon::JsGetCtxHapModuleInfo",
4899         engine, CreateAsyncTaskWithLastParam(engine, callback, std::move(execute), std::move(complete), &result));
4900 
4901     return result;
4902 }
4903 
JsGetAppVersionInfo(NativeEngine & engine,NativeCallbackInfo & info,const AbilityType abilityType)4904 NativeValue* JsNapiCommon::JsGetAppVersionInfo(
4905     NativeEngine &engine, NativeCallbackInfo &info, const AbilityType abilityType)
4906 {
4907     HILOG_DEBUG("called");
4908     if (info.argc > ARGS_ONE) {
4909         HILOG_ERROR("input params count error, argc=%{public}zu", info.argc);
4910         return engine.CreateUndefined();
4911     }
4912 
4913     auto errorVal = std::make_shared<int32_t>(static_cast<int32_t>(NAPI_ERR_NO_ERROR));
4914     std::shared_ptr<JsApplicationInfo> infoData = std::make_shared<JsApplicationInfo>();
4915     auto execute = [obj = this, appInfo = infoData, value = errorVal, abilityType] () {
4916         if (obj->ability_ == nullptr) {
4917             *value = static_cast<int32_t>(NAPI_ERR_ACE_ABILITY);
4918             HILOG_ERROR("task execute error, the ability is nullptr");
4919             return;
4920         }
4921         if (!obj->CheckAbilityType(abilityType)) {
4922             *value = static_cast<int32_t>(NAPI_ERR_ABILITY_TYPE_INVALID);
4923             return;
4924         }
4925         auto getInfo = obj->ability_->GetApplicationInfo();
4926         if (getInfo != nullptr && appInfo != nullptr) {
4927             appInfo->appInfo = *getInfo;
4928         } else {
4929             HILOG_ERROR("GetApplicationInfo return nullptr");
4930             *value = static_cast<int32_t>(NAPI_ERR_ABILITY_CALL_INVALID);
4931         }
4932     };
4933     auto complete = [obj = this, info = infoData, value = errorVal]
4934         (NativeEngine &engine, AsyncTask &task, int32_t status) {
4935         if (*value != static_cast<int32_t>(NAPI_ERR_NO_ERROR) || info == nullptr) {
4936             auto ecode = info == nullptr ? static_cast<int32_t>(NAPI_ERR_ABILITY_CALL_INVALID) : *value;
4937             task.Reject(engine, CreateJsError(engine, ecode, obj->ConvertErrorCode(ecode)));
4938             return;
4939         }
4940         task.Resolve(engine, obj->CreateAppVersionInfo(engine, info));
4941     };
4942 
4943     auto callback = info.argc == ARGS_ZERO ? nullptr : info.argv[PARAM0];
4944     NativeValue *result = nullptr;
4945     AsyncTask::Schedule("JsNapiCommon::JsGetAppVersionInfo",
4946         engine, CreateAsyncTaskWithLastParam(engine, callback, std::move(execute), std::move(complete), &result));
4947 
4948     return result;
4949 }
4950 
JsGetCtxAbilityInfo(NativeEngine & engine,NativeCallbackInfo & info,const AbilityType abilityType)4951 NativeValue* JsNapiCommon::JsGetCtxAbilityInfo(
4952     NativeEngine &engine, NativeCallbackInfo &info, const AbilityType abilityType)
4953 {
4954     HILOG_DEBUG("called");
4955     if (info.argc > ARGS_ONE) {
4956         HILOG_ERROR("input params count error, argc=%{public}zu", info.argc);
4957         return engine.CreateUndefined();
4958     }
4959 
4960     auto errorVal = std::make_shared<int32_t>(static_cast<int32_t>(NAPI_ERR_NO_ERROR));
4961     std::shared_ptr<JsAbilityInfoInfo> infoData = std::make_shared<JsAbilityInfoInfo>();
4962     auto execute = [obj = this, abilityInfo = infoData, value = errorVal, abilityType] () {
4963         if (obj->ability_ == nullptr) {
4964             *value = static_cast<int32_t>(NAPI_ERR_ACE_ABILITY);
4965             HILOG_ERROR("task execute error, the ability is nullptr");
4966             return;
4967         }
4968         if (!obj->CheckAbilityType(abilityType)) {
4969             *value = static_cast<int32_t>(NAPI_ERR_ABILITY_TYPE_INVALID);
4970             return;
4971         }
4972         auto getInfo = obj->ability_->GetAbilityInfo();
4973         if (getInfo != nullptr && abilityInfo != nullptr) {
4974             abilityInfo->abilityInfo = *getInfo;
4975         } else {
4976             HILOG_ERROR("GetAbilityInfo return nullptr");
4977             *value = static_cast<int32_t>(NAPI_ERR_ABILITY_CALL_INVALID);
4978         }
4979     };
4980     auto complete = [obj = this, info = infoData, value = errorVal]
4981         (NativeEngine &engine, AsyncTask &task, int32_t status) {
4982         if (*value != static_cast<int32_t>(NAPI_ERR_NO_ERROR) || info == nullptr) {
4983             auto ecode = info == nullptr ? static_cast<int32_t>(NAPI_ERR_ABILITY_CALL_INVALID) : *value;
4984             task.Reject(engine, CreateJsError(engine, ecode, obj->ConvertErrorCode(ecode)));
4985             return;
4986         }
4987         task.Resolve(engine, obj->CreateAbilityInfo(engine, info));
4988     };
4989 
4990     auto callback = info.argc == ARGS_ZERO ? nullptr : info.argv[PARAM0];
4991     NativeValue *result = nullptr;
4992     AsyncTask::Schedule("JsNapiCommon::JsGetCtxAbilityInfo",
4993         engine, CreateAsyncTaskWithLastParam(engine, callback, std::move(execute), std::move(complete), &result));
4994 
4995     return result;
4996 }
4997 
JsGetOrCreateDistributedDir(NativeEngine & engine,NativeCallbackInfo & info,const AbilityType abilityType)4998 NativeValue* JsNapiCommon::JsGetOrCreateDistributedDir(
4999     NativeEngine &engine, NativeCallbackInfo &info, const AbilityType abilityType)
5000 {
5001     HILOG_DEBUG("called");
5002     if (info.argc > ARGS_ONE) {
5003         HILOG_ERROR("input params count error, argc=%{public}zu", info.argc);
5004         return engine.CreateUndefined();
5005     }
5006 
5007     auto errorVal = std::make_shared<int32_t>(static_cast<int32_t>(NAPI_ERR_NO_ERROR));
5008     std::shared_ptr<JsOrCreateDistributedDir> orCreateDistributedDir = std::make_shared<JsOrCreateDistributedDir>();
5009     auto execute = [obj = this, dir = orCreateDistributedDir, value = errorVal, abilityType] () {
5010         if (obj->ability_ == nullptr) {
5011             *value = static_cast<int32_t>(NAPI_ERR_ACE_ABILITY);
5012             HILOG_ERROR("task execute error, the ability is nullptr");
5013             return;
5014         }
5015         if (!obj->CheckAbilityType(abilityType)) {
5016             *value = static_cast<int32_t>(NAPI_ERR_ABILITY_TYPE_INVALID);
5017             return;
5018         }
5019         auto context = obj->ability_->GetAbilityContext();
5020         if (context == nullptr) {
5021             *value = static_cast<int32_t>(NAPI_ERR_ACE_ABILITY);
5022             HILOG_ERROR("task execute error, the abilitycontext is nullptr");
5023             return;
5024         }
5025         dir->name = context->GetDistributedFilesDir();
5026     };
5027     auto complete = [obj = this, dir = orCreateDistributedDir, value = errorVal]
5028         (NativeEngine &engine, AsyncTask &task, int32_t status) {
5029         if (*value != static_cast<int32_t>(NAPI_ERR_NO_ERROR) || dir == nullptr) {
5030             auto ecode = dir == nullptr ? static_cast<int32_t>(NAPI_ERR_ABILITY_CALL_INVALID) : *value;
5031             task.Reject(engine, CreateJsError(engine, ecode, obj->ConvertErrorCode(ecode)));
5032             return;
5033         }
5034         task.Resolve(engine, CreateJsValue(engine, dir->name));
5035     };
5036 
5037     auto callback = info.argc == ARGS_ZERO ? nullptr : info.argv[PARAM0];
5038     NativeValue *result = nullptr;
5039     AsyncTask::Schedule("JsNapiCommon::JsGetOrCreateDistributedDir",
5040         engine, CreateAsyncTaskWithLastParam(engine, callback, std::move(execute), std::move(complete), &result));
5041 
5042     return result;
5043 }
5044 
JsGetDisplayOrientation(NativeEngine & engine,NativeCallbackInfo & info,const AbilityType abilityType)5045 NativeValue* JsNapiCommon::JsGetDisplayOrientation(
5046     NativeEngine &engine, NativeCallbackInfo &info, const AbilityType abilityType)
5047 {
5048     HILOG_DEBUG("called");
5049     if (info.argc > ARGS_ONE) {
5050         HILOG_ERROR("input params count error, argc=%{public}zu", info.argc);
5051         return engine.CreateUndefined();
5052     }
5053 
5054     auto errorVal = std::make_shared<int32_t>(static_cast<int32_t>(NAPI_ERR_NO_ERROR));
5055     auto execute = [obj = this, value = errorVal, abilityType] () {
5056         if (obj->ability_ == nullptr) {
5057             *value = static_cast<int32_t>(NAPI_ERR_ACE_ABILITY);
5058             HILOG_ERROR("task execute error, the ability is nullptr");
5059             return;
5060         }
5061         if (!obj->CheckAbilityType(abilityType)) {
5062             *value = static_cast<int32_t>(NAPI_ERR_ABILITY_TYPE_INVALID);
5063             return;
5064         }
5065         *value = obj->ability_->GetDisplayOrientation();
5066     };
5067     auto complete = [errorVal] (NativeEngine &engine, AsyncTask &task, int32_t status) {
5068         if (*errorVal == NAPI_ERR_ACE_ABILITY) {
5069             task.Reject(engine, CreateJsError(engine, NAPI_ERR_ACE_ABILITY, "ability is nullptr"));
5070         } else if (*errorVal == NAPI_ERR_ABILITY_TYPE_INVALID) {
5071             task.Reject(engine, CreateJsError(engine, NAPI_ERR_ABILITY_TYPE_INVALID, "ability type is invalid."));
5072         } else if (*errorVal == NAPI_ERR_NO_WINDOW) {
5073             task.Reject(engine, CreateJsError(engine, NAPI_ERR_NO_WINDOW, "window is nullptr"));
5074         } else {
5075             task.Resolve(engine, CreateJsValue(engine, *errorVal));
5076         }
5077     };
5078 
5079     auto callback = info.argc == ARGS_ZERO ? nullptr : info.argv[PARAM0];
5080     NativeValue *result = nullptr;
5081     AsyncTask::Schedule("JsNapiCommon::JsGetDisplayOrientation",
5082         engine, CreateAsyncTaskWithLastParam(engine, callback, std::move(execute), std::move(complete), &result));
5083 
5084     return result;
5085 }
5086 
CreateProcessInfo(NativeEngine & engine,const std::shared_ptr<JsProcessInfo> & processInfo)5087 NativeValue* JsNapiCommon::CreateProcessInfo(NativeEngine &engine, const std::shared_ptr<JsProcessInfo> &processInfo)
5088 {
5089     HILOG_DEBUG("CreateProcessInfo called");
5090     CHECK_POINTER_AND_RETURN_LOG(processInfo, engine.CreateUndefined(), "input params error");
5091     auto objContext = engine.CreateObject();
5092     CHECK_POINTER_AND_RETURN_LOG(objContext, engine.CreateUndefined(), "CreateObject failed");
5093     auto object = ConvertNativeValueTo<NativeObject>(objContext);
5094     CHECK_POINTER_AND_RETURN_LOG(object, engine.CreateUndefined(), "ConvertNativeValueTo object failed");
5095 
5096     object->SetProperty("processName", CreateJsValue(engine, processInfo->processName));
5097     object->SetProperty("pid", CreateJsValue(engine, processInfo->pid));
5098 
5099     return objContext;
5100 }
5101 
CreateElementName(NativeEngine & engine,const std::shared_ptr<JsElementName> & elementName)5102 NativeValue* JsNapiCommon::CreateElementName(NativeEngine &engine, const std::shared_ptr<JsElementName> &elementName)
5103 {
5104     HILOG_DEBUG("CreateElementName called");
5105     CHECK_POINTER_AND_RETURN_LOG(elementName, engine.CreateUndefined(), "input params error");
5106     auto objContext = engine.CreateObject();
5107     CHECK_POINTER_AND_RETURN_LOG(objContext, engine.CreateUndefined(), "CreateObject failed");
5108     auto object = ConvertNativeValueTo<NativeObject>(objContext);
5109     CHECK_POINTER_AND_RETURN_LOG(object, engine.CreateUndefined(), "ConvertNativeValueTo object failed");
5110 
5111     object->SetProperty("deviceId", CreateJsValue(engine, elementName->deviceId));
5112     object->SetProperty("bundleName", CreateJsValue(engine, elementName->bundleName));
5113     object->SetProperty("abilityName", CreateJsValue(engine, elementName->abilityName));
5114     object->SetProperty("uri", CreateJsValue(engine, elementName->uri));
5115     object->SetProperty("shortName", CreateJsValue(engine, elementName->shortName));
5116 
5117     return objContext;
5118 }
5119 
CreateHapModuleInfo(NativeEngine & engine,const std::shared_ptr<JsHapModuleInfo> & hapModInfo)5120 NativeValue* JsNapiCommon::CreateHapModuleInfo(
5121     NativeEngine &engine, const std::shared_ptr<JsHapModuleInfo> &hapModInfo)
5122 {
5123     HILOG_DEBUG("CreateHapModuleInfo called");
5124     CHECK_POINTER_AND_RETURN_LOG(hapModInfo, engine.CreateUndefined(), "input params error");
5125     auto objContext = engine.CreateObject();
5126     CHECK_POINTER_AND_RETURN_LOG(objContext, engine.CreateUndefined(), "CreateObject failed");
5127     auto object = ConvertNativeValueTo<NativeObject>(objContext);
5128     CHECK_POINTER_AND_RETURN_LOG(object, engine.CreateUndefined(), "ConvertNativeValueTo object failed");
5129 
5130     object->SetProperty("name", CreateJsValue(engine, hapModInfo->hapModInfo.name));
5131     object->SetProperty("description", CreateJsValue(engine, hapModInfo->hapModInfo.description));
5132     object->SetProperty("icon", CreateJsValue(engine, hapModInfo->hapModInfo.iconPath));
5133     object->SetProperty("label", CreateJsValue(engine, hapModInfo->hapModInfo.label));
5134     object->SetProperty("backgroundImg", CreateJsValue(engine, hapModInfo->hapModInfo.backgroundImg));
5135     object->SetProperty("moduleName", CreateJsValue(engine, hapModInfo->hapModInfo.moduleName));
5136     object->SetProperty("mainAbilityName", CreateJsValue(engine, hapModInfo->hapModInfo.mainAbility));
5137     object->SetProperty("supportedModes", CreateJsValue(engine, hapModInfo->hapModInfo.supportedModes));
5138     object->SetProperty("descriptionId", CreateJsValue(engine, hapModInfo->hapModInfo.descriptionId));
5139     object->SetProperty("labelId", CreateJsValue(engine, hapModInfo->hapModInfo.labelId));
5140     object->SetProperty("iconId", CreateJsValue(engine, hapModInfo->hapModInfo.iconId));
5141     object->SetProperty("installationFree", engine.CreateBoolean(hapModInfo->hapModInfo.installationFree));
5142     object->SetProperty("reqCapabilities", CreateNativeArray(engine, hapModInfo->hapModInfo.reqCapabilities));
5143     object->SetProperty("deviceTypes", CreateNativeArray(engine, hapModInfo->hapModInfo.deviceTypes));
5144     object->SetProperty("abilityInfo", CreateAbilityInfos(engine, hapModInfo->hapModInfo.abilityInfos));
5145 
5146     return objContext;
5147 }
5148 
CreateModuleInfo(NativeEngine & engine,const ModuleInfo & modInfo)5149 NativeValue* JsNapiCommon::CreateModuleInfo(NativeEngine &engine, const ModuleInfo &modInfo)
5150 {
5151     auto objContext = engine.CreateObject();
5152     if (objContext == nullptr) {
5153         HILOG_ERROR("CreateObject failed");
5154         return engine.CreateUndefined();
5155     }
5156     auto object = ConvertNativeValueTo<NativeObject>(objContext);
5157     if (object == nullptr) {
5158         HILOG_ERROR("ConvertNativeValueTo object failed");
5159         return engine.CreateUndefined();
5160     }
5161 
5162     object->SetProperty("moduleName", CreateJsValue(engine, modInfo.moduleName));
5163     object->SetProperty("moduleSourceDir", CreateJsValue(engine, modInfo.moduleSourceDir));
5164 
5165     return objContext;
5166 }
5167 
CreateModuleInfos(NativeEngine & engine,const std::vector<ModuleInfo> & moduleInfos)5168 NativeValue* JsNapiCommon::CreateModuleInfos(NativeEngine &engine, const std::vector<ModuleInfo> &moduleInfos)
5169 {
5170     auto arrayValue = engine.CreateArray(moduleInfos.size());
5171     auto array = ConvertNativeValueTo<NativeArray>(arrayValue);
5172     if (array == nullptr) {
5173         HILOG_ERROR("CreateArray failed");
5174         return engine.CreateUndefined();
5175     }
5176     for (uint32_t i = 0; i < moduleInfos.size(); i++) {
5177         array->SetElement(i, CreateModuleInfo(engine, moduleInfos.at(i)));
5178     }
5179 
5180     return arrayValue;
5181 }
5182 
CreateAppInfo(NativeEngine & engine,const ApplicationInfo & appInfo)5183 NativeValue* JsNapiCommon::CreateAppInfo(NativeEngine &engine, const ApplicationInfo &appInfo)
5184 {
5185     HILOG_DEBUG("CreateAppInfo called");
5186     auto objContext = engine.CreateObject();
5187     if (objContext == nullptr) {
5188         HILOG_ERROR("CreateAppInfo, CreateObject failed");
5189         return engine.CreateUndefined();
5190     }
5191     auto object = ConvertNativeValueTo<NativeObject>(objContext);
5192     if (object == nullptr) {
5193         HILOG_ERROR("CreateAppInfo, ConvertNativeValueTo object failed");
5194         return engine.CreateUndefined();
5195     }
5196 
5197     object->SetProperty("name", CreateJsValue(engine, appInfo.name));
5198     object->SetProperty("description", CreateJsValue(engine, appInfo.description));
5199     object->SetProperty("descriptionId", CreateJsValue(engine, appInfo.descriptionId));
5200     object->SetProperty("systemApp", CreateJsValue(engine, appInfo.isSystemApp));
5201     object->SetProperty("enabled", CreateJsValue(engine, appInfo.enabled));
5202     object->SetProperty("label", CreateJsValue(engine, appInfo.label));
5203     object->SetProperty("labelId", CreateJsValue(engine, std::to_string(appInfo.labelId)));
5204     object->SetProperty("icon", CreateJsValue(engine, appInfo.iconPath));
5205     object->SetProperty("iconId", CreateJsValue(engine, std::to_string(appInfo.iconId)));
5206     object->SetProperty("process", CreateJsValue(engine, appInfo.process));
5207     object->SetProperty("entryDir", CreateJsValue(engine, appInfo.entryDir));
5208     object->SetProperty("supportedModes", CreateJsValue(engine, appInfo.supportedModes));
5209     object->SetProperty("moduleSourceDirs", CreateNativeArray(engine, appInfo.moduleSourceDirs));
5210     object->SetProperty("permissions", CreateNativeArray(engine, appInfo.permissions));
5211     object->SetProperty("moduleInfos", CreateModuleInfos(engine, appInfo.moduleInfos));
5212 
5213     return objContext;
5214 }
5215 
CreateAppInfo(NativeEngine & engine,const std::shared_ptr<JsApplicationInfo> & appInfo)5216 NativeValue* JsNapiCommon::CreateAppInfo(NativeEngine &engine, const std::shared_ptr<JsApplicationInfo> &appInfo)
5217 {
5218     if (appInfo == nullptr) {
5219         HILOG_ERROR("input param error");
5220         return engine.CreateUndefined();
5221     }
5222 
5223     return CreateAppInfo(engine, appInfo->appInfo);
5224 }
5225 
CreateAbilityInfo(NativeEngine & engine,const AbilityInfo & abilityInfo)5226 NativeValue* JsNapiCommon::CreateAbilityInfo(NativeEngine &engine, const AbilityInfo &abilityInfo)
5227 {
5228     HILOG_DEBUG("CreateAbilityInfo called");
5229     auto objContext = engine.CreateObject();
5230     if (objContext == nullptr) {
5231         HILOG_ERROR("CreateAbilityInfo, CreateObject failed");
5232         return engine.CreateUndefined();
5233     }
5234     auto object = ConvertNativeValueTo<NativeObject>(objContext);
5235     if (object == nullptr) {
5236         HILOG_ERROR("CreateAbilityInfo, ConvertNativeValueTo object failed");
5237         return engine.CreateUndefined();
5238     }
5239 
5240     object->SetProperty("bundleName", CreateJsValue(engine, abilityInfo.bundleName));
5241     object->SetProperty("name", CreateJsValue(engine, abilityInfo.name));
5242     object->SetProperty("label", CreateJsValue(engine, abilityInfo.label));
5243     object->SetProperty("description", CreateJsValue(engine, abilityInfo.description));
5244     object->SetProperty("icon", CreateJsValue(engine, abilityInfo.iconPath));
5245     object->SetProperty("moduleName", CreateJsValue(engine, abilityInfo.moduleName));
5246     object->SetProperty("process", CreateJsValue(engine, abilityInfo.process));
5247     object->SetProperty("uri", CreateJsValue(engine, abilityInfo.uri));
5248     object->SetProperty("readPermission", CreateJsValue(engine, abilityInfo.readPermission));
5249     object->SetProperty("writePermission", CreateJsValue(engine, abilityInfo.writePermission));
5250     object->SetProperty("targetAbility", CreateJsValue(engine, abilityInfo.targetAbility));
5251     object->SetProperty("type", CreateJsValue(engine, static_cast<int32_t>(abilityInfo.type)));
5252     object->SetProperty("orientation", CreateJsValue(engine, static_cast<int32_t>(abilityInfo.orientation)));
5253     object->SetProperty("launchMode", CreateJsValue(engine, static_cast<int32_t>(abilityInfo.launchMode)));
5254     object->SetProperty("labelId", CreateJsValue(engine, abilityInfo.labelId));
5255     object->SetProperty("descriptionId", CreateJsValue(engine, abilityInfo.descriptionId));
5256     object->SetProperty("iconId", CreateJsValue(engine, abilityInfo.iconId));
5257     object->SetProperty("formEntity", CreateJsValue(engine, abilityInfo.formEntity));
5258     object->SetProperty("minFormHeight", CreateJsValue(engine, abilityInfo.minFormHeight));
5259     object->SetProperty("defaultFormHeight", CreateJsValue(engine, abilityInfo.defaultFormHeight));
5260     object->SetProperty("minFormWidth", CreateJsValue(engine, abilityInfo.minFormWidth));
5261     object->SetProperty("defaultFormWidth", CreateJsValue(engine, abilityInfo.defaultFormWidth));
5262     object->SetProperty("backgroundModes", CreateJsValue(engine, abilityInfo.backgroundModes));
5263     object->SetProperty("subType", CreateJsValue(engine, static_cast<int32_t>(abilityInfo.subType)));
5264     object->SetProperty("isVisible", CreateJsValue(engine, abilityInfo.visible));
5265     object->SetProperty("formEnabled", CreateJsValue(engine, abilityInfo.formEnabled));
5266     object->SetProperty("permissions", CreateNativeArray(engine, abilityInfo.permissions));
5267     object->SetProperty("deviceCapabilities", CreateNativeArray(engine, abilityInfo.deviceCapabilities));
5268     object->SetProperty("deviceTypes", CreateNativeArray(engine, abilityInfo.deviceTypes));
5269     object->SetProperty("applicationInfo", CreateAppInfo(engine, abilityInfo.applicationInfo));
5270     return objContext;
5271 }
5272 
CreateAbilityInfo(NativeEngine & engine,const std::shared_ptr<JsAbilityInfoInfo> & abilityInfo)5273 NativeValue* JsNapiCommon::CreateAbilityInfo(
5274     NativeEngine &engine, const std::shared_ptr<JsAbilityInfoInfo> &abilityInfo)
5275 {
5276     HILOG_DEBUG("called");
5277     if (abilityInfo == nullptr) {
5278         HILOG_ERROR("called");
5279         return engine.CreateUndefined();
5280     }
5281 
5282     return CreateAbilityInfo(engine, abilityInfo->abilityInfo);
5283 }
5284 
CreateAbilityInfos(NativeEngine & engine,const std::vector<AbilityInfo> & abilityInfos)5285 NativeValue* JsNapiCommon::CreateAbilityInfos(NativeEngine &engine, const std::vector<AbilityInfo> &abilityInfos)
5286 {
5287     auto arrayValue = engine.CreateArray(abilityInfos.size());
5288     auto array = ConvertNativeValueTo<NativeArray>(arrayValue);
5289     if (array == nullptr) {
5290         HILOG_ERROR("CreateArray failed");
5291         return engine.CreateUndefined();
5292     }
5293     for (uint32_t i = 0; i < abilityInfos.size(); i++) {
5294         array->SetElement(i, CreateAbilityInfo(engine, abilityInfos.at(i)));
5295     }
5296 
5297     return arrayValue;
5298 }
5299 
CheckAbilityType(const AbilityType typeWant)5300 bool JsNapiCommon::CheckAbilityType(const AbilityType typeWant)
5301 {
5302     if (ability_ == nullptr) {
5303         HILOG_ERROR("input params int error");
5304         return false;
5305     }
5306     const std::shared_ptr<AbilityInfo> info = ability_->GetAbilityInfo();
5307     if (info == nullptr) {
5308         HILOG_ERROR("get ability info error");
5309         return false;
5310     }
5311 
5312     switch (typeWant) {
5313         case AbilityType::PAGE:
5314             if (static_cast<AbilityType>(info->type) == AbilityType::PAGE ||
5315                 static_cast<AbilityType>(info->type) == AbilityType::DATA) {
5316                 return true;
5317             }
5318             return false;
5319         default:
5320             return static_cast<AbilityType>(info->type) != AbilityType::PAGE;
5321     }
5322     return false;
5323 }
5324 
CreateAppVersionInfo(NativeEngine & engine,const std::shared_ptr<JsApplicationInfo> & appInfo)5325 NativeValue* JsNapiCommon::CreateAppVersionInfo(
5326     NativeEngine &engine, const std::shared_ptr<JsApplicationInfo> &appInfo)
5327 {
5328     HILOG_DEBUG("CreateAppVersionInfo called");
5329     CHECK_POINTER_AND_RETURN_LOG(appInfo, engine.CreateUndefined(), "input params error");
5330     auto objContext = engine.CreateObject();
5331     CHECK_POINTER_AND_RETURN_LOG(objContext, engine.CreateUndefined(), "CreateObject failed");
5332     auto object = ConvertNativeValueTo<NativeObject>(objContext);
5333     CHECK_POINTER_AND_RETURN_LOG(object, engine.CreateUndefined(), "ConvertNativeValueTo object failed");
5334 
5335     object->SetProperty("appName", CreateJsValue(engine, appInfo->appInfo.name));
5336     object->SetProperty("versionName", CreateJsValue(engine, appInfo->appInfo.versionName));
5337     object->SetProperty("versionCode", CreateJsValue(engine, static_cast<int32_t>(appInfo->appInfo.versionCode)));
5338 
5339     return objContext;
5340 }
5341 
UnwarpVerifyPermissionParams(NativeEngine & engine,NativeCallbackInfo & info,JsPermissionOptions & options)5342 bool JsNapiCommon::UnwarpVerifyPermissionParams(
5343     NativeEngine &engine, NativeCallbackInfo &info, JsPermissionOptions &options)
5344 {
5345     bool flagCall = true;
5346     if (info.argc == ARGS_ONE) {
5347         flagCall = false;
5348     } else if (info.argc == ARGS_TWO && info.argv[PARAM1]->TypeOf() != NATIVE_FUNCTION) {
5349         if (!GetPermissionOptions(engine, info.argv[PARAM1], options)) {
5350             HILOG_WARN("input params string error");
5351         }
5352         flagCall = false;
5353     } else if (info.argc == ARGS_THREE) {
5354         if (!GetPermissionOptions(engine, info.argv[PARAM1], options)) {
5355             HILOG_WARN("input params string error");
5356         }
5357     }
5358 
5359     return flagCall;
5360 }
5361 
GetStringsValue(NativeEngine & engine,NativeValue * object,std::vector<std::string> & strList)5362 bool JsNapiCommon::GetStringsValue(NativeEngine &engine, NativeValue *object, std::vector<std::string> &strList)
5363 {
5364     auto array = ConvertNativeValueTo<NativeArray>(object);
5365     if (array == nullptr) {
5366         HILOG_ERROR("input params error");
5367         return false;
5368     }
5369     for (uint32_t i = 0; i < array->GetLength(); i++) {
5370         std::string itemStr("");
5371         if (!ConvertFromJsValue(engine, array->GetElement(i), itemStr)) {
5372             HILOG_ERROR("GetElement from to array [%{public}u] error", i);
5373             return false;
5374         }
5375         strList.push_back(itemStr);
5376     }
5377 
5378     return true;
5379 }
5380 
GetPermissionOptions(NativeEngine & engine,NativeValue * object,JsPermissionOptions & options)5381 bool JsNapiCommon::GetPermissionOptions(NativeEngine &engine, NativeValue *object, JsPermissionOptions &options)
5382 {
5383     auto obj = ConvertNativeValueTo<NativeObject>(object);
5384     if (obj == nullptr) {
5385         HILOG_ERROR("input params error");
5386         return false;
5387     }
5388 
5389     options.uidFlag = ConvertFromJsValue(engine, obj->GetProperty("uid"), options.uid);
5390     options.pidFlag = ConvertFromJsValue(engine, obj->GetProperty("pid"), options.pid);
5391 
5392     return true;
5393 }
5394 
ConvertErrorCode(int32_t errCode)5395 std::string JsNapiCommon::ConvertErrorCode(int32_t errCode)
5396 {
5397     static std::map<int32_t, std::string> errMap = {
5398         { static_cast<int32_t>(NAPI_ERR_ACE_ABILITY), std::string("get ability error") },
5399         { static_cast<int32_t>(NAPI_ERR_ABILITY_CALL_INVALID), std::string("ability call error") },
5400         { static_cast<int32_t>(NAPI_ERR_PARAM_INVALID), std::string("input param error") },
5401         { static_cast<int32_t>(NAPI_ERR_ABILITY_TYPE_INVALID), std::string("ability type error") }
5402     };
5403     auto findECode = errMap.find(errCode);
5404     if (findECode == errMap.end()) {
5405         HILOG_ERROR("convert error code failed");
5406         return std::string("execution failed");
5407     }
5408 
5409     return findECode->second;
5410 }
5411 
JsGetWant(NativeEngine & engine,NativeCallbackInfo & info,const AbilityType abilityType)5412 NativeValue* JsNapiCommon::JsGetWant(
5413     NativeEngine &engine, NativeCallbackInfo &info, const AbilityType abilityType)
5414 {
5415     HILOG_DEBUG("%{public}s called", __func__);
5416     if (info.argc > ARGS_ONE) {
5417         HILOG_ERROR("input params count error, argc=%{public}zu", info.argc);
5418         return engine.CreateUndefined();
5419     }
5420 
5421     std::shared_ptr<JsWant> pwant = std::make_shared<JsWant>();
5422     auto errorVal = std::make_shared<int32_t>(static_cast<int32_t>(NAPI_ERR_NO_ERROR));
5423     auto execute = [obj = this, want = pwant, value = errorVal, abilityType] () {
5424         if (obj->ability_ == nullptr) {
5425             *value = static_cast<int32_t>(NAPI_ERR_ACE_ABILITY);
5426             HILOG_ERROR("task execute error, the ability is nullptr");
5427             return;
5428         }
5429         if (!obj->CheckAbilityType(abilityType)) {
5430             HILOG_ERROR("task execute error, the abilityType is error");
5431             *value = static_cast<int32_t>(NAPI_ERR_ABILITY_TYPE_INVALID);
5432             return;
5433         }
5434 
5435         auto wantData = obj->ability_->GetWant();
5436         if (wantData == nullptr || want == nullptr) {
5437             HILOG_ERROR("wantData or want is nullptr!");
5438             *value = static_cast<int32_t>(NAPI_ERR_ABILITY_CALL_INVALID);
5439             return;
5440         }
5441         want->want = *wantData;
5442     };
5443 
5444     auto complete = [obj = this, value = errorVal, pwant]
5445         (NativeEngine &engine, AsyncTask &task, int32_t status) {
5446         if (*value == NAPI_ERR_NO_ERROR && pwant != nullptr) {
5447             task.Resolve(engine, obj->CreateWant(engine, pwant));
5448         } else {
5449             auto error = (pwant == nullptr) ? static_cast<int32_t>(NAPI_ERR_ABILITY_CALL_INVALID) : *value;
5450             task.Reject(engine, CreateJsError(engine, error, "GetAbilityInfo return nullptr"));
5451         }
5452     };
5453 
5454     auto callback = (info.argc == ARGS_ZERO) ? nullptr : info.argv[PARAM0];
5455     NativeValue *result = nullptr;
5456     AsyncTask::Schedule("JsNapiCommon::JsGetWant",
5457         engine, CreateAsyncTaskWithLastParam(engine, callback, std::move(execute), std::move(complete), &result));
5458     return result;
5459 }
5460 
CreateWant(NativeEngine & engine,const std::shared_ptr<JsWant> & want)5461 NativeValue* JsNapiCommon::CreateWant(NativeEngine& engine, const std::shared_ptr<JsWant> &want)
5462 {
5463     HILOG_DEBUG("%{public}s,called", __func__);
5464     if (want == nullptr) {
5465         HILOG_DEBUG("%{public}s,called", __func__);
5466         return engine.CreateUndefined();
5467     }
5468 
5469     return CreateJsWant(engine, want->want);
5470 }
5471 }  // namespace AppExecFwk
5472 }  // namespace OHOS
5473