using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using static Vanara.PInvoke.NetListMgr; namespace Vanara.Network { public static class NetworkListManager { private static NetworkConnectionIterator connIter; private static INetworkListManager manager; private static NetworkIterator netIter; public static NLM_CONNECTIVITY Connectivity => Manager?.GetConnectivity() ?? NLM_CONNECTIVITY.NLM_CONNECTIVITY_DISCONNECTED; public static bool IsConnected => Manager?.IsConnected ?? false; public static bool IsConnectedToInternet => Manager?.IsConnectedToInternet ?? false; public static IEnumerableList NetworkConnections => connIter ?? (connIter = new NetworkConnectionIterator()); public static IEnumerableList Networks => netIter ?? (netIter = new NetworkIterator()); private static INetworkListManager Manager { get { if (manager != null) return manager; try { manager = new INetworkListManager(); } catch (UnauthorizedAccessException) { } catch (ExternalException) { } return manager; } } public interface IEnumerableList : IEnumerable { int Length { get; } T this[TLookup id] { get; } } private class NetworkConnectionIterator : IEnumerableList { internal NetworkConnectionIterator() { } public int Length => Items.Count(); private static IEnumerable Items { get { IEnumerable ie = null; try { ie = Manager?.GetNetworkConnections().Cast().Select(i => new NetworkConnection(i)); } catch (UnauthorizedAccessException) { } catch (ExternalException) { } return ie; } } public NetworkConnection this[Guid id] => new NetworkConnection(Manager?.GetNetworkConnection(id)); IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); public IEnumerator GetEnumerator() { var ie = Items; if (ie == null) yield break; foreach (var conn in ie) yield return conn; } } private class NetworkIterator : IEnumerableList { internal NetworkIterator() { } public int Length => Items.Count(); private static IEnumerable Items { get { IEnumerable ie = null; try { ie = Manager?.GetNetworks(NLM_ENUM_NETWORK.NLM_ENUM_NETWORK_ALL).Cast().Select(NetworkProfile.FromINetwork); } catch (UnauthorizedAccessException) { } catch (ExternalException) { } return ie; } } public NetworkProfile this[Guid id] => NetworkProfile.FromINetwork(Manager?.GetNetwork(id)); IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); public IEnumerator GetEnumerator() { var ie = Items; if (ie == null) yield break; foreach (var networkProfile in ie) yield return networkProfile; } } } }