• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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