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