| 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 |