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; | |
Anders Johnsen
2013/11/20 09:51:51
Check next byte for '00' as well?
Søren Gjesse
2013/11/20 10:00:28
Only the top byte needs to be FF. The /8 indicate
| |
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("Illegal internet address $address"); | |
Anders Johnsen
2013/11/20 09:51:51
Invalid?
Søren Gjesse
2013/11/20 10:00:28
Done.
| |
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 |