1 /*
2  * Copyright (c) 2021-2022 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 #ifndef BASE_NOTIFICATION_CES_STANDARD_CESFWK_KITS_NAPI_COMMON_EVENT_INCLUDE_COMMON_EVENT_H
17 #define BASE_NOTIFICATION_CES_STANDARD_CESFWK_KITS_NAPI_COMMON_EVENT_INCLUDE_COMMON_EVENT_H
18 
19 #include "common_event_constant.h"
20 #include "common_event_manager.h"
21 #include "napi/native_api.h"
22 #include "napi/native_node_api.h"
23 #include <mutex>
24 
25 namespace OHOS {
26 namespace EventFwkNapi {
27 using namespace OHOS::EventFwk;
28 
29 static const int32_t CREATE_MAX_PARA = 2;
30 static const int32_t SUBSCRIBE_MAX_PARA = 2;
31 static const int32_t UNSUBSCRIBE_MAX_PARA = 2;
32 static const int32_t PUBLISH_MAX_PARA_BY_PUBLISHDATA = 3;
33 static const int32_t PUBLISH_MAX_PARA_BY_USERID = 4;
34 static const int8_t NO_ERROR = 0;
35 static const int8_t ERR_CES_FAILED = 1;
36 
37 class SubscriberInstance;
38 struct AsyncCallbackInfoSubscribe;
39 
40 struct subscriberInstanceInfo {
41     std::vector<AsyncCallbackInfoSubscribe *> asyncCallbackInfo;
42     std::shared_ptr<AsyncCommonEventResult> commonEventResult = nullptr;
43 };
44 
45 static thread_local napi_ref g_CommonEventSubscriber = nullptr;
46 static std::map<std::shared_ptr<SubscriberInstance>, subscriberInstanceInfo> subscriberInstances;
47 static std::mutex subscriberInsMutex;
48 
49 struct CallbackPromiseInfo {
50     napi_ref callback = nullptr;
51     napi_deferred deferred = nullptr;
52     bool isCallback = false;
53     int8_t errorCode = NO_ERROR;
54 };
55 
56 struct AsyncCallbackInfoSubscribe {
57     napi_env env = nullptr;
58     napi_async_work asyncWork;
59     napi_ref callback = nullptr;
60     std::shared_ptr<SubscriberInstance> subscriber = nullptr;
61     int8_t errorCode = NO_ERROR;
62     napi_threadsafe_function tsfn = nullptr;
63 };
64 
65 struct AsyncCallbackInfoUnsubscribe {
66     explicit AsyncCallbackInfoUnsubscribe();
67     ~AsyncCallbackInfoUnsubscribe();
68     napi_env env = nullptr;
69     napi_async_work asyncWork = nullptr;
70     napi_ref callback = nullptr;
71     size_t argc = 0;
72     std::shared_ptr<SubscriberInstance> subscriber = nullptr;
73     int8_t errorCode = NO_ERROR;
74 };
75 
76 struct AsyncCallbackInfoSubscribeInfo {
77     napi_env env = nullptr;
78     napi_async_work asyncWork;
79     std::shared_ptr<SubscriberInstance> subscriber = nullptr;
80     std::vector<std::string> events;
81     std::string permission;
82     std::string deviceId;
83     int32_t userId = UNDEFINED_USER;
84     int32_t priority = 0;
85     CallbackPromiseInfo info;
86 };
87 
88 struct AsyncCallbackInfoOrderedCommonEvent {
89     napi_env env = nullptr;
90     napi_async_work asyncWork;
91     std::shared_ptr<SubscriberInstance> subscriber = nullptr;
92     bool isOrdered = false;
93     CallbackPromiseInfo info;
94 };
95 
96 struct AsyncCallbackInfoStickyCommonEvent {
97     napi_env env = nullptr;
98     napi_async_work asyncWork;
99     std::shared_ptr<SubscriberInstance> subscriber = nullptr;
100     bool isSticky = false;
101     CallbackPromiseInfo info;
102 };
103 
104 struct AsyncCallbackInfoGetCode {
105     napi_env env = nullptr;
106     napi_async_work asyncWork;
107     std::shared_ptr<SubscriberInstance> subscriber = nullptr;
108     int32_t code = 0;
109     CallbackPromiseInfo info;
110 };
111 
112 struct AsyncCallbackInfoSetCode {
113     napi_env env = nullptr;
114     napi_async_work asyncWork;
115     std::shared_ptr<SubscriberInstance> subscriber = nullptr;
116     int32_t code = 0;
117     CallbackPromiseInfo info;
118 };
119 
120 struct AsyncCallbackInfoGetData {
121     napi_env env = nullptr;
122     napi_async_work asyncWork;
123     std::shared_ptr<SubscriberInstance> subscriber = nullptr;
124     std::string data;
125     CallbackPromiseInfo info;
126 };
127 
128 struct AsyncCallbackInfoSetData {
129     napi_env env = nullptr;
130     napi_async_work asyncWork;
131     std::shared_ptr<SubscriberInstance> subscriber = nullptr;
132     std::string data;
133     CallbackPromiseInfo info;
134 };
135 
136 struct AsyncCallbackInfoSetCodeAndData {
137     napi_env env = nullptr;
138     napi_async_work asyncWork;
139     std::shared_ptr<SubscriberInstance> subscriber = nullptr;
140     int32_t code = 0;
141     std::string data;
142     CallbackPromiseInfo info;
143 };
144 
145 struct AsyncCallbackInfoAbort {
146     napi_env env = nullptr;
147     napi_async_work asyncWork;
148     std::shared_ptr<SubscriberInstance> subscriber = nullptr;
149     CallbackPromiseInfo info;
150 };
151 
152 struct AsyncCallbackInfoClearAbort {
153     napi_env env = nullptr;
154     napi_async_work asyncWork;
155     std::shared_ptr<SubscriberInstance> subscriber = nullptr;
156     CallbackPromiseInfo info;
157 };
158 
159 struct AsyncCallbackInfoGetAbort {
160     napi_env env = nullptr;
161     napi_async_work asyncWork;
162     std::shared_ptr<SubscriberInstance> subscriber = nullptr;
163     bool abortEvent = false;
164     CallbackPromiseInfo info;
165 };
166 
167 struct AsyncCallbackInfoFinish {
168     napi_env env = nullptr;
169     napi_async_work asyncWork;
170     std::shared_ptr<SubscriberInstance> subscriber = nullptr;
171     CallbackPromiseInfo info;
172 };
173 
174 struct AsyncCallbackInfoCreate {
175     napi_env env = nullptr;
176     napi_async_work asyncWork;
177     napi_ref subscribeInfo = nullptr;
178     CallbackPromiseInfo info;
179     napi_value result = nullptr;
180 };
181 
182 struct AsyncCallbackInfoPublish {
183     napi_env env = nullptr;
184     napi_async_work asyncWork;
185     napi_ref callback = nullptr;
186     CommonEventData commonEventData;
187     CommonEventPublishInfo commonEventPublishInfo;
188     int32_t userId = UNDEFINED_USER;
189     int8_t errorCode = NO_ERROR;
190 };
191 
192 struct CommonEventPublishDataByjs {
193     std::string bundleName;
194     std::string data;
195     int32_t code = 0;
196     std::vector<std::string> subscriberPermissions;
197     bool isOrdered = false;
198     bool isSticky = false;
199     AAFwk::WantParams wantParams;
200 };
201 
202 struct CommonEventDataWorker {
203     napi_env env = nullptr;
204     napi_ref ref = nullptr;
205     std::shared_ptr<bool> valid;
206     Want want;
207     int32_t code = 0;
208     std::string data;
209 };
210 
211 class SubscriberInstance : public CommonEventSubscriber {
212 public:
213     explicit SubscriberInstance(const CommonEventSubscribeInfo &sp);
214     ~SubscriberInstance();
215 
216     virtual void OnReceiveEvent(const CommonEventData &data) override;
217 
218     void SetEnv(const napi_env &env);
219     void ClearEnv();
220     void SetCallbackRef(const napi_ref &ref);
221     void SetThreadSafeFunction(const napi_threadsafe_function &tsfn);
222     napi_env GetEnv();
223     unsigned long long GetID();
224 
225 private:
226     napi_env env_ = nullptr;
227     napi_ref ref_ = nullptr;
228     std::shared_ptr<bool> valid_;
229     std::atomic_ullong id_;
230     static std::atomic_ullong subscriberID_;
231     napi_threadsafe_function tsfn_ = nullptr;
232     std::mutex envMutex_;
233 };
234 
235 class SubscriberInstanceWrapper {
236 public:
237     explicit SubscriberInstanceWrapper(const CommonEventSubscribeInfo &info);
238     std::shared_ptr<SubscriberInstance> GetSubscriber();
239 
240 private:
241     std::shared_ptr<SubscriberInstance> subscriber = nullptr;
242 };
243 
244 napi_value NapiGetNull(napi_env env);
245 
246 napi_value GetCallbackErrorValue(napi_env env, int8_t errorCode);
247 
248 napi_value ParseParametersByCreateSubscriber(
249     const napi_env &env, const napi_value (&argv)[CREATE_MAX_PARA], const size_t &argc, napi_ref &callback);
250 
251 void SetCallback(const napi_env &env, const napi_ref &callbackIn, const int8_t &errorCode, const napi_value &result);
252 
253 void SetCallback(const napi_env &env, const napi_ref &callbackIn, const napi_value &result);
254 
255 void SetPromise(const napi_env &env, const napi_deferred &deferred, const int8_t &errorCode, const napi_value &result);
256 
257 void ReturnCallbackPromise(const napi_env &env, const CallbackPromiseInfo &info, const napi_value &result);
258 
259 void PaddingAsyncCallbackInfoCreateSubscriber(const napi_env &env,
260     AsyncCallbackInfoCreate *&asynccallbackinfo, const napi_ref &callback, napi_value &promise);
261 
262 napi_value CreateSubscriber(napi_env env, napi_callback_info info);
263 
264 napi_value ParseParametersByGetSubscribeInfo(
265     const napi_env &env, const size_t &argc, const napi_value (&argv)[1], napi_ref &callback);
266 
267 void SetEventsResult(const napi_env &env, const std::vector<std::string> &events, napi_value &commonEventSubscribeInfo);
268 
269 void SetPublisherPermissionResult(
270     const napi_env &env, const std::string &permission, napi_value &commonEventSubscribeInfo);
271 
272 void SetPublisherDeviceIdResult(const napi_env &env, const std::string &deviceId, napi_value &commonEventSubscribeInfo);
273 
274 void SetPublisherUserIdResult(const napi_env &env, const int32_t &userId, napi_value &commonEventSubscribeInfo);
275 
276 void SetPublisherPriorityResult(const napi_env &env, const int32_t &priority, napi_value &commonEventSubscribeInfo);
277 
278 void PaddingAsyncCallbackInfoGetSubscribeInfo(const napi_env &env, const size_t &argc,
279     AsyncCallbackInfoSubscribeInfo *&asynccallbackinfo, const napi_ref &callback, napi_value &promise);
280 
281 void PaddingNapiCreateAsyncWorkCallbackInfo(AsyncCallbackInfoSubscribeInfo *&asynccallbackinfo);
282 
283 void SetNapiResult(const napi_env &env, const AsyncCallbackInfoSubscribeInfo *asynccallbackinfo, napi_value &result);
284 
285 napi_value GetSubscribeInfo(napi_env env, napi_callback_info info);
286 
287 napi_value ParseParametersByIsOrderedCommonEvent(
288     const napi_env &env, const napi_value (&argv)[1], size_t argc, napi_ref &callback);
289 
290 void PaddingAsyncCallbackInfoIsOrderedCommonEvent(const napi_env &env, const size_t &argc,
291     AsyncCallbackInfoOrderedCommonEvent *&asynccallbackinfo, const napi_ref &callback, napi_value &promise);
292 
293 napi_value IsOrderedCommonEvent(napi_env env, napi_callback_info info);
294 
295 napi_value ParseParametersByIsStickyCommonEvent(
296     const napi_env &env, const napi_value (&argv)[1], size_t argc, napi_ref &callback);
297 
298 void PaddingAsyncCallbackInfoIsStickyCommonEvent(const napi_env &env, const size_t &argc,
299     AsyncCallbackInfoStickyCommonEvent *&asynccallbackinfo, const napi_ref &callback, napi_value &promise);
300 
301 napi_value IsStickyCommonEvent(napi_env env, napi_callback_info info);
302 
303 napi_value ParseParametersByGetCode(const napi_env &env, const napi_value (&argv)[1], size_t argc, napi_ref &callback);
304 
305 void PaddingAsyncCallbackInfoGetCode(const napi_env &env, const size_t &argc,
306     AsyncCallbackInfoGetCode *&asynccallbackinfo, const napi_ref &callback, napi_value &promise);
307 
308 std::shared_ptr<AsyncCommonEventResult> GetAsyncResult(const SubscriberInstance *objectInfo);
309 
310 napi_value GetCode(napi_env env, napi_callback_info info);
311 
312 napi_value ParseParametersBySetCode(
313     const napi_env &env, const napi_value (&argv)[2], size_t argc, int32_t &code, napi_ref &callback);
314 
315 void PaddingAsyncCallbackInfoSetCode(const napi_env &env, const size_t &argc,
316     AsyncCallbackInfoSetCode *&asynccallbackinfo, const napi_ref &callback, napi_value &promise);
317 
318 napi_value SetCode(napi_env env, napi_callback_info info);
319 
320 napi_value ParseParametersByGetData(const napi_env &env, const napi_value (&argv)[1], size_t argc, napi_ref &callback);
321 
322 void PaddingAsyncCallbackInfoGetData(const napi_env &env, const size_t &argc,
323     AsyncCallbackInfoGetData *&asynccallbackinfo, const napi_ref &callback, napi_value &promise);
324 
325 napi_value GetData(napi_env env, napi_callback_info info);
326 
327 napi_value ParseParametersBySetData(
328     const napi_env &env, const napi_value (&argv)[2], size_t argc, std::string &data, napi_ref &callback);
329 
330 void PaddingAsyncCallbackInfoSetData(const napi_env &env, const size_t &argc,
331     AsyncCallbackInfoSetData *&asynccallbackinfo, const napi_ref &callback, napi_value &promise);
332 
333 napi_value SetData(napi_env env, napi_callback_info info);
334 
335 napi_value ParseParametersBySetCodeAndData(const napi_env &env, const napi_value (&argv)[3],
336     size_t argc, int32_t &code, std::string &data, napi_ref &callback);
337 
338 void PaddingAsyncCallbackInfoSetCodeAndData(const napi_env &env, const size_t &argc,
339     AsyncCallbackInfoSetCodeAndData *&asynccallbackinfo, const napi_ref &callback, napi_value &promise);
340 
341 napi_value SetCodeAndData(napi_env env, napi_callback_info info);
342 
343 napi_value ParseParametersByAbort(const napi_env &env, const napi_value (&argv)[1], size_t argc, napi_ref &callback);
344 
345 void PaddingAsyncCallbackInfoAbort(const napi_env &env, const size_t &argc, AsyncCallbackInfoAbort *&asynccallbackinfo,
346     const napi_ref &callback, napi_value &promise);
347 
348 napi_value AbortCommonEvent(napi_env env, napi_callback_info info);
349 
350 napi_value ParseParametersByClearAbort(
351     const napi_env &env, const napi_value (&argv)[1], size_t argc, napi_ref &callback);
352 
353 void PaddingAsyncCallbackInfoClearAbort(const napi_env &env, const size_t &argc,
354     AsyncCallbackInfoClearAbort *&asynccallbackinfo, const napi_ref &callback, napi_value &promise);
355 
356 napi_value ClearAbortCommonEvent(napi_env env, napi_callback_info info);
357 
358 napi_value ParseParametersByGetAbort(const napi_env &env, const napi_value (&argv)[1], size_t argc, napi_ref &callback);
359 
360 void PaddingAsyncCallbackInfoGetAbort(const napi_env &env, const size_t &argc,
361     AsyncCallbackInfoGetAbort *&asynccallbackinfo, const napi_ref &callback, napi_value &promise);
362 
363 napi_value GetAbortCommonEvent(napi_env env, napi_callback_info info);
364 
365 napi_value ParseParametersByFinish(const napi_env &env, const napi_value (&argv)[1], size_t argc, napi_ref &callback);
366 
367 void PaddingAsyncCallbackInfoFinish(const napi_env &env, const size_t &argc,
368     AsyncCallbackInfoFinish *&asynccallbackinfo, const napi_ref &callback, napi_value &promise);
369 
370 napi_value FinishCommonEvent(napi_env env, napi_callback_info info);
371 
372 std::shared_ptr<SubscriberInstance> GetSubscriber(const napi_env &env, const napi_value &value);
373 
374 napi_value ParseParametersBySubscribe(const napi_env &env, const napi_value (&argv)[SUBSCRIBE_MAX_PARA],
375     std::shared_ptr<SubscriberInstance> &subscriber, napi_ref &callback);
376 
377 napi_value Subscribe(napi_env env, napi_callback_info info);
378 
379 napi_value GetBundlenameByPublish(const napi_env &env, const napi_value &value, std::string &bundleName);
380 
381 napi_value GetDataByPublish(const napi_env &env, const napi_value &value, std::string &data);
382 
383 napi_value GetCodeByPublish(const napi_env &env, const napi_value &value, int32_t &code);
384 
385 napi_value GetSubscriberPermissionsByPublish(
386     const napi_env &env, const napi_value &value, std::vector<std::string> &subscriberPermissions);
387 
388 napi_value GetIsOrderedByPublish(const napi_env &env, const napi_value &value, bool &isOrdered);
389 
390 napi_value GetIsStickyByPublish(const napi_env &env, const napi_value &value, bool &isSticky);
391 
392 napi_value GetParametersByPublish(const napi_env &env, const napi_value &value, AAFwk::WantParams &wantParams);
393 
394 napi_value ParseParametersByPublish(const napi_env &env, const napi_value (&argv)[PUBLISH_MAX_PARA_BY_PUBLISHDATA],
395     const size_t &argc, std::string &event, CommonEventPublishDataByjs &commonEventPublishData, napi_ref &callback);
396 
397 void PaddingCallbackInfoPublish(Want &want, AsyncCallbackInfoPublish *&asynccallbackinfo,
398     const CommonEventPublishDataByjs &commonEventPublishDatajs);
399 
400 napi_value Publish(napi_env env, napi_callback_info info);
401 
402 napi_value ParseParametersByPublishAsUser(const napi_env &env, const napi_value (&argv)[PUBLISH_MAX_PARA_BY_USERID],
403     const size_t &argc, std::string &event, int32_t &userId, CommonEventPublishDataByjs &commonEventPublishData,
404     napi_ref &callback);
405 
406 napi_value PublishAsUser(napi_env env, napi_callback_info info);
407 
408 napi_value GetSubscriberByUnsubscribe(
409     const napi_env &env, const napi_value &value, std::shared_ptr<SubscriberInstance> &subscriber, bool &isFind);
410 
411 napi_value ParseParametersByUnsubscribe(const napi_env &env, const size_t &argc,
412     const napi_value (&argv)[UNSUBSCRIBE_MAX_PARA], std::shared_ptr<SubscriberInstance> &subscriber,
413     napi_ref &callback);
414 
415 void NapiDeleteSubscribe(const napi_env &env, std::shared_ptr<SubscriberInstance> &subscriber);
416 
417 napi_value Unsubscribe(napi_env env, napi_callback_info info);
418 
419 napi_value GetEventsByCreateSubscriber(const napi_env &env, const napi_value &argv, std::vector<std::string> &events);
420 
421 napi_value GetPublisherPermissionByCreateSubscriber(
422     const napi_env &env, const napi_value &argv, std::string &permission, bool &hasProperty);
423 
424 napi_value GetPublisherDeviceIdByCreateSubscriber(
425     const napi_env &env, const napi_value &argv, std::string &publisherDeviceId, bool &hasProperty);
426 
427 napi_value GetUserIdByCreateSubscriber(const napi_env &env, const napi_value &argv, CommonEventSubscribeInfo &info);
428 
429 napi_value GetPriorityByCreateSubscriber(const napi_env &env, const napi_value &argv, int &priority, bool &hasProperty);
430 
431 napi_value CommonEventSubscriberConstructor(napi_env env, napi_callback_info info);
432 
433 napi_value CommonEventSubscriberInit(napi_env env, napi_value exports);
434 
435 napi_value ParseParametersConstructor(const napi_env &env, const napi_callback_info &info, napi_value &thisVar,
436     CommonEventSubscribeInfo &params);
437 
438 napi_value CommonEventInit(napi_env env, napi_value exports);
439 }  // namespace EventFwkNapi
440 }  // namespace OHOS
441 
442 #endif  // BASE_NOTIFICATION_CES_STANDARD_CESFWK_KITS_NAPI_COMMON_EVENT_INCLUDE_COMMON_EVENT_H
443