1 /* 2 * Copyright (c) 2023 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 LOCAL_SOCKET_SERVER_CONTEXT_H 17 #define LOCAL_SOCKET_SERVER_CONTEXT_H 18 19 #include <cstddef> 20 #include <unistd.h> 21 #include <map> 22 23 #include "base_context.h" 24 #include "event_list.h" 25 #include "local_socket_context.h" 26 #include "napi/native_api.h" 27 #include "nocopyable.h" 28 #include "socket_state_base.h" 29 30 namespace OHOS::NetStack::Socket { 31 struct LocalSocketServerManager : public SocketBaseManager { 32 int clientId_ = 0; 33 LocalExtraOptions extraOptions_; 34 bool alreadySetExtraOptions_ = false; 35 std::mutex clientMutex_; 36 std::condition_variable cond_; 37 std::map<int, int> acceptFds_; // id & fd 38 std::map<int, EventManager *> clientEventManagers_; // id & EventManager* LocalSocketServerManagerLocalSocketServerManager39 explicit LocalSocketServerManager(int sockfd) : SocketBaseManager(sockfd) {} 40 AddAcceptLocalSocketServerManager41 int AddAccept(int accpetFd) 42 { 43 std::lock_guard<std::mutex> lock(clientMutex_); 44 acceptFds_.emplace(++clientId_, accpetFd); 45 return clientId_; 46 } RemoveAllAcceptLocalSocketServerManager47 void RemoveAllAccept() 48 { 49 std::lock_guard<std::mutex> lock(clientMutex_); 50 for (const auto &[id, fd] : acceptFds_) { 51 if (fd > 0) { 52 close(fd); 53 } 54 } 55 acceptFds_.clear(); 56 } RemoveAcceptLocalSocketServerManager57 void RemoveAccept(int clientId) 58 { 59 std::lock_guard<std::mutex> lock(clientMutex_); 60 if (auto ite = acceptFds_.find(clientId); ite != acceptFds_.end()) { 61 close(ite->second); 62 acceptFds_.erase(ite); 63 } 64 } GetAcceptFdLocalSocketServerManager65 int GetAcceptFd(int clientId) 66 { 67 std::lock_guard<std::mutex> lock(clientMutex_); 68 if (auto ite = acceptFds_.find(clientId); ite != acceptFds_.end()) { 69 return ite->second; 70 } 71 return 0; 72 } GetClientCountsLocalSocketServerManager73 size_t GetClientCounts() 74 { 75 std::lock_guard<std::mutex> lock(clientMutex_); 76 return acceptFds_.size(); 77 } WaitForManagerLocalSocketServerManager78 EventManager *WaitForManager(int clientId) 79 { 80 EventManager *manager = nullptr; 81 std::unique_lock<std::mutex> lock(clientMutex_); 82 cond_.wait(lock, [&manager, &clientId, this]() { 83 if (auto iter = clientEventManagers_.find(clientId); iter != clientEventManagers_.end()) { 84 manager = iter->second; 85 if (manager->HasEventListener(EVENT_MESSAGE)) { 86 return true; 87 } 88 } 89 return false; 90 }); 91 return manager; 92 } NotifyRegisterEventLocalSocketServerManager93 void NotifyRegisterEvent() 94 { 95 std::lock_guard<std::mutex> lock(clientMutex_); 96 cond_.notify_one(); 97 } AddEventManagerLocalSocketServerManager98 void AddEventManager(int clientId, EventManager *manager) 99 { 100 std::lock_guard<std::mutex> lock(clientMutex_); 101 clientEventManagers_.insert(std::make_pair(clientId, manager)); 102 cond_.notify_one(); 103 } RemoveEventManagerLocalSocketServerManager104 void RemoveEventManager(int clientId) 105 { 106 std::lock_guard<std::mutex> lock(clientMutex_); 107 if (auto ite = clientEventManagers_.find(clientId); ite != clientEventManagers_.end()) { 108 EventManager::SetInvalid(ite->second); 109 clientEventManagers_.erase(ite); 110 } 111 } RemoveAllEventManagerLocalSocketServerManager112 void RemoveAllEventManager() 113 { 114 std::lock_guard<std::mutex> lock(clientMutex_); 115 for (const auto &[id, manager] : clientEventManagers_) { 116 EventManager::SetInvalid(manager); 117 } 118 clientEventManagers_.clear(); 119 } 120 }; 121 122 class LocalSocketServerBaseContext : public LocalSocketBaseContext { 123 public: LocalSocketServerBaseContext(napi_env env,EventManager * manager)124 LocalSocketServerBaseContext(napi_env env, EventManager *manager) : LocalSocketBaseContext(env, manager) {} 125 [[nodiscard]] int GetSocketFd() const override; 126 void SetSocketFd(int sock) override; 127 }; 128 129 class LocalSocketServerListenContext final : public LocalSocketServerBaseContext { 130 public: LocalSocketServerListenContext(napi_env env,EventManager * manager)131 LocalSocketServerListenContext(napi_env env, EventManager *manager) : LocalSocketServerBaseContext(env, manager) {} 132 void ParseParams(napi_value *params, size_t paramsCount) override; 133 const std::string &GetSocketPath() const; 134 135 private: 136 std::string socketPath_; 137 }; 138 139 class LocalSocketServerGetStateContext final : public LocalSocketServerBaseContext { 140 public: LocalSocketServerGetStateContext(napi_env env,EventManager * manager)141 LocalSocketServerGetStateContext(napi_env env, EventManager *manager) : LocalSocketServerBaseContext(env, manager) 142 { 143 } 144 void ParseParams(napi_value *params, size_t paramsCount) override; 145 SocketStateBase &GetStateRef(); 146 147 private: 148 SocketStateBase state_; 149 }; 150 151 class LocalSocketServerSetExtraOptionsContext final : public LocalSocketServerBaseContext { 152 public: LocalSocketServerSetExtraOptionsContext(napi_env env,EventManager * manager)153 LocalSocketServerSetExtraOptionsContext(napi_env env, EventManager *manager) 154 : LocalSocketServerBaseContext(env, manager) 155 { 156 } 157 void ParseParams(napi_value *params, size_t paramsCount) override; 158 LocalExtraOptions &GetOptionsRef(); 159 160 private: 161 LocalExtraOptions options_; 162 }; 163 164 class LocalSocketServerGetExtraOptionsContext final : public LocalSocketServerBaseContext { 165 public: LocalSocketServerGetExtraOptionsContext(napi_env env,EventManager * manager)166 LocalSocketServerGetExtraOptionsContext(napi_env env, EventManager *manager) 167 : LocalSocketServerBaseContext(env, manager) 168 { 169 } 170 void ParseParams(napi_value *params, size_t paramsCount) override; 171 LocalExtraOptions &GetOptionsRef(); 172 173 private: 174 LocalExtraOptions options_; 175 }; 176 177 class LocalSocketServerSendContext final : public LocalSocketServerBaseContext { 178 public: LocalSocketServerSendContext(napi_env env,EventManager * manager)179 LocalSocketServerSendContext(napi_env env, EventManager *manager) : LocalSocketServerBaseContext(env, manager) {} 180 void ParseParams(napi_value *params, size_t paramsCount) override; 181 int GetAcceptFd(); 182 LocalSocketOptions &GetOptionsRef(); 183 int GetClientId() const; 184 void SetClientId(int clientId); 185 186 private: 187 bool GetData(napi_value sendOptions); 188 LocalSocketOptions options_; 189 int clientId_ = 0; 190 }; 191 192 class LocalSocketServerCloseContext final : public LocalSocketServerBaseContext { 193 public: LocalSocketServerCloseContext(napi_env env,EventManager * manager)194 LocalSocketServerCloseContext(napi_env env, EventManager *manager) : LocalSocketServerBaseContext(env, manager) {} 195 void ParseParams(napi_value *params, size_t paramsCount) override; 196 int GetClientId() const; 197 void SetClientId(int clientId); 198 199 private: 200 int clientId_ = 0; 201 }; 202 } // namespace OHOS::NetStack::Socket 203 #endif