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