• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2022 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 "reminder/publish.h"
17 
18 #include "ans_log_wrapper.h"
19 #include "common.h"
20 #include "napi_common.h"
21 #include "reminder_request.h"
22 #include "reminder_request_alarm.h"
23 #include "reminder_request_calendar.h"
24 #include "reminder_request_timer.h"
25 #include "securec.h"
26 
27 namespace OHOS {
28 namespace ReminderAgentNapi {
29 static const int32_t PUBLISH_PARAM_LEN = 2;
30 static const int32_t CANCEL_PARAM_LEN = 2;
31 static const int32_t CANCEL_ALL_PARAM_LEN = 1;
32 static const int32_t GET_VALID_PARAM_LEN = 1;
33 static const int32_t ADD_SLOT_PARAM_LEN = 2;
34 static constexpr int32_t ADD_EXCLUDE_DATE_PARAM_LEN = 2;
35 static constexpr int32_t DEL_EXCLUDE_DATE_PARAM_LEN = 1;
36 static constexpr int32_t UPDATE_REMINDER_PARAM_LEN = 2;
37 
38 struct AsyncCallbackInfo {
AsyncCallbackInfoOHOS::ReminderAgentNapi::AsyncCallbackInfo39     explicit AsyncCallbackInfo(napi_env napiEnv) : env(napiEnv) {}
~AsyncCallbackInfoOHOS::ReminderAgentNapi::AsyncCallbackInfo40     ~AsyncCallbackInfo()
41     {
42         if (asyncWork) {
43             napi_delete_async_work(env, asyncWork);
44             asyncWork = nullptr;
45         }
46         if (callback) {
47             napi_delete_reference(env, callback);
48             callback = nullptr;
49         }
50     }
51 
52     napi_env env = nullptr;
53     napi_async_work asyncWork = nullptr;
54     napi_ref callback = nullptr;
55     napi_value result = nullptr;
56     int32_t reminderId = -1;
57     int64_t excludeDate = 0;
58     bool isThrow = false;
59     NotificationNapi::NotificationConstant::SlotType inType
60         = NotificationNapi::NotificationConstant::SlotType::CONTENT_INFORMATION;
61     std::shared_ptr<ReminderRequest> reminder = nullptr;
62     std::vector<ReminderRequestAdaptation> validReminders;
63     std::vector<int64_t> excludeDates;
64     CallbackPromiseInfo info;
65 };
66 
67 struct Parameters {
68     int32_t reminderId = -1;
69     int64_t excludeDate = 0;
70     int32_t errCode = ERR_OK;
71     NotificationNapi::NotificationConstant::SlotType inType
72         = NotificationNapi::NotificationConstant::SlotType::CONTENT_INFORMATION;
73     std::shared_ptr<ReminderRequest> reminder = nullptr;
74 };
75 
GetCallback(const napi_env & env,const napi_value & value,AsyncCallbackInfo & asyncCallbackInfo)76 napi_value GetCallback(const napi_env &env, const napi_value &value, AsyncCallbackInfo &asyncCallbackInfo)
77 {
78     napi_valuetype valuetype = napi_undefined;
79     NAPI_CALL(env, napi_typeof(env, value, &valuetype));
80     if (valuetype != napi_function) {
81         ANSR_LOGE("Wrong argument type. Function expected.");
82         return nullptr;
83     }
84     napi_create_reference(env, value, 1, &asyncCallbackInfo.callback);
85     return NotificationNapi::Common::NapiGetNull(env);
86 }
87 
SetAsynccallbackinfo(const napi_env & env,AsyncCallbackInfo & asynccallbackinfo,napi_value & promise)88 void SetAsynccallbackinfo(const napi_env &env, AsyncCallbackInfo& asynccallbackinfo, napi_value& promise)
89 {
90     ReminderCommon::PaddingCallbackPromiseInfo(
91         env, asynccallbackinfo.callback, asynccallbackinfo.info, promise);
92 }
93 
ParseParameters(const napi_env & env,const napi_callback_info & info,Parameters & params,AsyncCallbackInfo & asyncCallbackInfo,bool isThrow)94 napi_value ParseParameters(const napi_env &env, const napi_callback_info &info, Parameters &params,
95     AsyncCallbackInfo &asyncCallbackInfo, bool isThrow)
96 {
97     size_t argc = PUBLISH_PARAM_LEN;
98     napi_value argv[PUBLISH_PARAM_LEN] = {nullptr};
99     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr));
100     if (argc < 1) {
101         ANSR_LOGE("Wrong number of arguments");
102         if (isThrow) {
103             ReminderCommon::HandleErrCode(env, ERR_REMINDER_INVALID_PARAM);
104         }
105         return nullptr;
106     }
107 
108     // argv[1]: callback
109     if (argc >= PUBLISH_PARAM_LEN) {
110         if (GetCallback(env, argv[1], asyncCallbackInfo) == nullptr) {
111             ANSR_LOGE("null GetCallback");
112             if (isThrow) {
113                 ReminderCommon::HandleErrCode(env, ERR_REMINDER_INVALID_PARAM);
114             }
115             return nullptr;
116         }
117     }
118 
119     // argv[0] : reminderRequest
120     if (ReminderCommon::GetReminderRequest(env, argv[0], params.reminder) == nullptr) {
121         ANSR_LOGE("null GetReminderRequest");
122         if (isThrow) {
123             ReminderCommon::HandleErrCode(env, ERR_REMINDER_INVALID_PARAM);
124         }
125         return nullptr;
126     }
127 
128     return NotificationNapi::Common::NapiGetNull(env);
129 }
130 
ParseSlotParameters(const napi_env & env,const napi_callback_info & info,Parameters & params,AsyncCallbackInfo & asyncCallbackInfo,bool isThrow)131 napi_value ParseSlotParameters(const napi_env &env, const napi_callback_info &info, Parameters &params,
132     AsyncCallbackInfo &asyncCallbackInfo, bool isThrow)
133 {
134     size_t argc = ADD_SLOT_PARAM_LEN;
135     napi_value argv[ADD_SLOT_PARAM_LEN] = {nullptr};
136     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr));
137     if (argc < 1) {
138         ANSR_LOGE("Wrong number of arguments");
139         if (isThrow) {
140             ReminderCommon::HandleErrCode(env, ERR_REMINDER_INVALID_PARAM);
141         }
142         return nullptr;
143     }
144 
145     // argv[1]: callback
146     if (argc >= ADD_SLOT_PARAM_LEN) {
147         if (GetCallback(env, argv[1], asyncCallbackInfo) == nullptr) {
148             ANSR_LOGE("null GetCallback");
149             if (isThrow) {
150                 ReminderCommon::HandleErrCode(env, ERR_REMINDER_INVALID_PARAM);
151             }
152             return nullptr;
153         }
154     }
155 
156     // argv[0] : notificationSlot
157     // slotType
158     const char* propertyKey = "type";
159     const char* propertyNewKey = "notificationType";
160     int32_t propertyVal = 0;
161     if (!ReminderCommon::GetInt32(env, argv[0], propertyKey, propertyVal, false) &&
162         !ReminderCommon::GetInt32(env, argv[0], propertyNewKey, propertyVal, false)) {
163             ANSR_LOGE("Failed to get valid slot type.");
164         params.errCode = ERR_REMINDER_INVALID_PARAM;
165         if (isThrow) {
166             ReminderCommon::HandleErrCode(env, ERR_REMINDER_INVALID_PARAM);
167         }
168         return nullptr;
169     }
170 
171     if (!NotificationNapi::AnsEnumUtil::SlotTypeJSToC(NotificationNapi::SlotType(propertyVal), params.inType)) {
172         ANSR_LOGE("Failed to get valid slot type");
173         if (isThrow) {
174             ReminderCommon::HandleErrCode(env, ERR_REMINDER_INVALID_PARAM);
175         }
176         return nullptr;
177     }
178     return NotificationNapi::Common::NapiGetNull(env);
179 }
180 
ParseCanCelParameter(const napi_env & env,const napi_callback_info & info,Parameters & params,AsyncCallbackInfo & asyncCallbackInfo,bool isThrow)181 napi_value ParseCanCelParameter(const napi_env &env, const napi_callback_info &info, Parameters &params,
182     AsyncCallbackInfo &asyncCallbackInfo, bool isThrow)
183 {
184     ANSR_LOGD("called");
185     size_t argc = CANCEL_PARAM_LEN;
186     napi_value argv[CANCEL_PARAM_LEN] = {nullptr};
187     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr));
188     if (argc < 1) {
189         ANSR_LOGE("Wrong number of arguments");
190         if (isThrow) {
191             ReminderCommon::HandleErrCode(env, ERR_REMINDER_INVALID_PARAM);
192         }
193         return nullptr;
194     }
195 
196     // argv[1]: callback
197     if (argc >= CANCEL_PARAM_LEN) {
198         if (GetCallback(env, argv[1], asyncCallbackInfo) == nullptr) {
199             ANSR_LOGE("null GetCallback");
200             if (isThrow) {
201                 ReminderCommon::HandleErrCode(env, ERR_REMINDER_INVALID_PARAM);
202             }
203             return nullptr;
204         }
205     }
206 
207     // argv[0]: reminder id
208     int32_t reminderId = -1;
209     if (!ReminderCommon::GetInt32(env, argv[0], nullptr, reminderId, true)) {
210         if (isThrow) {
211             ReminderCommon::HandleErrCode(env, ERR_REMINDER_INVALID_PARAM);
212         }
213         return nullptr;
214     }
215     if (reminderId < 0) {
216         ANSR_LOGE("Param id of cancels Reminder is illegal.");
217         if (isThrow) {
218             ReminderCommon::HandleErrCode(env, ERR_REMINDER_INVALID_PARAM);
219         }
220         return nullptr;
221     }
222     params.reminderId = reminderId;
223 
224     return NotificationNapi::Common::NapiGetNull(env);
225 }
226 
ParseCanCelAllParameter(const napi_env & env,const napi_callback_info & info,Parameters & params,AsyncCallbackInfo & asyncCallbackInfo,bool isThrow)227 napi_value ParseCanCelAllParameter(const napi_env &env, const napi_callback_info &info, Parameters &params,
228     AsyncCallbackInfo &asyncCallbackInfo, bool isThrow)
229 {
230     ANSR_LOGD("called");
231     size_t argc = CANCEL_ALL_PARAM_LEN;
232     napi_value argv[CANCEL_ALL_PARAM_LEN] = {nullptr};
233     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr));
234 
235     // argv[0]: callback
236     if (argc >= CANCEL_ALL_PARAM_LEN) {
237         if (GetCallback(env, argv[0], asyncCallbackInfo) == nullptr) {
238             ANSR_LOGE("null GetCallback");
239             if (isThrow) {
240                 ReminderCommon::HandleErrCode(env, ERR_REMINDER_INVALID_PARAM);
241             }
242             return nullptr;
243         }
244     }
245     return NotificationNapi::Common::NapiGetNull(env);
246 }
247 
ParseGetValidParameter(const napi_env & env,const napi_callback_info & info,Parameters & params,AsyncCallbackInfo & asyncCallbackInfo,bool isThrow)248 napi_value ParseGetValidParameter(const napi_env &env, const napi_callback_info &info, Parameters &params,
249     AsyncCallbackInfo &asyncCallbackInfo, bool isThrow)
250 {
251     size_t argc = GET_VALID_PARAM_LEN;
252     napi_value argv[GET_VALID_PARAM_LEN] = {nullptr};
253     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr));
254 
255     // argv[0]: callback
256     if (argc >= GET_VALID_PARAM_LEN) {
257         if (GetCallback(env, argv[0], asyncCallbackInfo) == nullptr) {
258             ANSR_LOGE("null GetCallback");
259             if (isThrow) {
260                 ReminderCommon::HandleErrCode(env, ERR_REMINDER_INVALID_PARAM);
261             }
262             return nullptr;
263         }
264     }
265     return NotificationNapi::Common::NapiGetNull(env);
266 }
267 
DealErrorReturn(const napi_env & env,const napi_ref & callbackIn,const napi_value & result,bool isThrow)268 napi_value DealErrorReturn(const napi_env &env, const napi_ref &callbackIn, const napi_value &result, bool isThrow)
269 {
270     if (isThrow) {
271         return nullptr;
272     }
273     if (callbackIn) {
274         NotificationNapi::Common::SetCallback(env, callbackIn, ERR_REMINDER_INVALID_PARAM,
275             result, false);
276     }
277     return NotificationNapi::Common::JSParaError(env, callbackIn);
278 }
279 
CancelReminderInner(napi_env env,napi_callback_info info,bool isThrow)280 napi_value CancelReminderInner(napi_env env, napi_callback_info info, bool isThrow)
281 {
282     ANSR_LOGD("called");
283 
284     AsyncCallbackInfo *asynccallbackinfo = new (std::nothrow) AsyncCallbackInfo(env);
285     if (!asynccallbackinfo) {
286         ANSR_LOGE("Low memory.");
287         return NotificationNapi::Common::NapiGetNull(env);
288     }
289     std::unique_ptr<AsyncCallbackInfo> callbackPtr { asynccallbackinfo };
290 
291     // param
292     Parameters params;
293     if (ParseCanCelParameter(env, info, params, *asynccallbackinfo, isThrow) == nullptr) {
294         return DealErrorReturn(env, asynccallbackinfo->callback, NotificationNapi::Common::NapiGetNull(env), isThrow);
295     }
296 
297     // promise
298     napi_value promise = nullptr;
299     SetAsynccallbackinfo(env, *asynccallbackinfo, promise);
300     asynccallbackinfo->reminderId = params.reminderId;
301     asynccallbackinfo->isThrow = isThrow;
302 
303     // resource name
304     napi_value resourceName = nullptr;
305     napi_create_string_latin1(env, "cancelReminder", NAPI_AUTO_LENGTH, &resourceName);
306 
307     // create and queue async work
308     napi_create_async_work(env,
309         nullptr,
310         resourceName,
311         [](napi_env env, void *data) {
312             ANSR_LOGI("Cancel napi_create_async_work start");
313             auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfo *>(data);
314             if (asynccallbackinfo) {
315                 asynccallbackinfo->info.errorCode = ReminderHelper::CancelReminder(asynccallbackinfo->reminderId);
316             }
317         },
318         [](napi_env env, napi_status status, void *data) {
319             ANSR_LOGI("Cancel napi_create_async_work complete start");
320             auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfo *>(data);
321             std::unique_ptr<AsyncCallbackInfo> callbackPtr { asynccallbackinfo };
322 
323             ReminderCommon::ReturnCallbackPromise(
324                 env, asynccallbackinfo->info, NotificationNapi::Common::NapiGetNull(env), asynccallbackinfo->isThrow);
325             ANSR_LOGI("Cancel napi_create_async_work complete end");
326         },
327         (void *)asynccallbackinfo,
328         &asynccallbackinfo->asyncWork);
329     NAPI_CALL(env, napi_queue_async_work(env, asynccallbackinfo->asyncWork));
330     callbackPtr.release();
331 
332     if (asynccallbackinfo->info.isCallback) {
333         return NotificationNapi::Common::NapiGetNull(env);
334     } else {
335         return promise;
336     }
337 }
338 
CancelReminderMgr(napi_env env,napi_callback_info info)339 napi_value CancelReminderMgr(napi_env env, napi_callback_info info)
340 {
341     return CancelReminderInner(env, info, true);
342 }
343 
CancelReminder(napi_env env,napi_callback_info info)344 napi_value CancelReminder(napi_env env, napi_callback_info info)
345 {
346     return CancelReminderInner(env, info, false);
347 }
348 
CancelAllRemindersInner(napi_env env,napi_callback_info info,bool isThrow)349 napi_value CancelAllRemindersInner(napi_env env, napi_callback_info info, bool isThrow)
350 {
351     ANSR_LOGD("called");
352 
353     AsyncCallbackInfo *asynccallbackinfo = new (std::nothrow) AsyncCallbackInfo(env);
354     if (!asynccallbackinfo) {
355         ANSR_LOGE("Low memory.");
356         return NotificationNapi::Common::NapiGetNull(env);
357     }
358     std::unique_ptr<AsyncCallbackInfo> callbackPtr { asynccallbackinfo };
359 
360     // param
361     Parameters params;
362     if (ParseCanCelAllParameter(env, info, params, *asynccallbackinfo, isThrow) == nullptr) {
363         return DealErrorReturn(env, asynccallbackinfo->callback, NotificationNapi::Common::NapiGetNull(env), isThrow);
364     }
365 
366     // promise
367     napi_value promise = nullptr;
368     SetAsynccallbackinfo(env, *asynccallbackinfo, promise);
369     asynccallbackinfo->isThrow = isThrow;
370 
371     // resource name
372     napi_value resourceName = nullptr;
373     napi_create_string_latin1(env, "cancelAllReminders", NAPI_AUTO_LENGTH, &resourceName);
374 
375     // create and queue async work
376     napi_create_async_work(env,
377         nullptr,
378         resourceName,
379         [](napi_env env, void *data) {
380             ANSR_LOGI("CancelAll napi_create_async_work start");
381             auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfo *>(data);
382             if (asynccallbackinfo) {
383                 asynccallbackinfo->info.errorCode = ReminderHelper::CancelAllReminders();
384             }
385         },
386         [](napi_env env, napi_status status, void *data) {
387             ANSR_LOGD("CancelAll napi_create_async_work complete start");
388             auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfo *>(data);
389             std::unique_ptr<AsyncCallbackInfo> callbackPtr { asynccallbackinfo };
390 
391             ReminderCommon::ReturnCallbackPromise(
392                 env, asynccallbackinfo->info, NotificationNapi::Common::NapiGetNull(env), asynccallbackinfo->isThrow);
393             ANSR_LOGD("CancelAll napi_create_async_work complete end");
394         },
395         (void *)asynccallbackinfo,
396         &asynccallbackinfo->asyncWork);
397     NAPI_CALL(env, napi_queue_async_work(env, asynccallbackinfo->asyncWork));
398     callbackPtr.release();
399 
400     if (asynccallbackinfo->info.isCallback) {
401         return NotificationNapi::Common::NapiGetNull(env);
402     } else {
403         return promise;
404     }
405 }
406 
CancelAllRemindersMgr(napi_env env,napi_callback_info info)407 napi_value CancelAllRemindersMgr(napi_env env, napi_callback_info info)
408 {
409     return CancelAllRemindersInner(env, info, true);
410 }
411 
CancelAllReminders(napi_env env,napi_callback_info info)412 napi_value CancelAllReminders(napi_env env, napi_callback_info info)
413 {
414     return CancelAllRemindersInner(env, info, false);
415 }
416 
ParseReminderTimer(const napi_env & env,const ReminderRequest & reminder,napi_value & result)417 void ParseReminderTimer(const napi_env &env, const ReminderRequest &reminder, napi_value &result)
418 {
419     napi_value value = nullptr;
420     ReminderRequestTimer& timer = (ReminderRequestTimer&)reminder;
421     napi_create_uint32(env, timer.GetInitInfo(), &value);
422     napi_set_named_property(env, result, TIMER_COUNT_DOWN_TIME, value);
423 }
424 
ParseReminderAlarm(const napi_env & env,const ReminderRequest & reminder,napi_value & result)425 void ParseReminderAlarm(const napi_env &env, const ReminderRequest &reminder, napi_value &result)
426 {
427     // hour
428     napi_value value = nullptr;
429     ReminderRequestAlarm& alarm = (ReminderRequestAlarm&)reminder;
430     napi_create_uint32(env, static_cast<uint32_t>(alarm.GetHour()), &value);
431     napi_set_named_property(env, result, ALARM_HOUR, value);
432 
433     // minute
434     napi_create_uint32(env, static_cast<uint32_t>(alarm.GetMinute()), &value);
435     napi_set_named_property(env, result, ALARM_MINUTE, value);
436 
437     // daysOfWeek
438     napi_create_array(env, &value);
439     napi_set_named_property(env, result, REPEAT_DAYS_OF_WEEK, value);
440     int32_t count = 0;
441     for (auto day : reminder.GetDaysOfWeek()) {
442         if (day) {
443             napi_value napiDay = nullptr;
444             napi_create_int32(env, day, &napiDay);
445             napi_set_element(env, value, count, napiDay);
446             count++;
447         }
448     }
449 }
450 
ParseReminderCalendar(const napi_env & env,const ReminderRequest & reminder,napi_value & result)451 void ParseReminderCalendar(const napi_env &env, const ReminderRequest &reminder, napi_value &result)
452 {
453     // dateTime
454     napi_value value = nullptr;
455     ReminderRequestCalendar& calendar = (ReminderRequestCalendar&)reminder;
456     napi_value dateTime = nullptr;
457     napi_create_object(env, &dateTime);
458     napi_set_named_property(env, result, CALENDAR_DATE_TIME, dateTime);
459 
460     napi_create_uint32(env, static_cast<uint32_t>(calendar.GetFirstDesignateYear()), &value);
461     napi_set_named_property(env, dateTime, CALENDAR_YEAR, value);
462     napi_create_uint32(env, static_cast<uint32_t>(calendar.GetFirstDesignageMonth()), &value);
463     napi_set_named_property(env, dateTime, CALENDAR_MONTH, value);
464     napi_create_uint32(env, static_cast<uint32_t>(calendar.GetFirstDesignateDay()), &value);
465     napi_set_named_property(env, dateTime, CALENDAR_DAY, value);
466     napi_create_uint32(env, static_cast<uint32_t>(calendar.GetHour()), &value);
467     napi_set_named_property(env, dateTime, CALENDAR_HOUR, value);
468     napi_create_uint32(env, static_cast<uint32_t>(calendar.GetMinute()), &value);
469     napi_set_named_property(env, dateTime, CALENDAR_MINUTE, value);
470     napi_create_uint32(env, static_cast<uint32_t>(calendar.GetSecond()), &value);
471     napi_set_named_property(env, dateTime, CALENDAR_SECOND, value);
472 
473     // repeatMonths
474     napi_create_array(env, &value);
475     napi_set_named_property(env, result, CALENDAR_REPEAT_MONTHS, value);
476     int32_t count = 0;
477     for (auto month : calendar.GetRepeatMonths()) {
478         napi_value napiDay = nullptr;
479         napi_create_int32(env, month, &napiDay);
480         napi_set_element(env, value, count, napiDay);
481         count++;
482     }
483 
484     // repeatDays
485     napi_create_array(env, &value);
486     napi_set_named_property(env, result, CALENDAR_REPEAT_DAYS, value);
487     count = 0;
488     for (auto day : calendar.GetRepeatDays()) {
489         napi_value napiDay = nullptr;
490         napi_create_int32(env, day, &napiDay);
491         napi_set_element(env, value, count, napiDay);
492         count++;
493     }
494 
495     // daysOfWeek
496     napi_create_array(env, &value);
497     napi_set_named_property(env, result, REPEAT_DAYS_OF_WEEK, value);
498     count = 0;
499     for (auto day : reminder.GetDaysOfWeek()) {
500         if (day) {
501             napi_value napiDay = nullptr;
502             napi_create_int32(env, day, &napiDay);
503             napi_set_element(env, value, count, napiDay);
504             count++;
505         }
506     }
507 }
508 
ParseReminder(const napi_env & env,const ReminderRequest::ReminderType & type,ReminderRequest & reminder,napi_value & result)509 void ParseReminder(
510     const napi_env &env, const ReminderRequest::ReminderType &type, ReminderRequest &reminder, napi_value &result)
511 {
512     switch (type) {
513         case ReminderRequest::ReminderType::TIMER: {
514             ParseReminderTimer(env, reminder, result);
515             break;
516         }
517         case ReminderRequest::ReminderType::ALARM: {
518             ParseReminderAlarm(env, reminder, result);
519             break;
520         }
521         case ReminderRequest::ReminderType::CALENDAR: {
522             ParseReminderCalendar(env, reminder, result);
523             break;
524         }
525         default: {
526             break;
527         }
528     }
529 }
530 
ParseArray(const napi_env & env,std::vector<std::string> & temp,napi_value & jsObject)531 napi_status ParseArray(const napi_env &env, std::vector<std::string>& temp, napi_value &jsObject)
532 {
533     if (temp.size() <= INDEX_VALUE) {
534         return napi_invalid_arg;
535     }
536     // key
537     napi_value keyInfo = nullptr;
538     napi_create_string_utf8(env, temp[INDEX_KEY].c_str(), NAPI_AUTO_LENGTH, &keyInfo);
539     // value
540     napi_value valueInfo = nullptr;
541     napi_status status = napi_ok;
542     if (temp[INDEX_TYPE] == "string") {
543         napi_create_string_utf8(env, temp[INDEX_VALUE].c_str(), NAPI_AUTO_LENGTH, &valueInfo);
544     } else if (temp[INDEX_TYPE] == "double") {
545         napi_create_double(env, ReminderRequest::StringToDouble(temp[INDEX_VALUE]), &valueInfo);
546     } else if (temp[INDEX_TYPE] == "bool") {
547         bool valueBool = false;
548         if (temp[INDEX_VALUE] == "1" || temp[INDEX_VALUE] == "true" || temp[INDEX_VALUE] == "True") {
549             valueBool = true;
550         }
551         napi_get_boolean(env, valueBool, &valueInfo);
552     } else if (temp[INDEX_TYPE] == "null") {
553         napi_get_null(env, &valueInfo);
554     } else if (temp[INDEX_TYPE] == "vector") {
555         std::vector<std::string> arr = ReminderRequest::StringSplit(temp[INDEX_VALUE],
556             ReminderRequest::SEP_BUTTON_VALUE_BLOB);
557         std::vector<uint8_t> value;
558         for (auto &num : arr) {
559             value.push_back(static_cast<uint8_t>(ReminderRequest::StringToInt(num)));
560         }
561         // vector<uint8_t> to napi_value
562         if (value.size() <= 0) {
563             return napi_invalid_arg;
564         }
565         void* data = nullptr;
566         napi_value buffer = nullptr;
567         status = napi_create_arraybuffer(env, value.size(), &data, &buffer);
568         if (status != napi_ok) {
569             ANSR_LOGW("create array buffer failed!");
570             return napi_invalid_arg;
571         }
572         if (memcpy_s(data, value.size(), value.data(), value.size()) != EOK) {
573             ANSR_LOGW("memcpy_s not EOK");
574             return napi_invalid_arg;
575         }
576         status = napi_create_typedarray(env, napi_uint8_array, value.size(), buffer, 0, &valueInfo);
577         if (status != napi_ok) {
578             ANSR_LOGW("napi_create_typedarray failed!");
579             return napi_invalid_arg;
580         }
581     }
582     // write keyInfo and valueInfo
583     napi_set_property(env, jsObject, keyInfo, valueInfo);
584     return status;
585 }
586 
587 // parse equalTo,valueBucket
ParseValueBucket(const napi_env & env,std::vector<std::string> valueBucketVector,napi_value & result,const std::string & arrayName)588 void ParseValueBucket(const napi_env &env, std::vector<std::string> valueBucketVector,
589     napi_value &result, const std::string &arrayName)
590 {
591     // create array
592     napi_value array = nullptr;
593     napi_create_array(env, &array);
594     napi_set_named_property(env, result, arrayName.c_str(), array);
595     int32_t index = 0;
596     // write equalTo or valuesBucket
597     for (auto &str : valueBucketVector) {
598         std::vector<std::string> temp = ReminderRequest::StringSplit(str, ReminderRequest::SEP_BUTTON_VALUE);
599         if (temp.size() <= INDEX_VALUE) {
600             continue;
601         }
602         // key:value
603         napi_value jsObject = nullptr;
604         napi_create_object(env, &jsObject);
605         napi_status status = ParseArray(env, temp, jsObject);
606         if (status != napi_ok) {
607             continue;
608         }
609         // write object to array
610         napi_set_element(env, array, index++, jsObject);
611     }
612 }
613 
614 // parse uri,equalTo,valuesBucket  c++ -> js
ParseButtonDataShareUpdate(const napi_env & env,std::shared_ptr<ReminderRequest::ButtonDataShareUpdate> & dataShareUpdate,napi_value & result)615 void ParseButtonDataShareUpdate(const napi_env &env,
616     std::shared_ptr<ReminderRequest::ButtonDataShareUpdate> &dataShareUpdate, napi_value &result)
617 {
618     // create obj
619     napi_value buttonDataShareUpdate = nullptr;
620     napi_create_object(env, &buttonDataShareUpdate);
621     napi_set_named_property(env, result, BUTTON_DATA_SHARE_UPDATE, buttonDataShareUpdate);
622     // uri
623     napi_value uriInfo = nullptr;
624     napi_create_string_utf8(env, dataShareUpdate->uri.c_str(), NAPI_AUTO_LENGTH, &uriInfo);
625     napi_set_named_property(env, buttonDataShareUpdate, BUTTON_DATA_SHARE_UPDATE_URI, uriInfo);
626     // equalTo
627     std::vector<std::string> equalToVector = ReminderRequest::StringSplit(dataShareUpdate->equalTo,
628         ReminderRequest::SEP_BUTTON_VALUE_TYPE);
629     ParseValueBucket(env, equalToVector, buttonDataShareUpdate, BUTTON_DATA_SHARE_UPDATE_EQUALTO);
630     // valuesBucket
631     std::vector<std::string> valuesBucketVector = ReminderRequest::StringSplit(dataShareUpdate->valuesBucket,
632         ReminderRequest::SEP_BUTTON_VALUE_TYPE);
633     ParseValueBucket(env, valuesBucketVector, buttonDataShareUpdate, BUTTON_DATA_SHARE_UPDATE_VALUE);
634 }
635 
ParseActionButtons(const napi_env & env,const ReminderRequest & reminder,napi_value & result)636 void ParseActionButtons(const napi_env &env, const ReminderRequest &reminder, napi_value &result)
637 {
638     auto actionButtonsMap = reminder.GetActionButtons();
639 
640     // create array
641     napi_value array = nullptr;
642     napi_create_array(env, &array);
643     napi_set_named_property(env, result, ACTION_BUTTON, array);
644     int32_t index = 0;
645     for (std::map<ReminderRequest::ActionButtonType, ReminderRequest::ActionButtonInfo>::iterator it
646         = actionButtonsMap.begin(); it != actionButtonsMap.end(); ++it) {
647         // create obj
648         napi_value actionButton = nullptr;
649         napi_create_object(env, &actionButton);
650 
651         napi_value buttonInfo = nullptr;
652         napi_create_uint32(env, static_cast<int32_t>(it->second.type), &buttonInfo);
653         napi_set_named_property(env, actionButton, ACTION_BUTTON_TYPE, buttonInfo);
654         napi_create_string_utf8(env, (it->second.title).c_str(), NAPI_AUTO_LENGTH, &buttonInfo);
655         napi_set_named_property(env, actionButton, ACTION_BUTTON_TITLE, buttonInfo);
656         napi_create_string_utf8(env, (it->second.resource).c_str(), NAPI_AUTO_LENGTH, &buttonInfo);
657         napi_set_named_property(env, actionButton, ACTION_BUTTON_RESOURCE, buttonInfo);
658 
659         // create obj
660         napi_value wantAgentInfo = nullptr;
661         napi_create_object(env, &wantAgentInfo);
662         napi_set_named_property(env, actionButton, WANT_AGENT, wantAgentInfo);
663 
664         if (it->second.type == ReminderRequest::ActionButtonType::CUSTOM) {
665             napi_value info = nullptr;
666             napi_create_string_utf8(env, (it->second.wantAgent->pkgName).c_str(), NAPI_AUTO_LENGTH, &info);
667             napi_set_named_property(env, wantAgentInfo, WANT_AGENT_PKG, info);
668             napi_create_string_utf8(env, (it->second.wantAgent->abilityName).c_str(), NAPI_AUTO_LENGTH, &info);
669             napi_set_named_property(env, wantAgentInfo, WANT_AGENT_ABILITY, info);
670             napi_create_string_utf8(env, (reminder.GetCustomButtonUri()).c_str(), NAPI_AUTO_LENGTH, &info);
671             napi_set_named_property(env, wantAgentInfo, BUTTON_WANT_AGENT_URI, info);
672         }
673         // Parse ButtonDataShareUpdate
674         if (it->second.type != ReminderRequest::ActionButtonType::INVALID) {
675             ParseButtonDataShareUpdate(env, it->second.dataShareUpdate, actionButton);
676         }
677         // add obj to array
678         napi_set_element(env, array, index, actionButton);
679         index++;
680     }
681 }
682 
ParseWantAgent(const napi_env & env,const ReminderRequest & reminder,napi_value & result)683 void ParseWantAgent(const napi_env &env, const ReminderRequest &reminder, napi_value &result)
684 {
685     // create obj
686     napi_value wantAgentInfo = nullptr;
687     napi_create_object(env, &wantAgentInfo);
688     napi_set_named_property(env, result, WANT_AGENT, wantAgentInfo);
689 
690     napi_value info = nullptr;
691     napi_create_string_utf8(env, (reminder.GetWantAgentInfo()->pkgName).c_str(), NAPI_AUTO_LENGTH, &info);
692     napi_set_named_property(env, wantAgentInfo, WANT_AGENT_PKG, info);
693     napi_create_string_utf8(env, (reminder.GetWantAgentInfo()->abilityName).c_str(), NAPI_AUTO_LENGTH, &info);
694     napi_set_named_property(env, wantAgentInfo, WANT_AGENT_ABILITY, info);
695 
696     napi_create_string_utf8(env, (reminder.GetWantAgentInfo()->uri).c_str(), NAPI_AUTO_LENGTH, &info);
697     napi_set_named_property(env, wantAgentInfo, WANT_AGENT_URI, info);
698 
699     napi_value params = AppExecFwk::WrapWantParams(env, reminder.GetWantAgentInfo()->parameters);
700     napi_set_named_property(env, wantAgentInfo, WANT_AGENT_PARAMETERS, params);
701 }
702 
ParseMaxScreenWantAgent(const napi_env & env,const ReminderRequest & reminder,napi_value & result)703 void ParseMaxScreenWantAgent(const napi_env &env, const ReminderRequest &reminder, napi_value &result)
704 {
705     // create obj
706     napi_value maxScreenWantAgentInfo = nullptr;
707     napi_create_object(env, &maxScreenWantAgentInfo);
708     napi_set_named_property(env, result, MAX_SCREEN_WANT_AGENT, maxScreenWantAgentInfo);
709 
710     napi_value info = nullptr;
711     napi_create_string_utf8(env, (reminder.GetMaxScreenWantAgentInfo()->pkgName).c_str(), NAPI_AUTO_LENGTH, &info);
712     napi_set_named_property(env, maxScreenWantAgentInfo, MAX_SCREEN_WANT_AGENT_PKG, info);
713     napi_create_string_utf8(env, (reminder.GetMaxScreenWantAgentInfo()->abilityName).c_str(), NAPI_AUTO_LENGTH, &info);
714     napi_set_named_property(env, maxScreenWantAgentInfo, MAX_SCREEN_WANT_AGENT_ABILITY, info);
715 }
716 
SetValidReminder(const napi_env & env,ReminderRequest & reminder,napi_value & result)717 napi_value SetValidReminder(const napi_env &env, ReminderRequest &reminder, napi_value &result)
718 {
719     ANSR_LOGD("called");
720     napi_value value = nullptr;
721 
722     napi_create_string_utf8(env, reminder.Dump().c_str(), NAPI_AUTO_LENGTH, &value);
723     napi_set_named_property(env, result, "reminder", value);
724 
725     // type
726     ReminderRequest::ReminderType type = reminder.GetReminderType();
727     napi_create_int32(env, static_cast<int32_t>(type), &value);
728     napi_set_named_property(env, result, REMINDER_TYPE, value);
729 
730     // reminder
731     ParseReminder(env, type, reminder, result);
732 
733     // title
734     napi_create_string_utf8(env, reminder.GetTitle().c_str(), NAPI_AUTO_LENGTH, &value);
735     napi_set_named_property(env, result, TITLE, value);
736 
737     // content
738     napi_create_string_utf8(env, reminder.GetContent().c_str(), NAPI_AUTO_LENGTH, &value);
739     napi_set_named_property(env, result, CONTENT, value);
740 
741     // expiredContent
742     napi_create_string_utf8(env, reminder.GetExpiredContent().c_str(), NAPI_AUTO_LENGTH, &value);
743     napi_set_named_property(env, result, EXPIRED_CONTENT, value);
744 
745     // snoozeContent
746     napi_create_string_utf8(env, reminder.GetSnoozeContent().c_str(), NAPI_AUTO_LENGTH, &value);
747     napi_set_named_property(env, result, SNOOZE_CONTENT, value);
748 
749     // ringDuration
750     napi_create_int64(env, reminder.GetRingDuration(), &value);
751     napi_set_named_property(env, result, RING_DURATION, value);
752 
753     // timeInterval
754     napi_create_int64(env, reminder.GetTimeInterval(), &value);
755     napi_set_named_property(env, result, TIME_INTERVAL, value);
756 
757     // notificationId
758     napi_create_int32(env, reminder.GetNotificationId(), &value);
759     napi_set_named_property(env, result, NOTIFICATION_ID, value);
760 
761     // snoozeTimes
762     napi_create_int32(env, reminder.GetSnoozeTimes(), &value);
763     napi_set_named_property(env, result, SNOOZE_TIMES, value);
764 
765     // tapDismissed
766     napi_get_boolean(env, reminder.IsTapDismissed(), &value);
767     napi_set_named_property(env, result, TAPDISMISSED, value);
768 
769     // autoDeletedTime
770     napi_create_int64(env, reminder.GetAutoDeletedTime(), &value);
771     napi_set_named_property(env, result, AUTODELETEDTIME, value);
772 
773     // slotType
774     NotificationNapi::SlotType jsSlotType;
775     if (reminder.GetSlotType() == NotificationConstant::SlotType::OTHER) {
776         NotificationNapi::AnsEnumUtil::SlotTypeCToJS(NotificationConstant::SlotType::SOCIAL_COMMUNICATION, jsSlotType);
777     } else {
778         NotificationNapi::AnsEnumUtil::SlotTypeCToJS(reminder.GetSlotType(), jsSlotType);
779     }
780     napi_create_int32(env, static_cast<int32_t>(jsSlotType), &value);
781     napi_set_named_property(env, result, SLOT_TYPE, value);
782 
783     // snoozeSlotType
784     NotificationNapi::SlotType jsSnoozeSlotType;
785     NotificationNapi::AnsEnumUtil::SlotTypeCToJS(reminder.GetSnoozeSlotType(), jsSnoozeSlotType);
786     napi_create_int32(env, static_cast<int32_t>(jsSnoozeSlotType), &value);
787     napi_set_named_property(env, result, SNOOZE_SLOT_TYPE, value);
788 
789     // group id
790     napi_create_string_utf8(env, reminder.GetGroupId().c_str(), NAPI_AUTO_LENGTH, &value);
791     napi_set_named_property(env, result, GROUP_ID, value);
792 
793     // custom ring uri
794     napi_create_string_utf8(env, reminder.GetCustomRingUri().c_str(), NAPI_AUTO_LENGTH, &value);
795     napi_set_named_property(env, result, CUSTOM_RING_URI, value);
796 
797     // type
798     ReminderRequest::RingChannel channel = reminder.GetRingChannel();
799     napi_create_int32(env, static_cast<int32_t>(channel), &value);
800     napi_set_named_property(env, result, RING_CHANNEL, value);
801 
802     // wantAgent
803     ParseWantAgent(env, reminder, result);
804 
805     // maxScreenWantAgent
806     ParseMaxScreenWantAgent(env, reminder, result);
807 
808     // actionButtons
809     ParseActionButtons(env, reminder, result);
810 
811     return NotificationNapi::Common::NapiGetBoolean(env, true);
812 }
813 
GetValidRemindersInner(napi_env env,const std::vector<ReminderRequestAdaptation> & validReminders,napi_value & arr)814 void GetValidRemindersInner(napi_env env, const std::vector<ReminderRequestAdaptation>& validReminders, napi_value& arr)
815 {
816     int32_t count = 0;
817     napi_create_array(env, &arr);
818     for (auto& reminderRequestAdaptation : validReminders) {
819         if (reminderRequestAdaptation.reminderRequest_ == nullptr) {
820             ANSR_LOGW("null reminder");
821             continue;
822         }
823         napi_value result = nullptr;
824         napi_create_object(env, &result);
825         if (!SetValidReminder(env, *reminderRequestAdaptation.reminderRequest_, result)) {
826             ANSR_LOGW("Set reminder object failed");
827             continue;
828         }
829         napi_set_element(env, arr, count, result);
830         count++;
831     }
832     ANSR_LOGI("count = %{public}d", count);
833 }
834 
GetAllValidRemindersInner(napi_env env,const std::vector<ReminderRequestAdaptation> & validReminders,napi_value & arr)835 void GetAllValidRemindersInner(napi_env env,
836     const std::vector<ReminderRequestAdaptation>& validReminders, napi_value& arr)
837 {
838     int32_t count = 0;
839     napi_create_array(env, &arr);
840     for (auto& reminderRequestAdaptation : validReminders) {
841         napi_value result = nullptr;
842         napi_create_object(env, &result);
843         napi_value reminderReq = nullptr;
844         napi_create_object(env, &reminderReq);
845         napi_set_named_property(env, result, REMINDER_INFO_REMINDER_REQ, reminderReq);
846         if (!SetValidReminder(env, *reminderRequestAdaptation.reminderRequest_, reminderReq)) {
847             ANSR_LOGW("Set reminder object failed");
848             continue;
849         }
850         napi_value reminderId = nullptr;
851         napi_create_int32(env, reminderRequestAdaptation.reminderRequest_->GetReminderId(), &reminderId);
852         napi_set_named_property(env, result, REMINDER_INFO_REMINDER_ID, reminderId);
853         napi_set_element(env, arr, count, result);
854         count++;
855     }
856     ANSR_LOGI("count = %{public}d", count);
857 }
858 
InnerGetValidReminders(napi_env env,napi_callback_info info,bool isThrow)859 napi_value InnerGetValidReminders(napi_env env, napi_callback_info info, bool isThrow)
860 {
861     ANSR_LOGD("called");
862 
863     AsyncCallbackInfo *asynccallbackinfo = new (std::nothrow) AsyncCallbackInfo(env);
864     if (!asynccallbackinfo) {
865         ANSR_LOGE("Low memory.");
866         return NotificationNapi::Common::NapiGetNull(env);
867     }
868     std::unique_ptr<AsyncCallbackInfo> callbackPtr { asynccallbackinfo };
869 
870     // param
871     Parameters params;
872     if (ParseGetValidParameter(env, info, params, *asynccallbackinfo, isThrow) == nullptr) {
873         return DealErrorReturn(env, asynccallbackinfo->callback, NotificationNapi::Common::NapiGetNull(env), isThrow);
874     }
875 
876     // promise
877     napi_value promise = nullptr;
878     SetAsynccallbackinfo(env, *asynccallbackinfo, promise);
879     asynccallbackinfo->isThrow = isThrow;
880 
881     // resource name
882     napi_value resourceName = nullptr;
883     napi_create_string_latin1(env, "getValidReminders", NAPI_AUTO_LENGTH, &resourceName);
884 
885     // create and start async work
886     napi_create_async_work(env,
887         nullptr,
888         resourceName,
889         [](napi_env env, void *data) {
890             ANSR_LOGI("GetValid reminders napi_create_async_work start");
891             AsyncCallbackInfo *asynccallbackinfo = static_cast<AsyncCallbackInfo *>(data);
892             if (asynccallbackinfo) {
893                 asynccallbackinfo->info.errorCode = ReminderHelper::GetValidReminders(
894                     asynccallbackinfo->validReminders);
895             }
896         },
897         [](napi_env env, napi_status status, void *data) {
898             AsyncCallbackInfo *asynccallbackinfo = static_cast<AsyncCallbackInfo *>(data);
899             std::unique_ptr<AsyncCallbackInfo> callbackPtr { asynccallbackinfo };
900 
901             if (asynccallbackinfo) {
902                 if (asynccallbackinfo->info.errorCode != ERR_OK) {
903                     asynccallbackinfo->result = NotificationNapi::Common::NapiGetNull(env);
904                 } else {
905                     GetValidRemindersInner(env, asynccallbackinfo->validReminders, asynccallbackinfo->result);
906                 }
907 
908                 ReminderCommon::ReturnCallbackPromise(
909                     env, asynccallbackinfo->info, asynccallbackinfo->result, asynccallbackinfo->isThrow);
910             }
911         },
912         (void *)asynccallbackinfo,
913         &asynccallbackinfo->asyncWork);
914     NAPI_CALL(env, napi_queue_async_work(env, asynccallbackinfo->asyncWork));
915     callbackPtr.release();
916 
917     if (asynccallbackinfo->info.isCallback) {
918         return NotificationNapi::Common::NapiGetNull(env);
919     } else {
920         return promise;
921     }
922 }
923 
InnerGetAllValidReminders(napi_env env,napi_callback_info info,bool isThrow)924 napi_value InnerGetAllValidReminders(napi_env env, napi_callback_info info, bool isThrow)
925 {
926     ANSR_LOGD("called");
927 
928     AsyncCallbackInfo *asynccallbackinfo = new (std::nothrow) AsyncCallbackInfo(env);
929     if (!asynccallbackinfo) {
930         ANSR_LOGE("Low memory.");
931         return NotificationNapi::Common::NapiGetNull(env);
932     }
933     std::unique_ptr<AsyncCallbackInfo> callbackPtr { asynccallbackinfo };
934 
935     Parameters params;
936     if (ParseGetValidParameter(env, info, params, *asynccallbackinfo, isThrow) == nullptr) {
937         return DealErrorReturn(env, asynccallbackinfo->callback, NotificationNapi::Common::NapiGetNull(env), isThrow);
938     }
939 
940     napi_value promise = nullptr;
941     SetAsynccallbackinfo(env, *asynccallbackinfo, promise);
942     asynccallbackinfo->isThrow = isThrow;
943 
944     napi_value resourceName = nullptr;
945     napi_create_string_latin1(env, "getAllValidReminders", NAPI_AUTO_LENGTH, &resourceName);
946 
947     napi_create_async_work(env, nullptr, resourceName,
948         [](napi_env env, void *data) {
949             ANSR_LOGI("GetAllValid reminders napi_create_async_work start");
950             AsyncCallbackInfo *asynccallbackinfo = static_cast<AsyncCallbackInfo *>(data);
951             if (asynccallbackinfo) {
952                 asynccallbackinfo->info.errorCode = ReminderHelper::GetValidReminders(
953                     asynccallbackinfo->validReminders);
954             }
955         },
956         [](napi_env env, napi_status status, void *data) {
957             AsyncCallbackInfo *asynccallbackinfo = static_cast<AsyncCallbackInfo *>(data);
958             std::unique_ptr<AsyncCallbackInfo> callbackPtr { asynccallbackinfo };
959 
960             if (asynccallbackinfo) {
961                 if (asynccallbackinfo->info.errorCode != ERR_OK) {
962                     asynccallbackinfo->result = NotificationNapi::Common::NapiGetNull(env);
963                 } else {
964                     GetAllValidRemindersInner(env, asynccallbackinfo->validReminders, asynccallbackinfo->result);
965                 }
966 
967                 ReminderCommon::ReturnCallbackPromise(
968                     env, asynccallbackinfo->info, asynccallbackinfo->result, asynccallbackinfo->isThrow);
969             }
970         },
971         (void *)asynccallbackinfo,
972         &asynccallbackinfo->asyncWork);
973     NAPI_CALL(env, napi_queue_async_work(env, asynccallbackinfo->asyncWork));
974     callbackPtr.release();
975 
976     if (asynccallbackinfo->info.isCallback) {
977         return NotificationNapi::Common::NapiGetNull(env);
978     } else {
979         return promise;
980     }
981 }
982 
GetValidRemindersMgr(napi_env env,napi_callback_info info)983 napi_value GetValidRemindersMgr(napi_env env, napi_callback_info info)
984 {
985     return InnerGetValidReminders(env, info, true);
986 }
987 
GetAllValidRemindersMgr(napi_env env,napi_callback_info info)988 napi_value GetAllValidRemindersMgr(napi_env env, napi_callback_info info)
989 {
990     return InnerGetAllValidReminders(env, info, true);
991 }
992 
GetValidReminders(napi_env env,napi_callback_info info)993 napi_value GetValidReminders(napi_env env, napi_callback_info info)
994 {
995     return InnerGetValidReminders(env, info, false);
996 }
997 
GetAllValidReminders(napi_env env,napi_callback_info info)998 napi_value GetAllValidReminders(napi_env env, napi_callback_info info)
999 {
1000     return InnerGetAllValidReminders(env, info, false);
1001 }
1002 
PublishReminderInner(napi_env env,napi_callback_info info,bool isThrow)1003 napi_value PublishReminderInner(napi_env env, napi_callback_info info, bool isThrow)
1004 {
1005     ANSR_LOGD("called");
1006 
1007     AsyncCallbackInfo *asynccallbackinfo = new (std::nothrow) AsyncCallbackInfo(env);
1008     if (!asynccallbackinfo) {
1009         ANSR_LOGE("Low memory.");
1010         return NotificationNapi::Common::NapiGetNull(env);
1011     }
1012     std::unique_ptr<AsyncCallbackInfo> callbackPtr { asynccallbackinfo };
1013 
1014     // param
1015     Parameters params;
1016     if (ParseParameters(env, info, params, *asynccallbackinfo, isThrow) == nullptr) {
1017         napi_create_int32(env, -1, &(asynccallbackinfo->result));
1018         return DealErrorReturn(env, asynccallbackinfo->callback, asynccallbackinfo->result, isThrow);
1019     }
1020 
1021     // promise
1022     napi_value promise = nullptr;
1023     SetAsynccallbackinfo(env, *asynccallbackinfo, promise);
1024     asynccallbackinfo->reminder = params.reminder;
1025     asynccallbackinfo->isThrow = isThrow;
1026 
1027     // resource name
1028     napi_value resourceName = nullptr;
1029     napi_create_string_latin1(env, "publishReminder", NAPI_AUTO_LENGTH, &resourceName);
1030 
1031     // create and start async work
1032     napi_create_async_work(env,
1033         nullptr,
1034         resourceName,
1035         [](napi_env env, void *data) {
1036             ANSR_LOGI("Publish napi_create_async_work start");
1037             AsyncCallbackInfo *asynccallbackinfo = static_cast<AsyncCallbackInfo *>(data);
1038             if (asynccallbackinfo) {
1039                 asynccallbackinfo->info.errorCode =
1040                     ReminderHelper::PublishReminder(*(asynccallbackinfo->reminder), asynccallbackinfo->reminderId);
1041                 ANSR_LOGD("Return reminderId=%{public}d", asynccallbackinfo->reminderId);
1042             }
1043         },
1044         [](napi_env env, napi_status status, void *data) {
1045             ANSR_LOGI("Publish napi_create_async_work complete start");
1046             AsyncCallbackInfo *asynccallbackinfo = static_cast<AsyncCallbackInfo *>(data);
1047             std::unique_ptr<AsyncCallbackInfo> callbackPtr { asynccallbackinfo };
1048 
1049             // reminderId
1050             if (asynccallbackinfo) {
1051                 if (asynccallbackinfo->info.errorCode == ERR_OK) {
1052                     napi_create_int32(env, asynccallbackinfo->reminderId, &(asynccallbackinfo->result));
1053                 } else {
1054                     napi_create_int32(env, -1, &(asynccallbackinfo->result));
1055                 }
1056 
1057                 ReminderCommon::ReturnCallbackPromise(
1058                     env, asynccallbackinfo->info, asynccallbackinfo->result, asynccallbackinfo->isThrow);
1059                 ANSR_LOGI("Publish napi_create_async_work complete end");
1060             }
1061         },
1062         (void *)asynccallbackinfo,
1063         &asynccallbackinfo->asyncWork);
1064 
1065     NAPI_CALL(env, napi_queue_async_work(env, asynccallbackinfo->asyncWork));
1066     callbackPtr.release();
1067 
1068     if (asynccallbackinfo->info.isCallback) {
1069         return NotificationNapi::Common::NapiGetNull(env);
1070     } else {
1071         return promise;
1072     }
1073 }
1074 
PublishReminderMgr(napi_env env,napi_callback_info info)1075 napi_value PublishReminderMgr(napi_env env, napi_callback_info info)
1076 {
1077     return PublishReminderInner(env, info, true);
1078 }
1079 
PublishReminder(napi_env env,napi_callback_info info)1080 napi_value PublishReminder(napi_env env, napi_callback_info info)
1081 {
1082     return PublishReminderInner(env, info, false);
1083 }
1084 
AddSlotInner(napi_env env,napi_callback_info info,bool isThrow)1085 napi_value AddSlotInner(napi_env env, napi_callback_info info, bool isThrow)
1086 {
1087     ANSR_LOGD("called");
1088 
1089     AsyncCallbackInfo *asynccallbackinfo = new (std::nothrow) AsyncCallbackInfo(env);
1090     if (!asynccallbackinfo) {
1091         ANSR_LOGE("Low memory.");
1092         return NotificationNapi::Common::NapiGetNull(env);
1093     }
1094     std::unique_ptr<AsyncCallbackInfo> callbackPtr { asynccallbackinfo };
1095 
1096     // param
1097     Parameters params;
1098     if (ParseSlotParameters(env, info, params, *asynccallbackinfo, isThrow) == nullptr) {
1099         return DealErrorReturn(env, asynccallbackinfo->callback, NotificationNapi::Common::NapiGetNull(env), isThrow);
1100     }
1101 
1102     // promise
1103     napi_value promise = nullptr;
1104     SetAsynccallbackinfo(env, *asynccallbackinfo, promise);
1105     asynccallbackinfo->inType = params.inType;
1106     asynccallbackinfo->info.errorCode = params.errCode;
1107     asynccallbackinfo->isThrow = isThrow;
1108 
1109     // resource name
1110     napi_value resourceName = nullptr;
1111     napi_create_string_latin1(env, "AddSlot", NAPI_AUTO_LENGTH, &resourceName);
1112 
1113     // create and start async work
1114     napi_create_async_work(env,
1115         nullptr,
1116         resourceName,
1117         [](napi_env env, void *data) {
1118             ANSR_LOGI("AddSlot napi_create_async_work start");
1119             AsyncCallbackInfo *asynccallbackinfo = static_cast<AsyncCallbackInfo *>(data);
1120             if (asynccallbackinfo && (asynccallbackinfo->info.errorCode == ERR_OK)) {
1121                 asynccallbackinfo->info.errorCode = NotificationHelper::AddSlotByType(asynccallbackinfo->inType);
1122             }
1123         },
1124         [](napi_env env, napi_status status, void *data) {
1125             AsyncCallbackInfo *asynccallbackinfo = static_cast<AsyncCallbackInfo *>(data);
1126             if (asynccallbackinfo) {
1127                 std::unique_ptr<AsyncCallbackInfo> callbackPtr { asynccallbackinfo };
1128                 ReminderCommon::ReturnCallbackPromise(env, asynccallbackinfo->info,
1129                     NotificationNapi::Common::NapiGetNull(env), asynccallbackinfo->isThrow);
1130                 ANSR_LOGD("AddSlot napi_create_async_work complete end.");
1131             }
1132         },
1133         (void *)asynccallbackinfo,
1134         &asynccallbackinfo->asyncWork);
1135 
1136     NAPI_CALL(env, napi_queue_async_work(env, asynccallbackinfo->asyncWork));
1137     callbackPtr.release();
1138 
1139     if (asynccallbackinfo->info.isCallback) {
1140         return NotificationNapi::Common::NapiGetNull(env);
1141     } else {
1142         return promise;
1143     }
1144 }
1145 
AddSlotMgr(napi_env env,napi_callback_info info)1146 napi_value AddSlotMgr(napi_env env, napi_callback_info info)
1147 {
1148     return AddSlotInner(env, info, true);
1149 }
1150 
AddSlot(napi_env env,napi_callback_info info)1151 napi_value AddSlot(napi_env env, napi_callback_info info)
1152 {
1153     return AddSlotInner(env, info, false);
1154 }
1155 
ParseAddExcludeDateParameter(const napi_env & env,const napi_callback_info & info,Parameters & params)1156 napi_value ParseAddExcludeDateParameter(const napi_env &env, const napi_callback_info &info, Parameters &params)
1157 {
1158     ANSR_LOGD("called");
1159     size_t argc = ADD_EXCLUDE_DATE_PARAM_LEN;
1160     napi_value argv[ADD_EXCLUDE_DATE_PARAM_LEN] = {nullptr};
1161     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr));
1162     if (argc < ADD_EXCLUDE_DATE_PARAM_LEN) {
1163         ANSR_LOGE("Wrong number of arguments");
1164         ReminderCommon::HandleErrCode(env, ERR_REMINDER_INVALID_PARAM);
1165         return nullptr;
1166     }
1167 
1168     // argv[0]: reminder id
1169     int32_t reminderId = -1;
1170     if (!ReminderCommon::GetInt32(env, argv[0], nullptr, reminderId, true)) {
1171         ANSR_LOGE("Parse reminder id failed.");
1172         ReminderCommon::HandleErrCode(env, ERR_REMINDER_INVALID_PARAM);
1173         return nullptr;
1174     }
1175     if (reminderId < 0) {
1176         ANSR_LOGE("Param reminder id is illegal.");
1177         ReminderCommon::HandleErrCode(env, ERR_REMINDER_INVALID_PARAM);
1178         return nullptr;
1179     }
1180     params.reminderId = reminderId;
1181 
1182     // argv[1]: exclude date
1183     double date = 0.0;
1184     if (!ReminderCommon::GetDate(env, argv[1], nullptr, date)) {
1185         ANSR_LOGE("Parse exclude date failed.");
1186         ReminderCommon::HandleErrCode(env, ERR_REMINDER_INVALID_PARAM);
1187         return nullptr;
1188     }
1189     if (date < 0.0) {
1190         ANSR_LOGE("Param exclude date is illegal.");
1191         ReminderCommon::HandleErrCode(env, ERR_REMINDER_INVALID_PARAM);
1192         return nullptr;
1193     }
1194     params.excludeDate = static_cast<int64_t>(date);
1195     return NotificationNapi::Common::NapiGetNull(env);
1196 }
1197 
AddExcludeDate(napi_env env,napi_callback_info info)1198 napi_value AddExcludeDate(napi_env env, napi_callback_info info)
1199 {
1200     ANSR_LOGD("called");
1201 
1202     AsyncCallbackInfo *asynccallbackinfo = new (std::nothrow) AsyncCallbackInfo(env);
1203     if (!asynccallbackinfo) {
1204         ANSR_LOGE("Low memory.");
1205         return NotificationNapi::Common::NapiGetNull(env);
1206     }
1207     std::unique_ptr<AsyncCallbackInfo> callbackPtr { asynccallbackinfo };
1208 
1209     // param
1210     Parameters params;
1211     if (ParseAddExcludeDateParameter(env, info, params) == nullptr) {
1212         return DealErrorReturn(env, asynccallbackinfo->callback, NotificationNapi::Common::NapiGetNull(env), true);
1213     }
1214 
1215     // promise
1216     napi_value promise = nullptr;
1217     SetAsynccallbackinfo(env, *asynccallbackinfo, promise);
1218     asynccallbackinfo->reminderId = params.reminderId;
1219     asynccallbackinfo->excludeDate = params.excludeDate;
1220     asynccallbackinfo->isThrow = true;
1221 
1222     // resource name
1223     napi_value resourceName = nullptr;
1224     napi_create_string_latin1(env, "addExcludeDate", NAPI_AUTO_LENGTH, &resourceName);
1225 
1226     bool isCallback = asynccallbackinfo->info.isCallback;
1227 
1228     // create and queue async work
1229     napi_create_async_work(env,
1230         nullptr,
1231         resourceName,
1232         [](napi_env env, void *data) {
1233             ANSR_LOGI("AddExcludeDate napi_create_async_work start");
1234             auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfo *>(data);
1235             if (asynccallbackinfo) {
1236                 asynccallbackinfo->info.errorCode = ReminderHelper::AddExcludeDate(asynccallbackinfo->reminderId,
1237                     asynccallbackinfo->excludeDate);
1238             }
1239         },
1240         [](napi_env env, napi_status status, void *data) {
1241             ANSR_LOGI("AddExcludeDate napi_create_async_work complete start");
1242             auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfo *>(data);
1243             std::unique_ptr<AsyncCallbackInfo> callbackPtr { asynccallbackinfo };
1244 
1245             ReminderCommon::ReturnCallbackPromise(
1246                 env, asynccallbackinfo->info, NotificationNapi::Common::NapiGetNull(env), asynccallbackinfo->isThrow);
1247             ANSR_LOGI("AddExcludeDate napi_create_async_work complete end");
1248         },
1249         (void *)asynccallbackinfo,
1250         &asynccallbackinfo->asyncWork);
1251     NAPI_CALL(env, napi_queue_async_work(env, asynccallbackinfo->asyncWork));
1252     callbackPtr.release();
1253 
1254     return isCallback ? NotificationNapi::Common::NapiGetNull(env) : promise;
1255 }
1256 
ParseReminderIdParameter(const napi_env & env,const napi_callback_info & info,Parameters & params)1257 napi_value ParseReminderIdParameter(const napi_env &env, const napi_callback_info &info, Parameters &params)
1258 {
1259     ANSR_LOGD("called");
1260     size_t argc = DEL_EXCLUDE_DATE_PARAM_LEN;
1261     napi_value argv[DEL_EXCLUDE_DATE_PARAM_LEN] = {nullptr};
1262     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr));
1263     if (argc < DEL_EXCLUDE_DATE_PARAM_LEN) {
1264         ANSR_LOGE("Wrong number of arguments");
1265         ReminderCommon::HandleErrCode(env, ERR_REMINDER_INVALID_PARAM);
1266         return nullptr;
1267     }
1268 
1269     // argv[0]: reminder id
1270     int32_t reminderId = -1;
1271     if (!ReminderCommon::GetInt32(env, argv[0], nullptr, reminderId, true)) {
1272         ANSR_LOGE("Parse reminder id failed.");
1273         ReminderCommon::HandleErrCode(env, ERR_REMINDER_INVALID_PARAM);
1274         return nullptr;
1275     }
1276     if (reminderId < 0) {
1277         ANSR_LOGE("Param reminder id is illegal.");
1278         ReminderCommon::HandleErrCode(env, ERR_REMINDER_INVALID_PARAM);
1279         return nullptr;
1280     }
1281     params.reminderId = reminderId;
1282     return NotificationNapi::Common::NapiGetNull(env);
1283 }
1284 
DelExcludeDates(napi_env env,napi_callback_info info)1285 napi_value DelExcludeDates(napi_env env, napi_callback_info info)
1286 {
1287     ANSR_LOGD("called");
1288 
1289     AsyncCallbackInfo *asynccallbackinfo = new (std::nothrow) AsyncCallbackInfo(env);
1290     if (!asynccallbackinfo) {
1291         ANSR_LOGE("Low memory.");
1292         return NotificationNapi::Common::NapiGetNull(env);
1293     }
1294     std::unique_ptr<AsyncCallbackInfo> callbackPtr { asynccallbackinfo };
1295 
1296     // param
1297     Parameters params;
1298     if (ParseReminderIdParameter(env, info, params) == nullptr) {
1299         return DealErrorReturn(env, asynccallbackinfo->callback, NotificationNapi::Common::NapiGetNull(env), true);
1300     }
1301 
1302     // promise
1303     napi_value promise = nullptr;
1304     SetAsynccallbackinfo(env, *asynccallbackinfo, promise);
1305     asynccallbackinfo->reminderId = params.reminderId;
1306     asynccallbackinfo->isThrow = true;
1307 
1308     // resource name
1309     napi_value resourceName = nullptr;
1310     napi_create_string_latin1(env, "deleteExcludeDates", NAPI_AUTO_LENGTH, &resourceName);
1311 
1312     bool isCallback = asynccallbackinfo->info.isCallback;
1313 
1314     // create and queue async work
1315     napi_create_async_work(env,
1316         nullptr,
1317         resourceName,
1318         [](napi_env env, void *data) {
1319             ANSR_LOGI("DelExcludeDates napi_create_async_work start");
1320             auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfo *>(data);
1321             if (asynccallbackinfo) {
1322                 asynccallbackinfo->info.errorCode = ReminderHelper::DelExcludeDates(asynccallbackinfo->reminderId);
1323             }
1324         },
1325         [](napi_env env, napi_status status, void *data) {
1326             ANSR_LOGI("DelExcludeDates napi_create_async_work complete start");
1327             auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfo *>(data);
1328             std::unique_ptr<AsyncCallbackInfo> callbackPtr { asynccallbackinfo };
1329 
1330             ReminderCommon::ReturnCallbackPromise(
1331                 env, asynccallbackinfo->info, NotificationNapi::Common::NapiGetNull(env), asynccallbackinfo->isThrow);
1332             ANSR_LOGI("DelExcludeDates napi_create_async_work complete end");
1333         },
1334         (void *)asynccallbackinfo,
1335         &asynccallbackinfo->asyncWork);
1336     NAPI_CALL(env, napi_queue_async_work(env, asynccallbackinfo->asyncWork));
1337     callbackPtr.release();
1338 
1339     return isCallback ? NotificationNapi::Common::NapiGetNull(env) : promise;
1340 }
1341 
GetExcludeDatesInner(napi_env env,const std::vector<int64_t> & dates,napi_value & arr)1342 void GetExcludeDatesInner(napi_env env, const std::vector<int64_t>& dates, napi_value& arr)
1343 {
1344     int32_t count = 0;
1345     napi_create_array(env, &arr);
1346     for (auto date : dates) {
1347         napi_value result = nullptr;
1348         napi_create_date(env, static_cast<double>(date), &result);
1349         napi_set_element(env, arr, count, result);
1350         count++;
1351     }
1352     ANSR_LOGI("count = %{public}d", count);
1353 }
1354 
GetExcludeDates(napi_env env,napi_callback_info info)1355 napi_value GetExcludeDates(napi_env env, napi_callback_info info)
1356 {
1357     AsyncCallbackInfo *asynccallbackinfo = new (std::nothrow) AsyncCallbackInfo(env);
1358     if (!asynccallbackinfo) {
1359         ANSR_LOGE("Low memory.");
1360         return NotificationNapi::Common::NapiGetNull(env);
1361     }
1362     std::unique_ptr<AsyncCallbackInfo> callbackPtr { asynccallbackinfo };
1363 
1364     // param
1365     Parameters params;
1366     if (ParseReminderIdParameter(env, info, params) == nullptr) {
1367         return DealErrorReturn(env, asynccallbackinfo->callback, NotificationNapi::Common::NapiGetNull(env), true);
1368     }
1369 
1370     // promise
1371     napi_value promise = nullptr;
1372     SetAsynccallbackinfo(env, *asynccallbackinfo, promise);
1373     asynccallbackinfo->reminderId = params.reminderId;
1374     asynccallbackinfo->isThrow = true;
1375 
1376     // resource name
1377     napi_value resourceName = nullptr;
1378     napi_create_string_latin1(env, "getExcludeDates", NAPI_AUTO_LENGTH, &resourceName);
1379 
1380     bool isCallback = asynccallbackinfo->info.isCallback;
1381 
1382     // create and queue async work
1383     napi_create_async_work(env, nullptr, resourceName,
1384         [](napi_env env, void *data) {
1385             ANSR_LOGI("GetExcludeDates napi_create_async_work start");
1386             auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfo *>(data);
1387             if (asynccallbackinfo) {
1388                 asynccallbackinfo->info.errorCode = ReminderHelper::GetExcludeDates(asynccallbackinfo->reminderId,
1389                     asynccallbackinfo->excludeDates);
1390             }
1391         },
1392         [](napi_env env, napi_status status, void *data) {
1393             ANSR_LOGI("GetExcludeDates napi_create_async_work complete start");
1394             auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfo *>(data);
1395             std::unique_ptr<AsyncCallbackInfo> callbackPtr { asynccallbackinfo };
1396 
1397             if (asynccallbackinfo) {
1398                 if (asynccallbackinfo->info.errorCode != ERR_OK) {
1399                     asynccallbackinfo->result = NotificationNapi::Common::NapiGetNull(env);
1400                 } else {
1401                     GetExcludeDatesInner(env, asynccallbackinfo->excludeDates, asynccallbackinfo->result);
1402                 }
1403 
1404                 ReminderCommon::ReturnCallbackPromise(
1405                     env, asynccallbackinfo->info, asynccallbackinfo->result, asynccallbackinfo->isThrow);
1406             }
1407             ANSR_LOGI("GetExcludeDates napi_create_async_work complete end");
1408         },
1409         (void *)asynccallbackinfo, &asynccallbackinfo->asyncWork);
1410     NAPI_CALL(env, napi_queue_async_work(env, asynccallbackinfo->asyncWork));
1411     callbackPtr.release();
1412 
1413     return isCallback ? NotificationNapi::Common::NapiGetNull(env) : promise;
1414 }
1415 
ParseUpdateReminderParameter(const napi_env & env,const napi_callback_info & info,Parameters & params)1416 napi_value ParseUpdateReminderParameter(const napi_env &env, const napi_callback_info &info, Parameters &params)
1417 {
1418     ANSR_LOGD("called");
1419     size_t argc = UPDATE_REMINDER_PARAM_LEN;
1420     napi_value argv[UPDATE_REMINDER_PARAM_LEN] = {nullptr};
1421     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr));
1422     if (argc < UPDATE_REMINDER_PARAM_LEN) {
1423         ANSR_LOGE("Wrong number of arguments");
1424         ReminderCommon::HandleErrCode(env, ERR_REMINDER_PARAM_ERROR);
1425         return nullptr;
1426     }
1427 
1428     // argv[0]: reminder id
1429     int32_t reminderId = -1;
1430     if (!ReminderCommon::GetInt32(env, argv[0], nullptr, reminderId, true)) {
1431         ANSR_LOGE("Parse reminder id failed.");
1432         ReminderCommon::HandleErrCode(env, ERR_REMINDER_PARAM_ERROR);
1433         return nullptr;
1434     }
1435     if (reminderId < 0) {
1436         ANSR_LOGE("Param reminder id is illegal.");
1437         ReminderCommon::HandleErrCode(env, ERR_REMINDER_PARAM_ERROR);
1438         return nullptr;
1439     }
1440     if (ReminderCommon::GetReminderRequest(env, argv[1], params.reminder) == nullptr) {
1441         ANSR_LOGE("UpdateReminder returns nullptr");
1442         ReminderCommon::HandleErrCode(env, ERR_REMINDER_PARAM_ERROR);
1443         return nullptr;
1444     }
1445     params.reminderId = reminderId;
1446     return NotificationNapi::Common::NapiGetNull(env);
1447 }
1448 
UpdateReminder(napi_env env,napi_callback_info info)1449 napi_value UpdateReminder(napi_env env, napi_callback_info info)
1450 {
1451     ANSR_LOGD("called");
1452     AsyncCallbackInfo *asynccallbackinfo = new (std::nothrow) AsyncCallbackInfo(env);
1453     if (!asynccallbackinfo) {
1454         ANSR_LOGE("Low memory.");
1455         return NotificationNapi::Common::NapiGetNull(env);
1456     }
1457     std::unique_ptr<AsyncCallbackInfo> callbackPtr { asynccallbackinfo };
1458 
1459     // param
1460     Parameters params;
1461     if (ParseUpdateReminderParameter(env, info, params) == nullptr) {
1462         return DealErrorReturn(env, asynccallbackinfo->callback, NotificationNapi::Common::NapiGetNull(env), true);
1463     }
1464 
1465     // promise
1466     napi_value promise = nullptr;
1467     SetAsynccallbackinfo(env, *asynccallbackinfo, promise);
1468     asynccallbackinfo->reminderId = params.reminderId;
1469     asynccallbackinfo->reminder = params.reminder;
1470     asynccallbackinfo->isThrow = true;
1471 
1472     // resource name
1473     napi_value resourceName = nullptr;
1474     napi_create_string_latin1(env, "updateReminder", NAPI_AUTO_LENGTH, &resourceName);
1475 
1476     bool isCallback = asynccallbackinfo->info.isCallback;
1477     // create and queue async work
1478     napi_create_async_work(env,
1479         nullptr,
1480         resourceName,
1481         [](napi_env env, void *data) {
1482             ANSR_LOGI("UpdateReminder napi_create_async_work start");
1483             auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfo *>(data);
1484             if (asynccallbackinfo) {
1485                 asynccallbackinfo->info.errorCode = ReminderHelper::UpdateReminder(asynccallbackinfo->reminderId,
1486                     *(asynccallbackinfo->reminder));
1487             }
1488         },
1489         [](napi_env env, napi_status status, void *data) {
1490             ANSR_LOGI("UpdateReminder napi_create_async_work complete start");
1491             auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfo *>(data);
1492             std::unique_ptr<AsyncCallbackInfo> callbackPtr { asynccallbackinfo };
1493 
1494             ReminderCommon::ReturnCallbackPromise(
1495                 env, asynccallbackinfo->info, NotificationNapi::Common::NapiGetNull(env), asynccallbackinfo->isThrow);
1496             ANSR_LOGI("UpdateReminder napi_create_async_work complete end");
1497         },
1498         (void *)asynccallbackinfo,
1499         &asynccallbackinfo->asyncWork);
1500     NAPI_CALL(env, napi_queue_async_work(env, asynccallbackinfo->asyncWork));
1501     callbackPtr.release();
1502 
1503     return isCallback ? NotificationNapi::Common::NapiGetNull(env) : promise;
1504 }
1505 }
1506 }
1507