• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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, &notificationResult);
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