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