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