/* * Copyright (C) 2015 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef AAPT_RESOURCE_VALUES_H #define AAPT_RESOURCE_VALUES_H #include "Resource.h" #include "StringPool.h" #include #include #include #include namespace aapt { struct ValueVisitor; struct ConstValueVisitor; struct ValueVisitorArgs; /** * A resource value. This is an all-encompassing representation * of Item and Map and their subclasses. The way to do * type specific operations is to check the Value's type() and * cast it to the appropriate subclass. This isn't super clean, * but it is the simplest strategy. */ struct Value { /** * Whether or not this is an Item. */ virtual bool isItem() const; /** * Whether this value is weak and can be overriden without * warning or error. Default for base class is false. */ virtual bool isWeak() const; /** * Calls the appropriate overload of ValueVisitor. */ virtual void accept(ValueVisitor& visitor, ValueVisitorArgs&& args) = 0; /** * Const version of accept(). */ virtual void accept(ConstValueVisitor& visitor, ValueVisitorArgs&& args) const = 0; /** * Clone the value. */ virtual Value* clone(StringPool* newPool) const = 0; /** * Human readable printout of this value. */ virtual void print(std::ostream& out) const = 0; }; /** * Inherit from this to get visitor accepting implementations for free. */ template struct BaseValue : public Value { virtual void accept(ValueVisitor& visitor, ValueVisitorArgs&& args) override; virtual void accept(ConstValueVisitor& visitor, ValueVisitorArgs&& args) const override; }; /** * A resource item with a single value. This maps to android::ResTable_entry. */ struct Item : public Value { /** * An Item is, of course, an Item. */ virtual bool isItem() const override; /** * Clone the Item. */ virtual Item* clone(StringPool* newPool) const override = 0; /** * Fills in an android::Res_value structure with this Item's binary representation. * Returns false if an error ocurred. */ virtual bool flatten(android::Res_value& outValue) const = 0; }; /** * Inherit from this to get visitor accepting implementations for free. */ template struct BaseItem : public Item { virtual void accept(ValueVisitor& visitor, ValueVisitorArgs&& args) override; virtual void accept(ConstValueVisitor& visitor, ValueVisitorArgs&& args) const override; }; /** * A reference to another resource. This maps to android::Res_value::TYPE_REFERENCE. * * A reference can be symbolic (with the name set to a valid resource name) or be * numeric (the id is set to a valid resource ID). */ struct Reference : public BaseItem { enum class Type { kResource, kAttribute, }; ResourceName name; ResourceId id; Reference::Type referenceType; bool privateReference = false; Reference(); Reference(const ResourceNameRef& n, Type type = Type::kResource); Reference(const ResourceId& i, Type type = Type::kResource); bool flatten(android::Res_value& outValue) const override; Reference* clone(StringPool* newPool) const override; void print(std::ostream& out) const override; }; /** * An ID resource. Has no real value, just a place holder. */ struct Id : public BaseItem { bool isWeak() const override; bool flatten(android::Res_value& out) const override; Id* clone(StringPool* newPool) const override; void print(std::ostream& out) const override; }; /** * A raw, unprocessed string. This may contain quotations, * escape sequences, and whitespace. This shall *NOT* * end up in the final resource table. */ struct RawString : public BaseItem { StringPool::Ref value; RawString(const StringPool::Ref& ref); bool flatten(android::Res_value& outValue) const override; RawString* clone(StringPool* newPool) const override; void print(std::ostream& out) const override; }; struct String : public BaseItem { StringPool::Ref value; String(const StringPool::Ref& ref); bool flatten(android::Res_value& outValue) const override; String* clone(StringPool* newPool) const override; void print(std::ostream& out) const override; }; struct StyledString : public BaseItem { StringPool::StyleRef value; StyledString(const StringPool::StyleRef& ref); bool flatten(android::Res_value& outValue) const override; StyledString* clone(StringPool* newPool) const override; void print(std::ostream& out) const override; }; struct FileReference : public BaseItem { StringPool::Ref path; FileReference() = default; FileReference(const StringPool::Ref& path); bool flatten(android::Res_value& outValue) const override; FileReference* clone(StringPool* newPool) const override; void print(std::ostream& out) const override; }; /** * Represents any other android::Res_value. */ struct BinaryPrimitive : public BaseItem { android::Res_value value; BinaryPrimitive() = default; BinaryPrimitive(const android::Res_value& val); bool flatten(android::Res_value& outValue) const override; BinaryPrimitive* clone(StringPool* newPool) const override; void print(std::ostream& out) const override; }; struct Attribute : public BaseValue { struct Symbol { Reference symbol; uint32_t value; }; bool weak; uint32_t typeMask; uint32_t minInt; uint32_t maxInt; std::vector symbols; Attribute(bool w, uint32_t t = 0u); bool isWeak() const override; virtual Attribute* clone(StringPool* newPool) const override; void printMask(std::ostream& out) const; virtual void print(std::ostream& out) const override; }; struct Style : public BaseValue