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_local_live_view.h"
17 #include "local_live_view_subscribe.h"
18 #include "ans_inner_errors.h"
19 #include "common.h"
20
21 namespace OHOS {
22 namespace NotificationNapi {
23 const int32_t TRIGGER_PARA = 3;
24
NapiSubscriteLocalAcitvity(napi_env env,napi_callback_info info)25 napi_value NapiSubscriteLocalAcitvity(napi_env env, napi_callback_info info)
26 {
27 ANS_LOGD("called");
28 napi_ref callback = nullptr;
29 LocalLiveViewSubscriberInstance *objectInfo = nullptr;
30 if (ParseParameters(env, info, objectInfo, callback) == nullptr) {
31 if (objectInfo) {
32 delete objectInfo;
33 objectInfo = nullptr;
34 }
35 Common::NapiThrow(env, ERROR_PARAM_INVALID);
36 return Common::NapiGetUndefined(env);
37 }
38
39 AsyncCallbackInfoSubscribeLocalLiveView *asynccallbackinfo =
40 new (std::nothrow) AsyncCallbackInfoSubscribeLocalLiveView {
41 .env = env, .asyncWork = nullptr, .objectInfo = objectInfo
42 };
43 if (!asynccallbackinfo) {
44 if (objectInfo) {
45 delete objectInfo;
46 objectInfo = nullptr;
47 }
48 return Common::JSParaError(env, callback);
49 }
50 napi_value promise = nullptr;
51 Common::PaddingCallbackPromiseInfo(env, callback, asynccallbackinfo->info, promise);
52
53 napi_value resourceName = nullptr;
54 napi_create_string_latin1(env, "subscribeLocalLiveViewNotification", NAPI_AUTO_LENGTH, &resourceName);
55 // Asynchronous function call
56 napi_create_async_work(env,
57 nullptr,
58 resourceName,
59 [](napi_env env, void *data) {
60 ANS_LOGD("NapiSubscribeLocalLiveView work excute.");
61 if (!data) {
62 ANS_LOGE("Invalid asynccallbackinfo!");
63 return;
64 }
65 auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoSubscribeLocalLiveView *>(data);
66
67 asynccallbackinfo->info.errorCode =
68 NotificationHelper::SubscribeLocalLiveViewNotification(*(asynccallbackinfo->objectInfo), false);
69 },
70 [](napi_env env, napi_status status, void *data) {
71 ANS_LOGD("NapiSubscribeLocalLiveView work complete.");
72 if (!data) {
73 ANS_LOGE("Invalid asynccallbackinfo!");
74 return;
75 }
76 auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoSubscribeLocalLiveView *>(data);
77 if (asynccallbackinfo) {
78 Common::CreateReturnValue(env, asynccallbackinfo->info, Common::NapiGetNull(env));
79 if (asynccallbackinfo->info.callback != nullptr) {
80 ANS_LOGD("Delete napiSubscribeLocalLiveView callback reference.");
81 napi_delete_reference(env, asynccallbackinfo->info.callback);
82 }
83 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
84 delete asynccallbackinfo;
85 asynccallbackinfo = nullptr;
86 }
87 ANS_LOGD("NapiSubscribeLocalLiveView work complete end.");
88 },
89 (void *)asynccallbackinfo,
90 &asynccallbackinfo->asyncWork);
91
92 bool isCallback = asynccallbackinfo->info.isCallback;
93 napi_queue_async_work_with_qos(env, asynccallbackinfo->asyncWork, napi_qos_user_initiated);
94
95 if (isCallback) {
96 ANS_LOGD("null isCallback");
97 return Common::NapiGetNull(env);
98 } else {
99 return promise;
100 }
101 }
102
NapiUnsubscriteLocalLiveView(napi_env env,napi_callback_info info)103 napi_value NapiUnsubscriteLocalLiveView(napi_env env, napi_callback_info info)
104 {
105 return nullptr;
106 }
107
ParseTriggerParameters(const napi_env & env,const napi_callback_info & info,AsyncCallbackInfoSubscribeLocalLiveView * asynccallbackinfo,napi_ref & callback)108 napi_value ParseTriggerParameters(const napi_env &env, const napi_callback_info &info,
109 AsyncCallbackInfoSubscribeLocalLiveView *asynccallbackinfo, napi_ref &callback)
110 {
111 ANS_LOGD("called");
112
113 size_t argc = TRIGGER_PARA;
114 napi_value argv[TRIGGER_PARA] = {nullptr, nullptr};
115 napi_value thisVar = nullptr;
116
117 int32_t notificationId = -1;
118
119 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
120 if (argc != TRIGGER_PARA) {
121 ANS_LOGE("Wrong number of arguments");
122 Common::NapiThrow(env, ERROR_PARAM_INVALID, MANDATORY_PARAMETER_ARE_LEFT_UNSPECIFIED);
123 return nullptr;
124 }
125
126 napi_valuetype valuetype = napi_undefined;
127
128 // argv[0]:BundleOption
129 auto retValue = Common::GetBundleOption(env, argv[PARAM0], asynccallbackinfo->bundleOption);
130 if (retValue == nullptr) {
131 ANS_LOGE("null retValue");
132 Common::NapiThrow(env, ERROR_PARAM_INVALID, PARAMETER_VERIFICATION_FAILED);
133 return nullptr;
134 }
135
136 // argv[1]:notificationId
137 NAPI_CALL(env, napi_typeof(env, argv[PARAM1], &valuetype));
138 if (valuetype != napi_number) {
139 ANS_LOGE("Wrong argument type. Number expected.");
140 std::string msg = "Incorrect parameter types.The type of param must be number.";
141 Common::NapiThrow(env, ERROR_PARAM_INVALID, msg);
142 return nullptr;
143 }
144 napi_get_value_int32(env, argv[PARAM1], ¬ificationId);
145 ANS_LOGI("notificationId = %{public}d", notificationId);
146 asynccallbackinfo->notificationId = notificationId;
147
148 // argv[2]:buttonOption
149 retValue = Common::GetButtonOption(env, argv[PARAM2], asynccallbackinfo->buttonOption);
150 if (retValue == nullptr) {
151 ANS_LOGE("null retValue");
152 Common::NapiThrow(env, ERROR_PARAM_INVALID, PARAMETER_VERIFICATION_FAILED);
153 return nullptr;
154 }
155 return Common::NapiGetNull(env);
156 }
157
NapiTriggerLocalLiveView(napi_env env,napi_callback_info info)158 napi_value NapiTriggerLocalLiveView(napi_env env, napi_callback_info info)
159 {
160 ANS_LOGD("called");
161 napi_ref callback = nullptr;
162
163 AsyncCallbackInfoSubscribeLocalLiveView *asynccallbackinfo =
164 new (std::nothrow) AsyncCallbackInfoSubscribeLocalLiveView {
165 .env = env, .asyncWork = nullptr,
166 };
167 if (!asynccallbackinfo) {
168 Common::NapiThrow(env, ERROR_INTERNAL_ERROR);
169 return Common::JSParaError(env, callback);
170 }
171
172 if (ParseTriggerParameters(env, info, asynccallbackinfo, callback) == nullptr) {
173 Common::NapiThrow(env, ERROR_PARAM_INVALID);
174 delete asynccallbackinfo;
175 return Common::NapiGetUndefined(env);
176 }
177
178 napi_value promise = nullptr;
179 Common::PaddingCallbackPromiseInfo(env, callback, asynccallbackinfo->info, promise);
180
181 napi_value resourceName = nullptr;
182 napi_create_string_latin1(env, "triggerLocalLiveView", NAPI_AUTO_LENGTH, &resourceName);
183 // Asynchronous function call
184 napi_create_async_work(env,
185 nullptr,
186 resourceName,
187 [](napi_env env, void *data) {
188 ANS_LOGD("NapiTriggerLocalLiveView work excute.");
189 if (!data) {
190 ANS_LOGE("Invalid asynccallbackinfo!");
191 return;
192 }
193 auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoSubscribeLocalLiveView *>(data);
194
195 asynccallbackinfo->info.errorCode =
196 NotificationHelper::TriggerLocalLiveView(asynccallbackinfo->bundleOption,
197 asynccallbackinfo->notificationId, asynccallbackinfo->buttonOption);
198 },
199 [](napi_env env, napi_status status, void *data) {
200 ANS_LOGD("NapiSubscribeLocalLiveView work complete.");
201 if (!data) {
202 ANS_LOGE("Invalid asynccallbackinfo!");
203 return;
204 }
205 auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoSubscribeLocalLiveView *>(data);
206 if (asynccallbackinfo) {
207 Common::CreateReturnValue(env, asynccallbackinfo->info, Common::NapiGetNull(env));
208 if (asynccallbackinfo->info.callback != nullptr) {
209 ANS_LOGD("Delete napiSubscribeLocalLiveView callback reference.");
210 napi_delete_reference(env, asynccallbackinfo->info.callback);
211 }
212 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
213 delete asynccallbackinfo;
214 asynccallbackinfo = nullptr;
215 }
216 ANS_LOGD("NapiSubscribeLocalLiveView work complete end.");
217 },
218 (void *)asynccallbackinfo,
219 &asynccallbackinfo->asyncWork);
220
221 bool isCallback = asynccallbackinfo->info.isCallback;
222 napi_queue_async_work_with_qos(env, asynccallbackinfo->asyncWork, napi_qos_user_initiated);
223
224 if (isCallback) {
225 ANS_LOGD("null isCallback");
226 return Common::NapiGetNull(env);
227 } else {
228 return promise;
229 }
230 }
231
232 } // namespace NotificationNapi
233 } // namespace OHOS
234