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