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 576f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski /** 58e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski * Returns the source where this value was defined. 59e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski */ 60e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski const Source& getSource() const { 61e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski return mSource; 62e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski } 63e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski 64e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski void setSource(const Source& source) { 65e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski mSource = source; 66e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski } 67e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski 68e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski void setSource(Source&& source) { 69e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski mSource = std::move(source); 70e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski } 71e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski 72e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski /** 73e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski * Returns the comment that was associated with this resource. 74e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski */ 75e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski StringPiece16 getComment() const { 76e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski return mComment; 77e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski } 78e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski 79e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski void setComment(const StringPiece16& str) { 80e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski mComment = str.toString(); 81e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski } 82e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski 83e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski void setComment(std::u16string&& str) { 84e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski mComment = std::move(str); 85e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski } 86e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski 87e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski /** 886f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Calls the appropriate overload of ValueVisitor. 896f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski */ 901ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski virtual void accept(RawValueVisitor* visitor) = 0; 916f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 926f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski /** 936f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Clone the value. 946f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski */ 95769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski virtual Value* clone(StringPool* newPool) const = 0; 966f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 976f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski /** 986f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Human readable printout of this value. 996f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski */ 1001ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski virtual void print(std::ostream* out) const = 0; 101e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski 102b274e35abfbbd09e0fce983a215c11522c56cce2Adam Lesinskiprotected: 103e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski Source mSource; 104e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski std::u16string mComment; 105393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski bool mWeak = false; 1066f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}; 1076f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 1086f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski/** 1096f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Inherit from this to get visitor accepting implementations for free. 1106f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski */ 1116f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskitemplate <typename Derived> 1126f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskistruct BaseValue : public Value { 1131ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski void accept(RawValueVisitor* visitor) override; 1146f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}; 1156f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 1166f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski/** 1176f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * A resource item with a single value. This maps to android::ResTable_entry. 1186f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski */ 1196f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskistruct Item : public Value { 1206f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski /** 1216f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Clone the Item. 1226f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski */ 123769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski virtual Item* clone(StringPool* newPool) const override = 0; 1246f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 1256f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski /** 1266f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Fills in an android::Res_value structure with this Item's binary representation. 1271ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski * Returns false if an error occurred. 1286f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski */ 1291ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski virtual bool flatten(android::Res_value* outValue) const = 0; 1306f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}; 1316f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 1326f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski/** 1336f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Inherit from this to get visitor accepting implementations for free. 1346f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski */ 1356f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskitemplate <typename Derived> 1366f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskistruct BaseItem : public Item { 1371ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski void accept(RawValueVisitor* visitor) override; 1386f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}; 1396f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 1406f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski/** 1416f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * A reference to another resource. This maps to android::Res_value::TYPE_REFERENCE. 1426f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * 1436f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * A reference can be symbolic (with the name set to a valid resource name) or be 1446f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * numeric (the id is set to a valid resource ID). 1456f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski */ 1466f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskistruct Reference : public BaseItem<Reference> { 1476f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski enum class Type { 1486f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski kResource, 1496f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski kAttribute, 1506f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski }; 1516f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 1521ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski Maybe<ResourceName> name; 1531ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski Maybe<ResourceId> id; 1546f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski Reference::Type referenceType; 1556f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski bool privateReference = false; 1566f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 1576f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski Reference(); 15859e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski explicit Reference(const ResourceNameRef& n, Type type = Type::kResource); 15959e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski explicit Reference(const ResourceId& i, Type type = Type::kResource); 1606f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 1611ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski bool flatten(android::Res_value* outValue) const override; 162769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski Reference* clone(StringPool* newPool) const override; 1631ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski void print(std::ostream* out) const override; 1646f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}; 1656f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 1666f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski/** 1676f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * An ID resource. Has no real value, just a place holder. 1686f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski */ 1696f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskistruct Id : public BaseItem<Id> { 170393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski Id() { mWeak = true; } 1711ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski bool flatten(android::Res_value* out) const override; 172769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski Id* clone(StringPool* newPool) const override; 1731ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski void print(std::ostream* out) const override; 1746f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}; 1756f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 1766f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski/** 1776f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * A raw, unprocessed string. This may contain quotations, 1786f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * escape sequences, and whitespace. This shall *NOT* 1796f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * end up in the final resource table. 1806f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski */ 1816f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskistruct RawString : public BaseItem<RawString> { 1826f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski StringPool::Ref value; 1836f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 1846f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski RawString(const StringPool::Ref& ref); 1856f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 1861ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski bool flatten(android::Res_value* outValue) const override; 187769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski RawString* clone(StringPool* newPool) const override; 1881ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski void print(std::ostream* out) const override; 1896f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}; 1906f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 1916f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskistruct String : public BaseItem<String> { 1926f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski StringPool::Ref value; 1936f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 1946f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski String(const StringPool::Ref& ref); 1956f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 196393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski // Whether the string is marked as translateable. This does not persist when flattened. 197393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski // It is only used during compilation phase. 198393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski void setTranslateable(bool val); 199393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski bool isTranslateable() const; 200393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski 2011ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski bool flatten(android::Res_value* outValue) const override; 202769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski String* clone(StringPool* newPool) const override; 2031ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski void print(std::ostream* out) const override; 204393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski 205393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinskiprivate: 206393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski bool mTranslateable; 2076f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}; 2086f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 2096f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskistruct StyledString : public BaseItem<StyledString> { 2106f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski StringPool::StyleRef value; 2116f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 2126f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski StyledString(const StringPool::StyleRef& ref); 2136f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 214393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski // Whether the string is marked as translateable. This does not persist when flattened. 215393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski // It is only used during compilation phase. 216393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski void setTranslateable(bool val); 217393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski bool isTranslateable() const; 218393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski 2191ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski bool flatten(android::Res_value* outValue) const override; 220769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski StyledString* clone(StringPool* newPool) const override; 2211ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski void print(std::ostream* out) const override; 222393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski 223393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinskiprivate: 224393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski bool mTranslateable; 2256f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}; 2266f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 2276f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskistruct FileReference : public BaseItem<FileReference> { 2286f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski StringPool::Ref path; 2296f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 230355f285ffd000f6cfe76680eb22d010546d124bbAdam Lesinski /** 231355f285ffd000f6cfe76680eb22d010546d124bbAdam Lesinski * A handle to the file object from which this file can be read. 232355f285ffd000f6cfe76680eb22d010546d124bbAdam Lesinski */ 233355f285ffd000f6cfe76680eb22d010546d124bbAdam Lesinski io::IFile* file = nullptr; 234355f285ffd000f6cfe76680eb22d010546d124bbAdam Lesinski 2356f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski FileReference() = default; 2366f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski FileReference(const StringPool::Ref& path); 2376f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 2381ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski bool flatten(android::Res_value* outValue) const override; 239769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski FileReference* clone(StringPool* newPool) const override; 2401ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski void print(std::ostream* out) const override; 2416f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}; 2426f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 2436f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski/** 2446f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Represents any other android::Res_value. 2456f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski */ 2466f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskistruct BinaryPrimitive : public BaseItem<BinaryPrimitive> { 2476f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski android::Res_value value; 2486f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 2496f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski BinaryPrimitive() = default; 2506f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski BinaryPrimitive(const android::Res_value& val); 2511ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski BinaryPrimitive(uint8_t dataType, uint32_t data); 2526f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 2531ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski bool flatten(android::Res_value* outValue) const override; 254769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski BinaryPrimitive* clone(StringPool* newPool) const override; 2551ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski void print(std::ostream* out) const override; 2566f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}; 2576f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 2586f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskistruct Attribute : public BaseValue<Attribute> { 2596f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski struct Symbol { 2606f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski Reference symbol; 2616f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski uint32_t value; 2626f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski }; 2636f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 2646f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski uint32_t typeMask; 265a587065721053ad54e34f484868142407d59512dAdam Lesinski int32_t minInt; 266a587065721053ad54e34f484868142407d59512dAdam Lesinski int32_t maxInt; 2676f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski std::vector<Symbol> symbols; 2686f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 2696f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski Attribute(bool w, uint32_t t = 0u); 2706f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 2711ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski Attribute* clone(StringPool* newPool) const override; 2721ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski void printMask(std::ostream* out) const; 2731ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski void print(std::ostream* out) const override; 274a587065721053ad54e34f484868142407d59512dAdam Lesinski bool matches(const Item* item, DiagMessage* outMsg) const; 2756f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}; 2766f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 2776f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskistruct Style : public BaseValue<Style> { 2786f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski struct Entry { 2796f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski Reference key; 2806f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski std::unique_ptr<Item> value; 2816f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski }; 2826f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 2831ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski Maybe<Reference> parent; 284bdaa092a193d8ddccbd9ad8434be97878e6ded59Adam Lesinski 285bdaa092a193d8ddccbd9ad8434be97878e6ded59Adam Lesinski /** 286bdaa092a193d8ddccbd9ad8434be97878e6ded59Adam Lesinski * If set to true, the parent was auto inferred from the 287bdaa092a193d8ddccbd9ad8434be97878e6ded59Adam Lesinski * style's name. 288bdaa092a193d8ddccbd9ad8434be97878e6ded59Adam Lesinski */ 289bdaa092a193d8ddccbd9ad8434be97878e6ded59Adam Lesinski bool parentInferred = false; 290bdaa092a193d8ddccbd9ad8434be97878e6ded59Adam Lesinski 2916f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski std::vector<Entry> entries; 2926f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 293769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski Style* clone(StringPool* newPool) const override; 2941ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski void print(std::ostream* out) const override; 2956f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}; 2966f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 2976f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskistruct Array : public BaseValue<Array> { 2986f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski std::vector<std::unique_ptr<Item>> items; 2996f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 300769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski Array* clone(StringPool* newPool) const override; 3011ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski void print(std::ostream* out) const override; 3026f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}; 3036f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 3046f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskistruct Plural : public BaseValue<Plural> { 3056f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski enum { 3066f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski Zero = 0, 3076f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski One, 3086f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski Two, 3096f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski Few, 3106f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski Many, 3116f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski Other, 3126f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski Count 3136f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski }; 3146f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 3156f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski std::array<std::unique_ptr<Item>, Count> values; 3166f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 317769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski Plural* clone(StringPool* newPool) const override; 3181ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski void print(std::ostream* out) const override; 3196f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}; 3206f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 3216f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskistruct Styleable : public BaseValue<Styleable> { 3226f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski std::vector<Reference> entries; 3236f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 324769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski Styleable* clone(StringPool* newPool) const override; 3251ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski void print(std::ostream* out) const override; 3266f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}; 3276f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 3286f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski/** 3296f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Stream operator for printing Value objects. 3306f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski */ 3316f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiinline ::std::ostream& operator<<(::std::ostream& out, const Value& value) { 3321ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski value.print(&out); 3336f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski return out; 3346f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} 3356f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 336330edcdf1316ed599fe0eb16a64330821fd92f18Adam Lesinskiinline ::std::ostream& operator<<(::std::ostream& out, const Attribute::Symbol& s) { 3371ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski if (s.symbol.name) { 3381ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski out << s.symbol.name.value().entry; 3391ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski } else { 3401ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski out << "???"; 3416f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski } 3421ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski return out << "=" << s.value; 3436f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} 3446f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 3456f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} // namespace aapt 3466f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 3476f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#endif // AAPT_RESOURCE_VALUES_H 348