2 using System.Collections.Generic;
3 using System.Text.RegularExpressions;
8 namespace Lextm.SharpSnmpLib.Mib
10 public static class MibTypesResolver
12 private static readonly Regex _namedOidPathRegex =
new Regex(
@"^(?<Name>[^\(]+)\((?<Value>\d+)\)$");
13 private static readonly List<IMibResolver> _resolver =
new List<IMibResolver>();
14 private static readonly List<IModule> _cachedModules =
new List<IModule>();
16 public static void RegisterResolver(IMibResolver resolver)
20 _resolver.Add(resolver);
24 public static IModule ResolveModule(
string moduleName)
27 foreach (MibModule cachedModule
in _cachedModules)
29 if (cachedModule.Name == moduleName)
35 foreach (IMibResolver resolver
in _resolver)
37 IModule resolvedModule = resolver.Resolve(moduleName);
38 if (resolvedModule != null)
40 ResolveTypes(resolvedModule);
41 _cachedModules.Add(resolvedModule);
42 return resolvedModule;
49 public static void ResolveTypes(IModule module)
51 foreach (
IEntity entity
in module.Entities)
55 if (typeReferringEntity != null)
57 CheckTypeReferrer(module, typeReferringEntity);
61 if (!_cachedModules.Contains(module))
63 _cachedModules.Add(module);
67 private static void CheckTypeReferrer(IModule module, ITypeReferrer typeReferringEntity)
70 if (unknownType != null)
72 typeReferringEntity.
ReferredType = ResolveType(module, unknownType);
76 Console.WriteLine(String.Format(
"Could not resolve type '{0}' declared in module '{1}'", (typeReferringEntity.
ReferredType as TypeAssignment).Type, typeReferringEntity.
ReferredType.
Module.
Name));
80 ITypeReferrer nextTypeReferringEntity = typeReferringEntity.
ReferredType as ITypeReferrer;
81 if (nextTypeReferringEntity != null)
83 CheckTypeReferrer(module, nextTypeReferringEntity);
87 public static ITypeAssignment ResolveType(IModule module, TypeAssignment type)
91 return (result != null) ? result : type;
94 public static
IDeclaration ResolveDeclaration(IModule module,
string name)
96 if ((module == null) || String.IsNullOrEmpty(name))
104 if (decl.
Name == name)
111 if (module.Imports != null)
113 ImportsFrom imports = module.Imports.GetImportFromType(name);
116 IModule importedModule = ResolveModule(imports.
Module);
117 if (importedModule != null)
119 return ResolveDeclaration(importedModule, name);
133 ResolveOid(entity, result);
139 private static void ResolveOid(
IEntity entity, ObjectIdentifier result)
141 result.Prepend(entity.
Name, entity.
Value);
144 if (!String.IsNullOrEmpty(entity.
Parent))
146 string[] pathParts = entity.
Parent.Split(
'.');
150 if (pathParts.Length > 1)
152 for (
int i=pathParts.Length-1; i>=1; i--)
154 if (uint.TryParse(pathParts[i], out value))
156 result.Prepend(
"", value);
160 Match m = _namedOidPathRegex.Match(pathParts[i]);
163 result.Prepend(m.Groups[
"Name"].Value, uint.Parse(m.Groups[
"Value"].Value));
167 throw new MibException(
"Invalid OID path detected for entity '" + entity.
Name +
"' in module '" + entity.
Module +
"'!");
174 if (IsOidRoot(pathParts[0], out value))
176 result.Prepend(pathParts[0], value);
181 if (entity.
Module != null)
183 entity = ResolveDeclaration(entity.
Module, pathParts[0]) as
IEntity;
187 ResolveOid(entity, result);
191 result.Prepend(
"", uint.MaxValue);
196 result.Prepend(
"", uint.MaxValue);
202 public static bool IsOidRoot(
string name, out uint value)
204 value = uint.MaxValue;
208 case "ccitt": value = 0;
return true;
209 case "iso": value = 1;
return true;
210 case "joint-iso-ccitt": value = 2;
return true;
IModule Module
Containing module.
string Parent
Parent name.
ITypeAssignment ReferredType
Basic interface for all elements building up the MIB tree, thus having an OID as value.