347 lines
7.1 KiB
C#
Executable File
347 lines
7.1 KiB
C#
Executable File
using System;
|
|
using System.Collections.Generic;
|
|
using System.Text;
|
|
using System.Net;
|
|
using System.Net.Sockets;
|
|
using System.Net.NetworkInformation;
|
|
using System.Drawing;
|
|
using System.Xml;
|
|
using System.Xml.Schema;
|
|
using System.IO;
|
|
|
|
namespace WoL_Manager
|
|
{
|
|
class Host
|
|
{
|
|
private string name;
|
|
private IPAddress ip;
|
|
private string mac_address;
|
|
private IPAddress broadcast;
|
|
private string description;
|
|
private int status;
|
|
private PingThread ping;
|
|
private PingReply lastPingReply;
|
|
private System.DateTime wakeTime;
|
|
|
|
private static MainWindow parent = null;
|
|
private static Icon[] iconList = null;
|
|
private static List<Host> hostList = new List<Host>();
|
|
|
|
private Host(string name, IPAddress ip, string mac,
|
|
IPAddress broadcast, string description)
|
|
{
|
|
this.name = name;
|
|
this.ip = ip;
|
|
this.mac_address = mac;
|
|
this.broadcast = broadcast;
|
|
this.description = description;
|
|
status = 0;
|
|
ping = null;
|
|
lastPingReply = null;
|
|
wakeTime = DateTime.Now;
|
|
}
|
|
|
|
~Host()
|
|
{
|
|
if (ping != null)
|
|
{
|
|
ping.stopThread();
|
|
}
|
|
}
|
|
|
|
public static void clearList()
|
|
{
|
|
hostList.Clear();
|
|
}
|
|
|
|
public Icon getStatusIcon()
|
|
{
|
|
if (iconList != null && iconList.Length > status)
|
|
{
|
|
return iconList[status];
|
|
}
|
|
else
|
|
{
|
|
return null;
|
|
}
|
|
}
|
|
|
|
public static MainWindow Parent
|
|
{
|
|
set
|
|
{
|
|
parent = value;
|
|
}
|
|
get
|
|
{
|
|
return parent;
|
|
}
|
|
}
|
|
|
|
public static Icon[] IconList
|
|
{
|
|
set
|
|
{
|
|
iconList = value;
|
|
}
|
|
get
|
|
{
|
|
return iconList;
|
|
}
|
|
}
|
|
|
|
public PingThread pingThread
|
|
{
|
|
set
|
|
{
|
|
ping = value;
|
|
}
|
|
get
|
|
{
|
|
return ping;
|
|
}
|
|
}
|
|
|
|
public string getStatusString()
|
|
{
|
|
switch (status)
|
|
{
|
|
case 0:
|
|
return "Unknown Status";
|
|
case 1:
|
|
return string.Format("Host online ({0} ms)",lastPingReply.RoundtripTime);
|
|
case 2:
|
|
return string.Format("Host not reachable ({0})", lastPingReply.Status);
|
|
case 3:
|
|
TimeSpan temp = (TimeSpan)(DateTime.Now - wakeTime);
|
|
return string.Format("Waking Host (waiting for {0} m {1} s)", temp.Minutes, temp.Seconds);
|
|
default:
|
|
return "???";
|
|
}
|
|
}
|
|
|
|
public PingReply LastPingResult
|
|
{
|
|
get
|
|
{
|
|
return lastPingReply;
|
|
}
|
|
set
|
|
{
|
|
lastPingReply = value;
|
|
if (value.Status == IPStatus.Success)
|
|
{
|
|
status = 1;
|
|
}
|
|
else if (status == 3)
|
|
{
|
|
double temp = ((TimeSpan)(DateTime.Now - wakeTime)).TotalSeconds;
|
|
if (temp > ManagerSettings.WakeWaitTime)
|
|
{
|
|
status = 2;
|
|
}
|
|
}
|
|
else if (status != 3)
|
|
{
|
|
status = 2;
|
|
}
|
|
parent.updateDataView();
|
|
}
|
|
}
|
|
|
|
public bool wakeHost()
|
|
{
|
|
bool temp = Magic_Packet.sendPacket(this);
|
|
if (temp)
|
|
{
|
|
status = 3;
|
|
wakeTime = System.DateTime.Now;
|
|
}
|
|
return temp;
|
|
}
|
|
|
|
private static void validationEventHandler(object sender, ValidationEventArgs args)
|
|
{
|
|
valitationResult = false;
|
|
}
|
|
|
|
private static bool valitationResult = true;
|
|
|
|
|
|
public static bool readFromFile(string file)
|
|
{
|
|
XmlReaderSettings settings = new XmlReaderSettings();
|
|
settings.IgnoreWhitespace = true;
|
|
settings.IgnoreComments = true;
|
|
settings.IgnoreProcessingInstructions = true;
|
|
settings.ProhibitDtd = false;
|
|
settings.ValidationType = ValidationType.DTD;
|
|
settings.ValidationEventHandler += new ValidationEventHandler(validationEventHandler);
|
|
XmlReader reader = XmlReader.Create(file, settings);
|
|
while (reader.Read())
|
|
{
|
|
if (reader.NodeType == XmlNodeType.Element && reader.LocalName.CompareTo("host") == 0)
|
|
{
|
|
string name;
|
|
string ip;
|
|
string bc;
|
|
string mac;
|
|
string desc;
|
|
System.Net.IPAddress ip_adr;
|
|
System.Net.IPAddress bc_adr;
|
|
reader.Read();
|
|
name = reader.ReadString();
|
|
reader.Read();
|
|
ip = reader.ReadString();
|
|
reader.Read();
|
|
bc = reader.ReadString();
|
|
reader.Read();
|
|
mac = reader.ReadString();
|
|
if (!MainWindow.checkMAC(mac))
|
|
{
|
|
reader.Close();
|
|
return false;
|
|
}
|
|
reader.Read();
|
|
desc = reader.ReadString();
|
|
try
|
|
{
|
|
ip_adr = System.Net.IPAddress.Parse(ip);
|
|
bc_adr = System.Net.IPAddress.Parse(bc);
|
|
}
|
|
catch (Exception)
|
|
{
|
|
reader.Close();
|
|
return false;
|
|
}
|
|
if (valitationResult == false)
|
|
{
|
|
reader.Close();
|
|
return false;
|
|
}
|
|
Host.createHost(name, ip_adr, mac, bc_adr, desc);
|
|
}
|
|
}
|
|
reader.Close();
|
|
return true;
|
|
}
|
|
|
|
public static void createDTD(string file)
|
|
{
|
|
string temp = "<?xml version='1.0' encoding='utf-8'?>\n\n<!ELEMENT hostlist (host*)>\n<!ELEMENT host (name, ip_address, broadcast, mac_address, description)>\n<!ELEMENT name (#PCDATA)>\n<!ELEMENT ip_address (#PCDATA)>\n<!ELEMENT broadcast (#PCDATA)>\n<!ELEMENT mac_address (#PCDATA)>\n<!ELEMENT description (#PCDATA)>";
|
|
File.WriteAllText(file, temp);
|
|
}
|
|
|
|
public static void writeToFile(string file)
|
|
{
|
|
Host[] hostList = Host.getHostList();
|
|
string temp = "<?xml version='1.0' encoding='utf-8'?>\n<!DOCTYPE hostlist SYSTEM 'hosts.dtd'>\n\n<hostlist>";
|
|
if (hostList != null && hostList.Length > 0)
|
|
{
|
|
for (int t = 0; t < hostList.Length; t++)
|
|
{
|
|
temp = String.Concat(temp, "\n<host>\n<name>", hostList[t].Name, "</name>");
|
|
temp = String.Concat(temp, "\n<ip_address>", hostList[t].IP.ToString(), "</ip_address>");
|
|
temp = String.Concat(temp, "\n<broadcast>", hostList[t].Broadcast.ToString(), "</broadcast>");
|
|
temp = String.Concat(temp, "\n<mac_address>", hostList[t].MAC, "</mac_address>");
|
|
temp = String.Concat(temp, "\n<description>", hostList[t].Description, "</description>\n</host>");
|
|
}
|
|
}
|
|
temp = String.Concat(temp,"\n</hostlist>");
|
|
File.WriteAllText(file,temp);
|
|
}
|
|
|
|
|
|
public int Status
|
|
{
|
|
get
|
|
{
|
|
return status;
|
|
}
|
|
set
|
|
{
|
|
status = value;
|
|
}
|
|
}
|
|
|
|
public string Name
|
|
{
|
|
get
|
|
{
|
|
return name;
|
|
}
|
|
set
|
|
{
|
|
name = value;
|
|
}
|
|
}
|
|
|
|
public IPAddress IP
|
|
{
|
|
get
|
|
{
|
|
return ip;
|
|
}
|
|
set
|
|
{
|
|
ip = value;
|
|
}
|
|
}
|
|
|
|
public string MAC
|
|
{
|
|
get
|
|
{
|
|
return mac_address;
|
|
}
|
|
set
|
|
{
|
|
mac_address = value;
|
|
}
|
|
}
|
|
|
|
public IPAddress Broadcast
|
|
{
|
|
get
|
|
{
|
|
return broadcast;
|
|
}
|
|
set
|
|
{
|
|
broadcast = value;
|
|
}
|
|
}
|
|
|
|
public string Description
|
|
{
|
|
get
|
|
{
|
|
return description;
|
|
}
|
|
set
|
|
{
|
|
description = value;
|
|
}
|
|
}
|
|
|
|
public static Host createHost(string name, IPAddress ip, string mac,
|
|
IPAddress broadcast, string description)
|
|
{
|
|
Host temp = new Host(name, ip, mac, broadcast, description);
|
|
hostList.Add(temp);
|
|
return temp;
|
|
}
|
|
|
|
public static bool deleteHost(Host host)
|
|
{
|
|
host.pingThread.stopThread();
|
|
return hostList.Remove(host);
|
|
}
|
|
|
|
public static Host[] getHostList()
|
|
{
|
|
return hostList.ToArray();
|
|
}
|
|
}
|
|
}
|