11e934351Sopenharmony_ci/* 21e934351Sopenharmony_ci * Copyright (c) 2021-2024 Huawei Device Co., Ltd. 31e934351Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 41e934351Sopenharmony_ci * you may not use this file except in compliance with the License. 51e934351Sopenharmony_ci * You may obtain a copy of the License at 61e934351Sopenharmony_ci * 71e934351Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 81e934351Sopenharmony_ci * 91e934351Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 101e934351Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 111e934351Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 121e934351Sopenharmony_ci * See the License for the specific language governing permissions and 131e934351Sopenharmony_ci * limitations under the License. 141e934351Sopenharmony_ci */ 151e934351Sopenharmony_ci 161e934351Sopenharmony_ci#ifndef COMMUNICATIONNETSTACK_EVENT_MANAGER_H 171e934351Sopenharmony_ci#define COMMUNICATIONNETSTACK_EVENT_MANAGER_H 181e934351Sopenharmony_ci 191e934351Sopenharmony_ci#include <atomic> 201e934351Sopenharmony_ci#include <condition_variable> 211e934351Sopenharmony_ci#include <iosfwd> 221e934351Sopenharmony_ci#include <list> 231e934351Sopenharmony_ci#include <memory> 241e934351Sopenharmony_ci#include <mutex> 251e934351Sopenharmony_ci#include <queue> 261e934351Sopenharmony_ci#include <string> 271e934351Sopenharmony_ci#include <unordered_set> 281e934351Sopenharmony_ci#include <utility> 291e934351Sopenharmony_ci 301e934351Sopenharmony_ci#include "event_listener.h" 311e934351Sopenharmony_ci#include "napi/native_api.h" 321e934351Sopenharmony_ci#include "uv.h" 331e934351Sopenharmony_ci 341e934351Sopenharmony_cinamespace OHOS::NetStack { 351e934351Sopenharmony_cistatic constexpr const uint32_t EVENT_MANAGER_MAGIC_NUMBER = 0x86161616; 361e934351Sopenharmony_cistruct EventManagerMagic { 371e934351Sopenharmony_ci uint32_t magicNumber_ = EVENT_MANAGER_MAGIC_NUMBER; 381e934351Sopenharmony_ci ~EventManagerMagic() 391e934351Sopenharmony_ci { 401e934351Sopenharmony_ci magicNumber_ = ~magicNumber_; 411e934351Sopenharmony_ci } 421e934351Sopenharmony_ci}; 431e934351Sopenharmony_ci 441e934351Sopenharmony_cinamespace Websocket { 451e934351Sopenharmony_ciclass UserData; 461e934351Sopenharmony_ci} 471e934351Sopenharmony_ci 481e934351Sopenharmony_ciclass EventManager : public std::enable_shared_from_this<EventManager> { 491e934351Sopenharmony_cipublic: 501e934351Sopenharmony_ci EventManager(); 511e934351Sopenharmony_ci 521e934351Sopenharmony_ci ~EventManager(); 531e934351Sopenharmony_ci 541e934351Sopenharmony_ci EventManager(const EventManager &) = delete; 551e934351Sopenharmony_ci EventManager &operator=(const EventManager &manager) = delete; 561e934351Sopenharmony_ci 571e934351Sopenharmony_ci void AddListener(napi_env env, const std::string &type, napi_value callback, bool once, bool asyncCallback); 581e934351Sopenharmony_ci 591e934351Sopenharmony_ci void DeleteListener(const std::string &type, napi_value callback); 601e934351Sopenharmony_ci 611e934351Sopenharmony_ci void Emit(const std::string &type, const std::pair<napi_value, napi_value> &argv); 621e934351Sopenharmony_ci 631e934351Sopenharmony_ci void SetData(void *data); 641e934351Sopenharmony_ci 651e934351Sopenharmony_ci [[nodiscard]] void *GetData(); 661e934351Sopenharmony_ci 671e934351Sopenharmony_ci void EmitByUv(const std::string &type, void *data, void(Handler)(uv_work_t *, int status)); 681e934351Sopenharmony_ci 691e934351Sopenharmony_ci void EmitByUvWithoutCheck(const std::string &type, void *data, void(Handler)(uv_work_t *, int status)); 701e934351Sopenharmony_ci 711e934351Sopenharmony_ci void EmitByUvWithoutCheckShared(const std::string &type, void *data, void(Handler)(uv_work_t *, int status)); 721e934351Sopenharmony_ci 731e934351Sopenharmony_ci bool HasEventListener(const std::string &type); 741e934351Sopenharmony_ci 751e934351Sopenharmony_ci void DeleteListener(const std::string &type); 761e934351Sopenharmony_ci 771e934351Sopenharmony_ci static void SetInvalid(EventManager *manager); 781e934351Sopenharmony_ci 791e934351Sopenharmony_ci static bool IsManagerValid(EventManager *manager); 801e934351Sopenharmony_ci 811e934351Sopenharmony_ci static void SetValid(EventManager *manager); 821e934351Sopenharmony_ci 831e934351Sopenharmony_ci void SetQueueData(void *data); 841e934351Sopenharmony_ci 851e934351Sopenharmony_ci void *GetQueueData(); 861e934351Sopenharmony_ci 871e934351Sopenharmony_ci void CreateEventReference(napi_env env, napi_value value); 881e934351Sopenharmony_ci 891e934351Sopenharmony_ci void DeleteEventReference(napi_env env); 901e934351Sopenharmony_ci 911e934351Sopenharmony_ci void SetEventDestroy(bool flag); 921e934351Sopenharmony_ci 931e934351Sopenharmony_ci bool IsEventDestroy(); 941e934351Sopenharmony_ci 951e934351Sopenharmony_ci const std::string &GetWebSocketTextData(); 961e934351Sopenharmony_ci 971e934351Sopenharmony_ci void AppendWebSocketTextData(void *data, size_t length); 981e934351Sopenharmony_ci 991e934351Sopenharmony_ci const std::string &GetWebSocketBinaryData(); 1001e934351Sopenharmony_ci 1011e934351Sopenharmony_ci void AppendWebSocketBinaryData(void *data, size_t length); 1021e934351Sopenharmony_ci 1031e934351Sopenharmony_ci void ClearWebSocketTextData(); 1041e934351Sopenharmony_ci 1051e934351Sopenharmony_ci void ClearWebSocketBinaryData(); 1061e934351Sopenharmony_ci 1071e934351Sopenharmony_ci void NotifyRcvThdExit(); 1081e934351Sopenharmony_ci 1091e934351Sopenharmony_ci void WaitForRcvThdExit(); 1101e934351Sopenharmony_ci 1111e934351Sopenharmony_ci void SetReuseAddr(bool reuse); 1121e934351Sopenharmony_ci 1131e934351Sopenharmony_ci void SetWebSocketUserData(const std::shared_ptr<Websocket::UserData> &userData); 1141e934351Sopenharmony_ci 1151e934351Sopenharmony_ci std::shared_ptr<Websocket::UserData> GetWebSocketUserData(); 1161e934351Sopenharmony_ci 1171e934351Sopenharmony_ci bool GetReuseAddr(); 1181e934351Sopenharmony_ci 1191e934351Sopenharmony_ciprivate: 1201e934351Sopenharmony_ci std::mutex mutexForListenersAndEmitByUv_; 1211e934351Sopenharmony_ci std::mutex mutexForEmitAndEmitByUv_; 1221e934351Sopenharmony_ci std::mutex dataMutex_; 1231e934351Sopenharmony_ci std::mutex dataQueueMutex_; 1241e934351Sopenharmony_ci std::list<EventListener> listeners_; 1251e934351Sopenharmony_ci void *data_; 1261e934351Sopenharmony_ci std::queue<void *> dataQueue_; 1271e934351Sopenharmony_ci static EventManagerMagic magic_; 1281e934351Sopenharmony_ci static std::mutex mutexForManager_; 1291e934351Sopenharmony_ci static std::unordered_set<EventManager *> validManager_; 1301e934351Sopenharmony_ci napi_ref eventRef_; 1311e934351Sopenharmony_ci std::atomic_bool isDestroy_; 1321e934351Sopenharmony_ci std::string webSocketTextData_; 1331e934351Sopenharmony_ci std::string webSocketBinaryData_; 1341e934351Sopenharmony_ci std::mutex sockRcvThdMtx_; 1351e934351Sopenharmony_ci std::condition_variable sockRcvThdCon_; 1361e934351Sopenharmony_ci bool sockRcvExit_ = false; 1371e934351Sopenharmony_ci std::atomic_bool isReuseAddr_ = false; 1381e934351Sopenharmony_ci std::shared_ptr<Websocket::UserData> webSocketUserData_; 1391e934351Sopenharmony_ci 1401e934351Sopenharmony_cipublic: 1411e934351Sopenharmony_ci struct { 1421e934351Sopenharmony_ci uint32_t magicNumber = EVENT_MANAGER_MAGIC_NUMBER; 1431e934351Sopenharmony_ci } innerMagic_; 1441e934351Sopenharmony_ci}; 1451e934351Sopenharmony_ci 1461e934351Sopenharmony_cistruct UvWorkWrapper { 1471e934351Sopenharmony_ci UvWorkWrapper() = delete; 1481e934351Sopenharmony_ci 1491e934351Sopenharmony_ci UvWorkWrapper(void *theData, napi_env theEnv, std::string eventType, EventManager *eventManager); 1501e934351Sopenharmony_ci 1511e934351Sopenharmony_ci void *data = nullptr; 1521e934351Sopenharmony_ci napi_env env = nullptr; 1531e934351Sopenharmony_ci std::string type; 1541e934351Sopenharmony_ci EventManager *manager = nullptr; 1551e934351Sopenharmony_ci}; 1561e934351Sopenharmony_ci 1571e934351Sopenharmony_ciclass EventManagerForHttp { 1581e934351Sopenharmony_ciprivate: 1591e934351Sopenharmony_ci [[maybe_unused]] std::mutex mutexForListenersAndEmitByUv_; 1601e934351Sopenharmony_ci [[maybe_unused]] std::mutex mutexForEmitAndEmitByUv_; 1611e934351Sopenharmony_ci [[maybe_unused]] std::mutex dataMutex_; 1621e934351Sopenharmony_ci [[maybe_unused]] std::mutex dataQueueMutex_; 1631e934351Sopenharmony_ci [[maybe_unused]] std::list<EventListener> listeners_; 1641e934351Sopenharmony_ci [[maybe_unused]] void *data_ = nullptr; 1651e934351Sopenharmony_ci [[maybe_unused]] std::queue<void *> dataQueue_; 1661e934351Sopenharmony_ci [[maybe_unused]] static EventManagerMagic magic_; 1671e934351Sopenharmony_ci [[maybe_unused]] static std::mutex mutexForManager_; 1681e934351Sopenharmony_ci [[maybe_unused]] static std::unordered_set<EventManager *> validManager_; 1691e934351Sopenharmony_ci [[maybe_unused]] napi_ref eventRef_ = nullptr; 1701e934351Sopenharmony_ci [[maybe_unused]] std::atomic_bool isDestroy_; 1711e934351Sopenharmony_ci [[maybe_unused]] std::string webSocketTextData_; 1721e934351Sopenharmony_ci [[maybe_unused]] std::string webSocketBinaryData_; 1731e934351Sopenharmony_ci [[maybe_unused]] std::mutex sockRcvThdMtx_; 1741e934351Sopenharmony_ci [[maybe_unused]] std::condition_variable sockRcvThdCon_; 1751e934351Sopenharmony_ci [[maybe_unused]] bool sockRcvExit_ = false; 1761e934351Sopenharmony_ci [[maybe_unused]] std::atomic_bool isReuseAddr_ = false; 1771e934351Sopenharmony_ci [[maybe_unused]] std::shared_ptr<Websocket::UserData> webSocketUserData_; 1781e934351Sopenharmony_ci 1791e934351Sopenharmony_cipublic: 1801e934351Sopenharmony_ci [[maybe_unused]] struct { 1811e934351Sopenharmony_ci uint32_t magicNumber = EVENT_MANAGER_MAGIC_NUMBER; 1821e934351Sopenharmony_ci } innerMagic_; 1831e934351Sopenharmony_ci}; 1841e934351Sopenharmony_ci 1851e934351Sopenharmony_cistruct EventManagerWrapper { 1861e934351Sopenharmony_ci EventManagerForHttp eventManager; 1871e934351Sopenharmony_ci std::shared_ptr<EventManager> sharedManager; 1881e934351Sopenharmony_ci}; 1891e934351Sopenharmony_ci 1901e934351Sopenharmony_cistruct UvWorkWrapperShared { 1911e934351Sopenharmony_ci UvWorkWrapperShared() = delete; 1921e934351Sopenharmony_ci 1931e934351Sopenharmony_ci UvWorkWrapperShared(void *theData, napi_env theEnv, std::string eventType, 1941e934351Sopenharmony_ci const std::shared_ptr<EventManager> &eventManager); 1951e934351Sopenharmony_ci 1961e934351Sopenharmony_ci void *data = nullptr; 1971e934351Sopenharmony_ci napi_env env = nullptr; 1981e934351Sopenharmony_ci std::string type; 1991e934351Sopenharmony_ci std::shared_ptr<EventManager> manager; 2001e934351Sopenharmony_ci}; 2011e934351Sopenharmony_ci} // namespace OHOS::NetStack 2021e934351Sopenharmony_ci#endif /* COMMUNICATIONNETSTACK_EVENT_MANAGER_H */ 203