public static MibData Merge(MibData current, MibData imported) { foreach (var importedNode in imported.FlatMibTree.Where(n => n.Value.Parent != null)) { //TODO: optimize for nested nodes from import TreeBuilder.InsertIntoTree(importedNode.Value, importedNode.Value.Parent.Name, current.FlatMibTree); } foreach (var typeKV in imported.DataTypes.Where(type => !current.DataTypes.ContainsKey(type.Key))) { current.DataTypes.Add(typeKV.Key, typeKV.Value); } return(current); }
public static MibData Parse(string fileName) { MibData result = InitMibData(); string mibFileTxt = SmiParser.Utils.FileUtils.ReadFileFromOutputDirectory(MibFilesFolder, fileName); IEnumerable <ImportInfo> importsByFiles = ImportsParser.ParseImportInfo(mibFileTxt); foreach (ImportInfo singleFileImports in importsByFiles) { try { MibData imported = Parse(singleFileImports.Filename); result = Merge(result, imported); } catch (FileNotFoundException e) { Debug.WriteLine(string.Format("File {0} has not been found", e.Message)); } } IEnumerable <CustomDataType> dataTypes = DataTypesParser.ParseAllDataTypes(mibFileTxt); foreach (CustomDataType type in dataTypes) { result.DataTypes.Add(type.Name, type); } IEnumerable <AliasInfo> parsedAliases = AliasesParser.Parse(mibFileTxt); IEnumerable <DataTypeAlias> aliases = parsedAliases .Select( ai => GetAliasTypeFromInfo(result.DataTypes, ai)) .Where(alias => alias != null) .ToList(); foreach (DataTypeAlias alias in aliases) { result.DataTypes.Add(alias.Alias, alias); } IEnumerable <OidInfo> oids = OidsParser.ParseAllOids(mibFileTxt); foreach (OidInfo oi in oids) { var oidNode = new TreeNode() { Children = new List <TreeNode>(), Name = oi.Name, SiblingIndex = oi.SiblingNo }; TreeBuilder.InsertIntoTree(oidNode, oi.ParentExpression, result.FlatMibTree); } IDictionary <OidInfo, ObjectTypeInfo> objectTypes = ObjectTypesParser.ParseAllObjectTypes(mibFileTxt);; foreach (var objTypeInfoKV in objectTypes) { ObjectType objType = GetObjectTypeFromInfo(result.DataTypes, objTypeInfoKV.Value); if (objType == null) { continue; } var otNode = new TreeNode() { Children = new List <TreeNode>(), Name = objTypeInfoKV.Key.Name, SiblingIndex = objTypeInfoKV.Key.SiblingNo, ObjectType = objType }; TreeBuilder.InsertIntoTree(otNode, objTypeInfoKV.Key.ParentExpression, result.FlatMibTree); } return(result); }