Chromium Code Reviews| 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/socket.h" | 7 #include "bin/socket.h" |
| 7 #include "bin/dartutils.h" | 8 #include "bin/dartutils.h" |
| 8 #include "bin/thread.h" | 9 #include "bin/thread.h" |
| 9 #include "bin/utils.h" | 10 #include "bin/utils.h" |
| 10 | 11 |
| 11 #include "platform/globals.h" | 12 #include "platform/globals.h" |
| 12 #include "platform/thread.h" | 13 #include "platform/thread.h" |
| 13 #include "platform/utils.h" | 14 #include "platform/utils.h" |
| 14 | 15 |
| 15 #include "include/dart_api.h" | 16 #include "include/dart_api.h" |
| 16 | 17 |
| 17 | 18 |
| 18 namespace dart { | 19 namespace dart { |
| 19 namespace bin { | 20 namespace bin { |
| 20 | 21 |
| 21 static const int kSocketIdNativeField = 0; | 22 static const int kSocketIdNativeField = 0; |
| 22 | 23 |
| 23 dart::Mutex* Socket::mutex_ = new dart::Mutex(); | 24 dart::Mutex* Socket::mutex_ = new dart::Mutex(); |
| 24 int Socket::service_ports_size_ = 0; | 25 int Socket::service_ports_size_ = 0; |
| 25 Dart_Port* Socket::service_ports_ = NULL; | 26 Dart_Port* Socket::service_ports_ = NULL; |
| 26 int Socket::service_ports_index_ = 0; | 27 int Socket::service_ports_index_ = 0; |
| 27 | 28 |
| 28 | |
|
Anders Johnsen
2013/12/12 12:19:58
Re-add this.
Søren Gjesse
2013/12/12 15:44:39
Done.
| |
| 29 static void GetSockAddr(Dart_Handle obj, RawAddr* addr) { | 29 static void GetSockAddr(Dart_Handle obj, RawAddr* addr) { |
| 30 Dart_TypedData_Type data_type; | 30 Dart_TypedData_Type data_type; |
| 31 uint8_t* data = NULL; | 31 uint8_t* data = NULL; |
| 32 intptr_t len; | 32 intptr_t len; |
| 33 Dart_Handle result = Dart_TypedDataAcquireData( | 33 Dart_Handle result = Dart_TypedDataAcquireData( |
| 34 obj, &data_type, reinterpret_cast<void**>(&data), &len); | 34 obj, &data_type, reinterpret_cast<void**>(&data), &len); |
| 35 if (Dart_IsError(result)) Dart_PropagateError(result); | 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 } | |
| 36 memmove(reinterpret_cast<void *>(addr), data, len); | 39 memmove(reinterpret_cast<void *>(addr), data, len); |
| 37 Dart_TypedDataReleaseData(obj); | 40 Dart_TypedDataReleaseData(obj); |
| 38 } | 41 } |
| 39 | 42 |
| 40 | 43 |
| 41 void FUNCTION_NAME(InternetAddress_Fixed)(Dart_NativeArguments args) { | 44 void FUNCTION_NAME(InternetAddress_Fixed)(Dart_NativeArguments args) { |
| 42 int64_t id = 0; | 45 int64_t id = 0; |
| 43 bool ok = DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 0), &id); | 46 bool ok = DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 0), &id); |
| 44 ASSERT(ok); | 47 ASSERT(ok); |
| 45 USE(ok); | 48 USE(ok); |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 109 65535); | 112 65535); |
| 110 intptr_t socket = Socket::CreateConnect(addr, port); | 113 intptr_t socket = Socket::CreateConnect(addr, port); |
| 111 OSError error; | 114 OSError error; |
| 112 if (socket >= 0) { | 115 if (socket >= 0) { |
| 113 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), socket); | 116 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), socket); |
| 114 Dart_SetReturnValue(args, Dart_True()); | 117 Dart_SetReturnValue(args, Dart_True()); |
| 115 } else { | 118 } else { |
| 116 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&error)); | 119 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&error)); |
| 117 } | 120 } |
| 118 } | 121 } |
| 119 | 122 |
|
Anders Johnsen
2013/12/12 12:19:58
Double-space, and below.
Søren Gjesse
2013/12/12 15:44:39
Done.
| |
| 123 void FUNCTION_NAME(Socket_CreateBindDatagram)(Dart_NativeArguments args) { | |
| 124 RawAddr addr; | |
| 125 GetSockAddr(Dart_GetNativeArgument(args, 1), &addr); | |
| 126 int64_t port = DartUtils::GetInt64ValueCheckRange( | |
| 127 Dart_GetNativeArgument(args, 2), | |
|
Anders Johnsen
2013/12/12 12:19:58
If you extract arg 2 and 3 above, it'll be easier
Søren Gjesse
2013/12/12 15:44:39
Done.
| |
| 128 0, | |
| 129 65535); | |
| 130 intptr_t socket = Socket::CreateBindDatagram( | |
| 131 &addr, | |
| 132 port, | |
| 133 DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 3))); | |
| 134 if (socket >= 0) { | |
| 135 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), socket); | |
| 136 Dart_SetReturnValue(args, Dart_True()); | |
| 137 } else { | |
| 138 OSError error; | |
| 139 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&error)); | |
| 140 } | |
| 141 } | |
| 142 | |
| 120 | 143 |
| 121 void FUNCTION_NAME(Socket_Available)(Dart_NativeArguments args) { | 144 void FUNCTION_NAME(Socket_Available)(Dart_NativeArguments args) { |
| 122 intptr_t socket = | 145 intptr_t socket = |
| 123 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); | 146 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); |
| 124 intptr_t available = Socket::Available(socket); | 147 intptr_t available = Socket::Available(socket); |
| 125 if (available >= 0) { | 148 if (available >= 0) { |
| 126 Dart_SetReturnValue(args, Dart_NewInteger(available)); | 149 Dart_SetReturnValue(args, Dart_NewInteger(available)); |
| 127 } else { | 150 } else { |
| 128 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); | 151 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
| 129 } | 152 } |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 175 Dart_SetReturnValue(args, err); | 198 Dart_SetReturnValue(args, err); |
| 176 } | 199 } |
| 177 } else if (available == 0) { | 200 } else if (available == 0) { |
| 178 Dart_SetReturnValue(args, Dart_Null()); | 201 Dart_SetReturnValue(args, Dart_Null()); |
| 179 } else { | 202 } else { |
| 180 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); | 203 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
| 181 } | 204 } |
| 182 } | 205 } |
| 183 | 206 |
| 184 | 207 |
| 208 void FUNCTION_NAME(Socket_RecvFrom)(Dart_NativeArguments args) { | |
| 209 intptr_t socket = | |
| 210 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); | |
| 211 | |
| 212 // TODO(sgjesse): Use a MTU value here. Only the loopback adapter can | |
| 213 // handle 64k datagrams. | |
| 214 IsolateData* isolate_data = | |
| 215 reinterpret_cast<IsolateData*>(Dart_CurrentIsolateData()); | |
| 216 if (isolate_data->udp_receive_buffer == NULL) { | |
| 217 isolate_data->udp_receive_buffer = | |
| 218 reinterpret_cast<uint8_t*>(malloc(65536)); | |
| 219 } | |
| 220 RawAddr addr; | |
| 221 intptr_t bytes_read = | |
| 222 Socket::RecvFrom(socket, isolate_data->udp_receive_buffer, 65536, &addr); | |
| 223 if (bytes_read == 0) { | |
| 224 Dart_SetReturnValue(args, Dart_Null()); | |
| 225 return; | |
| 226 } | |
| 227 if (bytes_read < 0) { | |
| 228 ASSERT(bytes_read == -1); | |
| 229 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); | |
| 230 return; | |
| 231 } | |
| 232 // Datagram data read. Copy into buffer of the exact size, | |
| 233 ASSERT(bytes_read > 0); | |
| 234 uint8_t* data_buffer = NULL; | |
| 235 Dart_Handle data = IOBuffer::Allocate(bytes_read, &data_buffer); | |
| 236 if (Dart_IsError(data)) Dart_PropagateError(data); | |
| 237 ASSERT(data_buffer != NULL); | |
| 238 memmove(data_buffer, isolate_data->udp_receive_buffer, bytes_read); | |
| 239 | |
| 240 // Get the port and clear it in the sockaddr structure. | |
| 241 int port = SocketAddress::GetAddrPort(&addr); | |
| 242 if (addr.addr.sa_family == AF_INET) { | |
| 243 addr.in.sin_port = 0; | |
| 244 } else { | |
| 245 ASSERT(addr.addr.sa_family == AF_INET6); | |
| 246 addr.in6.sin6_port = 0; | |
| 247 } | |
| 248 // Format the address to a string using the numeric format. | |
| 249 char numeric_address[INET6_ADDRSTRLEN]; | |
| 250 Socket::FormatNumericAddress(&addr, numeric_address, INET6_ADDRSTRLEN); | |
| 251 | |
| 252 // Create a Datagram object with the data and sender address and port. | |
| 253 const int kNumArgs = 5; | |
| 254 Dart_Handle dart_args[kNumArgs]; | |
| 255 dart_args[0] = data; | |
| 256 dart_args[1] = Dart_NewBoolean(addr.addr.sa_family == AF_INET6); | |
| 257 dart_args[2] = Dart_NewStringFromCString(numeric_address); | |
| 258 if (Dart_IsError(dart_args[2])) Dart_PropagateError(dart_args[2]); | |
| 259 int len = SocketAddress::GetAddrLength(&addr); | |
| 260 dart_args[3] = Dart_NewTypedData(Dart_TypedData_kUint8, len); | |
| 261 if (Dart_IsError(dart_args[3])) Dart_PropagateError(dart_args[3]); | |
| 262 Dart_Handle err = Dart_ListSetAsBytes( | |
| 263 dart_args[3], 0, reinterpret_cast<uint8_t *>(&addr), len); | |
| 264 if (Dart_IsError(err)) Dart_PropagateError(err); | |
| 265 dart_args[4] = Dart_NewInteger(port); | |
| 266 if (Dart_IsError(dart_args[4])) Dart_PropagateError(dart_args[4]); | |
| 267 // TODO(sgjesse): Cache the _makeDatagram function somewhere. | |
| 268 Dart_Handle io_lib = | |
| 269 Dart_LookupLibrary(DartUtils::NewString("dart:io")); | |
| 270 if (Dart_IsError(io_lib)) Dart_PropagateError(io_lib); | |
| 271 Dart_Handle result = | |
| 272 Dart_Invoke(io_lib, | |
| 273 DartUtils::NewString("_makeDatagram"), | |
| 274 kNumArgs, | |
| 275 dart_args); | |
| 276 if (Dart_IsError(result)) Dart_PropagateError(result); | |
| 277 Dart_SetReturnValue(args, result); | |
| 278 } | |
| 279 | |
| 280 | |
| 185 void FUNCTION_NAME(Socket_WriteList)(Dart_NativeArguments args) { | 281 void FUNCTION_NAME(Socket_WriteList)(Dart_NativeArguments args) { |
| 186 static bool short_socket_writes = Dart_IsVMFlagSet("short_socket_write"); | 282 static bool short_socket_writes = Dart_IsVMFlagSet("short_socket_write"); |
| 187 intptr_t socket = | 283 intptr_t socket = |
| 188 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); | 284 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); |
| 189 Dart_Handle buffer_obj = Dart_GetNativeArgument(args, 1); | 285 Dart_Handle buffer_obj = Dart_GetNativeArgument(args, 1); |
| 190 ASSERT(Dart_IsList(buffer_obj)); | 286 ASSERT(Dart_IsList(buffer_obj)); |
| 191 intptr_t offset = | 287 intptr_t offset = |
| 192 DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 2)); | 288 DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 2)); |
| 193 intptr_t length = | 289 intptr_t length = |
| 194 DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 3)); | 290 DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 3)); |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 209 Dart_SetReturnValue(args, Dart_NewInteger(bytes_written)); | 305 Dart_SetReturnValue(args, Dart_NewInteger(bytes_written)); |
| 210 } else { | 306 } else { |
| 211 // Extract OSError before we release data, as it may override the error. | 307 // Extract OSError before we release data, as it may override the error. |
| 212 OSError os_error; | 308 OSError os_error; |
| 213 Dart_TypedDataReleaseData(buffer_obj); | 309 Dart_TypedDataReleaseData(buffer_obj); |
| 214 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error)); | 310 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error)); |
| 215 } | 311 } |
| 216 } | 312 } |
| 217 | 313 |
| 218 | 314 |
| 315 void FUNCTION_NAME(Socket_SendTo)(Dart_NativeArguments args) { | |
| 316 intptr_t socket = | |
| 317 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); | |
| 318 Dart_Handle buffer_obj = Dart_GetNativeArgument(args, 1); | |
| 319 intptr_t offset = | |
| 320 DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 2)); | |
| 321 intptr_t length = | |
| 322 DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 3)); | |
| 323 Dart_Handle address_obj = Dart_GetNativeArgument(args, 4); | |
| 324 ASSERT(Dart_IsList(address_obj)); | |
| 325 RawAddr addr; | |
| 326 GetSockAddr(address_obj, &addr); | |
| 327 int64_t port = DartUtils::GetInt64ValueCheckRange( | |
| 328 Dart_GetNativeArgument(args, 5), | |
| 329 0, | |
| 330 65535); | |
| 331 SocketAddress::SetAddrPort(&addr, port); | |
| 332 Dart_TypedData_Type type; | |
| 333 uint8_t* buffer = NULL; | |
| 334 intptr_t len; | |
| 335 Dart_Handle result = Dart_TypedDataAcquireData( | |
| 336 buffer_obj, &type, reinterpret_cast<void**>(&buffer), &len); | |
| 337 if (Dart_IsError(result)) Dart_PropagateError(result); | |
| 338 ASSERT((offset + length) <= len); | |
| 339 buffer += offset; | |
| 340 intptr_t bytes_written = Socket::SendTo(socket, buffer, length, addr); | |
| 341 if (bytes_written >= 0) { | |
| 342 Dart_TypedDataReleaseData(buffer_obj); | |
| 343 Dart_SetReturnValue(args, Dart_NewInteger(bytes_written)); | |
| 344 } else { | |
| 345 // Extract OSError before we release data, as it may override the error. | |
| 346 OSError os_error; | |
| 347 Dart_TypedDataReleaseData(buffer_obj); | |
| 348 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error)); | |
| 349 } | |
| 350 } | |
| 351 | |
| 352 | |
| 219 void FUNCTION_NAME(Socket_GetPort)(Dart_NativeArguments args) { | 353 void FUNCTION_NAME(Socket_GetPort)(Dart_NativeArguments args) { |
| 220 intptr_t socket = | 354 intptr_t socket = |
| 221 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); | 355 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); |
| 222 OSError os_error; | 356 OSError os_error; |
| 223 intptr_t port = Socket::GetPort(socket); | 357 intptr_t port = Socket::GetPort(socket); |
| 224 if (port > 0) { | 358 if (port > 0) { |
| 225 Dart_SetReturnValue(args, Dart_NewInteger(port)); | 359 Dart_SetReturnValue(args, Dart_NewInteger(port)); |
| 226 } else { | 360 } else { |
| 227 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); | 361 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
| 228 } | 362 } |
| (...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 460 } else { | 594 } else { |
| 461 result = CObject::NewOSError(os_error); | 595 result = CObject::NewOSError(os_error); |
| 462 delete os_error; | 596 delete os_error; |
| 463 } | 597 } |
| 464 return result; | 598 return result; |
| 465 } | 599 } |
| 466 return CObject::IllegalArgumentError(); | 600 return CObject::IllegalArgumentError(); |
| 467 } | 601 } |
| 468 | 602 |
| 469 | 603 |
| 604 void FUNCTION_NAME(Socket_GetOption)(Dart_NativeArguments args) { | |
| 605 intptr_t socket = | |
| 606 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); | |
| 607 int64_t option = DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 1)); | |
| 608 intptr_t protocol = | |
| 609 static_cast<intptr_t>( | |
| 610 DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 2))); | |
| 611 bool ok = false; | |
| 612 switch (option) { | |
| 613 case 0: { // TCP_NODELAY. | |
| 614 bool enabled; | |
| 615 ok = Socket::GetNoDelay(socket, &enabled); | |
| 616 if (ok) { | |
| 617 Dart_SetReturnValue(args, enabled ? Dart_True() : Dart_False()); | |
| 618 } | |
| 619 break; | |
| 620 } | |
| 621 case 1: { // IP_MULTICAST_LOOP. | |
| 622 bool enabled; | |
| 623 ok = Socket::GetMulticastLoop(socket, protocol, &enabled); | |
| 624 if (ok) { | |
| 625 Dart_SetReturnValue(args, enabled ? Dart_True() : Dart_False()); | |
| 626 } | |
| 627 break; | |
| 628 } | |
| 629 case 2: { // IP_MULTICAST_TTL. | |
| 630 int value; | |
| 631 ok = Socket::GetMulticastHops(socket, protocol, &value); | |
| 632 if (ok) { | |
| 633 Dart_SetReturnValue(args, Dart_NewInteger(value)); | |
| 634 } | |
| 635 break; | |
| 636 } | |
| 637 case 3: { // IP_MULTICAST_IF. | |
| 638 UNIMPLEMENTED(); | |
| 639 break; | |
| 640 } | |
| 641 case 4: { // IP_BROADCAST. | |
| 642 bool enabled; | |
| 643 ok = Socket::GetBroadcast(socket, &enabled); | |
| 644 if (ok) { | |
| 645 Dart_SetReturnValue(args, enabled ? Dart_True() : Dart_False()); | |
| 646 } | |
| 647 break; | |
| 648 } | |
| 649 default: | |
| 650 UNREACHABLE(); | |
| 651 break; | |
| 652 } | |
| 653 // In case of failure the return value is not set above. | |
| 654 if (!ok) { | |
| 655 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); | |
| 656 } | |
| 657 } | |
| 658 | |
| 659 | |
| 470 void FUNCTION_NAME(Socket_SetOption)(Dart_NativeArguments args) { | 660 void FUNCTION_NAME(Socket_SetOption)(Dart_NativeArguments args) { |
| 471 bool result = false; | 661 bool result = false; |
| 472 intptr_t socket = | 662 intptr_t socket = |
| 473 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); | 663 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); |
| 474 Dart_Handle option_obj = Dart_GetNativeArgument(args, 1); | 664 int64_t option = DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 1)); |
| 475 int64_t option; | 665 int64_t protocol = DartUtils::GetInt64ValueCheckRange( |
| 476 Dart_Handle err = Dart_IntegerToInt64(option_obj, &option); | 666 Dart_GetNativeArgument(args, 2), |
| 477 if (Dart_IsError(err)) Dart_PropagateError(err); | 667 SocketAddress::TYPE_IPV4, |
| 478 Dart_Handle enabled_obj = Dart_GetNativeArgument(args, 2); | 668 SocketAddress::TYPE_IPV6); |
| 479 bool enabled; | |
| 480 err = Dart_BooleanValue(enabled_obj, &enabled); | |
| 481 if (Dart_IsError(err)) Dart_PropagateError(err); | |
| 482 switch (option) { | 669 switch (option) { |
| 483 case 0: // TCP_NODELAY. | 670 case 0: // TCP_NODELAY. |
| 484 result = Socket::SetNoDelay(socket, enabled); | 671 result = Socket::SetNoDelay( |
| 672 socket, DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 3))); | |
| 673 break; | |
| 674 case 1: // IP_MULTICAST_LOOP. | |
| 675 result = Socket::SetMulticastLoop( | |
| 676 socket, | |
| 677 protocol, | |
| 678 DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 3))); | |
| 679 break; | |
| 680 case 2: // IP_MULTICAST_TTL. | |
| 681 result = Socket::SetMulticastHops( | |
| 682 socket, | |
| 683 protocol, | |
| 684 DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 3))); | |
| 685 break; | |
| 686 case 3: { // IP_MULTICAST_IF. | |
| 687 UNIMPLEMENTED(); | |
| 688 break; | |
| 689 } | |
| 690 case 4: // IP_BROADCAST. | |
| 691 result = Socket::SetBroadcast( | |
| 692 socket, DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 3))); | |
| 485 break; | 693 break; |
| 486 default: | 694 default: |
| 695 Dart_PropagateError(Dart_NewApiError("Value outside expected range")); | |
| 487 break; | 696 break; |
| 488 } | 697 } |
| 489 Dart_SetReturnValue(args, Dart_NewBoolean(result)); | 698 if (result) { |
| 699 Dart_SetReturnValue(args, Dart_Null()); | |
| 700 } else { | |
| 701 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); | |
| 702 } | |
| 490 } | 703 } |
| 491 | 704 |
| 492 | 705 |
| 706 void FUNCTION_NAME(Socket_JoinMulticast)(Dart_NativeArguments args) { | |
| 707 intptr_t socket = | |
| 708 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); | |
| 709 RawAddr addr; | |
| 710 GetSockAddr(Dart_GetNativeArgument(args, 1), &addr); | |
| 711 RawAddr interface; | |
| 712 if (Dart_GetNativeArgument(args, 2) != Dart_Null()) { | |
| 713 GetSockAddr(Dart_GetNativeArgument(args, 2), &interface); | |
| 714 } | |
| 715 int interfaceIndex = | |
| 716 DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 3)); | |
| 717 if (Socket::JoinMulticast(socket, &addr, &interface, interfaceIndex)) { | |
| 718 Dart_SetReturnValue(args, Dart_Null()); | |
| 719 } else { | |
| 720 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); | |
| 721 } | |
| 722 } | |
| 723 | |
| 724 | |
| 725 void FUNCTION_NAME(Socket_LeaveMulticast)(Dart_NativeArguments args) { | |
| 726 intptr_t socket = | |
| 727 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); | |
| 728 RawAddr addr; | |
| 729 GetSockAddr(Dart_GetNativeArgument(args, 1), &addr); | |
| 730 RawAddr interface; | |
| 731 if (Dart_GetNativeArgument(args, 2) != Dart_Null()) { | |
| 732 GetSockAddr(Dart_GetNativeArgument(args, 2), &interface); | |
| 733 } | |
| 734 int interfaceIndex = | |
| 735 DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 3)); | |
| 736 if (Socket::LeaveMulticast(socket, &addr, &interface, interfaceIndex)) { | |
| 737 Dart_SetReturnValue(args, Dart_Null()); | |
| 738 } else { | |
| 739 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); | |
| 740 } | |
| 741 } | |
| 742 | |
| 743 | |
| 493 void Socket::SetSocketIdNativeField(Dart_Handle socket, intptr_t id) { | 744 void Socket::SetSocketIdNativeField(Dart_Handle socket, intptr_t id) { |
| 494 Dart_Handle err = | 745 Dart_Handle err = |
| 495 Dart_SetNativeInstanceField(socket, kSocketIdNativeField, id); | 746 Dart_SetNativeInstanceField(socket, kSocketIdNativeField, id); |
| 496 if (Dart_IsError(err)) Dart_PropagateError(err); | 747 if (Dart_IsError(err)) Dart_PropagateError(err); |
| 497 } | 748 } |
| 498 | 749 |
| 499 | 750 |
| 500 intptr_t Socket::GetSocketIdNativeField(Dart_Handle socket_obj) { | 751 intptr_t Socket::GetSocketIdNativeField(Dart_Handle socket_obj) { |
| 501 intptr_t socket = 0; | 752 intptr_t socket = 0; |
| 502 Dart_Handle err = | 753 Dart_Handle err = |
| 503 Dart_GetNativeInstanceField(socket_obj, kSocketIdNativeField, &socket); | 754 Dart_GetNativeInstanceField(socket_obj, kSocketIdNativeField, &socket); |
| 504 if (Dart_IsError(err)) Dart_PropagateError(err); | 755 if (Dart_IsError(err)) Dart_PropagateError(err); |
| 505 return socket; | 756 return socket; |
| 506 } | 757 } |
| 507 | 758 |
| 508 } // namespace bin | 759 } // namespace bin |
| 509 } // namespace dart | 760 } // namespace dart |
| OLD | NEW |