| 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 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 99 return _sockaddr_storage[_IPV4_ADDR_OFFSET] == 169 && | 99 return _sockaddr_storage[_IPV4_ADDR_OFFSET] == 169 && |
| 100 _sockaddr_storage[_IPV4_ADDR_OFFSET + 1] == 254; | 100 _sockaddr_storage[_IPV4_ADDR_OFFSET + 1] == 254; |
| 101 | 101 |
| 102 case InternetAddressType.IP_V6: | 102 case InternetAddressType.IP_V6: |
| 103 // Checking for fe80::/10. | 103 // Checking for fe80::/10. |
| 104 return _sockaddr_storage[_IPV6_ADDR_OFFSET] == 0xFE && | 104 return _sockaddr_storage[_IPV6_ADDR_OFFSET] == 0xFE && |
| 105 (_sockaddr_storage[_IPV6_ADDR_OFFSET + 1] & 0xB0) == 0x80; | 105 (_sockaddr_storage[_IPV6_ADDR_OFFSET + 1] & 0xB0) == 0x80; |
| 106 } | 106 } |
| 107 } | 107 } |
| 108 | 108 |
| 109 bool get isMulticast { |
| 110 switch (type) { |
| 111 case InternetAddressType.IP_V4: |
| 112 // Checking for 224.0.0.0 through 239.255.255.255. |
| 113 return _sockaddr_storage[_IPV4_ADDR_OFFSET] >= 224 && |
| 114 _sockaddr_storage[_IPV4_ADDR_OFFSET] < 240; |
| 115 |
| 116 case InternetAddressType.IP_V6: |
| 117 // Checking for ff00::/8. |
| 118 return _sockaddr_storage[_IPV6_ADDR_OFFSET] == 0xFF; |
| 119 } |
| 120 } |
| 121 |
| 109 Future<InternetAddress> reverse() => _NativeSocket.reverseLookup(this); | 122 Future<InternetAddress> reverse() => _NativeSocket.reverseLookup(this); |
| 110 | 123 |
| 111 _InternetAddress(InternetAddressType this.type, | 124 _InternetAddress(InternetAddressType this.type, |
| 112 String this.address, | 125 String this.address, |
| 113 String this._host, | 126 String this._host, |
| 114 List<int> this._sockaddr_storage); | 127 List<int> this._sockaddr_storage); |
| 115 | 128 |
| 129 factory _InternetAddress.parse(String address) { |
| 130 var type = address.indexOf(':') == -1 |
| 131 ? InternetAddressType.IP_V4 |
| 132 : InternetAddressType.IP_V6; |
| 133 var raw = _parse(type._value, address); |
| 134 if (raw == null) { |
| 135 throw new ArgumentError("Invalid internet address $address"); |
| 136 } |
| 137 return new _InternetAddress(type, address, null, raw); |
| 138 } |
| 139 |
| 116 factory _InternetAddress.fixed(int id) { | 140 factory _InternetAddress.fixed(int id) { |
| 117 var sockaddr = _fixed(id); | 141 var sockaddr = _fixed(id); |
| 118 switch (id) { | 142 switch (id) { |
| 119 case _ADDRESS_LOOPBACK_IP_V4: | 143 case _ADDRESS_LOOPBACK_IP_V4: |
| 120 return new _InternetAddress( | 144 return new _InternetAddress( |
| 121 InternetAddressType.IP_V4, "127.0.0.1", null, sockaddr); | 145 InternetAddressType.IP_V4, "127.0.0.1", null, sockaddr); |
| 122 case _ADDRESS_LOOPBACK_IP_V6: | 146 case _ADDRESS_LOOPBACK_IP_V6: |
| 123 return new _InternetAddress( | 147 return new _InternetAddress( |
| 124 InternetAddressType.IP_V6, "::1", null, sockaddr); | 148 InternetAddressType.IP_V6, "::1", null, sockaddr); |
| 125 case _ADDRESS_ANY_IP_V4: | 149 case _ADDRESS_ANY_IP_V4: |
| 126 return new _InternetAddress( | 150 return new _InternetAddress( |
| 127 InternetAddressType.IP_V4, "0.0.0.0", "0.0.0.0", sockaddr); | 151 InternetAddressType.IP_V4, "0.0.0.0", "0.0.0.0", sockaddr); |
| 128 case _ADDRESS_ANY_IP_V6: | 152 case _ADDRESS_ANY_IP_V6: |
| 129 return new _InternetAddress( | 153 return new _InternetAddress( |
| 130 InternetAddressType.IP_V6, "::", "::", sockaddr); | 154 InternetAddressType.IP_V6, "::", "::", sockaddr); |
| 131 default: | 155 default: |
| 132 assert(false); | 156 assert(false); |
| 133 throw new ArgumentError(); | 157 throw new ArgumentError(); |
| 134 } | 158 } |
| 135 } | 159 } |
| 136 | 160 |
| 137 // Create a clone of this _InternetAddress replacing the host. | 161 // Create a clone of this _InternetAddress replacing the host. |
| 138 _InternetAddress _cloneWithNewHost(String host) { | 162 _InternetAddress _cloneWithNewHost(String host) { |
| 139 return new _InternetAddress( | 163 return new _InternetAddress( |
| 140 type, address, host, new Uint8List.fromList(_sockaddr_storage)); | 164 type, address, host, new Uint8List.fromList(_sockaddr_storage)); |
| 141 } | 165 } |
| 142 | 166 |
| 167 bool operator ==(other) { |
| 168 if (!(other is _InternetAddress)) return false; |
| 169 if (other.type != type) return false; |
| 170 bool equals = true; |
| 171 for (int i = 0; i < _sockaddr_storage.length && equals; i++) { |
| 172 equals = other._sockaddr_storage[i] == _sockaddr_storage[i]; |
| 173 } |
| 174 return equals; |
| 175 } |
| 176 |
| 177 int get hashCode { |
| 178 int result = 1; |
| 179 for (int i = 0; i < _sockaddr_storage.length; i++) { |
| 180 result = (result * 31 + _sockaddr_storage[i]) & 0x3FFFFFFF; |
| 181 } |
| 182 return result; |
| 183 } |
| 184 |
| 143 String toString() { | 185 String toString() { |
| 144 return "InternetAddress('$address', ${type.name})"; | 186 return "InternetAddress('$address', ${type.name})"; |
| 145 } | 187 } |
| 146 | 188 |
| 147 static Uint8List _fixed(int id) native "InternetAddress_Fixed"; | 189 static Uint8List _fixed(int id) native "InternetAddress_Fixed"; |
| 190 static Uint8List _parse(int type, String address) |
| 191 native "InternetAddress_Parse"; |
| 148 } | 192 } |
| 149 | 193 |
| 150 class _NetworkInterface implements NetworkInterface { | 194 class _NetworkInterface implements NetworkInterface { |
| 151 final String name; | 195 final String name; |
| 152 final List<InternetAddress> addresses; | 196 final List<InternetAddress> addresses; |
| 153 | 197 |
| 154 _NetworkInterface(String this.name, List<InternetAddress> this.addresses); | 198 _NetworkInterface(String this.name, List<InternetAddress> this.addresses); |
| 155 | 199 |
| 156 String toString() { | 200 String toString() { |
| 157 return "NetworkInterface('$name', $addresses)"; | 201 return "NetworkInterface('$name', $addresses)"; |
| (...skipping 1062 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1220 if (_detachReady != null) { | 1264 if (_detachReady != null) { |
| 1221 _detachReady.complete(null); | 1265 _detachReady.complete(null); |
| 1222 } else { | 1266 } else { |
| 1223 if (_raw != null) { | 1267 if (_raw != null) { |
| 1224 _raw.shutdown(SocketDirection.SEND); | 1268 _raw.shutdown(SocketDirection.SEND); |
| 1225 _disableWriteEvent(); | 1269 _disableWriteEvent(); |
| 1226 } | 1270 } |
| 1227 } | 1271 } |
| 1228 } | 1272 } |
| 1229 } | 1273 } |
| OLD | NEW |