Beispiel #1
0
        private void DoSetUp(XmlReader reader, string endElement, AddIn addIn)
        {
            var conditionStack = new Stack <ICondition>();
            var innerCodons    = new List <Codon>();

            while (reader.Read())
            {
                switch (reader.NodeType)
                {
                case XmlNodeType.EndElement:
                    if (reader.LocalName == "Condition" || reader.LocalName == "ComplexCondition")
                    {
                        conditionStack.Pop();
                    }
                    else if (reader.LocalName == endElement)
                    {
                        if (innerCodons.Count > 0)
                        {
                            codons.Add(innerCodons);
                        }
                        return;
                    }
                    break;

                case XmlNodeType.Element:
                    string elementName = reader.LocalName;
                    if (elementName == "Condition")
                    {
                        conditionStack.Push(Condition.Read(reader, addIn));
                    }
                    else if (elementName == "ComplexCondition")
                    {
                        conditionStack.Push(Condition.ReadComplexCondition(reader, addIn));
                    }
                    else
                    {
                        var newCodon = new Codon(AddIn, elementName, Properties.ReadFromAttributes(reader), conditionStack.ToArray());
                        innerCodons.Add(newCodon);
                        if (!reader.IsEmptyElement)
                        {
                            ExtensionPath subPath = AddIn.GetExtensionPath(Name + "/" + newCodon.Id);
                            subPath.DoSetUp(reader, elementName, addIn);
                        }
                    }
                    break;
                }
            }
            if (innerCodons.Count > 0)
            {
                codons.Add(innerCodons);
            }
        }
Beispiel #2
0
        private static void SetupAddIn(XmlReader reader, AddIn addIn, string hintPath)
        {
            while (reader.Read())
            {
                if (reader.NodeType == XmlNodeType.Element && reader.IsStartElement())
                {
                    switch (reader.LocalName)
                    {
                    case "StringResources":
                    case "BitmapResources":
                        if (reader.AttributeCount != 1)
                        {
                            throw new AddInLoadException("BitmapResources requires ONE attribute.");
                        }

                        string filename = StringParser.Parse(reader.GetAttribute("file"));

                        if (reader.LocalName == "BitmapResources")
                        {
                            addIn.BitmapResources.Add(filename);
                        }
                        else
                        {
                            addIn.StringResources.Add(filename);
                        }
                        break;

                    case "Runtime":
                        if (!reader.IsEmptyElement)
                        {
                            addIn.runtimes.AddRange(Runtime.ReadSection(reader, addIn, hintPath));
                        }
                        break;

                    case "Include":
                        if (reader.AttributeCount != 1)
                        {
                            throw new AddInLoadException("Include requires ONE attribute.");
                        }
                        if (!reader.IsEmptyElement)
                        {
                            throw new AddInLoadException("Include nodes must be empty!");
                        }
                        if (hintPath == null)
                        {
                            throw new AddInLoadException("Cannot use include nodes when hintPath was not specified (e.g. when AddInManager reads a .addin file)!");
                        }
                        string fileName = Path.Combine(hintPath, reader.GetAttribute(0));
                        var    xrs      = new XmlReaderSettings
                        {
                            NameTable        = reader.NameTable, // share the name table
                            ConformanceLevel = ConformanceLevel.Fragment
                        };
                        using (XmlReader includeReader = XmlTextReader.Create(fileName, xrs))
                        {
                            SetupAddIn(includeReader, addIn, Path.GetDirectoryName(fileName));
                        }
                        break;

                    case "Path":
                        if (reader.AttributeCount != 1)
                        {
                            throw new AddInLoadException("Import node requires ONE attribute.");
                        }
                        string        pathName      = reader.GetAttribute(0);
                        ExtensionPath extensionPath = addIn.GetExtensionPath(pathName);
                        if (!reader.IsEmptyElement)
                        {
                            ExtensionPath.SetUp(extensionPath, reader, "Path");
                        }
                        break;

                    case "Manifest":
                        addIn.Manifest.ReadManifestSection(reader, hintPath);
                        break;

                    default:
                        throw new AddInLoadException("Unknown root path node:" + reader.LocalName);
                    }
                }
            }
        }