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