private static SnmpTreeNode GenerateSnmpTreeNode(MibTreeNode mibTreeNode, SnmpTreeNode parentNode)
        {
            SnmpTreeNode result = new SnmpTreeNode(parentNode);

            result.Name    = _alphaNumericRegex.Replace(mibTreeNode.Entity.Name, "");
            result.Oid     = mibTreeNode.Entity.Value;
            result.FullOid = MibTypesResolver.ResolveOid(mibTreeNode.Entity).GetOidString();

            return(result);
        }
        public FormMain()
        {
            this.Font = SystemInformation.MenuFont;
            InitializeComponent();

            this.listviewgroupAbstract  = new ListViewGroup("Abstract", System.Windows.Forms.HorizontalAlignment.Left);
            this.listviewgroupElement   = new ListViewGroup("Element Properties", System.Windows.Forms.HorizontalAlignment.Left);
            this.listviewgroupBaseType  = new ListViewGroup("Element Base Type", System.Windows.Forms.HorizontalAlignment.Left);
            this.listviewgroupTypeChain = new ListViewGroup("Element Type Chain", System.Windows.Forms.HorizontalAlignment.Left);
            this.listviewNodeDetails.Groups.AddRange(new System.Windows.Forms.ListViewGroup[] {
                listviewgroupAbstract,
                listviewgroupElement,
                listviewgroupBaseType,
                listviewgroupTypeChain
            });

            try
            {
                DirectoryInfo dirInfo = new DirectoryInfo(Path.GetDirectoryName(Application.ExecutablePath));
                if (dirInfo != null)
                {
                    dirInfo = dirInfo.Parent;
                    if (dirInfo != null)
                    {
                        dirInfo = dirInfo.Parent;
                        if (dirInfo != null)
                        {
                            dirInfo = new DirectoryInfo(Path.Combine(dirInfo.FullName, "Mibs"));
                            if (dirInfo.Exists)
                            {
                                MibTypesResolver.RegisterResolver(new FileSystemMibResolver(dirInfo.FullName, true));
                            }
                        }
                    }
                }
            }
            catch
            { }
        }
        private void treeMib_AfterSelect(object sender, TreeViewEventArgs e)
        {
            listviewNodeDetails.Items.Clear();

            if (e.Node != null)
            {
                MibTreeNode mtn = e.Node.Tag as MibTreeNode;
                if (mtn != null)
                {
                    listviewNodeDetails.Items.Add(new ListViewItem(new string[] { "Abstract", mtn.NodeType.ToString() }, this.listviewgroupAbstract));

                    listviewNodeDetails.Items.Add(new ListViewItem(new string[] { "Module", (mtn.Entity.Module != null) ? mtn.Entity.Module.Name : "" }, this.listviewgroupElement));
                    listviewNodeDetails.Items.Add(new ListViewItem(new string[] { "Type", mtn.Entity.GetType().Name }, this.listviewgroupElement));
                    listviewNodeDetails.Items.Add(new ListViewItem(new string[] { "Name", mtn.Entity.Name }, this.listviewgroupElement));
                    listviewNodeDetails.Items.Add(new ListViewItem(new string[] { "Description", mtn.Entity.Description }, this.listviewgroupElement));
                    listviewNodeDetails.Items.Add(new ListViewItem(new string[] { "OID", mtn.Entity.Value.ToString() }, this.listviewgroupElement));
                    listviewNodeDetails.Items.Add(new ListViewItem(new string[] { "Full OID", MibTypesResolver.ResolveOid(mtn.Entity).GetOidString() }, this.listviewgroupElement));
                    if (mtn.Entity is ObjectType)
                    {
                        listviewNodeDetails.Items.Add(new ListViewItem(new string[] { "Access", (mtn.Entity as ObjectType).Access.ToString() }, this.listviewgroupElement));
                    }

                    ITypeReferrer tr = mtn.Entity as ITypeReferrer;
                    if (tr != null)
                    {
                        ShowTypeDetails(listviewNodeDetails, this.listviewgroupBaseType, tr.BaseType);
                        ShowTypeChain(listviewNodeDetails, tr.ReferredType);
                    }
                }
            }
        }
        static void Main(string[] args)
        {
            Console.WriteLine("lwIP MIB Compiler");
            Console.WriteLine("");

            // check args
            if ((args.Length < 2) || String.IsNullOrWhiteSpace(args[0]) || String.IsNullOrWhiteSpace(args[1]))
            {
                PrintUsage();
                return;
            }

            string mibFile = args[0];

            if (!File.Exists(mibFile))
            {
                Console.WriteLine(String.Format("Unable to find file '{0}'!", mibFile));
            }

            string destFile = args[1];
            string destHeaderFile;

            if (Directory.Exists(destFile))
            {
                // only directory passed -> create dest filename from mib filename
                string mibFileName = Path.GetFileNameWithoutExtension(mibFile).ToLowerInvariant();
                destFile = Path.Combine(destFile, mibFileName + ".c");
            }

            string destFileExt = Path.GetExtension(destFile);

            if (!String.IsNullOrEmpty(destFileExt))
            {
                destHeaderFile = destFile.Substring(0, destFile.Length - destFileExt.Length);
            }
            else
            {
                destHeaderFile = destFile;
            }
            destHeaderFile += ".h";

            for (int i = 2; i < args.Length; i++)
            {
                if (!String.IsNullOrWhiteSpace(args[i]) && Directory.Exists(args[i]))
                {
                    MibTypesResolver.RegisterResolver(new FileSystemMibResolver(args[i], true));
                }
            }


            // read and resolve MIB
            Console.WriteLine(" Reading MIB file...");

            MibDocument md = new MibDocument(mibFile);

            MibTypesResolver.ResolveTypes(md.Modules[0]);
            MibTree mt = new MibTree(md.Modules[0] as MibModule);

            if (mt.Root.Count == 0)
            {
                Console.WriteLine("No root element found inside MIB!");
                return;
            }

            MibCFile      generatedFile       = new MibCFile();
            MibHeaderFile generatedHeaderFile = new MibHeaderFile();

            foreach (MibTreeNode mibTreeNode in mt.Root)
            {
                // create LWIP object tree from MIB structure
                Console.WriteLine(" Creating lwIP object tree " + mibTreeNode.Entity.Name);

                SnmpMib snmpMib = new SnmpMib();
                snmpMib.Oid     = mibTreeNode.Entity.Value;
                snmpMib.BaseOid = MibTypesResolver.ResolveOid(mibTreeNode.Entity).GetOidValues();
                snmpMib.Name    = mibTreeNode.Entity.Name;

                ProcessMibTreeNode(mibTreeNode, snmpMib);

                // let the tree transform itself depending on node structure
                snmpMib.Analyze();

                if (snmpMib.ChildNodes.Count != 0)
                {
                    // generate code from LWIP object tree
                    Console.WriteLine(" Generating code " + snmpMib.Name);
                    snmpMib.Generate(generatedFile, generatedHeaderFile);
                }
            }

            string preservedCode = MibCFile.GetPreservedCode(destFile);

            if (!string.IsNullOrEmpty(preservedCode))
            {
                generatedFile.PreservedCode.Add(new PlainText(preservedCode));
            }
            else
            {
                generatedFile.PreservedCode.AddRange(generatedFile.Implementation);
            }
            generatedFile.Implementation.Clear();


            using (StreamWriter fileWriter = new StreamWriter(destHeaderFile))
            {
                CGenerator cGenerator = new CGenerator(fileWriter, destHeaderFile, 3, " ", Environment.NewLine);
                generatedHeaderFile.Save(cGenerator);
            }
            using (StreamWriter fileWriter = new StreamWriter(destFile))
            {
                CGenerator cGenerator = new CGenerator(fileWriter, destFile, 3, " ", Environment.NewLine);
                generatedFile.Save(cGenerator);
            }

            Console.WriteLine(" Done");
        }
        private static SnmpTableNode GenerateSnmpTableNode(MibTreeNode mibTreeNode, SnmpTreeNode parentNode)
        {
            SnmpTableNode result = new SnmpTableNode(parentNode);

            result.Name = mibTreeNode.Entity.Name;
            result.Oid  = mibTreeNode.Entity.Value;

            // expect exactly one row entry
            if ((mibTreeNode.ChildNodes.Count != 1) || ((mibTreeNode.ChildNodes[0].NodeType & MibTreeNodeType.TableRow) == 0) || (mibTreeNode.ChildNodes[0].Entity.Value != 1))
            {
                Console.WriteLine("Found table with unsupported properties! Table needs exactly one (fixed) TableRow with OID=1 ! (" + mibTreeNode.Entity.Name + ")");
                return(null);
            }

            MibTreeNode rowNode = mibTreeNode.ChildNodes[0];

            ObjectType rot = rowNode.Entity as ObjectType;

            if (rot != null)
            {
                if (!String.IsNullOrWhiteSpace(rot.Augments))
                {
                    result.AugmentedTableRow = rot.Augments;

                    // the indices from another table shall be used because this table is only an extension of it
                    rot = MibTypesResolver.ResolveDeclaration(rot.Module, rot.Augments) as ObjectType;
                }

                if (rot.Indices != null)
                {
                    foreach (string index in rot.Indices)
                    {
                        ObjectType indexEntity = MibTypesResolver.ResolveDeclaration(rot.Module, index) as ObjectType;
                        if (indexEntity == null)
                        {
                            Console.WriteLine(String.Format("Could not resolve index '{0}' for table '{1}'! Table omitted!", index, result.Name));
                            return(null);
                        }

                        result.IndexNodes.Add(GenerateSnmpScalarNode(indexEntity, parentNode, ignoreAccessibleFlag: true));
                    }
                }
            }

            if (result.IndexNodes.Count == 0)
            {
                // a table cannot be used without index
                Console.WriteLine("Found table without any index column ! (" + mibTreeNode.Entity.Name + ")");
                return(null);
            }

            // add child nodes
            foreach (MibTreeNode cellNode in rowNode.ChildNodes)
            {
                SnmpScalarNode ssn = GenerateSnmpScalarNode(cellNode, parentNode);
                if (ssn != null)
                {
                    result.CellNodes.Add(ssn);
                }
            }

            return(result);
        }