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