2007-09-29 Miguel de Icaza <miguel@novell.com>
[mono.git] / mcs / class / System / System.Net.NetworkInformation / IPv4InterfaceProperties.cs
index b3d3817e951bc0c68f57b6e16a443545162ad9e6..8899a9c70c787a26b1ff87e1bef2b0a0853b7464 100644 (file)
@@ -1,10 +1,11 @@
 //
 // System.Net.NetworkInformation.IPv4InterfaceProperties
 //
-// 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
@@ -26,6 +27,8 @@
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
 #if NET_2_0
+using System.Runtime.InteropServices;
+
 namespace System.Net.NetworkInformation {
        public abstract class IPv4InterfaceProperties {
                protected IPv4InterfaceProperties ()
@@ -40,6 +43,68 @@ namespace System.Net.NetworkInformation {
                public abstract int Mtu { get; }
                public abstract bool UsesWins { get; }
        }
+
+       class Win32IPv4InterfaceProperties : IPv4InterfaceProperties
+       {
+               [DllImport ("iphlpapi.dll")]
+               static extern int GetPerAdapterInfo (int IfIndex, Win32_IP_PER_ADAPTER_INFO pPerAdapterInfo, ref int pOutBufLen);
+
+               Win32_IP_ADAPTER_INFO ainfo;
+               Win32_IP_PER_ADAPTER_INFO painfo;
+               Win32_MIB_IFROW mib;
+
+               public Win32IPv4InterfaceProperties (Win32_IP_ADAPTER_INFO ainfo, Win32_MIB_IFROW mib)
+               {
+                       this.ainfo = ainfo;
+                       this.mib = mib;
+
+                       // get per-adapter info.
+                       int size = 0;
+                       GetPerAdapterInfo (mib.Index, null, ref size);
+                       painfo = new Win32_IP_PER_ADAPTER_INFO ();
+                       int ret = GetPerAdapterInfo (mib.Index, painfo, ref size);
+                       if (ret != 0)
+                               throw new NetworkInformationException (ret);
+               }
+
+               public override int Index {
+                       get { return mib.Index; }
+               }
+
+               public override bool IsAutomaticPrivateAddressingActive {
+                       get { return painfo.AutoconfigActive != 0; }
+               }
+
+               public override bool IsAutomaticPrivateAddressingEnabled {
+                       get { return painfo.AutoconfigEnabled != 0; }
+               }
+
+               public override bool IsDhcpEnabled {
+                       get { return ainfo.DhcpEnabled != 0; }
+               }
+
+               public override bool IsForwardingEnabled {
+                       // Is it the right answer? In Vista there is MIB_IPINTERFACEROW.ForwardingEnabled, but not in former versions.
+                       get { return Win32_FIXED_INFO.Instance.EnableRouting != 0; }
+               }
+
+               public override int Mtu {
+                       get { return mib.Mtu; }
+               }
+
+               public override bool UsesWins {
+                       get { return ainfo.HaveWins; }
+               }
+       }
+
+       [StructLayout (LayoutKind.Sequential)]
+       class Win32_IP_PER_ADAPTER_INFO
+       {
+               public uint AutoconfigEnabled;
+               public uint AutoconfigActive;
+               public IntPtr CurrentDnsServer; // to Win32_IP_ADDR_STRING
+               public Win32_IP_ADDR_STRING DnsServerList;
+       }
 }
 #endif