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
16 #include "calendar_napi.h"
17 #include "calendar_log.h"
18 #include "napi_util.h"
19 #include "napi_queue.h"
20 #include "native_util.h"
21
22 namespace {
23 const std::string CALENDAR_CLASS_NAME = "Calendar";
24 }
25
26 namespace OHOS::CalendarApi {
27
Constructor(napi_env env)28 napi_value CalendarNapi::Constructor(napi_env env)
29 {
30 const napi_property_descriptor properties[] = {
31 DECLARE_NAPI_FUNCTION("addEvent", AddEvent),
32 DECLARE_NAPI_FUNCTION("addEvents", AddEvents),
33 DECLARE_NAPI_FUNCTION("deleteEvent", DeleteEvent),
34 DECLARE_NAPI_FUNCTION("deleteEvents", DeleteEvents),
35 DECLARE_NAPI_FUNCTION("updateEvent", UpdateEvent),
36 DECLARE_NAPI_FUNCTION("updateEvents", UpdateEvents),
37 DECLARE_NAPI_FUNCTION("getEvents", GetEvents),
38 DECLARE_NAPI_FUNCTION("getConfig", GetConfig),
39 DECLARE_NAPI_FUNCTION("setConfig", SetConfig),
40 DECLARE_NAPI_FUNCTION("getAccount", GetAccount),
41 DECLARE_NAPI_FUNCTION("queryEventInstances", QueryEventInstances),
42 };
43 size_t count = sizeof(properties) / sizeof(properties[0]);
44 return NapiUtil::DefineClass(env, "Calendar", properties, count, CalendarNapi::New);
45 }
46
47 /*
48 * [JS API Prototype]
49 * var calendar = new Calendar();
50 */
New(napi_env env,napi_callback_info info)51 napi_value CalendarNapi::New(napi_env env, napi_callback_info info)
52 {
53 auto ctxt = std::make_shared<ContextBase>();
54 auto input = [env, ctxt](size_t argc, napi_value* argv) {
55 CHECK_ARGS_RETURN_VOID(ctxt, argc <= 1, "invalid arguments!");
56 };
57 ctxt->GetCbInfoSync(env, info, input);
58 NAPI_ASSERT(env, ctxt->status == napi_ok, "invalid arguments!");
59
60 auto calendar = new (std::nothrow) CalendarNapi();
61 NAPI_ASSERT(env, calendar != nullptr, "no memory for calendar");
62
63 auto finalize = [](napi_env env, void* data, void* hint) {
64 LOG_DEBUG("calendar finalize.");
65 auto* calendar = reinterpret_cast<CalendarNapi*>(data);
66 CHECK_RETURN_VOID(calendar != nullptr, "finalize null!");
67 delete calendar;
68 };
69 if (napi_wrap(env, ctxt->self, calendar, finalize, nullptr, nullptr) != napi_ok) {
70 delete calendar;
71 GET_AND_THROW_LAST_ERROR(env);
72 return nullptr;
73 }
74 return ctxt->self;
75 }
76
ToJson(napi_env env,napi_value inner,CalendarNapi * & out)77 napi_status CalendarNapi::ToJson(napi_env env, napi_value inner, CalendarNapi*& out)
78 {
79 LOG_DEBUG("CalendarNapi::ToJson");
80 return NapiUtil::Unwrap(env, inner, reinterpret_cast<void**>(&out), CalendarNapi::Constructor(env));
81 }
82
SetNative(std::shared_ptr<Native::Calendar> & calendar)83 void CalendarNapi::SetNative(std::shared_ptr<Native::Calendar>& calendar)
84 {
85 calendar_ = calendar;
86 }
GetNative()87 std::shared_ptr<Native::Calendar>& CalendarNapi::GetNative()
88 {
89 return calendar_;
90 }
91
AddEvent(napi_env env,napi_callback_info info)92 napi_value CalendarNapi::AddEvent(napi_env env, napi_callback_info info)
93 {
94 LOG_INFO("AddEvent");
95 struct AddEventContext : public ContextBase {
96 Event event;
97 int eventId;
98 };
99 auto ctxt = std::make_shared<AddEventContext>();
100 auto input = [env, ctxt](size_t argc, napi_value* argv) {
101 // required atleast 1 arguments :: <eventFilter>
102 CHECK_ARGS_RETURN_VOID(ctxt, argc == 1, "invalid arguments!");
103 ctxt->status = NapiUtil::GetValue(env, argv[0], ctxt->event);
104 CHECK_STATUS_RETURN_VOID(ctxt, "AddEvent failed!");
105 Native::DumpEvent(ctxt->event);
106 CHECK_STATUS_RETURN_VOID(ctxt, "invalid arg[0], i.e. invalid keys!");
107 };
108 ctxt->GetCbInfo(env, info, input);
109 auto execute = [ctxt]() {
110 auto calendar = reinterpret_cast<CalendarNapi*>(ctxt->native);
111 CHECK_RETURN_VOID(calendar != nullptr, "CalendarNapi nullptr");
112 auto nativeCalendar = calendar->GetNative();
113 CHECK_RETURN_VOID(nativeCalendar != nullptr, "nativeCalendar nullptr");
114 ctxt->eventId = nativeCalendar->AddEvent(ctxt->event);
115 ctxt->status = (ctxt->eventId > 0) ? napi_ok : napi_generic_failure;
116 CHECK_STATUS_RETURN_VOID(ctxt, "AddEvent failed!");
117 };
118 auto output = [env, ctxt](napi_value& result) {
119 ctxt->status = NapiUtil::SetValue(ctxt->env, ctxt->eventId, result);
120 CHECK_STATUS_RETURN_VOID(ctxt, "output failed");
121 };
122 return NapiQueue::AsyncWork(env, ctxt, std::string(__FUNCTION__), execute, output);
123 }
124
AddEvents(napi_env env,napi_callback_info info)125 napi_value CalendarNapi::AddEvents(napi_env env, napi_callback_info info)
126 {
127 LOG_INFO("AddEvents");
128 struct AddEventsContext : public ContextBase {
129 std::vector<Event> events;
130 int count;
131 };
132 auto ctxt = std::make_shared<AddEventsContext>();
133 auto input = [env, ctxt](size_t argc, napi_value* argv) {
134 // required atleast 1 arguments :: <eventFilter>
135 CHECK_ARGS_RETURN_VOID(ctxt, argc == 1, "invalid arguments!");
136 ctxt->status = NapiUtil::GetValue(env, argv[0], ctxt->events);
137 CHECK_STATUS_RETURN_VOID(ctxt, "GetValue failed!");
138 CHECK_STATUS_RETURN_VOID(ctxt, "invalid arg[0], i.e. invalid keys!");
139 };
140 ctxt->GetCbInfo(env, info, input);
141 auto execute = [ctxt]() {
142 auto calendar = reinterpret_cast<CalendarNapi*>(ctxt->native);
143 CHECK_RETURN_VOID(calendar != nullptr, "CalendarNapi nullptr");
144 auto nativeCalendar = calendar->GetNative();
145 CHECK_RETURN_VOID(nativeCalendar != nullptr, "nativeCalendar nullptr");
146 ctxt->count = nativeCalendar->AddEvents(ctxt->events);
147 ctxt->status = (ctxt->count > 0) ? napi_ok : napi_generic_failure;
148 CHECK_STATUS_RETURN_VOID(ctxt, "AddEvent failed!");
149 };
150 return NapiQueue::AsyncWork(env, ctxt, std::string(__FUNCTION__), execute);
151 }
152
DeleteEvent(napi_env env,napi_callback_info info)153 napi_value CalendarNapi::DeleteEvent(napi_env env, napi_callback_info info)
154 {
155 LOG_INFO("DeleteEvent");
156 struct DeleteEventContext : public ContextBase {
157 bool result;
158 int eventId;
159 };
160 auto ctxt = std::make_shared<DeleteEventContext>();
161 auto input = [env, ctxt](size_t argc, napi_value* argv) {
162 // required atleast 1 arguments :: <number>
163 CHECK_ARGS_RETURN_VOID(ctxt, argc == 1, "invalid arguments!");
164 ctxt->status = NapiUtil::GetValue(env, argv[0], ctxt->eventId);
165 CHECK_STATUS_RETURN_VOID(ctxt, "invalid arg[0], i.e. invalid keys!");
166 };
167 ctxt->GetCbInfo(env, info, input);
168 auto execute = [ctxt]() {
169 auto calendar = reinterpret_cast<CalendarNapi*>(ctxt->native);
170 CHECK_RETURN_VOID(calendar != nullptr, "CalendarNapi nullptr");
171 auto nativeCalendar = calendar->GetNative();
172 CHECK_RETURN_VOID(nativeCalendar != nullptr, "nativeCalendar nullptr");
173 ctxt->result = nativeCalendar->DeleteEvent(ctxt->eventId);
174 };
175 return NapiQueue::AsyncWork(env, ctxt, std::string(__FUNCTION__), execute);
176 }
177
DeleteEvents(napi_env env,napi_callback_info info)178 napi_value CalendarNapi::DeleteEvents(napi_env env, napi_callback_info info)
179 {
180 LOG_INFO("DeleteEvents");
181 struct DeleteEventsContext : public ContextBase {
182 int result;
183 std::vector<int> ids;
184 };
185 auto ctxt = std::make_shared<DeleteEventsContext>();
186 auto input = [env, ctxt](size_t argc, napi_value* argv) {
187 // required atleast 1 arguments :: <number>
188 CHECK_ARGS_RETURN_VOID(ctxt, argc == 1, "invalid arguments!");
189 ctxt->status = NapiUtil::GetValue(env, argv[0], ctxt->ids);
190 CHECK_STATUS_RETURN_VOID(ctxt, "invalid arg[0], i.e. invalid keys!");
191 };
192 ctxt->GetCbInfo(env, info, input);
193 auto execute = [ctxt]() {
194 auto calendar = reinterpret_cast<CalendarNapi*>(ctxt->native);
195 CHECK_RETURN_VOID(calendar != nullptr, "CalendarNapi nullptr");
196 auto nativeCalendar = calendar->GetNative();
197 CHECK_RETURN_VOID(nativeCalendar != nullptr, "nativeCalendar nullptr");
198 ctxt->result = nativeCalendar->DeleteEvents(ctxt->ids);
199 };
200 return NapiQueue::AsyncWork(env, ctxt, std::string(__FUNCTION__), execute);
201 }
202
UpdateEvent(napi_env env,napi_callback_info info)203 napi_value CalendarNapi::UpdateEvent(napi_env env, napi_callback_info info)
204 {
205 LOG_INFO("UpdateEvent");
206 struct UpdateEventContext : public ContextBase {
207 bool result;
208 Event event;
209 };
210 auto ctxt = std::make_shared<UpdateEventContext>();
211 auto input = [env, ctxt](size_t argc, napi_value* argv) {
212 // required atleast 1 arguments :: <number>
213 CHECK_ARGS_RETURN_VOID(ctxt, argc == 1, "invalid arguments!");
214 ctxt->status = NapiUtil::GetValue(env, argv[0], ctxt->event);
215 CHECK_STATUS_RETURN_VOID(ctxt, "invalid arg[0], i.e. invalid keys!");
216 };
217 ctxt->GetCbInfo(env, info, input);
218 auto execute = [ctxt]() {
219 auto calendar = reinterpret_cast<CalendarNapi*>(ctxt->native);
220 CHECK_RETURN_VOID(calendar != nullptr, "CalendarNapi nullptr");
221 auto nativeCalendar = calendar->GetNative();
222 CHECK_RETURN_VOID(nativeCalendar != nullptr, "nativeCalendar nullptr");
223 ctxt->result = nativeCalendar->UpdateEvent(ctxt->event);
224 };
225 return NapiQueue::AsyncWork(env, ctxt, std::string(__FUNCTION__), execute);
226 }
227
UpdateEvents(napi_env env,napi_callback_info info)228 napi_value CalendarNapi::UpdateEvents(napi_env env, napi_callback_info info)
229 {
230 LOG_INFO("UpdateEvents");
231 struct DeleteEventsContext : public ContextBase {
232 int result;
233 std::vector<Event> events;
234 CalendarNapi *calendar;
235 };
236 auto ctxt = std::make_shared<DeleteEventsContext>();
237 auto input = [env, ctxt](size_t argc, napi_value* argv) {
238 // required atleast 1 arguments :: <number>
239 CHECK_ARGS_RETURN_VOID(ctxt, argc == 1, "invalid arguments!");
240 ctxt->status = NapiUtil::GetValue(env, argv[0], ctxt->events);
241 CHECK_STATUS_RETURN_VOID(ctxt, "invalid arg[0], i.e. invalid keys!");
242 };
243 ctxt->GetCbInfo(env, info, input);
244 auto execute = [ctxt]() {
245 auto calendar = reinterpret_cast<CalendarNapi*>(ctxt->native);
246 CHECK_RETURN_VOID(calendar != nullptr, "CalendarNapi nullptr");
247 auto nativeCalendar = calendar->GetNative();
248 CHECK_RETURN_VOID(nativeCalendar != nullptr, "nativeCalendar nullptr");
249 ctxt->result = nativeCalendar->UpdateEvents(ctxt->events);
250 };
251 return NapiQueue::AsyncWork(env, ctxt, std::string(__FUNCTION__), execute);
252 }
253
GetEvents(napi_env env,napi_callback_info info)254 napi_value CalendarNapi::GetEvents(napi_env env, napi_callback_info info)
255 {
256 struct GetEventsContext : public ContextBase {
257 EventFilterNapi* eventFilter;
258 std::vector<std::string> eventKeys;
259 std::vector<Event> events;
260 };
261 auto ctxt = std::make_shared<GetEventsContext>();
262 auto input = [env, ctxt](size_t argc, napi_value* argv) {
263 CHECK_ARGS_RETURN_VOID(ctxt, argc <= 2, "invalid arguments!");
264 if (argc >= 1) {
265 napi_valuetype type = napi_undefined;
266 napi_typeof(env, argv[0], &type);
267 CHECK_ARGS_RETURN_VOID(ctxt, type == napi_object, "type error!");
268 ctxt->status = NapiUtil::GetValue(env, argv[0], ctxt->eventFilter);
269 CHECK_STATUS_RETURN_VOID(ctxt, "invalid arg[0], i.e. invalid keys!");
270 }
271 if (argc == 2) {
272 // required atleast 2 arguments :: <eventKey>
273 napi_valuetype type = napi_undefined;
274 napi_typeof(env, argv[0], &type);
275 ctxt->status = NapiUtil::GetValue(env, argv[1], ctxt->eventKeys);
276 CHECK_STATUS_RETURN_VOID(ctxt, "invalid arg[1], i.e. invalid keys!");
277 }
278 };
279 ctxt->GetCbInfo(env, info, input);
280
281 auto execute = [ctxt]() {
282 std::shared_ptr<Native::EventFilter> nativeFilter = nullptr;
283 if (ctxt->eventFilter != nullptr) {
284 nativeFilter = ctxt->eventFilter->GetNative();
285 }
286 auto calendar = reinterpret_cast<CalendarNapi*>(ctxt->native);
287 CHECK_RETURN_VOID(calendar != nullptr, "CalendarNapi nullptr");
288 auto nativeCalendar = calendar->GetNative();
289 CHECK_RETURN_VOID(nativeCalendar != nullptr, "nativeCalendar nullptr");
290 ctxt->events = nativeCalendar->GetEvents(nativeFilter, ctxt->eventKeys);
291 ctxt->status = (true) ? napi_ok : napi_generic_failure;
292 CHECK_STATUS_RETURN_VOID(ctxt, "GetEvents failed!");
293 };
294 auto output = [env, ctxt](napi_value& result) {
295 ctxt->status = NapiUtil::SetValue(ctxt->env, ctxt->events, result);
296 CHECK_STATUS_RETURN_VOID(ctxt, "output failed");
297 };
298 return NapiQueue::AsyncWork(env, ctxt, std::string(__FUNCTION__), execute, output);
299 }
300
QueryEventInstances(napi_env env,napi_callback_info info)301 napi_value CalendarNapi::QueryEventInstances(napi_env env, napi_callback_info info)
302 {
303 struct GetEventsContext : public ContextBase {
304 int64_t start;
305 int64_t end;
306 std::vector<int> ids;
307 std::vector<std::string> eventKeys;
308 std::vector<Event> events;
309 };
310 auto ctxt = std::make_shared<GetEventsContext>();
311 auto input = [env, ctxt](size_t argc, napi_value* argv) {
312 CHECK_ARGS_RETURN_VOID(ctxt, argc <= 4, "invalid arguments!");
313 if (argc >= 2) {
314 ctxt->status = NapiUtil::GetValue(env, argv[0], ctxt->start);
315 CHECK_STATUS_RETURN_VOID(ctxt, "invalid arg[0], i.e. invalid keys!");
316
317 ctxt->status = NapiUtil::GetValue(env, argv[1], ctxt->end);
318 CHECK_STATUS_RETURN_VOID(ctxt, "invalid arg[1], i.e. invalid keys!");
319 }
320 if (argc >= 3) {
321 bool isArray = false;
322 uint32_t length = 0;
323 napi_is_array(env, argv[2], &isArray);
324 napi_get_array_length(env, argv[2], &length);
325 if (isArray && length > 0) {
326 ctxt->status = NapiUtil::GetValue(env, argv[2], ctxt->ids);
327 CHECK_STATUS_RETURN_VOID(ctxt, "invalid arg[2], i.e. invalid keys!");
328 }
329 }
330
331 if (argc == 4) {
332 ctxt->status = NapiUtil::GetValue(env, argv[3], ctxt->eventKeys);
333 CHECK_STATUS_RETURN_VOID(ctxt, "invalid arg[3], i.e. invalid keys!");
334 }
335 };
336 ctxt->GetCbInfo(env, info, input);
337 auto execute = [ctxt]() {
338 auto calendar = reinterpret_cast<CalendarNapi*>(ctxt->native);
339 CHECK_RETURN_VOID(calendar != nullptr, "CalendarNapi nullptr");
340 auto nativeCalendar = calendar->GetNative();
341 CHECK_RETURN_VOID(nativeCalendar != nullptr, "nativeCalendar nullptr");
342 ctxt->events = nativeCalendar->QueryEventInstances(ctxt->start, ctxt->end, ctxt->ids, ctxt->eventKeys);
343 ctxt->status = (true) ? napi_ok : napi_generic_failure;
344 CHECK_STATUS_RETURN_VOID(ctxt, "GetEvents failed!");
345 };
346 auto output = [env, ctxt](napi_value& result) {
347 ctxt->status = NapiUtil::SetValue(ctxt->env, ctxt->events, result);
348 CHECK_STATUS_RETURN_VOID(ctxt, "output failed");
349 };
350 return NapiQueue::AsyncWork(env, ctxt, std::string(__FUNCTION__), execute, output);
351 }
352
GetConfig(napi_env env,napi_callback_info info)353 napi_value CalendarNapi::GetConfig(napi_env env, napi_callback_info info)
354 {
355 LOG_INFO("GetConfig");
356 size_t argc = 0;
357 napi_value thisVar = nullptr;
358 auto status = napi_get_cb_info(env, info, &argc, nullptr, &thisVar, nullptr);
359 if (status != napi_ok) {
360 LOG_ERROR("GetConfig napi_get_cb_info failed %{public}d", status);
361 return nullptr;
362 }
363 CalendarNapi *calendarNapi = nullptr;
364 status = napi_unwrap(env, thisVar, (void **)&calendarNapi);
365 if (status != napi_ok) {
366 LOG_ERROR("GetConfig napi_unwrap failed %{public}d", status);
367 return nullptr;
368 }
369 if (calendarNapi == nullptr) {
370 LOG_ERROR("GetConfig reinterpret_cast failed");
371 return nullptr;
372 }
373 auto nativeCalendar = calendarNapi->GetNative();
374 CHECK_RETURN(nativeCalendar != nullptr, "GetConfig -> get nativeCalendar nullptr", nullptr);
375 auto config = nativeCalendar->GetConfig();
376 LOG_DEBUG("config.enableReminder:%{public}d", config.enableReminder.value_or(-1));
377 if (std::get_if<1>(&config.color)) {
378 LOG_DEBUG("config.color:%{public}s", std::to_string(std::get<1>(config.color)).c_str());
379 } else {
380 LOG_ERROR("config.color is null");
381 }
382 napi_value result;
383 status = NapiUtil::SetValue(env, config, result);
384 if (status != napi_ok) {
385 LOG_ERROR("SetValue failed %{public}d", status);
386 return nullptr;
387 }
388 return result;
389 }
390
SetConfig(napi_env env,napi_callback_info info)391 napi_value CalendarNapi::SetConfig(napi_env env, napi_callback_info info)
392 {
393 LOG_INFO("SetConfig");
394 struct SetConfigContext : public ContextBase {
395 int result;
396 CalendarConfig config;
397 CalendarNapi *calendar;
398 };
399 auto ctxt = std::make_shared<SetConfigContext>();
400 auto input = [env, ctxt](size_t argc, napi_value* argv) {
401 // required atleast 1 arguments :: <CalendarConfig>
402 CHECK_ARGS_RETURN_VOID(ctxt, argc == 1, "invalid arguments!");
403 ctxt->status = NapiUtil::GetValue(env, argv[0], ctxt->config);
404 CHECK_STATUS_RETURN_VOID(ctxt, "invalid arg[0], i.e. invalid config!");
405 };
406 ctxt->GetCbInfo(env, info, input);
407 auto execute = [ctxt]() {
408 auto calendar = reinterpret_cast<CalendarNapi*>(ctxt->native);
409 CHECK_RETURN_VOID(calendar != nullptr, "CalendarNapi nullptr");
410 auto nativeCalendar = calendar->GetNative();
411 CHECK_RETURN_VOID(nativeCalendar != nullptr, "nativeCalendar nullptr");
412 ctxt->result = nativeCalendar->SetConfig(ctxt->config);
413 };
414 return NapiQueue::AsyncWork(env, ctxt, std::string(__FUNCTION__), execute);
415 }
416
GetAccount(napi_env env,napi_callback_info info)417 napi_value CalendarNapi::GetAccount(napi_env env, napi_callback_info info)
418 {
419 LOG_INFO("GetAccount");
420 size_t argc = 0;
421 napi_value thisVar = nullptr;
422 auto status = napi_get_cb_info(env, info, &argc, nullptr, &thisVar, nullptr);
423 if (status != napi_ok) {
424 LOG_ERROR("GetAccount napi_get_cb_info failed %{public}d", status);
425 return nullptr;
426 }
427 CalendarNapi *calendarNapi = nullptr;
428 status = napi_unwrap(env, thisVar, (void **)&calendarNapi);
429 if (status != napi_ok) {
430 LOG_ERROR("GetAccount napi_unwrap failed %{public}d", status);
431 return nullptr;
432 }
433 if (calendarNapi == nullptr) {
434 LOG_ERROR("GetAccount reinterpret_cast failed");
435 return nullptr;
436 }
437 auto nativeCalendar = calendarNapi->GetNative();
438 CHECK_RETURN(nativeCalendar != nullptr, "GetAccount -> get nativeCalendar nullptr", nullptr);
439 auto account = nativeCalendar->GetAccount();
440 LOG_DEBUG("account.name:%{private}s", account.name.c_str());
441 LOG_DEBUG("account.type:%{private}s", account.type.c_str());
442 if (account.displayName) {
443 LOG_DEBUG("account.displayName:%{private}s", account.displayName.value().c_str());
444 }
445 napi_value result;
446 status = NapiUtil::SetValue(env, account, result);
447 if (status != napi_ok) {
448 LOG_ERROR("SetValue failed %{public}d", status);
449 return nullptr;
450 }
451 return result;
452 }
453
CalendarAccountConstructor(napi_env env,napi_callback_info info)454 napi_value CalendarAccountConstructor(napi_env env, napi_callback_info info)
455 {
456 napi_value thisArg = nullptr;
457 void* data = nullptr;
458
459 napi_get_cb_info(env, info, nullptr, nullptr, &thisArg, &data);
460
461 napi_value global = nullptr;
462 napi_get_global(env, &global);
463
464 return thisArg;
465 }
466
CalendarAccountInit(napi_env env,napi_value exports)467 static void CalendarAccountInit(napi_env env, napi_value exports)
468 {
469 napi_value name = nullptr;
470 napi_value type = nullptr;
471 napi_value displayName = nullptr;
472
473 napi_create_string_utf8(env, "name", NAPI_AUTO_LENGTH, &name);
474 napi_create_string_utf8(env, "type", NAPI_AUTO_LENGTH, &type);
475 napi_create_string_utf8(env, "displayName", NAPI_AUTO_LENGTH, &displayName);
476
477 napi_property_descriptor calendarAccountProperties[] = {
478 DECLARE_NAPI_PROPERTY("name", name),
479 DECLARE_NAPI_PROPERTY("type", type),
480 DECLARE_NAPI_PROPERTY("displayName", displayName),
481 };
482 napi_value result = nullptr;
483 napi_define_class(env, "CalendarAccount", NAPI_AUTO_LENGTH, CalendarAccountConstructor, nullptr,
484 sizeof(calendarAccountProperties) / sizeof(napi_property_descriptor), calendarAccountProperties, &result);
485 napi_set_named_property(env, exports, "CalendarAccount", result);
486 }
487
Init(napi_env env,napi_value exports)488 napi_value CalendarNapi::Init(napi_env env, napi_value exports)
489 {
490 auto status = napi_set_named_property(env, exports, "Calendar", CalendarNapi::Constructor(env));
491 LOG_INFO("init Calendar %{public}d", status);
492 CalendarAccountInit(env, exports);
493 return exports;
494 }
495 }