• 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 "reminder_request_alarm.h"
21 #include "reminder_request_calendar.h"
22 #include "reminder_request_timer.h"
23 
24 namespace OHOS {
25 namespace ReminderAgentNapi {
26 static const int32_t PUBLISH_PARAM_LEN = 2;
27 static const int32_t CANCEL_PARAM_LEN = 2;
28 static const int32_t CANCEL_ALL_PARAM_LEN = 1;
29 static const int32_t GET_VALID_PARAM_LEN = 1;
30 static const int32_t ADD_SLOT_PARAM_LEN = 2;
31 
32 struct AsyncCallbackInfo {
AsyncCallbackInfoOHOS::ReminderAgentNapi::AsyncCallbackInfo33     explicit AsyncCallbackInfo(napi_env napiEnv) : env(napiEnv) {}
~AsyncCallbackInfoOHOS::ReminderAgentNapi::AsyncCallbackInfo34     ~AsyncCallbackInfo()
35     {
36         if (asyncWork) {
37             napi_delete_async_work(env, asyncWork);
38             asyncWork = nullptr;
39         }
40         if (callback) {
41             napi_delete_reference(env, callback);
42             callback = nullptr;
43         }
44     }
45 
46     napi_env env = nullptr;
47     napi_async_work asyncWork = nullptr;
48     napi_ref callback = nullptr;
49     napi_value result = nullptr;
50     int32_t reminderId = -1;
51     bool isThrow = false;
52     NotificationNapi::NotificationConstant::SlotType inType
53         = NotificationNapi::NotificationConstant::SlotType::CONTENT_INFORMATION;
54     std::shared_ptr<ReminderRequest> reminder = nullptr;
55     std::vector<sptr<ReminderRequest>> validReminders;
56     CallbackPromiseInfo info;
57 };
58 
59 struct Parameters {
60     int32_t reminderId = -1;
61     int32_t errCode = ERR_OK;
62     NotificationNapi::NotificationConstant::SlotType inType
63         = NotificationNapi::NotificationConstant::SlotType::CONTENT_INFORMATION;
64     std::shared_ptr<ReminderRequest> reminder = nullptr;
65 };
66 
GetCallback(const napi_env & env,const napi_value & value,AsyncCallbackInfo & asyncCallbackInfo)67 napi_value GetCallback(const napi_env &env, const napi_value &value, AsyncCallbackInfo &asyncCallbackInfo)
68 {
69     napi_valuetype valuetype = napi_undefined;
70     NAPI_CALL(env, napi_typeof(env, value, &valuetype));
71     if (valuetype != napi_function) {
72         ANSR_LOGW("Wrong argument type. Function expected.");
73         return nullptr;
74     }
75     napi_create_reference(env, value, 1, &asyncCallbackInfo.callback);
76     return NotificationNapi::Common::NapiGetNull(env);
77 }
78 
SetAsynccallbackinfo(const napi_env & env,AsyncCallbackInfo & asynccallbackinfo,napi_value & promise)79 void SetAsynccallbackinfo(const napi_env &env, AsyncCallbackInfo& asynccallbackinfo, napi_value& promise)
80 {
81     ReminderCommon::PaddingCallbackPromiseInfo(
82         env, asynccallbackinfo.callback, asynccallbackinfo.info, promise);
83 }
84 
ParseParameters(const napi_env & env,const napi_callback_info & info,Parameters & params,AsyncCallbackInfo & asyncCallbackInfo,bool isThrow)85 napi_value ParseParameters(const napi_env &env, const napi_callback_info &info, Parameters &params,
86     AsyncCallbackInfo &asyncCallbackInfo, bool isThrow)
87 {
88     size_t argc = PUBLISH_PARAM_LEN;
89     napi_value argv[PUBLISH_PARAM_LEN] = {nullptr};
90     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr));
91     if (argc < 1) {
92         ANSR_LOGW("Wrong number of arguments");
93         if (isThrow) {
94             ReminderCommon::HandleErrCode(env, ERR_REMINDER_INVALID_PARAM);
95         }
96         return nullptr;
97     }
98 
99     // argv[1]: callback
100     if (argc >= PUBLISH_PARAM_LEN) {
101         if (GetCallback(env, argv[1], asyncCallbackInfo) == nullptr) {
102             ANSR_LOGW("[reminderAgent]GetCallbak returns nullptr");
103             if (isThrow) {
104                 ReminderCommon::HandleErrCode(env, ERR_REMINDER_INVALID_PARAM);
105             }
106             return nullptr;
107         }
108     }
109 
110     // argv[0] : reminderRequest
111     if (ReminderCommon::GetReminderRequest(env, argv[0], params.reminder) == nullptr) {
112         ANSR_LOGW("[reminderAgent]CreateReminder returns nullptr");
113         if (isThrow) {
114             ReminderCommon::HandleErrCode(env, ERR_REMINDER_INVALID_PARAM);
115         }
116         return nullptr;
117     }
118 
119     return NotificationNapi::Common::NapiGetNull(env);
120 }
121 
ParseSlotParameters(const napi_env & env,const napi_callback_info & info,Parameters & params,AsyncCallbackInfo & asyncCallbackInfo,bool isThrow)122 napi_value ParseSlotParameters(const napi_env &env, const napi_callback_info &info, Parameters &params,
123     AsyncCallbackInfo &asyncCallbackInfo, bool isThrow)
124 {
125     size_t argc = ADD_SLOT_PARAM_LEN;
126     napi_value argv[ADD_SLOT_PARAM_LEN] = {nullptr};
127     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr));
128     if (argc < 1) {
129         ANSR_LOGW("Wrong number of arguments");
130         if (isThrow) {
131             ReminderCommon::HandleErrCode(env, ERR_REMINDER_INVALID_PARAM);
132         }
133         return nullptr;
134     }
135 
136     // argv[1]: callback
137     if (argc >= ADD_SLOT_PARAM_LEN) {
138         if (GetCallback(env, argv[1], asyncCallbackInfo) == nullptr) {
139             ANSR_LOGW("GetCallbak returns nullptr");
140             if (isThrow) {
141                 ReminderCommon::HandleErrCode(env, ERR_REMINDER_INVALID_PARAM);
142             }
143             return nullptr;
144         }
145     }
146 
147     // argv[0] : notificationSlot
148     // slotType
149     const char* propertyKey = "type";
150     int32_t propertyVal = 0;
151     if (!ReminderCommon::GetInt32(env, argv[0], propertyKey, propertyVal, false)) {
152         ANSR_LOGW("Failed to get valid slot type.");
153         params.errCode = ERR_REMINDER_INVALID_PARAM;
154         if (isThrow) {
155             ReminderCommon::HandleErrCode(env, ERR_REMINDER_INVALID_PARAM);
156         }
157         return nullptr;
158     }
159 
160     if (!NotificationNapi::Common::SlotTypeJSToC(NotificationNapi::SlotType(propertyVal), params.inType)) {
161         ANSR_LOGW("Failed to get valid slot type");
162         if (isThrow) {
163             ReminderCommon::HandleErrCode(env, ERR_REMINDER_INVALID_PARAM);
164         }
165         return nullptr;
166     }
167     return NotificationNapi::Common::NapiGetNull(env);
168 }
169 
ParseCanCelParameter(const napi_env & env,const napi_callback_info & info,Parameters & params,AsyncCallbackInfo & asyncCallbackInfo,bool isThrow)170 napi_value ParseCanCelParameter(const napi_env &env, const napi_callback_info &info, Parameters &params,
171     AsyncCallbackInfo &asyncCallbackInfo, bool isThrow)
172 {
173     ANSR_LOGI("ParseCanCelParameter");
174     size_t argc = CANCEL_PARAM_LEN;
175     napi_value argv[CANCEL_PARAM_LEN] = {nullptr};
176     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr));
177     if (argc < 1) {
178         ANSR_LOGW("Wrong number of arguments");
179         if (isThrow) {
180             ReminderCommon::HandleErrCode(env, ERR_REMINDER_INVALID_PARAM);
181         }
182         return nullptr;
183     }
184 
185     // argv[1]: callback
186     if (argc >= CANCEL_PARAM_LEN) {
187         if (GetCallback(env, argv[1], asyncCallbackInfo) == nullptr) {
188             ANSR_LOGW("GetCallbak is nullptr");
189             if (isThrow) {
190                 ReminderCommon::HandleErrCode(env, ERR_REMINDER_INVALID_PARAM);
191             }
192             return nullptr;
193         }
194     }
195 
196     // argv[0]: reminder id
197     int32_t reminderId = -1;
198     if (!ReminderCommon::GetInt32(env, argv[0], nullptr, reminderId, true)) {
199         if (isThrow) {
200             ReminderCommon::HandleErrCode(env, ERR_REMINDER_INVALID_PARAM);
201         }
202         return nullptr;
203     }
204     if (reminderId < 0) {
205         ANSR_LOGW("Param id of cancels Reminder is illegal.");
206         if (isThrow) {
207             ReminderCommon::HandleErrCode(env, ERR_REMINDER_INVALID_PARAM);
208         }
209         return nullptr;
210     }
211     params.reminderId = reminderId;
212 
213     return NotificationNapi::Common::NapiGetNull(env);
214 }
215 
ParseCanCelAllParameter(const napi_env & env,const napi_callback_info & info,Parameters & params,AsyncCallbackInfo & asyncCallbackInfo,bool isThrow)216 napi_value ParseCanCelAllParameter(const napi_env &env, const napi_callback_info &info, Parameters &params,
217     AsyncCallbackInfo &asyncCallbackInfo, bool isThrow)
218 {
219     ANSR_LOGI("ParseCanCelAllParameter");
220     size_t argc = CANCEL_ALL_PARAM_LEN;
221     napi_value argv[CANCEL_ALL_PARAM_LEN] = {nullptr};
222     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr));
223 
224     // argv[0]: callback
225     if (argc >= CANCEL_ALL_PARAM_LEN) {
226         if (GetCallback(env, argv[0], asyncCallbackInfo) == nullptr) {
227             ANSR_LOGW("getCallbak is nullptr");
228             if (isThrow) {
229                 ReminderCommon::HandleErrCode(env, ERR_REMINDER_INVALID_PARAM);
230             }
231             return nullptr;
232         }
233     }
234     return NotificationNapi::Common::NapiGetNull(env);
235 }
236 
ParseGetValidParameter(const napi_env & env,const napi_callback_info & info,Parameters & params,AsyncCallbackInfo & asyncCallbackInfo,bool isThrow)237 napi_value ParseGetValidParameter(const napi_env &env, const napi_callback_info &info, Parameters &params,
238     AsyncCallbackInfo &asyncCallbackInfo, bool isThrow)
239 {
240     size_t argc = GET_VALID_PARAM_LEN;
241     napi_value argv[GET_VALID_PARAM_LEN] = {nullptr};
242     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr));
243 
244     // argv[0]: callback
245     if (argc >= GET_VALID_PARAM_LEN) {
246         if (GetCallback(env, argv[0], asyncCallbackInfo) == nullptr) {
247             ANSR_LOGW("getCallbak is nullptr");
248             if (isThrow) {
249                 ReminderCommon::HandleErrCode(env, ERR_REMINDER_INVALID_PARAM);
250             }
251             return nullptr;
252         }
253     }
254     return NotificationNapi::Common::NapiGetNull(env);
255 }
256 
DealErrorReturn(const napi_env & env,const napi_ref & callbackIn,const napi_value & result,bool isThrow)257 napi_value DealErrorReturn(const napi_env &env, const napi_ref &callbackIn, const napi_value &result, bool isThrow)
258 {
259     if (isThrow) {
260         return nullptr;
261     }
262     if (callbackIn) {
263         NotificationNapi::Common::SetCallback(env, callbackIn, ERR_REMINDER_INVALID_PARAM,
264             result, false);
265     }
266     return NotificationNapi::Common::JSParaError(env, callbackIn);
267 }
268 
CancelReminderInner(napi_env env,napi_callback_info info,bool isThrow)269 napi_value CancelReminderInner(napi_env env, napi_callback_info info, bool isThrow)
270 {
271     ANSR_LOGI("Cancel reminder");
272 
273     AsyncCallbackInfo *asynccallbackinfo = new (std::nothrow) AsyncCallbackInfo(env);
274     if (!asynccallbackinfo) {
275         ANSR_LOGE("Low memory.");
276         return NotificationNapi::Common::NapiGetNull(env);
277     }
278     std::unique_ptr<AsyncCallbackInfo> callbackPtr { asynccallbackinfo };
279 
280     // param
281     Parameters params;
282     if (ParseCanCelParameter(env, info, params, *asynccallbackinfo, isThrow) == nullptr) {
283         return DealErrorReturn(env, asynccallbackinfo->callback, NotificationNapi::Common::NapiGetNull(env), isThrow);
284     }
285 
286     // promise
287     napi_value promise = nullptr;
288     SetAsynccallbackinfo(env, *asynccallbackinfo, promise);
289     asynccallbackinfo->reminderId = params.reminderId;
290     asynccallbackinfo->isThrow = isThrow;
291 
292     // resource name
293     napi_value resourceName = nullptr;
294     napi_create_string_latin1(env, "cancelReminder", NAPI_AUTO_LENGTH, &resourceName);
295 
296     // create and queue async work
297     napi_create_async_work(env,
298         nullptr,
299         resourceName,
300         [](napi_env env, void *data) {
301             ANSR_LOGI("Cancel napi_create_async_work start");
302             auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfo *>(data);
303             if (asynccallbackinfo) {
304                 asynccallbackinfo->info.errorCode = ReminderHelper::CancelReminder(asynccallbackinfo->reminderId);
305             }
306         },
307         [](napi_env env, napi_status status, void *data) {
308             ANSR_LOGI("Cancel napi_create_async_work complete start");
309             auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfo *>(data);
310             std::unique_ptr<AsyncCallbackInfo> callbackPtr { asynccallbackinfo };
311 
312             ReminderCommon::ReturnCallbackPromise(
313                 env, asynccallbackinfo->info, NotificationNapi::Common::NapiGetNull(env), asynccallbackinfo->isThrow);
314             ANSR_LOGI("Cancel napi_create_async_work complete end");
315         },
316         (void *)asynccallbackinfo,
317         &asynccallbackinfo->asyncWork);
318     NAPI_CALL(env, napi_queue_async_work(env, asynccallbackinfo->asyncWork));
319     callbackPtr.release();
320 
321     if (asynccallbackinfo->info.isCallback) {
322         return NotificationNapi::Common::NapiGetNull(env);
323     } else {
324         return promise;
325     }
326 }
327 
CancelReminderMgr(napi_env env,napi_callback_info info)328 napi_value CancelReminderMgr(napi_env env, napi_callback_info info)
329 {
330     return CancelReminderInner(env, info, true);
331 }
332 
CancelReminder(napi_env env,napi_callback_info info)333 napi_value CancelReminder(napi_env env, napi_callback_info info)
334 {
335     return CancelReminderInner(env, info, false);
336 }
337 
CancelAllRemindersInner(napi_env env,napi_callback_info info,bool isThrow)338 napi_value CancelAllRemindersInner(napi_env env, napi_callback_info info, bool isThrow)
339 {
340     ANSR_LOGI("Cancel all reminder");
341 
342     AsyncCallbackInfo *asynccallbackinfo = new (std::nothrow) AsyncCallbackInfo(env);
343     if (!asynccallbackinfo) {
344         ANSR_LOGE("Low memory.");
345         return NotificationNapi::Common::NapiGetNull(env);
346     }
347     std::unique_ptr<AsyncCallbackInfo> callbackPtr { asynccallbackinfo };
348 
349     // param
350     Parameters params;
351     if (ParseCanCelAllParameter(env, info, params, *asynccallbackinfo, isThrow) == nullptr) {
352         return DealErrorReturn(env, asynccallbackinfo->callback, NotificationNapi::Common::NapiGetNull(env), isThrow);
353     }
354 
355     // promise
356     napi_value promise = nullptr;
357     SetAsynccallbackinfo(env, *asynccallbackinfo, promise);
358     asynccallbackinfo->isThrow = isThrow;
359 
360     // resource name
361     napi_value resourceName = nullptr;
362     napi_create_string_latin1(env, "cancelAllReminders", NAPI_AUTO_LENGTH, &resourceName);
363 
364     // create and queue async work
365     napi_create_async_work(env,
366         nullptr,
367         resourceName,
368         [](napi_env env, void *data) {
369             ANSR_LOGI("CancelAll napi_create_async_work start");
370             auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfo *>(data);
371             if (asynccallbackinfo) {
372                 asynccallbackinfo->info.errorCode = ReminderHelper::CancelAllReminders();
373             }
374         },
375         [](napi_env env, napi_status status, void *data) {
376             ANSR_LOGD("CancelAll napi_create_async_work complete start");
377             auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfo *>(data);
378             std::unique_ptr<AsyncCallbackInfo> callbackPtr { asynccallbackinfo };
379 
380             ReminderCommon::ReturnCallbackPromise(
381                 env, asynccallbackinfo->info, NotificationNapi::Common::NapiGetNull(env), asynccallbackinfo->isThrow);
382             ANSR_LOGD("CancelAll napi_create_async_work complete end");
383         },
384         (void *)asynccallbackinfo,
385         &asynccallbackinfo->asyncWork);
386     NAPI_CALL(env, napi_queue_async_work(env, asynccallbackinfo->asyncWork));
387     callbackPtr.release();
388 
389     if (asynccallbackinfo->info.isCallback) {
390         return NotificationNapi::Common::NapiGetNull(env);
391     } else {
392         return promise;
393     }
394 }
395 
CancelAllRemindersMgr(napi_env env,napi_callback_info info)396 napi_value CancelAllRemindersMgr(napi_env env, napi_callback_info info)
397 {
398     return CancelAllRemindersInner(env, info, true);
399 }
400 
CancelAllReminders(napi_env env,napi_callback_info info)401 napi_value CancelAllReminders(napi_env env, napi_callback_info info)
402 {
403     return CancelAllRemindersInner(env, info, false);
404 }
405 
ParseReminderTimer(const napi_env & env,const ReminderRequest & reminder,napi_value & result)406 void ParseReminderTimer(const napi_env &env, const ReminderRequest &reminder, napi_value &result)
407 {
408     napi_value value = nullptr;
409     ReminderRequestTimer& timer = (ReminderRequestTimer&)reminder;
410     napi_create_uint32(env, timer.GetInitInfo(), &value);
411     napi_set_named_property(env, result, TIMER_COUNT_DOWN_TIME, value);
412 }
413 
ParseReminderAlarm(const napi_env & env,const ReminderRequest & reminder,napi_value & result)414 void ParseReminderAlarm(const napi_env &env, const ReminderRequest &reminder, napi_value &result)
415 {
416     // hour
417     napi_value value = nullptr;
418     ReminderRequestAlarm& alarm = (ReminderRequestAlarm&)reminder;
419     napi_create_uint32(env, static_cast<uint32_t>(alarm.GetHour()), &value);
420     napi_set_named_property(env, result, ALARM_HOUR, value);
421 
422     // minute
423     napi_create_uint32(env, static_cast<uint32_t>(alarm.GetMinute()), &value);
424     napi_set_named_property(env, result, ALARM_MINUTE, value);
425 
426     // daysOfWeek
427     napi_create_array(env, &value);
428     napi_set_named_property(env, result, ALARM_DAYS_OF_WEEK, value);
429     int32_t count = 0;
430     for (auto day : alarm.GetDaysOfWeek()) {
431         if (day) {
432             napi_value napiDay = nullptr;
433             napi_create_int32(env, day, &napiDay);
434             napi_set_element(env, value, count, napiDay);
435             count++;
436         }
437     }
438 }
439 
ParseReminderCalendar(const napi_env & env,const ReminderRequest & reminder,napi_value & result)440 void ParseReminderCalendar(const napi_env &env, const ReminderRequest &reminder, napi_value &result)
441 {
442     // dateTime
443     napi_value value = nullptr;
444     ReminderRequestCalendar& calendar = (ReminderRequestCalendar&)reminder;
445     napi_value dateTime = nullptr;
446     napi_create_object(env, &dateTime);
447     napi_set_named_property(env, result, CALENDAR_DATE_TIME, dateTime);
448 
449     napi_create_uint32(env, static_cast<uint32_t>(calendar.GetYear()), &value);
450     napi_set_named_property(env, dateTime, CALENDAR_YEAR, value);
451     napi_create_uint32(env, static_cast<uint32_t>(calendar.GetMonth()), &value);
452     napi_set_named_property(env, dateTime, CALENDAR_MONTH, value);
453     napi_create_uint32(env, static_cast<uint32_t>(calendar.GetDay()), &value);
454     napi_set_named_property(env, dateTime, CALENDAR_DAY, value);
455     napi_create_uint32(env, static_cast<uint32_t>(calendar.GetHour()), &value);
456     napi_set_named_property(env, dateTime, CALENDAR_HOUR, value);
457     napi_create_uint32(env, static_cast<uint32_t>(calendar.GetMinute()), &value);
458     napi_set_named_property(env, dateTime, CALENDAR_MINUTE, value);
459     napi_create_uint32(env, static_cast<uint32_t>(calendar.GetSecond()), &value);
460     napi_set_named_property(env, dateTime, CALENDAR_SECOND, value);
461 
462     // repeatMonths
463     napi_create_array(env, &value);
464     napi_set_named_property(env, result, CALENDAR_REPEAT_MONTHS, value);
465     int32_t count = 0;
466     for (auto month : calendar.GetRepeatMonths()) {
467         napi_value napiDay = nullptr;
468         napi_create_int32(env, month, &napiDay);
469         napi_set_element(env, value, count, napiDay);
470         count++;
471     }
472 
473     // repeatDays
474     napi_create_array(env, &value);
475     napi_set_named_property(env, result, CALENDAR_REPEAT_DAYS, value);
476     count = 0;
477     for (auto day : calendar.GetRepeatDays()) {
478         napi_value napiDay = nullptr;
479         napi_create_int32(env, day, &napiDay);
480         napi_set_element(env, value, count, napiDay);
481         count++;
482     }
483 }
484 
ParseReminder(const napi_env & env,const ReminderRequest::ReminderType & type,const ReminderRequest & reminder,napi_value & result)485 void ParseReminder(
486     const napi_env &env, const ReminderRequest::ReminderType &type, const ReminderRequest &reminder, napi_value &result)
487 {
488     switch (type) {
489         case ReminderRequest::ReminderType::TIMER: {
490             ParseReminderTimer(env, reminder, result);
491             break;
492         }
493         case ReminderRequest::ReminderType::ALARM: {
494             ParseReminderAlarm(env, reminder, result);
495             break;
496         }
497         case ReminderRequest::ReminderType::CALENDAR: {
498             ParseReminderCalendar(env, reminder, result);
499             break;
500         }
501         default: {
502             break;
503         }
504     }
505 }
506 
ParseActionButtons(const napi_env & env,ReminderRequest & reminder,napi_value & result)507 void ParseActionButtons(const napi_env &env, ReminderRequest &reminder, napi_value &result)
508 {
509     auto actionButtonsMap = reminder.GetActionButtons();
510 
511     // create array
512     napi_value array = nullptr;
513     napi_create_array(env, &array);
514     napi_set_named_property(env, result, ACTION_BUTTON, array);
515     int32_t index = 0;
516     for (std::map<ReminderRequest::ActionButtonType, ReminderRequest::ActionButtonInfo>::iterator it
517         = actionButtonsMap.begin(); it != actionButtonsMap.end(); ++it) {
518         // create obj
519         napi_value actionButton = nullptr;
520         napi_create_object(env, &actionButton);
521 
522         napi_value buttonInfo = nullptr;
523         napi_create_uint32(env, static_cast<int32_t>(it->second.type), &buttonInfo);
524         napi_set_named_property(env, actionButton, ACTION_BUTTON_TYPE, buttonInfo);
525         napi_create_string_utf8(env, (it->second.title).c_str(), NAPI_AUTO_LENGTH, &buttonInfo);
526         napi_set_named_property(env, actionButton, ACTION_BUTTON_TITLE, buttonInfo);
527 
528         // add obj to array
529         napi_set_element(env, array, index, actionButton);
530         index++;
531     }
532 }
533 
ParseWantAgent(const napi_env & env,ReminderRequest & reminder,napi_value & result)534 void ParseWantAgent(const napi_env &env, ReminderRequest &reminder, napi_value &result)
535 {
536     // create obj
537     napi_value wantAgentInfo = nullptr;
538     napi_create_object(env, &wantAgentInfo);
539     napi_set_named_property(env, result, WANT_AGENT, wantAgentInfo);
540 
541     napi_value info = nullptr;
542     napi_create_string_utf8(env, (reminder.GetWantAgentInfo()->pkgName).c_str(), NAPI_AUTO_LENGTH, &info);
543     napi_set_named_property(env, wantAgentInfo, WANT_AGENT_PKG, info);
544     napi_create_string_utf8(env, (reminder.GetWantAgentInfo()->abilityName).c_str(), NAPI_AUTO_LENGTH, &info);
545     napi_set_named_property(env, wantAgentInfo, WANT_AGENT_ABILITY, info);
546 }
547 
ParseMaxScreenWantAgent(const napi_env & env,ReminderRequest & reminder,napi_value & result)548 void ParseMaxScreenWantAgent(const napi_env &env, ReminderRequest &reminder, napi_value &result)
549 {
550     // create obj
551     napi_value maxScreenWantAgentInfo = nullptr;
552     napi_create_object(env, &maxScreenWantAgentInfo);
553     napi_set_named_property(env, result, MAX_SCREEN_WANT_AGENT, maxScreenWantAgentInfo);
554 
555     napi_value info = nullptr;
556     napi_create_string_utf8(env, (reminder.GetMaxScreenWantAgentInfo()->pkgName).c_str(), NAPI_AUTO_LENGTH, &info);
557     napi_set_named_property(env, maxScreenWantAgentInfo, MAX_SCREEN_WANT_AGENT_PKG, info);
558     napi_create_string_utf8(env, (reminder.GetMaxScreenWantAgentInfo()->abilityName).c_str(), NAPI_AUTO_LENGTH, &info);
559     napi_set_named_property(env, maxScreenWantAgentInfo, MAX_SCREEN_WANT_AGENT_ABILITY, info);
560 }
561 
SetValidReminder(const napi_env & env,ReminderRequest & reminder,napi_value & result)562 napi_value SetValidReminder(const napi_env &env, ReminderRequest &reminder, napi_value &result)
563 {
564     ANSR_LOGI("enter");
565     napi_value value = nullptr;
566 
567     napi_create_string_utf8(env, reminder.Dump().c_str(), NAPI_AUTO_LENGTH, &value);
568     napi_set_named_property(env, result, "reminder", value);
569 
570     // type
571     ReminderRequest::ReminderType type = reminder.GetReminderType();
572     napi_create_int32(env, static_cast<int32_t>(type), &value);
573     napi_set_named_property(env, result, REMINDER_TYPE, value);
574 
575     // reminder
576     ParseReminder(env, type, reminder, result);
577 
578     // title
579     napi_create_string_utf8(env, reminder.GetTitle().c_str(), NAPI_AUTO_LENGTH, &value);
580     napi_set_named_property(env, result, TITLE, value);
581 
582     // content
583     napi_create_string_utf8(env, reminder.GetContent().c_str(), NAPI_AUTO_LENGTH, &value);
584     napi_set_named_property(env, result, CONTENT, value);
585 
586     // expiredContent
587     napi_create_string_utf8(env, reminder.GetExpiredContent().c_str(), NAPI_AUTO_LENGTH, &value);
588     napi_set_named_property(env, result, EXPIRED_CONTENT, value);
589 
590     // snoozeContent
591     napi_create_string_utf8(env, reminder.GetSnoozeContent().c_str(), NAPI_AUTO_LENGTH, &value);
592     napi_set_named_property(env, result, SNOOZE_CONTENT, value);
593 
594     // ringDuration
595     napi_create_int64(env, reminder.GetRingDuration(), &value);
596     napi_set_named_property(env, result, RING_DURATION, value);
597 
598     // timeInterval
599     napi_create_int64(env, reminder.GetTimeInterval(), &value);
600     napi_set_named_property(env, result, TIME_INTERVAL, value);
601 
602     // notificationId
603     napi_create_int32(env, reminder.GetNotificationId(), &value);
604     napi_set_named_property(env, result, NOTIFICATION_ID, value);
605 
606     // snoozeTimes
607     napi_create_int32(env, reminder.GetSnoozeTimes(), &value);
608     napi_set_named_property(env, result, SNOOZE_TIMES, value);
609 
610     // slotType
611     NotificationNapi::SlotType jsSlotType;
612     NotificationNapi::Common::SlotTypeCToJS(reminder.GetSlotType(), jsSlotType);
613     napi_create_int32(env, static_cast<int32_t>(jsSlotType), &value);
614     napi_set_named_property(env, result, SLOT_TYPE, value);
615 
616     // wantAgent
617     ParseWantAgent(env, reminder, result);
618 
619     // maxScreenWantAgent
620     ParseMaxScreenWantAgent(env, reminder, result);
621 
622     // actionButtons
623     ParseActionButtons(env, reminder, result);
624     return NotificationNapi::Common::NapiGetBoolean(env, true);
625 }
626 
GetValidRemindersInner(napi_env env,const std::vector<sptr<ReminderRequest>> & validReminders,napi_value & arr)627 void GetValidRemindersInner(napi_env env, const std::vector<sptr<ReminderRequest>>& validReminders, napi_value& arr)
628 {
629     int32_t count = 0;
630     napi_create_array(env, &arr);
631     for (auto reminder : validReminders) {
632         if (reminder == nullptr) {
633             ANSR_LOGW("reminder is null");
634             continue;
635         }
636         napi_value result = nullptr;
637         napi_create_object(env, &result);
638         if (!SetValidReminder(env, *reminder, result)) {
639             ANSR_LOGW("Set reminder object failed");
640             continue;
641         }
642         napi_set_element(env, arr, count, result);
643         count++;
644     }
645     ANSR_LOGI("GetValid reminders count = %{public}d", count);
646 }
647 
InnerGetValidReminders(napi_env env,napi_callback_info info,bool isThrow)648 napi_value InnerGetValidReminders(napi_env env, napi_callback_info info, bool isThrow)
649 {
650     ANSR_LOGI("Get valid reminders");
651 
652     AsyncCallbackInfo *asynccallbackinfo = new (std::nothrow) AsyncCallbackInfo(env);
653     if (!asynccallbackinfo) {
654         ANSR_LOGE("Low memory.");
655         return NotificationNapi::Common::NapiGetNull(env);
656     }
657     std::unique_ptr<AsyncCallbackInfo> callbackPtr { asynccallbackinfo };
658 
659     // param
660     Parameters params;
661     if (ParseGetValidParameter(env, info, params, *asynccallbackinfo, isThrow) == nullptr) {
662         return DealErrorReturn(env, asynccallbackinfo->callback, NotificationNapi::Common::NapiGetNull(env), isThrow);
663     }
664 
665     // promise
666     napi_value promise = nullptr;
667     SetAsynccallbackinfo(env, *asynccallbackinfo, promise);
668     asynccallbackinfo->isThrow = isThrow;
669 
670     // resource name
671     napi_value resourceName = nullptr;
672     napi_create_string_latin1(env, "getValidReminders", NAPI_AUTO_LENGTH, &resourceName);
673 
674     // create and start async work
675     napi_create_async_work(env,
676         nullptr,
677         resourceName,
678         [](napi_env env, void *data) {
679             ANSR_LOGI("GetValid reminders napi_create_async_work start");
680             AsyncCallbackInfo *asynccallbackinfo = static_cast<AsyncCallbackInfo *>(data);
681             if (asynccallbackinfo) {
682                 asynccallbackinfo->info.errorCode = ReminderHelper::GetValidReminders(
683                     asynccallbackinfo->validReminders);
684             }
685         },
686         [](napi_env env, napi_status status, void *data) {
687             AsyncCallbackInfo *asynccallbackinfo = static_cast<AsyncCallbackInfo *>(data);
688             std::unique_ptr<AsyncCallbackInfo> callbackPtr { asynccallbackinfo };
689 
690             if (asynccallbackinfo) {
691                 if (asynccallbackinfo->info.errorCode != ERR_OK) {
692                     asynccallbackinfo->result = NotificationNapi::Common::NapiGetNull(env);
693                 } else {
694                     GetValidRemindersInner(env, asynccallbackinfo->validReminders, asynccallbackinfo->result);
695                 }
696 
697                 ReminderCommon::ReturnCallbackPromise(
698                     env, asynccallbackinfo->info, asynccallbackinfo->result, asynccallbackinfo->isThrow);
699             }
700         },
701         (void *)asynccallbackinfo,
702         &asynccallbackinfo->asyncWork);
703     NAPI_CALL(env, napi_queue_async_work(env, asynccallbackinfo->asyncWork));
704     callbackPtr.release();
705 
706     if (asynccallbackinfo->info.isCallback) {
707         return NotificationNapi::Common::NapiGetNull(env);
708     } else {
709         return promise;
710     }
711 }
712 
GetValidRemindersMgr(napi_env env,napi_callback_info info)713 napi_value GetValidRemindersMgr(napi_env env, napi_callback_info info)
714 {
715     return InnerGetValidReminders(env, info, true);
716 }
717 
GetValidReminders(napi_env env,napi_callback_info info)718 napi_value GetValidReminders(napi_env env, napi_callback_info info)
719 {
720     return InnerGetValidReminders(env, info, false);
721 }
722 
PublishReminderInner(napi_env env,napi_callback_info info,bool isThrow)723 napi_value PublishReminderInner(napi_env env, napi_callback_info info, bool isThrow)
724 {
725     ANSR_LOGI("PublishReminder");
726 
727     AsyncCallbackInfo *asynccallbackinfo = new (std::nothrow) AsyncCallbackInfo(env);
728     if (!asynccallbackinfo) {
729         ANSR_LOGE("Low memory.");
730         return NotificationNapi::Common::NapiGetNull(env);
731     }
732     std::unique_ptr<AsyncCallbackInfo> callbackPtr { asynccallbackinfo };
733 
734     // param
735     Parameters params;
736     if (ParseParameters(env, info, params, *asynccallbackinfo, isThrow) == nullptr) {
737         napi_create_int32(env, -1, &(asynccallbackinfo->result));
738         return DealErrorReturn(env, asynccallbackinfo->callback, asynccallbackinfo->result, isThrow);
739     }
740 
741     // promise
742     napi_value promise = nullptr;
743     SetAsynccallbackinfo(env, *asynccallbackinfo, promise);
744     asynccallbackinfo->reminder = params.reminder;
745     asynccallbackinfo->isThrow = isThrow;
746 
747     // resource name
748     napi_value resourceName = nullptr;
749     napi_create_string_latin1(env, "publishReminder", NAPI_AUTO_LENGTH, &resourceName);
750 
751     // create and start async work
752     napi_create_async_work(env,
753         nullptr,
754         resourceName,
755         [](napi_env env, void *data) {
756             ANSR_LOGI("Publish napi_create_async_work start");
757             AsyncCallbackInfo *asynccallbackinfo = static_cast<AsyncCallbackInfo *>(data);
758             if (asynccallbackinfo) {
759                 asynccallbackinfo->info.errorCode = ReminderHelper::PublishReminder(*(asynccallbackinfo->reminder));
760                 ANSR_LOGD("Return reminderId=%{public}d", asynccallbackinfo->reminder->GetReminderId());
761             }
762         },
763         [](napi_env env, napi_status status, void *data) {
764             ANSR_LOGI("Publish napi_create_async_work complete start");
765             AsyncCallbackInfo *asynccallbackinfo = static_cast<AsyncCallbackInfo *>(data);
766             std::unique_ptr<AsyncCallbackInfo> callbackPtr { asynccallbackinfo };
767 
768             // reminderId
769             if (asynccallbackinfo) {
770                 if (asynccallbackinfo->info.errorCode == ERR_OK) {
771                     napi_create_int32(env, asynccallbackinfo->reminder->GetReminderId(), &(asynccallbackinfo->result));
772                 } else {
773                     napi_create_int32(env, -1, &(asynccallbackinfo->result));
774                 }
775 
776                 ReminderCommon::ReturnCallbackPromise(
777                     env, asynccallbackinfo->info, asynccallbackinfo->result, asynccallbackinfo->isThrow);
778                 ANSR_LOGI("Publish napi_create_async_work complete end");
779             }
780         },
781         (void *)asynccallbackinfo,
782         &asynccallbackinfo->asyncWork);
783 
784     NAPI_CALL(env, napi_queue_async_work(env, asynccallbackinfo->asyncWork));
785     callbackPtr.release();
786 
787     if (asynccallbackinfo->info.isCallback) {
788         return NotificationNapi::Common::NapiGetNull(env);
789     } else {
790         return promise;
791     }
792 }
793 
PublishReminderMgr(napi_env env,napi_callback_info info)794 napi_value PublishReminderMgr(napi_env env, napi_callback_info info)
795 {
796     return PublishReminderInner(env, info, true);
797 }
798 
PublishReminder(napi_env env,napi_callback_info info)799 napi_value PublishReminder(napi_env env, napi_callback_info info)
800 {
801     return PublishReminderInner(env, info, false);
802 }
803 
AddSlotInner(napi_env env,napi_callback_info info,bool isThrow)804 napi_value AddSlotInner(napi_env env, napi_callback_info info, bool isThrow)
805 {
806     ANSR_LOGI("AddSlot");
807 
808     AsyncCallbackInfo *asynccallbackinfo = new (std::nothrow) AsyncCallbackInfo(env);
809     if (!asynccallbackinfo) {
810         ANSR_LOGE("Low memory.");
811         return NotificationNapi::Common::NapiGetNull(env);
812     }
813     std::unique_ptr<AsyncCallbackInfo> callbackPtr { asynccallbackinfo };
814 
815     // param
816     Parameters params;
817     if (ParseSlotParameters(env, info, params, *asynccallbackinfo, isThrow) == nullptr) {
818         return DealErrorReturn(env, asynccallbackinfo->callback, NotificationNapi::Common::NapiGetNull(env), isThrow);
819     }
820 
821     // promise
822     napi_value promise = nullptr;
823     SetAsynccallbackinfo(env, *asynccallbackinfo, promise);
824     asynccallbackinfo->inType = params.inType;
825     asynccallbackinfo->info.errorCode = params.errCode;
826     asynccallbackinfo->isThrow = isThrow;
827 
828     // resource name
829     napi_value resourceName = nullptr;
830     napi_create_string_latin1(env, "AddSlot", NAPI_AUTO_LENGTH, &resourceName);
831 
832     // create and start async work
833     napi_create_async_work(env,
834         nullptr,
835         resourceName,
836         [](napi_env env, void *data) {
837             ANSR_LOGI("AddSlot napi_create_async_work start");
838             AsyncCallbackInfo *asynccallbackinfo = static_cast<AsyncCallbackInfo *>(data);
839             if (asynccallbackinfo && (asynccallbackinfo->info.errorCode == ERR_OK)) {
840                 asynccallbackinfo->info.errorCode = NotificationHelper::AddSlotByType(asynccallbackinfo->inType);
841             }
842         },
843         [](napi_env env, napi_status status, void *data) {
844             AsyncCallbackInfo *asynccallbackinfo = static_cast<AsyncCallbackInfo *>(data);
845             if (asynccallbackinfo) {
846                 std::unique_ptr<AsyncCallbackInfo> callbackPtr { asynccallbackinfo };
847                 ReminderCommon::ReturnCallbackPromise(env, asynccallbackinfo->info,
848                     NotificationNapi::Common::NapiGetNull(env), asynccallbackinfo->isThrow);
849                 ANSR_LOGD("AddSlot napi_create_async_work complete end.");
850             }
851         },
852         (void *)asynccallbackinfo,
853         &asynccallbackinfo->asyncWork);
854 
855     NAPI_CALL(env, napi_queue_async_work(env, asynccallbackinfo->asyncWork));
856     callbackPtr.release();
857 
858     if (asynccallbackinfo->info.isCallback) {
859         return NotificationNapi::Common::NapiGetNull(env);
860     } else {
861         return promise;
862     }
863 }
864 
AddSlotMgr(napi_env env,napi_callback_info info)865 napi_value AddSlotMgr(napi_env env, napi_callback_info info)
866 {
867     return AddSlotInner(env, info, true);
868 }
869 
AddSlot(napi_env env,napi_callback_info info)870 napi_value AddSlot(napi_env env, napi_callback_info info)
871 {
872     return AddSlotInner(env, info, false);
873 }
874 }
875 }