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 patch class RawServerSocket { | 5 patch class RawServerSocket { |
6 /* patch */ static Future<RawServerSocket> bind(address, | 6 /* patch */ static Future<RawServerSocket> bind(address, |
7 int port, | 7 int port, |
8 {int backlog: 0, | 8 {int backlog: 0, |
9 bool v6Only: false}) { | 9 bool v6Only: false}) { |
10 return _RawServerSocket.bind(address, port, backlog, v6Only); | 10 return _RawServerSocket.bind(address, port, backlog, v6Only); |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
118 _sockaddr_storage[_IPV4_ADDR_OFFSET] < 240; | 118 _sockaddr_storage[_IPV4_ADDR_OFFSET] < 240; |
119 | 119 |
120 case InternetAddressType.IP_V6: | 120 case InternetAddressType.IP_V6: |
121 // Checking for ff00::/8. | 121 // Checking for ff00::/8. |
122 return _sockaddr_storage[_IPV6_ADDR_OFFSET] == 0xFF; | 122 return _sockaddr_storage[_IPV6_ADDR_OFFSET] == 0xFF; |
123 } | 123 } |
124 } | 124 } |
125 | 125 |
126 Future<InternetAddress> reverse() => _NativeSocket.reverseLookup(this); | 126 Future<InternetAddress> reverse() => _NativeSocket.reverseLookup(this); |
127 | 127 |
128 | |
Anders Johnsen
2013/11/29 12:36:54
intentional?
Søren Gjesse
2013/12/12 11:38:46
No, reverted.
| |
128 _InternetAddress(InternetAddressType this.type, | 129 _InternetAddress(InternetAddressType this.type, |
129 String this.address, | 130 String this.address, |
130 String this._host, | 131 String this._host, |
131 List<int> this._sockaddr_storage); | 132 List<int> this._sockaddr_storage); |
132 | 133 |
133 factory _InternetAddress.parse(String address) { | 134 factory _InternetAddress.parse(String address) { |
134 var type = address.indexOf(':') == -1 | 135 var type = address.indexOf(':') == -1 |
135 ? InternetAddressType.IP_V4 | 136 ? InternetAddressType.IP_V4 |
136 : InternetAddressType.IP_V6; | 137 : InternetAddressType.IP_V6; |
137 var raw = _parse(type._value, address); | 138 var raw = _parse(type._value, address); |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
239 static const int PIPE_SOCKET = 17; | 240 static const int PIPE_SOCKET = 17; |
240 static const int TYPE_NORMAL_SOCKET = 0; | 241 static const int TYPE_NORMAL_SOCKET = 0; |
241 static const int TYPE_LISTENING_SOCKET = 1 << LISTENING_SOCKET; | 242 static const int TYPE_LISTENING_SOCKET = 1 << LISTENING_SOCKET; |
242 static const int TYPE_PIPE = 1 << PIPE_SOCKET; | 243 static const int TYPE_PIPE = 1 << PIPE_SOCKET; |
243 | 244 |
244 // Native port messages. | 245 // Native port messages. |
245 static const HOST_NAME_LOOKUP = 0; | 246 static const HOST_NAME_LOOKUP = 0; |
246 static const LIST_INTERFACES = 1; | 247 static const LIST_INTERFACES = 1; |
247 static const REVERSE_LOOKUP = 2; | 248 static const REVERSE_LOOKUP = 2; |
248 | 249 |
250 // Protocol flags. | |
251 static const int PROTOCOL_IPV4 = 1 << 0; | |
252 static const int PROTOCOL_IPV6 = 1 << 1; | |
253 | |
249 // Socket close state | 254 // Socket close state |
250 bool isClosed = false; | 255 bool isClosed = false; |
251 bool isClosing = false; | 256 bool isClosing = false; |
252 bool isClosedRead = false; | 257 bool isClosedRead = false; |
253 bool isClosedWrite = false; | 258 bool isClosedWrite = false; |
254 Completer closeCompleter = new Completer(); | 259 Completer closeCompleter = new Completer(); |
255 | 260 |
256 // Handlers and receive port for socket events from the event handler. | 261 // Handlers and receive port for socket events from the event handler. |
257 int eventMask = 0; | 262 int eventMask = 0; |
258 List eventHandlers; | 263 List eventHandlers; |
259 RawReceivePort eventPort; | 264 RawReceivePort eventPort; |
260 | 265 |
261 // Indicates if native interrupts can be activated. | 266 // Indicates if native interrupts can be activated. |
262 bool canActivateEvents = true; | 267 bool canActivateEvents = true; |
263 | 268 |
264 // The type flags for this socket. | 269 // The type flags for this socket. |
265 final int typeFlags; | 270 final int typeFlags; |
266 | 271 |
267 // Holds the port of the socket, null if not known. | 272 // Holds the port of the socket, 0 if not known. |
268 int localPort; | 273 int localPort = 0; |
269 | 274 |
270 // Holds the address used to connect or bind the socket. | 275 // Holds the address used to connect or bind the socket. |
271 InternetAddress address; | 276 InternetAddress address; |
272 | 277 |
273 static Future<List<InternetAddress>> lookup( | 278 static Future<List<InternetAddress>> lookup( |
274 String host, {InternetAddressType type: InternetAddressType.ANY}) { | 279 String host, {InternetAddressType type: InternetAddressType.ANY}) { |
275 return _IOService.dispatch(_SOCKET_LOOKUP, [host, type._value]) | 280 return _IOService.dispatch(_SOCKET_LOOKUP, [host, type._value]) |
276 .then((response) { | 281 .then((response) { |
277 if (isErrorResponse(response)) { | 282 if (isErrorResponse(response)) { |
278 throw createError(response, "Failed host lookup: '$host'"); | 283 throw createError(response, "Failed host lookup: '$host'"); |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
392 throw new SocketException("Failed to create server socket", | 397 throw new SocketException("Failed to create server socket", |
393 osError: result, | 398 osError: result, |
394 address: address, | 399 address: address, |
395 port: port); | 400 port: port); |
396 } | 401 } |
397 if (port != 0) socket.localPort = port; | 402 if (port != 0) socket.localPort = port; |
398 return socket; | 403 return socket; |
399 }); | 404 }); |
400 } | 405 } |
401 | 406 |
407 static Future<_NativeSocket> bindDatagram( | |
408 host, int port, bool reuseAddress) { | |
409 return new Future.value(host) | |
410 .then((host) { | |
411 if (host is _InternetAddress) return host; | |
412 return lookup(host) | |
413 .then((list) { | |
414 if (list.length == 0) { | |
415 throw createError(response, "Failed host lookup: '$host'"); | |
416 } | |
417 return list[0]; | |
418 }); | |
419 }) | |
420 .then((address) { | |
421 var socket = new _NativeSocket.datagram(address); | |
422 var result = socket.nativeCreateBindDatagram( | |
423 address._sockaddr_storage, port, reuseAddress); | |
424 if (result is OSError) { | |
425 throw new SocketException("Failed to create datagram socket", | |
426 osError: result, | |
427 address: address, | |
428 port: port); | |
429 } | |
430 if (port != 0) socket.localPort = port; | |
431 return socket; | |
432 }); | |
433 } | |
434 | |
435 _NativeSocket.datagram(this.address) | |
436 : typeFlags = TYPE_NORMAL_SOCKET { | |
437 eventHandlers = new List(EVENT_COUNT + 1); | |
438 } | |
439 | |
402 _NativeSocket.normal() : typeFlags = TYPE_NORMAL_SOCKET { | 440 _NativeSocket.normal() : typeFlags = TYPE_NORMAL_SOCKET { |
403 eventHandlers = new List(EVENT_COUNT + 1); | 441 eventHandlers = new List(EVENT_COUNT + 1); |
404 } | 442 } |
405 | 443 |
406 _NativeSocket.listen() : typeFlags = TYPE_LISTENING_SOCKET { | 444 _NativeSocket.listen() : typeFlags = TYPE_LISTENING_SOCKET { |
407 eventHandlers = new List(EVENT_COUNT + 1); | 445 eventHandlers = new List(EVENT_COUNT + 1); |
408 } | 446 } |
409 | 447 |
410 _NativeSocket.pipe() : typeFlags = TYPE_PIPE { | 448 _NativeSocket.pipe() : typeFlags = TYPE_PIPE { |
411 eventHandlers = new List(EVENT_COUNT + 1); | 449 eventHandlers = new List(EVENT_COUNT + 1); |
(...skipping 22 matching lines...) Expand all Loading... | |
434 } | 472 } |
435 if (isClosing || isClosed) return null; | 473 if (isClosing || isClosed) return null; |
436 var result = nativeRead(len == null ? -1 : len); | 474 var result = nativeRead(len == null ? -1 : len); |
437 if (result is OSError) { | 475 if (result is OSError) { |
438 reportError(result, "Read failed"); | 476 reportError(result, "Read failed"); |
439 return null; | 477 return null; |
440 } | 478 } |
441 return result; | 479 return result; |
442 } | 480 } |
443 | 481 |
482 Datagram receive() { | |
483 if (isClosing || isClosed) return null; | |
484 var result = nativeRecvFrom(); | |
485 if (result is OSError) { | |
486 reportError(result, "Receive failed"); | |
Anders Johnsen
2013/11/29 12:36:54
Put in scheduleMicrotask.
Søren Gjesse
2013/12/12 11:38:46
Done.
| |
487 return null; | |
488 } | |
489 return result; | |
490 } | |
491 | |
444 int write(List<int> buffer, int offset, int bytes) { | 492 int write(List<int> buffer, int offset, int bytes) { |
445 if (buffer is! List) throw new ArgumentError(); | 493 if (buffer is! List) throw new ArgumentError(); |
446 if (offset == null) offset = 0; | 494 if (offset == null) offset = 0; |
447 if (bytes == null) { | 495 if (bytes == null) { |
448 if (offset > buffer.length) { | 496 if (offset > buffer.length) { |
449 throw new RangeError.value(offset); | 497 throw new RangeError.value(offset); |
450 } | 498 } |
451 bytes = buffer.length - offset; | 499 bytes = buffer.length - offset; |
452 } | 500 } |
453 if (offset < 0) throw new RangeError.value(offset); | 501 if (offset < 0) throw new RangeError.value(offset); |
(...skipping 10 matching lines...) Expand all Loading... | |
464 _ensureFastAndSerializableByteData(buffer, offset, offset + bytes); | 512 _ensureFastAndSerializableByteData(buffer, offset, offset + bytes); |
465 var result = | 513 var result = |
466 nativeWrite(bufferAndStart.buffer, bufferAndStart.start, bytes); | 514 nativeWrite(bufferAndStart.buffer, bufferAndStart.start, bytes); |
467 if (result is OSError) { | 515 if (result is OSError) { |
468 reportError(result, "Write failed"); | 516 reportError(result, "Write failed"); |
469 result = 0; | 517 result = 0; |
470 } | 518 } |
471 return result; | 519 return result; |
472 } | 520 } |
473 | 521 |
522 int send(List<int> buffer, int offset, int bytes, | |
523 InternetAddress address, int port) { | |
524 if (isClosing || isClosed) return 0; | |
525 _BufferAndStart bufferAndStart = | |
526 _ensureFastAndSerializableByteData( | |
527 buffer, offset, bytes); | |
528 var result = nativeSendTo( | |
Anders Johnsen
2013/11/29 12:36:54
Use result?
Søren Gjesse
2013/12/12 11:38:46
Done.
| |
529 bufferAndStart.buffer, bufferAndStart.start, bytes, | |
530 address._sockaddr_storage, port); | |
531 } | |
532 | |
474 _NativeSocket accept() { | 533 _NativeSocket accept() { |
475 // Don't issue accept if we're closing. | 534 // Don't issue accept if we're closing. |
476 if (isClosing || isClosed) return null; | 535 if (isClosing || isClosed) return null; |
477 var socket = new _NativeSocket.normal(); | 536 var socket = new _NativeSocket.normal(); |
478 if (nativeAccept(socket) != true) return null; | 537 if (nativeAccept(socket) != true) return null; |
479 socket.localPort = localPort; | 538 socket.localPort = localPort; |
480 socket.address = address; | 539 socket.address = address; |
481 return socket; | 540 return socket; |
482 } | 541 } |
483 | 542 |
484 int get port { | 543 int get port { |
485 if (localPort != null) return localPort; | 544 if (localPort != 0) return localPort; |
486 return localPort = nativeGetPort(); | 545 return localPort = nativeGetPort(); |
487 } | 546 } |
488 | 547 |
489 int get remotePort { | 548 int get remotePort { |
490 return nativeGetRemotePeer()[1]; | 549 return nativeGetRemotePeer()[1]; |
491 } | 550 } |
492 | 551 |
493 InternetAddress get remoteAddress { | 552 InternetAddress get remoteAddress { |
494 var result = nativeGetRemotePeer()[0]; | 553 var result = nativeGetRemotePeer()[0]; |
495 var type = new InternetAddressType._from(result[0]); | 554 var type = new InternetAddressType._from(result[0]); |
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
690 void reportError(error, String message) { | 749 void reportError(error, String message) { |
691 var e = createError(error, message, address, localPort); | 750 var e = createError(error, message, address, localPort); |
692 // Invoke the error handler if any. | 751 // Invoke the error handler if any. |
693 if (eventHandlers[ERROR_EVENT] != null) { | 752 if (eventHandlers[ERROR_EVENT] != null) { |
694 eventHandlers[ERROR_EVENT](e); | 753 eventHandlers[ERROR_EVENT](e); |
695 } | 754 } |
696 // For all errors we close the socket | 755 // For all errors we close the socket |
697 close(); | 756 close(); |
698 } | 757 } |
699 | 758 |
700 bool setOption(SocketOption option, bool enabled) { | 759 bool getOption(SocketOption option) { |
Anders Johnsen
2013/11/29 12:36:54
I suppose the result is dynamic?
Søren Gjesse
2013/12/12 11:38:46
Done.
| |
701 if (option is! SocketOption) throw new ArgumentError(options); | 760 if (option is! SocketOption) throw new ArgumentError(options); |
702 if (enabled is! bool) throw new ArgumentError(enabled); | 761 var result = nativeGetOption(option._value, address.type._value); |
703 return nativeSetOption(option._value, enabled); | 762 if (result is OSError) throw result; |
763 return result; | |
764 } | |
765 | |
766 bool setOption(SocketOption option, value) { | |
767 if (option is! SocketOption) throw new ArgumentError(options); | |
768 var result = nativeSetOption(option._value, address.type._value, value); | |
769 if (result is OSError) throw result; | |
770 } | |
771 | |
772 void join(InternetAddress addr, NetworkInterface interface) { | |
773 var result = nativeJoinMulticast(addr._sockaddr_storage, 0); | |
774 if (result is OSError) throw result; | |
775 } | |
776 | |
777 void leave(InternetAddress addr, NetworkInterface interface) { | |
778 var result = nativeLeaveMulticast(addr._sockaddr_storage, 0); | |
779 if (result is OSError) throw result; | |
704 } | 780 } |
705 | 781 |
706 void nativeSetSocketId(int id) native "Socket_SetSocketId"; | 782 void nativeSetSocketId(int id) native "Socket_SetSocketId"; |
707 nativeAvailable() native "Socket_Available"; | 783 nativeAvailable() native "Socket_Available"; |
708 nativeRead(int len) native "Socket_Read"; | 784 nativeRead(int len) native "Socket_Read"; |
785 nativeRecvFrom() native "Socket_RecvFrom"; | |
709 nativeWrite(List<int> buffer, int offset, int bytes) | 786 nativeWrite(List<int> buffer, int offset, int bytes) |
710 native "Socket_WriteList"; | 787 native "Socket_WriteList"; |
788 nativeSendTo(List<int> buffer, int offset, int bytes, | |
789 List<int> address, int port) | |
790 native "Socket_SendTo"; | |
711 nativeCreateConnect(List<int> addr, | 791 nativeCreateConnect(List<int> addr, |
712 int port) native "Socket_CreateConnect"; | 792 int port) native "Socket_CreateConnect"; |
713 nativeCreateBindListen(List<int> addr, int port, int backlog, bool v6Only) | 793 nativeCreateBindListen(List<int> addr, int port, int backlog, bool v6Only) |
714 native "ServerSocket_CreateBindListen"; | 794 native "ServerSocket_CreateBindListen"; |
795 nativeCreateBindDatagram(List<int> addr, int port, bool reuseAddress) | |
796 native "Socket_CreateBindDatagram"; | |
715 nativeAccept(_NativeSocket socket) native "ServerSocket_Accept"; | 797 nativeAccept(_NativeSocket socket) native "ServerSocket_Accept"; |
716 int nativeGetPort() native "Socket_GetPort"; | 798 int nativeGetPort() native "Socket_GetPort"; |
717 List nativeGetRemotePeer() native "Socket_GetRemotePeer"; | 799 List nativeGetRemotePeer() native "Socket_GetRemotePeer"; |
718 OSError nativeGetError() native "Socket_GetError"; | 800 OSError nativeGetError() native "Socket_GetError"; |
719 bool nativeSetOption(int option, bool enabled) native "Socket_SetOption"; | 801 nativeGetOption(int option, int protocol) native "Socket_GetOption"; |
802 bool nativeSetOption(int option, int protocol, value) | |
803 native "Socket_SetOption"; | |
804 bool nativeJoinMulticast(List<int> addr, int interface) | |
805 native "Socket_JoinMulticast"; | |
806 bool nativeLeaveMulticast(List<int> addr, int interface) | |
807 native "Socket_LeaveMulticast"; | |
720 } | 808 } |
721 | 809 |
722 | 810 |
723 class _RawServerSocket extends Stream<RawSocket> | 811 class _RawServerSocket extends Stream<RawSocket> |
724 implements RawServerSocket { | 812 implements RawServerSocket { |
725 final _NativeSocket _socket; | 813 final _NativeSocket _socket; |
726 StreamController<RawSocket> _controller; | 814 StreamController<RawSocket> _controller; |
727 | 815 |
728 static Future<_RawServerSocket> bind(address, | 816 static Future<_RawServerSocket> bind(address, |
729 int port, | 817 int port, |
(...skipping 542 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1272 if (_detachReady != null) { | 1360 if (_detachReady != null) { |
1273 _detachReady.complete(null); | 1361 _detachReady.complete(null); |
1274 } else { | 1362 } else { |
1275 if (_raw != null) { | 1363 if (_raw != null) { |
1276 _raw.shutdown(SocketDirection.SEND); | 1364 _raw.shutdown(SocketDirection.SEND); |
1277 _disableWriteEvent(); | 1365 _disableWriteEvent(); |
1278 } | 1366 } |
1279 } | 1367 } |
1280 } | 1368 } |
1281 } | 1369 } |
1370 | |
1371 | |
1372 class _RawDatagramSocket extends Stream implements RawDatagramSocket { | |
1373 _NativeSocket _socket; | |
1374 StreamController<RawSocketEvent> _controller; | |
1375 bool _readEventsEnabled = true; | |
1376 bool _writeEventsEnabled = true; | |
1377 | |
1378 _RawDatagramSocket(this._socket) { | |
Anders Johnsen
2013/11/29 12:36:54
Update with zone wrappers, like in RawSocket.
Søren Gjesse
2013/12/12 11:38:46
Done.
| |
1379 _controller = new StreamController(sync: true, | |
1380 onListen: _onSubscriptionStateChange, | |
1381 onCancel: _onSubscriptionStateChange, | |
1382 onPause: _onPauseStateChange, | |
1383 onResume: _onPauseStateChange); | |
1384 _socket.closeFuture.then((_) => _controller.close()); | |
1385 _socket.setHandlers( | |
1386 read: () => _controller.add(RawSocketEvent.READ), | |
1387 write: () { | |
1388 // The write event handler is automatically disabled by the | |
1389 // event handler when it fires. | |
1390 _writeEventsEnabled = false; | |
1391 _controller.add(RawSocketEvent.WRITE); | |
1392 }, | |
1393 closed: () => _controller.add(RawSocketEvent.READ_CLOSED), | |
1394 destroyed: () => _controller.add(RawSocketEvent.CLOSED), | |
1395 error: (e) { | |
1396 _controller.addError(e); | |
1397 close(); | |
1398 } | |
1399 ); | |
1400 } | |
1401 | |
1402 static Future<RawDatagramSocket> bind( | |
Anders Johnsen
2013/11/29 12:36:54
patch method?
Søren Gjesse
2013/12/12 11:38:46
Done.
| |
1403 host, int port, bool reuseAddress) { | |
1404 if (port < 0 || port > 0xffff) | |
1405 throw new ArgumentError("Invalid port $port"); | |
1406 return _NativeSocket.bindDatagram(host, port, reuseAddress) | |
1407 .then((socket) => new _RawDatagramSocket(socket)); | |
1408 } | |
1409 | |
1410 StreamSubscription<RawSocketEvent> listen(void onData(RawSocketEvent event), | |
1411 {Function onError, | |
1412 void onDone(), | |
1413 bool cancelOnError}) { | |
1414 return _controller.stream.listen( | |
1415 onData, | |
1416 onError: onError, | |
1417 onDone: onDone, | |
1418 cancelOnError: cancelOnError); | |
1419 } | |
1420 | |
1421 Future close() => _socket.close().then((_) => this); | |
1422 | |
1423 bool send(List<data> buffer, InternetAddress address, int port) { | |
1424 var result = _socket.send(buffer, 0, buffer.length, address, port); | |
1425 if (result is OSError) { | |
1426 throw result; | |
1427 } | |
1428 assert(result == buffer.length); | |
Anders Johnsen
2013/11/29 12:36:54
It can be 0?
Søren Gjesse
2013/12/12 11:38:46
Yes, Changed to just call the native socket as the
| |
1429 return true; | |
1430 } | |
1431 | |
1432 Datagram receive() { | |
1433 return _socket.receive(); | |
1434 } | |
1435 | |
1436 void join(InternetAddress group, [NetworkInterface interface]) { | |
1437 _socket.join(group, interface); | |
1438 } | |
1439 | |
1440 void leave(InternetAddress group, [NetworkInterface interface]) { | |
1441 _socket.leave(group, interface); | |
1442 } | |
1443 | |
1444 bool get readEventsEnabled => _readEventsEnabled; | |
1445 void set readEventsEnabled(bool value) { | |
1446 if (value != _readEventsEnabled) { | |
1447 _readEventsEnabled = value; | |
1448 if (!_controller.isPaused) _resume(); | |
1449 } | |
1450 } | |
1451 | |
1452 bool get writeEventsEnabled => _writeEventsEnabled; | |
1453 void set writeEventsEnabled(bool value) { | |
1454 if (value != _writeEventsEnabled) { | |
1455 _writeEventsEnabled = value; | |
1456 if (!_controller.isPaused) _resume(); | |
1457 } | |
1458 } | |
1459 | |
1460 bool get multicastLoopback => | |
1461 _socket.getOption(SocketOption._IP_MULTICAST_LOOP); | |
1462 void set multicastLoopback(bool value) => | |
1463 _socket.setOption(SocketOption._IP_MULTICAST_LOOP, value); | |
1464 | |
1465 int get multicastHops => | |
1466 _socket.getOption(SocketOption._IP_MULTICAST_HOPS); | |
1467 void set multicastHops(int value) => | |
1468 _socket.setOption(SocketOption._IP_MULTICAST_HOPS, value); | |
1469 | |
1470 NetworkInterface get multicastInterface => | |
1471 throw "Not implemented"; | |
1472 void set multicastInterface(NetworkInterface value) => | |
1473 throw "Not implemented"; | |
1474 | |
1475 bool get broadcastEnabled => | |
1476 _socket.getOption(SocketOption._IP_BROADCAST); | |
1477 void set broadcastEnabled(bool value) => | |
1478 _socket.setOption(SocketOption._IP_BROADCAST, value); | |
1479 | |
1480 int get port => _socket.port; | |
1481 | |
1482 InternetAddress get address => _socket.address; | |
1483 | |
1484 _pause() { | |
1485 _socket.setListening(read: false, write: false); | |
1486 } | |
1487 | |
1488 void _resume() { | |
1489 _socket.setListening(read: _readEventsEnabled, write: _writeEventsEnabled); | |
1490 } | |
1491 | |
1492 void _onPauseStateChange() { | |
1493 if (_controller.isPaused) { | |
1494 _pause(); | |
1495 } else { | |
1496 _resume(); | |
1497 } | |
1498 } | |
1499 | |
1500 void _onSubscriptionStateChange() { | |
1501 if (_controller.hasListener) { | |
1502 _resume(); | |
1503 } else { | |
1504 close(); | |
1505 } | |
1506 } | |
1507 } | |
1508 | |
1509 Datagram _makeDatagram(List<int> data, | |
1510 bool ipV6, | |
1511 String address, | |
1512 List<int> sockaddr_storage, | |
1513 int port) { | |
1514 var addressType = | |
1515 ipV6 ? InternetAddressType.IP_V6 : InternetAddressType.IP_V4; | |
1516 return new Datagram( | |
1517 data, | |
1518 new _InternetAddress(addressType, address, null, sockaddr_storage), | |
1519 port); | |
1520 } | |
OLD | NEW |