Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2)

Side by Side Diff: runtime/bin/socket.cc

Issue 85993002: Add UDP support to dart:io (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Fix Windows build Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « runtime/bin/socket.h ('k') | runtime/bin/socket_android.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « runtime/bin/socket.h ('k') | runtime/bin/socket_android.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698