Server/NetworkManager.cs
author StephaneLenclud
Mon, 09 Feb 2015 18:25:14 +0100
changeset 117 9e48cc704a69
child 118 606c22398045
permissions -rw-r--r--
Adding basic support for networks.
     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     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;
    10 using NETWORKLIST;
    11 
    12 namespace SharpDisplayManager
    13 {
    14 	public class NetworkManager: INetworkListManagerEvents, IDisposable
    15     {
    16 		public delegate void OnConnectivityChangedDelegate(NetworkManager aNetworkManager, NLM_CONNECTIVITY aConnectivity);
    17 		public event OnConnectivityChangedDelegate OnConnectivityChanged;
    18 		
    19 		private int iCookie = 0;
    20         private IConnectionPoint iConnectionPoint;
    21         private INetworkListManager iNetworkListManager;
    22 
    23 
    24 		public NetworkManager()
    25 		{
    26 			iNetworkListManager = new NetworkListManager();
    27 			ConnectToNetworkListManagerEvents();
    28 		}
    29 
    30 		public void Dispose()
    31 		{
    32 			//Not sure why this is not working form here
    33 			//Possibly because something is doing automatically before we get there
    34 			//DisconnectFromNetworkListManagerEvents();
    35 		}
    36 
    37 
    38 		public INetworkListManager NetworkListManager
    39 		{
    40 			get { return iNetworkListManager; }
    41 		}
    42 
    43 		public void ConnectivityChanged(NLM_CONNECTIVITY newConnectivity)
    44 		{
    45 			//Fire our event
    46 			OnConnectivityChanged(this, newConnectivity);
    47 		}
    48 
    49 		public void ConnectToNetworkListManagerEvents()
    50 		{
    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);
    57 			
    58 		}
    59 
    60 		public void DisconnectFromNetworkListManagerEvents()
    61 		{
    62 			Debug.WriteLine("Un-subscribing to INetworkListManagerEvents");
    63 			iConnectionPoint.Unadvise(iCookie);
    64 		} 
    65 
    66 		/// <summary>
    67 		/// Indicates whether any network connection is available
    68 		/// Filter connections below a specified speed, as well as virtual network cards.
    69 		/// </summary>
    70 		/// <returns>
    71 		///     <c>true</c> if a network connection is available; otherwise, <c>false</c>.
    72 		/// </returns>
    73 		public static bool IsAvailable()
    74 		{
    75 			return IsAvailable(0);
    76 		}
    77 
    78 		/// <summary>
    79 		/// Indicates whether any network connection is available.
    80 		/// Filter connections below a specified speed, as well as virtual network cards.
    81 		/// </summary>
    82 		/// <param name="minimumSpeed">The minimum speed required. Passing 0 will not filter connection using speed.</param>
    83 		/// <returns>
    84 		///     <c>true</c> if a network connection is available; otherwise, <c>false</c>.
    85 		/// </returns>
    86 		public static bool IsAvailable(long minimumSpeed)
    87 		{
    88 			if (!NetworkInterface.GetIsNetworkAvailable())
    89 				return false;
    90 
    91 			foreach (NetworkInterface ni in NetworkInterface.GetAllNetworkInterfaces())
    92 			{
    93 				// discard because of standard reasons
    94 				if ((ni.OperationalStatus != OperationalStatus.Up) ||
    95 					(ni.NetworkInterfaceType == NetworkInterfaceType.Loopback) ||
    96 					(ni.NetworkInterfaceType == NetworkInterfaceType.Tunnel))
    97 					continue;
    98 
    99 				// this allow to filter modems, serial, etc.
   100 				// I use 10000000 as a minimum speed for most cases
   101 				if (ni.Speed < minimumSpeed)
   102 					continue;
   103 
   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))
   107 					continue;
   108 
   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))
   111 					continue;
   112 
   113 				return true;
   114 			}
   115 			return false;
   116 		}
   117 
   118 		/// <summary>
   119 		/// 
   120 		/// </summary>
   121 		/// <returns></returns>
   122 		public static bool HasInternet()
   123 		{
   124 			return false;
   125 			//ConnectionProfile connections = NetworkInformation.GetInternetConnectionProfile();
   126 			//bool internet = connections != null && connections.GetNetworkConnectivityLevel() == NetworkConnectivityLevel.InternetAccess;
   127 			//return internet;
   128 		}
   129 
   130 	}
   131 }