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