• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 
2 /*
3  * Copyright (c) 2022-2023 Huawei Device Co., Ltd.
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include "js_form_host.h"
18 
19 #include "fms_log_wrapper.h"
20 #include "form_info.h"
21 #include "form_instance.h"
22 #include "form_instances_filter.h"
23 #include "form_callback_interface.h"
24 #include "form_host_client.h"
25 #include "form_mgr.h"
26 #include "form_mgr_errors.h"
27 #include "ipc_skeleton.h"
28 #include "js_form_state_observer.h"
29 #include "js_runtime.h"
30 #include "js_runtime_utils.h"
31 #include "napi_form_util.h"
32 #include "napi/native_api.h"
33 #include "napi/native_node_api.h"
34 #include "napi_common_util.h"
35 #include "napi_common_want.h"
36 #include "runtime.h"
37 #include "tokenid_kit.h"
38 
39 namespace OHOS {
40 namespace AbilityRuntime {
41 using namespace OHOS;
42 using namespace OHOS::AAFwk;
43 using namespace OHOS::AppExecFwk;
44 
45 namespace {
46     constexpr int REF_COUNT = 1;
47     // NANOSECONDS mean 10^9 nano second
48     constexpr int64_t NANOSECONDS = 1000000000;
49     // MICROSECONDS mean 10^6 millias second
50     constexpr int64_t MICROSECONDS = 1000000;
51     //input parameters illegal
52     const std::string EMPTY_BUNDLE = "";
53 }
54 
SystemTimeMillis()55 int64_t SystemTimeMillis() noexcept
56 {
57     struct timespec t;
58     t.tv_sec = 0;
59     t.tv_nsec = 0;
60     clock_gettime(CLOCK_MONOTONIC, &t);
61     return static_cast<int64_t>(((t.tv_sec) * NANOSECONDS + t.tv_nsec) / MICROSECONDS);
62 }
63 
64 class ShareFormCallBackClient : public ShareFormCallBack,
65                                 public std::enable_shared_from_this<ShareFormCallBackClient> {
66 public:
67     using ShareFormTask = std::function<void(int32_t)>;
ShareFormCallBackClient(ShareFormTask && task)68     explicit ShareFormCallBackClient(ShareFormTask &&task) : task_(std::move(task))
69     {
70         handler_ = std::make_shared<AppExecFwk::EventHandler>(AppExecFwk::EventRunner::GetMainEventRunner());
71     }
72 
73     virtual ~ShareFormCallBackClient() = default;
74 
ProcessShareFormResponse(int32_t result)75     void ProcessShareFormResponse(int32_t result) override
76     {
77         if (handler_) {
78             handler_->PostSyncTask([client = shared_from_this(), result] () {
79                 client->task_(result);
80             });
81         }
82     }
83 
84 private:
85     ShareFormTask task_;
86     std::shared_ptr<AppExecFwk::EventHandler> handler_;
87 };
88 
89 class FormUninstallCallbackClient : public std::enable_shared_from_this<FormUninstallCallbackClient>
90 {
91 public:
FormUninstallCallbackClient(napi_env env,napi_ref callbackRef)92     FormUninstallCallbackClient(napi_env env, napi_ref callbackRef) : callbackRef_(callbackRef), env_(env)
93     {
94         handler_ = std::make_shared<AppExecFwk::EventHandler>(AppExecFwk::EventRunner::GetMainEventRunner());
95     }
96 
~FormUninstallCallbackClient()97     virtual ~FormUninstallCallbackClient()
98     {
99         napi_delete_reference(env_, callbackRef_);
100     }
101 
ProcessFormUninstall(const int64_t formId)102     void ProcessFormUninstall(const int64_t formId)
103     {
104         if (handler_ == nullptr) {
105             HILOG_INFO("handler is nullptr");
106             return;
107         }
108         handler_->PostSyncTask([thisWeakPtr = weak_from_this(), formId]() {
109             auto sharedThis = thisWeakPtr.lock();
110             if (sharedThis == nullptr) {
111                 HILOG_ERROR("sharedThis is nullptr.");
112                 return;
113             }
114             HILOG_DEBUG("task complete formId: form: %{public}" PRId64 ".", formId);
115             std::string formIdString = std::to_string(formId);
116             napi_value callbackValues;
117             napi_create_string_utf8(sharedThis->env_, formIdString.c_str(), NAPI_AUTO_LENGTH, &callbackValues);
118             napi_value callResult;
119             napi_value myCallback = nullptr;
120             napi_get_reference_value(sharedThis->env_, sharedThis->callbackRef_, &myCallback);
121             if (myCallback != nullptr) {
122                 napi_call_function(sharedThis->env_, nullptr, myCallback, ARGS_ONE, &callbackValues, &callResult);
123             }
124         });
125     }
126 
IsStrictEqual(napi_value callback)127     bool IsStrictEqual(napi_value callback)
128     {
129         bool isEqual = false;
130         napi_value myCallback = nullptr;
131         napi_get_reference_value(env_, callbackRef_, &myCallback);
132         napi_strict_equals(env_, myCallback, callback, &isEqual);
133         HILOG_INFO("isStrictEqual: %{public}d", isEqual);
134         return isEqual;
135     }
136 
137 private:
138     std::shared_ptr<AppExecFwk::EventHandler> handler_ = nullptr;
139     napi_ref callbackRef_ {};
140     napi_env env_;
141 };
142 
143 class JsFormStateCallbackClient : public FormStateCallbackInterface,
144                                   public std::enable_shared_from_this<JsFormStateCallbackClient> {
145 public:
146     using AcquireFormStateTask = std::function<void(int32_t, Want)>;
JsFormStateCallbackClient(AcquireFormStateTask && task)147     explicit JsFormStateCallbackClient(AcquireFormStateTask &&task) : task_(std::move(task))
148     {
149         handler_ = std::make_shared<AppExecFwk::EventHandler>(AppExecFwk::EventRunner::GetMainEventRunner());
150     }
151 
152     virtual ~JsFormStateCallbackClient() = default;
153 
ProcessAcquireState(FormState state)154     void ProcessAcquireState(FormState state) override
155     {
156         if (handler_) {
157             handler_->PostSyncTask([client = shared_from_this(), state] () {
158                 client->task_(static_cast<int32_t>(state), client->want_);
159             });
160         }
161     }
162 
SetWant(const Want want)163     void SetWant(const Want want)
164     {
165         want_ = want;
166     }
167 private:
168     Want want_;
169     AcquireFormStateTask task_;
170     std::shared_ptr<AppExecFwk::EventHandler> handler_ = nullptr;
171 };
172 
173 class JsFormDataCallbackClient : public FormDataCallbackInterface,
174                                  public std::enable_shared_from_this<JsFormDataCallbackClient> {
175 public:
176     using AcquireFormDataTask = std::function<void(AAFwk::WantParams data)>;
JsFormDataCallbackClient(AcquireFormDataTask && task)177     explicit JsFormDataCallbackClient(AcquireFormDataTask &&task) : task_(std::move(task))
178     {
179         handler_ = std::make_shared<AppExecFwk::EventHandler>(AppExecFwk::EventRunner::GetMainEventRunner());
180     }
181 
182     virtual ~JsFormDataCallbackClient() = default;
183 
ProcessAcquireFormData(AAFwk::WantParams data)184     void ProcessAcquireFormData(AAFwk::WantParams data) override
185     {
186         if (handler_) {
187             handler_->PostSyncTask([client = shared_from_this(), data] () {
188                 client->task_(data);
189             });
190         }
191     }
192 private:
193     AcquireFormDataTask task_;
194     std::shared_ptr<AppExecFwk::EventHandler> handler_ = nullptr;
195 };
196 
197 std::map<napi_ref, std::shared_ptr<FormUninstallCallbackClient>> g_formUninstallCallbackMap {};
198 std::mutex g_formUninstallCallbackMapMutex_;
199 
FormUninstallCallback(const std::vector<int64_t> & formIds)200 void FormUninstallCallback(const std::vector<int64_t> &formIds)
201 {
202     std::lock_guard<std::mutex> lock(g_formUninstallCallbackMapMutex_);
203     for (auto &iter : g_formUninstallCallbackMap) {
204         for (int64_t formId : formIds) {
205             iter.second->ProcessFormUninstall(formId);
206         }
207     }
208 }
209 
AddFormUninstallCallback(napi_env env,napi_value callback)210 bool AddFormUninstallCallback(napi_env env, napi_value callback)
211 {
212     std::lock_guard<std::mutex> lock(g_formUninstallCallbackMapMutex_);
213     for (auto &iter : g_formUninstallCallbackMap) {
214         if (iter.second->IsStrictEqual(callback)) {
215             HILOG_ERROR("found equal callback");
216             return false;
217         }
218     }
219 
220     napi_ref callbackRef;
221     napi_create_reference(env, callback, REF_COUNT, &callbackRef);
222     std::shared_ptr<FormUninstallCallbackClient> callbackClient = std::make_shared<FormUninstallCallbackClient>(env,
223         callbackRef);
224 
225     auto ret = g_formUninstallCallbackMap.emplace(callbackRef, callbackClient);
226     if (!ret.second) {
227         HILOG_ERROR("failed to emplace callback");
228         return false;
229     }
230     return true;
231 }
232 
DelFormUninstallCallback(napi_value callback)233 bool DelFormUninstallCallback(napi_value callback)
234 {
235     int32_t count = 0;
236     std::lock_guard<std::mutex> lock(g_formUninstallCallbackMapMutex_);
237     for (auto iter = g_formUninstallCallbackMap.begin(); iter != g_formUninstallCallbackMap.end();) {
238         if (iter->second->IsStrictEqual(callback)) {
239             HILOG_INFO("found equal callback");
240             iter = g_formUninstallCallbackMap.erase(iter);
241             count++;
242         } else {
243             iter++;
244         }
245     }
246     HILOG_INFO("%{public}d form uninstall callback deleted.", count);
247     return true;
248 }
249 
ClearFormUninstallCallback()250 bool ClearFormUninstallCallback()
251 {
252     std::lock_guard<std::mutex> lock(g_formUninstallCallbackMapMutex_);
253     g_formUninstallCallbackMap.clear();
254     return true;
255 }
256 
257 class JsFormHost {
258 public:
259     JsFormHost() = default;
260     ~JsFormHost() = default;
261 
Finalizer(NativeEngine * engine,void * data,void * hint)262     static void Finalizer(NativeEngine* engine, void* data, void* hint)
263     {
264         HILOG_INFO("JsFormHost::Finalizer is called");
265         std::unique_ptr<JsFormHost>(static_cast<JsFormHost*>(data));
266     }
267 
DeleteForm(NativeEngine * engine,NativeCallbackInfo * info)268     static NativeValue* DeleteForm(NativeEngine* engine, NativeCallbackInfo* info)
269     {
270         JsFormHost* me = CheckParamsAndGetThis<JsFormHost>(engine, info);
271         return (me != nullptr) ? me->OnDeleteForm(*engine, *info) : nullptr;
272     }
273 
ReleaseForm(NativeEngine * engine,NativeCallbackInfo * info)274     static NativeValue* ReleaseForm(NativeEngine* engine, NativeCallbackInfo* info)
275     {
276         JsFormHost* me = CheckParamsAndGetThis<JsFormHost>(engine, info);
277         return (me != nullptr) ? me->OnReleaseForm(*engine, *info) : nullptr;
278     }
279 
RequestForm(NativeEngine * engine,NativeCallbackInfo * info)280     static NativeValue* RequestForm(NativeEngine* engine, NativeCallbackInfo* info)
281     {
282         JsFormHost* me = CheckParamsAndGetThis<JsFormHost>(engine, info);
283         return (me != nullptr) ? me->OnRequestForm(*engine, *info) : nullptr;
284     }
285 
CastTempForm(NativeEngine * engine,NativeCallbackInfo * info)286     static NativeValue* CastTempForm(NativeEngine* engine, NativeCallbackInfo* info)
287     {
288         JsFormHost* me = CheckParamsAndGetThis<JsFormHost>(engine, info);
289         return (me != nullptr) ? me->OnCastTempForm(*engine, *info) : nullptr;
290     }
291 
NotifyVisibleForms(NativeEngine * engine,NativeCallbackInfo * info)292     static NativeValue* NotifyVisibleForms(NativeEngine* engine, NativeCallbackInfo* info)
293     {
294         JsFormHost* me = CheckParamsAndGetThis<JsFormHost>(engine, info);
295         return (me != nullptr) ? me->OnNotifyVisibleForms(*engine, *info) : nullptr;
296     }
297 
NotifyInvisibleForms(NativeEngine * engine,NativeCallbackInfo * info)298     static NativeValue* NotifyInvisibleForms(NativeEngine* engine, NativeCallbackInfo* info)
299     {
300         JsFormHost* me = CheckParamsAndGetThis<JsFormHost>(engine, info);
301         return (me != nullptr) ? me->OnNotifyInvisibleForms(*engine, *info) : nullptr;
302     }
303 
EnableFormsUpdate(NativeEngine * engine,NativeCallbackInfo * info)304     static NativeValue* EnableFormsUpdate(NativeEngine* engine, NativeCallbackInfo* info)
305     {
306         JsFormHost* me = CheckParamsAndGetThis<JsFormHost>(engine, info);
307         return (me != nullptr) ? me->OnEnableFormsUpdate(*engine, *info) : nullptr;
308     }
309 
DisableFormsUpdate(NativeEngine * engine,NativeCallbackInfo * info)310     static NativeValue* DisableFormsUpdate(NativeEngine* engine, NativeCallbackInfo* info)
311     {
312         JsFormHost* me = CheckParamsAndGetThis<JsFormHost>(engine, info);
313         return (me != nullptr) ? me->OnDisableFormsUpdate(*engine, *info) : nullptr;
314     }
315 
IsSystemReady(NativeEngine * engine,NativeCallbackInfo * info)316     static NativeValue* IsSystemReady(NativeEngine* engine, NativeCallbackInfo* info)
317     {
318         JsFormHost* me = CheckParamsAndGetThis<JsFormHost>(engine, info);
319         return (me != nullptr) ? me->OnIsSystemReady(*engine, *info) : nullptr;
320     }
321 
DeleteInvalidForms(NativeEngine * engine,NativeCallbackInfo * info)322     static NativeValue* DeleteInvalidForms(NativeEngine* engine, NativeCallbackInfo* info)
323     {
324         JsFormHost* me = CheckParamsAndGetThis<JsFormHost>(engine, info);
325         return (me != nullptr) ? me->OnDeleteInvalidForms(*engine, *info) : nullptr;
326     }
327 
AcquireFormState(NativeEngine * engine,NativeCallbackInfo * info)328     static NativeValue* AcquireFormState(NativeEngine* engine, NativeCallbackInfo* info)
329     {
330         JsFormHost* me = CheckParamsAndGetThis<JsFormHost>(engine, info);
331         return (me != nullptr) ? me->OnAcquireFormState(*engine, *info) : nullptr;
332     }
333 
RegisterFormObserver(NativeEngine * engine,NativeCallbackInfo * info)334     static NativeValue* RegisterFormObserver(NativeEngine* engine, NativeCallbackInfo* info)
335     {
336         JsFormHost* me = CheckParamsAndGetThis<JsFormHost>(engine, info);
337         return (me != nullptr) ? me->OnRegisterFormObserver(*engine, *info) : nullptr;
338     }
339 
UnregisterFormObserver(NativeEngine * engine,NativeCallbackInfo * info)340     static NativeValue* UnregisterFormObserver(NativeEngine* engine, NativeCallbackInfo* info)
341     {
342         JsFormHost* me = CheckParamsAndGetThis<JsFormHost>(engine, info);
343         return (me != nullptr) ? me->OnUnregisterFormObserver(*engine, *info) : nullptr;
344     }
345 
NotifyFormsVisible(NativeEngine * engine,NativeCallbackInfo * info)346     static NativeValue* NotifyFormsVisible(NativeEngine* engine, NativeCallbackInfo* info)
347     {
348         JsFormHost* me = CheckParamsAndGetThis<JsFormHost>(engine, info);
349         return (me != nullptr) ? me->OnNotifyFormsVisible(*engine, *info) : nullptr;
350     }
351 
NotifyFormsEnableUpdate(NativeEngine * engine,NativeCallbackInfo * info)352     static NativeValue* NotifyFormsEnableUpdate(NativeEngine* engine, NativeCallbackInfo* info)
353     {
354         JsFormHost* me = CheckParamsAndGetThis<JsFormHost>(engine, info);
355         return (me != nullptr) ? me->OnNotifyFormsEnableUpdate(*engine, *info) : nullptr;
356     }
357 
GetAllFormsInfo(NativeEngine * engine,NativeCallbackInfo * info)358     static NativeValue* GetAllFormsInfo(NativeEngine* engine, NativeCallbackInfo* info)
359     {
360         JsFormHost* me = CheckParamsAndGetThis<JsFormHost>(engine, info);
361         return (me != nullptr) ? me->OnGetAllFormsInfo(*engine, *info) : nullptr;
362     }
363 
GetFormsInfo(NativeEngine * engine,NativeCallbackInfo * info)364     static NativeValue* GetFormsInfo(NativeEngine* engine, NativeCallbackInfo* info)
365     {
366         JsFormHost* me = CheckParamsAndGetThis<JsFormHost>(engine, info);
367         return (me != nullptr) ? me->OnGetFormsInfo(*engine, *info) : nullptr;
368     }
369 
GetRunningFormInfos(NativeEngine * engine,NativeCallbackInfo * info)370     static NativeValue* GetRunningFormInfos(NativeEngine* engine, NativeCallbackInfo* info)
371     {
372         JsFormHost* me = CheckParamsAndGetThis<JsFormHost>(engine, info);
373         return (me != nullptr) ? me->OnGetRunningFormInfos(*engine, *info) : nullptr;
374     }
375 
ShareForm(NativeEngine * engine,NativeCallbackInfo * info)376     static NativeValue* ShareForm(NativeEngine* engine, NativeCallbackInfo* info)
377     {
378         JsFormHost* me = CheckParamsAndGetThis<JsFormHost>(engine, info);
379         return (me != nullptr) ? me->OnShareForm(*engine, *info) : nullptr;
380     }
381 
AcquireFormData(NativeEngine * engine,NativeCallbackInfo * info)382     static NativeValue* AcquireFormData(NativeEngine *engine, NativeCallbackInfo *info)
383     {
384         JsFormHost* me = CheckParamsAndGetThis<JsFormHost>(engine, info);
385         return (me != nullptr) ? me->OnAcquireFormData(*engine, *info) : nullptr;
386     }
387 
NotifyFormsPrivacyProtected(NativeEngine * engine,NativeCallbackInfo * info)388     static NativeValue* NotifyFormsPrivacyProtected(NativeEngine* engine, NativeCallbackInfo* info)
389     {
390         JsFormHost* me = CheckParamsAndGetThis<JsFormHost>(engine, info);
391         return (me != nullptr) ? me->OnNotifyFormsPrivacyProtected(*engine, *info) : nullptr;
392     }
GetFormInstancesByFilter(NativeEngine * engine,NativeCallbackInfo * info)393     static NativeValue* GetFormInstancesByFilter(NativeEngine *engine, NativeCallbackInfo *info)
394     {
395         JsFormHost *me = CheckParamsAndGetThis<JsFormHost>(engine, info);
396         return (me != nullptr) ? me->OnGetFormInstancesByFilter(*engine, *info) : nullptr;
397     }
398 
GetFormInstanceById(NativeEngine * engine,NativeCallbackInfo * info)399     static NativeValue* GetFormInstanceById(NativeEngine *engine, NativeCallbackInfo *info)
400     {
401         JsFormHost *me = CheckParamsAndGetThis<JsFormHost>(engine, info);
402         return (me != nullptr) ? me->OnGetFormInstanceById(*engine, *info) : nullptr;
403     }
404 private:
CheckCallerIsSystemApp()405     bool CheckCallerIsSystemApp()
406     {
407         auto selfToken = IPCSkeleton::GetSelfTokenID();
408         return Security::AccessToken::TokenIdKit::IsSystemAppByFullTokenID(selfToken);
409     }
410 
ConvertFromId(NativeEngine & engine,NativeValue * jsValue,int64_t & formId)411     static bool ConvertFromId(NativeEngine& engine, NativeValue* jsValue, int64_t &formId)
412     {
413         if (jsValue->TypeOf() != NATIVE_STRING) {
414             HILOG_ERROR("input params is not string.");
415             return false;
416         }
417 
418         std::string strFormId;
419         if (!ConvertFromJsValue(engine, jsValue, strFormId)) {
420             HILOG_ERROR("convert strFormId failed.");
421             return false;
422         }
423 
424         if (strFormId.empty()) {
425             HILOG_ERROR("strFormId is empty.");
426             return false;
427         }
428 
429         if (!ConvertStringToInt64(strFormId, formId)) {
430             HILOG_ERROR("convert string formId to int64 failed.");
431             return false;
432         }
433         return true;
434     }
435 
GetStringsValue(NativeEngine & engine,NativeValue * object,std::vector<std::string> & strList)436     bool GetStringsValue(NativeEngine &engine, NativeValue *object, std::vector<std::string> &strList)
437     {
438         auto array = ConvertNativeValueTo<NativeArray>(object);
439         if (array == nullptr) {
440             HILOG_ERROR("input params error");
441             return false;
442         }
443 
444         for (uint32_t i = 0; i < array->GetLength(); i++) {
445             std::string itemStr("");
446             if ((array->GetElement(i))->TypeOf() != NATIVE_STRING) {
447                 HILOG_ERROR("GetElement is not string");
448                 return false;
449             }
450             if (!ConvertFromJsValue(engine, array->GetElement(i), itemStr)) {
451                 HILOG_ERROR("GetElement from to array [%{public}u] error", i);
452                 return false;
453             }
454             strList.push_back(itemStr);
455         }
456 
457         return true;
458     }
459 
ConvertFromIds(NativeEngine & engine,NativeValue * jsValue,std::vector<int64_t> & formIds)460     bool ConvertFromIds(NativeEngine& engine, NativeValue* jsValue, std::vector<int64_t> &formIds)
461     {
462         if (!(jsValue->IsArray())) {
463             HILOG_ERROR("input params0 is not array!");
464             return false;
465         }
466 
467         std::vector<string> strFormIdList;
468         if(!GetStringsValue(engine, jsValue, strFormIdList)) {
469             HILOG_ERROR("convert strFormIdList failed!");
470             return false;
471         }
472 
473         for(size_t i = 0; i < strFormIdList.size(); i++) {
474             int64_t formIdValue;
475             if (!ConvertStringToInt64(strFormIdList[i], formIdValue)) {
476                 HILOG_ERROR("convert formIdValue failed!");
477                 return false;
478             }
479             formIds.push_back(formIdValue);
480         }
481         return true;
482     }
483 
ConvertDeviceId(NativeEngine & engine,NativeValue * jsValue,std::string & deviceId)484     bool ConvertDeviceId(NativeEngine& engine, NativeValue* jsValue, std::string &deviceId)
485     {
486         if (jsValue->TypeOf() != NATIVE_STRING) {
487             HILOG_ERROR("input params is not string.");
488             return false;
489         }
490 
491         if (!ConvertFromJsValue(engine, jsValue, deviceId)) {
492             HILOG_ERROR("convert deviceId failed.");
493             return false;
494         }
495 
496         if (deviceId.empty()) {
497             HILOG_ERROR("deviceId is empty.");
498             return false;
499         }
500 
501         return true;
502     }
503 
OnDeleteForm(NativeEngine & engine,NativeCallbackInfo & info)504     NativeValue* OnDeleteForm(NativeEngine &engine, NativeCallbackInfo &info)
505     {
506         HILOG_DEBUG("%{public}s called.", __func__);
507 
508         if (info.argc > ARGS_TWO || info.argc < ARGS_ONE) {
509             HILOG_ERROR("OnDeleteForm wrong number of arguments.");
510             NapiFormUtil::ThrowParamNumError(engine, std::to_string(info.argc), "1 or 2");
511             return engine.CreateUndefined();
512         }
513 
514         decltype(info.argc) convertArgc = 0;
515         HILOG_DEBUG("info.argv[PARAM0]->TypeOf() %{public}d", info.argv[PARAM0]->TypeOf());
516         int64_t formId = 0;
517         if (!ConvertFromId(engine, info.argv[PARAM0], formId)) {
518             HILOG_ERROR("form id is invalid.");
519             NapiFormUtil::ThrowParamTypeError(engine, "formId", "string");
520             return engine.CreateUndefined();
521         }
522         convertArgc++;
523 
524         AsyncTask::CompleteCallback complete = [formId](NativeEngine &engine, AsyncTask &task, int32_t status) {
525             auto ret = FormMgr::GetInstance().DeleteForm(formId, FormHostClient::GetInstance());
526             if (ret == ERR_OK) {
527                 task.ResolveWithNoError(engine, engine.CreateUndefined());
528             } else {
529                 task.Reject(engine, NapiFormUtil::CreateErrorByInternalErrorCode(engine, ret));
530             }
531         };
532 
533         NativeValue* lastParam = (info.argc <= convertArgc) ? nullptr : info.argv[convertArgc];
534         NativeValue* result = nullptr;
535         AsyncTask::ScheduleWithDefaultQos("JsFormHost::OnDeleteForm",
536             engine, CreateAsyncTaskWithLastParam(engine, lastParam, nullptr, std::move(complete), &result));
537         return result;
538     }
539 
OnReleaseForm(NativeEngine & engine,const NativeCallbackInfo & info)540     NativeValue* OnReleaseForm(NativeEngine &engine, const NativeCallbackInfo &info)
541     {
542         HILOG_DEBUG("%{public}s called.", __func__);
543 
544         if (info.argc > ARGS_THREE || info.argc < ARGS_ONE) {
545             HILOG_ERROR("OnReleaseForm wrong number of arguments.");
546             NapiFormUtil::ThrowParamNumError(engine, std::to_string(info.argc), "1 or 2 or 3");
547             return engine.CreateUndefined();
548         }
549 
550         decltype(info.argc) convertArgc = 0;
551         int64_t formId = 0;
552         if (!ConvertFromId(engine, info.argv[PARAM0], formId)) {
553             HILOG_ERROR("form id is invalid.");
554             NapiFormUtil::ThrowParamTypeError(engine, "formId", "string");
555             return engine.CreateUndefined();
556         }
557         convertArgc++;
558 
559         bool isReleaseCache = false;
560         if ((info.argc == ARGS_TWO || info.argc == ARGS_THREE) && info.argv[PARAM1]->TypeOf() != NATIVE_FUNCTION) {
561             if (info.argv[PARAM1]->TypeOf() != NATIVE_BOOLEAN) {
562                 HILOG_ERROR("promise second param type is illegal");
563                 NapiFormUtil::ThrowParamTypeError(engine, "isReleaseCache", "boolean");
564                 return engine.CreateUndefined();
565             }
566 
567             if (!ConvertFromJsValue(engine, info.argv[PARAM1], isReleaseCache)) {
568                 HILOG_ERROR("convert isReleaseCache failed!");
569                 NapiFormUtil::ThrowParamTypeError(engine, "isReleaseCache", "boolean");
570                 return engine.CreateUndefined();
571             }
572             convertArgc++;
573         }
574 
575         AsyncTask::CompleteCallback complete = [formId, isReleaseCache]
576             (NativeEngine &engine, AsyncTask &task, int32_t status) {
577             auto ret = FormMgr::GetInstance().ReleaseForm(formId, FormHostClient::GetInstance(), isReleaseCache);
578             if (ret == ERR_OK) {
579                 task.ResolveWithNoError(engine, engine.CreateUndefined());
580             } else {
581                 task.Reject(engine, NapiFormUtil::CreateErrorByInternalErrorCode(engine, ret));
582             }
583         };
584 
585         NativeValue* lastParam = (info.argc <= convertArgc) ? nullptr : info.argv[convertArgc];
586         NativeValue* result = nullptr;
587         AsyncTask::ScheduleWithDefaultQos("JsFormHost::OnReleaseForm",
588             engine, CreateAsyncTaskWithLastParam(engine, lastParam, nullptr, std::move(complete), &result));
589         return result;
590     }
591 
OnRequestForm(NativeEngine & engine,const NativeCallbackInfo & info)592     NativeValue* OnRequestForm(NativeEngine &engine, const NativeCallbackInfo &info)
593     {
594         HILOG_DEBUG("%{public}s called.", __func__);
595 
596         if (info.argc > ARGS_TWO || info.argc < ARGS_ONE) {
597             HILOG_ERROR("%{public}s, wrong number of arguments.", __func__);
598             NapiFormUtil::ThrowParamNumError(engine, std::to_string(info.argc), "1 or 2");
599             return engine.CreateUndefined();
600         }
601 
602         decltype(info.argc) convertArgc = 0;
603         int64_t formId = 0;
604         if (!ConvertFromId(engine, info.argv[PARAM0], formId)) {
605             HILOG_ERROR("form id is invalid.");
606             NapiFormUtil::ThrowParamTypeError(engine, "formId", "string");
607             return engine.CreateUndefined();
608         }
609         convertArgc++;
610 
611         AsyncTask::CompleteCallback complete = [formId](NativeEngine &engine, AsyncTask &task, int32_t status) {
612             Want want;
613             auto ret = FormMgr::GetInstance().RequestForm(formId, FormHostClient::GetInstance(), want);
614             if (ret == ERR_OK) {
615                 task.ResolveWithNoError(engine, engine.CreateUndefined());
616             } else {
617                 task.Reject(engine, NapiFormUtil::CreateErrorByInternalErrorCode(engine, ret));
618             }
619         };
620 
621         NativeValue* lastParam = (info.argc <= convertArgc) ? nullptr : info.argv[convertArgc];
622         NativeValue* result = nullptr;
623         AsyncTask::ScheduleWithDefaultQos("JsFormHost::OnRequestForm",
624             engine, CreateAsyncTaskWithLastParam(engine, lastParam, nullptr, std::move(complete), &result));
625         return result;
626     }
627 
OnCastTempForm(NativeEngine & engine,const NativeCallbackInfo & info)628     NativeValue* OnCastTempForm(NativeEngine &engine, const NativeCallbackInfo &info)
629     {
630         HILOG_DEBUG("%{public}s called.", __func__);
631 
632         if (info.argc > ARGS_TWO || info.argc < ARGS_ONE) {
633             HILOG_ERROR("%{public}s, wrong number of arguments.", __func__);
634             NapiFormUtil::ThrowParamNumError(engine, std::to_string(info.argc), "1 or 2");
635             return engine.CreateUndefined();
636         }
637 
638         decltype(info.argc) convertArgc = 0;
639         int64_t formId = 0;
640         if (!ConvertFromId(engine, info.argv[PARAM0], formId)) {
641             HILOG_ERROR("form id is invalid.");
642             NapiFormUtil::ThrowParamTypeError(engine, "formId", "string");
643             return engine.CreateUndefined();
644         }
645         convertArgc++;
646 
647         AsyncTask::CompleteCallback complete = [formId](NativeEngine &engine, AsyncTask &task, int32_t status) {
648             auto ret = FormMgr::GetInstance().CastTempForm(formId, FormHostClient::GetInstance());
649             if (ret == ERR_OK) {
650                 task.ResolveWithNoError(engine, engine.CreateUndefined());
651             } else {
652                 task.Reject(engine, NapiFormUtil::CreateErrorByInternalErrorCode(engine, ret));
653             }
654         };
655 
656         NativeValue* lastParam = (info.argc <= convertArgc) ? nullptr : info.argv[convertArgc];
657         NativeValue* result = nullptr;
658         AsyncTask::ScheduleWithDefaultQos("JsFormHost::OnCastTempForm",
659             engine, CreateAsyncTaskWithLastParam(engine, lastParam, nullptr, std::move(complete), &result));
660         return result;
661     }
662 
OnNotifyVisibleForms(NativeEngine & engine,const NativeCallbackInfo & info)663     NativeValue* OnNotifyVisibleForms(NativeEngine &engine, const NativeCallbackInfo &info)
664     {
665         HILOG_DEBUG("%{public}s is called", __FUNCTION__);
666 
667         if (info.argc > ARGS_TWO|| info.argc < ARGS_ONE) {
668             HILOG_ERROR("wrong number of arguments.");
669             NapiFormUtil::ThrowParamNumError(engine, std::to_string(info.argc), "1 or 2");
670             return engine.CreateUndefined();
671         }
672 
673         decltype(info.argc) convertArgc = 0;
674         std::vector<int64_t> formIds;
675         if (!ConvertFromIds(engine, info.argv[PARAM0], formIds)) {
676             HILOG_ERROR("form id list is invalid.");
677             NapiFormUtil::ThrowParamTypeError(engine, "formIds", "Array<string>");
678             return engine.CreateUndefined();
679         }
680         convertArgc++;
681 
682         auto complete = [formIds](NativeEngine &engine, AsyncTask &task, int32_t status) {
683             auto ret = FormMgr::GetInstance().NotifyWhetherVisibleForms(formIds, FormHostClient::GetInstance(),
684                 Constants::FORM_VISIBLE);
685             if (ret == ERR_OK) {
686                 task.ResolveWithNoError(engine, engine.CreateUndefined());
687             } else {
688                 task.Reject(engine, NapiFormUtil::CreateErrorByInternalErrorCode(engine, ret));
689             }
690         };
691 
692         NativeValue* lastParam = (info.argc <= convertArgc) ? nullptr : info.argv[convertArgc];
693         NativeValue *result = nullptr;
694         AsyncTask::ScheduleWithDefaultQos("JsFormHost::OnEnableFormsUpdate",
695             engine, CreateAsyncTaskWithLastParam(engine, lastParam, nullptr, std::move(complete), &result));
696         return result;
697     }
698 
OnNotifyInvisibleForms(NativeEngine & engine,const NativeCallbackInfo & info)699     NativeValue* OnNotifyInvisibleForms(NativeEngine &engine, const NativeCallbackInfo &info)
700     {
701         HILOG_DEBUG("%{public}s is called", __FUNCTION__);
702 
703         if (info.argc > ARGS_TWO|| info.argc < ARGS_ONE) {
704             HILOG_ERROR("wrong number of arguments.");
705             NapiFormUtil::ThrowParamNumError(engine, std::to_string(info.argc), "1 or 2");
706             return engine.CreateUndefined();
707         }
708 
709         decltype(info.argc) convertArgc = 0;
710         std::vector<int64_t> formIds;
711         if (!ConvertFromIds(engine, info.argv[PARAM0], formIds)) {
712             HILOG_ERROR("form id list is invalid.");
713             NapiFormUtil::ThrowParamTypeError(engine, "formIds", "Array<string>");
714             return engine.CreateUndefined();
715         }
716         convertArgc++;
717 
718         auto complete = [formIds](NativeEngine &engine, AsyncTask &task, int32_t status) {
719             auto ret = FormMgr::GetInstance().NotifyWhetherVisibleForms(formIds, FormHostClient::GetInstance(),
720                 Constants::FORM_INVISIBLE);
721             if (ret == ERR_OK) {
722                 task.ResolveWithNoError(engine, engine.CreateUndefined());
723             } else {
724                 task.Reject(engine, NapiFormUtil::CreateErrorByInternalErrorCode(engine, ret));
725             }
726         };
727 
728         NativeValue* lastParam = (info.argc <= convertArgc) ? nullptr : info.argv[convertArgc];
729         NativeValue *result = nullptr;
730         AsyncTask::ScheduleWithDefaultQos("JsFormHost::OnEnableFormsUpdate",
731             engine, CreateAsyncTaskWithLastParam(engine, lastParam, nullptr, std::move(complete), &result));
732         return result;
733     }
734 
OnEnableFormsUpdate(NativeEngine & engine,const NativeCallbackInfo & info)735     NativeValue* OnEnableFormsUpdate(NativeEngine &engine, const NativeCallbackInfo &info)
736     {
737         HILOG_DEBUG("%{public}s is called", __FUNCTION__);
738 
739         if (info.argc > ARGS_TWO|| info.argc < ARGS_ONE) {
740             HILOG_ERROR("wrong number of arguments.");
741             NapiFormUtil::ThrowParamNumError(engine, std::to_string(info.argc), "1 or 2");
742             return engine.CreateUndefined();
743         }
744 
745         decltype(info.argc) convertArgc = 0;
746         std::vector<int64_t> formIds;
747         if (!ConvertFromIds(engine, info.argv[PARAM0], formIds)) {
748             HILOG_ERROR("form id list is invalid.");
749             NapiFormUtil::ThrowParamTypeError(engine, "formIds", "Array<string>");
750             return engine.CreateUndefined();
751         }
752         convertArgc++;
753 
754         auto complete = [formIds](NativeEngine &engine, AsyncTask &task, int32_t status) {
755             auto ret = FormMgr::GetInstance().LifecycleUpdate(formIds, FormHostClient::GetInstance(), true);
756             if (ret == ERR_OK) {
757                 task.ResolveWithNoError(engine, engine.CreateUndefined());
758             } else {
759                 task.Reject(engine, NapiFormUtil::CreateErrorByInternalErrorCode(engine, ret));
760             }
761         };
762 
763         NativeValue* lastParam = (info.argc <= convertArgc) ? nullptr : info.argv[convertArgc];
764         NativeValue *result = nullptr;
765         AsyncTask::ScheduleWithDefaultQos("JsFormHost::OnEnableFormsUpdate",
766             engine, CreateAsyncTaskWithLastParam(engine, lastParam, nullptr, std::move(complete), &result));
767         return result;
768     }
769 
OnDisableFormsUpdate(NativeEngine & engine,const NativeCallbackInfo & info)770     NativeValue* OnDisableFormsUpdate(NativeEngine &engine, const NativeCallbackInfo &info)
771     {
772         HILOG_DEBUG("%{public}s is called", __FUNCTION__);
773 
774         if (info.argc > ARGS_TWO || info.argc < ARGS_ONE) {
775             HILOG_ERROR("wrong number of arguments.");
776             NapiFormUtil::ThrowParamNumError(engine, std::to_string(info.argc), "1 or 2");
777             return engine.CreateUndefined();
778     }
779 
780         decltype(info.argc) convertArgc = 0;
781         std::vector<int64_t> iFormIds;
782         if (!ConvertFromIds(engine, info.argv[PARAM0], iFormIds)) {
783             HILOG_ERROR("form id list is invalid.");
784             NapiFormUtil::ThrowParamTypeError(engine, "formIds", "Array<string>");
785             return engine.CreateUndefined();
786         }
787         convertArgc++;
788 
789         auto complete = [formIds = iFormIds](NativeEngine &engine, AsyncTask &task, int32_t status) {
790             auto ret = FormMgr::GetInstance().LifecycleUpdate(formIds, FormHostClient::GetInstance(), false);
791             if (ret != ERR_OK) {
792                 task.Reject(engine, NapiFormUtil::CreateErrorByInternalErrorCode(engine, ret));
793                 return;
794             }
795             task.ResolveWithNoError(engine, engine.CreateUndefined());
796         };
797 
798         NativeValue* lastParam = (info.argc <= convertArgc) ? nullptr : info.argv[convertArgc];
799         NativeValue *result = nullptr;
800         AsyncTask::ScheduleWithDefaultQos("JsFormHost::OnDisableFormsUpdate",
801             engine, CreateAsyncTaskWithLastParam(engine, lastParam, nullptr, std::move(complete), &result));
802         return result;
803     }
804 
OnIsSystemReady(NativeEngine & engine,const NativeCallbackInfo & info)805     NativeValue* OnIsSystemReady(NativeEngine &engine, const NativeCallbackInfo &info)
806     {
807         HILOG_DEBUG("%{public}s is called", __FUNCTION__);
808 
809         if (!CheckCallerIsSystemApp()) {
810             HILOG_ERROR("This application is not system-app, can not use system-api");
811             NapiFormUtil::ThrowByExternalErrorCode(engine, ERR_FORM_EXTERNAL_NOT_SYSTEM_APP);
812             return engine.CreateUndefined();
813         }
814 
815         if (info.argc > ARGS_ONE || info.argc < ARGS_ZERO) {
816             HILOG_ERROR("wrong number of arguments.");
817             NapiFormUtil::ThrowParamNumError(engine, std::to_string(info.argc), "0 or 1");
818             return engine.CreateUndefined();
819         }
820 
821         auto complete = [](NativeEngine &engine, AsyncTask &task, int32_t status) {
822             // Use original logic.
823             // Use the error code to return whether the function executed successfully.
824             auto ret = FormMgr::GetInstance().CheckFMSReady() ? 0 : 1;
825             if( ret == ERR_OK ) {
826                 task.ResolveWithNoError(engine, engine.CreateUndefined());
827             } else {
828                 task.Reject(engine, NapiFormUtil::CreateErrorByInternalErrorCode(engine, ret));
829             }
830         };
831 
832         auto callback = (info.argc == ARGS_ZERO) ? nullptr : info.argv[PARAM0];
833         NativeValue *result = nullptr;
834         AsyncTask::ScheduleWithDefaultQos("JsFormHost::OnIsSystemReady",
835             engine, CreateAsyncTaskWithLastParam(engine, callback, nullptr, std::move(complete), &result));
836         return result;
837     }
838 
OnDeleteInvalidForms(NativeEngine & engine,const NativeCallbackInfo & info)839     NativeValue* OnDeleteInvalidForms(NativeEngine &engine, const NativeCallbackInfo &info)
840     {
841         HILOG_DEBUG("%{public}s is called", __FUNCTION__);
842 
843         if (info.argc > ARGS_TWO|| info.argc < ARGS_ONE) {
844             HILOG_ERROR("wrong number of arguments.");
845             NapiFormUtil::ThrowParamNumError(engine, std::to_string(info.argc), "1 or 2");
846             return engine.CreateUndefined();
847         }
848 
849         decltype(info.argc) convertArgc = 0;
850         std::vector<int64_t> formIds;
851         if (!ConvertFromIds(engine, info.argv[PARAM0], formIds)) {
852             HILOG_ERROR("form id list is invalid.");
853             NapiFormUtil::ThrowParamTypeError(engine, "formIds", "Array<string>");
854             return engine.CreateUndefined();
855         }
856         convertArgc++;
857 
858         auto complete = [formIds](NativeEngine &engine, AsyncTask &task, int32_t status) {
859             int32_t num;
860             auto ret = FormMgr::GetInstance().DeleteInvalidForms(formIds, FormHostClient::GetInstance(), num);
861             if (ret == ERR_OK) {
862                 task.ResolveWithNoError(engine, CreateJsValue(engine, num));
863             } else {
864                 task.Reject(engine, NapiFormUtil::CreateErrorByInternalErrorCode(engine, ret));
865             }
866         };
867 
868         NativeValue* lastParam = (info.argc <= convertArgc) ? nullptr : info.argv[convertArgc];
869         NativeValue *result = nullptr;
870         AsyncTask::ScheduleWithDefaultQos("JsFormHost::OnEnableFormsUpdate",
871             engine, CreateAsyncTaskWithLastParam(engine, lastParam, nullptr, std::move(complete), &result));
872         return result;
873     }
874 
InnerAcquireFormState(NativeEngine & engine,const std::shared_ptr<AsyncTask> & asyncTask,JsFormStateCallbackClient::AcquireFormStateTask && task,const Want & want)875     void InnerAcquireFormState(
876         NativeEngine &engine,
877         const std::shared_ptr<AsyncTask> &asyncTask,
878         JsFormStateCallbackClient::AcquireFormStateTask &&task,
879         const Want &want)
880     {
881         auto formStateCallback = std::make_shared<JsFormStateCallbackClient>(std::move(task));
882         FormHostClient::GetInstance()->AddFormState(formStateCallback, want);
883         FormStateInfo stateInfo;
884         auto result = FormMgr::GetInstance().AcquireFormState(want, FormHostClient::GetInstance(), stateInfo);
885         formStateCallback->SetWant(stateInfo.want);
886         if (result != ERR_OK) {
887             HILOG_DEBUG("AcquireFormState failed.");
888             asyncTask->Reject(engine, NapiFormUtil::CreateErrorByInternalErrorCode(engine, result));
889             FormHostClient::GetInstance()->RemoveFormState(want);
890         }
891     }
892 
OnAcquireFormState(NativeEngine & engine,NativeCallbackInfo & info)893     NativeValue* OnAcquireFormState(NativeEngine &engine, NativeCallbackInfo &info)
894     {
895         HILOG_DEBUG("%{public}s is called", __FUNCTION__);
896         if (info.argc > ARGS_TWO || info.argc < ARGS_ONE) {
897             NapiFormUtil::ThrowParamNumError(engine, std::to_string(info.argc), "1 or 2");
898             return engine.CreateUndefined();
899         }
900 
901         Want want;
902         auto env = reinterpret_cast<napi_env>(&engine);
903         auto argWant = reinterpret_cast<napi_value>(info.argv[PARAM0]);
904         if (!UnwrapWant(env, argWant, want)) {
905             HILOG_ERROR("want is invalid.");
906             NapiFormUtil::ThrowParamTypeError(engine, "want", "Want");
907             return engine.CreateUndefined();
908         }
909 
910         NativeValue *lastParam = (info.argc == ARGS_ONE) ? nullptr : info.argv[PARAM1];
911         NativeValue *result = nullptr;
912 
913         std::unique_ptr<AbilityRuntime::AsyncTask> uasyncTask =
914             AbilityRuntime::CreateAsyncTaskWithLastParam(engine, lastParam, nullptr, nullptr, &result);
915         std::shared_ptr<AbilityRuntime::AsyncTask> asyncTask = std::move(uasyncTask);
916 
917         JsFormStateCallbackClient::AcquireFormStateTask task = [&engine, asyncTask](int32_t state, Want want) {
918             HILOG_DEBUG("task complete state: %{public}d", state);
919             NativeValue *objValue = engine.CreateObject();
920             NativeObject *object = ConvertNativeValueTo<NativeObject>(objValue);
921             object->SetProperty("want", CreateJsWant(engine, want));
922             object->SetProperty("formState", CreateJsValue(engine, state));
923             asyncTask->ResolveWithNoError(engine, objValue);
924         };
925 
926         InnerAcquireFormState(engine, asyncTask, std::move(task), want);
927         return result;
928     }
929 
OnRegisterFormAddObserver(NativeEngine & engine,NativeCallbackInfo & info)930     NativeValue* OnRegisterFormAddObserver(NativeEngine &engine, NativeCallbackInfo &info)
931     {
932         HILOG_DEBUG("called.");
933         // Check the number of input parameters.
934         if (info.argc > ARGS_THREE|| info.argc < ARGS_TWO) {
935             HILOG_ERROR("wrong number of arguments.");
936             NapiFormUtil::ThrowParamNumError(engine, std::to_string(info.argc), "2 or 3");
937             return engine.CreateUndefined();
938         }
939 
940         std::string bundleName("");
941         if (info.argc == ARGS_THREE) {
942             // Check the type of the PARAM1 and convert it to string.
943             if (info.argv[PARAM1]->TypeOf() != NATIVE_STRING) {
944                 HILOG_ERROR("param1 is invalid");
945                 NapiFormUtil::ThrowParamTypeError(engine, "bundleName", "string");
946                 return engine.CreateUndefined();
947             }
948             if (!ConvertFromJsValue(engine, info.argv[PARAM1], bundleName)) {
949                 HILOG_ERROR("convert type failed!");
950                 NapiFormUtil::ThrowParamTypeError(engine, "bundleName", "string");
951                 return engine.CreateUndefined();
952             }
953         } else {
954             bundleName = "all";
955         }
956 
957         if (info.argv[info.argc - 1]->TypeOf() != NATIVE_FUNCTION) {
958             HILOG_ERROR("the last param is invalid");
959             NapiFormUtil::ThrowParamTypeError(engine, "callback", "Callback<formInfo.RunningFormInfo>");
960             return engine.CreateUndefined();
961         }
962 
963         // Check the size of the map.
964         if (!JsFormStateObserver::GetInstance()->CheckMapSize("formAdd", bundleName)) {
965             NapiFormUtil::ThrowParamError(engine,
966                 "The number of bundleNames registered to listen has exceeded the limit");
967             return engine.CreateUndefined();
968         }
969 
970         if (!JsFormStateObserver::GetInstance()->RegisterFormAddCallback(reinterpret_cast<napi_env>(&engine),
971             bundleName, reinterpret_cast<napi_value>(info.argv[info.argc - 1]))) {
972             return engine.CreateUndefined();
973         }
974         FormMgr::GetInstance().RegisterFormAddObserverByBundle(bundleName, JsFormStateObserver::GetInstance());
975         return engine.CreateUndefined();
976     }
977 
OnRegisterFormRemoveObserver(NativeEngine & engine,NativeCallbackInfo & info)978     NativeValue* OnRegisterFormRemoveObserver(NativeEngine &engine, NativeCallbackInfo &info)
979     {
980         HILOG_DEBUG("called.");
981         // Check the number of input parameters.
982         if (info.argc > ARGS_THREE|| info.argc < ARGS_TWO) {
983             HILOG_ERROR("wrong number of arguments.");
984             NapiFormUtil::ThrowParamNumError(engine, std::to_string(info.argc), "2 or 3");
985             return engine.CreateUndefined();
986         }
987 
988         std::string bundleName("");
989         if (info.argc == ARGS_THREE) {
990             // Check the type of the PARAM1 and convert it to string.
991             if (info.argv[PARAM1]->TypeOf() != NATIVE_STRING) {
992                 HILOG_ERROR("param1 is invalid");
993                 NapiFormUtil::ThrowParamTypeError(engine, "bundleName", "string");
994                 return engine.CreateUndefined();
995             }
996             if (!ConvertFromJsValue(engine, info.argv[PARAM1], bundleName)) {
997                 HILOG_ERROR("convert type failed!");
998                 NapiFormUtil::ThrowParamTypeError(engine, "bundleName", "string");
999                 return engine.CreateUndefined();
1000             }
1001         } else {
1002             bundleName = "all";
1003         }
1004 
1005         if (info.argv[info.argc - 1]->TypeOf() != NATIVE_FUNCTION) {
1006             HILOG_ERROR("the last param is invalid");
1007             NapiFormUtil::ThrowParamTypeError(engine, "callback", "Callback<formInfo.RunningFormInfo>");
1008             return engine.CreateUndefined();
1009         }
1010 
1011         // Check the size of the map.
1012         if (!JsFormStateObserver::GetInstance()->CheckMapSize("formRemove", bundleName)) {
1013             NapiFormUtil::ThrowParamError(engine,
1014                 "The number of bundleNames registered to listen has exceeded the limit");
1015             return engine.CreateUndefined();
1016         }
1017 
1018         if (!JsFormStateObserver::GetInstance()->RegisterFormRemoveCallback(reinterpret_cast<napi_env>(&engine),
1019             bundleName, reinterpret_cast<napi_value>(info.argv[info.argc - 1]))) {
1020             return engine.CreateUndefined();
1021         }
1022 
1023         FormMgr::GetInstance().RegisterFormRemoveObserverByBundle(bundleName, JsFormStateObserver::GetInstance());
1024         return engine.CreateUndefined();
1025     }
OnRegisterFormUninstallObserver(NativeEngine & engine,NativeCallbackInfo & info)1026     NativeValue* OnRegisterFormUninstallObserver(NativeEngine &engine, NativeCallbackInfo &info)
1027     {
1028         // Check the number of input parameters.
1029         if (info.argc != ARGS_TWO) {
1030             HILOG_ERROR("wrong number of arguments.");
1031             NapiFormUtil::ThrowParamNumError(engine, std::to_string(info.argc), "2");
1032             return engine.CreateUndefined();
1033         }
1034 
1035         // Check the type of the PARAM1.
1036         if (info.argv[PARAM1]->TypeOf() != NATIVE_FUNCTION) {
1037             HILOG_ERROR("param1 is invalid");
1038             NapiFormUtil::ThrowParamTypeError(engine, "callback", "Callback<string>");
1039             return engine.CreateUndefined();
1040         }
1041         FormHostClient::GetInstance()->RegisterUninstallCallback(FormUninstallCallback);
1042         AddFormUninstallCallback(reinterpret_cast<napi_env>(&engine), reinterpret_cast<napi_value>(info.argv[1]));
1043         return engine.CreateUndefined();
1044     }
1045 
OnRegisterFormObserver(NativeEngine & engine,NativeCallbackInfo & info)1046     NativeValue* OnRegisterFormObserver(NativeEngine &engine, NativeCallbackInfo &info)
1047     {
1048         HILOG_DEBUG("called.");
1049 
1050         if (!CheckCallerIsSystemApp()) {
1051             HILOG_ERROR("This application is not system-app, can not use system-api");
1052             NapiFormUtil::ThrowByExternalErrorCode(engine, ERR_FORM_EXTERNAL_NOT_SYSTEM_APP);
1053             return engine.CreateUndefined();
1054         }
1055 
1056         // Check the type of the PARAM0 and convert it to string.
1057         if (info.argv[PARAM0]->TypeOf() != NATIVE_STRING) {
1058             HILOG_ERROR("param0 is invalid");
1059             NapiFormUtil::ThrowParamTypeError(engine, "type",
1060                 "formAdd, formRemove, formUninstall, notifyVisible or notifyInvisible.");
1061             return engine.CreateUndefined();
1062         }
1063 
1064         std::string type;
1065         if (!ConvertFromJsValue(engine, info.argv[PARAM0], type)) {
1066             HILOG_ERROR("convert type failed!");
1067             NapiFormUtil::ThrowParamTypeError(engine, "type",
1068                 "formAdd, formRemove, formUninstall, notifyVisible or notifyInvisible.");
1069             return engine.CreateUndefined();
1070         }
1071 
1072         if (type == "formAdd") {
1073             return OnRegisterFormAddObserver(engine, info);
1074         } else if (type == "formRemove") {
1075             return OnRegisterFormRemoveObserver(engine, info);
1076         } else if (type == "formUninstall") {
1077             return OnRegisterFormUninstallObserver(engine, info);
1078         } else if (type == "notifyVisible") {
1079             return OnRegisteFormIsVisibleObserver(engine, info, true);
1080         } else if (type == "notifyInvisible") {
1081             return OnRegisteFormIsVisibleObserver(engine, info, false);
1082         } else {
1083             HILOG_ERROR("args[0] should be formAdd, formRemove, formUninstall, notifyVisible or notifyInvisible.");
1084             NapiFormUtil::ThrowParamTypeError(engine, "type",
1085                 "formAdd, formRemove, formUninstall, notifyVisible or notifyInvisible");
1086             return engine.CreateUndefined();
1087         }
1088     }
1089 
OnRegisteFormIsVisibleObserver(NativeEngine & engine,NativeCallbackInfo & info,bool isVisibility)1090     NativeValue* OnRegisteFormIsVisibleObserver(NativeEngine &engine, NativeCallbackInfo &info, bool isVisibility)
1091     {
1092         HILOG_DEBUG("called.");
1093         if (info.argc < ARGS_TWO || info.argc > ARGS_THREE) {
1094             HILOG_ERROR("wrong number of arguments.");
1095             NapiFormUtil::ThrowParamNumError(engine, std::to_string(info.argc), "2");
1096             return engine.CreateUndefined();
1097         }
1098 
1099         int32_t funcPos = 0;
1100         std::string bundleName(EMPTY_BUNDLE);
1101         if (info.argv[PARAM1]->TypeOf() == NATIVE_FUNCTION) {
1102             // There are two or more arguments, and the type of argument2 is function.
1103             funcPos = PARAM1;
1104         } else if (info.argv[PARAM1]->TypeOf() == NATIVE_STRING) {
1105             // There are three or more arguments, and the type of argument2 is string.
1106             if (!ConvertFromJsValue(engine, info.argv[PARAM1], bundleName)) {
1107                 HILOG_ERROR("param1 is invalid");
1108                 NapiFormUtil::ThrowParamTypeError(engine, "bundleName", "string");
1109                 return engine.CreateUndefined();
1110             }
1111             if (bundleName.empty()) {
1112                 HILOG_ERROR("bundleName is empty!");
1113                 NapiFormUtil::ThrowParamTypeError(engine, "bundleName", "string");
1114                 return engine.CreateUndefined();
1115             }
1116             funcPos = PARAM2;
1117         } else {
1118             HILOG_ERROR("param1 is invalid");
1119             NapiFormUtil::ThrowParamTypeError(engine, "param 2", "type");
1120             return engine.CreateUndefined();
1121         }
1122 
1123         if (info.argv[funcPos]->TypeOf() != NATIVE_FUNCTION) {
1124             HILOG_ERROR("the last param is invalid");
1125             NapiFormUtil::ThrowParamTypeError(engine, "callback", "Callback<Array<RunningFormInfo>>");
1126             return engine.CreateUndefined();
1127         }
1128 
1129         if (formObserver_ == nullptr) {
1130             HILOG_ERROR("formObserver_ is nullptr");
1131             formObserver_ = JsFormStateObserver::GetInstance();
1132         }
1133         JsFormStateObserver::GetInstance()->
1134             RegisterFormInstanceCallback(engine, info.argv[funcPos], isVisibility, bundleName, formObserver_);
1135         return engine.CreateUndefined();
1136     }
1137 
OnUnregisterFormIsVisibleObserver(NativeEngine & engine,NativeCallbackInfo & info,bool isVisibility)1138     NativeValue* OnUnregisterFormIsVisibleObserver(NativeEngine &engine, NativeCallbackInfo &info, bool isVisibility)
1139     {
1140         HILOG_DEBUG("called.");
1141         int32_t funcPos = 0;
1142         int32_t bundlePos = 0;
1143         if (info.argc < ARGS_ONE || info.argc > ARGS_THREE) {
1144             HILOG_ERROR("wrong number of arguments.");
1145             NapiFormUtil::ThrowParamNumError(engine, std::to_string(info.argc), "1 or 2 or 3");
1146             return engine.CreateUndefined();
1147         }
1148         std::string bundleName(EMPTY_BUNDLE);
1149         if (info.argc == ARGS_TWO) {
1150             if (info.argv[PARAM1]->TypeOf() == NATIVE_FUNCTION) {
1151                 HILOG_DEBUG("param1 is function");
1152                 funcPos = PARAM1;
1153             } else if (info.argv[PARAM1]->TypeOf() == NATIVE_STRING) {
1154                 bundlePos = PARAM1;
1155             } else {
1156                 NapiFormUtil::ThrowParamTypeError(engine, "param 2", "type");
1157                 return engine.CreateUndefined();
1158             }
1159         }
1160 
1161         if (info.argc == ARGS_THREE) {
1162             HILOG_DEBUG("There are three params.");
1163             if (info.argv[PARAM1]->TypeOf() == NATIVE_STRING && info.argv[PARAM2]->TypeOf() == NATIVE_FUNCTION) {
1164                 bundlePos = PARAM1;
1165                 funcPos = PARAM2;
1166             } else {
1167                 NapiFormUtil::ThrowParamTypeError(engine, "param 2 or 3", "type");
1168                 return engine.CreateUndefined();
1169             }
1170         }
1171 
1172         if (bundlePos != 0) {
1173             if (!ConvertFromJsValue(engine, info.argv[bundlePos], bundleName)) {
1174                 HILOG_ERROR("convert bundleName failed!");
1175                 NapiFormUtil::ThrowParamTypeError(engine, "bundleName", "string");
1176                 return engine.CreateUndefined();
1177             }
1178             if (bundleName.empty()) {
1179                 HILOG_ERROR("bundleName is empty!");
1180                 NapiFormUtil::ThrowParamTypeError(engine, "bundleName", "string");
1181                 return engine.CreateUndefined();
1182             }
1183         }
1184 
1185         if (funcPos != 0) {
1186             JsFormStateObserver::GetInstance()->
1187                 DelFormNotifyVisibleCallbackByBundle(bundleName, isVisibility, info.argv[funcPos], formObserver_);
1188             return engine.CreateUndefined();
1189         }
1190         // If there is only one argument.
1191         JsFormStateObserver::GetInstance()->
1192             ClearFormNotifyVisibleCallbackByBundle(bundleName, isVisibility, formObserver_);
1193         return engine.CreateUndefined();
1194     }
1195 
OnUnregisterFormUninstallObserver(NativeEngine & engine,NativeCallbackInfo & info)1196     NativeValue* OnUnregisterFormUninstallObserver(NativeEngine &engine, NativeCallbackInfo &info)
1197     {
1198         // Check the number of input parameters.
1199         if (info.argc > ARGS_TWO|| info.argc < ARGS_ONE) {
1200             HILOG_ERROR("wrong number of arguments.");
1201             NapiFormUtil::ThrowParamNumError(engine, std::to_string(info.argc), "1 or 2");
1202             return engine.CreateUndefined();
1203         }
1204 
1205         // Check the type of the PARAM1.
1206         if (info.argc == ARGS_TWO && info.argv[PARAM1]->TypeOf() != NATIVE_FUNCTION) {
1207             HILOG_ERROR("param1 is invalid");
1208             NapiFormUtil::ThrowParamTypeError(engine, "callback", "Callback<string>");
1209             return engine.CreateUndefined();
1210         }
1211 
1212         if (info.argc == ARGS_TWO) {
1213             DelFormUninstallCallback(reinterpret_cast<napi_value>(info.argv[PARAM1]));
1214             return engine.CreateUndefined();
1215         }
1216 
1217         ClearFormUninstallCallback();
1218         return engine.CreateUndefined();
1219     }
1220 
OnUnregisterFormRemoveObserver(NativeEngine & engine,NativeCallbackInfo & info)1221     NativeValue* OnUnregisterFormRemoveObserver(NativeEngine &engine, NativeCallbackInfo &info)
1222     {
1223         // Check the number of input parameters.
1224         if (info.argc > ARGS_THREE|| info.argc < ARGS_ONE) {
1225             HILOG_ERROR("wrong number of arguments.");
1226             NapiFormUtil::ThrowParamNumError(engine, std::to_string(info.argc), "1 or 2 or 3");
1227             return engine.CreateUndefined();
1228         }
1229 
1230         // If there is only one argument, all listening will be cancelled.
1231         if (info.argc == ARGS_ONE) {
1232             JsFormStateObserver::GetInstance()->ClearFormRemoveCallbackByBundle("all");
1233             return engine.CreateUndefined();
1234         }
1235 
1236         if (info.argc == ARGS_TWO) {
1237             if (info.argv[PARAM1]->TypeOf() == NATIVE_FUNCTION) {
1238                 JsFormStateObserver::GetInstance()->DelFormRemoveCallbackByBundle(
1239                     reinterpret_cast<napi_value>(info.argv[PARAM1]), "all");
1240                 return engine.CreateUndefined();
1241             } else if (info.argv[PARAM1]->TypeOf() == NATIVE_STRING) {
1242                 std::string bundleName;
1243                 if (!ConvertFromJsValue(engine, info.argv[PARAM1], bundleName)) {
1244                     HILOG_ERROR("convert bundleName failed!");
1245                     NapiFormUtil::ThrowParamTypeError(engine, "bundleName", "string");
1246                     return engine.CreateUndefined();
1247                 }
1248                 JsFormStateObserver::GetInstance()->ClearFormRemoveCallbackByBundle(bundleName);
1249                 return engine.CreateUndefined();
1250             } else {
1251                 HILOG_ERROR("param1 is invalid");
1252                 NapiFormUtil::ThrowParamTypeError(engine, "callback or bundleName",
1253                     "Callback<formInfo.RunningFormInfo> or string");
1254                 return engine.CreateUndefined();
1255             }
1256         }
1257 
1258         if (info.argc == ARGS_THREE) {
1259             if (info.argv[PARAM1]->TypeOf() != NATIVE_STRING) {
1260                 HILOG_ERROR("param1 is invalid");
1261                 NapiFormUtil::ThrowParamTypeError(engine, "bundleName", "string");
1262                 return engine.CreateUndefined();
1263             }
1264             if (info.argv[PARAM2]->TypeOf() != NATIVE_FUNCTION) {
1265                 HILOG_ERROR("param2 is invalid");
1266                 NapiFormUtil::ThrowParamTypeError(engine, "callback", "Callback<formInfo.RunningFormInfo>");
1267                 return engine.CreateUndefined();
1268             }
1269             std::string bundleName;
1270             if (!ConvertFromJsValue(engine, info.argv[PARAM1], bundleName)) {
1271                 HILOG_ERROR("convert bundleName failed!");
1272                 NapiFormUtil::ThrowParamTypeError(engine, "bundleName", "string");
1273                 return engine.CreateUndefined();
1274             }
1275             JsFormStateObserver::GetInstance()->DelFormRemoveCallbackByBundle(
1276                 reinterpret_cast<napi_value>(info.argv[PARAM2]), bundleName);
1277             return engine.CreateUndefined();
1278         }
1279         return engine.CreateUndefined();
1280     }
1281 
OnUnregisterFormAddObserver(NativeEngine & engine,NativeCallbackInfo & info)1282     NativeValue* OnUnregisterFormAddObserver(NativeEngine &engine, NativeCallbackInfo &info)
1283     {
1284         // Check the number of input parameters.
1285         if (info.argc > ARGS_THREE|| info.argc < ARGS_ONE) {
1286             HILOG_ERROR("wrong number of arguments.");
1287             NapiFormUtil::ThrowParamNumError(engine, std::to_string(info.argc), "1 or 2 or 3");
1288             return engine.CreateUndefined();
1289         }
1290 
1291         // If there is only one argument, full listening will be cancelled.
1292         if (info.argc == ARGS_ONE) {
1293             JsFormStateObserver::GetInstance()->ClearFormAddCallbackByBundle("all");
1294             return engine.CreateUndefined();
1295         }
1296 
1297         if (info.argc == ARGS_TWO) {
1298             if (info.argv[PARAM1]->TypeOf() == NATIVE_FUNCTION) {
1299                 JsFormStateObserver::GetInstance()->DelFormAddCallbackByBundle(
1300                     reinterpret_cast<napi_value>(info.argv[PARAM1]), "all");
1301                 return engine.CreateUndefined();
1302             } else if (info.argv[PARAM1]->TypeOf() == NATIVE_STRING) {
1303                 std::string bundleName;
1304                 if (!ConvertFromJsValue(engine, info.argv[PARAM1], bundleName)) {
1305                     HILOG_ERROR("convert bundleName failed!");
1306                     NapiFormUtil::ThrowParamTypeError(engine, "bundleName", "string");
1307                     return engine.CreateUndefined();
1308                 }
1309                 JsFormStateObserver::GetInstance()->ClearFormAddCallbackByBundle(bundleName);
1310                 return engine.CreateUndefined();
1311             } else {
1312                 HILOG_ERROR("param1 is invalid");
1313                 NapiFormUtil::ThrowParamTypeError(engine, "callback or bundleName",
1314                     "Callback<formInfo.RunningFormInfo> or string");
1315                 return engine.CreateUndefined();
1316             }
1317         }
1318 
1319         if (info.argc == ARGS_THREE) {
1320             if (info.argv[PARAM1]->TypeOf() != NATIVE_STRING) {
1321                 HILOG_ERROR("param1 is invalid");
1322                 NapiFormUtil::ThrowParamTypeError(engine, "bundleName", "string");
1323                 return engine.CreateUndefined();
1324             }
1325             if (info.argv[PARAM2]->TypeOf() != NATIVE_FUNCTION) {
1326                 HILOG_ERROR("param2 is invalid");
1327                 NapiFormUtil::ThrowParamTypeError(engine, "callback", "Callback<formInfo.RunningFormInfo>");
1328                 return engine.CreateUndefined();
1329             }
1330             std::string bundleName;
1331             if (!ConvertFromJsValue(engine, info.argv[PARAM1], bundleName)) {
1332                 HILOG_ERROR("convert bundleName failed!");
1333                 NapiFormUtil::ThrowParamTypeError(engine, "bundleName", "string");
1334                 return engine.CreateUndefined();
1335             }
1336             JsFormStateObserver::GetInstance()->DelFormAddCallbackByBundle(
1337                 reinterpret_cast<napi_value>(info.argv[PARAM2]), bundleName);
1338             return engine.CreateUndefined();
1339         }
1340         return engine.CreateUndefined();
1341     }
1342 
OnUnregisterFormObserver(NativeEngine & engine,NativeCallbackInfo & info)1343     NativeValue* OnUnregisterFormObserver(NativeEngine &engine, NativeCallbackInfo &info)
1344     {
1345         HILOG_DEBUG("called.");
1346 
1347         if (!CheckCallerIsSystemApp()) {
1348             HILOG_ERROR("This application is not system-app, can not use system-api");
1349             NapiFormUtil::ThrowByExternalErrorCode(engine, ERR_FORM_EXTERNAL_NOT_SYSTEM_APP);
1350             return engine.CreateUndefined();
1351         }
1352 
1353         // Check the type of the PARAM0 and convert it to string.
1354         if (info.argv[PARAM0]->TypeOf() != NATIVE_STRING) {
1355             HILOG_ERROR("param0 is invalid");
1356             NapiFormUtil::ThrowParamTypeError(engine, "type",
1357                 "formAdd, formRemove, formUninstall, notifyVisible or invisibility.");
1358             return engine.CreateUndefined();
1359         }
1360         std::string type;
1361         if (!ConvertFromJsValue(engine, info.argv[PARAM0], type)) {
1362             HILOG_ERROR("convert type failed!");
1363             NapiFormUtil::ThrowParamTypeError(engine, "type",
1364                 "formAdd, formRemove, formUninstall, notifyVisible or notifyInvisible.");
1365             return engine.CreateUndefined();
1366         }
1367 
1368         if (type == "formAdd") {
1369             return OnUnregisterFormAddObserver(engine, info);
1370         } else if (type == "formRemove") {
1371             return OnUnregisterFormRemoveObserver(engine, info);
1372         } else if (type == "notifyVisible") {
1373             return OnUnregisterFormIsVisibleObserver(engine, info, true);
1374         } else if (type == "notifyInvisible") {
1375             return OnUnregisterFormIsVisibleObserver(engine, info, false);
1376         } else if (type == "formUninstall") {
1377             return OnUnregisterFormUninstallObserver(engine, info);
1378         } else {
1379             HILOG_ERROR("args[0] should be formAdd, formRemove, formUninstall, visibility or notifyInvisible.");
1380             NapiFormUtil::ThrowParamTypeError(engine,
1381                 "type", "formAdd, formRemove, formUninstall, visibility or notifyInvisible");
1382             return engine.CreateUndefined();
1383         }
1384     }
1385 
OnNotifyFormsVisible(NativeEngine & engine,const NativeCallbackInfo & info)1386     NativeValue* OnNotifyFormsVisible(NativeEngine &engine, const NativeCallbackInfo &info)
1387     {
1388         HILOG_DEBUG("%{public}s is called", __FUNCTION__);
1389 
1390         if (info.argc > ARGS_THREE|| info.argc < ARGS_TWO) {
1391             HILOG_ERROR("wrong number of arguments.");
1392             NapiFormUtil::ThrowParamNumError(engine, std::to_string(info.argc), "2 or 3");
1393             return engine.CreateUndefined();
1394         }
1395 
1396         decltype(info.argc) convertArgc = 0;
1397         std::vector<int64_t> formIds;
1398         if (!ConvertFromIds(engine, info.argv[PARAM0], formIds)) {
1399             HILOG_ERROR("form id list is invalid.");
1400             NapiFormUtil::ThrowParamTypeError(engine, "formIds", "Array<string>");
1401             return engine.CreateUndefined();
1402         }
1403         convertArgc++;
1404 
1405         bool isVisible = false;
1406         if (info.argv[PARAM1]->TypeOf() != NATIVE_BOOLEAN) {
1407             HILOG_ERROR("promise second param type is illegal");
1408             NapiFormUtil::ThrowParamTypeError(engine, "isVisible", "boolean");
1409             return engine.CreateUndefined();
1410         }
1411         if (!ConvertFromJsValue(engine, info.argv[PARAM1], isVisible)) {
1412             HILOG_ERROR("convert isVisible failed!");
1413             NapiFormUtil::ThrowParamTypeError(engine, "isVisible", "boolean");
1414             return engine.CreateUndefined();
1415         }
1416         convertArgc++;
1417 
1418         auto complete = [formIds, isVisible](NativeEngine &engine, AsyncTask &task, int32_t status) {
1419             auto ret = FormMgr::GetInstance().NotifyFormsVisible(formIds, isVisible,
1420                 FormHostClient::GetInstance());
1421             if (ret == ERR_OK) {
1422                 task.ResolveWithNoError(engine, engine.CreateUndefined());
1423             } else {
1424                 task.Reject(engine, NapiFormUtil::CreateErrorByInternalErrorCode(engine, ret));
1425             }
1426         };
1427 
1428         NativeValue* lastParam = (info.argc <= convertArgc) ? nullptr : info.argv[convertArgc];
1429         NativeValue *result = nullptr;
1430         AsyncTask::ScheduleWithDefaultQos("JsFormHost::OnNotifyFormsVisible",
1431             engine, CreateAsyncTaskWithLastParam(engine, lastParam, nullptr, std::move(complete), &result));
1432         return result;
1433     }
1434 
OnNotifyFormsEnableUpdate(NativeEngine & engine,NativeCallbackInfo & info)1435     NativeValue* OnNotifyFormsEnableUpdate(NativeEngine &engine, NativeCallbackInfo &info)
1436     {
1437         HILOG_DEBUG("%{public}s is called", __FUNCTION__);
1438 
1439         if (info.argc > ARGS_THREE|| info.argc < ARGS_TWO) {
1440             HILOG_ERROR("wrong number of arguments.");
1441             NapiFormUtil::ThrowParamNumError(engine, std::to_string(info.argc), "2 or 3");
1442             return engine.CreateUndefined();
1443         }
1444 
1445         decltype(info.argc) convertArgc = 0;
1446         std::vector<int64_t> formIds;
1447         if (!ConvertFromIds(engine, info.argv[PARAM0], formIds)) {
1448             HILOG_ERROR("form id list is invalid.");
1449             NapiFormUtil::ThrowParamTypeError(engine, "formIds", "Array<string>");
1450             return engine.CreateUndefined();
1451         }
1452         convertArgc++;
1453 
1454         bool isEnableUpdate = false;
1455         if (info.argv[PARAM1]->TypeOf() != NATIVE_BOOLEAN) {
1456             HILOG_ERROR("promise second param type is illegal");
1457             NapiFormUtil::ThrowParamTypeError(engine, "isEnableUpdate", "boolean");
1458             return engine.CreateUndefined();
1459         }
1460         if (!ConvertFromJsValue(engine, info.argv[PARAM1], isEnableUpdate)) {
1461             HILOG_ERROR("convert isEnableUpdate failed!");
1462             NapiFormUtil::ThrowParamTypeError(engine, "isEnableUpdate", "boolean");
1463             return engine.CreateUndefined();
1464         }
1465         convertArgc++;
1466 
1467         auto complete = [formIds, isEnableUpdate](NativeEngine &engine, AsyncTask &task, int32_t status) {
1468             auto ret = FormMgr::GetInstance().NotifyFormsEnableUpdate(formIds, isEnableUpdate,
1469                 FormHostClient::GetInstance());
1470             if (ret == ERR_OK) {
1471                 task.ResolveWithNoError(engine, engine.CreateUndefined());
1472             } else {
1473                 task.Reject(engine, NapiFormUtil::CreateErrorByInternalErrorCode(engine, ret));
1474             }
1475         };
1476 
1477         NativeValue* lastParam = (info.argc <= convertArgc) ? nullptr : info.argv[convertArgc];
1478         NativeValue *result = nullptr;
1479         AsyncTask::ScheduleWithDefaultQos("JsFormHost::OnNotifyFormsVisible",
1480             engine, CreateAsyncTaskWithLastParam(engine, lastParam, nullptr, std::move(complete), &result));
1481         return result;
1482     }
1483 
OnGetAllFormsInfo(NativeEngine & engine,const NativeCallbackInfo & info)1484     NativeValue* OnGetAllFormsInfo(NativeEngine &engine, const NativeCallbackInfo &info)
1485     {
1486         HILOG_DEBUG("%{public}s is called", __FUNCTION__);
1487         if (info.argc > ARGS_ONE || info.argc < ARGS_ZERO) {
1488             HILOG_ERROR("wrong number of arguments.");
1489             NapiFormUtil::ThrowParamNumError(engine, std::to_string(info.argc), "0 or 1");
1490             return engine.CreateUndefined();
1491         }
1492 
1493         auto complete = [](NativeEngine &engine, AsyncTask &task, int32_t status) {
1494             std::vector<FormInfo> formInfos;
1495             auto ret = FormMgr::GetInstance().GetAllFormsInfo(formInfos);
1496             if (ret != ERR_OK) {
1497                 task.Reject(engine, NapiFormUtil::CreateErrorByInternalErrorCode(engine, ret));
1498                 return;
1499             }
1500             task.ResolveWithNoError(engine, CreateFormInfos(engine, formInfos));
1501         };
1502 
1503         auto callback = (info.argc == ARGS_ZERO) ? nullptr : info.argv[PARAM0];
1504         NativeValue *result = nullptr;
1505         AsyncTask::ScheduleWithDefaultQos("JsFormHost::OnGetAllFormsInfo",
1506             engine, CreateAsyncTaskWithLastParam(engine, callback, nullptr, std::move(complete), &result));
1507         return result;
1508     }
1509 
OnGetFormsInfo(NativeEngine & engine,NativeCallbackInfo & info)1510     NativeValue* OnGetFormsInfo(NativeEngine &engine, NativeCallbackInfo &info)
1511     {
1512         HILOG_DEBUG("%{public}s is called", __FUNCTION__);
1513         if (info.argc > ARGS_THREE || info.argc < ARGS_ONE) {
1514             HILOG_ERROR("wrong number of arguments.");
1515             NapiFormUtil::ThrowParamNumError(engine, std::to_string(info.argc), "1 or 2 or 3");
1516             return engine.CreateUndefined();
1517         }
1518 
1519         if (info.argv[PARAM0] && info.argv[PARAM0]->TypeOf() != NATIVE_STRING) {
1520             HILOG_ERROR("input params is not string.");
1521             NapiFormUtil::ThrowParamTypeError(engine, "bundleName", "string");
1522             return engine.CreateUndefined();
1523         }
1524 
1525         decltype(info.argc) convertArgc = 0;
1526         std::string bName("");
1527         if (!ConvertFromJsValue(engine, info.argv[PARAM0], bName)) {
1528             HILOG_ERROR("bundle name convert failed.");
1529             NapiFormUtil::ThrowParamTypeError(engine, "bundleName", "string");
1530             return engine.CreateUndefined();
1531         }
1532         convertArgc++;
1533 
1534         std::string mName("");
1535         if ((info.argc == ARGS_TWO || info.argc == ARGS_THREE) && info.argv[PARAM1]->TypeOf() != NATIVE_FUNCTION) {
1536             if (info.argv[PARAM1]->TypeOf() != NATIVE_STRING) {
1537                 HILOG_ERROR("input params is not string");
1538                 NapiFormUtil::ThrowParamTypeError(engine, "moduleName", "string");
1539                 return engine.CreateUndefined();
1540             }
1541 
1542             if (!ConvertFromJsValue(engine, info.argv[PARAM1], mName)) {
1543                 HILOG_ERROR("module name convert failed.");
1544                 NapiFormUtil::ThrowParamTypeError(engine, "moduleName", "string");
1545                 return engine.CreateUndefined();
1546             }
1547             convertArgc++;
1548         }
1549 
1550         auto complete = [bName, mName, convertArgc](NativeEngine &engine, AsyncTask &task, int32_t status) {
1551             std::string bundleName(bName);
1552             std::string moduleName(mName);
1553             std::vector<FormInfo> formInfos;
1554             int ret = ERR_OK;
1555             if (convertArgc == ARGS_ONE) {
1556                 ret = FormMgr::GetInstance().GetFormsInfoByApp(bundleName, formInfos);
1557             } else {
1558                 ret = FormMgr::GetInstance().GetFormsInfoByModule(bundleName, moduleName, formInfos);
1559             }
1560 
1561             if (ret != ERR_OK) {
1562                 task.Reject(engine, NapiFormUtil::CreateErrorByInternalErrorCode(engine, ret));
1563                 return;
1564             }
1565             task.ResolveWithNoError(engine, CreateFormInfos(engine, formInfos));
1566         };
1567 
1568         NativeValue *result = nullptr;
1569         NativeValue* lastParam = (info.argc <= convertArgc) ? nullptr : info.argv[convertArgc];
1570         AsyncTask::ScheduleWithDefaultQos("JsFormHost::OnGetFormsInfo",
1571             engine, CreateAsyncTaskWithLastParam(engine, lastParam, nullptr, std::move(complete), &result));
1572         return result;
1573     }
1574 
OnGetRunningFormInfos(NativeEngine & engine,NativeCallbackInfo & info)1575     NativeValue* OnGetRunningFormInfos(NativeEngine &engine, NativeCallbackInfo &info)
1576     {
1577         HILOG_DEBUG("called");
1578         if (info.argc > ARGS_TWO) {
1579             HILOG_ERROR("wrong number of arguments.");
1580             NapiFormUtil::ThrowParamNumError(engine, std::to_string(info.argc), "0 or 1 or 2");
1581             return engine.CreateUndefined();
1582         }
1583 
1584         decltype(info.argc) convertArgc = 0;
1585         std::string bundleName("");
1586         if ((info.argc == ARGS_ONE) && (info.argv[PARAM0]->TypeOf() != NATIVE_FUNCTION)) {
1587             if (info.argv[PARAM0]->TypeOf() != NATIVE_STRING) {
1588                 HILOG_ERROR("input params is not a string");
1589                 NapiFormUtil::ThrowParamTypeError(engine, "bundleName", "string");
1590                 return engine.CreateUndefined();
1591             }
1592             if (!ConvertFromJsValue(engine, info.argv[PARAM0], bundleName)) {
1593                 HILOG_ERROR("bundleName convert failed.");
1594                 NapiFormUtil::ThrowParamTypeError(engine, "bundleName", "string");
1595                 return engine.CreateUndefined();
1596             }
1597             convertArgc++;
1598         }
1599 
1600         if (info.argc == ARGS_TWO) {
1601             if (info.argv[PARAM1]->TypeOf() != NATIVE_STRING) {
1602                 HILOG_ERROR("input params is not a string");
1603                 NapiFormUtil::ThrowParamTypeError(engine, "bundleName", "string");
1604                 return engine.CreateUndefined();
1605             }
1606             if (!ConvertFromJsValue(engine, info.argv[PARAM1], bundleName)) {
1607                 HILOG_ERROR("bundleName convert failed.");
1608                 NapiFormUtil::ThrowParamTypeError(engine, "bundleName", "string");
1609                 return engine.CreateUndefined();
1610             }
1611             convertArgc++;
1612         }
1613 
1614         auto complete = [bundleName, convertArgc](NativeEngine &engine, AsyncTask &task, int32_t status) {
1615             std::string hostBundleName(bundleName);
1616             std::vector<RunningFormInfo> runningFormInfos;
1617             int32_t ret = ERR_OK;
1618             if (convertArgc == ARGS_ZERO) {
1619                 ret = FormMgr::GetInstance().GetRunningFormInfos(runningFormInfos);
1620             } else {
1621                 ret = FormMgr::GetInstance().GetRunningFormInfosByBundleName(hostBundleName, runningFormInfos);
1622             }
1623             if (ret != ERR_OK) {
1624                 task.Reject(engine, NapiFormUtil::CreateErrorByInternalErrorCode(engine, ret));
1625                 return;
1626             }
1627             task.ResolveWithNoError(engine, CreateRunningFormInfos(engine, runningFormInfos));
1628         };
1629         NativeValue *result = nullptr;
1630         NativeValue *lastParam = nullptr;
1631         if (info.argc == ARGS_TWO) {
1632             lastParam = info.argv[ARGS_ZERO];
1633         } else {
1634             lastParam = (info.argc <= convertArgc) ? nullptr : info.argv[convertArgc];
1635         }
1636         AsyncTask::ScheduleWithDefaultQos("JsFormHost::OnGetRunningFormInfos",
1637             engine, CreateAsyncTaskWithLastParam(engine, lastParam, nullptr, std::move(complete), &result));
1638         return result;
1639     }
1640 
InnerShareForm(NativeEngine & engine,const std::shared_ptr<AbilityRuntime::AsyncTask> & asyncTask,ShareFormCallBackClient::ShareFormTask && task,int64_t formId,const std::string & remoteDeviceId)1641     void InnerShareForm(NativeEngine &engine, const std::shared_ptr<AbilityRuntime::AsyncTask> &asyncTask,
1642         ShareFormCallBackClient::ShareFormTask &&task, int64_t formId, const std::string &remoteDeviceId)
1643     {
1644         auto shareFormCallback = std::make_shared<ShareFormCallBackClient>(std::move(task));
1645         int64_t requestCode = SystemTimeMillis();
1646         FormHostClient::GetInstance()->AddShareFormCallback(shareFormCallback, requestCode);
1647 
1648         ErrCode ret = FormMgr::GetInstance().ShareForm(
1649             formId, remoteDeviceId, FormHostClient::GetInstance(), requestCode);
1650         if (ret != ERR_OK) {
1651             HILOG_INFO("%{public}s, share form failed.", __func__);
1652             asyncTask->Reject(engine, NapiFormUtil::CreateErrorByInternalErrorCode(engine, ret));
1653             FormHostClient::GetInstance()->RemoveShareFormCallback(requestCode);
1654         }
1655     }
1656 
InnerAcquireFormData(NativeEngine & engine,const std::shared_ptr<AbilityRuntime::AsyncTask> & asyncTask,JsFormDataCallbackClient::AcquireFormDataTask && task,int64_t formId)1657     void InnerAcquireFormData(NativeEngine &engine, const std::shared_ptr<AbilityRuntime::AsyncTask> &asyncTask,
1658        JsFormDataCallbackClient::AcquireFormDataTask &&task, int64_t formId)
1659     {
1660         auto formDataCallbackClient = std::make_shared<JsFormDataCallbackClient>(std::move(task));
1661         int64_t requestCode = SystemTimeMillis();
1662         FormHostClient::GetInstance()->AddAcqiureFormDataCallback(formDataCallbackClient, requestCode);
1663 
1664         AAFwk::WantParams formData;
1665         auto ret = FormMgr::GetInstance().AcquireFormData(formId, requestCode, FormHostClient::GetInstance(), formData);
1666         if (ret != ERR_OK) {
1667             HILOG_ERROR("acquire form failed.");
1668             asyncTask->Reject(engine, NapiFormUtil::CreateErrorByInternalErrorCode(engine, ret));
1669             FormHostClient::GetInstance()->RemoveAcquireDataCallback(requestCode);
1670         }
1671     }
1672 
OnShareForm(NativeEngine & engine,NativeCallbackInfo & info)1673     NativeValue* OnShareForm(NativeEngine &engine, NativeCallbackInfo &info)
1674     {
1675         HILOG_DEBUG("%{public}s is called", __FUNCTION__);
1676         if (info.argc > ARGS_THREE || info.argc < ARGS_TWO) {
1677             HILOG_ERROR("wrong number of arguments.");
1678             NapiFormUtil::ThrowParamNumError(engine, std::to_string(info.argc), "1 or 2 or 3");
1679             return engine.CreateUndefined();
1680         }
1681 
1682         decltype(info.argc) convertArgc = 0;
1683         HILOG_DEBUG("info.argv[PARAM0]->TypeOf() %{public}d", info.argv[PARAM0]->TypeOf());
1684         int64_t formId = 0;
1685         if (!ConvertFromId(engine, info.argv[PARAM0], formId)) {
1686             HILOG_ERROR("form id is invalid.");
1687             NapiFormUtil::ThrowParamTypeError(engine, "formId", "string");
1688             return engine.CreateUndefined();
1689         }
1690         convertArgc++;
1691 
1692         std::string devicedId;
1693         if (!ConvertDeviceId(engine, info.argv[PARAM1], devicedId)) {
1694             HILOG_ERROR("deviced id is invalid.");
1695             NapiFormUtil::ThrowParamTypeError(engine, "devicedId", "string");
1696             return engine.CreateUndefined();
1697         }
1698         convertArgc++;
1699 
1700         NativeValue *lastParam = (info.argc <= convertArgc) ? nullptr : info.argv[convertArgc];
1701         NativeValue *result = nullptr;
1702 
1703         std::unique_ptr<AbilityRuntime::AsyncTask> uasyncTask =
1704             AbilityRuntime::CreateAsyncTaskWithLastParam(engine, lastParam, nullptr, nullptr, &result);
1705         std::shared_ptr<AbilityRuntime::AsyncTask> asyncTask = std::move(uasyncTask);
1706 
1707         ShareFormCallBackClient::ShareFormTask task = [&engine, asyncTask](int32_t code) {
1708             HILOG_DEBUG("task complete code: %{public}d", code);
1709             if (code == ERR_OK) {
1710                 asyncTask->ResolveWithNoError(engine, engine.CreateUndefined());
1711             } else {
1712                 asyncTask->Reject(engine, NapiFormUtil::CreateErrorByInternalErrorCode(engine, code));
1713             }
1714         };
1715 
1716         InnerShareForm(engine, asyncTask, std::move(task), formId, devicedId);
1717 
1718         return result;
1719     }
1720 
OnAcquireFormData(NativeEngine & engine,NativeCallbackInfo & info)1721     NativeValue* OnAcquireFormData(NativeEngine &engine, NativeCallbackInfo &info)
1722     {
1723         HILOG_DEBUG("OnAcquireFormData is called");
1724         if (info.argc > ARGS_TWO || info.argc < ARGS_ONE) {
1725             HILOG_ERROR("wrong number of arguments.");
1726             NapiFormUtil::ThrowParamNumError(engine, std::to_string(info.argc), "1 or 2");
1727             return engine.CreateUndefined();
1728         }
1729 
1730         // The promise form has only one parameters
1731         decltype(info.argc) unwrapArgc = 1;
1732         int64_t formId = 0;
1733         if (!ConvertFromId(engine, info.argv[PARAM0], formId)) {
1734             HILOG_ERROR("form id is invalid.");
1735             NapiFormUtil::ThrowParamTypeError(engine, "formId", "string");
1736             return engine.CreateUndefined();
1737         }
1738 
1739         NativeValue *lastParam = (info.argc <= unwrapArgc) ? nullptr : info.argv[unwrapArgc];
1740         NativeValue *result = nullptr;
1741 
1742         std::unique_ptr<AbilityRuntime::AsyncTask> uasyncTask =
1743             AbilityRuntime::CreateAsyncTaskWithLastParam(engine, lastParam, nullptr, nullptr, &result);
1744         std::shared_ptr<AbilityRuntime::AsyncTask> asyncTask = std::move(uasyncTask);
1745 
1746         JsFormDataCallbackClient::AcquireFormDataTask task = [&engine, asyncTask](AAFwk::WantParams data) {
1747             HILOG_DEBUG("task complete form data");
1748             NativeValue *objValue = engine.CreateObject();
1749             NativeObject *object = ConvertNativeValueTo<NativeObject>(objValue);
1750             object->SetProperty("formData", CreateJsWantParams(engine, data));
1751             asyncTask->ResolveWithNoError(engine, objValue);
1752         };
1753 
1754         InnerAcquireFormData(engine, asyncTask, std::move(task), formId);
1755         return result;
1756     }
1757 
OnNotifyFormsPrivacyProtected(NativeEngine & engine,NativeCallbackInfo & info)1758     NativeValue* OnNotifyFormsPrivacyProtected(NativeEngine &engine, NativeCallbackInfo &info)
1759     {
1760         HILOG_INFO("%{public}s is called", __func__);
1761         if (info.argc > ARGS_THREE || info.argc < ARGS_TWO) {
1762             HILOG_ERROR("wrong number of arguments.");
1763             NapiFormUtil::ThrowParamNumError(engine, std::to_string(info.argc), "2 or 3");
1764             return engine.CreateUndefined();
1765         }
1766 
1767         decltype(info.argc) convertArgc = 0;
1768         std::vector<int64_t> formIds;
1769         if (!ConvertFromIds(engine, info.argv[PARAM0], formIds)) {
1770             HILOG_ERROR("form id list is invalid.");
1771             NapiFormUtil::ThrowParamTypeError(engine, "formIds", "Array<string>");
1772             return engine.CreateUndefined();
1773         }
1774         convertArgc++;
1775 
1776         bool isProtected = false;
1777         if (info.argv[PARAM1]->TypeOf() != NATIVE_BOOLEAN) {
1778             HILOG_ERROR("promise second param type is illegal");
1779             NapiFormUtil::ThrowParamTypeError(engine, "isProtected", "boolean");
1780             return engine.CreateUndefined();
1781         }
1782         if (!ConvertFromJsValue(engine, info.argv[PARAM1], isProtected)) {
1783             HILOG_ERROR("convert isProtected failed!");
1784             NapiFormUtil::ThrowParamTypeError(engine, "isProtected", "boolean");
1785             return engine.CreateUndefined();
1786         }
1787         convertArgc++;
1788 
1789         AsyncTask::CompleteCallback complete =
1790             [formIds, isProtected](NativeEngine &engine, AsyncTask &task, int32_t status) {
1791                 auto ret = FormMgr::GetInstance().NotifyFormsPrivacyProtected(formIds,
1792                     isProtected, FormHostClient::GetInstance());
1793                 if (ret == ERR_OK) {
1794                     task.ResolveWithNoError(engine, engine.CreateUndefined());
1795                 } else {
1796                     task.Reject(engine, NapiFormUtil::CreateErrorByInternalErrorCode(engine, ret));
1797                 }
1798             };
1799 
1800         NativeValue *lastParam = (info.argc <= convertArgc) ? nullptr : info.argv[convertArgc];
1801         NativeValue *result = nullptr;
1802         AsyncTask::ScheduleWithDefaultQos("NapiFormHost::OnNotifyFormsPrivacyProtected",
1803             engine, CreateAsyncTaskWithLastParam(engine, lastParam, nullptr, std::move(complete), &result));
1804         return result;
1805     }
1806 
OnGetFormInstancesByFilter(NativeEngine & engine,NativeCallbackInfo & info)1807     NativeValue* OnGetFormInstancesByFilter(NativeEngine &engine, NativeCallbackInfo &info)
1808     {
1809         HILOG_DEBUG("is called");
1810         if (info.argc < ARGS_ONE || info.argc > ARGS_THREE) {
1811             NapiFormUtil::ThrowParamNumError(engine, std::to_string(info.argc), "1 or 2");
1812             HILOG_ERROR("wrong number of arguments!");
1813             return engine.CreateUndefined();
1814         }
1815 
1816         FormInstancesFilter filter;
1817         if (info.argv[PARAM0]->TypeOf() != NATIVE_OBJECT) {
1818             HILOG_ERROR("input params is not object!");
1819             NapiFormUtil::ThrowParamTypeError(engine, "formProviderFilter", "object");
1820             return engine.CreateUndefined();
1821         }
1822         auto arg = reinterpret_cast<napi_value>(info.argv[PARAM0]);
1823         auto env = reinterpret_cast<napi_env>(&engine);
1824         if (!ParseParam(env, arg, filter)) {
1825             HILOG_ERROR("input params parse failed!");
1826             NapiFormUtil::ThrowParamTypeError(engine, "formProviderFilter", "object");
1827             return engine.CreateUndefined();
1828         }
1829         if (info.argc == ARGS_TWO && info.argv[PARAM1]->TypeOf() != NATIVE_FUNCTION) {
1830             HILOG_ERROR("param1 is invalid");
1831             NapiFormUtil::ThrowParamTypeError(engine, "callback", "Callback<string>");
1832             return engine.CreateUndefined();
1833         }
1834         std::shared_ptr<std::vector<FormInstance>> formInstances = std::make_shared<std::vector<FormInstance>>();
1835         auto apiResult = std::make_shared<int32_t>();
1836         auto execute = [filter, formInstances, ret = apiResult]() {
1837             *ret = FormMgr::GetInstance().GetFormInstancesByFilter(filter, *formInstances);
1838         };
1839 
1840         auto complete =
1841             [formInstances, ret = apiResult](NativeEngine &engine, AsyncTask &task, int32_t status) {
1842                 if (*ret != ERR_OK) {
1843                     HILOG_ERROR("failed");
1844                     task.Reject(engine, NapiFormUtil::CreateErrorByInternalErrorCode(engine, *ret));
1845                 } else {
1846                     task.ResolveWithNoError(engine, CreateFormInstances(engine, *formInstances));
1847                 }
1848             };
1849         NativeValue *lastParam = (info.argc == ARGS_ONE) ? nullptr : info.argv[PARAM1];
1850         NativeValue *result = nullptr;
1851         AsyncTask::ScheduleWithDefaultQos("NapiFormHost::OnGetFormInstancesByFilter",
1852             engine, CreateAsyncTaskWithLastParam(engine, lastParam, std::move(execute), std::move(complete), &result));
1853         return result;
1854     }
1855 
OnGetFormInstanceById(NativeEngine & engine,NativeCallbackInfo & info)1856     NativeValue* OnGetFormInstanceById(NativeEngine &engine, NativeCallbackInfo &info)
1857     {
1858         HILOG_DEBUG("called");
1859         if (info.argc < ARGS_ONE || info.argc > ARGS_THREE) {
1860             HILOG_ERROR("wrong number of arguments!");
1861             NapiFormUtil::ThrowParamNumError(engine, std::to_string(info.argc), "1 or 2 or 3");
1862             return engine.CreateUndefined();
1863         }
1864         decltype(info.argc) convertArgc = 0;
1865         int64_t formId;
1866         if (!ConvertFromId(engine, info.argv[PARAM0], formId)) {
1867             HILOG_ERROR("convert strFormIdList failed!");
1868             NapiFormUtil::ThrowParamTypeError(engine, "formId", "string");
1869             return engine.CreateUndefined();
1870         }
1871         convertArgc++;
1872         bool isIncludeUnused = false;
1873         if ((info.argc == ARGS_TWO || info.argc == ARGS_THREE) && info.argv[PARAM1]->TypeOf() != NATIVE_FUNCTION) {
1874             if (info.argv[PARAM1]->TypeOf() != NATIVE_BOOLEAN) {
1875                 HILOG_ERROR("input params is not bool");
1876                 NapiFormUtil::ThrowParamTypeError(engine, "isIncludeUnused", "bool");
1877                 return engine.CreateUndefined();
1878             }
1879             if (!ConvertFromJsValue(engine, info.argv[PARAM1], isIncludeUnused)) {
1880                 HILOG_ERROR("convert isIncludeUnused failed.");
1881                 NapiFormUtil::ThrowParamTypeError(engine, "isIncludeUnused", "bool");
1882                 return engine.CreateUndefined();
1883             }
1884             convertArgc++;
1885         }
1886         if (info.argc == ARGS_THREE && info.argv[PARAM2]->TypeOf() != NATIVE_FUNCTION) {
1887             HILOG_ERROR("param2 is invalid");
1888             NapiFormUtil::ThrowParamTypeError(engine, "callback", "Callback<string>");
1889             return engine.CreateUndefined();
1890         }
1891         std::shared_ptr<FormInstance> formInstance = std::make_shared<FormInstance>();
1892         auto apiResult = std::make_shared<int32_t>();
1893         auto execute = [formId, isIncludeUnused, formInstance, ret = apiResult]() {
1894             *ret = FormMgr::GetInstance().GetFormInstanceById(formId, isIncludeUnused, *formInstance);
1895         };
1896 
1897         auto complete =
1898             [formInstance, ret = apiResult](NativeEngine &engine, AsyncTask &task, int32_t status) {
1899                 if (*ret != ERR_OK) {
1900                     HILOG_ERROR("failed");
1901                     task.Reject(engine, NapiFormUtil::CreateErrorByInternalErrorCode(engine, *ret));
1902                 } else {
1903                     task.ResolveWithNoError(engine, CreateFormInstance(engine, *formInstance));
1904                 }
1905             };
1906         NativeValue *lastParam = (info.argc == convertArgc) ? nullptr : info.argv[convertArgc];
1907         NativeValue *result = nullptr;
1908         AsyncTask::ScheduleWithDefaultQos("NapiFormHost::OnGetFormInstanceById",
1909             engine, CreateAsyncTaskWithLastParam(engine, lastParam, std::move(execute), std::move(complete), &result));
1910         return result;
1911     }
1912     sptr<JsFormStateObserver> formObserver_ = nullptr;
1913 };
1914 
JsFormHostInit(NativeEngine * engine,NativeValue * exportObj)1915 NativeValue* JsFormHostInit(NativeEngine* engine, NativeValue* exportObj)
1916 {
1917     HILOG_INFO("JsFormHostInit is called");
1918     if (engine == nullptr || exportObj == nullptr) {
1919         HILOG_INFO("Invalid input parameters");
1920         return nullptr;
1921     }
1922 
1923     NativeObject* object = ConvertNativeValueTo<NativeObject>(exportObj);
1924     if (object == nullptr) {
1925         HILOG_INFO("object is nullptr");
1926         return nullptr;
1927     }
1928 
1929     std::unique_ptr<JsFormHost> jsFormHost = std::make_unique<JsFormHost>();
1930     object->SetNativePointer(jsFormHost.release(), JsFormHost::Finalizer, nullptr);
1931 
1932     const char *moduleName = "JsFormHost";
1933     BindNativeFunction(*engine, *object, "deleteForm", moduleName, JsFormHost::DeleteForm);
1934     BindNativeFunction(*engine, *object, "releaseForm", moduleName, JsFormHost::ReleaseForm);
1935     BindNativeFunction(*engine, *object, "requestForm", moduleName, JsFormHost::RequestForm);
1936     BindNativeFunction(*engine, *object, "castTempForm", moduleName, JsFormHost::CastTempForm);
1937     BindNativeFunction(*engine, *object, "castToNormalForm", moduleName, JsFormHost::CastTempForm);
1938     BindNativeFunction(*engine, *object, "notifyVisibleForms", moduleName, JsFormHost::NotifyVisibleForms);
1939     BindNativeFunction(*engine, *object, "notifyInvisibleForms", moduleName, JsFormHost::NotifyInvisibleForms);
1940     BindNativeFunction(*engine, *object, "enableFormsUpdate", moduleName, JsFormHost::EnableFormsUpdate);
1941     BindNativeFunction(*engine, *object, "disableFormsUpdate", moduleName, JsFormHost::DisableFormsUpdate);
1942     BindNativeFunction(*engine, *object, "isSystemReady", moduleName, JsFormHost::IsSystemReady);
1943     BindNativeFunction(*engine, *object, "deleteInvalidForms", moduleName, JsFormHost::DeleteInvalidForms);
1944     BindNativeFunction(*engine, *object, "acquireFormState", moduleName, JsFormHost::AcquireFormState);
1945     BindNativeFunction(*engine, *object, "on", moduleName, JsFormHost::RegisterFormObserver);
1946     BindNativeFunction(*engine, *object, "off", moduleName, JsFormHost::UnregisterFormObserver);
1947     BindNativeFunction(*engine, *object, "notifyFormsVisible", moduleName, JsFormHost::NotifyFormsVisible);
1948     BindNativeFunction(*engine, *object, "notifyFormsEnableUpdate", moduleName, JsFormHost::NotifyFormsEnableUpdate);
1949     BindNativeFunction(*engine, *object, "getAllFormsInfo", moduleName, JsFormHost::GetAllFormsInfo);
1950     BindNativeFunction(*engine, *object, "getFormsInfo", moduleName, JsFormHost::GetFormsInfo);
1951     BindNativeFunction(*engine, *object, "shareForm", moduleName, JsFormHost::ShareForm);
1952     BindNativeFunction(*engine, *object, "notifyFormsPrivacyProtected", moduleName,
1953         JsFormHost::NotifyFormsPrivacyProtected);
1954     BindNativeFunction(*engine, *object, "getRunningFormInfos", moduleName, JsFormHost::GetRunningFormInfos);
1955     BindNativeFunction(*engine, *object, "acquireFormData", moduleName, JsFormHost::AcquireFormData);
1956     BindNativeFunction(*engine, *object, "getRunningFormInfosByFilter", moduleName,
1957         JsFormHost::GetFormInstancesByFilter);
1958     BindNativeFunction(*engine, *object, "getRunningFormInfoById", moduleName, JsFormHost::GetFormInstanceById);
1959     return engine->CreateUndefined();
1960 }
1961 } // namespace AbilityRuntime
1962 } // namespace OHOS