aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/Tango.WiFi/Wifi.cs
diff options
context:
space:
mode:
authorRoy Ben-Shabat <Roy@Twine-s.com>2018-08-15 11:57:12 +0300
committerRoy Ben-Shabat <Roy@Twine-s.com>2018-08-15 11:57:12 +0300
commitbbbf57af4d61e1b6d61b67418415008f58dadb3c (patch)
treedf4bf18101bf5fcbda5140ea5f951a8c30d7b686 /Software/Visual_Studio/Tango.WiFi/Wifi.cs
parentbd012a8edd576026f8277ab0b462197482df9285 (diff)
downloadTango-bbbf57af4d61e1b6d61b67418415008f58dadb3c.tar.gz
Tango-bbbf57af4d61e1b6d61b67418415008f58dadb3c.zip
Added Tango.WiFi
Diffstat (limited to 'Software/Visual_Studio/Tango.WiFi/Wifi.cs')
-rw-r--r--Software/Visual_Studio/Tango.WiFi/Wifi.cs152
1 files changed, 152 insertions, 0 deletions
diff --git a/Software/Visual_Studio/Tango.WiFi/Wifi.cs b/Software/Visual_Studio/Tango.WiFi/Wifi.cs
new file mode 100644
index 000000000..8929eacf1
--- /dev/null
+++ b/Software/Visual_Studio/Tango.WiFi/Wifi.cs
@@ -0,0 +1,152 @@
+using Tango.WiFi.Win32;
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Linq;
+using Tango.WiFi.Win32.Interop;
+
+using NotifCodeACM = Tango.WiFi.Win32.Interop.WlanNotificationCodeAcm;
+using NotifCodeMSM = Tango.WiFi.Win32.Interop.WlanNotificationCodeMsm;
+
+namespace Tango.WiFi
+{
+ public class Wifi
+ {
+ public event EventHandler<WifiStatusEventArgs> ConnectionStatusChanged;
+
+ private WlanClient _client;
+ private WifiStatus _connectionStatus;
+ private bool _isConnectionStatusSet = false;
+ public bool NoWifiAvailable = false;
+
+ public Wifi()
+ {
+ _client = new WlanClient();
+ NoWifiAvailable = _client.NoWifiAvailable;
+ if (_client.NoWifiAvailable)
+ return;
+
+ foreach (var inte in _client.Interfaces)
+ inte.WlanNotification += inte_WlanNotification;
+ }
+
+ /// <summary>
+ /// Returns a list over all available access points
+ /// </summary>
+ public List<AccessPoint> GetAccessPoints()
+ {
+ List<AccessPoint> accessPoints = new List<AccessPoint>();
+ if (_client.NoWifiAvailable)
+ return accessPoints;
+
+ foreach (WlanInterface wlanIface in _client.Interfaces)
+ {
+ WlanAvailableNetwork[] rawNetworks = wlanIface.GetAvailableNetworkList(0);
+ List<WlanAvailableNetwork> networks = new List<WlanAvailableNetwork>();
+
+ // Remove network entries without profile name if one exist with a profile name.
+ foreach (WlanAvailableNetwork network in rawNetworks)
+ {
+ bool hasProfileName = !string.IsNullOrEmpty(network.profileName);
+ bool anotherInstanceWithProfileExists = rawNetworks.Where(n => n.Equals(network) && !string.IsNullOrEmpty(n.profileName)).Any();
+
+ if (!anotherInstanceWithProfileExists || hasProfileName)
+ networks.Add(network);
+ }
+
+ foreach (WlanAvailableNetwork network in networks)
+ {
+ accessPoints.Add(new AccessPoint(wlanIface, network));
+ }
+ }
+
+ return accessPoints;
+ }
+
+ /// <summary>
+ /// Disconnect all wifi interfaces
+ /// </summary>
+ public void Disconnect()
+ {
+ if (_client.NoWifiAvailable)
+ return;
+
+ foreach (WlanInterface wlanIface in _client.Interfaces)
+ {
+ wlanIface.Disconnect();
+ }
+ }
+ public WifiStatus ConnectionStatus
+ {
+ get
+ {
+ if (!_isConnectionStatusSet)
+ ConnectionStatus = GetForcedConnectionStatus();
+
+ return _connectionStatus;
+ }
+ private set
+ {
+ _isConnectionStatusSet = true;
+ _connectionStatus = value;
+ }
+ }
+
+ private void inte_WlanNotification(WlanNotificationData notifyData)
+ {
+ if (notifyData.notificationSource == WlanNotificationSource.ACM && (NotifCodeACM)notifyData.NotificationCode == NotifCodeACM.Disconnected)
+ OnConnectionStatusChanged(WifiStatus.Disconnected);
+ else if (notifyData.notificationSource == WlanNotificationSource.MSM && (NotifCodeMSM)notifyData.NotificationCode == NotifCodeMSM.Connected)
+ OnConnectionStatusChanged(WifiStatus.Connected);
+ }
+
+ private void OnConnectionStatusChanged(WifiStatus newStatus)
+ {
+ ConnectionStatus = newStatus;
+
+ if (ConnectionStatusChanged != null)
+ ConnectionStatusChanged(this, new WifiStatusEventArgs(newStatus));
+ }
+
+ // I don't like this method, it's slow, ugly and should be refactored ASAP.
+ private WifiStatus GetForcedConnectionStatus()
+ {
+ if (NoWifiAvailable)
+ return WifiStatus.Disconnected;
+
+ bool connected = false;
+
+ foreach (var i in _client.Interfaces)
+ {
+ try
+ {
+ var a = i.CurrentConnection; // Current connection throws an exception if disconnected.
+ connected = true;
+ }
+ catch { }
+ }
+
+ if (connected)
+ return WifiStatus.Connected;
+ else
+ return WifiStatus.Disconnected;
+ }
+ }
+
+ public class WifiStatusEventArgs : EventArgs
+ {
+ public WifiStatus NewStatus { get; private set; }
+
+ internal WifiStatusEventArgs(WifiStatus status) : base()
+ {
+ this.NewStatus = status;
+ }
+
+ }
+
+ public enum WifiStatus
+ {
+ Disconnected,
+ Connected
+ }
+}