178 lines
6.2 KiB
C#
178 lines
6.2 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using System.Drawing;
|
|
|
|
namespace EduNetworkBuilder
|
|
{
|
|
public class ActionCollection
|
|
{
|
|
Network StartingState = null;
|
|
public List<NetworkAction> NetActions = new List<NetworkAction>();
|
|
NetworkAction CurrentNetAction = null;
|
|
|
|
public void RegisterNet(Network starting)
|
|
{
|
|
CurrentNetAction = new NetworkAction(starting);
|
|
}
|
|
|
|
public void Add(ActionClass What)
|
|
{
|
|
if(CurrentNetAction == null)
|
|
{
|
|
Network start = NB.GetNetwork();
|
|
if (start == null) return;//Do nothing
|
|
CurrentNetAction = new NetworkAction(start);
|
|
}
|
|
CurrentNetAction.Add(What);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Take the current actionlist and save it to the stored actionlists.
|
|
/// We use this when we have successfully solved a network and want to store
|
|
/// this solution process
|
|
/// </summary>
|
|
public void PushActionToList()
|
|
{
|
|
//remove an old one if it exists
|
|
if (CurrentNetAction != null)
|
|
{
|
|
NetworkAction NA = GetActionlistFromName(CurrentNetAction.NetworkName);
|
|
if (NA != null) NetActions.Remove(NA);
|
|
}
|
|
//Add this one
|
|
NetActions.Add(CurrentNetAction);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Return true if we already have a solved state for this network
|
|
/// </summary>
|
|
/// <param name="starting"></param>
|
|
/// <returns></returns>
|
|
public bool AlreadyHaveNet(Network starting)
|
|
{
|
|
//Look up the network to see if we have it already
|
|
return AlreadyHaveNet(NameFromNet(starting));
|
|
}
|
|
public bool AlreadyHaveNet(string starting)
|
|
{
|
|
NetworkAction NA = GetActionlistFromName(starting);
|
|
if (NA != null) return true; //one exists
|
|
return false;
|
|
}
|
|
public NetworkAction GetActionlistFromNet(Network starting)
|
|
{
|
|
return GetActionlistFromName(NameFromNet(starting));
|
|
}
|
|
public NetworkAction GetActionlistFromName(string starting)
|
|
{
|
|
foreach (NetworkAction NA in NetActions)
|
|
{
|
|
if (NA.NetworkName == starting) return NA;
|
|
}
|
|
return null;
|
|
}
|
|
private string NameFromNet(Network theNet)
|
|
{
|
|
return theNet.PuzzleName;
|
|
}
|
|
}
|
|
|
|
public class NetworkAction
|
|
{
|
|
public string NetworkName = "";
|
|
public List<ActionClass> Actions = new List<ActionClass>();
|
|
public NetworkAction(string Name)
|
|
{
|
|
NetworkName = Name;
|
|
Actions.Clear();
|
|
}
|
|
public NetworkAction(Network Start)
|
|
{
|
|
if (Start == null)
|
|
Start = NB.GetNetwork();
|
|
if (Start != null)
|
|
NetworkName = Start.PuzzleName;
|
|
else
|
|
NetworkName = "Empty";
|
|
Actions.Clear();
|
|
}
|
|
public void Add(ActionClass What)
|
|
{
|
|
Actions.Add(What);
|
|
}
|
|
}
|
|
|
|
public class ActionClass
|
|
{
|
|
public NBAction Action = NBAction.none;
|
|
public int SourceID = -1; //used for basically everything
|
|
public NB_IPAddress Destination; //used for pinging, arp, traceroute
|
|
public HostNicID SourceNIC; //used for links
|
|
public HostNicID DestNic; //Used for links
|
|
public Point Location; //Used when making a new device or moving an old device
|
|
public NetworkComponentType newItemType = NetworkComponentType.none; //Making new device
|
|
public NetworkDevice ChangedDevice = null;
|
|
|
|
public void DoAction()
|
|
{
|
|
Network myNet = NB.GetNetwork();
|
|
NetworkDevice source = myNet.GetDeviceFromID(SourceID);
|
|
NetworkComponent sourceC = myNet.GetComponentFromID(SourceID);
|
|
|
|
switch (Action)
|
|
{
|
|
case NBAction.changedevice:
|
|
break;
|
|
case NBAction.changelocation:
|
|
if (source != null)
|
|
{
|
|
source.ChangeLocation(Location);
|
|
source.UnHide(); //In case it was hidden
|
|
}
|
|
break;
|
|
case NBAction.deletecomponent:
|
|
//Deleting the item is easy, but we also need to delete any links to that item
|
|
List<HostNicID> NicIDs = new List<HostNicID>();
|
|
if (source != null)
|
|
{
|
|
if (myNet.ItemIsCritical(source.hostname))
|
|
return; //we cannot delete this
|
|
NicIDs = source.GetHostNicIDs();
|
|
foreach (HostNicID nicID in NicIDs)
|
|
{
|
|
myNet.RemoveLinksToNic(nicID);
|
|
}
|
|
myNet.RemoveComponent(source);
|
|
} else if(sourceC != null && sourceC is NetworkLink)
|
|
{
|
|
if (myNet.ItemIsCritical(sourceC.hostname))
|
|
return; //We cannot remove this link
|
|
NetworkLink SourceL = (NetworkLink)sourceC;
|
|
SourceL.Destroy(); //Mark both ends as being deleted
|
|
myNet.RemoveComponent(SourceL); //Get rid of this link
|
|
}
|
|
break;
|
|
case NBAction.newdevice:
|
|
break;
|
|
case NBAction.dhcp:
|
|
break;
|
|
case NBAction.arp:
|
|
source.AskArpFromHere(Destination);
|
|
break;
|
|
case NBAction.cleararp:
|
|
source.ClearArps();
|
|
break;
|
|
case NBAction.ping:
|
|
source.PingFromHere(Destination) ;
|
|
break;
|
|
case NBAction.traceroute:
|
|
source.TracerouteFromHere(Destination);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|