XmlDom.h revision 8780eb6e4918ae24fb1ae74d631042c32e41dc3d
175f3a55cc569a9b61f540a85d9828e91bdca5047Adam Lesinski/* 275f3a55cc569a9b61f540a85d9828e91bdca5047Adam Lesinski * Copyright (C) 2015 The Android Open Source Project 375f3a55cc569a9b61f540a85d9828e91bdca5047Adam Lesinski * 475f3a55cc569a9b61f540a85d9828e91bdca5047Adam Lesinski * Licensed under the Apache License, Version 2.0 (the "License"); 575f3a55cc569a9b61f540a85d9828e91bdca5047Adam Lesinski * you may not use this file except in compliance with the License. 675f3a55cc569a9b61f540a85d9828e91bdca5047Adam Lesinski * You may obtain a copy of the License at 775f3a55cc569a9b61f540a85d9828e91bdca5047Adam Lesinski * 875f3a55cc569a9b61f540a85d9828e91bdca5047Adam Lesinski * http://www.apache.org/licenses/LICENSE-2.0 975f3a55cc569a9b61f540a85d9828e91bdca5047Adam Lesinski * 1075f3a55cc569a9b61f540a85d9828e91bdca5047Adam Lesinski * Unless required by applicable law or agreed to in writing, software 1175f3a55cc569a9b61f540a85d9828e91bdca5047Adam Lesinski * distributed under the License is distributed on an "AS IS" BASIS, 1275f3a55cc569a9b61f540a85d9828e91bdca5047Adam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1375f3a55cc569a9b61f540a85d9828e91bdca5047Adam Lesinski * See the License for the specific language governing permissions and 1475f3a55cc569a9b61f540a85d9828e91bdca5047Adam Lesinski * limitations under the License. 1575f3a55cc569a9b61f540a85d9828e91bdca5047Adam Lesinski */ 1675f3a55cc569a9b61f540a85d9828e91bdca5047Adam Lesinski 1775f3a55cc569a9b61f540a85d9828e91bdca5047Adam Lesinski#ifndef AAPT_XML_DOM_H 1875f3a55cc569a9b61f540a85d9828e91bdca5047Adam Lesinski#define AAPT_XML_DOM_H 1975f3a55cc569a9b61f540a85d9828e91bdca5047Adam Lesinski 20ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski#include <memory> 21ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski#include <string> 22ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski#include <vector> 23ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski 24d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinski#include "androidfw/StringPiece.h" 25d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinski 261ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski#include "Diagnostics.h" 271ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski#include "Resource.h" 281ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski#include "ResourceValues.h" 29efeb7af13be4446ce4a511a2ca707691e9a67c1eAdam Lesinski#include "io/Io.h" 301ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski#include "util/Util.h" 31467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski#include "xml/XmlUtil.h" 3275f3a55cc569a9b61f540a85d9828e91bdca5047Adam Lesinski 3375f3a55cc569a9b61f540a85d9828e91bdca5047Adam Lesinskinamespace aapt { 3475f3a55cc569a9b61f540a85d9828e91bdca5047Adam Lesinskinamespace xml { 3575f3a55cc569a9b61f540a85d9828e91bdca5047Adam Lesinski 36c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinskiclass Element; 376b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinskiclass Visitor; 38d3ffa844f5a07756009f019e13806e253d1bb119Adam Lesinskiclass ConstVisitor; 39c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski 40efeb7af13be4446ce4a511a2ca707691e9a67c1eAdam Lesinski// Base class for all XML nodes. 415eeaaddffd23d8d85aeb321e3ceea626e42cf9deAdam Lesinskiclass Node { 42cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski public: 43cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski virtual ~Node() = default; 44cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski 456b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski Element* parent = nullptr; 466b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski size_t line_number = 0u; 476b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski size_t column_number = 0u; 486b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski std::string comment; 496b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski 506b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski virtual void Accept(Visitor* visitor) = 0; 51d3ffa844f5a07756009f019e13806e253d1bb119Adam Lesinski virtual void Accept(ConstVisitor* visitor) const = 0; 52c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski 53c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski using ElementCloneFunc = std::function<void(const Element&, Element*)>; 54c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski 55c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski // Clones the Node subtree, using the given function to decide how to clone an Element. 566b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski virtual std::unique_ptr<Node> Clone(const ElementCloneFunc& el_cloner) const = 0; 5775f3a55cc569a9b61f540a85d9828e91bdca5047Adam Lesinski}; 5875f3a55cc569a9b61f540a85d9828e91bdca5047Adam Lesinski 596b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski// A namespace declaration (xmlns:prefix="uri"). 606b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinskistruct NamespaceDecl { 616b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski std::string prefix; 626b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski std::string uri; 636b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski size_t line_number = 0u; 646b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski size_t column_number = 0u; 651ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski}; 6675f3a55cc569a9b61f540a85d9828e91bdca5047Adam Lesinski 671ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinskistruct AaptAttribute { 68c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski explicit AaptAttribute(const ::aapt::Attribute& attr, const Maybe<ResourceId>& resid = {}) 69c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski : attribute(attr), id(resid) { 70c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski } 71c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski 72cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski aapt::Attribute attribute; 73c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski Maybe<ResourceId> id; 7475f3a55cc569a9b61f540a85d9828e91bdca5047Adam Lesinski}; 7575f3a55cc569a9b61f540a85d9828e91bdca5047Adam Lesinski 76efeb7af13be4446ce4a511a2ca707691e9a67c1eAdam Lesinski// An XML attribute. 7775f3a55cc569a9b61f540a85d9828e91bdca5047Adam Lesinskistruct Attribute { 78ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski std::string namespace_uri; 79cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski std::string name; 80cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski std::string value; 811ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 82ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski Maybe<AaptAttribute> compiled_attribute; 83ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski std::unique_ptr<Item> compiled_value; 8475f3a55cc569a9b61f540a85d9828e91bdca5047Adam Lesinski}; 8575f3a55cc569a9b61f540a85d9828e91bdca5047Adam Lesinski 86efeb7af13be4446ce4a511a2ca707691e9a67c1eAdam Lesinski// An Element XML node. 876b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinskiclass Element : public Node { 88cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski public: 896b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski // Ordered namespace prefix declarations. 906b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski std::vector<NamespaceDecl> namespace_decls; 916b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski 92ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski std::string namespace_uri; 93cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski std::string name; 94cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski std::vector<Attribute> attributes; 956b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski std::vector<std::unique_ptr<Node>> children; 966b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski 976b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski void AppendChild(std::unique_ptr<Node> child); 986b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski void InsertChild(size_t index, std::unique_ptr<Node> child); 99cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski 100d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinski Attribute* FindAttribute(const android::StringPiece& ns, const android::StringPiece& name); 101c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski const Attribute* FindAttribute(const android::StringPiece& ns, 102c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski const android::StringPiece& name) const; 1038780eb6e4918ae24fb1ae74d631042c32e41dc3dAdam Lesinski 1046b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski Element* FindChild(const android::StringPiece& ns, const android::StringPiece& name); 1058780eb6e4918ae24fb1ae74d631042c32e41dc3dAdam Lesinski const Element* FindChild(const android::StringPiece& ns, const android::StringPiece& name) const; 1068780eb6e4918ae24fb1ae74d631042c32e41dc3dAdam Lesinski 1076b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski Element* FindChildWithAttribute(const android::StringPiece& ns, const android::StringPiece& name, 1086b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski const android::StringPiece& attr_ns, 1096b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski const android::StringPiece& attr_name, 1106b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski const android::StringPiece& attr_value); 1118780eb6e4918ae24fb1ae74d631042c32e41dc3dAdam Lesinski 1128780eb6e4918ae24fb1ae74d631042c32e41dc3dAdam Lesinski const Element* FindChildWithAttribute(const android::StringPiece& ns, 1138780eb6e4918ae24fb1ae74d631042c32e41dc3dAdam Lesinski const android::StringPiece& name, 1148780eb6e4918ae24fb1ae74d631042c32e41dc3dAdam Lesinski const android::StringPiece& attr_ns, 1158780eb6e4918ae24fb1ae74d631042c32e41dc3dAdam Lesinski const android::StringPiece& attr_name, 1168780eb6e4918ae24fb1ae74d631042c32e41dc3dAdam Lesinski const android::StringPiece& attr_value) const; 1178780eb6e4918ae24fb1ae74d631042c32e41dc3dAdam Lesinski 1186b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski std::vector<Element*> GetChildElements(); 1196b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski 1206b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski // Due to overriding of subtypes not working with unique_ptr, define a convenience Clone method 1216b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski // that knows cloning an element returns an element. 1226b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski std::unique_ptr<Element> CloneElement(const ElementCloneFunc& el_cloner) const; 1236b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski 1246b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski std::unique_ptr<Node> Clone(const ElementCloneFunc& el_cloner) const override; 1256b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski 1266b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski void Accept(Visitor* visitor) override; 127d3ffa844f5a07756009f019e13806e253d1bb119Adam Lesinski void Accept(ConstVisitor* visitor) const override; 12875f3a55cc569a9b61f540a85d9828e91bdca5047Adam Lesinski}; 12975f3a55cc569a9b61f540a85d9828e91bdca5047Adam Lesinski 130efeb7af13be4446ce4a511a2ca707691e9a67c1eAdam Lesinski// A Text (CDATA) XML node. Can not have any children. 1316b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinskiclass Text : public Node { 132cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski public: 133cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski std::string text; 1345eeaaddffd23d8d85aeb321e3ceea626e42cf9deAdam Lesinski 1356b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski std::unique_ptr<Node> Clone(const ElementCloneFunc& el_cloner) const override; 1366b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski 1376b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski void Accept(Visitor* visitor) override; 138d3ffa844f5a07756009f019e13806e253d1bb119Adam Lesinski void Accept(ConstVisitor* visitor) const override; 13975f3a55cc569a9b61f540a85d9828e91bdca5047Adam Lesinski}; 14075f3a55cc569a9b61f540a85d9828e91bdca5047Adam Lesinski 141efeb7af13be4446ce4a511a2ca707691e9a67c1eAdam Lesinski// An XML resource with a source, name, and XML tree. 1425eeaaddffd23d8d85aeb321e3ceea626e42cf9deAdam Lesinskiclass XmlResource { 143cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski public: 144cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ResourceFile file; 145ea134e08d70d156bdd17714d5f9ab9c44c91d4faAdam Lesinski 146ea134e08d70d156bdd17714d5f9ab9c44c91d4faAdam Lesinski // StringPool must come before the xml::Node. Destructors are called in reverse order, and 147ea134e08d70d156bdd17714d5f9ab9c44c91d4faAdam Lesinski // the xml::Node may have StringPool references that need to be destroyed before the StringPool 148ea134e08d70d156bdd17714d5f9ab9c44c91d4faAdam Lesinski // is destroyed. 149d0f492db038c6210c1138865d816bfb134376538Adam Lesinski StringPool string_pool; 150ea134e08d70d156bdd17714d5f9ab9c44c91d4faAdam Lesinski 1516b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski std::unique_ptr<xml::Element> root; 1528780eb6e4918ae24fb1ae74d631042c32e41dc3dAdam Lesinski 1538780eb6e4918ae24fb1ae74d631042c32e41dc3dAdam Lesinski std::unique_ptr<XmlResource> Clone() const; 154467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski}; 155467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski 156efeb7af13be4446ce4a511a2ca707691e9a67c1eAdam Lesinski// Inflates an XML DOM from an InputStream, logging errors to the logger. 157efeb7af13be4446ce4a511a2ca707691e9a67c1eAdam Lesinskistd::unique_ptr<XmlResource> Inflate(io::InputStream* in, IDiagnostics* diag, const Source& source); 15875f3a55cc569a9b61f540a85d9828e91bdca5047Adam Lesinski 1598780eb6e4918ae24fb1ae74d631042c32e41dc3dAdam Lesinski// Inflates an XML DOM from a binary ResXMLTree. 1608780eb6e4918ae24fb1ae74d631042c32e41dc3dAdam Lesinskistd::unique_ptr<XmlResource> Inflate(const void* data, size_t len, 1618780eb6e4918ae24fb1ae74d631042c32e41dc3dAdam Lesinski std::string* out_error = nullptr); 1621ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 163ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam LesinskiElement* FindRootElement(Node* node); 164ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski 165efeb7af13be4446ce4a511a2ca707691e9a67c1eAdam Lesinski// Visitor whose default implementation visits the children nodes of any node. 1666b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinskiclass Visitor { 167cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski public: 1686b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski virtual ~Visitor() = default; 1691ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 1706b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski virtual void Visit(Element* el) { 1716b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski VisitChildren(el); 172efeb7af13be4446ce4a511a2ca707691e9a67c1eAdam Lesinski } 1731ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 1746b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski virtual void Visit(Text* text) { 175efeb7af13be4446ce4a511a2ca707691e9a67c1eAdam Lesinski } 1761ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 1776b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski protected: 1786b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski Visitor() = default; 1791ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 1806b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski void VisitChildren(Element* el) { 1816b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski for (auto& child : el->children) { 182ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski child->Accept(this); 1831ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski } 184cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski } 1856b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski 1866b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski virtual void BeforeVisitElement(Element* el) { 1876b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski } 1886b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski virtual void AfterVisitElement(Element* el) { 1896b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski } 1906b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski 1916b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski private: 1926b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski DISALLOW_COPY_AND_ASSIGN(Visitor); 1936b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski 1946b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski friend class Element; 1951ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski}; 19675f3a55cc569a9b61f540a85d9828e91bdca5047Adam Lesinski 197d3ffa844f5a07756009f019e13806e253d1bb119Adam Lesinskiclass ConstVisitor { 198d3ffa844f5a07756009f019e13806e253d1bb119Adam Lesinski public: 199d3ffa844f5a07756009f019e13806e253d1bb119Adam Lesinski virtual ~ConstVisitor() = default; 200d3ffa844f5a07756009f019e13806e253d1bb119Adam Lesinski 201d3ffa844f5a07756009f019e13806e253d1bb119Adam Lesinski virtual void Visit(const Element* el) { 202d3ffa844f5a07756009f019e13806e253d1bb119Adam Lesinski VisitChildren(el); 203d3ffa844f5a07756009f019e13806e253d1bb119Adam Lesinski } 204d3ffa844f5a07756009f019e13806e253d1bb119Adam Lesinski 205d3ffa844f5a07756009f019e13806e253d1bb119Adam Lesinski virtual void Visit(const Text* text) { 206d3ffa844f5a07756009f019e13806e253d1bb119Adam Lesinski } 207d3ffa844f5a07756009f019e13806e253d1bb119Adam Lesinski 208d3ffa844f5a07756009f019e13806e253d1bb119Adam Lesinski protected: 209d3ffa844f5a07756009f019e13806e253d1bb119Adam Lesinski ConstVisitor() = default; 210d3ffa844f5a07756009f019e13806e253d1bb119Adam Lesinski 211d3ffa844f5a07756009f019e13806e253d1bb119Adam Lesinski void VisitChildren(const Element* el) { 212d3ffa844f5a07756009f019e13806e253d1bb119Adam Lesinski for (const auto& child : el->children) { 213d3ffa844f5a07756009f019e13806e253d1bb119Adam Lesinski child->Accept(this); 214d3ffa844f5a07756009f019e13806e253d1bb119Adam Lesinski } 215d3ffa844f5a07756009f019e13806e253d1bb119Adam Lesinski } 216d3ffa844f5a07756009f019e13806e253d1bb119Adam Lesinski 217d3ffa844f5a07756009f019e13806e253d1bb119Adam Lesinski virtual void BeforeVisitElement(const Element* el) { 218d3ffa844f5a07756009f019e13806e253d1bb119Adam Lesinski } 219d3ffa844f5a07756009f019e13806e253d1bb119Adam Lesinski 220d3ffa844f5a07756009f019e13806e253d1bb119Adam Lesinski virtual void AfterVisitElement(const Element* el) { 221d3ffa844f5a07756009f019e13806e253d1bb119Adam Lesinski } 222d3ffa844f5a07756009f019e13806e253d1bb119Adam Lesinski 223d3ffa844f5a07756009f019e13806e253d1bb119Adam Lesinski private: 224d3ffa844f5a07756009f019e13806e253d1bb119Adam Lesinski DISALLOW_COPY_AND_ASSIGN(ConstVisitor); 225d3ffa844f5a07756009f019e13806e253d1bb119Adam Lesinski 226d3ffa844f5a07756009f019e13806e253d1bb119Adam Lesinski friend class Element; 227d3ffa844f5a07756009f019e13806e253d1bb119Adam Lesinski}; 228d3ffa844f5a07756009f019e13806e253d1bb119Adam Lesinski 229efeb7af13be4446ce4a511a2ca707691e9a67c1eAdam Lesinski// An XML DOM visitor that will record the package name for a namespace prefix. 2301ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinskiclass PackageAwareVisitor : public Visitor, public IPackageDeclStack { 231cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski public: 232ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski using Visitor::Visit; 2335eeaaddffd23d8d85aeb321e3ceea626e42cf9deAdam Lesinski 2341ef0fa9d7242b1926543bc49e35905d1be02a781Adam Lesinski Maybe<ExtractedPackage> TransformPackageAlias(const android::StringPiece& alias) const override; 2355eeaaddffd23d8d85aeb321e3ceea626e42cf9deAdam Lesinski 2366b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski protected: 2376b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski PackageAwareVisitor() = default; 2386b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski 2396b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski void BeforeVisitElement(Element* el) override; 2406b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski void AfterVisitElement(Element* el) override; 2416b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski 242cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski private: 2436b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski DISALLOW_COPY_AND_ASSIGN(PackageAwareVisitor); 2446b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski 245cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski struct PackageDecl { 246cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski std::string prefix; 247cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ExtractedPackage package; 248cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski }; 2491ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 2506b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski std::vector<std::vector<PackageDecl>> package_decls_; 25175f3a55cc569a9b61f540a85d9828e91bdca5047Adam Lesinski}; 25275f3a55cc569a9b61f540a85d9828e91bdca5047Adam Lesinski 2536b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinskinamespace internal { 25475f3a55cc569a9b61f540a85d9828e91bdca5047Adam Lesinski 2556b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski// Base class that overrides the default behaviour and does not descend into child nodes. 256d3ffa844f5a07756009f019e13806e253d1bb119Adam Lesinskiclass NodeCastBase : public ConstVisitor { 2576b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski public: 258d3ffa844f5a07756009f019e13806e253d1bb119Adam Lesinski void Visit(const Element* el) override { 2596b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski } 260d3ffa844f5a07756009f019e13806e253d1bb119Adam Lesinski void Visit(const Text* el) override { 2616b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski } 2626b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski 2636b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski protected: 2646b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski NodeCastBase() = default; 2656b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski 266d3ffa844f5a07756009f019e13806e253d1bb119Adam Lesinski void BeforeVisitElement(const Element* el) override { 2676b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski } 268d3ffa844f5a07756009f019e13806e253d1bb119Adam Lesinski void AfterVisitElement(const Element* el) override { 2696b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski } 2706b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski 2716b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski private: 2726b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski DISALLOW_COPY_AND_ASSIGN(NodeCastBase); 2736b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski}; 27475f3a55cc569a9b61f540a85d9828e91bdca5047Adam Lesinski 2751ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinskitemplate <typename T> 2766b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinskiclass NodeCastImpl : public NodeCastBase { 277cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski public: 2786b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski using NodeCastBase::Visit; 2796b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski 2806b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski NodeCastImpl() = default; 2811ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 282d3ffa844f5a07756009f019e13806e253d1bb119Adam Lesinski const T* value = nullptr; 2831ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 284d3ffa844f5a07756009f019e13806e253d1bb119Adam Lesinski void Visit(const T* v) override { 285efeb7af13be4446ce4a511a2ca707691e9a67c1eAdam Lesinski value = v; 286efeb7af13be4446ce4a511a2ca707691e9a67c1eAdam Lesinski } 2876b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski 2886b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski private: 2896b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski DISALLOW_COPY_AND_ASSIGN(NodeCastImpl); 2901ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski}; 2911ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 2926b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski} // namespace internal 2936b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski 2941ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinskitemplate <typename T> 295d3ffa844f5a07756009f019e13806e253d1bb119Adam Lesinskiconst T* NodeCast(const Node* node) { 2966b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski internal::NodeCastImpl<T> visitor; 297ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski node->Accept(&visitor); 298cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski return visitor.value; 29975f3a55cc569a9b61f540a85d9828e91bdca5047Adam Lesinski} 30075f3a55cc569a9b61f540a85d9828e91bdca5047Adam Lesinski 301d3ffa844f5a07756009f019e13806e253d1bb119Adam Lesinskitemplate <typename T> 302d3ffa844f5a07756009f019e13806e253d1bb119Adam LesinskiT* NodeCast(Node* node) { 303d3ffa844f5a07756009f019e13806e253d1bb119Adam Lesinski return const_cast<T*>(NodeCast<T>(static_cast<const T*>(node))); 304d3ffa844f5a07756009f019e13806e253d1bb119Adam Lesinski} 305d3ffa844f5a07756009f019e13806e253d1bb119Adam Lesinski 306cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski} // namespace xml 307cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski} // namespace aapt 30875f3a55cc569a9b61f540a85d9828e91bdca5047Adam Lesinski 309cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski#endif // AAPT_XML_DOM_H 310