Index: runtime/bin/socket_patch.dart |
diff --git a/runtime/bin/socket_patch.dart b/runtime/bin/socket_patch.dart |
index a4b9c83d35f4bcede943aab52551d58e6ad447b7..49fca7986e6744b6ae40c12f1a0c81357d327760 100644 |
--- a/runtime/bin/socket_patch.dart |
+++ b/runtime/bin/socket_patch.dart |
@@ -106,6 +106,19 @@ class _InternetAddress implements InternetAddress { |
} |
} |
+ bool get isMulticast { |
+ switch (type) { |
+ case InternetAddressType.IP_V4: |
+ // Checking for 224.0.0.0 through 239.255.255.255. |
+ return _sockaddr_storage[_IPV4_ADDR_OFFSET] >= 224 && |
+ _sockaddr_storage[_IPV4_ADDR_OFFSET] < 240; |
+ |
+ case InternetAddressType.IP_V6: |
+ // Checking for ff00::/8. |
+ return _sockaddr_storage[_IPV6_ADDR_OFFSET] == 0xFF; |
+ } |
+ } |
+ |
Future<InternetAddress> reverse() => _NativeSocket.reverseLookup(this); |
_InternetAddress(InternetAddressType this.type, |
@@ -113,6 +126,17 @@ class _InternetAddress implements InternetAddress { |
String this._host, |
List<int> this._sockaddr_storage); |
+ factory _InternetAddress.parse(String address) { |
+ var type = address.indexOf(':') == -1 |
+ ? InternetAddressType.IP_V4 |
+ : InternetAddressType.IP_V6; |
+ var raw = _parse(type._value, address); |
+ if (raw == null) { |
+ throw new ArgumentError("Invalid internet address $address"); |
+ } |
+ return new _InternetAddress(type, address, null, raw); |
+ } |
+ |
factory _InternetAddress.fixed(int id) { |
var sockaddr = _fixed(id); |
switch (id) { |
@@ -140,11 +164,31 @@ class _InternetAddress implements InternetAddress { |
type, address, host, new Uint8List.fromList(_sockaddr_storage)); |
} |
+ bool operator ==(other) { |
+ if (!(other is _InternetAddress)) return false; |
+ if (other.type != type) return false; |
+ bool equals = true; |
+ for (int i = 0; i < _sockaddr_storage.length && equals; i++) { |
+ equals = other._sockaddr_storage[i] == _sockaddr_storage[i]; |
+ } |
+ return equals; |
+ } |
+ |
+ int get hashCode { |
+ int result = 1; |
+ for (int i = 0; i < _sockaddr_storage.length; i++) { |
+ result = (result * 31 + _sockaddr_storage[i]) & 0x3FFFFFFF; |
+ } |
+ return result; |
+ } |
+ |
String toString() { |
return "InternetAddress('$address', ${type.name})"; |
} |
static Uint8List _fixed(int id) native "InternetAddress_Fixed"; |
+ static Uint8List _parse(int type, String address) |
+ native "InternetAddress_Parse"; |
} |
class _NetworkInterface implements NetworkInterface { |