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 #include "local_socket_server_context.h"
17 
18 #include "context_key.h"
19 #include "event_manager.h"
20 #include "napi_utils.h"
21 #include "netstack_log.h"
22 #include "socket_constant.h"
23 
24 namespace OHOS::NetStack::Socket {
GetSocketFd() const25 int LocalSocketServerBaseContext::GetSocketFd() const
26 {
27     if (manager_ == nullptr) {
28         return -1;
29     }
30     LocalSocketServerManager *pManagerInfo = reinterpret_cast<LocalSocketServerManager *>(manager_->GetData());
31     return (pManagerInfo != nullptr) ? pManagerInfo->sockfd_ : -1;
32 }
33 
SetSocketFd(int sock)34 void LocalSocketServerBaseContext::SetSocketFd(int sock)
35 {
36     if (manager_ == nullptr) {
37         return;
38     }
39     LocalSocketServerManager *pManagerInfo = reinterpret_cast<LocalSocketServerManager *>(manager_->GetData());
40     if (pManagerInfo != nullptr) {
41         pManagerInfo->sockfd_ = sock;
42     }
43 }
44 
ParseParams(napi_value * params,size_t paramsCount)45 void LocalSocketServerListenContext::ParseParams(napi_value *params, size_t paramsCount)
46 {
47     if (!CheckParamsWithOptions(params, paramsCount)) {
48         return;
49     }
50     if (NapiUtils::HasNamedProperty(GetEnv(), params[0], KEY_ADDRESS)) {
51         socketPath_ = NapiUtils::GetStringPropertyUtf8(GetEnv(), params[0], KEY_ADDRESS);
52     }
53     if (paramsCount == PARAM_OPTIONS_AND_CALLBACK) {
54         SetParseOK(SetCallback(params[PARAM_OPTIONS_AND_CALLBACK - 1]) == napi_ok);
55         return;
56     }
57     SetParseOK(true);
58 }
59 
GetSocketPath() const60 const std::string &LocalSocketServerListenContext::GetSocketPath() const
61 {
62     return socketPath_;
63 }
64 
ParseParams(napi_value * params,size_t paramsCount)65 void LocalSocketServerEndContext::ParseParams(napi_value *params, size_t paramsCount)
66 {
67     if (!CheckParamsWithoutOptions(params, paramsCount)) {
68         return;
69     }
70     if (paramsCount != PARAM_NONE) {
71         SetParseOK(SetCallback(params[0]) == napi_ok);
72         return;
73     }
74     SetParseOK(true);
75 }
76 
ParseParams(napi_value * params,size_t paramsCount)77 void LocalSocketServerGetStateContext::ParseParams(napi_value *params, size_t paramsCount)
78 {
79     if (!CheckParamsWithoutOptions(params, paramsCount)) {
80         return;
81     }
82     if (paramsCount != PARAM_NONE) {
83         SetParseOK(SetCallback(params[0]) == napi_ok);
84         return;
85     }
86     SetParseOK(true);
87 }
88 
GetStateRef()89 SocketStateBase &LocalSocketServerGetStateContext::GetStateRef()
90 {
91     return state_;
92 }
93 
ParseParams(napi_value * params,size_t paramsCount)94 void LocalSocketServerSetExtraOptionsContext::ParseParams(napi_value *params, size_t paramsCount)
95 {
96     if (!CheckParamsWithOptions(params, paramsCount)) {
97         return;
98     }
99     if (NapiUtils::HasNamedProperty(GetEnv(), params[0], KEY_RECEIVE_BUFFER_SIZE)) {
100         options_.SetReceiveBufferSize(NapiUtils::GetUint32Property(GetEnv(), params[0], KEY_RECEIVE_BUFFER_SIZE));
101         options_.SetRecvBufSizeFlag(true);
102     }
103 
104     if (NapiUtils::HasNamedProperty(GetEnv(), params[0], KEY_SEND_BUFFER_SIZE)) {
105         options_.SetSendBufferSize(NapiUtils::GetUint32Property(GetEnv(), params[0], KEY_SEND_BUFFER_SIZE));
106         options_.SetSendBufSizeFlag(true);
107     }
108 
109     if (NapiUtils::HasNamedProperty(GetEnv(), params[0], KEY_SOCKET_TIMEOUT)) {
110         options_.SetSocketTimeout(NapiUtils::GetUint32Property(GetEnv(), params[0], KEY_SOCKET_TIMEOUT));
111         options_.SetTimeoutFlag(true);
112     }
113 
114     if (paramsCount == PARAM_OPTIONS_AND_CALLBACK) {
115         SetParseOK(SetCallback(params[PARAM_OPTIONS_AND_CALLBACK - 1]) == napi_ok);
116         return;
117     }
118     SetParseOK(true);
119 }
120 
GetOptionsRef()121 LocalExtraOptions &LocalSocketServerSetExtraOptionsContext::GetOptionsRef()
122 {
123     return options_;
124 }
125 
ParseParams(napi_value * params,size_t paramsCount)126 void LocalSocketServerGetExtraOptionsContext::ParseParams(napi_value *params, size_t paramsCount)
127 {
128     if (!CheckParamsWithoutOptions(params, paramsCount)) {
129         return;
130     }
131     if (paramsCount != PARAM_NONE) {
132         SetParseOK(SetCallback(params[0]) == napi_ok);
133         return;
134     }
135     SetParseOK(true);
136 }
137 
GetOptionsRef()138 LocalExtraOptions &LocalSocketServerGetExtraOptionsContext::GetOptionsRef()
139 {
140     return options_;
141 }
142 
GetData(napi_value sendOptions)143 bool LocalSocketServerSendContext::GetData(napi_value sendOptions)
144 {
145     if (NapiUtils::HasNamedProperty(GetEnv(), sendOptions, KEY_TIMEOUT)) {
146         return false;
147     }
148     napi_value jsData = NapiUtils::GetNamedProperty(GetEnv(), sendOptions, KEY_DATA);
149     if (NapiUtils::GetValueType(GetEnv(), jsData) == napi_string) {
150         std::string data = NapiUtils::GetStringFromValueUtf8(GetEnv(), jsData);
151         if (data.empty()) {
152             NETSTACK_LOGE("string data is empty");
153             return true;
154         }
155         options_.SetBuffer(data);
156         return true;
157     }
158 
159     if (NapiUtils::ValueIsArrayBuffer(GetEnv(), jsData)) {
160         size_t length = 0;
161         void *data = NapiUtils::GetInfoFromArrayBufferValue(GetEnv(), jsData, &length);
162         if (data == nullptr || length == 0) {
163             NETSTACK_LOGE("arraybuffer data is empty");
164             return true;
165         }
166         options_.SetBuffer(data, length);
167         return true;
168     }
169     return false;
170 }
171 
ParseParams(napi_value * params,size_t paramsCount)172 void LocalSocketServerSendContext::ParseParams(napi_value *params, size_t paramsCount)
173 {
174     if (!CheckParamsWithOptions(params, paramsCount)) {
175         return;
176     }
177     if (NapiUtils::HasNamedProperty(GetEnv(), params[0], KEY_ENCODING)) {
178         std::string encoding = NapiUtils::GetStringPropertyUtf8(GetEnv(), params[0], KEY_ENCODING);
179         options_.SetEncoding(encoding);
180     }
181     if (!GetData(params[0])) {
182         return;
183     }
184     if (paramsCount == PARAM_OPTIONS_AND_CALLBACK) {
185         SetParseOK(SetCallback(params[1]) == napi_ok);
186         return;
187     }
188     SetParseOK(true);
189 }
190 
GetAcceptFd()191 int LocalSocketServerSendContext::GetAcceptFd()
192 {
193     if (manager_ == nullptr) {
194         return -1;
195     }
196     LocalSocketServerManager *pManagerInfo = reinterpret_cast<LocalSocketServerManager *>(manager_->GetData());
197     return (pManagerInfo != nullptr) ? pManagerInfo->GetAcceptFd(clientId_) : -1;
198 }
199 
GetOptionsRef()200 LocalSocketOptions &LocalSocketServerSendContext::GetOptionsRef()
201 {
202     return options_;
203 }
204 
GetClientId() const205 int LocalSocketServerSendContext::GetClientId() const
206 {
207     return clientId_;
208 }
209 
SetClientId(int clientId)210 void LocalSocketServerSendContext::SetClientId(int clientId)
211 {
212     clientId_ = clientId;
213 }
214 
ParseParams(napi_value * params,size_t paramsCount)215 void LocalSocketServerCloseContext::ParseParams(napi_value *params, size_t paramsCount)
216 {
217     if (!CheckParamsWithoutOptions(params, paramsCount)) {
218         return;
219     }
220     if (paramsCount != PARAM_NONE) {
221         SetParseOK(SetCallback(params[0]) == napi_ok);
222         return;
223     }
224     SetParseOK(true);
225 }
226 
GetClientId() const227 int LocalSocketServerCloseContext::GetClientId() const
228 {
229     return clientId_;
230 }
231 
SetClientId(int clientId)232 void LocalSocketServerCloseContext::SetClientId(int clientId)
233 {
234     clientId_ = clientId;
235 }
236 
ParseParams(napi_value * params,size_t paramsCount)237 void LocalSocketServerGetLocalAddressContext::ParseParams(napi_value *params, size_t paramsCount)
238 {
239     if (paramsCount != PARAM_NONE) {
240         NETSTACK_LOGE("get local address param error");
241         SetNeedThrowException(true);
242         SetError(PARSE_ERROR_CODE, PARSE_ERROR_MSG);
243         return;
244     }
245     SetParseOK(true);
246 }
247 
SetSocketPath(const std::string socketPath)248 void LocalSocketServerGetLocalAddressContext::SetSocketPath(const std::string socketPath)
249 {
250     socketPath_ = socketPath;
251 }
252 
GetSocketPath()253 std::string LocalSocketServerGetLocalAddressContext::GetSocketPath()
254 {
255     return socketPath_;
256 }
257 
GetClientId() const258 int LocalSocketServerGetLocalAddressContext::GetClientId() const
259 {
260     return clientId_;
261 }
262 
SetClientId(int clientId)263 void LocalSocketServerGetLocalAddressContext::SetClientId(int clientId)
264 {
265     clientId_ = clientId;
266 }
267 
268 } // namespace OHOS::NetStack::Socket
269