1 /*
2 * Copyright (c) 2021-2023 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 "get_active.h"
17
18 namespace OHOS {
19 namespace NotificationNapi {
AsyncCompleteCallbackGetAllActiveNotifications(napi_env env,napi_status status,void * data)20 void AsyncCompleteCallbackGetAllActiveNotifications(napi_env env, napi_status status, void *data)
21 {
22 ANS_LOGI("GetAllActiveNotifications napi_create_async_work end");
23
24 if (!data) {
25 ANS_LOGE("Invalidity async callback data.");
26 return;
27 }
28
29 auto asynccallbackinfo = static_cast<AsyncCallbackInfoActive *>(data);
30 if (asynccallbackinfo) {
31 ANS_LOGD("Asynccallbackinfo is not nullptr.");
32 napi_value result = nullptr;
33 if (asynccallbackinfo->info.errorCode != ERR_OK) {
34 result = Common::NapiGetNull(env);
35 } else {
36 napi_value arr = nullptr;
37 int32_t count = 0;
38 napi_create_array(env, &arr);
39 for (auto vec : asynccallbackinfo->notifications) {
40 if (!vec) {
41 ANS_LOGW("Invalid Notification object ptr.");
42 continue;
43 }
44 napi_value notificationResult = nullptr;
45 napi_create_object(env, ¬ificationResult);
46 if (!Common::SetNotification(env, vec.GetRefPtr(), notificationResult)) {
47 ANS_LOGW("Set Notification object failed.");
48 continue;
49 }
50 napi_set_element(env, arr, count, notificationResult);
51 count++;
52 }
53 ANS_LOGI("count = %{public}d", count);
54 result = arr;
55 if ((count == 0) && (asynccallbackinfo->notifications.size() > 0)) {
56 asynccallbackinfo->info.errorCode = ERROR;
57 result = Common::NapiGetNull(env);
58 }
59 }
60 Common::ReturnCallbackPromise(env, asynccallbackinfo->info, result);
61 if (asynccallbackinfo->info.callback != nullptr) {
62 ANS_LOGD("Delete getAllActiveNotifications callback reference.");
63 napi_delete_reference(env, asynccallbackinfo->info.callback);
64 }
65 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
66 delete asynccallbackinfo;
67 asynccallbackinfo = nullptr;
68 }
69 }
70
GetAllActiveNotifications(napi_env env,napi_callback_info info)71 napi_value GetAllActiveNotifications(napi_env env, napi_callback_info info)
72 {
73 ANS_LOGD("enter");
74
75 napi_ref callback = nullptr;
76 if (Common::ParseParaOnlyCallback(env, info, callback) == nullptr) {
77 return Common::NapiGetUndefined(env);
78 }
79
80 auto asynccallbackinfo = new (std::nothrow) AsyncCallbackInfoActive {.env = env, .asyncWork = nullptr};
81 if (!asynccallbackinfo) {
82 ANS_LOGD("Create asynccallbackinfo failed.");
83 return Common::JSParaError(env, callback);
84 }
85 napi_value promise = nullptr;
86 Common::PaddingCallbackPromiseInfo(env, callback, asynccallbackinfo->info, promise);
87
88 ANS_LOGD("Create getAllActiveNotifications string.");
89 napi_value resourceName = nullptr;
90 napi_create_string_latin1(env, "getAllActiveNotifications", NAPI_AUTO_LENGTH, &resourceName);
91 // Asynchronous function call
92 napi_create_async_work(
93 env,
94 nullptr,
95 resourceName,
96 [](napi_env env, void *data) {
97 ANS_LOGI("GetAllActiveNotifications work excute.");
98 auto asynccallbackinfo = static_cast<AsyncCallbackInfoActive *>(data);
99 if (asynccallbackinfo) {
100 asynccallbackinfo->info.errorCode =
101 NotificationHelper::GetAllActiveNotifications(asynccallbackinfo->notifications);
102 }
103 },
104 AsyncCompleteCallbackGetAllActiveNotifications,
105 (void *)asynccallbackinfo,
106 &asynccallbackinfo->asyncWork);
107
108 napi_queue_async_work_with_qos(env, asynccallbackinfo->asyncWork, napi_qos_user_initiated);
109
110 if (asynccallbackinfo->info.isCallback) {
111 ANS_LOGD("getAllActiveNotifications callback is nullptr.");
112 return Common::NapiGetNull(env);
113 } else {
114 return promise;
115 }
116 }
117
AsyncCompleteCallbackGetActiveNotifications(napi_env env,napi_status status,void * data)118 void AsyncCompleteCallbackGetActiveNotifications(napi_env env, napi_status status, void *data)
119 {
120 ANS_LOGD("enter");
121
122 if (!data) {
123 ANS_LOGE("Async callback invalidity data.");
124 return;
125 }
126
127 auto asynccallbackinfo = static_cast<AsyncCallbackInfoActive *>(data);
128 if (asynccallbackinfo) {
129 ANS_LOGD("Asynccallbackinfo is not null.");
130 napi_value result = nullptr;
131 if (asynccallbackinfo->info.errorCode != ERR_OK) {
132 result = Common::NapiGetNull(env);
133 } else {
134 napi_value arr = nullptr;
135 int32_t count = 0;
136 napi_create_array(env, &arr);
137 for (auto vec : asynccallbackinfo->requests) {
138 if (!vec) {
139 ANS_LOGW("Invalid NotificationRequest object ptr.");
140 continue;
141 }
142 napi_value requestResult = nullptr;
143 napi_create_object(env, &requestResult);
144 if (!Common::SetNotificationRequest(env, vec.GetRefPtr(), requestResult)) {
145 ANS_LOGW("Set NotificationRequest object failed.");
146 continue;
147 }
148 napi_set_element(env, arr, count, requestResult);
149 count++;
150 }
151 ANS_LOGI("count = %{public}d", count);
152 result = arr;
153 if ((count == 0) && (asynccallbackinfo->requests.size() > 0)) {
154 asynccallbackinfo->info.errorCode = ERROR;
155 result = Common::NapiGetNull(env);
156 }
157 }
158 Common::ReturnCallbackPromise(env, asynccallbackinfo->info, result);
159 if (asynccallbackinfo->info.callback != nullptr) {
160 ANS_LOGD("Delete asyncGetActiveNotifications callback reference.");
161 napi_delete_reference(env, asynccallbackinfo->info.callback);
162 }
163 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
164 delete asynccallbackinfo;
165 asynccallbackinfo = nullptr;
166 }
167 }
168
GetActiveNotifications(napi_env env,napi_callback_info info)169 napi_value GetActiveNotifications(napi_env env, napi_callback_info info)
170 {
171 ANS_LOGD("enter");
172
173 napi_ref callback = nullptr;
174 if (Common::ParseParaOnlyCallback(env, info, callback) == nullptr) {
175 return Common::NapiGetUndefined(env);
176 }
177
178 auto asynccallbackinfo = new (std::nothrow) AsyncCallbackInfoActive {.env = env, .asyncWork = nullptr};
179 if (!asynccallbackinfo) {
180 ANS_LOGD("AsyncCallbackinfo invalid.");
181 return Common::JSParaError(env, callback);
182 }
183 napi_value promise = nullptr;
184 Common::PaddingCallbackPromiseInfo(env, callback, asynccallbackinfo->info, promise);
185
186 ANS_LOGD("Create getActiveNotifications string.");
187 napi_value resourceName = nullptr;
188 napi_create_string_latin1(env, "getActiveNotifications", NAPI_AUTO_LENGTH, &resourceName);
189 // Async function call
190 napi_create_async_work(
191 env,
192 nullptr,
193 resourceName,
194 [](napi_env env, void *data) {
195 ANS_LOGI("GetActiveNotifications work excute.");
196 auto asynccallbackinfo = static_cast<AsyncCallbackInfoActive *>(data);
197 if (asynccallbackinfo) {
198 asynccallbackinfo->info.errorCode =
199 NotificationHelper::GetActiveNotifications(asynccallbackinfo->requests);
200 }
201 },
202 AsyncCompleteCallbackGetActiveNotifications,
203 (void *)asynccallbackinfo,
204 &asynccallbackinfo->asyncWork);
205
206 napi_queue_async_work_with_qos(env, asynccallbackinfo->asyncWork, napi_qos_user_initiated);
207
208 if (asynccallbackinfo->info.isCallback) {
209 ANS_LOGD("getActiveNotifications callback is nullptr.");
210 return Common::NapiGetNull(env);
211 } else {
212 return promise;
213 }
214 }
215
AsyncCompleteCallbackGetActiveNotificationCount(napi_env env,napi_status status,void * data)216 void AsyncCompleteCallbackGetActiveNotificationCount(napi_env env, napi_status status, void *data)
217 {
218 ANS_LOGD("enter");
219
220 if (!data) {
221 ANS_LOGE("Invalidated async callback data.");
222 return;
223 }
224
225 auto asynccallbackinfo = static_cast<AsyncCallbackInfoActive *>(data);
226 if (asynccallbackinfo) {
227 ANS_LOGD("Asynccallbackinfo is not nullptr.");
228 napi_value result = nullptr;
229 if (asynccallbackinfo->info.errorCode != ERR_OK) {
230 result = Common::NapiGetNull(env);
231 } else {
232 napi_create_uint32(env, asynccallbackinfo->num, &result);
233 }
234 Common::ReturnCallbackPromise(env, asynccallbackinfo->info, result);
235 if (asynccallbackinfo->info.callback != nullptr) {
236 ANS_LOGD("Delete getActiveNotifications callback reference.");
237 napi_delete_reference(env, asynccallbackinfo->info.callback);
238 }
239 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
240 delete asynccallbackinfo;
241 asynccallbackinfo = nullptr;
242 }
243 }
244
GetActiveNotificationCount(napi_env env,napi_callback_info info)245 napi_value GetActiveNotificationCount(napi_env env, napi_callback_info info)
246 {
247 ANS_LOGD("enter");
248
249 napi_ref callback = nullptr;
250 if (Common::ParseParaOnlyCallback(env, info, callback) == nullptr) {
251 return Common::NapiGetUndefined(env);
252 }
253
254 auto asynccallbackinfo = new (std::nothrow) AsyncCallbackInfoActive {.env = env, .asyncWork = nullptr};
255 if (!asynccallbackinfo) {
256 ANS_LOGD("AsyncCallbackinfo is nullptr.");
257 return Common::JSParaError(env, callback);
258 }
259 napi_value promise = nullptr;
260 Common::PaddingCallbackPromiseInfo(env, callback, asynccallbackinfo->info, promise);
261
262 ANS_LOGD("Create getActiveNotificationCount string.");
263 napi_value resourceName = nullptr;
264 napi_create_string_latin1(env, "getActiveNotificationCount", NAPI_AUTO_LENGTH, &resourceName);
265 // Async function call
266 napi_create_async_work(
267 env,
268 nullptr,
269 resourceName,
270 [](napi_env env, void *data) {
271 ANS_LOGI("GetActiveNotificationCount work excute.");
272 auto asynccallbackinfo = static_cast<AsyncCallbackInfoActive *>(data);
273 if (asynccallbackinfo) {
274 asynccallbackinfo->info.errorCode =
275 NotificationHelper::GetActiveNotificationNums(asynccallbackinfo->num);
276 ANS_LOGI("Get active notification count. count = %{public}" PRIu64 "", asynccallbackinfo->num);
277 }
278 },
279 AsyncCompleteCallbackGetActiveNotificationCount,
280 (void *)asynccallbackinfo,
281 &asynccallbackinfo->asyncWork);
282
283 napi_queue_async_work_with_qos(env, asynccallbackinfo->asyncWork, napi_qos_user_initiated);
284
285 if (asynccallbackinfo->info.isCallback) {
286 ANS_LOGD("getActiveNotificationCount callback is nullptr.");
287 return Common::NapiGetNull(env);
288 } else {
289 return promise;
290 }
291 }
292 } // namespace NotificationNapi
293 } // namespace OHOS