• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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