• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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