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