16f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski/* 26f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Copyright (C) 2015 The Android Open Source Project 36f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * 46f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Licensed under the Apache License, Version 2.0 (the "License"); 56f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * you may not use this file except in compliance with the License. 66f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * You may obtain a copy of the License at 76f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * 86f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * http://www.apache.org/licenses/LICENSE-2.0 96f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * 106f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Unless required by applicable law or agreed to in writing, software 116f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * distributed under the License is distributed on an "AS IS" BASIS, 126f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * See the License for the specific language governing permissions and 146f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * limitations under the License. 156f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski */ 166f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 176f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#ifndef AAPT_RESOURCE_VALUES_H 186f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#define AAPT_RESOURCE_VALUES_H 196f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 20a587065721053ad54e34f484868142407d59512dAdam Lesinski#include "Diagnostics.h" 216f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#include "Resource.h" 226f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#include "StringPool.h" 23355f285ffd000f6cfe76680eb22d010546d124bbAdam Lesinski#include "io/File.h" 24a587065721053ad54e34f484868142407d59512dAdam Lesinski#include "util/Maybe.h" 256f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 266f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#include <array> 276f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#include <androidfw/ResourceTypes.h> 286f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#include <ostream> 296f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#include <vector> 306f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 316f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskinamespace aapt { 326f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 331ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinskistruct RawValueVisitor; 346f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 356f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski/** 366f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * A resource value. This is an all-encompassing representation 376f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * of Item and Map and their subclasses. The way to do 386f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * type specific operations is to check the Value's type() and 396f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * cast it to the appropriate subclass. This isn't super clean, 406f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * but it is the simplest strategy. 416f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski */ 426f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskistruct Value { 431ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski virtual ~Value() = default; 441ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 456f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski /** 461ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski * Whether this value is weak and can be overridden without 47393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski * warning or error. Default is false. 486f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski */ 49393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski bool isWeak() const { 50393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski return mWeak; 51393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski } 52393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski 53393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski void setWeak(bool val) { 54393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski mWeak = val; 55393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski } 566f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 57458b877488c12ea4336d8fc00a95d9c0298bd6d0Adam Lesinski // Whether the value is marked as translateable. 58458b877488c12ea4336d8fc00a95d9c0298bd6d0Adam Lesinski // This does not persist when flattened. 59458b877488c12ea4336d8fc00a95d9c0298bd6d0Adam Lesinski // It is only used during compilation phase. 60458b877488c12ea4336d8fc00a95d9c0298bd6d0Adam Lesinski void setTranslateable(bool val) { 61458b877488c12ea4336d8fc00a95d9c0298bd6d0Adam Lesinski mTranslateable = val; 62458b877488c12ea4336d8fc00a95d9c0298bd6d0Adam Lesinski } 63458b877488c12ea4336d8fc00a95d9c0298bd6d0Adam Lesinski 64458b877488c12ea4336d8fc00a95d9c0298bd6d0Adam Lesinski // Default true. 65458b877488c12ea4336d8fc00a95d9c0298bd6d0Adam Lesinski bool isTranslateable() const { 66458b877488c12ea4336d8fc00a95d9c0298bd6d0Adam Lesinski return mTranslateable; 67458b877488c12ea4336d8fc00a95d9c0298bd6d0Adam Lesinski } 68458b877488c12ea4336d8fc00a95d9c0298bd6d0Adam Lesinski 696f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski /** 70e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski * Returns the source where this value was defined. 71e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski */ 72e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski const Source& getSource() const { 73e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski return mSource; 74e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski } 75e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski 76e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski void setSource(const Source& source) { 77e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski mSource = source; 78e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski } 79e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski 80e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski void setSource(Source&& source) { 81e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski mSource = std::move(source); 82e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski } 83e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski 84e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski /** 85e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski * Returns the comment that was associated with this resource. 86e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski */ 87e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski StringPiece16 getComment() const { 88e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski return mComment; 89e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski } 90e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski 91e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski void setComment(const StringPiece16& str) { 92e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski mComment = str.toString(); 93e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski } 94e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski 95e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski void setComment(std::u16string&& str) { 96e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski mComment = std::move(str); 97e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski } 98e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski 99458b877488c12ea4336d8fc00a95d9c0298bd6d0Adam Lesinski virtual bool equals(const Value* value) const = 0; 100458b877488c12ea4336d8fc00a95d9c0298bd6d0Adam Lesinski 101e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski /** 1026f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Calls the appropriate overload of ValueVisitor. 1036f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski */ 1041ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski virtual void accept(RawValueVisitor* visitor) = 0; 1056f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 1066f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski /** 1076f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Clone the value. 1086f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski */ 109769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski virtual Value* clone(StringPool* newPool) const = 0; 1106f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 1116f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski /** 1126f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Human readable printout of this value. 1136f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski */ 1141ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski virtual void print(std::ostream* out) const = 0; 115e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski 116b274e35abfbbd09e0fce983a215c11522c56cce2Adam Lesinskiprotected: 117e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski Source mSource; 118e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski std::u16string mComment; 119393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski bool mWeak = false; 120458b877488c12ea4336d8fc00a95d9c0298bd6d0Adam Lesinski bool mTranslateable = true; 1216f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}; 1226f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 1236f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski/** 1246f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Inherit from this to get visitor accepting implementations for free. 1256f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski */ 1266f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskitemplate <typename Derived> 1276f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskistruct BaseValue : public Value { 1281ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski void accept(RawValueVisitor* visitor) override; 1296f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}; 1306f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 1316f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski/** 1326f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * A resource item with a single value. This maps to android::ResTable_entry. 1336f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski */ 1346f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskistruct Item : public Value { 1356f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski /** 1366f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Clone the Item. 1376f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski */ 138769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski virtual Item* clone(StringPool* newPool) const override = 0; 1396f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 1406f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski /** 1416f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Fills in an android::Res_value structure with this Item's binary representation. 1421ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski * Returns false if an error occurred. 1436f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski */ 1441ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski virtual bool flatten(android::Res_value* outValue) const = 0; 1456f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}; 1466f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 1476f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski/** 1486f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Inherit from this to get visitor accepting implementations for free. 1496f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski */ 1506f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskitemplate <typename Derived> 1516f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskistruct BaseItem : public Item { 1521ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski void accept(RawValueVisitor* visitor) override; 1536f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}; 1546f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 1556f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski/** 1566f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * A reference to another resource. This maps to android::Res_value::TYPE_REFERENCE. 1576f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * 1586f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * A reference can be symbolic (with the name set to a valid resource name) or be 1596f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * numeric (the id is set to a valid resource ID). 1606f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski */ 1616f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskistruct Reference : public BaseItem<Reference> { 1626f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski enum class Type { 1636f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski kResource, 1646f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski kAttribute, 1656f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski }; 1666f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 1671ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski Maybe<ResourceName> name; 1681ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski Maybe<ResourceId> id; 1696f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski Reference::Type referenceType; 1706f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski bool privateReference = false; 1716f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 1726f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski Reference(); 17359e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski explicit Reference(const ResourceNameRef& n, Type type = Type::kResource); 17459e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski explicit Reference(const ResourceId& i, Type type = Type::kResource); 1756f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 176458b877488c12ea4336d8fc00a95d9c0298bd6d0Adam Lesinski bool equals(const Value* value) const override; 1771ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski bool flatten(android::Res_value* outValue) const override; 178769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski Reference* clone(StringPool* newPool) const override; 1791ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski void print(std::ostream* out) const override; 1806f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}; 1816f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 1826f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski/** 1836f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * An ID resource. Has no real value, just a place holder. 1846f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski */ 1856f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskistruct Id : public BaseItem<Id> { 186393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski Id() { mWeak = true; } 187458b877488c12ea4336d8fc00a95d9c0298bd6d0Adam Lesinski bool equals(const Value* value) const override; 1881ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski bool flatten(android::Res_value* out) const override; 189769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski Id* clone(StringPool* newPool) const override; 1901ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski void print(std::ostream* out) const override; 1916f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}; 1926f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 1936f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski/** 1946f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * A raw, unprocessed string. This may contain quotations, 1956f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * escape sequences, and whitespace. This shall *NOT* 1966f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * end up in the final resource table. 1976f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski */ 1986f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskistruct RawString : public BaseItem<RawString> { 1996f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski StringPool::Ref value; 2006f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 2016f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski RawString(const StringPool::Ref& ref); 2026f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 203458b877488c12ea4336d8fc00a95d9c0298bd6d0Adam Lesinski bool equals(const Value* value) const override; 2041ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski bool flatten(android::Res_value* outValue) const override; 205769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski RawString* clone(StringPool* newPool) const override; 2061ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski void print(std::ostream* out) const override; 2076f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}; 2086f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 2096f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskistruct String : public BaseItem<String> { 2106f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski StringPool::Ref value; 2116f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 2126f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski String(const StringPool::Ref& ref); 2136f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 214458b877488c12ea4336d8fc00a95d9c0298bd6d0Adam Lesinski bool equals(const Value* value) const override; 2151ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski bool flatten(android::Res_value* outValue) const override; 216769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski String* clone(StringPool* newPool) const override; 2171ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski void print(std::ostream* out) const override; 2186f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}; 2196f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 2206f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskistruct StyledString : public BaseItem<StyledString> { 2216f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski StringPool::StyleRef value; 2226f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 2236f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski StyledString(const StringPool::StyleRef& ref); 2246f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 225458b877488c12ea4336d8fc00a95d9c0298bd6d0Adam Lesinski bool equals(const Value* value) const override; 2261ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski bool flatten(android::Res_value* outValue) const override; 227769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski StyledString* clone(StringPool* newPool) const override; 2281ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski void print(std::ostream* out) const override; 2296f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}; 2306f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 2316f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskistruct FileReference : public BaseItem<FileReference> { 2326f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski StringPool::Ref path; 2336f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 234355f285ffd000f6cfe76680eb22d010546d124bbAdam Lesinski /** 235355f285ffd000f6cfe76680eb22d010546d124bbAdam Lesinski * A handle to the file object from which this file can be read. 236355f285ffd000f6cfe76680eb22d010546d124bbAdam Lesinski */ 237355f285ffd000f6cfe76680eb22d010546d124bbAdam Lesinski io::IFile* file = nullptr; 238355f285ffd000f6cfe76680eb22d010546d124bbAdam Lesinski 2396f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski FileReference() = default; 2406f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski FileReference(const StringPool::Ref& path); 2416f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 242458b877488c12ea4336d8fc00a95d9c0298bd6d0Adam Lesinski bool equals(const Value* value) const override; 2431ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski bool flatten(android::Res_value* outValue) const override; 244769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski FileReference* clone(StringPool* newPool) const override; 2451ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski void print(std::ostream* out) const override; 2466f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}; 2476f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 2486f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski/** 2496f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Represents any other android::Res_value. 2506f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski */ 2516f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskistruct BinaryPrimitive : public BaseItem<BinaryPrimitive> { 2526f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski android::Res_value value; 2536f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 2546f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski BinaryPrimitive() = default; 2556f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski BinaryPrimitive(const android::Res_value& val); 2561ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski BinaryPrimitive(uint8_t dataType, uint32_t data); 2576f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 258458b877488c12ea4336d8fc00a95d9c0298bd6d0Adam Lesinski bool equals(const Value* value) const override; 2591ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski bool flatten(android::Res_value* outValue) const override; 260769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski BinaryPrimitive* clone(StringPool* newPool) const override; 2611ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski void print(std::ostream* out) const override; 2626f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}; 2636f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 2646f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskistruct Attribute : public BaseValue<Attribute> { 2656f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski struct Symbol { 2666f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski Reference symbol; 2676f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski uint32_t value; 2686f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski }; 2696f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 2706f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski uint32_t typeMask; 271a587065721053ad54e34f484868142407d59512dAdam Lesinski int32_t minInt; 272a587065721053ad54e34f484868142407d59512dAdam Lesinski int32_t maxInt; 2736f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski std::vector<Symbol> symbols; 2746f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 2756f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski Attribute(bool w, uint32_t t = 0u); 2766f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 277458b877488c12ea4336d8fc00a95d9c0298bd6d0Adam Lesinski bool equals(const Value* value) const override; 2781ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski Attribute* clone(StringPool* newPool) const override; 2791ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski void printMask(std::ostream* out) const; 2801ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski void print(std::ostream* out) const override; 281a587065721053ad54e34f484868142407d59512dAdam Lesinski bool matches(const Item* item, DiagMessage* outMsg) const; 2826f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}; 2836f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 2846f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskistruct Style : public BaseValue<Style> { 2856f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski struct Entry { 2866f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski Reference key; 2876f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski std::unique_ptr<Item> value; 2886f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski }; 2896f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 2901ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski Maybe<Reference> parent; 291bdaa092a193d8ddccbd9ad8434be97878e6ded59Adam Lesinski 292bdaa092a193d8ddccbd9ad8434be97878e6ded59Adam Lesinski /** 293bdaa092a193d8ddccbd9ad8434be97878e6ded59Adam Lesinski * If set to true, the parent was auto inferred from the 294bdaa092a193d8ddccbd9ad8434be97878e6ded59Adam Lesinski * style's name. 295bdaa092a193d8ddccbd9ad8434be97878e6ded59Adam Lesinski */ 296bdaa092a193d8ddccbd9ad8434be97878e6ded59Adam Lesinski bool parentInferred = false; 297bdaa092a193d8ddccbd9ad8434be97878e6ded59Adam Lesinski 2986f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski std::vector<Entry> entries; 2996f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 300458b877488c12ea4336d8fc00a95d9c0298bd6d0Adam Lesinski bool equals(const Value* value) const override; 301769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski Style* clone(StringPool* newPool) const override; 3021ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski void print(std::ostream* out) const override; 3036f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}; 3046f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 3056f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskistruct Array : public BaseValue<Array> { 3066f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski std::vector<std::unique_ptr<Item>> items; 3076f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 308458b877488c12ea4336d8fc00a95d9c0298bd6d0Adam Lesinski bool equals(const Value* value) const override; 309769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski Array* clone(StringPool* newPool) const override; 3101ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski void print(std::ostream* out) const override; 3116f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}; 3126f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 3136f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskistruct Plural : public BaseValue<Plural> { 3146f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski enum { 3156f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski Zero = 0, 3166f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski One, 3176f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski Two, 3186f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski Few, 3196f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski Many, 3206f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski Other, 3216f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski Count 3226f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski }; 3236f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 3246f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski std::array<std::unique_ptr<Item>, Count> values; 3256f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 326458b877488c12ea4336d8fc00a95d9c0298bd6d0Adam Lesinski bool equals(const Value* value) const override; 327769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski Plural* clone(StringPool* newPool) const override; 3281ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski void print(std::ostream* out) const override; 3296f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}; 3306f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 3316f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskistruct Styleable : public BaseValue<Styleable> { 3326f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski std::vector<Reference> entries; 3336f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 334458b877488c12ea4336d8fc00a95d9c0298bd6d0Adam Lesinski bool equals(const Value* value) const override; 335769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski Styleable* clone(StringPool* newPool) const override; 3361ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski void print(std::ostream* out) const override; 3376f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}; 3386f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 3396f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski/** 3406f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Stream operator for printing Value objects. 3416f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski */ 3426f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiinline ::std::ostream& operator<<(::std::ostream& out, const Value& value) { 3431ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski value.print(&out); 3446f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski return out; 3456f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} 3466f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 347330edcdf1316ed599fe0eb16a64330821fd92f18Adam Lesinskiinline ::std::ostream& operator<<(::std::ostream& out, const Attribute::Symbol& s) { 3481ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski if (s.symbol.name) { 3491ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski out << s.symbol.name.value().entry; 3501ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski } else { 3511ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski out << "???"; 3526f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski } 3531ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski return out << "=" << s.value; 3546f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} 3556f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 3566f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} // namespace aapt 3576f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 3586f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#endif // AAPT_RESOURCE_VALUES_H 359