• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #ifndef OHOS_CALENDAR_NAPI_UTIL_H
16 #define OHOS_CALENDAR_NAPI_UTIL_H
17 #include <cstdint>
18 #include <map>
19 #include <variant>
20 #include "calendar_define.h"
21 #include "event_filter_napi.h"
22 #include "napi/native_api.h"
23 #include "napi/native_common.h"
24 #include "napi/native_node_api.h"
25 
26 namespace OHOS::CalendarApi::NapiUtil {
27     napi_status GetValue(napi_env env, napi_value in, napi_value& out);
28     napi_status SetValue(napi_env env, napi_value in, napi_value& out);
29     /* napi_value <-> bool */
30     napi_status GetValue(napi_env env, napi_value in, bool& out);
31     napi_status SetValue(napi_env env, const bool& in, napi_value& out);
32 
33     /* napi_value <-> int32_t */
34     napi_status GetValue(napi_env env, napi_value in, int32_t& out);
35     napi_status SetValue(napi_env env, const int32_t& in, napi_value& out);
36 
37     /* napi_value <-> uint32_t */
38     napi_status GetValue(napi_env env, napi_value in, uint32_t& out);
39     napi_status SetValue(napi_env env, const uint32_t& in, napi_value& out);
40 
41     /* napi_value <-> int64_t */
42     napi_status GetValue(napi_env env, napi_value in, int64_t& out);
43     napi_status SetValue(napi_env env, const int64_t& in, napi_value& out);
44 
45     /* napi_value <-> uint64_t */
46     napi_status GetValue(napi_env env, napi_value in, uint64_t& out);
47     napi_status SetValue(napi_env env, const uint64_t& in, napi_value& out);
48 
49     /* napi_value <-> double */
50     napi_status GetValue(napi_env env, napi_value in, double& out);
51     napi_status SetValue(napi_env env, const double& in, napi_value& out);
52 
53     /* napi_value <-> std::string */
54     napi_status GetValue(napi_env env, napi_value in, std::string& out);
55     napi_status SetValue(napi_env env, const std::string& in, napi_value& out);
56 
57     /* napi_value <-> std::vector<std::string> */
58     napi_status GetValue(napi_env env, napi_value in, std::vector<std::string>& out);
59     napi_status SetValue(napi_env env, const std::vector<std::string>& in, napi_value& out);
60 
61     /* napi_value <-> std::vector<uint8_t> */
62     napi_status GetValue(napi_env env, napi_value in, std::vector<uint8_t>& out);
63     napi_status SetValue(napi_env env, const std::vector<uint8_t>& in, napi_value& out);
64 
65     /* napi_value <-> std::vector<int32_t> */
66     napi_status GetValue(napi_env env, napi_value in, std::vector<int32_t>& out);
67     napi_status SetValue(napi_env env, const std::vector<int32_t>& in, napi_value& out);
68 
69     /* napi_value <-> std::vector<uint32_t> */
70     napi_status GetValue(napi_env env, napi_value in, std::vector<uint32_t>& out);
71     napi_status SetValue(napi_env env, const std::vector<uint32_t>& in, napi_value& out);
72 
73     /* napi_value <-> std::vector<int64_t> */
74     napi_status GetValue(napi_env env, napi_value in, std::vector<int64_t>& out);
75     napi_status SetValue(napi_env env, const std::vector<int64_t>& in, napi_value& out);
76 
77     /* napi_value <-> std::vector<double> */
78     napi_status GetValue(napi_env env, napi_value in, std::vector<double>& out);
79     napi_status SetValue(napi_env env, const std::vector<double>& in, napi_value& out);
80 
81     /* napi_value <-> CalendarAccount */
82     napi_status GetValue(napi_env env, napi_value in, CalendarAccount& out);
83     napi_status SetValue(napi_env env, const CalendarAccount& in, napi_value& out);
84 
85     /* napi_value <-> CalendarConfig */
86     napi_status GetValue(napi_env env, napi_value in, CalendarConfig& out);
87     napi_status SetValue(napi_env env, const CalendarConfig& in, napi_value& out);
88 
89     /* napi_value <-> Location */
90     napi_status GetValue(napi_env env, napi_value in, Location& out);
91     napi_status SetValue(napi_env env, const Location& in, napi_value& out);
92 
93     /* napi_value <-> RecurrenceRule */
94     napi_status GetValue(napi_env env, napi_value in, RecurrenceRule& out);
95     napi_status SetValue(napi_env env, const RecurrenceRule& in, napi_value& out);
96 
97     /* napi_value <-> Attendee */
98     napi_status GetValue(napi_env env, napi_value in, Attendee& out);
99     napi_status SetValue(napi_env env, const Attendee& in, napi_value& out);
100 
101     /* napi_value <-> std::vector<Attendee> */
102     napi_status GetValue(napi_env env, napi_value in, std::vector<Attendee>& out);
103     napi_status SetValue(napi_env env, const std::vector<Attendee>& in, napi_value& out);
104 
105     /* napi_value <-> EventService */
106     napi_status GetValue(napi_env env, napi_value in, EventService& out);
107     napi_status SetValue(napi_env env, const EventService& in, napi_value& out);
108 
109     /* napi_value <-> EventFilter */
110     napi_status GetValue(napi_env env, napi_value in, EventFilterNapi*& out);
111     napi_status SetValue(napi_env env, const EventFilterNapi& in, napi_value& out);
112 
113     /* napi_value <-> EventType */
114     napi_status GetValue(napi_env env, napi_value in, EventType& out);
115     napi_status SetValue(napi_env env, const EventType& in, napi_value& out);
116 
117     /* napi_value <-> Event */
118     napi_status GetValue(napi_env env, napi_value in, Event& out);
119     napi_status SetValue(napi_env env, const Event& in, napi_value& out);
120 
121     /* napi_value <-> std::vector<Event> */
122     napi_status GetValue(napi_env env, napi_value in, std::vector<Event>& out);
123     napi_status SetValue(napi_env env, const std::vector<Event>& in, napi_value& out);
124 
125     /* napi_get_named_property wrapper */
126     template <typename T>
GetNamedProperty(napi_env env,napi_value in,const std::string & prop,T & value)127     napi_status GetNamedProperty(napi_env env, napi_value in, const std::string& prop, T& value)
128     {
129         bool hasProp = false;
130         napi_status status = napi_has_named_property(env, in, prop.c_str(), &hasProp);
131         if ((status == napi_ok) && hasProp) {
132             napi_value inner = nullptr;
133             status = napi_get_named_property(env, in, prop.c_str(), &inner);
134             if ((status == napi_ok) && (inner != nullptr)) {
135                 return GetValue(env, inner, value);
136             }
137         }
138         return napi_invalid_arg;
139     };
140 
141     template <typename T>
SetNamedProperty(napi_env env,const string & prop,const T & nativeValue,napi_value & out)142     napi_status SetNamedProperty(napi_env env, const string& prop, const T&nativeValue, napi_value& out)
143     {
144         napi_value value = nullptr;
145         auto status = SetValue(env, nativeValue, value);
146         if (status != napi_ok) {
147             return status;
148         }
149         return napi_set_named_property(env, out, prop.c_str(), value);
150     }
151 
152     template <typename T>
SetNamedPropertyOptional(napi_env env,const string & prop,const std::optional<T> & nativeValue,napi_value & out)153     void SetNamedPropertyOptional(napi_env env, const string& prop, const std::optional<T>&nativeValue, napi_value& out)
154     {
155         if (!nativeValue) {
156             return;
157         }
158         napi_value value = nullptr;
159         auto status = SetValue(env, nativeValue.value(), value);
160         if (status != napi_ok) {
161             return;
162         }
163         napi_set_named_property(env, out, prop.c_str(), value);
164     }
165 
166     /* napi_get_named_property wrapper */
167     template <typename T>
GetNamedPropertyOptional(napi_env env,napi_value in,const std::string & prop,std::optional<T> & out)168     void GetNamedPropertyOptional(napi_env env, napi_value in, const std::string& prop, std::optional<T>& out)
169     {
170         bool hasProp = false;
171         napi_status status = napi_has_named_property(env, in, prop.c_str(), &hasProp);
172         if ((status != napi_ok) || !hasProp) {
173             out = std::nullopt;
174             return;
175         }
176         napi_value inner = nullptr;
177         status = napi_get_named_property(env, in, prop.c_str(), &inner);
178         if ((status != napi_ok) || (inner == nullptr)) {
179             out = std::nullopt;
180             return;
181         }
182         T value;
183         status = GetValue(env, inner, value);
184         if (status != napi_ok) {
185             out = std::nullopt;
186             return;
187         }
188         out = value;
189     };
190 
191     /* napi_value <-> std::vector<T> */
192     template <typename T>
SetValueArray(napi_env env,const std::vector<T> & in,napi_value & out)193     napi_status SetValueArray(napi_env env, const std::vector<T>& in, napi_value& out)
194     {
195         napi_status status = napi_create_array_with_length(env, in.size(), &out);
196         if (status != napi_ok) {
197             return status;
198         }
199         int index = 0;
200         for (auto& item : in) {
201             napi_value element = nullptr;
202             SetValue(env, item, element);
203             status = napi_set_element(env, out, index++, element);
204             if (status != napi_ok) {
205                 return status;
206             }
207         }
208         return status;
209     }
210 
211     /* napi_value <-> std::vector<T> */
212     template <typename T>
GetValueArray(napi_env env,napi_value in,std::vector<T> & out)213     napi_status GetValueArray(napi_env env, napi_value in, std::vector<T>& out)
214     {
215         out.clear();
216         bool isArray = false;
217         napi_is_array(env, in, &isArray);
218         if (!isArray) {
219             return napi_invalid_arg;
220         }
221 
222         uint32_t length = 0;
223         napi_status status = napi_get_array_length(env, in, &length);
224         if (status != napi_ok || length <= 0) {
225             return napi_invalid_arg;
226         }
227         for (uint32_t i = 0; i < length; i++) {
228             napi_value item = nullptr;
229             status = napi_get_element(env, in, i, &item);
230             if (item == nullptr || status != napi_ok) {
231                 return napi_invalid_arg;
232             }
233             T outItem;
234             GetValue(env, item, outItem);
235             out.push_back(outItem);
236         }
237         return status;
238     }
239 
240     /* napi_define_class  wrapper */
241     napi_value DefineClass(napi_env env, const std::string& name,
242         const napi_property_descriptor* properties, size_t count, napi_callback newcb);
243 
244     /* napi_new_instance  wrapper */
245     napi_ref NewWithRef(napi_env env, size_t argc, napi_value* argv, void** out, napi_value constructor);
246 
247     /* napi_unwrap with napi_instanceof */
248     napi_status Unwrap(napi_env env, napi_value in, void** out, napi_value constructor);
249 
250     bool Equals(napi_env env, napi_value value, napi_ref copy);
251 
252 } // namespace OHOS::CalendarApi::NapiUtil
253 #endif // OHOS_CALENDAR_NAPI_UTIL_H
254