OLD | NEW |
1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #if !defined(DART_IO_DISABLED) | 5 #if !defined(DART_IO_DISABLED) |
6 | 6 |
7 #include "bin/sync_socket.h" | 7 #include "bin/sync_socket.h" |
8 | 8 |
9 #include "bin/dartutils.h" | 9 #include "bin/dartutils.h" |
10 #include "bin/io_buffer.h" | 10 #include "bin/io_buffer.h" |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
93 error = Dart_ListSetAt(entry, 2, data); | 93 error = Dart_ListSetAt(entry, 2, data); |
94 DART_CHECK_ERROR_AND_CLEANUP(error, addresses); | 94 DART_CHECK_ERROR_AND_CLEANUP(error, addresses); |
95 error = Dart_ListSetAt(array, i, entry); | 95 error = Dart_ListSetAt(array, i, entry); |
96 DART_CHECK_ERROR_AND_CLEANUP(error, addresses); | 96 DART_CHECK_ERROR_AND_CLEANUP(error, addresses); |
97 } | 97 } |
98 delete addresses; | 98 delete addresses; |
99 Dart_SetReturnValue(args, array); | 99 Dart_SetReturnValue(args, array); |
100 return; | 100 return; |
101 } | 101 } |
102 | 102 |
103 | |
104 void FUNCTION_NAME(SynchronousSocket_CreateConnectSync)( | 103 void FUNCTION_NAME(SynchronousSocket_CreateConnectSync)( |
105 Dart_NativeArguments args) { | 104 Dart_NativeArguments args) { |
106 RawAddr addr; | 105 RawAddr addr; |
107 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 1), &addr); | 106 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 1), &addr); |
108 Dart_Handle port_arg = Dart_GetNativeArgument(args, 2); | 107 Dart_Handle port_arg = Dart_GetNativeArgument(args, 2); |
109 DART_CHECK_ERROR(port_arg); | 108 DART_CHECK_ERROR(port_arg); |
110 int64_t port = DartUtils::GetInt64ValueCheckRange(port_arg, 0, 65535); | 109 int64_t port = DartUtils::GetInt64ValueCheckRange(port_arg, 0, 65535); |
111 SocketAddress::SetAddrPort(&addr, static_cast<intptr_t>(port)); | 110 SocketAddress::SetAddrPort(&addr, static_cast<intptr_t>(port)); |
112 intptr_t socket = SynchronousSocket::CreateConnect(addr); | 111 intptr_t socket = SynchronousSocket::CreateConnect(addr); |
113 if (socket >= 0) { | 112 if (socket >= 0) { |
114 Dart_Handle error = SynchronousSocket::SetSocketIdNativeField( | 113 Dart_Handle error = SynchronousSocket::SetSocketIdNativeField( |
115 Dart_GetNativeArgument(args, 0), new SynchronousSocket(socket)); | 114 Dart_GetNativeArgument(args, 0), new SynchronousSocket(socket)); |
116 DART_CHECK_ERROR(error); | 115 DART_CHECK_ERROR(error); |
117 Dart_SetBooleanReturnValue(args, true); | 116 Dart_SetBooleanReturnValue(args, true); |
118 } else { | 117 } else { |
119 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); | 118 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
120 } | 119 } |
121 } | 120 } |
122 | 121 |
123 | |
124 void FUNCTION_NAME(SynchronousSocket_WriteList)(Dart_NativeArguments args) { | 122 void FUNCTION_NAME(SynchronousSocket_WriteList)(Dart_NativeArguments args) { |
125 SynchronousSocket* socket = NULL; | 123 SynchronousSocket* socket = NULL; |
126 Dart_Handle result = SynchronousSocket::GetSocketIdNativeField( | 124 Dart_Handle result = SynchronousSocket::GetSocketIdNativeField( |
127 Dart_GetNativeArgument(args, 0), &socket); | 125 Dart_GetNativeArgument(args, 0), &socket); |
128 DART_CHECK_ERROR(result); | 126 DART_CHECK_ERROR(result); |
129 | 127 |
130 Dart_Handle buffer_obj = Dart_GetNativeArgument(args, 1); | 128 Dart_Handle buffer_obj = Dart_GetNativeArgument(args, 1); |
131 if (!Dart_IsList(buffer_obj)) { | 129 if (!Dart_IsList(buffer_obj)) { |
132 Dart_SetReturnValue(args, DartUtils::NewDartArgumentError( | 130 Dart_SetReturnValue(args, DartUtils::NewDartArgumentError( |
133 "First parameter must be a List<int>")); | 131 "First parameter must be a List<int>")); |
(...skipping 13 matching lines...) Expand all Loading... |
147 SynchronousSocket::Write(socket->fd(), buffer, length); | 145 SynchronousSocket::Write(socket->fd(), buffer, length); |
148 if (bytes_written >= 0) { | 146 if (bytes_written >= 0) { |
149 Dart_SetIntegerReturnValue(args, bytes_written); | 147 Dart_SetIntegerReturnValue(args, bytes_written); |
150 } else { | 148 } else { |
151 OSError os_error; | 149 OSError os_error; |
152 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error)); | 150 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error)); |
153 } | 151 } |
154 Dart_TypedDataReleaseData(buffer_obj); | 152 Dart_TypedDataReleaseData(buffer_obj); |
155 } | 153 } |
156 | 154 |
157 | |
158 void FUNCTION_NAME(SynchronousSocket_ReadList)(Dart_NativeArguments args) { | 155 void FUNCTION_NAME(SynchronousSocket_ReadList)(Dart_NativeArguments args) { |
159 SynchronousSocket* socket = NULL; | 156 SynchronousSocket* socket = NULL; |
160 Dart_Handle result = SynchronousSocket::GetSocketIdNativeField( | 157 Dart_Handle result = SynchronousSocket::GetSocketIdNativeField( |
161 Dart_GetNativeArgument(args, 0), &socket); | 158 Dart_GetNativeArgument(args, 0), &socket); |
162 DART_CHECK_ERROR(result); | 159 DART_CHECK_ERROR(result); |
163 | 160 |
164 Dart_Handle buffer_obj = Dart_GetNativeArgument(args, 1); | 161 Dart_Handle buffer_obj = Dart_GetNativeArgument(args, 1); |
165 if (!Dart_IsList(buffer_obj)) { | 162 if (!Dart_IsList(buffer_obj)) { |
166 Dart_SetReturnValue(args, DartUtils::NewDartArgumentError( | 163 Dart_SetReturnValue(args, DartUtils::NewDartArgumentError( |
167 "First parameter must be a List<int>")); | 164 "First parameter must be a List<int>")); |
(...skipping 12 matching lines...) Expand all Loading... |
180 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); | 177 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
181 return; | 178 return; |
182 } | 179 } |
183 if (bytes_read > 0) { | 180 if (bytes_read > 0) { |
184 result = Dart_ListSetAsBytes(buffer_obj, offset, buffer, bytes_read); | 181 result = Dart_ListSetAsBytes(buffer_obj, offset, buffer, bytes_read); |
185 DART_CHECK_ERROR(result); | 182 DART_CHECK_ERROR(result); |
186 } | 183 } |
187 Dart_SetIntegerReturnValue(args, bytes_read); | 184 Dart_SetIntegerReturnValue(args, bytes_read); |
188 } | 185 } |
189 | 186 |
190 | |
191 void FUNCTION_NAME(SynchronousSocket_Available)(Dart_NativeArguments args) { | 187 void FUNCTION_NAME(SynchronousSocket_Available)(Dart_NativeArguments args) { |
192 SynchronousSocket* socket = NULL; | 188 SynchronousSocket* socket = NULL; |
193 Dart_Handle result = SynchronousSocket::GetSocketIdNativeField( | 189 Dart_Handle result = SynchronousSocket::GetSocketIdNativeField( |
194 Dart_GetNativeArgument(args, 0), &socket); | 190 Dart_GetNativeArgument(args, 0), &socket); |
195 DART_CHECK_ERROR(result); | 191 DART_CHECK_ERROR(result); |
196 | 192 |
197 intptr_t available = SynchronousSocket::Available(socket->fd()); | 193 intptr_t available = SynchronousSocket::Available(socket->fd()); |
198 if (available >= 0) { | 194 if (available >= 0) { |
199 Dart_SetIntegerReturnValue(args, available); | 195 Dart_SetIntegerReturnValue(args, available); |
200 } else { | 196 } else { |
201 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); | 197 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
202 } | 198 } |
203 } | 199 } |
204 | 200 |
205 | |
206 void FUNCTION_NAME(SynchronousSocket_CloseSync)(Dart_NativeArguments args) { | 201 void FUNCTION_NAME(SynchronousSocket_CloseSync)(Dart_NativeArguments args) { |
207 SynchronousSocket* socket = NULL; | 202 SynchronousSocket* socket = NULL; |
208 Dart_Handle result = SynchronousSocket::GetSocketIdNativeField( | 203 Dart_Handle result = SynchronousSocket::GetSocketIdNativeField( |
209 Dart_GetNativeArgument(args, 0), &socket); | 204 Dart_GetNativeArgument(args, 0), &socket); |
210 DART_CHECK_ERROR(result); | 205 DART_CHECK_ERROR(result); |
211 | 206 |
212 SynchronousSocket::Close(socket->fd()); | 207 SynchronousSocket::Close(socket->fd()); |
213 socket->SetClosedFd(); | 208 socket->SetClosedFd(); |
214 } | 209 } |
215 | 210 |
216 | |
217 void FUNCTION_NAME(SynchronousSocket_Read)(Dart_NativeArguments args) { | 211 void FUNCTION_NAME(SynchronousSocket_Read)(Dart_NativeArguments args) { |
218 SynchronousSocket* socket = NULL; | 212 SynchronousSocket* socket = NULL; |
219 Dart_Handle result = SynchronousSocket::GetSocketIdNativeField( | 213 Dart_Handle result = SynchronousSocket::GetSocketIdNativeField( |
220 Dart_GetNativeArgument(args, 0), &socket); | 214 Dart_GetNativeArgument(args, 0), &socket); |
221 DART_CHECK_ERROR(result); | 215 DART_CHECK_ERROR(result); |
222 | 216 |
223 int64_t length = 0; | 217 int64_t length = 0; |
224 if (!DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 1), &length)) { | 218 if (!DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 1), &length)) { |
225 Dart_SetReturnValue(args, DartUtils::NewDartArgumentError( | 219 Dart_SetReturnValue(args, DartUtils::NewDartArgumentError( |
226 "First parameter must be an integer.")); | 220 "First parameter must be an integer.")); |
227 return; | 221 return; |
228 } | 222 } |
229 uint8_t* buffer = NULL; | 223 uint8_t* buffer = NULL; |
230 result = IOBuffer::Allocate(length, &buffer); | 224 result = IOBuffer::Allocate(length, &buffer); |
231 ASSERT(buffer != NULL); | 225 ASSERT(buffer != NULL); |
232 intptr_t bytes_read = SynchronousSocket::Read(socket->fd(), buffer, length); | 226 intptr_t bytes_read = SynchronousSocket::Read(socket->fd(), buffer, length); |
233 if (bytes_read == length) { | 227 if (bytes_read == length) { |
234 Dart_SetReturnValue(args, result); | 228 Dart_SetReturnValue(args, result); |
235 } else if (bytes_read > 0) { | 229 } else if (bytes_read > 0) { |
236 uint8_t* new_buffer = NULL; | 230 uint8_t* new_buffer = NULL; |
237 Dart_Handle new_result = IOBuffer::Allocate(bytes_read, &new_buffer); | 231 Dart_Handle new_result = IOBuffer::Allocate(bytes_read, &new_buffer); |
238 ASSERT(new_buffer != NULL); | 232 ASSERT(new_buffer != NULL); |
239 memmove(new_buffer, buffer, bytes_read); | 233 memmove(new_buffer, buffer, bytes_read); |
240 Dart_SetReturnValue(args, new_result); | 234 Dart_SetReturnValue(args, new_result); |
241 } else if (bytes_read == -1) { | 235 } else if (bytes_read == -1) { |
242 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); | 236 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
243 } | 237 } |
244 } | 238 } |
245 | 239 |
246 | |
247 void FUNCTION_NAME(SynchronousSocket_ShutdownRead)(Dart_NativeArguments args) { | 240 void FUNCTION_NAME(SynchronousSocket_ShutdownRead)(Dart_NativeArguments args) { |
248 SynchronousSocket* socket = NULL; | 241 SynchronousSocket* socket = NULL; |
249 Dart_Handle result = SynchronousSocket::GetSocketIdNativeField( | 242 Dart_Handle result = SynchronousSocket::GetSocketIdNativeField( |
250 Dart_GetNativeArgument(args, 0), &socket); | 243 Dart_GetNativeArgument(args, 0), &socket); |
251 DART_CHECK_ERROR(result); | 244 DART_CHECK_ERROR(result); |
252 | 245 |
253 SynchronousSocket::ShutdownRead(socket->fd()); | 246 SynchronousSocket::ShutdownRead(socket->fd()); |
254 } | 247 } |
255 | 248 |
256 | |
257 void FUNCTION_NAME(SynchronousSocket_ShutdownWrite)(Dart_NativeArguments args) { | 249 void FUNCTION_NAME(SynchronousSocket_ShutdownWrite)(Dart_NativeArguments args) { |
258 SynchronousSocket* socket = NULL; | 250 SynchronousSocket* socket = NULL; |
259 Dart_Handle result = SynchronousSocket::GetSocketIdNativeField( | 251 Dart_Handle result = SynchronousSocket::GetSocketIdNativeField( |
260 Dart_GetNativeArgument(args, 0), &socket); | 252 Dart_GetNativeArgument(args, 0), &socket); |
261 DART_CHECK_ERROR(result); | 253 DART_CHECK_ERROR(result); |
262 | 254 |
263 SynchronousSocket::ShutdownWrite(socket->fd()); | 255 SynchronousSocket::ShutdownWrite(socket->fd()); |
264 } | 256 } |
265 | 257 |
266 | |
267 void FUNCTION_NAME(SynchronousSocket_GetPort)(Dart_NativeArguments args) { | 258 void FUNCTION_NAME(SynchronousSocket_GetPort)(Dart_NativeArguments args) { |
268 SynchronousSocket* socket = NULL; | 259 SynchronousSocket* socket = NULL; |
269 Dart_Handle result = SynchronousSocket::GetSocketIdNativeField( | 260 Dart_Handle result = SynchronousSocket::GetSocketIdNativeField( |
270 Dart_GetNativeArgument(args, 0), &socket); | 261 Dart_GetNativeArgument(args, 0), &socket); |
271 DART_CHECK_ERROR(result); | 262 DART_CHECK_ERROR(result); |
272 | 263 |
273 intptr_t port = SynchronousSocket::GetPort(socket->fd()); | 264 intptr_t port = SynchronousSocket::GetPort(socket->fd()); |
274 if (port > 0) { | 265 if (port > 0) { |
275 Dart_SetReturnValue(args, Dart_NewInteger(port)); | 266 Dart_SetReturnValue(args, Dart_NewInteger(port)); |
276 } else { | 267 } else { |
277 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); | 268 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
278 } | 269 } |
279 } | 270 } |
280 | 271 |
281 | |
282 void FUNCTION_NAME(SynchronousSocket_GetRemotePeer)(Dart_NativeArguments args) { | 272 void FUNCTION_NAME(SynchronousSocket_GetRemotePeer)(Dart_NativeArguments args) { |
283 SynchronousSocket* socket = NULL; | 273 SynchronousSocket* socket = NULL; |
284 Dart_Handle result = SynchronousSocket::GetSocketIdNativeField( | 274 Dart_Handle result = SynchronousSocket::GetSocketIdNativeField( |
285 Dart_GetNativeArgument(args, 0), &socket); | 275 Dart_GetNativeArgument(args, 0), &socket); |
286 DART_CHECK_ERROR(result); | 276 DART_CHECK_ERROR(result); |
287 | 277 |
288 intptr_t port = 0; | 278 intptr_t port = 0; |
289 SocketAddress* addr = SynchronousSocket::GetRemotePeer(socket->fd(), &port); | 279 SocketAddress* addr = SynchronousSocket::GetRemotePeer(socket->fd(), &port); |
290 if (addr == NULL) { | 280 if (addr == NULL) { |
291 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); | 281 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
(...skipping 17 matching lines...) Expand all Loading... |
309 DART_CHECK_ERROR_AND_CLEANUP(error, addr); | 299 DART_CHECK_ERROR_AND_CLEANUP(error, addr); |
310 | 300 |
311 error = Dart_ListSetAt(list, 0, entry); | 301 error = Dart_ListSetAt(list, 0, entry); |
312 DART_CHECK_ERROR_AND_CLEANUP(error, addr); | 302 DART_CHECK_ERROR_AND_CLEANUP(error, addr); |
313 error = Dart_ListSetAt(list, 1, Dart_NewInteger(port)); | 303 error = Dart_ListSetAt(list, 1, Dart_NewInteger(port)); |
314 DART_CHECK_ERROR_AND_CLEANUP(error, addr); | 304 DART_CHECK_ERROR_AND_CLEANUP(error, addr); |
315 Dart_SetReturnValue(args, list); | 305 Dart_SetReturnValue(args, list); |
316 delete addr; | 306 delete addr; |
317 } | 307 } |
318 | 308 |
319 | |
320 static void SynchronousSocketFinalizer(void* isolate_data, | 309 static void SynchronousSocketFinalizer(void* isolate_data, |
321 Dart_WeakPersistentHandle handle, | 310 Dart_WeakPersistentHandle handle, |
322 void* data) { | 311 void* data) { |
323 SynchronousSocket* socket = reinterpret_cast<SynchronousSocket*>(data); | 312 SynchronousSocket* socket = reinterpret_cast<SynchronousSocket*>(data); |
324 if (socket->fd() >= 0) { | 313 if (socket->fd() >= 0) { |
325 SynchronousSocket::Close(socket->fd()); | 314 SynchronousSocket::Close(socket->fd()); |
326 socket->SetClosedFd(); | 315 socket->SetClosedFd(); |
327 } | 316 } |
328 delete socket; | 317 delete socket; |
329 } | 318 } |
330 | 319 |
331 | |
332 Dart_Handle SynchronousSocket::SetSocketIdNativeField( | 320 Dart_Handle SynchronousSocket::SetSocketIdNativeField( |
333 Dart_Handle handle, | 321 Dart_Handle handle, |
334 SynchronousSocket* socket) { | 322 SynchronousSocket* socket) { |
335 Dart_Handle error = Dart_SetNativeInstanceField( | 323 Dart_Handle error = Dart_SetNativeInstanceField( |
336 handle, kSocketIdNativeField, reinterpret_cast<intptr_t>(socket)); | 324 handle, kSocketIdNativeField, reinterpret_cast<intptr_t>(socket)); |
337 if (Dart_IsError(error)) { | 325 if (Dart_IsError(error)) { |
338 delete socket; | 326 delete socket; |
339 return error; | 327 return error; |
340 } | 328 } |
341 | 329 |
342 Dart_NewWeakPersistentHandle(handle, reinterpret_cast<void*>(socket), | 330 Dart_NewWeakPersistentHandle(handle, reinterpret_cast<void*>(socket), |
343 sizeof(SynchronousSocket), | 331 sizeof(SynchronousSocket), |
344 SynchronousSocketFinalizer); | 332 SynchronousSocketFinalizer); |
345 return error; | 333 return error; |
346 } | 334 } |
347 | 335 |
348 | |
349 Dart_Handle SynchronousSocket::GetSocketIdNativeField( | 336 Dart_Handle SynchronousSocket::GetSocketIdNativeField( |
350 Dart_Handle socket_obj, | 337 Dart_Handle socket_obj, |
351 SynchronousSocket** socket) { | 338 SynchronousSocket** socket) { |
352 ASSERT(socket != NULL); | 339 ASSERT(socket != NULL); |
353 intptr_t id; | 340 intptr_t id; |
354 Dart_Handle result = | 341 Dart_Handle result = |
355 Dart_GetNativeInstanceField(socket_obj, kSocketIdNativeField, &id); | 342 Dart_GetNativeInstanceField(socket_obj, kSocketIdNativeField, &id); |
356 if (Dart_IsError(result)) { | 343 if (Dart_IsError(result)) { |
357 return result; | 344 return result; |
358 } | 345 } |
359 *socket = reinterpret_cast<SynchronousSocket*>(id); | 346 *socket = reinterpret_cast<SynchronousSocket*>(id); |
360 return result; | 347 return result; |
361 } | 348 } |
362 | 349 |
363 } // namespace bin | 350 } // namespace bin |
364 } // namespace dart | 351 } // namespace dart |
365 | 352 |
366 #endif // !defined(DART_IO_DISABLED) | 353 #endif // !defined(DART_IO_DISABLED) |
OLD | NEW |