//
// 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
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
-#if NET_2_0
using System;
using System.Collections;
using System.Collections.Generic;
+using System.Net;
+using System.Runtime.InteropServices;
namespace System.Net.NetworkInformation {
- public class IPAddressCollection : ICollection<IPAddress>, IEnumerable<IPAddress>, IEnumerable {
- List<IPAddress> list;
- protected internal IPAddressCollection ()
- {
- }
+#if !MOBILE
+ class Win32IPAddressCollection : IPAddressCollection
+ {
+ public static readonly Win32IPAddressCollection Empty = new Win32IPAddressCollection (IntPtr.Zero);
- public virtual void Add (IPAddress address)
- {
- throw new NotSupportedException ("The collection is read-only.");
- }
+ bool is_readonly;
- public virtual void Clear ()
+ // for static methods
+ Win32IPAddressCollection ()
{
- throw new NotSupportedException ("The collection is read-only.");
}
- public virtual bool Contains (IPAddress address)
+ public Win32IPAddressCollection (params IntPtr [] heads)
{
- return list.Contains (address);
+ foreach (IntPtr head in heads)
+ AddSubsequentlyString (head);
+ is_readonly = true;
}
- public virtual void CopyTo (IPAddress [] array, int offset)
+ public Win32IPAddressCollection (params Win32_IP_ADDR_STRING [] al)
{
- list.CopyTo (array, offset);
+ 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 virtual IEnumerator<IPAddress> GetEnumerator ()
+ public static Win32IPAddressCollection FromAnycast (IntPtr ptr)
{
- return ((IEnumerable<IPAddress>)list).GetEnumerator ();
+ 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 virtual bool Remove (IPAddress address)
+ public static Win32IPAddressCollection FromDnsServer (IntPtr ptr)
{
- throw new NotSupportedException ("The collection is read-only.");
+ 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;
}
- IEnumerator IEnumerable.GetEnumerator ()
+ void AddSubsequentlyString (IntPtr head)
{
- return list.GetEnumerator ();
- }
-
- public virtual int Count {
- get { return list.Count; }
+ 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 virtual bool IsReadOnly {
- get { return true; }
- }
-
- public virtual IPAddress this [int index] {
- get { return list [index]; }
+ public override bool IsReadOnly {
+ get { return is_readonly; }
}
}
-}
#endif
+}
+