Adding basic support for networks.
2 using System.Collections.Generic;
5 using System.Threading.Tasks;
6 using System.Net.NetworkInformation;
7 using System.Runtime.InteropServices;
8 using System.Runtime.InteropServices.ComTypes;
9 using System.Diagnostics;
12 namespace SharpDisplayManager
14 public class NetworkManager: INetworkListManagerEvents, IDisposable
16 public delegate void OnConnectivityChangedDelegate(NetworkManager aNetworkManager, NLM_CONNECTIVITY aConnectivity);
17 public event OnConnectivityChangedDelegate OnConnectivityChanged;
19 private int iCookie = 0;
20 private IConnectionPoint iConnectionPoint;
21 private INetworkListManager iNetworkListManager;
24 public NetworkManager()
26 iNetworkListManager = new NetworkListManager();
27 ConnectToNetworkListManagerEvents();
32 //Not sure why this is not working form here
33 //Possibly because something is doing automatically before we get there
34 //DisconnectFromNetworkListManagerEvents();
38 public INetworkListManager NetworkListManager
40 get { return iNetworkListManager; }
43 public void ConnectivityChanged(NLM_CONNECTIVITY newConnectivity)
46 OnConnectivityChanged(this, newConnectivity);
49 public void ConnectToNetworkListManagerEvents()
51 Debug.WriteLine("Subscribing to INetworkListManagerEvents");
52 IConnectionPointContainer icpc = (IConnectionPointContainer)iNetworkListManager;
53 //similar event subscription can be used for INetworkEvents and INetworkConnectionEvents
54 Guid tempGuid = typeof(INetworkListManagerEvents).GUID;
55 icpc.FindConnectionPoint(ref tempGuid, out iConnectionPoint);
56 iConnectionPoint.Advise(this, out iCookie);
60 public void DisconnectFromNetworkListManagerEvents()
62 Debug.WriteLine("Un-subscribing to INetworkListManagerEvents");
63 iConnectionPoint.Unadvise(iCookie);
67 /// Indicates whether any network connection is available
68 /// Filter connections below a specified speed, as well as virtual network cards.
71 /// <c>true</c> if a network connection is available; otherwise, <c>false</c>.
73 public static bool IsAvailable()
75 return IsAvailable(0);
79 /// Indicates whether any network connection is available.
80 /// Filter connections below a specified speed, as well as virtual network cards.
82 /// <param name="minimumSpeed">The minimum speed required. Passing 0 will not filter connection using speed.</param>
84 /// <c>true</c> if a network connection is available; otherwise, <c>false</c>.
86 public static bool IsAvailable(long minimumSpeed)
88 if (!NetworkInterface.GetIsNetworkAvailable())
91 foreach (NetworkInterface ni in NetworkInterface.GetAllNetworkInterfaces())
93 // discard because of standard reasons
94 if ((ni.OperationalStatus != OperationalStatus.Up) ||
95 (ni.NetworkInterfaceType == NetworkInterfaceType.Loopback) ||
96 (ni.NetworkInterfaceType == NetworkInterfaceType.Tunnel))
99 // this allow to filter modems, serial, etc.
100 // I use 10000000 as a minimum speed for most cases
101 if (ni.Speed < minimumSpeed)
104 // discard virtual cards (virtual box, virtual pc, etc.)
105 if ((ni.Description.IndexOf("virtual", StringComparison.OrdinalIgnoreCase) >= 0) ||
106 (ni.Name.IndexOf("virtual", StringComparison.OrdinalIgnoreCase) >= 0))
109 // discard "Microsoft Loopback Adapter", it will not show as NetworkInterfaceType.Loopback but as Ethernet Card.
110 if (ni.Description.Equals("Microsoft Loopback Adapter", StringComparison.OrdinalIgnoreCase))
121 /// <returns></returns>
122 public static bool HasInternet()
125 //ConnectionProfile connections = NetworkInformation.GetInternetConnectionProfile();
126 //bool internet = connections != null && connections.GetNetworkConnectivityLevel() == NetworkConnectivityLevel.InternetAccess;