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 |