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