diff options
Diffstat (limited to 'contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/MibTree.cs')
-rw-r--r-- | contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/MibTree.cs | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/MibTree.cs b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/MibTree.cs new file mode 100644 index 00000000000..a5174bc19e9 --- /dev/null +++ b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/MibTree.cs @@ -0,0 +1,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); + } + } + } +} |