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