• 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_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], &notificationId);
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