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 ¶ms,
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 ¶ms,
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 ¶ms,
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 ¶ms,
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 ¶ms,
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 ¶ms)
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 ¶ms)
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 ¶ms)
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