updated ZTO version

This commit is contained in:
Joseph Henry
2017-03-07 11:08:02 -08:00
parent ce42dd4815
commit 9016bc8385
132 changed files with 11902 additions and 10793 deletions

View File

@@ -7,6 +7,7 @@ using System.Net;
using System.IO;
using System.Windows;
using Newtonsoft.Json;
using System.Diagnostics;
namespace WinUI
{
@@ -18,7 +19,108 @@ namespace WinUI
private string url = null;
public APIHandler()
private static volatile APIHandler instance;
private static object syncRoot = new Object();
public delegate void NetworkListCallback(List<ZeroTierNetwork> networks);
public delegate void StatusCallback(ZeroTierStatus status);
public static APIHandler Instance
{
get
{
if (instance == null)
{
lock (syncRoot)
{
if (instance == null)
{
if (!initHandler())
{
return null;
}
}
}
}
return instance;
}
}
private static bool initHandler()
{
String localZtDir = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + "\\ZeroTier\\One";
String globalZtDir = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) + "\\ZeroTier\\One";
String authToken = "";
Int32 port = 9993;
if (!File.Exists(localZtDir + "\\authtoken.secret") || !File.Exists(localZtDir + "\\zerotier-one.port"))
{
// launch external process to copy file into place
String curPath = System.Reflection.Assembly.GetEntryAssembly().Location;
int index = curPath.LastIndexOf("\\");
curPath = curPath.Substring(0, index);
ProcessStartInfo startInfo = new ProcessStartInfo(curPath + "\\copyutil.exe", "\""+globalZtDir+"\"" + " " + "\""+localZtDir+"\"");
startInfo.Verb = "runas";
var process = Process.Start(startInfo);
process.WaitForExit();
}
authToken = readAuthToken(localZtDir + "\\authtoken.secret");
if ((authToken == null) || (authToken.Length <= 0))
{
MessageBox.Show("Unable to read ZeroTier One authtoken", "ZeroTier One");
return false;
}
port = readPort(localZtDir + "\\zerotier-one.port");
instance = new APIHandler(port, authToken);
return true;
}
private static String readAuthToken(String path)
{
String authToken = "";
if (File.Exists(path))
{
try
{
byte[] tmp = File.ReadAllBytes(path);
authToken = System.Text.Encoding.UTF8.GetString(tmp).Trim();
}
catch
{
MessageBox.Show("Unable to read ZeroTier One Auth Token from:\r\n" + path, "ZeroTier One");
}
}
return authToken;
}
private static Int32 readPort(String path)
{
Int32 port = 9993;
try
{
byte[] tmp = File.ReadAllBytes(path);
port = Int32.Parse(System.Text.Encoding.ASCII.GetString(tmp).Trim());
if ((port <= 0) || (port > 65535))
port = 9993;
}
catch
{
}
return port;
}
private APIHandler()
{
url = "http://127.0.0.1:9993";
}
@@ -29,7 +131,9 @@ namespace WinUI
this.authtoken = authtoken;
}
public ZeroTierStatus GetStatus()
public void GetStatus(StatusCallback cb)
{
var request = WebRequest.Create(url + "/status" + "?auth=" + authtoken) as HttpWebRequest;
if (request != null)
@@ -54,29 +158,32 @@ 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<ZeroTierNetwork> GetNetworks()
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";
request.ContentType = "application/json";
request.Timeout = 10000;
try
{
@@ -89,25 +196,30 @@ namespace WinUI
try
{
networkList = JsonConvert.DeserializeObject<List<ZeroTierNetwork>>(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);
}
}
public void JoinNetwork(string nwid)
public void JoinNetwork(string nwid, bool allowManaged = true, bool allowGlobal = false, bool allowDefault = false)
{
var request = WebRequest.Create(url + "/network/" + nwid + "?auth=" + authtoken) as HttpWebRequest;
if (request == null)
@@ -116,6 +228,18 @@ namespace WinUI
}
request.Method = "POST";
request.ContentType = "applicaiton/json";
request.Timeout = 10000;
using (var streamWriter = new StreamWriter(((HttpWebRequest)request).GetRequestStream()))
{
string json = "{\"allowManaged\":" + (allowManaged ? "true" : "false") + "," +
"\"allowGlobal\":" + (allowGlobal ? "true" : "false") + "," +
"\"allowDefault\":" + (allowDefault ? "true" : "false") + "}";
streamWriter.Write(json);
streamWriter.Flush();
streamWriter.Close();
}
try
{
@@ -145,6 +269,7 @@ namespace WinUI
}
request.Method = "DELETE";
request.Timeout = 10000;
try
{
@@ -163,14 +288,20 @@ namespace WinUI
{
MessageBox.Show("Error Leaving Network: Cannot connect to ZeroTier service.");
}
catch
{
Console.WriteLine("Error leaving network: Unknown error");
}
}
public List<ZeroTierPeer> GetPeers()
public delegate void PeersCallback(List<ZeroTierPeer> 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";
@@ -192,16 +323,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);
}
}
}

View File

@@ -1,7 +1,7 @@
<Application x:Class="WinUI.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="MainWindow.xaml">
StartupUri="ToolbarItem.xaml">
<Application.Resources>
<ResourceDictionary>

View File

@@ -5,6 +5,7 @@ using System.Data;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
using Hardcodet.Wpf.TaskbarNotification;
namespace WinUI
{
@@ -13,5 +14,12 @@ namespace WinUI
/// </summary>
public partial class App : Application
{
private TaskbarIcon tb;
private void InitApplication()
{
tb = (TaskbarIcon)FindResource("NotifyIcon");
tb.Visibility = Visibility.Visible;
}
}
}

View File

@@ -1,132 +0,0 @@
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WinUI"
mc:Ignorable="d" x:Class="WinUI.MainWindow"
Title="ZeroTier One" Height="500" Width="425" Icon="ZeroTierIcon.ico">
<Window.Resources>
<SolidColorBrush x:Key="GreenBrush" Color="#ff91a2a3"/>
<SolidColorBrush x:Key="SolidBorderBrush" Color="#888" />
<SolidColorBrush x:Key="GreenDisabledBrush" Color="#FF234447" />
<SolidColorBrush x:Key="DisabledBackgroundBrush" Color="#EEE" />
<SolidColorBrush x:Key="DisabledBorderBrush" Color="#AAA" />
<SolidColorBrush x:Key="DisabledForegroundBrush" Color="#888" />
<Style TargetType="{x:Type DataGrid}">
<Setter Property="Background" Value="#FFF" />
<Setter Property="AlternationCount" Value="2" />
</Style>
<Style TargetType="{x:Type DataGridRow}">
<Style.Triggers>
<Trigger Property="ItemsControl.AlternationIndex" Value="0">
<Setter Property="Background" Value="#EEE"></Setter>
</Trigger>
<Trigger Property="ItemsControl.AlternationIndex" Value="1">
<Setter Property="Background" Value="#FFF"></Setter>
</Trigger>
</Style.Triggers>
</Style>
<Style TargetType="{x:Type TabItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TabItem}">
<Grid>
<Border
Name="Border"
Margin="0,0,-4,0"
Background="{StaticResource GreenBrush}"
BorderBrush="{StaticResource SolidBorderBrush}"
BorderThickness="1,1,1,1"
CornerRadius="2,12,0,0" >
<ContentPresenter x:Name="ContentSite"
VerticalAlignment="Center"
HorizontalAlignment="Center"
ContentSource="Header"
Margin="12,2,12,2"
RecognizesAccessKey="True"/>
</Border>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Panel.ZIndex" Value="100" />
<Setter TargetName="Border" Property="Background" Value="{StaticResource GreenDisabledBrush}" />
<Setter TargetName="Border" Property="BorderThickness" Value="1,1,1,0" />
</Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter TargetName="Border" Property="Background" Value="{StaticResource DisabledBackgroundBrush}" />
<Setter TargetName="Border" Property="BorderBrush" Value="{StaticResource DisabledBorderBrush}" />
<Setter Property="Foreground" Value="{StaticResource DisabledForegroundBrush}" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
<DockPanel>
<StatusBar DockPanel.Dock="Bottom" Height="26" Background="#FF234447" Margin="0">
<StatusBar.ItemsPanel>
<ItemsPanelTemplate>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
</Grid>
</ItemsPanelTemplate>
</StatusBar.ItemsPanel>
<StatusBarItem Grid.Column="0" x:Name="networkId" Content="deadbeef00" Foreground="White" FontFamily="Lucida Console"/>
<StatusBarItem Grid.Column="1" x:Name="onlineStatus" Content="ONLINE" Foreground="White" FontFamily="Lucida Console"/>
<StatusBarItem Grid.Column="2" x:Name="versionString" Content="1.0.5" Foreground="White" FontFamily="Lucida Console"/>
<StatusBarItem Grid.Column="3" x:Name="blank" Content="" Height="43" Foreground="White"/>
<StatusBarItem Grid.Column="4">
<TextBox x:Name="joinNetworkID" TextWrapping="Wrap" Width="140" HorizontalAlignment="Right" ToolTip="Enter Network ID" PreviewTextInput="OnNetworkEntered" MaxLength="16" FontFamily="Lucida Console" FontSize="12" BorderThickness="1"/>
</StatusBarItem>
<StatusBarItem Grid.Column="5" x:Name="statusBarButton" Foreground="White" RenderTransformOrigin="0.789,0.442">
<Button x:Name="joinButton" Content="Join" Background="#FFFFB354" Width="76" Click="joinButton_Click"/>
</StatusBarItem>
</StatusBar>
<!--<TabControl Margin="0,0,0,0">
<TabItem x:Name="Networks" Header="Networks" Foreground="White" IsSelected="True" IsManipulationEnabled="True">-->
<Grid Background="LightGray" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<local:NetworksPage x:Name="networksPage" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Grid.Column="0" Grid.Row="0" Margin="0,0,0,0"/>
</Grid>
<!--</TabItem>-->
<!--<TabItem x:Name="Peers" Header="Peers" Foreground="White">
<Grid Background="#FFE5E5E5" HorizontalAlignment="Left" VerticalAlignment="Top">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<local:PeersPage x:Name="peersPage" HorizontalAlignment="Left" VerticalAlignment="Top" Grid.Column="0" Grid.Row="0"/>
</Grid>
</TabItem>-->
<!--</TabControl>-->
</DockPanel>
</Window>

View File

@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
@@ -57,32 +58,34 @@ namespace WinUI
}
}
private bool InitAPIHandler()
private String readAuthToken(String path)
{
String ztDir = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) + "\\ZeroTier\\One";
String authToken = "";
Int32 port = 9993;
try
if (File.Exists(path))
{
byte[] tmp = File.ReadAllBytes(ztDir + "\\authtoken.secret");
authToken = System.Text.Encoding.ASCII.GetString(tmp).Trim();
}
catch
{
MessageBox.Show("Unable to read ZeroTier One authtoken.secret from:\r\n" + ztDir, "ZeroTier One");
this.Close();
return false;
try
{
byte[] tmp = File.ReadAllBytes(path);
authToken = System.Text.Encoding.UTF8.GetString(tmp).Trim();
}
catch
{
MessageBox.Show("Unable to read ZeroTier One Auth Token from:\r\n" + path, "ZeroTier One");
}
}
if ((authToken == null) || (authToken.Length <= 0))
{
MessageBox.Show("Unable to read ZeroTier One authtoken.secret from:\r\n" + ztDir, "ZeroTier One");
this.Close();
return false;
}
return authToken;
}
private Int32 readPort(String path)
{
Int32 port = 9993;
try
{
byte[] tmp = File.ReadAllBytes(ztDir + "\\zerotier-one.port");
byte[] tmp = File.ReadAllBytes(path);
port = Int32.Parse(System.Text.Encoding.ASCII.GetString(tmp).Trim());
if ((port <= 0) || (port > 65535))
port = 9993;
@@ -91,6 +94,41 @@ namespace WinUI
{
}
return port;
}
private bool InitAPIHandler()
{
String localZtDir = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + "\\ZeroTier\\One";
String globalZtDir = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) + "\\ZeroTier\\One";
String authToken = "";
Int32 port = 9993;
if (!File.Exists(localZtDir + "\\authtoken.secret") || !File.Exists(localZtDir + "\\zerotier-one.port"))
{
// launch external process to copy file into place
String curPath = System.Reflection.Assembly.GetEntryAssembly().Location;
int index = curPath.LastIndexOf("\\");
curPath = curPath.Substring(0, index);
ProcessStartInfo startInfo = new ProcessStartInfo(curPath + "\\copyutil.exe", globalZtDir + " " + localZtDir);
startInfo.Verb = "runas";
var process = Process.Start(startInfo);
process.WaitForExit();
}
authToken = readAuthToken(localZtDir + "\\authtoken.secret");
if ((authToken == null) || (authToken.Length <= 0))
{
MessageBox.Show("Unable to read ZeroTier One authtoken", "ZeroTier One");
this.Close();
return false;
}
port = readPort(localZtDir + "\\zerotier-one.port");
handler = new APIHandler(port, authToken);
return true;
}
@@ -105,7 +143,7 @@ namespace WinUI
networkId.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() =>
{
this.networkId.Content = status.Address;
this.networkId.Text = status.Address;
}));
versionString.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() =>
{
@@ -122,7 +160,7 @@ namespace WinUI
networkId.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() =>
{
this.networkId.Content = "";
this.networkId.Text = "";
}));
versionString.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() =>
{

View File

@@ -26,6 +26,9 @@
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
</Grid.RowDefinitions>
<Grid Grid.Column="0" Grid.Row="0" Grid.ColumnSpan="3">
@@ -48,8 +51,11 @@
<TextBlock TextWrapping="Wrap" Text="Bridging" HorizontalAlignment="Right" Grid.Column="0" Grid.Row="7" Foreground="#FF000000"/>
<TextBlock TextWrapping="Wrap" Text="Device" HorizontalAlignment="Right" Grid.Column="0" Grid.Row="8" Foreground="#FF000000"/>
<TextBlock TextWrapping="Wrap" Text="Managed IPs" HorizontalAlignment="Right" Grid.Column="0" Grid.Row="9" Foreground="#FF000000"/>
<TextBlock TextWrapping="Wrap" Text="Allow Global IP" HorizontalAlignment="Right" Grid.Column="0" Grid.Row="10" Foreground="#FF000000"/>
<TextBlock TextWrapping="Wrap" Text="Allow Managed IP" HorizontalAlignment="Right" Grid.Column="0" Grid.Row="11" Foreground="#FF000000"/>
<TextBlock TextWrapping="Wrap" Text="Allow Default Route" HorizontalAlignment="Right" Grid.Column="0" Grid.Row="12" Foreground="#FF000000"/>
<Rectangle Grid.Column="2" Grid.Row="2" Grid.RowSpan="8" Fill="#FFEEEEEE"/>
<Rectangle Grid.Column="2" Grid.Row="2" Grid.RowSpan="11" Fill="#FFEEEEEE"/>
<TextBlock x:Name="networkStatus" FontFamily="Lucida Console" TextWrapping="Wrap" HorizontalAlignment="Right" Text="OK" TextAlignment="Right" Grid.Column="2" Grid.Row="2" Foreground="#FF000000"/>
<TextBlock x:Name="networkType" FontFamily="Lucida Console" TextWrapping="Wrap" Text="PUBLIC" HorizontalAlignment="Right" Grid.Column="2" Grid.Row="3" Foreground="#FF000000"/>
@@ -58,15 +64,21 @@
<TextBlock x:Name="broadcastEnabled" FontFamily="Lucida Console" TextWrapping="Wrap" Text="ENABLED" HorizontalAlignment="Right" Grid.Column="2" Grid.Row="6" Foreground="#FF000000"/>
<TextBlock x:Name="bridgingEnabled" FontFamily="Lucida Console" TextWrapping="Wrap" Text="DISABLED" HorizontalAlignment="Right" Grid.Column="2" Grid.Row="7" Background="#FFEEEEEE" Foreground="#FF000000"/>
<TextBlock x:Name="deviceName" FontFamily="Lucida Console" TextWrapping="Wrap" HorizontalAlignment="Right" Grid.Column="2" Grid.Row="8" Foreground="#FF000000"><Span><Run Text="ethernet_32771"/></Span></TextBlock>
<TextBlock x:Name="managedIps" TextWrapping="Wrap" FontFamily="Lucida Console" HorizontalAlignment="Right" TextAlignment="Right" Grid.Column="2" Grid.Row="9" Foreground="#FF000000"><Span><Run Text="28.2.169.248/7 "/></Span><LineBreak/><Span><Run Text="fd80:56c2:e21c:0000:0199:9383:4a02:a9f8/88"/></Span></TextBlock>
<Separator Grid.Column="0" Grid.Row="10" Grid.ColumnSpan="3"/>
<TextBox x:Name="managedIps" TextWrapping="Wrap" FontFamily="Lucida Console" HorizontalAlignment="Right" TextAlignment="Right" Grid.Column="2" Grid.Row="9" Foreground="#FF000000" IsReadOnly="True" BorderThickness="0" Background="#FFEEEEEE" Text="28.2.169.248/7&#x0a;fd80:56c2:e21c:0000:0199:9383:4a02:a9f8/88"/>
<CheckBox x:Name="allowGlobal" HorizontalAlignment="Right" Grid.Column="2" Grid.Row="10" />
<CheckBox x:Name="allowManaged" HorizontalAlignment="Right" Grid.Column="2" Grid.Row="11" />
<CheckBox x:Name="allowDefault" HorizontalAlignment="Right" Grid.Column="2" Grid.Row="12" />
<Grid Grid.Column="0" Grid.Row="11" Grid.ColumnSpan="3" Background="GhostWhite">
<Separator Grid.Column="0" Grid.Row="13" Grid.ColumnSpan="3"/>
<Grid Grid.Column="0" Grid.Row="14" Grid.ColumnSpan="3" Background="GhostWhite">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="auto"/>
</Grid.ColumnDefinitions>
<Button x:Name="leaveButton" Content="Leave" HorizontalAlignment="Right" VerticalAlignment="Bottom" Width="75" Background="#FFFFB354" Click="leaveButton_Click"/>
<Button x:Name="deleteButton" Grid.Column="0" Content="Delete" HorizontalAlignment="Left" VerticalAlignment="Center" Width="75" Background="#FFFFB354" Click="deleteButton_Click"/>
<CheckBox x:Name="connectedCheckBox" Grid.Column="2" Content="Connected" HorizontalAlignment="Right" VerticalAlignment="Center" Checked="connectedCheckBox_Checked" Unchecked="connectedCheckbox_Unchecked"/>
</Grid>
</Grid>
</Border>

View File

@@ -20,30 +20,50 @@ namespace WinUI
/// </summary>
public partial class NetworkInfoView : UserControl
{
private APIHandler handler;
private ZeroTierNetwork network;
public ZeroTierNetwork network;
public NetworkInfoView(APIHandler handler, ZeroTierNetwork network)
public NetworkInfoView(ZeroTierNetwork network)
{
InitializeComponent();
this.handler = handler;
this.network = network;
UpdateNetworkData();
allowDefault.Checked += AllowDefault_CheckStateChanged;
allowDefault.Unchecked += AllowDefault_CheckStateChanged;
allowGlobal.Checked += AllowGlobal_CheckStateChanged;
allowGlobal.Unchecked += AllowGlobal_CheckStateChanged;
allowManaged.Checked += AllowManaged_CheckStateChanged;
allowManaged.Unchecked += AllowManaged_CheckStateChanged;
}
private void UpdateNetworkData()
{
this.networkId.Text = network.NetworkId;
this.networkName.Text = network.NetworkName;
this.networkStatus.Text = network.NetworkStatus;
this.networkType.Text = network.NetworkType;
this.macAddress.Text = network.MacAddress;
this.mtu.Text = network.MTU.ToString();
if (this.networkId.Text != network.NetworkId)
this.networkId.Text = network.NetworkId;
if (this.networkName.Text != network.NetworkName)
this.networkName.Text = network.NetworkName;
if (this.networkStatus.Text != network.NetworkStatus)
this.networkStatus.Text = network.NetworkStatus;
if (this.networkType.Text != network.NetworkType)
this.networkType.Text = network.NetworkType;
if (this.macAddress.Text != network.MacAddress)
this.macAddress.Text = network.MacAddress;
if (this.mtu.Text != network.MTU.ToString())
this.mtu.Text = network.MTU.ToString();
this.broadcastEnabled.Text = (network.BroadcastEnabled ? "ENABLED" : "DISABLED");
this.bridgingEnabled.Text = (network.Bridge ? "ENABLED" : "DISABLED");
this.deviceName.Text = network.DeviceName;
if (this.deviceName.Text != network.DeviceName)
this.deviceName.Text = network.DeviceName;
string iplist = "";
for (int i = 0; i < network.AssignedAddresses.Length; ++i)
@@ -53,8 +73,21 @@ namespace WinUI
iplist += "\n";
}
this.managedIps.Text = iplist;
}
if (this.managedIps.Text != iplist)
this.managedIps.Text = iplist;
this.allowDefault.IsChecked = network.AllowDefault;
this.allowGlobal.IsChecked = network.AllowGlobal;
this.allowManaged.IsChecked = network.AllowManaged;
this.connectedCheckBox.Checked -= connectedCheckBox_Checked;
this.connectedCheckBox.Unchecked -= connectedCheckbox_Unchecked;
this.connectedCheckBox.IsChecked = network.IsConnected;
this.connectedCheckBox.Checked += connectedCheckBox_Checked;
this.connectedCheckBox.Unchecked += connectedCheckbox_Unchecked;
}
public bool HasNetwork(ZeroTierNetwork network)
{
@@ -64,9 +97,70 @@ namespace WinUI
return false;
}
private void leaveButton_Click(object sender, RoutedEventArgs e)
public void SetNetworkInfo(ZeroTierNetwork network)
{
handler.LeaveNetwork(network.NetworkId);
this.network = network;
UpdateNetworkData();
}
private void deleteButton_Click(object sender, RoutedEventArgs e)
{
APIHandler.Instance.LeaveNetwork(network.NetworkId);
NetworkMonitor.Instance.RemoveNetwork(network.NetworkId);
}
private void AllowManaged_CheckStateChanged(object sender, RoutedEventArgs e)
{
CheckBox cb = sender as CheckBox;
APIHandler.Instance.JoinNetwork(network.NetworkId,
allowManaged.IsChecked ?? false,
allowGlobal.IsChecked ?? false,
allowDefault.IsChecked ?? false);
}
private void AllowGlobal_CheckStateChanged(object sender, RoutedEventArgs e)
{
CheckBox cb = sender as CheckBox;
APIHandler.Instance.JoinNetwork(network.NetworkId,
allowManaged.IsChecked ?? false,
allowGlobal.IsChecked ?? false,
allowDefault.IsChecked ?? false);
}
private void AllowDefault_CheckStateChanged(object sender, RoutedEventArgs e)
{
CheckBox cb = sender as CheckBox;
APIHandler.Instance.JoinNetwork(network.NetworkId,
allowManaged.IsChecked ?? false,
allowGlobal.IsChecked ?? false,
allowDefault.IsChecked ?? false);
}
private void connectedCheckBox_Checked(object sender, RoutedEventArgs e)
{
onConnectedCheckboxUpdated(true);
}
private void connectedCheckbox_Unchecked(object sender, RoutedEventArgs e)
{
onConnectedCheckboxUpdated(false);
}
private void onConnectedCheckboxUpdated(bool isChecked)
{
if (isChecked)
{
bool global = allowGlobal.IsChecked.Value;
bool managed = allowManaged.IsChecked.Value;
bool defRoute = allowDefault.IsChecked.Value;
APIHandler.Instance.JoinNetwork(networkId.Text, managed, global, defRoute);
}
else
{
APIHandler.Instance.LeaveNetwork(networkId.Text);
}
}
}
}

View File

@@ -20,33 +20,80 @@ namespace WinUI
/// </summary>
public partial class NetworksPage : UserControl
{
private APIHandler handler;
public NetworksPage()
{
InitializeComponent();
}
public void SetAPIHandler(APIHandler handler)
{
this.handler = handler;
}
public void setNetworks(List<ZeroTierNetwork> networks)
{
this.wrapPanel.Children.Clear();
if (networks == null)
{
this.wrapPanel.Children.Clear();
return;
}
for (int i = 0; i < networks.Count; ++i)
foreach (ZeroTierNetwork network in networks)
{
this.wrapPanel.Children.Add(
new NetworkInfoView(
handler,
networks.ElementAt<ZeroTierNetwork>(i)));
NetworkInfoView view = ChildWithNetwork(network);
if (view != null)
{
view.SetNetworkInfo(network);
}
else
{
wrapPanel.Children.Add(
new NetworkInfoView(
network));
}
}
// remove networks we're no longer joined to.
List<ZeroTierNetwork> tmpList = GetNetworksFromChildren();
foreach (ZeroTierNetwork n in networks)
{
if (tmpList.Contains(n))
{
tmpList.Remove(n);
}
}
foreach (ZeroTierNetwork n in tmpList)
{
NetworkInfoView view = ChildWithNetwork(n);
if (view != null)
{
wrapPanel.Children.Remove(view);
}
}
}
private NetworkInfoView ChildWithNetwork(ZeroTierNetwork network)
{
List<NetworkInfoView> list = wrapPanel.Children.OfType<NetworkInfoView>().ToList();
foreach (NetworkInfoView view in list)
{
if (view.HasNetwork(network))
{
return view;
}
}
return null;
}
private List<ZeroTierNetwork> GetNetworksFromChildren()
{
List<ZeroTierNetwork> networks = new List<ZeroTierNetwork>(wrapPanel.Children.Count);
List<NetworkInfoView> list = wrapPanel.Children.OfType<NetworkInfoView>().ToList();
foreach (NetworkInfoView n in list)
{
networks.Add(n.network);
}
return networks;
}
}
}

View File

@@ -8,10 +8,10 @@
// </auto-generated>
//------------------------------------------------------------------------------
namespace WinUI.Properties
{
namespace WinUI.Properties {
using System;
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
@@ -22,50 +22,52 @@ namespace WinUI.Properties
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources
{
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources()
{
internal Resources() {
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager
{
get
{
if ((resourceMan == null))
{
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("WinUI.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture
{
get
{
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set
{
set {
resourceCulture = value;
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Icon similar to (Icon).
/// </summary>
internal static System.Drawing.Icon ZeroTierIcon {
get {
object obj = ResourceManager.GetObject("ZeroTierIcon", resourceCulture);
return ((System.Drawing.Icon)(obj));
}
}
}
}

View File

@@ -46,7 +46,7 @@
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Serialization.Formatters.Binary.BinaryFormatter
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
@@ -60,6 +60,7 @@
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
@@ -68,9 +69,10 @@
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" />
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
@@ -85,9 +87,10 @@
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
@@ -109,9 +112,13 @@
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="ZeroTierIcon" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\ZeroTierIcon.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
</root>

View File

@@ -1,4 +1,9 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/interactivedesigner/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d">
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/interactivedesigner/2006"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
xmlns:tb="http://www.hardcodet.net/taskbar">
<!-- SimpleStyles.XAML defines a set of control styles which are simplified starting points for creating your own controls -->
@@ -1118,4 +1123,6 @@
</Setter.Value>
</Setter>
</Style>
<tb:TaskbarIcon x:Key="NotifyIcon" IconSource="ZeroTierIcon.ico" ToolTipText="ZeroTier One"/>
</ResourceDictionary>

View File

@@ -63,13 +63,15 @@
<PropertyGroup>
<SignManifests>false</SignManifests>
</PropertyGroup>
<PropertyGroup>
<ApplicationManifest>app.manifest</ApplicationManifest>
</PropertyGroup>
<PropertyGroup />
<ItemGroup>
<Reference Include="Accessibility" />
<Reference Include="Newtonsoft.Json, Version=7.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
<Reference Include="Hardcodet.Wpf.TaskbarNotification, Version=1.0.5.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Hardcodet.NotifyIcon.Wpf.1.0.8\lib\net45\Hardcodet.Wpf.TaskbarNotification.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="PresentationUI, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
@@ -99,17 +101,39 @@
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</ApplicationDefinition>
<Compile Include="AboutView.xaml.cs">
<DependentUpon>AboutView.xaml</DependentUpon>
</Compile>
<Compile Include="JoinNetworkView.xaml.cs">
<DependentUpon>JoinNetworkView.xaml</DependentUpon>
</Compile>
<Compile Include="NetworkMonitor.cs" />
<Compile Include="NetworkRoute.cs" />
<Compile Include="NetworksPage.xaml.cs">
<DependentUpon>NetworksPage.xaml</DependentUpon>
</Compile>
<Compile Include="PeersPage.xaml.cs">
<DependentUpon>PeersPage.xaml</DependentUpon>
</Compile>
<Compile Include="PreferencesView.xaml.cs">
<DependentUpon>PreferencesView.xaml</DependentUpon>
</Compile>
<Compile Include="ToolbarItem.xaml.cs">
<DependentUpon>ToolbarItem.xaml</DependentUpon>
</Compile>
<Compile Include="ZeroTierPeerPhysicalPath.cs" />
<Compile Include="ZeroTierPeer.cs" />
<Compile Include="ZeroTierNetwork.cs" />
<Compile Include="ZeroTierStatus.cs" />
<Page Include="MainWindow.xaml">
<Page Include="AboutView.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="JoinNetworkView.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="NetworkListView.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
@@ -118,8 +142,8 @@
<DependentUpon>App.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Compile Include="MainWindow.xaml.cs">
<DependentUpon>MainWindow.xaml</DependentUpon>
<Compile Include="NetworkListView.xaml.cs">
<DependentUpon>NetworkListView.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Page Include="NetworkInfoView.xaml">
@@ -134,6 +158,10 @@
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="PreferencesView.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="Simple Styles.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
@@ -142,6 +170,10 @@
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="ToolbarItem.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
</ItemGroup>
<ItemGroup>
<Compile Include="NetworkInfoView.xaml.cs">
@@ -215,8 +247,14 @@
</BlendEmbeddedFont>
<Resource Include="ZeroTierIcon.ico" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\ZeroTierIcon.ico" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="$(MSBuildExtensionsPath)\Microsoft\Expression\Blend\.NETFramework\v4.5\Microsoft.Expression.Blend.WPF.targets" />
<PropertyGroup>
<PostBuildEvent>copy "$(SolutionDir)\copyutil\bin\$(ConfigurationName)\copyutil.exe" "$(ProjectDir)\$(OutDir)\copyutil.exe"</PostBuildEvent>
</PropertyGroup>
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">

View File

@@ -1,54 +1,494 @@
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;
using Newtonsoft.Json;
namespace WinUI
{
public class ZeroTierNetwork
[Serializable]
public class ZeroTierNetwork : ISerializable, IEquatable<ZeroTierNetwork>, IComparable<ZeroTierNetwork>, 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
{
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 event PropertyChangedEventHandler PropertyChanged;
public virtual void GetObjectData(SerializationInfo info, StreamingContext ctx)
{
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);
}
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; }
[JsonProperty("multicastSubscriptions")]
public string[] MulticastSubscriptions { 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
{
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
{
return allowManaged;
}
set
{
allowManaged = value;
NotifyPropertyChanged();
}
}
[JsonProperty("allowGlobal")]
public bool AllowGlobal
{
get
{
return allowGlobal;
}
set
{
allowGlobal = value;
NotifyPropertyChanged();
}
}
[JsonProperty("allowDefault")]
public bool AllowDefault
{
get
{
return allowDefault;
}
set
{
allowDefault = value;
NotifyPropertyChanged();
}
}
public bool IsConnected
{
get
{
return isConnected;
}
set
{
isConnected = value;
NotifyPropertyChanged();
}
}
public String Title
{
get
{
if (NetworkName != null && NetworkName.Length > 0)
{
return NetworkId + " (" + NetworkName + ")";
}
else
{
return NetworkId;
}
}
}
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);
if (thisNwid > otherNwid)
{
return 1;
}
else if (thisNwid < otherNwid)
{
return -1;
}
else
{
return 0;
}
}
}
public class NetworkEqualityComparer : IEqualityComparer<ZeroTierNetwork>
{
public bool Equals(ZeroTierNetwork lhs, ZeroTierNetwork rhs)
{
if (lhs.NetworkId.Equals(rhs.NetworkId))
{
lhs.UpdateNetwork(rhs);
return true;
}
return false;
}
public int GetHashCode(ZeroTierNetwork obj)
{
return obj.NetworkId.GetHashCode();
}
}
}

View File

@@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Newtonsoft.Json" version="7.0.1" targetFramework="net45" />
<package id="Hardcodet.NotifyIcon.Wpf" version="1.0.8" targetFramework="net45" />
<package id="Newtonsoft.Json" version="9.0.1" targetFramework="net45" />
</packages>