X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2FSystem%2FSystem.Net.NetworkInformation%2FIPAddressInformationCollection.cs;h=0eac24f36e3a664ea0ce2aeb3020dc73ab0c4d9b;hb=074a90260c3b8b86444248703bc35bd0be6ae7cf;hp=33b5da3a52e9eeda8534643b01ad44b5edc68b3f;hpb=b6b13e72e91d5b529a6306ce53bda685932c77db;p=mono.git diff --git a/mcs/class/System/System.Net.NetworkInformation/IPAddressInformationCollection.cs b/mcs/class/System/System.Net.NetworkInformation/IPAddressInformationCollection.cs index 33b5da3a52e..0eac24f36e3 100644 --- a/mcs/class/System/System.Net.NetworkInformation/IPAddressInformationCollection.cs +++ b/mcs/class/System/System.Net.NetworkInformation/IPAddressInformationCollection.cs @@ -1,10 +1,11 @@ // // System.Net.NetworkInformation.IPAddressInformationCollection // -// 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,11 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Runtime.InteropServices; namespace System.Net.NetworkInformation { public class IPAddressInformationCollection : ICollection, IEnumerable, IEnumerable { - List list; + List list = new List (); internal IPAddressInformationCollection () { @@ -40,12 +42,16 @@ namespace System.Net.NetworkInformation { public virtual void Add (IPAddressInformation 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 (IPAddressInformation address) @@ -65,7 +71,9 @@ namespace System.Net.NetworkInformation { public virtual bool Remove (IPAddressInformation 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 +93,48 @@ namespace System.Net.NetworkInformation { get { return list [index]; } } } + + class IPAddressInformationImplCollection : IPAddressInformationCollection + { + public static readonly IPAddressInformationImplCollection Empty = new IPAddressInformationImplCollection (true); + + bool is_readonly; + + // for static methods + IPAddressInformationImplCollection (bool isReadOnly) + { + is_readonly = isReadOnly; + } + + public override bool IsReadOnly { + get { return is_readonly; } + } + + public static IPAddressInformationCollection Win32FromAnycast (IntPtr ptr) + { + IPAddressInformationImplCollection c = new IPAddressInformationImplCollection (false); + 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 (new IPAddressInformationImpl ( + a.Address.GetIPAddress (), + a.LengthFlags.IsDnsEligible, + a.LengthFlags.IsTransient)); + } + c.is_readonly = true; + return c; + } + + public static IPAddressInformationImplCollection LinuxFromAnycast (IList addresses) + { + IPAddressInformationImplCollection c = new IPAddressInformationImplCollection (false); + foreach (IPAddress address in addresses) { + c.Add (new IPAddressInformationImpl (address, false, false)); + } + c.is_readonly = true; + return c; + } + } } #endif