From 4762311977a2ebe26c6ac140bdcfc44d7733ff9a Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Fri, 4 Nov 2016 12:39:57 -0700 Subject: work in progress windows UI update --- windows/WinUI/ZeroTierNetwork.cs | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) (limited to 'windows/WinUI/ZeroTierNetwork.cs') diff --git a/windows/WinUI/ZeroTierNetwork.cs b/windows/WinUI/ZeroTierNetwork.cs index cce65441..6a6f8498 100644 --- a/windows/WinUI/ZeroTierNetwork.cs +++ b/windows/WinUI/ZeroTierNetwork.cs @@ -42,13 +42,22 @@ namespace WinUI [JsonProperty("netconfRevision")] public int NetconfRevision { get; set; } - [JsonProperty("multicastSubscriptions")] - public string[] MulticastSubscriptions { get; set; } - [JsonProperty("assignedAddresses")] public string[] AssignedAddresses { get; set; } + [JsonProperty("routes")] + public NetworkRoute[] Routes { get; set; } + [JsonProperty("portDeviceName")] public string DeviceName { get; set; } + + [JsonProperty("allowManaged")] + public bool AllowManaged { get; set; } + + [JsonProperty("allowGlobal")] + public bool AllowGlobal { get; set; } + + [JsonProperty("allowDefault")] + public bool AllowDefault { get; set; } } } -- cgit v1.2.3 From fd71ceeab542d81b94a9ceee69faf78357e5f3f3 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Thu, 10 Nov 2016 14:17:57 -0800 Subject: menu now dynamically populates the network list --- windows/WinUI/APIHandler.cs | 39 +++++++++------ windows/WinUI/NetworkListView.xaml.cs | 38 ++++++--------- windows/WinUI/NetworkRoute.cs | 20 +++++++- windows/WinUI/ToolbarItem.xaml | 37 ++++++++++++-- windows/WinUI/ToolbarItem.xaml.cs | 87 ++++++++++++++++++++++++++++++--- windows/WinUI/ZeroTierNetwork.cs | 90 ++++++++++++++++++++++++++++++++++- 6 files changed, 260 insertions(+), 51 deletions(-) (limited to 'windows/WinUI/ZeroTierNetwork.cs') diff --git a/windows/WinUI/APIHandler.cs b/windows/WinUI/APIHandler.cs index 9cddd916..c7dc16b7 100644 --- a/windows/WinUI/APIHandler.cs +++ b/windows/WinUI/APIHandler.cs @@ -128,7 +128,9 @@ namespace WinUI this.authtoken = authtoken; } - public ZeroTierStatus GetStatus() + public delegate void StatusCallback(ZeroTierStatus status); + + public void GetStatus(StatusCallback cb) { var request = WebRequest.Create(url + "/status" + "?auth=" + authtoken) as HttpWebRequest; if (request != null) @@ -153,25 +155,27 @@ namespace WinUI { Console.WriteLine(e.ToString()); } - return status; + cb(status); } } catch (System.Net.Sockets.SocketException) { - return null; + cb(null); } catch (System.Net.WebException) { - return null; + cb(null); } } - public List GetNetworks() + public delegate void NetworkListCallback(List networks); + + public void GetNetworks(NetworkListCallback cb) { var request = WebRequest.Create(url + "/network" + "?auth=" + authtoken) as HttpWebRequest; if (request == null) { - return null; + cb(null); } request.Method = "GET"; @@ -188,21 +192,26 @@ namespace WinUI try { networkList = JsonConvert.DeserializeObject>(responseText); + foreach (ZeroTierNetwork n in networkList) + { + // all networks received via JSON are connected by definition + n.IsConnected = true; + } } catch (JsonReaderException e) { Console.WriteLine(e.ToString()); } - return networkList; + cb(networkList); } } catch (System.Net.Sockets.SocketException) { - return null; + cb(null); } catch (System.Net.WebException) { - return null; + cb(null); } } @@ -275,12 +284,14 @@ namespace WinUI } } - public List GetPeers() + public delegate void PeersCallback(List peers); + + public void GetPeers(PeersCallback cb) { var request = WebRequest.Create(url + "/peer" + "?auth=" + authtoken) as HttpWebRequest; if (request == null) { - return null; + cb(null); } request.Method = "GET"; @@ -302,16 +313,16 @@ namespace WinUI { Console.WriteLine(e.ToString()); } - return peerList; + cb(peerList); } } catch (System.Net.Sockets.SocketException) { - return null; + cb(null); } catch (System.Net.WebException) { - return null; + cb(null); } } } diff --git a/windows/WinUI/NetworkListView.xaml.cs b/windows/WinUI/NetworkListView.xaml.cs index 6983a3fb..b1ad3df6 100644 --- a/windows/WinUI/NetworkListView.xaml.cs +++ b/windows/WinUI/NetworkListView.xaml.cs @@ -36,7 +36,7 @@ namespace WinUI { InitializeComponent(); - updateStatus(); + APIHandler.Instance.GetStatus(updateStatus); if (!connected) { @@ -44,19 +44,19 @@ namespace WinUI return; } - updateNetworks(); + APIHandler.Instance.GetNetworks(updateNetworks); DataObject.AddPastingHandler(joinNetworkID, OnPaste); timer.Elapsed += new ElapsedEventHandler(OnUpdateTimer); timer.Interval = 2000; timer.Enabled = true; + + } - private void updateStatus() + private void updateStatus(ZeroTierStatus status) { - var status = APIHandler.Instance.GetStatus(); - if (status != null) { connected = true; @@ -93,31 +93,21 @@ namespace WinUI } } - private void updateNetworks() + private void updateNetworks(List networks) { - var networks = APIHandler.Instance.GetNetworks(); - - networksPage.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() => + if (networks != null) { - networksPage.setNetworks(networks); - })); - } - - private void updatePeers() - { - //var peers = handler.GetPeers(); - - //peersPage.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() => - //{ - // peersPage.SetPeers(peers); - //})); + networksPage.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() => + { + networksPage.setNetworks(networks); + })); + } } private void OnUpdateTimer(object source, ElapsedEventArgs e) { - updateStatus(); - updateNetworks(); - //updatePeers(); + APIHandler.Instance.GetStatus(updateStatus); + APIHandler.Instance.GetNetworks(updateNetworks); } private void joinButton_Click(object sender, RoutedEventArgs e) diff --git a/windows/WinUI/NetworkRoute.cs b/windows/WinUI/NetworkRoute.cs index 61616f44..cd1e549a 100644 --- a/windows/WinUI/NetworkRoute.cs +++ b/windows/WinUI/NetworkRoute.cs @@ -1,14 +1,32 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Runtime.Serialization; using System.Text; using System.Threading.Tasks; using Newtonsoft.Json; namespace WinUI { - public class NetworkRoute + [Serializable] + public class NetworkRoute : ISerializable { + protected NetworkRoute(SerializationInfo info, StreamingContext ctx) + { + Target = info.GetString("Target"); + Via = info.GetString("Via"); + Flags = info.GetInt32("Flags"); + Metric = info.GetInt32("Metric"); + } + + public virtual void GetObjectData(SerializationInfo info, StreamingContext ctx) + { + info.AddValue("Target", Target); + info.AddValue("Via", Via); + info.AddValue("Flags", Flags); + info.AddValue("Metric", Metric); + } + [JsonProperty("target")] public string Target { get; set; } diff --git a/windows/WinUI/ToolbarItem.xaml b/windows/WinUI/ToolbarItem.xaml index 2a7af229..065919fd 100644 --- a/windows/WinUI/ToolbarItem.xaml +++ b/windows/WinUI/ToolbarItem.xaml @@ -5,8 +5,18 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:WinUI" xmlns:tb="http://www.hardcodet.net/taskbar" + xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase" mc:Ignorable="d" - Height="300" Width="300" Visibility="Hidden"> + Height="300" Width="300" Visibility="Hidden" Name="Toolbar"> + + + + + + + + + + Click="ToolbarItem_NodeIDClicked" + x:Name="nodeIdMenuItem"/> - + + Click="ToolbarItem_ShowNetworksClicked"/> + + + + + + + + + + + - + diff --git a/windows/WinUI/ToolbarItem.xaml.cs b/windows/WinUI/ToolbarItem.xaml.cs index d5cccbef..e53e4b35 100644 --- a/windows/WinUI/ToolbarItem.xaml.cs +++ b/windows/WinUI/ToolbarItem.xaml.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Collections.ObjectModel; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -26,11 +27,75 @@ namespace WinUI { private APIHandler handler = APIHandler.Instance; - NetworkListView netList = null; + private NetworkListView netListView = null; + private List networkList = null; + + private ObservableCollection _networkCollection = new ObservableCollection(); + + public ObservableCollection NetworkCollection + { + get { return _networkCollection; } + set { _networkCollection = value; } + } + + private Timer timer = null; public ToolbarItem() { InitializeComponent(); + + onUpdateTimer(this, null); + + timer = new Timer(); + timer.Elapsed += new ElapsedEventHandler(onUpdateTimer); + timer.Interval = 2000; + timer.Enabled = true; + + nodeIdMenuItem.Header = "OFFLINE"; + nodeIdMenuItem.IsEnabled = false; + } + + private void updateNetworks(List networks) + { + if (networks != null) + { + this.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() => + { + foreach (ZeroTierNetwork n in networks) + { + int index = _networkCollection.IndexOf(n); + + if (index == -1) + { + _networkCollection.Add(n); + } + else + { + _networkCollection[index] = n; + } + } + + this.networkList = networks; + })); + } + } + + private void updateStatus(ZeroTierStatus status) + { + if (status != null) + { + Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() => + { + nodeIdMenuItem.Header = "Node ID: " + status.Address; + nodeIdMenuItem.IsEnabled = true; + })); + } + } + + private void onUpdateTimer(object source, ElapsedEventArgs e) + { + APIHandler.Instance.GetStatus(updateStatus); + APIHandler.Instance.GetNetworks(updateNetworks); } private void ToolbarItem_TrayContextMenuOpen(object sender, System.Windows.RoutedEventArgs e) @@ -50,17 +115,27 @@ namespace WinUI private void ToolbarItem_ShowNetworksClicked(object sender, System.Windows.RoutedEventArgs e) { - if (netList == null) + if (netListView == null) { - netList = new WinUI.NetworkListView(); - netList.Closed += ShowNetworksClosed; - netList.Show(); + netListView = new WinUI.NetworkListView(); + netListView.Closed += ShowNetworksClosed; + netListView.Show(); } } private void ShowNetworksClosed(object sender, System.EventArgs e) { - netList = null; + netListView = null; + } + + private void ToolbarItem_JoinNetworkClicked(object sender, System.EventArgs e) + { + + } + + private void JoinNetworkClosed(object sender, System.EventArgs e) + { + } } } diff --git a/windows/WinUI/ZeroTierNetwork.cs b/windows/WinUI/ZeroTierNetwork.cs index 6a6f8498..579e4e89 100644 --- a/windows/WinUI/ZeroTierNetwork.cs +++ b/windows/WinUI/ZeroTierNetwork.cs @@ -1,14 +1,60 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Runtime.Serialization; using System.Text; using System.Threading.Tasks; using Newtonsoft.Json; namespace WinUI { - public class ZeroTierNetwork + [Serializable] + public class ZeroTierNetwork : ISerializable, IEquatable, IComparable { + protected ZeroTierNetwork(SerializationInfo info, StreamingContext ctx) + { + NetworkId = info.GetString("NetworkId"); + MacAddress = info.GetString("MacAddress"); + NetworkName = info.GetString("NetworkName"); + NetworkStatus = info.GetString("NetworkStatus"); + NetworkType = info.GetString("NetworkType"); + MTU = info.GetInt32("MTU"); + DHCP = info.GetBoolean("DHCP"); + Bridge = info.GetBoolean("Bridge"); + BroadcastEnabled = info.GetBoolean("BroadcastEnabled"); + PortError = info.GetInt32("PortError"); + NetconfRevision = info.GetInt32("NetconfRevision"); + AssignedAddresses = (string[])info.GetValue("AssignedAddresses", typeof(string[])); + Routes = (NetworkRoute[])info.GetValue("Routes", typeof(NetworkRoute[])); + DeviceName = info.GetString("DeviceName"); + AllowManaged = info.GetBoolean("AllowManaged"); + AllowGlobal = info.GetBoolean("AllowGlobal"); + AllowDefault = info.GetBoolean("AllowDefault"); + IsConnected = false; + } + + public virtual void GetObjectData(SerializationInfo info, StreamingContext ctx) + { + info.AddValue("NetworkId", NetworkId); + info.AddValue("MacAddress", MacAddress); + info.AddValue("NetworkName", NetworkName); + info.AddValue("NetworkStatus", NetworkStatus); + info.AddValue("NetworkType", NetworkType); + info.AddValue("MTU", MTU); + info.AddValue("DHCP", DHCP); + info.AddValue("Bridge", Bridge); + info.AddValue("BroadcastEnabled", BroadcastEnabled); + info.AddValue("PortError", PortError); + info.AddValue("NetconfRevision", NetconfRevision); + info.AddValue("AssignedAddresses", AssignedAddresses); + info.AddValue("Routes", Routes); + info.AddValue("DeviceName", DeviceName); + info.AddValue("AllowManaged", AllowManaged); + info.AddValue("AllowGlobal", AllowGlobal); + info.AddValue("AllowDefault", AllowDefault); + } + + [JsonProperty("nwid")] public string NetworkId { get; set; } @@ -59,5 +105,47 @@ namespace WinUI [JsonProperty("allowDefault")] public bool AllowDefault { get; set; } + + public bool IsConnected { get; set; } = false; + + public String Title + { + get + { + + if (NetworkName != null && NetworkName.Length > 0) + { + return NetworkId + " (" + NetworkName + ")"; + } + else + { + return NetworkId; + } + } + } + + public bool Equals(ZeroTierNetwork network) + { + return NetworkId.Equals(network.NetworkId); + } + + public int CompareTo(ZeroTierNetwork network) + { + UInt64 thisNwid = UInt64.Parse(NetworkId, System.Globalization.NumberStyles.HexNumber); + UInt64 otherNwid = UInt64.Parse(network.NetworkId, System.Globalization.NumberStyles.HexNumber); + + if (thisNwid > otherNwid) + { + return 1; + } + else if (thisNwid < otherNwid) + { + return -1; + } + else + { + return 0; + } + } } } -- cgit v1.2.3 From 71aadcbecb93b0a3e6bb60eaec3653c3ae9d67e8 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Thu, 10 Nov 2016 15:21:54 -0800 Subject: fix serialization issue. Apparently the JSON parser uses this same serialization method under the hood to create objects from JSON. --- windows/WinUI/NetworkRoute.cs | 16 ++++----- windows/WinUI/ZeroTierNetwork.cs | 78 ++++++++++++++++++++++------------------ 2 files changed, 52 insertions(+), 42 deletions(-) (limited to 'windows/WinUI/ZeroTierNetwork.cs') diff --git a/windows/WinUI/NetworkRoute.cs b/windows/WinUI/NetworkRoute.cs index cd1e549a..ce26ef7d 100644 --- a/windows/WinUI/NetworkRoute.cs +++ b/windows/WinUI/NetworkRoute.cs @@ -13,18 +13,18 @@ namespace WinUI { protected NetworkRoute(SerializationInfo info, StreamingContext ctx) { - Target = info.GetString("Target"); - Via = info.GetString("Via"); - Flags = info.GetInt32("Flags"); - Metric = info.GetInt32("Metric"); + Target = info.GetString("target"); + Via = info.GetString("via"); + Flags = info.GetInt32("flags"); + Metric = info.GetInt32("metric"); } public virtual void GetObjectData(SerializationInfo info, StreamingContext ctx) { - info.AddValue("Target", Target); - info.AddValue("Via", Via); - info.AddValue("Flags", Flags); - info.AddValue("Metric", Metric); + info.AddValue("target", Target); + info.AddValue("via", Via); + info.AddValue("flags", Flags); + info.AddValue("metric", Metric); } [JsonProperty("target")] diff --git a/windows/WinUI/ZeroTierNetwork.cs b/windows/WinUI/ZeroTierNetwork.cs index 579e4e89..f8ebf9ac 100644 --- a/windows/WinUI/ZeroTierNetwork.cs +++ b/windows/WinUI/ZeroTierNetwork.cs @@ -13,45 +13,49 @@ namespace WinUI { protected ZeroTierNetwork(SerializationInfo info, StreamingContext ctx) { - NetworkId = info.GetString("NetworkId"); - MacAddress = info.GetString("MacAddress"); - NetworkName = info.GetString("NetworkName"); - NetworkStatus = info.GetString("NetworkStatus"); - NetworkType = info.GetString("NetworkType"); - MTU = info.GetInt32("MTU"); - DHCP = info.GetBoolean("DHCP"); - Bridge = info.GetBoolean("Bridge"); - BroadcastEnabled = info.GetBoolean("BroadcastEnabled"); - PortError = info.GetInt32("PortError"); - NetconfRevision = info.GetInt32("NetconfRevision"); - AssignedAddresses = (string[])info.GetValue("AssignedAddresses", typeof(string[])); - Routes = (NetworkRoute[])info.GetValue("Routes", typeof(NetworkRoute[])); - DeviceName = info.GetString("DeviceName"); - AllowManaged = info.GetBoolean("AllowManaged"); - AllowGlobal = info.GetBoolean("AllowGlobal"); - AllowDefault = info.GetBoolean("AllowDefault"); + try + { + NetworkId = info.GetString("nwid"); + MacAddress = info.GetString("mac"); + NetworkName = info.GetString("name"); + NetworkStatus = info.GetString("status"); + NetworkType = info.GetString("type"); + MTU = info.GetInt32("mtu"); + DHCP = info.GetBoolean("dhcp"); + Bridge = info.GetBoolean("bridge"); + BroadcastEnabled = info.GetBoolean("broadcastEnabled"); + PortError = info.GetInt32("portError"); + NetconfRevision = info.GetInt32("netconfRevision"); + AssignedAddresses = (string[])info.GetValue("assignedAddresses", typeof(string[])); + Routes = (NetworkRoute[])info.GetValue("routes", typeof(NetworkRoute[])); + DeviceName = info.GetString("portDeviceName"); + AllowManaged = info.GetBoolean("allowManaged"); + AllowGlobal = info.GetBoolean("allowGlobal"); + AllowDefault = info.GetBoolean("allowDefault"); + } + catch { } IsConnected = false; } public virtual void GetObjectData(SerializationInfo info, StreamingContext ctx) { - info.AddValue("NetworkId", NetworkId); - info.AddValue("MacAddress", MacAddress); - info.AddValue("NetworkName", NetworkName); - info.AddValue("NetworkStatus", NetworkStatus); - info.AddValue("NetworkType", NetworkType); - info.AddValue("MTU", MTU); - info.AddValue("DHCP", DHCP); - info.AddValue("Bridge", Bridge); - info.AddValue("BroadcastEnabled", BroadcastEnabled); - info.AddValue("PortError", PortError); - info.AddValue("NetconfRevision", NetconfRevision); - info.AddValue("AssignedAddresses", AssignedAddresses); - info.AddValue("Routes", Routes); - info.AddValue("DeviceName", DeviceName); - info.AddValue("AllowManaged", AllowManaged); - info.AddValue("AllowGlobal", AllowGlobal); - info.AddValue("AllowDefault", AllowDefault); + info.AddValue("nwid", NetworkId); + info.AddValue("mac", MacAddress); + info.AddValue("name", NetworkName); + info.AddValue("status", NetworkStatus); + info.AddValue("type", NetworkType); + info.AddValue("mtu", MTU); + info.AddValue("dhcp", DHCP); + info.AddValue("bridge", Bridge); + info.AddValue("broadcastEnabled", BroadcastEnabled); + info.AddValue("portError", PortError); + info.AddValue("netconfRevision", NetconfRevision); + info.AddValue("assignedAddresses", AssignedAddresses); + info.AddValue("routes", Routes); + info.AddValue("portDeviceName", DeviceName); + info.AddValue("allowManaged", AllowManaged); + info.AddValue("allowGlobal", AllowGlobal); + info.AddValue("allowDefault", AllowDefault); } @@ -126,11 +130,17 @@ namespace WinUI public bool Equals(ZeroTierNetwork network) { + if (NetworkId == null || network == null) + return false; + return NetworkId.Equals(network.NetworkId); } public int CompareTo(ZeroTierNetwork network) { + if (NetworkId == null || network == null) + return -1; + UInt64 thisNwid = UInt64.Parse(NetworkId, System.Globalization.NumberStyles.HexNumber); UInt64 otherNwid = UInt64.Parse(network.NetworkId, System.Globalization.NumberStyles.HexNumber); -- cgit v1.2.3 From c4c8ea62e2500b13a42447a17c66359cb7b448e0 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Mon, 14 Nov 2016 14:56:36 -0800 Subject: Added network monitor pub/sub class --- windows/WinUI/APIHandler.cs | 11 ++- windows/WinUI/NetworkMonitor.cs | 159 ++++++++++++++++++++++++++++++++++++++ windows/WinUI/ToolbarItem.xaml.cs | 23 +++--- windows/WinUI/WinUI.csproj | 1 + windows/WinUI/ZeroTierNetwork.cs | 13 ++++ 5 files changed, 191 insertions(+), 16 deletions(-) create mode 100644 windows/WinUI/NetworkMonitor.cs (limited to 'windows/WinUI/ZeroTierNetwork.cs') diff --git a/windows/WinUI/APIHandler.cs b/windows/WinUI/APIHandler.cs index c7dc16b7..b30e8980 100644 --- a/windows/WinUI/APIHandler.cs +++ b/windows/WinUI/APIHandler.cs @@ -22,6 +22,13 @@ namespace WinUI private static volatile APIHandler instance; private static object syncRoot = new Object(); + public delegate void NetworkListCallback(List networks); + public delegate void StatusCallback(ZeroTierStatus status); + + + private NetworkListCallback _networkCallbacks; + private StatusCallback _statusCallbacks; + public static APIHandler Instance { get @@ -128,7 +135,7 @@ namespace WinUI this.authtoken = authtoken; } - public delegate void StatusCallback(ZeroTierStatus status); + public void GetStatus(StatusCallback cb) { @@ -168,7 +175,7 @@ namespace WinUI } } - public delegate void NetworkListCallback(List networks); + public void GetNetworks(NetworkListCallback cb) { diff --git a/windows/WinUI/NetworkMonitor.cs b/windows/WinUI/NetworkMonitor.cs new file mode 100644 index 00000000..b8d2c946 --- /dev/null +++ b/windows/WinUI/NetworkMonitor.cs @@ -0,0 +1,159 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace WinUI +{ + class NetworkMonitor + { + public delegate void NetworkListCallback(List networks); + public delegate void StatusCallback(ZeroTierStatus status); + + private Thread runThread; + private NetworkListCallback _nwCb; + private StatusCallback _stCb; + + + private List _knownNetworks = new List(); + + private static NetworkMonitor instance; + private static object syncRoot = new object(); + + public static NetworkMonitor Instance + { + get + { + if (instance == null) + { + lock (syncRoot) + { + if (instance == null) + { + instance = new NetworkMonitor(); + } + } + } + + return instance; + } + } + + private NetworkMonitor() + { + runThread = new Thread(new ThreadStart(run)); + loadNetworks(); + + runThread.Start(); + } + + ~NetworkMonitor() + { + runThread.Interrupt(); + } + + private void loadNetworks() + { + String dataPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + "\\ZeroTier\\One"; + String dataFile = Path.Combine(dataPath, "networks.dat"); + + if (File.Exists(dataFile)) + { + List netList; + + using (Stream stream = File.Open(dataFile, FileMode.Open)) + { + var bformatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); + netList = (List)bformatter.Deserialize(stream); + } + + _knownNetworks = netList; + } + } + + private void writeNetworks() + { + String dataPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + "\\ZeroTier\\One"; + String dataFile = Path.Combine(dataPath, "networks.dat"); + + if (!Directory.Exists(dataPath)) + { + Directory.CreateDirectory(dataPath); + } + + using (Stream stream = File.Open(dataFile, FileMode.OpenOrCreate)) + { + var bformatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); + bformatter.Serialize(stream, _knownNetworks); + } + } + + private void apiNetworkCallback(List networks) + { + _knownNetworks = _knownNetworks.Union(networks, new NetworkEqualityComparer()).ToList(); + + foreach (ZeroTierNetwork n in _knownNetworks) + { + if (networks.Contains(n)) + { + n.IsConnected = true; + } + } + + _nwCb(_knownNetworks); + + writeNetworks(); + } + + private void apiStatusCallback(ZeroTierStatus status) + { + _stCb(status); + } + + private void run() + { + try + { + while (runThread.IsAlive) + { + APIHandler handler = APIHandler.Instance; + + if (handler != null) + { + handler.GetNetworks(apiNetworkCallback); + handler.GetStatus(apiStatusCallback); + } + + Thread.Sleep(2000); + } + } + catch + { + + } + } + + public void SubscribeStatusUpdates(StatusCallback cb) + { + _stCb += cb; + } + + public void UnsubscribeStatusUpdates(StatusCallback cb) + { + _stCb -= cb; + } + + public void SubscribeNetworkUpdates(NetworkListCallback cb) + { + _nwCb += cb; + } + + public void UnsubscribeNetworkUpdates(NetworkListCallback cb) + { + _nwCb -= cb; + } + } +} diff --git a/windows/WinUI/ToolbarItem.xaml.cs b/windows/WinUI/ToolbarItem.xaml.cs index e53e4b35..991e1b4a 100644 --- a/windows/WinUI/ToolbarItem.xaml.cs +++ b/windows/WinUI/ToolbarItem.xaml.cs @@ -30,6 +30,8 @@ namespace WinUI private NetworkListView netListView = null; private List networkList = null; + private NetworkMonitor mon = NetworkMonitor.Instance; + private ObservableCollection _networkCollection = new ObservableCollection(); public ObservableCollection NetworkCollection @@ -44,15 +46,14 @@ namespace WinUI { InitializeComponent(); - onUpdateTimer(this, null); - - timer = new Timer(); - timer.Elapsed += new ElapsedEventHandler(onUpdateTimer); - timer.Interval = 2000; - timer.Enabled = true; + mon.SubscribeNetworkUpdates(updateNetworks); + mon.SubscribeStatusUpdates(updateStatus); + } - nodeIdMenuItem.Header = "OFFLINE"; - nodeIdMenuItem.IsEnabled = false; + ~ToolbarItem() + { + mon.UnsubscribeNetworkUpdates(updateNetworks); + mon.UnsubscribeStatusUpdates(updateStatus); } private void updateNetworks(List networks) @@ -92,12 +93,6 @@ namespace WinUI } } - private void onUpdateTimer(object source, ElapsedEventArgs e) - { - APIHandler.Instance.GetStatus(updateStatus); - APIHandler.Instance.GetNetworks(updateNetworks); - } - private void ToolbarItem_TrayContextMenuOpen(object sender, System.Windows.RoutedEventArgs e) { Console.WriteLine("TrayContextMenuOpen"); diff --git a/windows/WinUI/WinUI.csproj b/windows/WinUI/WinUI.csproj index a301463a..92ee586a 100644 --- a/windows/WinUI/WinUI.csproj +++ b/windows/WinUI/WinUI.csproj @@ -101,6 +101,7 @@ MSBuild:Compile Designer + NetworksPage.xaml diff --git a/windows/WinUI/ZeroTierNetwork.cs b/windows/WinUI/ZeroTierNetwork.cs index f8ebf9ac..2bcb76e2 100644 --- a/windows/WinUI/ZeroTierNetwork.cs +++ b/windows/WinUI/ZeroTierNetwork.cs @@ -158,4 +158,17 @@ namespace WinUI } } } + + public class NetworkEqualityComparer : IEqualityComparer + { + public bool Equals(ZeroTierNetwork lhs, ZeroTierNetwork rhs) + { + return lhs.NetworkId.Equals(rhs.NetworkId); + } + + public int GetHashCode(ZeroTierNetwork obj) + { + return obj.NetworkId.GetHashCode(); + } + } } -- cgit v1.2.3 From 5447c01e1f27eaab595e33a8732ab96e6058eef8 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Thu, 17 Nov 2016 14:13:05 -0800 Subject: can finally join/leave networks by clicking on them in the context menu --- windows/WinUI/NetworkMonitor.cs | 4 + windows/WinUI/ToolbarItem.xaml | 49 ++++-- windows/WinUI/ToolbarItem.xaml.cs | 56 ++++-- windows/WinUI/ZeroTierNetwork.cs | 353 ++++++++++++++++++++++++++++++++++++-- 4 files changed, 409 insertions(+), 53 deletions(-) (limited to 'windows/WinUI/ZeroTierNetwork.cs') diff --git a/windows/WinUI/NetworkMonitor.cs b/windows/WinUI/NetworkMonitor.cs index b8d2c946..de5543f6 100644 --- a/windows/WinUI/NetworkMonitor.cs +++ b/windows/WinUI/NetworkMonitor.cs @@ -101,6 +101,10 @@ namespace WinUI { n.IsConnected = true; } + else + { + n.IsConnected = false; + } } _nwCb(_knownNetworks); diff --git a/windows/WinUI/ToolbarItem.xaml b/windows/WinUI/ToolbarItem.xaml index 065919fd..bbc17649 100644 --- a/windows/WinUI/ToolbarItem.xaml +++ b/windows/WinUI/ToolbarItem.xaml @@ -12,7 +12,7 @@ - + @@ -25,16 +25,32 @@ PreviewTrayContextMenuOpen="ToolbarItem_PreviewTrayContextMenuOpen"> - - - - - - + + + + + + + + + + + + + + + + + + + + + + + diff --git a/windows/WinUI/ToolbarItem.xaml.cs b/windows/WinUI/ToolbarItem.xaml.cs index fc6b6406..15aeb24b 100644 --- a/windows/WinUI/ToolbarItem.xaml.cs +++ b/windows/WinUI/ToolbarItem.xaml.cs @@ -1,7 +1,9 @@ using System; using System.Collections.Generic; using System.Collections.ObjectModel; +using System.ComponentModel; using System.Linq; +using System.Runtime.CompilerServices; using System.Text; using System.Threading.Tasks; using System.Windows; @@ -23,18 +25,17 @@ namespace WinUI /// /// Interaction logic for ToolbarItem.xaml /// - public partial class ToolbarItem : Window + public partial class ToolbarItem : Window, INotifyPropertyChanged { private APIHandler handler = APIHandler.Instance; private NetworkListView netListView = null; - private List networkList = null; private NetworkMonitor mon = NetworkMonitor.Instance; - private ObservableCollection _networkCollection = new ObservableCollection(); + private ObservableCollection _networkCollection = new ObservableCollection(); - public ObservableCollection NetworkCollection + public ObservableCollection NetworkCollection { get { return _networkCollection; } set { _networkCollection = value; } @@ -54,27 +55,30 @@ namespace WinUI mon.UnsubscribeStatusUpdates(updateStatus); } + public event PropertyChangedEventHandler PropertyChanged; + + protected void NotifyPropertyChanged([CallerMemberName] string propertyName = null) + { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } + private void updateNetworks(List networks) { if (networks != null) { this.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() => { + NetworkCollection.Clear(); foreach (ZeroTierNetwork n in networks) { - int index = _networkCollection.IndexOf(n); - - if (index == -1) - { - _networkCollection.Add(n); - } - else - { - _networkCollection[index] = n; - } - } + MenuItem item = new MenuItem(); + item.Header = n.Title; + item.DataContext = n; + item.IsChecked = n.IsConnected; + item.Click += ToolbarItem_NetworkClicked; - this.networkList = networks; + NetworkCollection.Add(item); + } })); } } @@ -130,5 +134,25 @@ namespace WinUI { } + + private void ToolbarItem_NetworkClicked(object sender, System.Windows.RoutedEventArgs e) + { + if(sender.GetType() == typeof(MenuItem)) + { + MenuItem item = e.Source as MenuItem; + if (item.DataContext != null) + { + ZeroTierNetwork network = item.DataContext as ZeroTierNetwork; + if (item.IsChecked) + { + APIHandler.Instance.LeaveNetwork(network.NetworkId); + } + else + { + APIHandler.Instance.JoinNetwork(network.NetworkId, network.AllowManaged, network.AllowGlobal, network.AllowDefault); + } + } + } + } } } diff --git a/windows/WinUI/ZeroTierNetwork.cs b/windows/WinUI/ZeroTierNetwork.cs index 2bcb76e2..ecae0256 100644 --- a/windows/WinUI/ZeroTierNetwork.cs +++ b/windows/WinUI/ZeroTierNetwork.cs @@ -1,6 +1,8 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.Linq; +using System.Runtime.CompilerServices; using System.Runtime.Serialization; using System.Text; using System.Threading.Tasks; @@ -9,8 +11,27 @@ using Newtonsoft.Json; namespace WinUI { [Serializable] - public class ZeroTierNetwork : ISerializable, IEquatable, IComparable + public class ZeroTierNetwork : ISerializable, IEquatable, IComparable, INotifyPropertyChanged { + private string networkId; + private string macAddress; + private string networkName; + private string networkStatus; + private string networkType; + private Int32 mtu; + private bool dhcp; + private bool bridge; + private bool broadcastEnabled; + private Int32 portError; + private Int32 netconfRevision; + private string[] assignedAddresses; + private NetworkRoute[] routes; + private string deviceName; + private bool allowManaged; + private bool allowGlobal; + private bool allowDefault; + private bool isConnected; + protected ZeroTierNetwork(SerializationInfo info, StreamingContext ctx) { try @@ -37,6 +58,8 @@ namespace WinUI IsConnected = false; } + public event PropertyChangedEventHandler PropertyChanged; + public virtual void GetObjectData(SerializationInfo info, StreamingContext ctx) { info.AddValue("nwid", NetworkId); @@ -58,59 +81,351 @@ namespace WinUI info.AddValue("allowDefault", AllowDefault); } + public void UpdateNetwork(ZeroTierNetwork network) + { + if (network == null) + return; + + if (!NetworkId.Equals(network.NetworkId)) + { + NetworkId = network.NetworkId; + } + + if (!MacAddress.Equals(network.MacAddress)) + { + MacAddress = network.MacAddress; + } + + if (!NetworkName.Equals(network.NetworkName)) + { + NetworkName = network.NetworkName; + } + + if (!NetworkStatus.Equals(network.NetworkStatus)) + { + NetworkStatus = network.NetworkStatus; + } + + if (!NetworkType.Equals(network.NetworkType)) + { + NetworkType = network.NetworkType; + } + + if (MTU != network.MTU) + { + MTU = network.MTU; + } + + if (DHCP != network.DHCP) + { + DHCP = network.DHCP; + } + + if (Bridge != network.Bridge) + { + Bridge = network.Bridge; + } + + if (BroadcastEnabled != network.BroadcastEnabled) + { + BroadcastEnabled = network.BroadcastEnabled; + } + + if (PortError != network.PortError) + { + PortError = network.PortError; + } + + if (NetconfRevision != network.NetconfRevision) + { + NetconfRevision = network.NetconfRevision; + } + + AssignedAddresses = network.AssignedAddresses; + + Routes = network.Routes; + + if (!DeviceName.Equals(network.DeviceName)) + { + DeviceName = network.DeviceName; + } + + if (AllowManaged != network.AllowManaged) + { + AllowManaged = network.AllowManaged; + } + + if (AllowGlobal != network.AllowGlobal) + { + AllowGlobal = network.AllowGlobal; + } + + if (AllowDefault != network.AllowDefault) + { + AllowDefault = network.AllowDefault; + } + + if (IsConnected != network.IsConnected) + { + IsConnected = network.IsConnected; + } + } + + protected void NotifyPropertyChanged([CallerMemberName] string propertyName = null) + { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } [JsonProperty("nwid")] - public string NetworkId { get; set; } + public string NetworkId { + get + { + return networkId; + } + set + { + networkId = value; + NotifyPropertyChanged(); + } + } [JsonProperty("mac")] - public string MacAddress { get; set; } + public string MacAddress + { + get + { + return macAddress; + } + set + { + macAddress = value; + NotifyPropertyChanged(); + } + } [JsonProperty("name")] - public string NetworkName { get; set; } + public string NetworkName + { + get + { + return networkName; + } + set + { + networkName = value; + NotifyPropertyChanged(); + } + } [JsonProperty("status")] - public string NetworkStatus { get; set; } + public string NetworkStatus + { + get + { + return networkStatus; + } + set + { + networkStatus = value; + NotifyPropertyChanged(); + } + + } [JsonProperty("type")] - public string NetworkType { get; set; } + public string NetworkType + { + get + { + return networkType; + } + set + { + networkType = value; + NotifyPropertyChanged(); + } + } [JsonProperty("mtu")] - public int MTU { get; set; } + public int MTU + { + get + { + return mtu; + } + set + { + mtu = value; + NotifyPropertyChanged(); + } + } [JsonProperty("dhcp")] - public bool DHCP { get; set; } + public bool DHCP + { + get + { + return dhcp; + } + set + { + dhcp = value; + NotifyPropertyChanged(); + } + } [JsonProperty("bridge")] - public bool Bridge { get; set ; } + public bool Bridge + { + get + { + return bridge; + } + set + { + bridge = value; + NotifyPropertyChanged(); + } + } [JsonProperty("broadcastEnabled")] - public bool BroadcastEnabled { get ; set; } + public bool BroadcastEnabled + { + get + { + return broadcastEnabled; + } + set + { + broadcastEnabled = value; + NotifyPropertyChanged(); + } + } [JsonProperty("portError")] - public int PortError { get; set; } + public int PortError + { + get + { + return portError; + } + set + { + portError = value; + NotifyPropertyChanged(); + } + } [JsonProperty("netconfRevision")] - public int NetconfRevision { get; set; } + public int NetconfRevision + { + get + { + return netconfRevision; + } + set + { + netconfRevision = value; + NotifyPropertyChanged(); + } + } [JsonProperty("assignedAddresses")] - public string[] AssignedAddresses { get; set; } + public string[] AssignedAddresses + { + get + { + return assignedAddresses; + } + set + { + assignedAddresses = value; + NotifyPropertyChanged(); + } + } [JsonProperty("routes")] - public NetworkRoute[] Routes { get; set; } + public NetworkRoute[] Routes + { + get + { + return routes; + } + set + { + routes = value; + NotifyPropertyChanged(); + } + } [JsonProperty("portDeviceName")] - public string DeviceName { get; set; } + public string DeviceName + { + get + { + return deviceName; + } + set + { + deviceName = value; + NotifyPropertyChanged(); + } + } [JsonProperty("allowManaged")] - public bool AllowManaged { get; set; } + public bool AllowManaged + { + get + { + return allowManaged; + } + set + { + allowManaged = value; + NotifyPropertyChanged(); + } + } [JsonProperty("allowGlobal")] - public bool AllowGlobal { get; set; } + public bool AllowGlobal + { + get + { + return allowGlobal; + } + set + { + allowGlobal = value; + NotifyPropertyChanged(); + } + } [JsonProperty("allowDefault")] - public bool AllowDefault { get; set; } + public bool AllowDefault + { + get + { + return allowDefault; + } + set + { + allowDefault = value; + NotifyPropertyChanged(); + } + } - public bool IsConnected { get; set; } = false; + public bool IsConnected + { + get + { + return isConnected; + } + set + { + isConnected = value; + NotifyPropertyChanged(); + } + } public String Title { -- cgit v1.2.3 From 299a7cab200c0af4743ab36d41994fd7a582f900 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Fri, 18 Nov 2016 13:59:31 -0800 Subject: fixed an issue where sometimes network data wouldnt be updated --- windows/WinUI/NetworkMonitor.cs | 1 + windows/WinUI/ZeroTierNetwork.cs | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) (limited to 'windows/WinUI/ZeroTierNetwork.cs') diff --git a/windows/WinUI/NetworkMonitor.cs b/windows/WinUI/NetworkMonitor.cs index 7743c5b9..7adfe0bf 100644 --- a/windows/WinUI/NetworkMonitor.cs +++ b/windows/WinUI/NetworkMonitor.cs @@ -118,6 +118,7 @@ namespace WinUI } } + _knownNetworks.Sort(); _nwCb(_knownNetworks); } diff --git a/windows/WinUI/ZeroTierNetwork.cs b/windows/WinUI/ZeroTierNetwork.cs index ecae0256..d6802385 100644 --- a/windows/WinUI/ZeroTierNetwork.cs +++ b/windows/WinUI/ZeroTierNetwork.cs @@ -478,7 +478,12 @@ namespace WinUI { public bool Equals(ZeroTierNetwork lhs, ZeroTierNetwork rhs) { - return lhs.NetworkId.Equals(rhs.NetworkId); + if (lhs.NetworkId.Equals(rhs.NetworkId)) + { + lhs.UpdateNetwork(rhs); + return true; + } + return false; } public int GetHashCode(ZeroTierNetwork obj) -- cgit v1.2.3