• 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("enter");
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("napiSubscribeLocalLiveView callback is nullptr.");
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("enter");
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("GetBundleOption failed");
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("GetButtonOption failed");
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("enter");
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         return Common::NapiGetUndefined(env);
175     }
176 
177     napi_value promise = nullptr;
178     Common::PaddingCallbackPromiseInfo(env, callback, asynccallbackinfo->info, promise);
179 
180     napi_value resourceName = nullptr;
181     napi_create_string_latin1(env, "triggerLocalLiveView", NAPI_AUTO_LENGTH, &resourceName);
182     // Asynchronous function call
183     napi_create_async_work(env,
184         nullptr,
185         resourceName,
186         [](napi_env env, void *data) {
187             ANS_LOGD("NapiTriggerLocalLiveView work excute.");
188             if (!data) {
189                 ANS_LOGE("Invalid asynccallbackinfo!");
190                 return;
191             }
192             auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoSubscribeLocalLiveView *>(data);
193 
194             asynccallbackinfo->info.errorCode =
195                 NotificationHelper::TriggerLocalLiveView(asynccallbackinfo->bundleOption,
196                     asynccallbackinfo->notificationId, asynccallbackinfo->buttonOption);
197         },
198         [](napi_env env, napi_status status, void *data) {
199             ANS_LOGD("NapiSubscribeLocalLiveView work complete.");
200             if (!data) {
201                 ANS_LOGE("Invalid asynccallbackinfo!");
202                 return;
203             }
204             auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoSubscribeLocalLiveView *>(data);
205             if (asynccallbackinfo) {
206                 Common::CreateReturnValue(env, asynccallbackinfo->info, Common::NapiGetNull(env));
207                 if (asynccallbackinfo->info.callback != nullptr) {
208                     ANS_LOGD("Delete napiSubscribeLocalLiveView callback reference.");
209                     napi_delete_reference(env, asynccallbackinfo->info.callback);
210                 }
211                 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
212                 delete asynccallbackinfo;
213                 asynccallbackinfo = nullptr;
214             }
215             ANS_LOGD("NapiSubscribeLocalLiveView work complete end.");
216         },
217         (void *)asynccallbackinfo,
218         &asynccallbackinfo->asyncWork);
219 
220     bool isCallback = asynccallbackinfo->info.isCallback;
221     napi_queue_async_work_with_qos(env, asynccallbackinfo->asyncWork, napi_qos_user_initiated);
222 
223     if (isCallback) {
224         ANS_LOGD("napiSubscribeLocalLiveView callback is nullptr.");
225         return Common::NapiGetNull(env);
226     } else {
227         return promise;
228     }
229 }
230 
231 }  // namespace NotificationNapi
232 }  // namespace OHOS
233