From 6f8f157237c652a5550a9087e5accd351037728a Mon Sep 17 00:00:00 2001 From: webwarrior Date: Wed, 1 Mar 2023 13:45:24 +0100 Subject: [PATCH] Connectivity: port code from DotNetEssentials Implement Connectivity for Gtk platform by porting code from nblockchain/DotNetEssentials. (cherry picked from commit b9f17947c8bebccd657fac58d5d4d448053fd92b) --- .../src/Connectivity/Connectivity.Gtk.cs | 96 +++++++++++++++++-- 1 file changed, 88 insertions(+), 8 deletions(-) diff --git a/src/Essentials/src/Connectivity/Connectivity.Gtk.cs b/src/Essentials/src/Connectivity/Connectivity.Gtk.cs index 869074a41d3c..c2d3c42f1325 100644 --- a/src/Essentials/src/Connectivity/Connectivity.Gtk.cs +++ b/src/Essentials/src/Connectivity/Connectivity.Gtk.cs @@ -1,20 +1,100 @@ +using System; using System.Collections.Generic; +using System.Linq; +using System.Net.NetworkInformation; + using Microsoft.Maui.ApplicationModel; namespace Microsoft.Maui.Networking { partial class ConnectivityImplementation : IConnectivity { - public NetworkAccess NetworkAccess => - throw ExceptionUtils.NotSupportedOrImplementedException; + void StartListeners() + { + NetworkChange.NetworkAddressChanged += NetworkStatusChanged; + NetworkChange.NetworkAvailabilityChanged += NetworkStatusChanged; + } + + void NetworkStatusChanged(object sender, EventArgs e) => OnConnectivityChanged(); + + void StopListeners() + { + NetworkChange.NetworkAddressChanged -= NetworkStatusChanged; + NetworkChange.NetworkAvailabilityChanged -= NetworkStatusChanged; + } + + public NetworkAccess NetworkAccess + { + get + { + if (!NetworkInterface.GetIsNetworkAvailable()) + return NetworkAccess.None; + + var allLoopback = NetworkInterface.GetAllNetworkInterfaces() + .All(ni => ni.NetworkInterfaceType == NetworkInterfaceType.Loopback); + if (allLoopback) + return NetworkAccess.None; + + var gateways = NetworkInterface.GetAllNetworkInterfaces() + .Where(ni => ni.NetworkInterfaceType != NetworkInterfaceType.Loopback) + .SelectMany(ni => ni.GetIPProperties().GatewayAddresses); + + if (gateways.Any()) + return NetworkAccess.Internet; + + return NetworkAccess.None; + } + } + + ConnectionProfile ToConnectionType(NetworkInterface networkInterface) + { + switch (networkInterface.NetworkInterfaceType) + { + case NetworkInterfaceType.TokenRing: + case NetworkInterfaceType.Ethernet: + case NetworkInterfaceType.Ethernet3Megabit: + case NetworkInterfaceType.IPOverAtm: + case NetworkInterfaceType.FastEthernetT: + case NetworkInterfaceType.GigabitEthernet: + case NetworkInterfaceType.FastEthernetFx: + case NetworkInterfaceType.GenericModem: + return ConnectionProfile.Ethernet; + + case NetworkInterfaceType.Wireless80211: + case NetworkInterfaceType.Wman: + return ConnectionProfile.WiFi; + + case NetworkInterfaceType.Wwanpp2: + case NetworkInterfaceType.Wwanpp: + return ConnectionProfile.Cellular; + + case NetworkInterfaceType.Ppp: + case NetworkInterfaceType.Fddi: + case NetworkInterfaceType.Isdn: + case NetworkInterfaceType.BasicIsdn: + case NetworkInterfaceType.PrimaryIsdn: + case NetworkInterfaceType.Tunnel: + case NetworkInterfaceType.VeryHighSpeedDsl: + case NetworkInterfaceType.AsymmetricDsl: + case NetworkInterfaceType.RateAdaptDsl: + case NetworkInterfaceType.SymmetricDsl: + case NetworkInterfaceType.Loopback: + case NetworkInterfaceType.Slip: + case NetworkInterfaceType.Atm: + case NetworkInterfaceType.MultiRateSymmetricDsl: + case NetworkInterfaceType.HighPerformanceSerialBus: + case NetworkInterfaceType.Unknown: + return ConnectionProfile.Unknown; - public IEnumerable ConnectionProfiles => - throw ExceptionUtils.NotSupportedOrImplementedException; + default: + return ConnectionProfile.Unknown; + } + } - void StartListeners() => - throw ExceptionUtils.NotSupportedOrImplementedException; + public IEnumerable ConnectionProfiles + { + get => NetworkInterface.GetAllNetworkInterfaces().Where(ni => ni.NetworkInterfaceType != NetworkInterfaceType.Loopback).Select(ToConnectionType); + } - void StopListeners() => - throw ExceptionUtils.NotSupportedOrImplementedException; } } \ No newline at end of file