mirror of
https://github.com/zerotier/ZeroTierOne.git
synced 2025-02-21 18:06:39 +00:00
Added network monitor pub/sub class
This commit is contained in:
parent
71aadcbecb
commit
c4c8ea62e2
@ -22,6 +22,13 @@ namespace WinUI
|
|||||||
private static volatile APIHandler instance;
|
private static volatile APIHandler instance;
|
||||||
private static object syncRoot = new Object();
|
private static object syncRoot = new Object();
|
||||||
|
|
||||||
|
public delegate void NetworkListCallback(List<ZeroTierNetwork> networks);
|
||||||
|
public delegate void StatusCallback(ZeroTierStatus status);
|
||||||
|
|
||||||
|
|
||||||
|
private NetworkListCallback _networkCallbacks;
|
||||||
|
private StatusCallback _statusCallbacks;
|
||||||
|
|
||||||
public static APIHandler Instance
|
public static APIHandler Instance
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
@ -128,7 +135,7 @@ namespace WinUI
|
|||||||
this.authtoken = authtoken;
|
this.authtoken = authtoken;
|
||||||
}
|
}
|
||||||
|
|
||||||
public delegate void StatusCallback(ZeroTierStatus status);
|
|
||||||
|
|
||||||
public void GetStatus(StatusCallback cb)
|
public void GetStatus(StatusCallback cb)
|
||||||
{
|
{
|
||||||
@ -168,7 +175,7 @@ namespace WinUI
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public delegate void NetworkListCallback(List<ZeroTierNetwork> networks);
|
|
||||||
|
|
||||||
public void GetNetworks(NetworkListCallback cb)
|
public void GetNetworks(NetworkListCallback cb)
|
||||||
{
|
{
|
||||||
|
159
windows/WinUI/NetworkMonitor.cs
Normal file
159
windows/WinUI/NetworkMonitor.cs
Normal file
@ -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<ZeroTierNetwork> networks);
|
||||||
|
public delegate void StatusCallback(ZeroTierStatus status);
|
||||||
|
|
||||||
|
private Thread runThread;
|
||||||
|
private NetworkListCallback _nwCb;
|
||||||
|
private StatusCallback _stCb;
|
||||||
|
|
||||||
|
|
||||||
|
private List<ZeroTierNetwork> _knownNetworks = new List<ZeroTierNetwork>();
|
||||||
|
|
||||||
|
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<ZeroTierNetwork> netList;
|
||||||
|
|
||||||
|
using (Stream stream = File.Open(dataFile, FileMode.Open))
|
||||||
|
{
|
||||||
|
var bformatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
|
||||||
|
netList = (List<ZeroTierNetwork>)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<ZeroTierNetwork> 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -30,6 +30,8 @@ namespace WinUI
|
|||||||
private NetworkListView netListView = null;
|
private NetworkListView netListView = null;
|
||||||
private List<ZeroTierNetwork> networkList = null;
|
private List<ZeroTierNetwork> networkList = null;
|
||||||
|
|
||||||
|
private NetworkMonitor mon = NetworkMonitor.Instance;
|
||||||
|
|
||||||
private ObservableCollection<ZeroTierNetwork> _networkCollection = new ObservableCollection<ZeroTierNetwork>();
|
private ObservableCollection<ZeroTierNetwork> _networkCollection = new ObservableCollection<ZeroTierNetwork>();
|
||||||
|
|
||||||
public ObservableCollection<ZeroTierNetwork> NetworkCollection
|
public ObservableCollection<ZeroTierNetwork> NetworkCollection
|
||||||
@ -44,15 +46,14 @@ namespace WinUI
|
|||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
onUpdateTimer(this, null);
|
mon.SubscribeNetworkUpdates(updateNetworks);
|
||||||
|
mon.SubscribeStatusUpdates(updateStatus);
|
||||||
|
}
|
||||||
|
|
||||||
timer = new Timer();
|
~ToolbarItem()
|
||||||
timer.Elapsed += new ElapsedEventHandler(onUpdateTimer);
|
{
|
||||||
timer.Interval = 2000;
|
mon.UnsubscribeNetworkUpdates(updateNetworks);
|
||||||
timer.Enabled = true;
|
mon.UnsubscribeStatusUpdates(updateStatus);
|
||||||
|
|
||||||
nodeIdMenuItem.Header = "OFFLINE";
|
|
||||||
nodeIdMenuItem.IsEnabled = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateNetworks(List<ZeroTierNetwork> networks)
|
private void updateNetworks(List<ZeroTierNetwork> 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)
|
private void ToolbarItem_TrayContextMenuOpen(object sender, System.Windows.RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
Console.WriteLine("TrayContextMenuOpen");
|
Console.WriteLine("TrayContextMenuOpen");
|
||||||
|
@ -101,6 +101,7 @@
|
|||||||
<Generator>MSBuild:Compile</Generator>
|
<Generator>MSBuild:Compile</Generator>
|
||||||
<SubType>Designer</SubType>
|
<SubType>Designer</SubType>
|
||||||
</ApplicationDefinition>
|
</ApplicationDefinition>
|
||||||
|
<Compile Include="NetworkMonitor.cs" />
|
||||||
<Compile Include="NetworkRoute.cs" />
|
<Compile Include="NetworkRoute.cs" />
|
||||||
<Compile Include="NetworksPage.xaml.cs">
|
<Compile Include="NetworksPage.xaml.cs">
|
||||||
<DependentUpon>NetworksPage.xaml</DependentUpon>
|
<DependentUpon>NetworksPage.xaml</DependentUpon>
|
||||||
|
@ -158,4 +158,17 @@ namespace WinUI
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class NetworkEqualityComparer : IEqualityComparer<ZeroTierNetwork>
|
||||||
|
{
|
||||||
|
public bool Equals(ZeroTierNetwork lhs, ZeroTierNetwork rhs)
|
||||||
|
{
|
||||||
|
return lhs.NetworkId.Equals(rhs.NetworkId);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int GetHashCode(ZeroTierNetwork obj)
|
||||||
|
{
|
||||||
|
return obj.NetworkId.GetHashCode();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user