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