using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; using System.Windows.Forms; using System.Globalization; using System.Resources; namespace EduNetworkBuilder { public partial class LinkEditor : Form { NetworkDevice Source=null; NetworkDevice Dest=null; bool processing = false; NetworkLink EditingLink = null; List UsedLinks = new List(); public LinkEditor(NetworkDevice Src, NetworkDevice Dst) { Network Net = NB.GetNetwork(); InitializeComponent(); LanguagifyComponents(); Source = Src; if (Source != Dst) { Dest = Dst; } UsedLinks.AddRange(Net.UnavailableNics()); UpdateDeviceList(); //The first time, we change the selections to the source and dest, if we had drug a line int tindex; if(Source != null) { tindex = lbSrcHost.Items.IndexOf(Source.hostname); if (tindex >= 0) { lbSrcHost.SelectedIndex = tindex; UpdateDeviceList(); } pbSource.Image = new Bitmap(Source.GetImage()); } if (Dest != null) { tindex = lbDstHost.Items.IndexOf(Dest.hostname); if (tindex >= 0) { lbDstHost.SelectedIndex = tindex; UpdateDeviceList(); } pbDest.Image = new Bitmap(Dest.GetImage()); } } public LinkEditor(NetworkLink FromWhat) { InitializeComponent(); LanguagifyComponents(); EditingLink = FromWhat; UpdateFormFromLink(); //read in all the previous values. } private void LanguagifyComponents() { Text = NB.Translate("LE_btnLink"); Text = NB.Translate("_Cancel"); Text = NB.Translate("LE_Form"); } private void UpdateDeviceList() { processing = true; Network myNet = NB.GetNetwork(); NicType srcNicType = NicType.none; string SrcHost=""; if (lbSrcHost.SelectedItem != null) SrcHost = lbSrcHost.SelectedItem.ToString(); string DstHost=""; if (lbDstHost.SelectedItem != null) DstHost = lbDstHost.SelectedItem.ToString(); string SrcNic = ""; NetworkDevice Src = null; if (lbSrcNic.SelectedItem != null) { Src = myNet.DeviceFromName(lbSrcHost.SelectedItem.ToString()); SrcNic = lbSrcNic.SelectedItem.ToString(); int sNicIndex = lbSrcNic.SelectedIndex; NetworkCard sNic = null; if(Src != null) sNic = Src.NicFromName(lbSrcNic.SelectedItem.ToString()); if(sNic != null) srcNicType = sNic.GetNicType; } string DstNic = ""; if (lbDstNic.SelectedItem != null) DstNic = lbDstNic.SelectedItem.ToString(); string theLinkType = LinkType.normal.ToString(); if (cbLinkType.SelectedItem != null) theLinkType = cbLinkType.SelectedItem.ToString(); int ChosenSrcHost = lbSrcHost.SelectedIndex; int ChosenDstHost = lbDstHost.SelectedIndex; int tint; lbSrcHost.Items.Clear(); myNet.SortNetComponents(); //just so we have them in order List srcHostnames = myNet.GetHostnames(); List dstHostnames = myNet.GetHostnames(); foreach(string tString in srcHostnames) { lbSrcHost.Items.Add(tString); } if (ChosenSrcHost >= 0) { ChosenSrcHost = lbSrcHost.Items.IndexOf(SrcHost); lbSrcHost.SelectedIndex = ChosenSrcHost; } lbSrcNic.Items.Clear(); //List the Nics of the selected host if (lbSrcHost.SelectedIndex >= 0) { List srcNics = myNet.NetworkCardForHostList(lbSrcHost.SelectedItem.ToString(),true,true); foreach (string tString in srcNics) { lbSrcNic.Items.Add(tString); } } if (EditingLink != null) lbSrcNic.Items.Add(EditingLink.Src.NicName); lbDstHost.Items.Clear(); foreach (string tString in dstHostnames) { lbDstHost.Items.Add(tString); } if (ChosenDstHost >= 0) { ChosenDstHost = lbDstHost.Items.IndexOf(DstHost); if(ChosenDstHost >= 0) lbDstHost.SelectedIndex = ChosenDstHost; } //We cannot link to ourselves. Remove the source from the dest list if (lbSrcHost.SelectedIndex >= 0) { int delindex = lbDstHost.Items.IndexOf(lbSrcHost.SelectedItem.ToString()); if (delindex >= 0) lbDstHost.Items.RemoveAt(delindex); } //remove the dst nic lst lbDstNic.Items.Clear(); if (lbDstHost.SelectedIndex >= 0) { List dstNics = myNet.NetworkCardForHostList(lbDstHost.SelectedItem.ToString(), true, true, srcNicType); foreach (string tString in dstNics) { lbDstNic.Items.Add(tString); } } if (EditingLink != null) lbDstNic.Items.Add(EditingLink.Dst.NicName); if (SrcNic != "") { tint = lbSrcNic.Items.IndexOf(SrcNic); if (tint != -1) lbSrcNic.SelectedIndex = tint; } if (DstNic != "") { tint = lbDstNic.Items.IndexOf(DstNic); if (tint != -1) lbDstNic.SelectedIndex = tint; } if (lbSrcHost.SelectedItem != null) { Src = myNet.DeviceFromName(lbSrcHost.SelectedItem.ToString()); pbSource.Image = Src.GetImage(); pbSource.Invalidate(); } else { pbSource.Image = null; pbSource.Invalidate(); } if (lbDstHost.SelectedItem != null) { NetworkDevice Dest = myNet.DeviceFromName(lbDstHost.SelectedItem.ToString()); if (Dest != null) { pbDest.Image = Dest.GetImage(); pbDest.Invalidate(); } } else { pbDest.Image = null; pbDest.Invalidate(); } if (lbDstNic.SelectedIndex > -1 && lbSrcNic.SelectedIndex > -1) { btnLink.Enabled = true; } else { btnLink.Enabled = false; } if (Regex.IsMatch(SrcNic, "^wport") || Regex.IsMatch(SrcNic, "^wlan")) { //It is a wireless nic. cbLinkType.Items.Clear(); cbLinkType.Items.Add(LinkType.wireless.ToString()); cbLinkType.Enabled = false; } else { cbLinkType.Items.Clear(); cbLinkType.Items.Add(LinkType.normal.ToString()); cbLinkType.Items.Add(LinkType.broken.ToString()); cbLinkType.Enabled = true; } if (cbLinkType.Items.Contains(theLinkType)) cbLinkType.SelectedItem = theLinkType; else cbLinkType.SelectedIndex = 0; //Update the instructions. lblInstructions.Text = ""; //empty them out if we do not need instructions lbSrcHost.ResetForeColor() ; lbSrcNic.ResetForeColor(); lbDstHost.ResetForeColor(); lbDstNic.ResetForeColor(); btnLink.ForeColor = Color.Black; if (lbSrcHost.SelectedItem == null) { lblInstructions.Text = "Choose the source device."; lbSrcHost.ForeColor = Color.Red; } else if (lbSrcNic.SelectedItem == null) { lblInstructions.Text = "Choose the NIC / Port on the source device."; lbSrcNic.ForeColor = Color.Red; } else if (lbDstHost.SelectedItem == null) { lblInstructions.Text = "Choose the destination device."; lbDstHost.ForeColor = Color.Red; } else if (lbDstNic.SelectedItem == null) { lblInstructions.Text = "Choose the NIC / Port on the destination device."; lbDstNic.ForeColor = Color.Red; } else { //We have a valid link. We are ready to press the link. lblInstructions.Text = "This is a valid link. Press LINK to continue"; btnLink.ForeColor = Color.Red; } processing = false; } private NetworkLink NewLinkFromSettings() { Network Net = NB.GetNetwork(); NetworkDevice Src = Net.DeviceFromName(lbSrcHost.SelectedItem.ToString()); int sNicIndex = lbSrcNic.SelectedIndex; NetworkCard sNic = Src.NicFromName(lbSrcNic.SelectedItem.ToString()); NetworkDevice Dst = Net.DeviceFromName(lbDstHost.SelectedItem.ToString()); int dNicIndex = lbDstNic.SelectedIndex; NetworkCard dNic = Dst.NicFromName(lbDstNic.SelectedItem.ToString()); LinkType LT = NB.ParseEnum(cbLinkType.SelectedItem.ToString()); if (sNic.GetNicType == NicType.wport || sNic.GetNicType == NicType.wlan) LT = LinkType.wireless; //We cannot have broken wireless links the same way. NetworkLink newLink = new NetworkLink(sNic.myID, dNic.myID, LT); return newLink; } private void btnLink_Click(object sender, EventArgs e) { Network Net = NB.GetNetwork(); if(EditingLink != null) { Net.RemoveComponent(EditingLink); //get rid of the old one and put the new one in } NetworkLink newLink = NewLinkFromSettings(); //Net.AddItem(newLink); int OldLinkID = -1; if (EditingLink != null) OldLinkID = EditingLink.GetUniqueIdentifier; NB.DoActionChangeComponent(OldLinkID,newLink); if (EditingLink != null) { EditingLink = null; } Close(); } private void lbSrcHost_SelectedIndexChanged(object sender, EventArgs e) { if(!processing) UpdateDeviceList(); } private void lbDstHost_SelectedIndexChanged(object sender, EventArgs e) { if (!processing) UpdateDeviceList(); } private void lbSrcNic_SelectedIndexChanged(object sender, EventArgs e) { if (!processing) UpdateDeviceList(); } private void lbDstNic_SelectedIndexChanged(object sender, EventArgs e) { if (!processing) UpdateDeviceList(); } private void btnCancel_Click(object sender, EventArgs e) { Close(); } private void UpdateFormFromLink() { Network Net = NB.GetNetwork(); NetworkDevice Src = Net.GetDeviceFromID(EditingLink.Src.HostID); NetworkCard sNic = Src.NicFromID(EditingLink.Src.NicID); NetworkDevice Dst = Net.GetDeviceFromID(EditingLink.Dst.HostID); NetworkCard dNic = Dst.NicFromID(EditingLink.Dst.NicID); LinkType LT = EditingLink.theLinkType; lbSrcNic.Items.Clear(); //List the Nics of the selected host List srcNics = Net.NetworkCardForHostList(Src.hostname, false, true); foreach (string tString in srcNics) { lbSrcNic.Items.Add(tString); } lbDstNic.Items.Clear(); List dstNics = Net.NetworkCardForHostList(Dst.hostname, false, true, sNic.GetNicType); foreach (string tString in dstNics) { lbDstNic.Items.Add(tString); } UpdateDeviceList(); lbSrcHost.SelectedItem = Src.hostname; lbSrcNic.SelectedItem = sNic.NicName(); lbDstHost.SelectedItem = Dst.hostname; lbDstNic.SelectedItem = dNic.NicName(); cbLinkType.SelectedItem = LT.ToString(); UpdateDeviceList(); } private void LinkEditor_Shown(object sender, EventArgs e) { BuilderWindow BW = NB.GetBuilderWin(); if (BW != null) { Point tLocation = new Point(BW.Location.X + ((BW.Width - Width) / 2), BW.Location.Y + ((BW.Height - Height) / 2)); Location = tLocation; } } } }