//
// System.Net.NetworkInformation.MulticastIPAddressInformationCollection
//
-// Author:
+// Authors:
// Gonzalo Paniagua Javier (gonzalo@novell.com)
+// Atsushi Enomoto (atsushi@ximian.com)
+// Eric Butler (eric@extremeboredom.net)
//
-// 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.Collections;
using System.Collections.Generic;
+using System.Runtime.InteropServices;
namespace System.Net.NetworkInformation {
public class MulticastIPAddressInformationCollection : ICollection<MulticastIPAddressInformation>, IEnumerable<MulticastIPAddressInformation>, IEnumerable {
- List<MulticastIPAddressInformation> list; // We want an internal ctor that fills this list up.
+ List<MulticastIPAddressInformation> list = new List<MulticastIPAddressInformation> ();
protected internal MulticastIPAddressInformationCollection ()
{
public virtual void Add (MulticastIPAddressInformation 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 (MulticastIPAddressInformation address)
public virtual bool Remove (MulticastIPAddressInformation 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 ()
get { return list [index]; }
}
}
-}
+
+ class MulticastIPAddressInformationImplCollection : MulticastIPAddressInformationCollection
+ {
+ public static readonly MulticastIPAddressInformationImplCollection Empty = new MulticastIPAddressInformationImplCollection (true);
+
+ bool is_readonly;
+
+ // for static methods
+ MulticastIPAddressInformationImplCollection (bool isReadOnly)
+ {
+ is_readonly = isReadOnly;
+ }
+
+ public override bool IsReadOnly {
+ get { return is_readonly; }
+ }
+
+#if !MOBILE
+ public static MulticastIPAddressInformationCollection Win32FromMulticast (IntPtr ptr)
+ {
+ MulticastIPAddressInformationImplCollection c = new MulticastIPAddressInformationImplCollection (false);
+ Win32_IP_ADAPTER_MULTICAST_ADDRESS a;
+ for (IntPtr p = ptr; p != IntPtr.Zero; p = a.Next) {
+ a = (Win32_IP_ADAPTER_MULTICAST_ADDRESS) Marshal.PtrToStructure (p, typeof (Win32_IP_ADAPTER_MULTICAST_ADDRESS));
+ c.Add (new MulticastIPAddressInformationImpl (
+ a.Address.GetIPAddress (),
+ a.LengthFlags.IsDnsEligible,
+ a.LengthFlags.IsTransient));
+ }
+ c.is_readonly = true;
+ return c;
+ }
#endif
+ public static MulticastIPAddressInformationImplCollection LinuxFromList (List<IPAddress> addresses)
+ {
+ MulticastIPAddressInformationImplCollection c = new MulticastIPAddressInformationImplCollection (false);
+ foreach (IPAddress address in addresses) {
+ c.Add (new MulticastIPAddressInformationImpl (
+ address,
+ true,
+ false));
+ }
+ c.is_readonly = true;
+ return c;
+ }
+ }
+}