[System] Throw PlatformNotSupportedException if NetworkInformation.NetworkChange...
[mono.git] / mcs / class / System / System.Net.NetworkInformation / NetworkChange.cs
index de9754e951d0a812c3128a35c4cdcf5789991184..50e9009741a2f5d028818a16e4aa7ddc0354d6a8 100644 (file)
@@ -101,16 +101,20 @@ namespace System.Net.NetworkInformation {
 
                static void MaybeCreate ()
                {
+#if MONOTOUCH_WATCH
+                       throw new PlatformNotSupportedException ("NetworkInformation.NetworkChange is not supported on the current platform.");
+#else
                        if (networkChange != null)
                                return;
 
                        try {
                                networkChange = new MacNetworkChange ();
                        } catch {
-#if !NETWORK_CHANGE_STANDALONE
+#if !NETWORK_CHANGE_STANDALONE && !MONOTOUCH
                                networkChange = new LinuxNetworkChange ();
 #endif
                        }
+#endif // MONOTOUCH_WATCH
                }
 
                static void MaybeDispose ()
@@ -122,6 +126,7 @@ namespace System.Net.NetworkInformation {
                }
        }
 
+#if !MONOTOUCH_WATCH
        internal sealed class MacNetworkChange : INetworkChange
        {
                const string DL_LIB = "/usr/lib/libSystem.dylib";
@@ -317,8 +322,9 @@ namespace System.Net.NetworkInformation {
                                availabilityChanged (null, new NetworkAvailabilityEventArgs (instance.IsAvailable));
                }
        }
+#endif // !MONOTOUCH_WATCH
 
-#if !NETWORK_CHANGE_STANDALONE
+#if !NETWORK_CHANGE_STANDALONE && !MONOTOUCH
 
        internal sealed class LinuxNetworkChange : INetworkChange {
                [Flags]
@@ -365,7 +371,9 @@ namespace System.Net.NetworkInformation {
                                if (fd.ToInt64 () == -1)
                                        return false;
 
-                               nl_sock = new Socket (0, SocketType.Raw, ProtocolType.Udp, fd);
+                               var safeHandle = new SafeSocketHandle (fd, true);
+
+                               nl_sock = new Socket (0, SocketType.Raw, ProtocolType.Udp, safeHandle);
                                nl_args = new SocketAsyncEventArgs ();
                                nl_args.SetBuffer (new byte [8192], 0, 8192);
                                nl_args.Completed += OnDataAvailable;
@@ -402,13 +410,15 @@ namespace System.Net.NetworkInformation {
                void OnAvailabilityChanged (object unused)
                {
                        NetworkAvailabilityChangedEventHandler d = AvailabilityChanged;
-                       d (null, new NetworkAvailabilityEventArgs (GetAvailability ()));
+                       if (d != null)
+                               d (null, new NetworkAvailabilityEventArgs (GetAvailability ()));
                }
 
                void OnAddressChanged (object unused)
                {
                        NetworkAddressChangedEventHandler d = AddressChanged;
-                       d (null, EventArgs.Empty);
+                       if (d != null)
+                               d (null, EventArgs.Empty);
                }
 
                void OnEventDue (object unused)
@@ -438,8 +448,10 @@ namespace System.Net.NetworkInformation {
 
                unsafe void OnDataAvailable (object sender, SocketAsyncEventArgs args)
                {
+                       if (nl_sock == null) // Recent changes in Mono cause MaybeCloseSocket to be called before OnDataAvailable
+                               return;
                        EventType type;
-                       fixed (byte *ptr = args.Buffer) {       
+                       fixed (byte *ptr = args.Buffer) {
                                type = ReadEvents (nl_sock.Handle, new IntPtr (ptr), args.BytesTransferred, 8192);
                        }
                        nl_sock.ReceiveAsync (nl_args);