• 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     /* AttendeeStatus -> napi_value */
126     napi_status SetAttendeeStatus(napi_env env, const Attendee& in, napi_value& out);
127 
128     /* AttendeeType -> napi_value */
129     napi_status SetAttendeeType(napi_env env, const Attendee& in, napi_value& out);
130 
131     /* napi_get_named_property wrapper */
132     template <typename T>
GetNamedProperty(napi_env env,napi_value in,const std::string & prop,T & value)133     napi_status GetNamedProperty(napi_env env, napi_value in, const std::string& prop, T& value)
134     {
135         bool hasProp = false;
136         napi_status status = napi_has_named_property(env, in, prop.c_str(), &hasProp);
137         if ((status == napi_ok) && hasProp) {
138             napi_value inner = nullptr;
139             status = napi_get_named_property(env, in, prop.c_str(), &inner);
140             if ((status == napi_ok) && (inner != nullptr)) {
141                 return GetValue(env, inner, value);
142             }
143         }
144         return napi_invalid_arg;
145     };
146 
147     template <typename T>
SetNamedProperty(napi_env env,const string & prop,const T & nativeValue,napi_value & out)148     napi_status SetNamedProperty(napi_env env, const string& prop, const T&nativeValue, napi_value& out)
149     {
150         napi_value value = nullptr;
151         auto status = SetValue(env, nativeValue, value);
152         if (status != napi_ok) {
153             return status;
154         }
155         return napi_set_named_property(env, out, prop.c_str(), value);
156     }
157 
158     template <typename T>
SetNamedPropertyOptional(napi_env env,const string & prop,const std::optional<T> & nativeValue,napi_value & out)159     void SetNamedPropertyOptional(napi_env env, const string& prop, const std::optional<T>&nativeValue, napi_value& out)
160     {
161         if (!nativeValue) {
162             return;
163         }
164         napi_value value = nullptr;
165         auto status = SetValue(env, nativeValue.value(), value);
166         if (status != napi_ok) {
167             return;
168         }
169         napi_set_named_property(env, out, prop.c_str(), value);
170     }
171 
172     /* napi_get_named_property wrapper */
173     template <typename T>
GetNamedPropertyOptional(napi_env env,napi_value in,const std::string & prop,std::optional<T> & out)174     void GetNamedPropertyOptional(napi_env env, napi_value in, const std::string& prop, std::optional<T>& out)
175     {
176         bool hasProp = false;
177         napi_status status = napi_has_named_property(env, in, prop.c_str(), &hasProp);
178         if ((status != napi_ok) || !hasProp) {
179             out = std::nullopt;
180             return;
181         }
182         napi_value inner = nullptr;
183         status = napi_get_named_property(env, in, prop.c_str(), &inner);
184         if ((status != napi_ok) || (inner == nullptr)) {
185             out = std::nullopt;
186             return;
187         }
188         T value;
189         status = GetValue(env, inner, value);
190         if (status != napi_ok) {
191             out = std::nullopt;
192             return;
193         }
194         out = value;
195     };
196 
197     /* napi_value <-> std::vector<T> */
198     template <typename T>
SetValueArray(napi_env env,const std::vector<T> & in,napi_value & out)199     napi_status SetValueArray(napi_env env, const std::vector<T>& in, napi_value& out)
200     {
201         napi_status status = napi_create_array_with_length(env, in.size(), &out);
202         if (status != napi_ok) {
203             return status;
204         }
205         int index = 0;
206         for (auto& item : in) {
207             napi_value element = nullptr;
208             SetValue(env, item, element);
209             status = napi_set_element(env, out, index++, element);
210             if (status != napi_ok) {
211                 return status;
212             }
213         }
214         return status;
215     }
216 
217     /* napi_value <-> std::vector<T> */
218     template <typename T>
GetValueArray(napi_env env,napi_value in,std::vector<T> & out)219     napi_status GetValueArray(napi_env env, napi_value in, std::vector<T>& out)
220     {
221         out.clear();
222         bool isArray = false;
223         napi_is_array(env, in, &isArray);
224         if (!isArray) {
225             return napi_invalid_arg;
226         }
227 
228         uint32_t length = 0;
229         napi_status status = napi_get_array_length(env, in, &length);
230         if (status != napi_ok || length <= 0) {
231             return napi_invalid_arg;
232         }
233         for (uint32_t i = 0; i < length; i++) {
234             napi_value item = nullptr;
235             status = napi_get_element(env, in, i, &item);
236             if (item == nullptr || status != napi_ok) {
237                 return napi_invalid_arg;
238             }
239             T outItem;
240             GetValue(env, item, outItem);
241             out.push_back(outItem);
242         }
243         return status;
244     }
245 
246     /* napi_define_class  wrapper */
247     napi_value DefineClass(napi_env env, const std::string& name,
248         const napi_property_descriptor* properties, size_t count, napi_callback newcb);
249 
250     /* napi_new_instance  wrapper */
251     napi_ref NewWithRef(napi_env env, size_t argc, napi_value* argv, void** out, napi_value constructor);
252 
253     /* napi_unwrap with napi_instanceof */
254     napi_status Unwrap(napi_env env, napi_value in, void** out, napi_value constructor);
255 
256     bool Equals(napi_env env, napi_value value, napi_ref copy);
257 
258 } // namespace OHOS::CalendarApi::NapiUtil
259 #endif // OHOS_CALENDAR_NAPI_UTIL_H
260