| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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 #include "bin/io_buffer.h" | 5 #include "bin/io_buffer.h" |
| 6 #include "bin/isolate_data.h" | 6 #include "bin/isolate_data.h" |
| 7 #include "bin/socket.h" | 7 #include "bin/socket.h" |
| 8 #include "bin/dartutils.h" | 8 #include "bin/dartutils.h" |
| 9 #include "bin/thread.h" | 9 #include "bin/thread.h" |
| 10 #include "bin/utils.h" | 10 #include "bin/utils.h" |
| 11 | 11 |
| 12 #include "platform/globals.h" | 12 #include "platform/globals.h" |
| 13 #include "platform/thread.h" | 13 #include "platform/thread.h" |
| 14 #include "platform/utils.h" | 14 #include "platform/utils.h" |
| 15 | 15 |
| 16 #include "include/dart_api.h" | 16 #include "include/dart_api.h" |
| 17 | 17 |
| 18 namespace dart { | 18 namespace dart { |
| 19 namespace bin { | 19 namespace bin { |
| 20 | 20 |
| 21 static const int kSocketIdNativeField = 0; | 21 static const int kSocketIdNativeField = 0; |
| 22 | 22 |
| 23 dart::Mutex* Socket::mutex_ = new dart::Mutex(); | 23 dart::Mutex* Socket::mutex_ = new dart::Mutex(); |
| 24 int Socket::service_ports_size_ = 0; | 24 int Socket::service_ports_size_ = 0; |
| 25 Dart_Port* Socket::service_ports_ = NULL; | 25 Dart_Port* Socket::service_ports_ = NULL; |
| 26 int Socket::service_ports_index_ = 0; | 26 int Socket::service_ports_index_ = 0; |
| 27 | 27 |
| 28 | 28 |
| 29 static void GetSockAddr(Dart_Handle obj, RawAddr* addr) { | |
| 30 Dart_TypedData_Type data_type; | |
| 31 uint8_t* data = NULL; | |
| 32 intptr_t len; | |
| 33 Dart_Handle result = Dart_TypedDataAcquireData( | |
| 34 obj, &data_type, reinterpret_cast<void**>(&data), &len); | |
| 35 if (Dart_IsError(result)) Dart_PropagateError(result); | |
| 36 if (data_type != Dart_TypedData_kUint8) { | |
| 37 Dart_PropagateError(Dart_NewApiError("Unexpected type for socket address")); | |
| 38 } | |
| 39 memmove(reinterpret_cast<void *>(addr), data, len); | |
| 40 Dart_TypedDataReleaseData(obj); | |
| 41 } | |
| 42 | |
| 43 | |
| 44 void FUNCTION_NAME(InternetAddress_Fixed)(Dart_NativeArguments args) { | |
| 45 int64_t id = 0; | |
| 46 bool ok = DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 0), &id); | |
| 47 ASSERT(ok); | |
| 48 USE(ok); | |
| 49 RawAddr raw; | |
| 50 memset(&raw, 0, sizeof(raw)); | |
| 51 switch (id) { | |
| 52 case SocketAddress::ADDRESS_LOOPBACK_IP_V4: { | |
| 53 raw.in.sin_family = AF_INET; | |
| 54 raw.in.sin_addr.s_addr = htonl(INADDR_LOOPBACK); | |
| 55 break; | |
| 56 } | |
| 57 case SocketAddress::ADDRESS_LOOPBACK_IP_V6: { | |
| 58 raw.in6.sin6_family = AF_INET6; | |
| 59 raw.in6.sin6_addr = in6addr_loopback; | |
| 60 break; | |
| 61 } | |
| 62 case SocketAddress::ADDRESS_ANY_IP_V4: { | |
| 63 raw.in.sin_family = AF_INET; | |
| 64 raw.in.sin_addr.s_addr = INADDR_ANY; | |
| 65 break; | |
| 66 } | |
| 67 case SocketAddress::ADDRESS_ANY_IP_V6: { | |
| 68 raw.in6.sin6_family = AF_INET6; | |
| 69 raw.in6.sin6_addr = in6addr_any; | |
| 70 break; | |
| 71 } | |
| 72 default: | |
| 73 Dart_Handle error = DartUtils::NewDartArgumentError(""); | |
| 74 if (Dart_IsError(error)) Dart_PropagateError(error); | |
| 75 Dart_ThrowException(error); | |
| 76 } | |
| 77 Dart_SetReturnValue(args, SocketAddress::ToTypedData(&raw)); | |
| 78 } | |
| 79 | |
| 80 | |
| 81 void FUNCTION_NAME(InternetAddress_Parse)(Dart_NativeArguments args) { | 29 void FUNCTION_NAME(InternetAddress_Parse)(Dart_NativeArguments args) { |
| 82 int64_t type = 0; | |
| 83 bool ok = DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 0), &type); | |
| 84 ASSERT(ok); | |
| 85 USE(ok); | |
| 86 const char* address = | 30 const char* address = |
| 87 DartUtils::GetStringValue(Dart_GetNativeArgument(args, 1)); | 31 DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0)); |
| 88 ASSERT(address != NULL); | 32 ASSERT(address != NULL); |
| 89 RawAddr raw; | 33 RawAddr raw; |
| 90 memset(&raw, 0, sizeof(raw)); | 34 memset(&raw, 0, sizeof(raw)); |
| 35 int type = strchr(address, ':') == NULL ? SocketAddress::TYPE_IPV4 |
| 36 : SocketAddress::TYPE_IPV6; |
| 91 if (type == SocketAddress::TYPE_IPV4) { | 37 if (type == SocketAddress::TYPE_IPV4) { |
| 92 raw.addr.sa_family = AF_INET; | 38 raw.addr.sa_family = AF_INET; |
| 93 } else { | 39 } else { |
| 94 ASSERT(type == SocketAddress::TYPE_IPV6); | |
| 95 raw.addr.sa_family = AF_INET6; | 40 raw.addr.sa_family = AF_INET6; |
| 96 } | 41 } |
| 97 ok = Socket::ParseAddress(type, address, &raw); | 42 bool ok = Socket::ParseAddress(type, address, &raw); |
| 98 if (!ok) { | 43 if (!ok) { |
| 99 Dart_SetReturnValue(args, Dart_Null()); | 44 Dart_SetReturnValue(args, Dart_Null()); |
| 100 } else { | 45 } else { |
| 101 Dart_SetReturnValue(args, SocketAddress::ToTypedData(&raw)); | 46 Dart_SetReturnValue(args, SocketAddress::ToTypedData(&raw)); |
| 102 } | 47 } |
| 103 } | 48 } |
| 104 | 49 |
| 105 | 50 |
| 106 void FUNCTION_NAME(Socket_CreateConnect)(Dart_NativeArguments args) { | 51 void FUNCTION_NAME(Socket_CreateConnect)(Dart_NativeArguments args) { |
| 107 RawAddr addr; | 52 RawAddr addr; |
| 108 GetSockAddr(Dart_GetNativeArgument(args, 1), &addr); | 53 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 1), &addr); |
| 109 Dart_Handle port_arg = Dart_GetNativeArgument(args, 2); | 54 Dart_Handle port_arg = Dart_GetNativeArgument(args, 2); |
| 110 int64_t port = DartUtils::GetInt64ValueCheckRange(port_arg, 0, 65535); | 55 int64_t port = DartUtils::GetInt64ValueCheckRange(port_arg, 0, 65535); |
| 111 intptr_t socket = Socket::CreateConnect(addr, port); | 56 intptr_t socket = Socket::CreateConnect(addr, port); |
| 112 OSError error; | 57 OSError error; |
| 113 if (socket >= 0) { | 58 if (socket >= 0) { |
| 114 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), socket); | 59 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), socket); |
| 115 Dart_SetReturnValue(args, Dart_True()); | 60 Dart_SetReturnValue(args, Dart_True()); |
| 116 } else { | 61 } else { |
| 117 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&error)); | 62 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&error)); |
| 118 } | 63 } |
| 119 } | 64 } |
| 120 | 65 |
| 121 | 66 |
| 122 void FUNCTION_NAME(Socket_CreateBindDatagram)(Dart_NativeArguments args) { | 67 void FUNCTION_NAME(Socket_CreateBindDatagram)(Dart_NativeArguments args) { |
| 123 RawAddr addr; | 68 RawAddr addr; |
| 124 GetSockAddr(Dart_GetNativeArgument(args, 1), &addr); | 69 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 1), &addr); |
| 125 Dart_Handle port_arg = Dart_GetNativeArgument(args, 2); | 70 Dart_Handle port_arg = Dart_GetNativeArgument(args, 2); |
| 126 int64_t port = DartUtils::GetInt64ValueCheckRange(port_arg, 0, 65535); | 71 int64_t port = DartUtils::GetInt64ValueCheckRange(port_arg, 0, 65535); |
| 127 bool reuse_addr = DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 3)); | 72 bool reuse_addr = DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 3)); |
| 128 intptr_t socket = Socket::CreateBindDatagram(&addr, port, reuse_addr); | 73 intptr_t socket = Socket::CreateBindDatagram(&addr, port, reuse_addr); |
| 129 if (socket >= 0) { | 74 if (socket >= 0) { |
| 130 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), socket); | 75 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), socket); |
| 131 Dart_SetReturnValue(args, Dart_True()); | 76 Dart_SetReturnValue(args, Dart_True()); |
| 132 } else { | 77 } else { |
| 133 OSError error; | 78 OSError error; |
| 134 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&error)); | 79 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&error)); |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 238 addr.in.sin_port = 0; | 183 addr.in.sin_port = 0; |
| 239 } else { | 184 } else { |
| 240 ASSERT(addr.addr.sa_family == AF_INET6); | 185 ASSERT(addr.addr.sa_family == AF_INET6); |
| 241 addr.in6.sin6_port = 0; | 186 addr.in6.sin6_port = 0; |
| 242 } | 187 } |
| 243 // Format the address to a string using the numeric format. | 188 // Format the address to a string using the numeric format. |
| 244 char numeric_address[INET6_ADDRSTRLEN]; | 189 char numeric_address[INET6_ADDRSTRLEN]; |
| 245 Socket::FormatNumericAddress(&addr, numeric_address, INET6_ADDRSTRLEN); | 190 Socket::FormatNumericAddress(&addr, numeric_address, INET6_ADDRSTRLEN); |
| 246 | 191 |
| 247 // Create a Datagram object with the data and sender address and port. | 192 // Create a Datagram object with the data and sender address and port. |
| 248 const int kNumArgs = 5; | 193 const int kNumArgs = 4; |
| 249 Dart_Handle dart_args[kNumArgs]; | 194 Dart_Handle dart_args[kNumArgs]; |
| 250 dart_args[0] = data; | 195 dart_args[0] = data; |
| 251 dart_args[1] = Dart_NewBoolean(addr.addr.sa_family == AF_INET6); | 196 dart_args[1] = Dart_NewStringFromCString(numeric_address); |
| 252 dart_args[2] = Dart_NewStringFromCString(numeric_address); | 197 if (Dart_IsError(dart_args[1])) Dart_PropagateError(dart_args[1]); |
| 253 if (Dart_IsError(dart_args[2])) Dart_PropagateError(dart_args[2]); | 198 dart_args[2] = SocketAddress::ToTypedData(&addr); |
| 254 int len = SocketAddress::GetAddrLength(&addr); | 199 dart_args[3] = Dart_NewInteger(port); |
| 255 dart_args[3] = Dart_NewTypedData(Dart_TypedData_kUint8, len); | |
| 256 if (Dart_IsError(dart_args[3])) Dart_PropagateError(dart_args[3]); | 200 if (Dart_IsError(dart_args[3])) Dart_PropagateError(dart_args[3]); |
| 257 Dart_Handle err = Dart_ListSetAsBytes( | |
| 258 dart_args[3], 0, reinterpret_cast<uint8_t *>(&addr), len); | |
| 259 if (Dart_IsError(err)) Dart_PropagateError(err); | |
| 260 dart_args[4] = Dart_NewInteger(port); | |
| 261 if (Dart_IsError(dart_args[4])) Dart_PropagateError(dart_args[4]); | |
| 262 // TODO(sgjesse): Cache the _makeDatagram function somewhere. | 201 // TODO(sgjesse): Cache the _makeDatagram function somewhere. |
| 263 Dart_Handle io_lib = | 202 Dart_Handle io_lib = |
| 264 Dart_LookupLibrary(DartUtils::NewString("dart:io")); | 203 Dart_LookupLibrary(DartUtils::NewString("dart:io")); |
| 265 if (Dart_IsError(io_lib)) Dart_PropagateError(io_lib); | 204 if (Dart_IsError(io_lib)) Dart_PropagateError(io_lib); |
| 266 Dart_Handle result = | 205 Dart_Handle result = |
| 267 Dart_Invoke(io_lib, | 206 Dart_Invoke(io_lib, |
| 268 DartUtils::NewString("_makeDatagram"), | 207 DartUtils::NewString("_makeDatagram"), |
| 269 kNumArgs, | 208 kNumArgs, |
| 270 dart_args); | 209 dart_args); |
| 271 if (Dart_IsError(result)) Dart_PropagateError(result); | 210 if (Dart_IsError(result)) Dart_PropagateError(result); |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 311 intptr_t socket = | 250 intptr_t socket = |
| 312 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); | 251 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); |
| 313 Dart_Handle buffer_obj = Dart_GetNativeArgument(args, 1); | 252 Dart_Handle buffer_obj = Dart_GetNativeArgument(args, 1); |
| 314 intptr_t offset = | 253 intptr_t offset = |
| 315 DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 2)); | 254 DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 2)); |
| 316 intptr_t length = | 255 intptr_t length = |
| 317 DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 3)); | 256 DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 3)); |
| 318 Dart_Handle address_obj = Dart_GetNativeArgument(args, 4); | 257 Dart_Handle address_obj = Dart_GetNativeArgument(args, 4); |
| 319 ASSERT(Dart_IsList(address_obj)); | 258 ASSERT(Dart_IsList(address_obj)); |
| 320 RawAddr addr; | 259 RawAddr addr; |
| 321 GetSockAddr(address_obj, &addr); | 260 SocketAddress::GetSockAddr(address_obj, &addr); |
| 322 int64_t port = DartUtils::GetInt64ValueCheckRange( | 261 int64_t port = DartUtils::GetInt64ValueCheckRange( |
| 323 Dart_GetNativeArgument(args, 5), | 262 Dart_GetNativeArgument(args, 5), |
| 324 0, | 263 0, |
| 325 65535); | 264 65535); |
| 326 SocketAddress::SetAddrPort(&addr, port); | 265 SocketAddress::SetAddrPort(&addr, port); |
| 327 Dart_TypedData_Type type; | 266 Dart_TypedData_Type type; |
| 328 uint8_t* buffer = NULL; | 267 uint8_t* buffer = NULL; |
| 329 intptr_t len; | 268 intptr_t len; |
| 330 Dart_Handle result = Dart_TypedDataAcquireData( | 269 Dart_Handle result = Dart_TypedDataAcquireData( |
| 331 buffer_obj, &type, reinterpret_cast<void**>(&buffer), &len); | 270 buffer_obj, &type, reinterpret_cast<void**>(&buffer), &len); |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 420 | 359 |
| 421 void FUNCTION_NAME(Socket_SetSocketId)(Dart_NativeArguments args) { | 360 void FUNCTION_NAME(Socket_SetSocketId)(Dart_NativeArguments args) { |
| 422 intptr_t id = | 361 intptr_t id = |
| 423 DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 1)); | 362 DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 1)); |
| 424 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), id); | 363 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), id); |
| 425 } | 364 } |
| 426 | 365 |
| 427 | 366 |
| 428 void FUNCTION_NAME(ServerSocket_CreateBindListen)(Dart_NativeArguments args) { | 367 void FUNCTION_NAME(ServerSocket_CreateBindListen)(Dart_NativeArguments args) { |
| 429 RawAddr addr; | 368 RawAddr addr; |
| 430 GetSockAddr(Dart_GetNativeArgument(args, 1), &addr); | 369 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 1), &addr); |
| 431 int64_t port = DartUtils::GetInt64ValueCheckRange( | 370 int64_t port = DartUtils::GetInt64ValueCheckRange( |
| 432 Dart_GetNativeArgument(args, 2), | 371 Dart_GetNativeArgument(args, 2), |
| 433 0, | 372 0, |
| 434 65535); | 373 65535); |
| 435 int64_t backlog = DartUtils::GetInt64ValueCheckRange( | 374 int64_t backlog = DartUtils::GetInt64ValueCheckRange( |
| 436 Dart_GetNativeArgument(args, 3), | 375 Dart_GetNativeArgument(args, 3), |
| 437 0, | 376 0, |
| 438 65535); | 377 65535); |
| 439 bool v6_only = DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 4)); | 378 bool v6_only = DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 4)); |
| 440 intptr_t socket = ServerSocket::CreateBindListen( | 379 intptr_t socket = ServerSocket::CreateBindListen( |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 489 | 428 |
| 490 CObjectInt32* type = new CObjectInt32( | 429 CObjectInt32* type = new CObjectInt32( |
| 491 CObject::NewInt32(addr->GetType())); | 430 CObject::NewInt32(addr->GetType())); |
| 492 entry->SetAt(0, type); | 431 entry->SetAt(0, type); |
| 493 | 432 |
| 494 CObjectString* as_string = new CObjectString(CObject::NewString( | 433 CObjectString* as_string = new CObjectString(CObject::NewString( |
| 495 addr->as_string())); | 434 addr->as_string())); |
| 496 entry->SetAt(1, as_string); | 435 entry->SetAt(1, as_string); |
| 497 | 436 |
| 498 RawAddr raw = addr->addr(); | 437 RawAddr raw = addr->addr(); |
| 499 CObjectUint8Array* data = new CObjectUint8Array(CObject::NewUint8Array( | 438 CObjectUint8Array* data = SocketAddress::ToCObject(&raw); |
| 500 SocketAddress::GetAddrLength(&raw))); | 439 entry->SetAt(2, data); |
| 501 memmove(data->Buffer(), | |
| 502 reinterpret_cast<void *>(&raw), | |
| 503 SocketAddress::GetAddrLength(&raw)); | |
| 504 | 440 |
| 505 entry->SetAt(2, data); | |
| 506 array->SetAt(i + 1, entry); | 441 array->SetAt(i + 1, entry); |
| 507 } | 442 } |
| 508 result = array; | 443 result = array; |
| 509 delete addresses; | 444 delete addresses; |
| 510 } else { | 445 } else { |
| 511 result = CObject::NewOSError(os_error); | 446 result = CObject::NewOSError(os_error); |
| 512 delete os_error; | 447 delete os_error; |
| 513 } | 448 } |
| 514 return result; | 449 return result; |
| 515 } | 450 } |
| 516 return CObject::IllegalArgumentError(); | 451 return CObject::IllegalArgumentError(); |
| 517 } | 452 } |
| 518 | 453 |
| 519 | 454 |
| 520 CObject* Socket::ReverseLookupRequest(const CObjectArray& request) { | 455 CObject* Socket::ReverseLookupRequest(const CObjectArray& request) { |
| 521 if (request.Length() == 1 && | 456 if (request.Length() == 1 && |
| 522 request[0]->IsTypedData()) { | 457 request[0]->IsTypedData()) { |
| 523 CObjectUint8Array addr_object(request[0]); | 458 CObjectUint8Array addr_object(request[0]); |
| 524 RawAddr addr; | 459 RawAddr addr; |
| 525 memmove(reinterpret_cast<void *>(&addr), | 460 int len = addr_object.Length(); |
| 526 addr_object.Buffer(), | 461 memset(reinterpret_cast<void*>(&addr), 0, sizeof(RawAddr)); |
| 527 addr_object.Length()); | 462 if (len == sizeof(in_addr)) { |
| 463 addr.in.sin_family = AF_INET; |
| 464 memmove(reinterpret_cast<void*>(&addr.in.sin_addr), |
| 465 addr_object.Buffer(), |
| 466 len); |
| 467 } else { |
| 468 ASSERT(len == sizeof(in6_addr)); |
| 469 addr.in6.sin6_family = AF_INET6; |
| 470 memmove(reinterpret_cast<void*>(&addr.in6.sin6_addr), |
| 471 addr_object.Buffer(), |
| 472 len); |
| 473 } |
| 474 |
| 528 OSError* os_error = NULL; | 475 OSError* os_error = NULL; |
| 529 const intptr_t kMaxHostLength = 1025; | 476 const intptr_t kMaxHostLength = 1025; |
| 530 char host[kMaxHostLength]; | 477 char host[kMaxHostLength]; |
| 531 if (Socket::ReverseLookup(addr, host, kMaxHostLength, &os_error)) { | 478 if (Socket::ReverseLookup(addr, host, kMaxHostLength, &os_error)) { |
| 532 return new CObjectString(CObject::NewString(host)); | 479 return new CObjectString(CObject::NewString(host)); |
| 533 } else { | 480 } else { |
| 534 CObject* result = CObject::NewOSError(os_error); | 481 CObject* result = CObject::NewOSError(os_error); |
| 535 delete os_error; | 482 delete os_error; |
| 536 return result; | 483 return result; |
| 537 } | 484 } |
| (...skipping 21 matching lines...) Expand all Loading... |
| 559 | 506 |
| 560 CObjectInt32* type = new CObjectInt32( | 507 CObjectInt32* type = new CObjectInt32( |
| 561 CObject::NewInt32(addr->GetType())); | 508 CObject::NewInt32(addr->GetType())); |
| 562 entry->SetAt(0, type); | 509 entry->SetAt(0, type); |
| 563 | 510 |
| 564 CObjectString* as_string = new CObjectString(CObject::NewString( | 511 CObjectString* as_string = new CObjectString(CObject::NewString( |
| 565 addr->as_string())); | 512 addr->as_string())); |
| 566 entry->SetAt(1, as_string); | 513 entry->SetAt(1, as_string); |
| 567 | 514 |
| 568 RawAddr raw = addr->addr(); | 515 RawAddr raw = addr->addr(); |
| 569 CObjectUint8Array* data = new CObjectUint8Array(CObject::NewUint8Array( | 516 CObjectUint8Array* data = SocketAddress::ToCObject(&raw); |
| 570 SocketAddress::GetAddrLength(&raw))); | |
| 571 memmove(data->Buffer(), | |
| 572 reinterpret_cast<void *>(&raw), | |
| 573 SocketAddress::GetAddrLength(&raw)); | |
| 574 entry->SetAt(2, data); | 517 entry->SetAt(2, data); |
| 575 | 518 |
| 576 CObjectString* interface_name = new CObjectString(CObject::NewString( | 519 CObjectString* interface_name = new CObjectString(CObject::NewString( |
| 577 interface->interface_name())); | 520 interface->interface_name())); |
| 578 entry->SetAt(3, interface_name); | 521 entry->SetAt(3, interface_name); |
| 579 | 522 |
| 580 CObjectInt64* interface_index = new CObjectInt64(CObject::NewInt64( | 523 CObjectInt64* interface_index = new CObjectInt64(CObject::NewInt64( |
| 581 interface->interface_index())); | 524 interface->interface_index())); |
| 582 entry->SetAt(4, interface_index); | 525 entry->SetAt(4, interface_index); |
| 583 | 526 |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 694 } else { | 637 } else { |
| 695 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); | 638 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
| 696 } | 639 } |
| 697 } | 640 } |
| 698 | 641 |
| 699 | 642 |
| 700 void FUNCTION_NAME(Socket_JoinMulticast)(Dart_NativeArguments args) { | 643 void FUNCTION_NAME(Socket_JoinMulticast)(Dart_NativeArguments args) { |
| 701 intptr_t socket = | 644 intptr_t socket = |
| 702 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); | 645 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); |
| 703 RawAddr addr; | 646 RawAddr addr; |
| 704 GetSockAddr(Dart_GetNativeArgument(args, 1), &addr); | 647 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 1), &addr); |
| 705 RawAddr interface; | 648 RawAddr interface; |
| 706 if (Dart_GetNativeArgument(args, 2) != Dart_Null()) { | 649 if (Dart_GetNativeArgument(args, 2) != Dart_Null()) { |
| 707 GetSockAddr(Dart_GetNativeArgument(args, 2), &interface); | 650 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 2), &interface); |
| 708 } | 651 } |
| 709 int interfaceIndex = | 652 int interfaceIndex = |
| 710 DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 3)); | 653 DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 3)); |
| 711 if (Socket::JoinMulticast(socket, &addr, &interface, interfaceIndex)) { | 654 if (Socket::JoinMulticast(socket, &addr, &interface, interfaceIndex)) { |
| 712 Dart_SetReturnValue(args, Dart_Null()); | 655 Dart_SetReturnValue(args, Dart_Null()); |
| 713 } else { | 656 } else { |
| 714 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); | 657 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
| 715 } | 658 } |
| 716 } | 659 } |
| 717 | 660 |
| 718 | 661 |
| 719 void FUNCTION_NAME(Socket_LeaveMulticast)(Dart_NativeArguments args) { | 662 void FUNCTION_NAME(Socket_LeaveMulticast)(Dart_NativeArguments args) { |
| 720 intptr_t socket = | 663 intptr_t socket = |
| 721 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); | 664 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); |
| 722 RawAddr addr; | 665 RawAddr addr; |
| 723 GetSockAddr(Dart_GetNativeArgument(args, 1), &addr); | 666 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 1), &addr); |
| 724 RawAddr interface; | 667 RawAddr interface; |
| 725 if (Dart_GetNativeArgument(args, 2) != Dart_Null()) { | 668 if (Dart_GetNativeArgument(args, 2) != Dart_Null()) { |
| 726 GetSockAddr(Dart_GetNativeArgument(args, 2), &interface); | 669 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 2), &interface); |
| 727 } | 670 } |
| 728 int interfaceIndex = | 671 int interfaceIndex = |
| 729 DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 3)); | 672 DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 3)); |
| 730 if (Socket::LeaveMulticast(socket, &addr, &interface, interfaceIndex)) { | 673 if (Socket::LeaveMulticast(socket, &addr, &interface, interfaceIndex)) { |
| 731 Dart_SetReturnValue(args, Dart_Null()); | 674 Dart_SetReturnValue(args, Dart_Null()); |
| 732 } else { | 675 } else { |
| 733 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); | 676 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
| 734 } | 677 } |
| 735 } | 678 } |
| 736 | 679 |
| 737 | 680 |
| 738 void Socket::SetSocketIdNativeField(Dart_Handle socket, intptr_t id) { | 681 void Socket::SetSocketIdNativeField(Dart_Handle socket, intptr_t id) { |
| 739 Dart_Handle err = | 682 Dart_Handle err = |
| 740 Dart_SetNativeInstanceField(socket, kSocketIdNativeField, id); | 683 Dart_SetNativeInstanceField(socket, kSocketIdNativeField, id); |
| 741 if (Dart_IsError(err)) Dart_PropagateError(err); | 684 if (Dart_IsError(err)) Dart_PropagateError(err); |
| 742 } | 685 } |
| 743 | 686 |
| 744 | 687 |
| 745 intptr_t Socket::GetSocketIdNativeField(Dart_Handle socket_obj) { | 688 intptr_t Socket::GetSocketIdNativeField(Dart_Handle socket_obj) { |
| 746 intptr_t socket = 0; | 689 intptr_t socket = 0; |
| 747 Dart_Handle err = | 690 Dart_Handle err = |
| 748 Dart_GetNativeInstanceField(socket_obj, kSocketIdNativeField, &socket); | 691 Dart_GetNativeInstanceField(socket_obj, kSocketIdNativeField, &socket); |
| 749 if (Dart_IsError(err)) Dart_PropagateError(err); | 692 if (Dart_IsError(err)) Dart_PropagateError(err); |
| 750 return socket; | 693 return socket; |
| 751 } | 694 } |
| 752 | 695 |
| 753 } // namespace bin | 696 } // namespace bin |
| 754 } // namespace dart | 697 } // namespace dart |
| OLD | NEW |