|
@@ -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;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|