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 ¶ms); 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 ¶ms); 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