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 |