1 /*
2 * Copyright (c) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15 #include "js_form_binding_data.h"
16
17 #include "form_provider_data.h"
18 #include "hilog_wrapper.h"
19 #include "js_runtime_utils.h"
20 #include "napi_form_util.h"
21
22 namespace OHOS {
23 namespace AbilityRuntime {
24 namespace {
25 class JsFormBindingData {
26 public:
JsFormBindingData(const std::shared_ptr<AppExecFwk::FormProviderData> & formProviderData)27 explicit JsFormBindingData(const std::shared_ptr<AppExecFwk::FormProviderData>& formProviderData)
28 : formProviderData_(formProviderData) {}
29 ~JsFormBindingData() = default;
30
Finalizer(NativeEngine * engine,void * data,void * hint)31 static void Finalizer(NativeEngine* engine, void* data, void* hint)
32 {
33 HILOG_INFO("JsFormBindingData::Finalizer is called");
34 std::unique_ptr<JsFormBindingData>(static_cast<JsFormBindingData*>(data));
35 }
36
CreateFormBindingData(NativeEngine * engine,NativeCallbackInfo * info)37 static NativeValue* CreateFormBindingData(NativeEngine* engine, NativeCallbackInfo* info)
38 {
39 JsFormBindingData* me = CheckParamsAndGetThis<JsFormBindingData>(engine, info);
40 return (me != nullptr) ? me->OnCreateFormBindingData(*engine, *info) : nullptr;
41 }
42 private:
43 NativeValue* OnCreateFormBindingData(NativeEngine& engine, NativeCallbackInfo& info);
44 std::shared_ptr<AppExecFwk::FormProviderData> formProviderData_;
45 };
46
OnCreateFormBindingData(NativeEngine & engine,NativeCallbackInfo & info)47 NativeValue* JsFormBindingData::OnCreateFormBindingData(NativeEngine& engine, NativeCallbackInfo& info)
48 {
49 HILOG_INFO("%{public}s called.", __func__);
50 std::string formDataStr;
51 if (info.argc > 0) {
52 NativeValue* nativeValue = nullptr;
53 if ((info.argv[0])->TypeOf() == NATIVE_STRING) {
54 HILOG_DEBUG("%{public}s called, param type is string.", __func__);
55 nativeValue = info.argv[0];
56 } else if ((info.argv[0])->TypeOf() == NATIVE_OBJECT) {
57 HILOG_DEBUG("%{public}s called, param type is object.", __func__);
58 napi_env napiEnv = reinterpret_cast<napi_env>(&engine);
59 napi_value globalValue = nullptr;
60 napi_get_global(napiEnv, &globalValue);
61 napi_value jsonValue;
62 napi_get_named_property(napiEnv, globalValue, "JSON", &jsonValue);
63
64 napi_value stringifyValue = nullptr;
65 napi_get_named_property(napiEnv, jsonValue, "stringify", &stringifyValue);
66 napi_value funcArgv[1] = { reinterpret_cast<napi_value>(info.argv[0]) };
67 napi_value transValue = nullptr;
68 napi_call_function(napiEnv, jsonValue, stringifyValue, 1, funcArgv, &transValue);
69 nativeValue = reinterpret_cast<NativeValue*>(transValue);
70 } else {
71 HILOG_ERROR("%{public}s, param type not string or object", __func__);
72 NapiFormUtil::ThrowParamTypeError(engine, "obj", "string or object");
73 return engine.CreateUndefined();
74 }
75
76 if (!ConvertFromJsValue(engine, nativeValue, formDataStr)) {
77 HILOG_ERROR("%{public}s, Parse formDataStr failed", __func__);
78 NapiFormUtil::ThrowParamError(engine, "Failed to convert.");
79 return engine.CreateUndefined();
80 }
81 }
82 NativeValue* objValue = engine.CreateObject();
83 NativeObject* object = ConvertNativeValueTo<NativeObject>(objValue);
84 formProviderData_->SetDataString(formDataStr);
85 object->SetProperty("data", CreateJsValue(engine, formDataStr));
86 HILOG_DEBUG("%{public}s called:%{private}s", __func__, formDataStr.c_str());
87 return objValue;
88 }
89 }
90
JsFormBindingDataInit(NativeEngine * engine,NativeValue * exportObj)91 NativeValue* JsFormBindingDataInit(NativeEngine* engine, NativeValue* exportObj)
92 {
93 HILOG_INFO("%{public}s called.", __func__);
94 if (engine == nullptr || exportObj == nullptr) {
95 HILOG_ERROR("%{public}s engine or exportObj nullptr.", __func__);
96 return nullptr;
97 }
98
99 NativeObject* object = ConvertNativeValueTo<NativeObject>(exportObj);
100 if (object == nullptr) {
101 HILOG_ERROR("%{public}s convertNativeValueTo result is nullptr.", __func__);
102 return nullptr;
103 }
104
105 auto formProviderData = std::make_shared<AppExecFwk::FormProviderData>();
106 auto formBindingData = std::make_unique<JsFormBindingData>(formProviderData);
107 object->SetNativePointer(formBindingData.release(), JsFormBindingData::Finalizer, nullptr);
108
109 const char *moduleName = "JsFormBindingData";
110 BindNativeFunction(*engine, *object, "createFormBindingData", moduleName, JsFormBindingData::CreateFormBindingData);
111
112 HILOG_INFO("%{public}s called end.", __func__);
113 return exportObj;
114 }
115 } // namespace AbilityRuntime
116 } // namespace OHOS
117