Pārlūkot izejas kodu

Run Join/Leave commands asynchronously so the UI doesn't lock up on thoise commands

Grant Limberg 8 gadi atpakaļ
vecāks
revīzija
73f7088b45

+ 100 - 78
windows/WinUI/APIHandler.cs

@@ -8,6 +8,7 @@ using System.IO;
 using System.Windows;
 using Newtonsoft.Json;
 using System.Diagnostics;
+using System.Windows.Threading;
 
 namespace WinUI
 {
@@ -264,104 +265,125 @@ namespace WinUI
             }
         }
 
-        public void JoinNetwork(string nwid, bool allowManaged = true, bool allowGlobal = false, bool allowDefault = false)
+        public void JoinNetwork(Dispatcher d, 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)
-            {
-                return;
-            }
-
-            request.Method = "POST";
-            request.ContentType = "applicaiton/json";
-            request.Timeout = 10000;
-						try
+						Task.Factory.StartNew(() =>
 						{
-								using (var streamWriter = new StreamWriter(((HttpWebRequest)request).GetRequestStream()))
+								var request = WebRequest.Create(url + "/network/" + nwid + "?auth=" + authtoken) as HttpWebRequest;
+								if (request == null)
 								{
-										string json = "{\"allowManaged\":" + (allowManaged ? "true" : "false") + "," +
-												"\"allowGlobal\":" + (allowGlobal ? "true" : "false") + "," +
-												"\"allowDefault\":" + (allowDefault ? "true" : "false") + "}";
-										streamWriter.Write(json);
-										streamWriter.Flush();
-										streamWriter.Close();
+										return;
 								}
-						}
-						catch (System.Net.WebException)
-						{
-								MessageBox.Show("Error Joining Network: Cannot connect to ZeroTier service.");
-								return;
-						}
 
-            try
-            {
-                var httpResponse = (HttpWebResponse)request.GetResponse();
+								request.Method = "POST";
+								request.ContentType = "applicaiton/json";
+								request.Timeout = 30000;
+								try
+								{
+										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();
+										}
+								}
+								catch (System.Net.WebException)
+								{
+										d.BeginInvoke(DispatcherPriority.Normal, new Action(() =>
+										{
+												MessageBox.Show("Error Joining Network: Cannot connect to ZeroTier service.");
+										}));
+										return;
+								}
 
-								if (httpResponse.StatusCode == HttpStatusCode.Unauthorized)
+								try
 								{
-										APIHandler.initHandler(true);
+										var httpResponse = (HttpWebResponse)request.GetResponse();
+
+										if (httpResponse.StatusCode == HttpStatusCode.Unauthorized)
+										{
+												APIHandler.initHandler(true);
+										}
+										else if (httpResponse.StatusCode != HttpStatusCode.OK)
+										{
+												Console.WriteLine("Error sending join network message");
+										}
 								}
-                else if (httpResponse.StatusCode != HttpStatusCode.OK)
-                {
-                    Console.WriteLine("Error sending join network message");
-                }
-            }
-            catch (System.Net.Sockets.SocketException)
-            {
-                MessageBox.Show("Error Joining Network: Cannot connect to ZeroTier service.");
-            }
-            catch (System.Net.WebException e)
-            {
-								HttpWebResponse res = (HttpWebResponse)e.Response;
-								if (res != null && res.StatusCode == HttpStatusCode.Unauthorized)
+								catch (System.Net.Sockets.SocketException)
 								{
-										APIHandler.initHandler(true);
+										d.BeginInvoke(DispatcherPriority.Normal, new Action(() =>
+										{
+												MessageBox.Show("Error Joining Network: Cannot connect to ZeroTier service.");
+										}));
 								}
-								MessageBox.Show("Error Joining Network: Cannot connect to ZeroTier service.");
-            }
+								catch (System.Net.WebException e)
+								{
+										HttpWebResponse res = (HttpWebResponse)e.Response;
+										if (res != null && res.StatusCode == HttpStatusCode.Unauthorized)
+										{
+												APIHandler.initHandler(true);
+										}
+										d.BeginInvoke(DispatcherPriority.Normal, new Action(() =>
+										{
+												MessageBox.Show("Error Joining Network: Cannot connect to ZeroTier service.");
+										}));
+								}
+						});
         }
 
-        public void LeaveNetwork(string nwid)
+        public void LeaveNetwork(Dispatcher d, string nwid)
         {
-            var request = WebRequest.Create(url + "/network/" + nwid + "?auth=" + authtoken) as HttpWebRequest;
-            if (request == null)
-            {
-                return;
-            }
+						Task.Factory.StartNew(() =>
+						{
+								var request = WebRequest.Create(url + "/network/" + nwid + "?auth=" + authtoken) as HttpWebRequest;
+								if (request == null)
+								{
+										return;
+								}
 
-            request.Method = "DELETE";
-            request.Timeout = 10000;
+								request.Method = "DELETE";
+								request.Timeout = 30000;
 
-            try
-            {
-                var httpResponse = (HttpWebResponse)request.GetResponse();
+								try
+								{
+										var httpResponse = (HttpWebResponse)request.GetResponse();
 
-								if (httpResponse.StatusCode == HttpStatusCode.Unauthorized)
+										if (httpResponse.StatusCode == HttpStatusCode.Unauthorized)
+										{
+												APIHandler.initHandler(true);
+										}
+										else if (httpResponse.StatusCode != HttpStatusCode.OK)
+										{
+												Console.WriteLine("Error sending leave network message");
+										}
+								}
+								catch (System.Net.Sockets.SocketException)
 								{
-										APIHandler.initHandler(true);
+										d.BeginInvoke(DispatcherPriority.Normal, new Action(() =>
+										{
+												MessageBox.Show("Error Leaving Network: Cannot connect to ZeroTier service.");
+										}));
 								}
-                else if (httpResponse.StatusCode != HttpStatusCode.OK)
-                {
-                    Console.WriteLine("Error sending leave network message");
-                }
-            }
-            catch (System.Net.Sockets.SocketException)
-            {
-                MessageBox.Show("Error Leaving Network: Cannot connect to ZeroTier service.");
-            }
-            catch (System.Net.WebException e)
-            {
-								HttpWebResponse res = (HttpWebResponse)e.Response;
-								if (res != null && res.StatusCode == HttpStatusCode.Unauthorized)
+								catch (System.Net.WebException e)
 								{
-										APIHandler.initHandler(true);
+										HttpWebResponse res = (HttpWebResponse)e.Response;
+										if (res != null && res.StatusCode == HttpStatusCode.Unauthorized)
+										{
+												APIHandler.initHandler(true);
+										}
+										d.BeginInvoke(DispatcherPriority.Normal, new Action(() =>
+										{
+												MessageBox.Show("Error Leaving Network: Cannot connect to ZeroTier service.");
+										}));
 								}
-								MessageBox.Show("Error Leaving Network: Cannot connect to ZeroTier service.");
-            }
-            catch
-            {
-                Console.WriteLine("Error leaving network: Unknown error");
-            }
+								catch
+								{
+										Console.WriteLine("Error leaving network: Unknown error");
+								}
+						});
         }
 
         public delegate void PeersCallback(List<ZeroTierPeer> peers);

+ 1 - 1
windows/WinUI/JoinNetworkView.xaml.cs

@@ -118,7 +118,7 @@ namespace WinUI
             bool allowGlobal = allowGlobalCheckbox.IsChecked.Value;
             bool allowManaged = allowManagedCheckbox.IsChecked.Value;
 
-            APIHandler.Instance.JoinNetwork(joinNetworkBox.Text, allowManaged, allowGlobal, allowDefault);
+            APIHandler.Instance.JoinNetwork(this.Dispatcher, joinNetworkBox.Text, allowManaged, allowGlobal, allowDefault);
 
             Close();
         }

+ 6 - 6
windows/WinUI/NetworkInfoView.xaml.cs

@@ -106,14 +106,14 @@ namespace WinUI
 
         private void deleteButton_Click(object sender, RoutedEventArgs e)
         {
-            APIHandler.Instance.LeaveNetwork(network.NetworkId);
+            APIHandler.Instance.LeaveNetwork(this.Dispatcher, 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,
+            APIHandler.Instance.JoinNetwork(this.Dispatcher, network.NetworkId,
                 allowManaged.IsChecked ?? false,
                 allowGlobal.IsChecked ?? false,
                 allowDefault.IsChecked ?? false);
@@ -122,7 +122,7 @@ namespace WinUI
         private void AllowGlobal_CheckStateChanged(object sender, RoutedEventArgs e)
         {
             CheckBox cb = sender as CheckBox;
-            APIHandler.Instance.JoinNetwork(network.NetworkId,
+            APIHandler.Instance.JoinNetwork(this.Dispatcher, network.NetworkId,
                 allowManaged.IsChecked ?? false,
                 allowGlobal.IsChecked ?? false,
                 allowDefault.IsChecked ?? false);
@@ -131,7 +131,7 @@ namespace WinUI
         private void AllowDefault_CheckStateChanged(object sender, RoutedEventArgs e)
         {
             CheckBox cb = sender as CheckBox;
-            APIHandler.Instance.JoinNetwork(network.NetworkId,
+            APIHandler.Instance.JoinNetwork(this.Dispatcher, network.NetworkId,
                 allowManaged.IsChecked ?? false,
                 allowGlobal.IsChecked ?? false,
                 allowDefault.IsChecked ?? false);
@@ -155,11 +155,11 @@ namespace WinUI
                 bool managed = allowManaged.IsChecked.Value;
                 bool defRoute = allowDefault.IsChecked.Value;
 
-                APIHandler.Instance.JoinNetwork(networkId.Text, managed, global, defRoute);
+                APIHandler.Instance.JoinNetwork(this.Dispatcher, networkId.Text, managed, global, defRoute);
             }
             else
             {
-                APIHandler.Instance.LeaveNetwork(networkId.Text);
+                APIHandler.Instance.LeaveNetwork(this.Dispatcher, networkId.Text);
             }
         }
     }

+ 2 - 2
windows/WinUI/ToolbarItem.xaml.cs

@@ -269,11 +269,11 @@ namespace WinUI
                     ZeroTierNetwork network = item.DataContext as ZeroTierNetwork;
                     if (item.IsChecked)
                     {
-                        APIHandler.Instance.LeaveNetwork(network.NetworkId);
+                        APIHandler.Instance.LeaveNetwork(this.Dispatcher, network.NetworkId);
                     }
                     else
                     {
-                        APIHandler.Instance.JoinNetwork(network.NetworkId, network.AllowManaged, network.AllowGlobal, network.AllowDefault);
+                        APIHandler.Instance.JoinNetwork(this.Dispatcher, network.NetworkId, network.AllowManaged, network.AllowGlobal, network.AllowDefault);
                     }
                 }   
             }