public EditGroupForm(TreeView treeView, bool rename = false) { InitializeComponent(); this.rename = rename; if (rename) { Text = "Edit Saved Route Group"; button1.Text = "Save"; Config.SavedRouteNode editNode = Global.Config.SavedRoutes.GetSelectedNode(treeView); textBox1.Text = editNode.Name; checkBox1.Checked = ((Config.SavedRouteGroup)editNode).AutoLoadOnStartup; } else { Text = "Create Saved Route Group"; button1.Text = "Create"; } this.treeView = treeView; }
async void UpdateRoutes(CancellationTokenSource cts) { try { while (!cts.IsCancellationRequested) { listView1.BeginUpdate(); List <Iphlpapi.Route> routes = Iphlpapi.GetRoutes(Iphlpapi.FAMILY.AF_UNSPEC); List <Config.SavedRouteItem> savedRoutes = Global.Config.SavedRoutes.GetRoutes(Global.Config.SavedRoutes.Nodes[0]); Config.SavedRouteNode selectedNode = Global.Config.SavedRoutes.GetSelectedNode(treeView1); List <Config.SavedRouteItem> selectedRoutes = Global.Config.SavedRoutes.GetRoutes(selectedNode); // add/update items foreach (Iphlpapi.Route route in routes) { if (route.IPVersion == 4 && comboBox1.SelectedIndex == 1 || route.IPVersion == 6 && comboBox1.SelectedIndex == 0) { continue; } // skip disconnected interfaces if (Global.NetworkInterfaces.Values.Where((i) => i.Index == route.InterfaceIndex).Count() == 0 && route.InterfaceIndex != 1) { continue; } // calculate route metric if (Environment.OSVersion.Version.CompareTo(new Version("6.0")) > -1) { if (route.InterfaceIndex != 1) { route.Metric += Global.NetworkInterfaces.Values.Where((i) => i.Index == route.InterfaceIndex).FirstOrDefault().InterfaceMetric; } else { route.Metric += NetworkInterface.Loopback.InterfaceMetric; } } bool found = false; string ifIndex; if (route.InterfaceIndex == 1) { ifIndex = route.InterfaceIndex.ToString() + " (" + NetworkInterface.Loopback.Name + ")"; } else { ifIndex = route.InterfaceIndex.ToString() + " (" + Global.NetworkInterfaces.Values.Where((i) => i.Index == route.InterfaceIndex).FirstOrDefault().Name + ")"; } // filter routes bool filter = false; if (checkBox1.Checked) { if (selectedRoutes.Find(i => i.Destination == route.Destination && i.Prefix == route.Prefix && i.Gateway == route.Gateway && (Global.NetworkInterfaces.ContainsKey(i.InterfaceGuid) && Global.NetworkInterfaces[i.InterfaceGuid].Index == route.InterfaceIndex || NetworkInterface.Loopback.Guid == i.InterfaceGuid && NetworkInterface.Loopback.Index == route.InterfaceIndex)) == null) { filter = true; } } // TODO: update routes with all matching saved routes using Find() // update existing items foreach (ListViewItem item in listView1.Items) { if (item.SubItems[0].Text == route.Destination && item.SubItems[1].Text == route.Prefix && item.SubItems[2].Text == route.Gateway && item.SubItems[3].Text == ifIndex) { item.SubItems[4].Text = route.Age.ToString(); item.SubItems[5].Text = route.Metric.ToString(); Config.SavedRouteItem savedRoute = savedRoutes.Find(i => i.Destination == route.Destination && i.Prefix == route.Prefix && i.Gateway == route.Gateway && (Global.NetworkInterfaces.ContainsKey(i.InterfaceGuid) && Global.NetworkInterfaces[i.InterfaceGuid].Index == route.InterfaceIndex || NetworkInterface.Loopback.Guid == i.InterfaceGuid && NetworkInterface.Loopback.Index == route.InterfaceIndex)); if (savedRoute != null) { item.SubItems[6].Text = savedRoute.Name; } else { item.SubItems[6].Text = ""; } found = true; break; } } if (found || filter) { continue; } listView1.Items.Add(new ListViewItem(new string[] { route.Destination, route.Prefix, route.Gateway, ifIndex, route.Age.ToString(), route.Metric.ToString(), "" })); } // delete items foreach (ListViewItem item in listView1.Items) { string ifIndex = Regex.Replace(item.SubItems[3].Text, @"^(\d+) .*$", "$1"); // filter routes bool filter = false; if (checkBox1.Checked) { if (selectedRoutes.Find(i => i.Destination == item.SubItems[0].Text && i.Prefix == item.SubItems[1].Text && i.Gateway == item.SubItems[2].Text && (Global.NetworkInterfaces.ContainsKey(i.InterfaceGuid) && Global.NetworkInterfaces[i.InterfaceGuid].Index.ToString() == ifIndex || NetworkInterface.Loopback.Guid == i.InterfaceGuid && NetworkInterface.Loopback.Index.ToString() == ifIndex)) == null) { filter = true; } } if (routes.Find((i) => i.Destination == item.SubItems[0].Text && i.Prefix == item.SubItems[1].Text && i.Gateway == item.SubItems[2].Text && i.InterfaceIndex.ToString() == ifIndex) == null || item.SubItems[0].Text.Contains(':') && comboBox1.SelectedIndex == 0 || !item.SubItems[0].Text.Contains(':') && comboBox1.SelectedIndex == 1 || filter) { item.Remove(); } } foreach (ColumnHeader column in listView1.Columns) { column.Width = -2; } listView1.EndUpdate(); await TaskEx.Delay(1000); } } catch { } }
public LoadForm(TreeView treeView) { InitializeComponent(); this.treeView = treeView; // resize Size minimumSize = ClientSize; Rectangle screenRectangle = RectangleToScreen(ClientRectangle); int titleBarHeight = screenRectangle.Top - Top; int borderThickness = screenRectangle.Left - Left; Rectangle workingArea = Screen.GetWorkingArea(this); Size clientSize = new Size(); if (minimumSize.Width > workingArea.Width - 2 * borderThickness) { clientSize.Width = workingArea.Width - 2 * borderThickness; } else { clientSize.Width = minimumSize.Width; } if (minimumSize.Height > workingArea.Height - titleBarHeight - borderThickness) { clientSize.Height = workingArea.Height - titleBarHeight - borderThickness; } else { clientSize.Height = minimumSize.Height; } AutoScrollMinSize = new System.Drawing.Size(minimumSize.Width, minimumSize.Height); ClientSize = new Size(clientSize.Width, clientSize.Height); // load routes IPAddress ipAddress = new IPAddress(0); Config.SavedRouteNode loadNode = Global.Config.SavedRoutes.GetSelectedNode(treeView); loadRoutes = Global.Config.SavedRoutes.GetRoutes(loadNode); activeRoutes = Iphlpapi.GetRoutes(Iphlpapi.FAMILY.AF_UNSPEC); foreach (Config.SavedRouteItem item in loadRoutes) { string interfaceIndex = "Not connected"; int ifIndex = 0; string status = "Not loaded"; if (ValidateRoute(ref item.Destination, ref item.Prefix, ref item.Gateway, item.IPVersion)) { if (Global.NetworkInterfaces.ContainsKey(item.InterfaceGuid) && (item.IPVersion == 4 && Global.NetworkInterfaces[item.InterfaceGuid].IPv4Enabled || item.IPVersion == 6 && Global.NetworkInterfaces[item.InterfaceGuid].IPv6Enabled)) { interfaceIndex = Global.NetworkInterfaces[item.InterfaceGuid].Index.ToString() + " (" + Global.NetworkInterfaces[item.InterfaceGuid].Name + " - "; ifIndex = Global.NetworkInterfaces[item.InterfaceGuid].Index; if (item.IPVersion == 4) { loadIPv4++; if (Global.NetworkInterfaces[item.InterfaceGuid].IPv4Address.Count > 0) { interfaceIndex += Global.NetworkInterfaces[item.InterfaceGuid].IPv4Address[0].Address; } else { interfaceIndex += "0.0.0.0"; } } else { loadIPv6++; if (Global.NetworkInterfaces[item.InterfaceGuid].IPv6Address.All.Count > 0) { interfaceIndex += Global.NetworkInterfaces[item.InterfaceGuid].IPv6Address.All[0].Address; } else { interfaceIndex += "::"; } } interfaceIndex += ")"; } else if (NetworkInterface.Loopback.Guid == item.InterfaceGuid && Environment.OSVersion.Version.CompareTo(new Version("6.0")) > -1 && (item.IPVersion == 4 && NetworkInterface.Loopback.IPv4Enabled || item.IPVersion == 6 && NetworkInterface.Loopback.IPv6Enabled)) { interfaceIndex = "1 (" + NetworkInterface.Loopback.Name + " - "; ifIndex = 1; if (item.IPVersion == 4) { loadIPv4++; interfaceIndex += "127.0.0.1)"; } else { loadIPv6++; interfaceIndex += "::1)"; } } else { if (item.IPVersion == 4) { loadIPv4++; NotConnectedIPv4Interfaces++; } else { loadIPv6++; NotConnectedIPv6Interfaces++; } } if (activeRoutes.Find(i => i.IPVersion == item.IPVersion && IPAddress.Parse(i.Destination).Equals(IPAddress.Parse(item.Destination)) && (i.IPVersion == 4 ? IPAddress.Parse(i.Prefix).Equals(IPAddress.Parse(item.Prefix)) : int.Parse(i.Prefix) == int.Parse(item.Prefix)) && IPAddress.Parse(i.Gateway).Equals(IPAddress.Parse(item.Gateway)) && i.InterfaceIndex == ifIndex) != null) { status = "Active"; } else if (activeRoutes.Find(i => i.IPVersion == item.IPVersion && IPAddress.Parse(i.Destination).Equals(IPAddress.Parse(item.Destination)) && (i.IPVersion == 4 ? IPAddress.Parse(i.Prefix).Equals(IPAddress.Parse(item.Prefix)) : int.Parse(i.Prefix) == int.Parse(item.Prefix)) && IPAddress.Parse(i.Gateway).Equals(IPAddress.Parse(item.Gateway))) != null) { status = "Active on a different interface"; if (item.IPVersion == 4) { NotActiveIPv4Routes++; } else { NotActiveIPv6Routes++; } } else if (activeRoutes.Find(i => i.IPVersion == item.IPVersion && IPAddress.Parse(i.Destination).Equals(IPAddress.Parse(item.Destination)) && (i.IPVersion == 4 ? IPAddress.Parse(i.Prefix).Equals(IPAddress.Parse(item.Prefix)) : int.Parse(i.Prefix) == int.Parse(item.Prefix)) ) != null) { status = "Active with a different gateway"; if (item.IPVersion == 4) { NotActiveIPv4Routes++; } else { NotActiveIPv6Routes++; } } else { if (item.IPVersion == 4) { NotActiveIPv4Routes++; } else { NotActiveIPv6Routes++; } } } else { if (item.IPVersion == 4) { loadIPv4++; NotActiveIPv4Routes++; NotConnectedIPv4Interfaces++; } else { loadIPv6++; NotActiveIPv6Routes++; NotConnectedIPv6Interfaces++; } } ListViewItem lvItem = new ListViewItem(new string[] { item.Destination, item.Prefix, item.Gateway, interfaceIndex, item.Metric.ToString(), item.Name, status }); lvItem.Tag = item; listView1.Items.Add(lvItem).Checked = true; } foreach (ColumnHeader column in listView1.Columns) { column.Width = -2; } // load configs defaultInterfaceMode.SelectedIndex = 0; defaultIPv4GatewayMode.SelectedIndex = 3; defaultIPv6GatewayMode.SelectedIndex = 3; foreach (NetworkInterface nic in Global.NetworkInterfaces.Values) { if (nic.IPv4Enabled) { defaultIPv4Interface.Items.Add(nic.Index.ToString() + " (" + nic.Name + " - " + (nic.IPv4Address.Count > 0 ? nic.IPv4Address.FirstOrDefault().Address : "0.0.0.0")); } } if (Environment.OSVersion.Version.CompareTo(new Version("6.0")) > -1) { if (NetworkInterface.Loopback.IPv4Enabled) { defaultIPv4Interface.Items.Add("1 (" + NetworkInterface.Loopback.Name + " - 127.0.0.1)"); } } foreach (NetworkInterface nic in Global.NetworkInterfaces.Values) { if (nic.IPv6Enabled) { defaultIPv6Interface.Items.Add(nic.Index.ToString() + " (" + nic.Name + " - " + (nic.IPv6Address.All.Count > 0 ? nic.IPv6Address.All.FirstOrDefault().Address : "0.0.0.0")); } } if (Environment.OSVersion.Version.CompareTo(new Version("6.0")) > -1) { if (NetworkInterface.Loopback.IPv6Enabled) { defaultIPv6Interface.Items.Add("1 (" + NetworkInterface.Loopback.Name + " - ::1)"); } } }