• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-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 "napi_publish.h"
17 
18 #include "ans_inner_errors.h"
19 #include "publish.h"
20 
21 namespace OHOS {
22 namespace NotificationNapi {
23 
NapiPublish(napi_env env,napi_callback_info info)24 napi_value NapiPublish(napi_env env, napi_callback_info info)
25 {
26     ANS_LOGD("enter");
27     ParametersInfoPublish params;
28     if (ParseParameters(env, info, params) == nullptr) {
29         Common::NapiThrow(env, ERROR_PARAM_INVALID);
30         return Common::NapiGetUndefined(env);
31     }
32 
33     napi_value promise = nullptr;
34     auto asynccallbackinfo = new (std::nothrow) AsyncCallbackInfoPublish {.env = env, .asyncWork = nullptr};
35     if (!asynccallbackinfo) {
36         ANS_LOGD("asynccallbackinfo is nullptr.");
37         Common::NapiThrow(env, ERROR_INTERNAL_ERROR);
38         return Common::JSParaError(env, params.callback);
39     }
40     asynccallbackinfo->request = params.request;
41     Common::PaddingCallbackPromiseInfo(env, params.callback, asynccallbackinfo->info, promise);
42 
43     ANS_LOGD("Create NapiPublish string.");
44     napi_value resourceName = nullptr;
45     napi_create_string_latin1(env, "publish", NAPI_AUTO_LENGTH, &resourceName);
46 
47     napi_create_async_work(env,
48         nullptr,
49         resourceName,
50         [](napi_env env, void *data) {
51             ANS_LOGD("NapiPublish work excute.");
52             AsyncCallbackInfoPublish *asynccallbackinfo = static_cast<AsyncCallbackInfoPublish *>(data);
53             if (asynccallbackinfo) {
54                 ANS_LOGD("notificationId : %{public}d, contentType : "
55                         "%{public}d",
56                     asynccallbackinfo->request.GetNotificationId(),
57                     asynccallbackinfo->request.GetContent()->GetContentType());
58 
59                 asynccallbackinfo->info.errorCode =
60                     NotificationHelper::PublishNotification(asynccallbackinfo->request);
61             }
62         },
63         [](napi_env env, napi_status status, void *data) {
64             ANS_LOGD("NapiPublish work complete.");
65             AsyncCallbackInfoPublish *asynccallbackinfo = static_cast<AsyncCallbackInfoPublish *>(data);
66             if (asynccallbackinfo) {
67                 Common::CreateReturnValue(env, asynccallbackinfo->info, Common::NapiGetNull(env));
68                 if (asynccallbackinfo->info.callback != nullptr) {
69                     ANS_LOGD("Delete napiPublish callback reference.");
70                     napi_delete_reference(env, asynccallbackinfo->info.callback);
71                 }
72                 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
73                 delete asynccallbackinfo;
74                 asynccallbackinfo = nullptr;
75             }
76             ANS_LOGD("Publish napi_create_async_work complete end");
77         },
78         (void *)asynccallbackinfo,
79         &asynccallbackinfo->asyncWork);
80 
81     bool isCallback = asynccallbackinfo->info.isCallback;
82     napi_queue_async_work_with_qos(env, asynccallbackinfo->asyncWork, napi_qos_user_initiated);
83 
84     if (isCallback) {
85         ANS_LOGD("napiPublish callback is nullptr.");
86         return Common::NapiGetNull(env);
87     } else {
88         return promise;
89     }
90 }
91 
NapiShowNotification(napi_env env,napi_callback_info info)92 napi_value NapiShowNotification(napi_env env, napi_callback_info info)
93 {
94     ANS_LOGD("enter");
95     ParametersInfoPublish params;
96     if (ParseShowOptions(env, info, params) == nullptr) {
97         ANS_LOGW("parse showOptions failed");
98         Common::NapiThrow(env, ERROR_PARAM_INVALID);
99         return Common::NapiGetUndefined(env);
100     }
101 
102     auto asynccallbackinfo = new (std::nothrow) AsyncCallbackInfoPublish {.env = env, .asyncWork = nullptr};
103     if (!asynccallbackinfo) {
104         ANS_LOGW("failed to create asynccallbackinfo");
105         return Common::JSParaError(env, params.callback);
106     }
107     asynccallbackinfo->request = params.request;
108 
109     napi_value resourceName = nullptr;
110     napi_create_string_latin1(env, "show", NAPI_AUTO_LENGTH, &resourceName);
111 
112     ANS_LOGI("before napi_create_async_work");
113     napi_create_async_work(env,
114         nullptr,
115         resourceName,
116         [](napi_env env, void *data) {
117             AsyncCallbackInfoPublish *asynccallbackinfo = static_cast<AsyncCallbackInfoPublish *>(data);
118             if (asynccallbackinfo) {
119                 ANS_LOGD("NapiShowNotification work excute notificationId = %{public}d, contentType = "
120                         "%{public}d",
121                     asynccallbackinfo->request.GetNotificationId(),
122                     asynccallbackinfo->request.GetContent()->GetContentType());
123 
124                 asynccallbackinfo->info.errorCode =
125                     NotificationHelper::PublishNotification(asynccallbackinfo->request);
126             }
127         },
128         [](napi_env env, napi_status status, void *data) {
129             ANS_LOGI("NapiShowNotification word complete.");
130             AsyncCallbackInfoPublish *asynccallbackinfo = static_cast<AsyncCallbackInfoPublish *>(data);
131             if (asynccallbackinfo) {
132                 if (asynccallbackinfo->info.callback != nullptr) {
133                     napi_delete_reference(env, asynccallbackinfo->info.callback);
134                 }
135                 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
136                 delete asynccallbackinfo;
137                 asynccallbackinfo = nullptr;
138             }
139             ANS_LOGI("napi_create_async_work complete end");
140         },
141         (void *)asynccallbackinfo,
142         &asynccallbackinfo->asyncWork);
143 
144     napi_queue_async_work_with_qos(env, asynccallbackinfo->asyncWork, napi_qos_user_initiated);
145 
146     return nullptr;
147 }
148 
NapiPublishAsBundle(napi_env env,napi_callback_info info)149 napi_value NapiPublishAsBundle(napi_env env, napi_callback_info info)
150 {
151     ANS_LOGD("enter");
152     ParametersInfoPublish params;
153     if (ParsePublishAsBundleParameters(env, info, params) == nullptr) {
154         Common::NapiThrow(env, ERROR_PARAM_INVALID);
155         return Common::NapiGetUndefined(env);
156     }
157 
158     napi_value promise = nullptr;
159     auto asynccallbackinfo = new (std::nothrow) AsyncCallbackInfoPublish {.env = env, .asyncWork = nullptr};
160     if (!asynccallbackinfo) {
161         Common::NapiThrow(env, ERROR_INTERNAL_ERROR);
162         return Common::JSParaError(env, params.callback);
163     }
164 
165     asynccallbackinfo->request = params.request;
166     Common::PaddingCallbackPromiseInfo(env, params.callback, asynccallbackinfo->info, promise);
167 
168     napi_value resourceName = nullptr;
169     napi_create_string_latin1(env, "publishasbundle", NAPI_AUTO_LENGTH, &resourceName);
170 
171     napi_create_async_work(env,
172         nullptr,
173         resourceName,
174         [](napi_env env, void *data) {
175             ANS_LOGD("NapiPublishAsBundle work excute.");
176             AsyncCallbackInfoPublish *asynccallbackinfo = static_cast<AsyncCallbackInfoPublish *>(data);
177             if (asynccallbackinfo) {
178                 ANS_LOGD("notificationId = %{public}d, contentType = "
179                         "%{public}d",
180                     asynccallbackinfo->request.GetNotificationId(),
181                     asynccallbackinfo->request.GetContent()->GetContentType());
182 
183                 asynccallbackinfo->info.errorCode =
184                     NotificationHelper::PublishNotification(asynccallbackinfo->request);
185             }
186         },
187         [](napi_env env, napi_status status, void *data) {
188             ANS_LOGD("NapiPublishAsBundle work complete.");
189             AsyncCallbackInfoPublish *asynccallbackinfo = static_cast<AsyncCallbackInfoPublish *>(data);
190             if (asynccallbackinfo) {
191                 Common::CreateReturnValue(env, asynccallbackinfo->info, Common::NapiGetNull(env));
192                 if (asynccallbackinfo->info.callback != nullptr) {
193                     ANS_LOGD("Delete napiPublishAsBundle callback reference.");
194                     napi_delete_reference(env, asynccallbackinfo->info.callback);
195                 }
196                 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
197                 delete asynccallbackinfo;
198                 asynccallbackinfo = nullptr;
199             }
200             ANS_LOGI("PublishAsBundle napi_create_async_work complete end");
201         },
202         (void *)asynccallbackinfo,
203         &asynccallbackinfo->asyncWork);
204 
205     bool isCallback = asynccallbackinfo->info.isCallback;
206     napi_queue_async_work_with_qos(env, asynccallbackinfo->asyncWork, napi_qos_user_initiated);
207 
208     if (isCallback) {
209         ANS_LOGD("napiPublishAsBundle callback is nullptr.");
210         return Common::NapiGetNull(env);
211     } else {
212         return promise;
213     }
214 }
215 }  // namespace NotificationNapi
216 }  // namespace OHOS
217