• 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 
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 }