1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
|
using System.Collections.Generic;
using Lextm.SharpSnmpLib.Mib.Elements.Entities;
namespace Lextm.SharpSnmpLib.Mib
{
/// <summary>
/// Builds up a tree from a single MIB
/// </summary>
public class MibTree
{
private readonly List<MibTreeNode> _root = new List<MibTreeNode>();
public MibTree(MibModule module)
{
IList<IEntity> entities = module.Entities;
if (entities.Count > 0)
{
// try to find module identity as root
foreach (IEntity element in entities)
{
ModuleIdentity mi = element as ModuleIdentity;
if (mi != null)
{
_root.Add(new MibTreeNode(null, mi));
}
}
// find OID assignments as root, if there are any that are not below ModuleIdentity
foreach (IEntity element in entities)
{
OidValueAssignment oa = element as OidValueAssignment;
if (oa != null)
{
_root.Add(new MibTreeNode(null, oa));
}
}
FilterRealRoots (entities);
foreach (MibTreeNode mibTreeNode in _root)
{
entities.Remove (mibTreeNode.Entity);
}
if (_root.Count == 0)
{
//no module identity, assume first entity is root
_root.Add(new MibTreeNode(null, entities[0]));
}
foreach (MibTreeNode mibTreeNode in _root)
{
if (entities.Contains (mibTreeNode.Entity))
{
entities.Remove (mibTreeNode.Entity);
}
BuildTree(mibTreeNode, entities);
UpdateTreeNodeTypes(mibTreeNode);
}
}
}
public IList<MibTreeNode> Root
{
get { return _root; }
}
private bool EntityExists(IList<IEntity> entities, string name)
{
foreach(IEntity entity in entities)
{
if (entity.Name == name)
{
return true;
}
}
return false;
}
private void FilterRealRoots(IList<IEntity> entities)
{
int i = 0;
while (i < _root.Count)
{
if (EntityExists(entities, _root[i].Entity.Parent))
{
_root.RemoveAt(i);
}
else
{
i++;
}
}
}
private void BuildTree(MibTreeNode node, IList<IEntity> entities)
{
int i = 0;
while (i < entities.Count)
{
if (entities[i].Parent == node.Entity.Name)
{
node.AddChild(entities[i]);
entities.RemoveAt(i);
}
else
{
i++;
}
}
foreach (MibTreeNode childNode in node.ChildNodes)
{
BuildTree(childNode, entities);
}
}
private void UpdateTreeNodeTypes(MibTreeNode node)
{
node.UpdateNodeType();
foreach (MibTreeNode childNode in node.ChildNodes)
{
UpdateTreeNodeTypes(childNode);
}
}
}
}
|