Merge pull request #439 from mono-soc-2012/garyb/iconfix
[mono.git] / mcs / class / System / System.Net.NetworkInformation / UnicastIPAddressInformation.cs
index 87238c9aefff91a16c60121739dd027cb7512d3c..571bbad7f178b98cb55746f1b72634adc1510d47 100644 (file)
@@ -1,10 +1,12 @@
 //
 // System.Net.NetworkInformation.UnicastIPAddressInformation
 //
-// 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
@@ -25,8 +27,8 @@
 // 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.Runtime.InteropServices;
 
 namespace System.Net.NetworkInformation {
        public abstract class UnicastIPAddressInformation : IPAddressInformation {
@@ -42,6 +44,135 @@ namespace System.Net.NetworkInformation {
                public abstract PrefixOrigin PrefixOrigin { get; }
                public abstract SuffixOrigin SuffixOrigin { get; }
        }
+
+       class Win32UnicastIPAddressInformation : UnicastIPAddressInformation 
+       {
+               int if_index;
+               Win32_IP_ADAPTER_UNICAST_ADDRESS info;
+
+               public Win32UnicastIPAddressInformation (int ifIndex, Win32_IP_ADAPTER_UNICAST_ADDRESS info)
+               {
+                       this.if_index = ifIndex;
+                       this.info = info;
+               }
+
+               public override IPAddress Address {
+                       get { return info.Address.GetIPAddress (); }
+               }
+
+               public override bool IsDnsEligible {
+                       get { return info.LengthFlags.IsDnsEligible; }
+               }
+
+               public override bool IsTransient {
+                       get { return info.LengthFlags.IsTransient; }
+               }
+
+               // UnicastIPAddressInformation members
+
+               public override long AddressPreferredLifetime {
+                       get { return info.PreferredLifetime; }
+               }
+
+               public override long AddressValidLifetime {
+                       get { return info.ValidLifetime; }
+               }
+
+               public override long DhcpLeaseLifetime {
+                       get { return info.LeaseLifetime; }
+               }
+
+               public override DuplicateAddressDetectionState DuplicateAddressDetectionState {
+                       get { return info.DadState; }
+               }
+
+               public override IPAddress IPv4Mask {
+                       get {
+                               Win32_IP_ADAPTER_INFO ai = Win32NetworkInterface2.GetAdapterInfoByIndex (if_index);
+                               if (ai == null)
+                                       throw new Exception ("huh? " + if_index);
+                               if (this.Address == null)
+                                       return null;
+                               string expected = this.Address.ToString ();
+                               unsafe {
+                                       Win32_IP_ADDR_STRING p = ai.IpAddressList;
+                                       while (true) {
+                                               if (p.IpAddress == expected)
+                                                       return IPAddress.Parse (p.IpMask);
+                                               if (p.Next == IntPtr.Zero)
+                                                       break;
+                                               p = (Win32_IP_ADDR_STRING) Marshal.PtrToStructure (p.Next, typeof (Win32_IP_ADDR_STRING));
+                                       }
+
+                                       // Or whatever it should be...
+                                       return null;
+                               }
+                       }
+               }
+
+               public override PrefixOrigin PrefixOrigin {
+                       get { return info.PrefixOrigin; }
+               }
+
+               public override SuffixOrigin SuffixOrigin {
+                       get { return info.SuffixOrigin; }
+               }
+       }
+
+       class LinuxUnicastIPAddressInformation : UnicastIPAddressInformation
+       {
+               IPAddress address;
+
+               public LinuxUnicastIPAddressInformation (IPAddress address)
+               {
+                       this.address = address;
+               }
+
+               public override IPAddress Address {
+                       get { return address; }
+               }
+
+               public override bool IsDnsEligible {
+                       get {
+                               byte[] addressBytes = address.GetAddressBytes ();
+                               return !(addressBytes[0] == 169 && addressBytes[1] == 254);
+                       }
+               }
+
+               [MonoTODO("Always returns false")]
+               public override bool IsTransient {
+                       get { return false; }
+               }
+
+               // UnicastIPAddressInformation members
+
+               public override long AddressPreferredLifetime {
+                       get { throw new NotImplementedException (); }
+               }
+
+               public override long AddressValidLifetime {
+                       get { throw new NotImplementedException (); }
+               }
+
+               public override long DhcpLeaseLifetime {
+                       get { throw new NotImplementedException (); }
+               }
+
+               public override DuplicateAddressDetectionState DuplicateAddressDetectionState {
+                       get { throw new NotImplementedException (); }
+               }
+
+               public override IPAddress IPv4Mask {
+                       get { throw new NotImplementedException (); }
+               }
+
+               public override PrefixOrigin PrefixOrigin {
+                       get { throw new NotImplementedException (); }
+               }
+
+               public override SuffixOrigin SuffixOrigin {
+                       get { throw new NotImplementedException (); }
+               }
+       }
 }
-#endif