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