diff options
Diffstat (limited to 'tools/aapt2/xml/XmlDom.h')
-rw-r--r-- | tools/aapt2/xml/XmlDom.h | 82 |
1 files changed, 67 insertions, 15 deletions
diff --git a/tools/aapt2/xml/XmlDom.h b/tools/aapt2/xml/XmlDom.h index 154224381626..8f3829611f30 100644 --- a/tools/aapt2/xml/XmlDom.h +++ b/tools/aapt2/xml/XmlDom.h @@ -35,6 +35,7 @@ namespace xml { class Element; class Visitor; +class ConstVisitor; // Base class for all XML nodes. class Node { @@ -47,6 +48,7 @@ class Node { std::string comment; virtual void Accept(Visitor* visitor) = 0; + virtual void Accept(ConstVisitor* visitor) const = 0; using ElementCloneFunc = std::function<void(const Element&, Element*)>; @@ -98,11 +100,23 @@ class Element : public Node { Attribute* FindAttribute(const android::StringPiece& ns, const android::StringPiece& name); const Attribute* FindAttribute(const android::StringPiece& ns, const android::StringPiece& name) const; + Attribute* FindOrCreateAttribute(const android::StringPiece& ns, + const android::StringPiece& name); + Element* FindChild(const android::StringPiece& ns, const android::StringPiece& name); + const Element* FindChild(const android::StringPiece& ns, const android::StringPiece& name) const; + Element* FindChildWithAttribute(const android::StringPiece& ns, const android::StringPiece& name, const android::StringPiece& attr_ns, const android::StringPiece& attr_name, const android::StringPiece& attr_value); + + const Element* FindChildWithAttribute(const android::StringPiece& ns, + const android::StringPiece& name, + const android::StringPiece& attr_ns, + const android::StringPiece& attr_name, + const android::StringPiece& attr_value) const; + std::vector<Element*> GetChildElements(); // Due to overriding of subtypes not working with unique_ptr, define a convenience Clone method @@ -112,6 +126,7 @@ class Element : public Node { std::unique_ptr<Node> Clone(const ElementCloneFunc& el_cloner) const override; void Accept(Visitor* visitor) override; + void Accept(ConstVisitor* visitor) const override; }; // A Text (CDATA) XML node. Can not have any children. @@ -122,6 +137,7 @@ class Text : public Node { std::unique_ptr<Node> Clone(const ElementCloneFunc& el_cloner) const override; void Accept(Visitor* visitor) override; + void Accept(ConstVisitor* visitor) const override; }; // An XML resource with a source, name, and XML tree. @@ -135,16 +151,16 @@ class XmlResource { StringPool string_pool; std::unique_ptr<xml::Element> root; + + std::unique_ptr<XmlResource> Clone() const; }; // Inflates an XML DOM from an InputStream, logging errors to the logger. -// Returns the root node on success, or nullptr on failure. std::unique_ptr<XmlResource> Inflate(io::InputStream* in, IDiagnostics* diag, const Source& source); -// Inflates an XML DOM from a binary ResXMLTree, logging errors to the logger. -// Returns the root node on success, or nullptr on failure. -std::unique_ptr<XmlResource> Inflate(const void* data, size_t data_len, IDiagnostics* diag, - const Source& source); +// Inflates an XML DOM from a binary ResXMLTree. +std::unique_ptr<XmlResource> Inflate(const void* data, size_t len, + std::string* out_error = nullptr); Element* FindRootElement(Node* node); @@ -180,13 +196,44 @@ class Visitor { friend class Element; }; +class ConstVisitor { + public: + virtual ~ConstVisitor() = default; + + virtual void Visit(const Element* el) { + VisitChildren(el); + } + + virtual void Visit(const Text* text) { + } + + protected: + ConstVisitor() = default; + + void VisitChildren(const Element* el) { + for (const auto& child : el->children) { + child->Accept(this); + } + } + + virtual void BeforeVisitElement(const Element* el) { + } + + virtual void AfterVisitElement(const Element* el) { + } + + private: + DISALLOW_COPY_AND_ASSIGN(ConstVisitor); + + friend class Element; +}; + // An XML DOM visitor that will record the package name for a namespace prefix. class PackageAwareVisitor : public Visitor, public IPackageDeclStack { public: using Visitor::Visit; - Maybe<ExtractedPackage> TransformPackageAlias( - const android::StringPiece& alias, const android::StringPiece& local_package) const override; + Maybe<ExtractedPackage> TransformPackageAlias(const android::StringPiece& alias) const override; protected: PackageAwareVisitor() = default; @@ -208,19 +255,19 @@ class PackageAwareVisitor : public Visitor, public IPackageDeclStack { namespace internal { // Base class that overrides the default behaviour and does not descend into child nodes. -class NodeCastBase : public Visitor { +class NodeCastBase : public ConstVisitor { public: - void Visit(Element* el) override { + void Visit(const Element* el) override { } - void Visit(Text* el) override { + void Visit(const Text* el) override { } protected: NodeCastBase() = default; - void BeforeVisitElement(Element* el) override { + void BeforeVisitElement(const Element* el) override { } - void AfterVisitElement(Element* el) override { + void AfterVisitElement(const Element* el) override { } private: @@ -234,9 +281,9 @@ class NodeCastImpl : public NodeCastBase { NodeCastImpl() = default; - T* value = nullptr; + const T* value = nullptr; - void Visit(T* v) override { + void Visit(const T* v) override { value = v; } @@ -247,12 +294,17 @@ class NodeCastImpl : public NodeCastBase { } // namespace internal template <typename T> -T* NodeCast(Node* node) { +const T* NodeCast(const Node* node) { internal::NodeCastImpl<T> visitor; node->Accept(&visitor); return visitor.value; } +template <typename T> +T* NodeCast(Node* node) { + return const_cast<T*>(NodeCast<T>(static_cast<const T*>(node))); +} + } // namespace xml } // namespace aapt |