1 /*
2  * Copyright (c) 2023 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 #define LOG_TAG "UnifiedDataPropertiesNapi"
16 #include "unified_data_properties_napi.h"
17 
18 #include "napi_data_utils.h"
19 #include "unified_data.h"
20 
21 namespace OHOS {
22 namespace UDMF {
Constructor(napi_env env)23 napi_value UnifiedDataPropertiesNapi::Constructor(napi_env env)
24 {
25     LOG_DEBUG(UDMF_KITS_NAPI, "UnifiedDataPropertiesNapi");
26     napi_property_descriptor properties[] = {
27         DECLARE_NAPI_GETTER_SETTER("extras", GetExtras, SetExtras),
28         DECLARE_NAPI_GETTER_SETTER("tag", GetTag, SetTag),
29         DECLARE_NAPI_GETTER_SETTER("shareOptions", GetShareOptions, SetShareOptions),
30         DECLARE_NAPI_GETTER("timestamp", GetTimestamp),
31         DECLARE_NAPI_GETTER_SETTER("getDelayData", GetDelayData, SetDelayData),
32     };
33     size_t count = sizeof(properties) / sizeof(properties[0]);
34     return NapiDataUtils::DefineClass(env, "UnifiedDataProperties", properties, count, UnifiedDataPropertiesNapi::New);
35 }
36 
New(napi_env env, napi_callback_info info)37 napi_value UnifiedDataPropertiesNapi::New(napi_env env, napi_callback_info info)
38 {
39     LOG_DEBUG(UDMF_KITS_NAPI, "UnifiedDataPropertiesNapi");
40     auto ctxt = std::make_shared<ContextBase>();
41     ctxt->GetCbInfoSync(env, info);
42     ASSERT_ERR(ctxt->env, ctxt->status == napi_ok, Status::E_ERROR, ctxt->error);
43 
44     auto* properties = new (std::nothrow) UnifiedDataPropertiesNapi();
45     ASSERT_ERR(ctxt->env, properties != nullptr, Status::E_ERROR, "no memory for properties!");
46 
47     properties->value_ = std::make_shared<UnifiedDataProperties>();
48     ASSERT_CALL(env, napi_wrap(env, ctxt->self, properties, Destructor, nullptr, nullptr), properties);
49     return ctxt->self;
50 }
51 
Destructor(napi_env env, void *data, void *hint)52 void UnifiedDataPropertiesNapi::Destructor(napi_env env, void *data, void *hint)
53 {
54     LOG_DEBUG(UDMF_KITS_NAPI, "UnifiedDataPropertiesNapi finalize.");
55     auto *properties = static_cast<UnifiedDataPropertiesNapi *>(data);
56     ASSERT_VOID(properties != nullptr, "finalize null!");
57     if (properties->delayDataRef_ != nullptr) {
58         napi_delete_reference(env, properties->delayDataRef_);
59     }
60     delete properties;
61 }
62 
GetPropertiesNapi( napi_env env, napi_callback_info info, std::shared_ptr<ContextBase> ctxt)63 UnifiedDataPropertiesNapi* UnifiedDataPropertiesNapi::GetPropertiesNapi(
64     napi_env env, napi_callback_info info, std::shared_ptr<ContextBase> ctxt)
65 {
66     LOG_DEBUG(UDMF_KITS_NAPI, "UnifiedDataPropertiesNapi");
67     ctxt->GetCbInfoSync(env, info);
68     ASSERT_ERR(ctxt->env, ctxt->status == napi_ok, Status::E_ERROR, ctxt->error);
69     return reinterpret_cast<UnifiedDataPropertiesNapi*>(ctxt->native);
70 }
71 
GetExtras(napi_env env, napi_callback_info info)72 napi_value UnifiedDataPropertiesNapi::GetExtras(napi_env env, napi_callback_info info)
73 {
74     LOG_DEBUG(UDMF_KITS_NAPI, "UnifiedDataPropertiesNapi");
75     auto ctxt = std::make_shared<ContextBase>();
76     auto properties = GetPropertiesNapi(env, info, ctxt);
77     ASSERT_ERR(ctxt->env, (properties != nullptr && properties->value_ != nullptr),
78         Status::E_ERROR, "invalid object!");
79     ctxt->output = OHOS::AppExecFwk::WrapWantParams(env, properties->value_->extras);
80     return ctxt->output;
81 }
82 
SetExtras(napi_env env, napi_callback_info info)83 napi_value UnifiedDataPropertiesNapi::SetExtras(napi_env env, napi_callback_info info)
84 {
85     LOG_DEBUG(UDMF_KITS_NAPI, "UnifiedDataPropertiesNapi");
86     auto ctxt = std::make_shared<ContextBase>();
87     AAFwk::WantParams value;
88     auto input = [env, ctxt, &value](size_t argc, napi_value* argv) {
89         ASSERT_BUSINESS_ERR(ctxt, argc >= 1, Status::E_ERROR, "Mandatory parameters are left unspecified");
90         bool ret = OHOS::AppExecFwk::UnwrapWantParams(env, argv[0], value);
91         ASSERT_BUSINESS_ERR(ctxt, ret, Status::E_ERROR, "parameter extras type must be Record<string, object>");
92     };
93     ctxt->GetCbInfoSync(env, info, input);
94     ASSERT_ERR(ctxt->env, ctxt->status == napi_ok, Status::E_ERROR, ctxt->error);
95     auto properties = static_cast<UnifiedDataPropertiesNapi*>(ctxt->native);
96     ASSERT_ERR(ctxt->env, (properties != nullptr && properties->value_ != nullptr),
97         Status::E_ERROR, "invalid object!");
98     properties->value_->extras = value;
99     return nullptr;
100 }
101 
GetTag(napi_env env, napi_callback_info info)102 napi_value UnifiedDataPropertiesNapi::GetTag(napi_env env, napi_callback_info info)
103 {
104     LOG_DEBUG(UDMF_KITS_NAPI, "UnifiedDataPropertiesNapi");
105     auto ctxt = std::make_shared<ContextBase>();
106     auto properties = GetPropertiesNapi(env, info, ctxt);
107     ASSERT_ERR(ctxt->env, (properties != nullptr && properties->value_ != nullptr),
108         Status::E_ERROR, "invalid object!");
109     ctxt->status = NapiDataUtils::SetValue(env, properties->value_->tag, ctxt->output);
110     ASSERT_ERR(ctxt->env, ctxt->status == napi_ok, Status::E_ERROR, "set tag failed");
111     return ctxt->output;
112 }
113 
SetTag(napi_env env, napi_callback_info info)114 napi_value UnifiedDataPropertiesNapi::SetTag(napi_env env, napi_callback_info info)
115 {
116     LOG_DEBUG(UDMF_KITS_NAPI, "UnifiedDataPropertiesNapi");
117     auto ctxt = std::make_shared<ContextBase>();
118     std::string tag;
119     auto input = [env, ctxt, &tag](size_t argc, napi_value* argv) {
120         ASSERT_BUSINESS_ERR(ctxt, argc >= 1, Status::E_ERROR, "Mandatory parameters are left unspecified");
121         ctxt->status = NapiDataUtils::GetValue(env, argv[0], tag);
122         ASSERT_BUSINESS_ERR(ctxt, ctxt->status == napi_ok, Status::E_ERROR, "parameter tag type must be string");
123     };
124     ctxt->GetCbInfoSync(env, info, input);
125     ASSERT_ERR(ctxt->env, ctxt->status == napi_ok, Status::E_ERROR, ctxt->error);
126     auto properties = static_cast<UnifiedDataPropertiesNapi*>(ctxt->native);
127     ASSERT_ERR(ctxt->env, (properties != nullptr && properties->value_ != nullptr),
128         Status::E_ERROR, "invalid object!");
129     properties->value_->tag = tag;
130     return nullptr;
131 }
132 
GetShareOptions(napi_env env, napi_callback_info info)133 napi_value UnifiedDataPropertiesNapi::GetShareOptions(napi_env env, napi_callback_info info)
134 {
135     LOG_DEBUG(UDMF_KITS_NAPI, "UnifiedDataPropertiesNapi");
136     auto ctxt = std::make_shared<ContextBase>();
137     auto properties = GetPropertiesNapi(env, info, ctxt);
138     ASSERT_ERR(ctxt->env, (properties != nullptr && properties->value_ != nullptr),
139         Status::E_ERROR, "invalid object!");
140     ctxt->status = NapiDataUtils::SetValue(env, properties->value_->shareOptions, ctxt->output);
141     ASSERT_ERR(ctxt->env, ctxt->status == napi_ok, Status::E_ERROR, "set ShareOptions failed");
142     return ctxt->output;
143 }
144 
SetShareOptions(napi_env env, napi_callback_info info)145 napi_value UnifiedDataPropertiesNapi::SetShareOptions(napi_env env, napi_callback_info info)
146 {
147     LOG_DEBUG(UDMF_KITS_NAPI, "UnifiedDataPropertiesNapi");
148     auto ctxt = std::make_shared<ContextBase>();
149     int32_t shareOptionsValue = ShareOptions::CROSS_APP;
150     auto input = [env, ctxt, &shareOptionsValue](size_t argc, napi_value *argv) {
151         ASSERT_BUSINESS_ERR(ctxt, argc >= 1, Status::E_ERROR, "Mandatory parameters are left unspecified");
152         ctxt->status = NapiDataUtils::GetValue(env, argv[0], shareOptionsValue);
153         ASSERT_BUSINESS_ERR(ctxt, ctxt->status == napi_ok,
154             Status::E_ERROR, "parameter shareOptions type must be ShareOptions");
155     };
156     ctxt->GetCbInfoSync(env, info, input);
157     ASSERT_ERR(ctxt->env, ctxt->status == napi_ok, Status::E_ERROR, ctxt->error);
158     auto properties = static_cast<UnifiedDataPropertiesNapi *>(ctxt->native);
159     ASSERT_ERR(ctxt->env, (properties != nullptr && properties->value_ != nullptr),
160         Status::E_ERROR, "invalid object!");
161     properties->value_->shareOptions = static_cast<ShareOptions>(shareOptionsValue);
162     return nullptr;
163 }
164 
GetTimestamp(napi_env env, napi_callback_info info)165 napi_value UnifiedDataPropertiesNapi::GetTimestamp(napi_env env, napi_callback_info info)
166 {
167     LOG_DEBUG(UDMF_KITS_NAPI, "UnifiedDataPropertiesNapi");
168     auto ctxt = std::make_shared<ContextBase>();
169     auto properties = GetPropertiesNapi(env, info, ctxt);
170     ASSERT_ERR(ctxt->env, (properties != nullptr && properties->value_ != nullptr),
171         Status::E_ERROR, "invalid object!");
172     ctxt->status = napi_create_date(env, properties->value_->timestamp, &ctxt->output);
173     ASSERT_ERR(ctxt->env, ctxt->status == napi_ok, Status::E_ERROR, "set timestamp failed");
174     return ctxt->output;
175 }
176 
GetDelayData(napi_env env, napi_callback_info info)177 napi_value UnifiedDataPropertiesNapi::GetDelayData(napi_env env, napi_callback_info info)
178 {
179     LOG_DEBUG(UDMF_KITS_NAPI, "UnifiedDataPropertiesNapi");
180     auto ctxt = std::make_shared<ContextBase>();
181     auto properties = GetPropertiesNapi(env, info, ctxt);
182     ASSERT_ERR(ctxt->env, (properties != nullptr && properties->value_ != nullptr),
183         Status::E_ERROR, "invalid object!");
184     if (properties->delayDataRef_ == nullptr) {
185         LOG_INFO(UDMF_KITS_NAPI, "get GetDelayData undefined");
186         napi_value undefinedValue;
187         napi_get_undefined(env, &undefinedValue);
188         return undefinedValue;
189     }
190     ctxt->status = napi_get_reference_value(env, properties->delayDataRef_, &ctxt->output);
191     ASSERT_ERR(ctxt->env, ctxt->status == napi_ok, Status::E_ERROR, "set delayData failed");
192     return ctxt->output;
193 }
194 
SetDelayData(napi_env env, napi_callback_info info)195 napi_value UnifiedDataPropertiesNapi::SetDelayData(napi_env env, napi_callback_info info)
196 {
197     LOG_DEBUG(UDMF_KITS_NAPI, "UnifiedDataPropertiesNapi");
198     auto ctxt = std::make_shared<ContextBase>();
199     napi_value handler;
200     napi_ref ref;
201     auto input = [env, ctxt, &handler](size_t argc, napi_value* argv) {
202         ASSERT_BUSINESS_ERR(ctxt, argc >= 1, Status::E_ERROR, "Mandatory parameters are left unspecified");
203         napi_valuetype valueType = napi_undefined;
204         ctxt->status = napi_typeof(env, argv[0], &valueType);
205         ASSERT_BUSINESS_ERR(ctxt, ctxt->status == napi_ok && valueType == napi_function,
206             Status::E_ERROR, "parameter getDelayData type must be GetDelayData");
207         handler = argv[0];
208     };
209     ctxt->GetCbInfoSync(env, info, input);
210     ASSERT_ERR(ctxt->env, ctxt->status == napi_ok, Status::E_ERROR, ctxt->error);
211     auto properties = static_cast<UnifiedDataPropertiesNapi *>(ctxt->native);
212     ASSERT_ERR(ctxt->env, (properties != nullptr && properties->value_ != nullptr),
213         Status::E_ERROR, "invalid object!");
214     if (properties->delayDataRef_ != nullptr) {
215         napi_delete_reference(env, properties->delayDataRef_);
216     }
217     ctxt->status = napi_create_reference(env, handler, 1, &ref);
218     ASSERT_ERR(ctxt->env, ctxt->status == napi_ok, Status::E_ERROR, "napi_create_reference failed");
219     properties->delayDataRef_ = ref;
220     return nullptr;
221 }
222 } // namespace UDMF
223 } // namespace OHOS