X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2FSystem%2FSystem.Net.NetworkInformation%2FIPAddressCollection.cs;h=e4c9d095cb33ec229a9fe1408713387899a69b26;hb=c54dd89a050536b2f61b933bcf3604dcdc52a5de;hp=b714220e0a0e6a57c12a02717a6623b560f170dd;hpb=6110fc90713ce59ff0996fcd3520e09a96575820;p=mono.git diff --git a/mcs/class/System/System.Net.NetworkInformation/IPAddressCollection.cs b/mcs/class/System/System.Net.NetworkInformation/IPAddressCollection.cs index b714220e0a0..e4c9d095cb3 100644 --- a/mcs/class/System/System.Net.NetworkInformation/IPAddressCollection.cs +++ b/mcs/class/System/System.Net.NetworkInformation/IPAddressCollection.cs @@ -1,10 +1,11 @@ // // System.Net.NetworkInformation.IPAddressCollection // -// Author: +// Authors: // Gonzalo Paniagua Javier (gonzalo@novell.com) +// Atsushi Enomoto (atsushi@ximian.com) // -// Copyright (c) 2006 Novell, Inc. (http://www.novell.com) +// Copyright (c) 2006-2007 Novell, Inc. (http://www.novell.com) // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the @@ -29,10 +30,12 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Net; +using System.Runtime.InteropServices; namespace System.Net.NetworkInformation { public class IPAddressCollection : ICollection, IEnumerable, IEnumerable { - List list; + List list = new List (); protected internal IPAddressCollection () { @@ -40,12 +43,16 @@ namespace System.Net.NetworkInformation { public virtual void Add (IPAddress address) { - throw new NotSupportedException ("The collection is read-only."); + if (IsReadOnly) + throw new NotSupportedException ("The collection is read-only."); + list.Add (address); } public virtual void Clear () { - throw new NotSupportedException ("The collection is read-only."); + if (IsReadOnly) + throw new NotSupportedException ("The collection is read-only."); + list.Clear (); } public virtual bool Contains (IPAddress address) @@ -65,7 +72,9 @@ namespace System.Net.NetworkInformation { public virtual bool Remove (IPAddress address) { - throw new NotSupportedException ("The collection is read-only."); + if (IsReadOnly) + throw new NotSupportedException ("The collection is read-only."); + return list.Remove (address); } IEnumerator IEnumerable.GetEnumerator () @@ -85,6 +94,75 @@ namespace System.Net.NetworkInformation { get { return list [index]; } } } + + class Win32IPAddressCollection : IPAddressCollection + { + public static readonly Win32IPAddressCollection Empty = new Win32IPAddressCollection (IntPtr.Zero); + + bool is_readonly; + + // for static methods + Win32IPAddressCollection () + { + } + + public Win32IPAddressCollection (params IntPtr [] heads) + { + foreach (IntPtr head in heads) + AddSubsequentlyString (head); + is_readonly = true; + } + + public Win32IPAddressCollection (params Win32_IP_ADDR_STRING [] al) + { + foreach (Win32_IP_ADDR_STRING a in al) { + if (String.IsNullOrEmpty (a.IpAddress)) + continue; + Add (IPAddress.Parse (a.IpAddress)); + AddSubsequentlyString (a.Next); + } + is_readonly = true; + } + + public static Win32IPAddressCollection FromAnycast (IntPtr ptr) + { + Win32IPAddressCollection c = new Win32IPAddressCollection (); + Win32_IP_ADAPTER_ANYCAST_ADDRESS a; + for (IntPtr p = ptr; p != IntPtr.Zero; p = a.Next) { + a = (Win32_IP_ADAPTER_ANYCAST_ADDRESS) Marshal.PtrToStructure (p, typeof (Win32_IP_ADAPTER_ANYCAST_ADDRESS)); + c.Add (a.Address.GetIPAddress ()); + } + c.is_readonly = true; + return c; + } + + public static Win32IPAddressCollection FromDnsServer (IntPtr ptr) + { + Win32IPAddressCollection c = new Win32IPAddressCollection (); + Win32_IP_ADAPTER_DNS_SERVER_ADDRESS a; + for (IntPtr p = ptr; p != IntPtr.Zero; p = a.Next) { + a = (Win32_IP_ADAPTER_DNS_SERVER_ADDRESS) Marshal.PtrToStructure (p, typeof (Win32_IP_ADAPTER_DNS_SERVER_ADDRESS)); +// FIXME: It somehow fails here. Looks like there is something wrong. +//if (a.Address.Sockaddr == IntPtr.Zero) throw new Exception ("pointer " + p + " a.length " + a.Address.SockaddrLength); + c.Add (a.Address.GetIPAddress ()); + } + c.is_readonly = true; + return c; + } + + void AddSubsequentlyString (IntPtr head) + { + Win32_IP_ADDR_STRING a; + for (IntPtr p = head; p != IntPtr.Zero; p = a.Next) { + a = (Win32_IP_ADDR_STRING) Marshal.PtrToStructure (p, typeof (Win32_IP_ADDR_STRING)); + Add (IPAddress.Parse (a.IpAddress)); + } + } + + public override bool IsReadOnly { + get { return is_readonly; } + } + } } #endif