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