private void AddRelayTreeNode(
TreeNodeCollection tree_nodes,
IEnumerable<HostTreeNode> nodes,
HashSet<Guid> added)
{
foreach (var node in nodes) {
if (added.Contains(node.Host.SessionID)) continue;
added.Add(node.Host.SessionID);
var endpoint = (node.Host.GlobalEndPoint!=null && node.Host.GlobalEndPoint.Port!=0) ? node.Host.GlobalEndPoint : node.Host.LocalEndPoint;
string version = "";
var pcp = node.Host.Extra.GetHostVersion();
if (pcp.HasValue) {
version += pcp.Value.ToString();
}
var vp = node.Host.Extra.GetHostVersionVP();
if (vp.HasValue) {
version += " VP" + vp.Value.ToString();
}
var ex = node.Host.Extra.GetHostVersionEXPrefix();
var exnum = node.Host.Extra.GetHostVersionEXNumber();
if (ex!=null && exnum.HasValue) {
try {
version += " " + System.Text.Encoding.UTF8.GetString(ex) + exnum.ToString();
}
catch (ArgumentException) {
//ignore
}
}
var nodeinfo = String.Format(
"{0} ({1}/{2}) {3}{4}{5} {6}",
endpoint,
node.Host.DirectCount,
node.Host.RelayCount,
node.Host.IsFirewalled ? "0" : "",
node.Host.IsRelayFull ? "-" : "",
node.Host.IsReceiving ? "" : "B",
version);
var tree_node = tree_nodes.Add(nodeinfo);
AddRelayTreeNode(tree_node.Nodes, node.Children, added);
}
}