ResourceTable.h revision beb9e33bfb79847c25aac98e39f3ea620a953ef7
1282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski//
2282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// Copyright 2006 The Android Open Source Project
3282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski//
4282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// Build resource files from raw assets.
5282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski//
6282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
7282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#ifndef RESOURCE_TABLE_H
8282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#define RESOURCE_TABLE_H
9282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
10282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include <map>
11e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski#include <queue>
12e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski#include <set>
13282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
14de7de47fef1dcaa26d553665d89e4d3792325c3fAdam Lesinski#include "ConfigDescription.h"
15de7de47fef1dcaa26d553665d89e4d3792325c3fAdam Lesinski#include "ResourceFilter.h"
16de7de47fef1dcaa26d553665d89e4d3792325c3fAdam Lesinski#include "SourcePos.h"
17de7de47fef1dcaa26d553665d89e4d3792325c3fAdam Lesinski#include "StringPool.h"
18de7de47fef1dcaa26d553665d89e4d3792325c3fAdam Lesinski#include "Symbol.h"
19de7de47fef1dcaa26d553665d89e4d3792325c3fAdam Lesinski
20282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiclass XMLNode;
21282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiclass ResourceTable;
22282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
23282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskienum {
24282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    XML_COMPILE_STRIP_COMMENTS = 1<<0,
25282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    XML_COMPILE_ASSIGN_ATTRIBUTE_IDS = 1<<1,
26282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    XML_COMPILE_COMPACT_WHITESPACE = 1<<2,
27282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    XML_COMPILE_STRIP_WHITESPACE = 1<<3,
28282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    XML_COMPILE_STRIP_RAW_VALUES = 1<<4,
29282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    XML_COMPILE_UTF8 = 1<<5,
30030f536009b56dbcc23d284541e51562bd9a6ed3Dan Albert
31282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    XML_COMPILE_STANDARD_RESOURCE =
32282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            XML_COMPILE_STRIP_COMMENTS | XML_COMPILE_ASSIGN_ATTRIBUTE_IDS
33282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            | XML_COMPILE_STRIP_WHITESPACE | XML_COMPILE_STRIP_RAW_VALUES
34282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski};
35282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
36e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinskistatus_t compileXmlFile(const Bundle* bundle,
37e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski                        const sp<AaptAssets>& assets,
38e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski                        const String16& resourceName,
39282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        const sp<AaptFile>& target,
40282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        ResourceTable* table,
41282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        int options = XML_COMPILE_STANDARD_RESOURCE);
42282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
43e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinskistatus_t compileXmlFile(const Bundle* bundle,
44e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski                        const sp<AaptAssets>& assets,
45e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski                        const String16& resourceName,
46282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        const sp<AaptFile>& target,
47282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        const sp<AaptFile>& outTarget,
48282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        ResourceTable* table,
49282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        int options = XML_COMPILE_STANDARD_RESOURCE);
50282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
51e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinskistatus_t compileXmlFile(const Bundle* bundle,
52e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski                        const sp<AaptAssets>& assets,
53e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski                        const String16& resourceName,
54282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        const sp<XMLNode>& xmlTree,
55282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        const sp<AaptFile>& target,
56282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        ResourceTable* table,
57282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        int options = XML_COMPILE_STANDARD_RESOURCE);
58282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
59282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistatus_t compileResourceFile(Bundle* bundle,
60282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                             const sp<AaptAssets>& assets,
61282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                             const sp<AaptFile>& in,
62282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                             const ResTable_config& defParams,
63282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                             const bool overwrite,
64282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                             ResourceTable* outTable);
65282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
66282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistruct AccessorCookie
67282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
68282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    SourcePos sourcePos;
69282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    String8 attr;
70282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    String8 value;
71282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
72282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    AccessorCookie(const SourcePos&p, const String8& a, const String8& v)
73282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        :sourcePos(p),
74282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski         attr(a),
75282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski         value(v)
76282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    {
77282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
78282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski};
79282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
80e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski// Holds the necessary information to compile the
81e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski// resource.
82e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinskistruct CompileResourceWorkItem {
83e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski    String16 resourceName;
84e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski    String8 resPath;
85e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski    sp<AaptFile> file;
86e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski};
87e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski
88282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiclass ResourceTable : public ResTable::Accessor
89282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
90282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskipublic:
91833f3ccbc8f4dd1ec8abb9121988b99ff34ec4c1Adam Lesinski    // The type of package to build.
92833f3ccbc8f4dd1ec8abb9121988b99ff34ec4c1Adam Lesinski    enum PackageType {
93833f3ccbc8f4dd1ec8abb9121988b99ff34ec4c1Adam Lesinski        App,
94833f3ccbc8f4dd1ec8abb9121988b99ff34ec4c1Adam Lesinski        System,
95833f3ccbc8f4dd1ec8abb9121988b99ff34ec4c1Adam Lesinski        SharedLibrary,
96833f3ccbc8f4dd1ec8abb9121988b99ff34ec4c1Adam Lesinski        AppFeature
97833f3ccbc8f4dd1ec8abb9121988b99ff34ec4c1Adam Lesinski    };
98833f3ccbc8f4dd1ec8abb9121988b99ff34ec4c1Adam Lesinski
99282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    class Package;
100282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    class Type;
101282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    class Entry;
102beb9e33bfb79847c25aac98e39f3ea620a953ef7Adam Lesinski    class ConfigList;
103beb9e33bfb79847c25aac98e39f3ea620a953ef7Adam Lesinski
104beb9e33bfb79847c25aac98e39f3ea620a953ef7Adam Lesinski    /**
105beb9e33bfb79847c25aac98e39f3ea620a953ef7Adam Lesinski     * Exposed for testing. Determines whether a versioned resource should be generated
106beb9e33bfb79847c25aac98e39f3ea620a953ef7Adam Lesinski     * based on the other available configurations for that resource.
107beb9e33bfb79847c25aac98e39f3ea620a953ef7Adam Lesinski     */
108beb9e33bfb79847c25aac98e39f3ea620a953ef7Adam Lesinski    static bool shouldGenerateVersionedResource(const sp<ConfigList>& configList,
109beb9e33bfb79847c25aac98e39f3ea620a953ef7Adam Lesinski                                                const ConfigDescription& sourceConfig,
110beb9e33bfb79847c25aac98e39f3ea620a953ef7Adam Lesinski                                                const int sdkVersionToGenerate);
111282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
112833f3ccbc8f4dd1ec8abb9121988b99ff34ec4c1Adam Lesinski    ResourceTable(Bundle* bundle, const String16& assetsPackage, PackageType type);
113833f3ccbc8f4dd1ec8abb9121988b99ff34ec4c1Adam Lesinski
114833f3ccbc8f4dd1ec8abb9121988b99ff34ec4c1Adam Lesinski    const String16& getAssetsPackage() const {
115833f3ccbc8f4dd1ec8abb9121988b99ff34ec4c1Adam Lesinski        return mAssetsPackage;
116833f3ccbc8f4dd1ec8abb9121988b99ff34ec4c1Adam Lesinski    }
117282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
118e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski    /**
119e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski     * Returns the queue of resources that need to be compiled.
120e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski     * This is only used for resources that have been generated
121e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski     * during the compilation phase. If they were just added
122e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski     * to the AaptAssets, then they may be skipped over
123e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski     * and would mess up iteration order for the existing
124e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski     * resources.
125e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski     */
126030f536009b56dbcc23d284541e51562bd9a6ed3Dan Albert    std::queue<CompileResourceWorkItem>& getWorkQueue() {
127e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski        return mWorkQueue;
128e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski    }
129e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski
130282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    status_t addIncludedResources(Bundle* bundle, const sp<AaptAssets>& assets);
131282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
132282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    status_t addPublic(const SourcePos& pos,
133282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                       const String16& package,
134282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                       const String16& type,
135282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                       const String16& name,
136282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                       const uint32_t ident);
137282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
138282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    status_t addEntry(const SourcePos& pos,
139282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                      const String16& package,
140282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                      const String16& type,
141282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                      const String16& name,
142282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                      const String16& value,
143282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                      const Vector<StringPool::entry_style_span>* style = NULL,
144282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                      const ResTable_config* params = NULL,
145282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                      const bool doSetIndex = false,
146282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                      const int32_t format = ResTable_map::TYPE_ANY,
147282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                      const bool overwrite = false);
148282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
149282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    status_t startBag(const SourcePos& pos,
150282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    const String16& package,
151282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    const String16& type,
152282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    const String16& name,
153282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    const String16& bagParent,
154282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    const ResTable_config* params = NULL,
155282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    bool overlay = false,
156282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    bool replace = false,
157282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    bool isId = false);
158282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
159282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    status_t addBag(const SourcePos& pos,
160282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    const String16& package,
161282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    const String16& type,
162282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    const String16& name,
163282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    const String16& bagParent,
164282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    const String16& bagKey,
165282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    const String16& value,
166282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    const Vector<StringPool::entry_style_span>* style = NULL,
167282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    const ResTable_config* params = NULL,
168282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    bool replace = false,
169282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    bool isId = false,
170282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    const int32_t format = ResTable_map::TYPE_ANY);
171282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
172282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    bool hasBagOrEntry(const String16& package,
173282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                       const String16& type,
174282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                       const String16& name) const;
175282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
176282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    bool hasBagOrEntry(const String16& package,
177282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                       const String16& type,
178282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                       const String16& name,
179282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                       const ResTable_config& config) const;
180282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
181282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    bool hasBagOrEntry(const String16& ref,
182282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                       const String16* defType = NULL,
183282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                       const String16* defPackage = NULL);
184282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
185282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    bool appendComment(const String16& package,
186282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                       const String16& type,
187282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                       const String16& name,
188282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                       const String16& comment,
189282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                       bool onlyIfEmpty = false);
190282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
191282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    bool appendTypeComment(const String16& package,
192282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                           const String16& type,
193282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                           const String16& name,
194282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                           const String16& comment);
195282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
196282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    void canAddEntry(const SourcePos& pos,
197282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const String16& package, const String16& type, const String16& name);
198282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
199282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    size_t size() const;
200282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    size_t numLocalResources() const;
201282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    bool hasResources() const;
202282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
20382a2dd8efe48d3a4e04655f01329da857ace4b7dAdam Lesinski    status_t modifyForCompat(const Bundle* bundle);
204e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski    status_t modifyForCompat(const Bundle* bundle,
205e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski                             const String16& resourceName,
206e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski                             const sp<AaptFile>& file,
207e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski                             const sp<XMLNode>& root);
20882a2dd8efe48d3a4e04655f01329da857ace4b7dAdam Lesinski
20927f69f4e06961fdecd1078b2292d764a157e5e1cAdam Lesinski    sp<AaptFile> flatten(Bundle* bundle, const sp<const ResourceFilter>& filter,
21027f69f4e06961fdecd1078b2292d764a157e5e1cAdam Lesinski            const bool isBase);
211282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
212282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    static inline uint32_t makeResId(uint32_t packageId,
213282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                     uint32_t typeId,
214282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                     uint32_t nameId)
215282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    {
216282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return nameId | (typeId<<16) | (packageId<<24);
217282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
218282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
219282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    static inline uint32_t getResId(const sp<Package>& p,
220282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                    const sp<Type>& t,
221282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                    uint32_t nameId);
222282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
223282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    uint32_t getResId(const String16& package,
224282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                      const String16& type,
225282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                      const String16& name,
226282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                      bool onlyPublic = true) const;
227282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
228282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    uint32_t getResId(const String16& ref,
229282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                      const String16* defType = NULL,
230282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                      const String16* defPackage = NULL,
231282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                      const char** outErrorMsg = NULL,
232282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                      bool onlyPublic = true) const;
233282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
234282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    static bool isValidResourceName(const String16& s);
235282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
236282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    bool stringToValue(Res_value* outValue, StringPool* pool,
237282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                       const String16& str,
238282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                       bool preserveSpaces, bool coerceType,
239282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                       uint32_t attrID,
240282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                       const Vector<StringPool::entry_style_span>* style = NULL,
241282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                       String16* outStr = NULL, void* accessorCookie = NULL,
242282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                       uint32_t attrType = ResTable_map::TYPE_ANY,
243282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                       const String8* configTypeName = NULL,
244282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                       const ConfigDescription* config = NULL);
245282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
246282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    status_t assignResourceIds();
2475892248580859620db90d5ef2e3c2f48531933faAdrian Roos    status_t addSymbols(const sp<AaptSymbols>& outSymbols = NULL,
2485892248580859620db90d5ef2e3c2f48531933faAdrian Roos                        bool skipSymbolsWithoutDefaultLocalization = false);
249a01a9374fd386f3a8773528d7a49bc5315492dffAdam Lesinski    void addLocalization(const String16& name, const String8& locale, const SourcePos& src);
2505892248580859620db90d5ef2e3c2f48531933faAdrian Roos    void addDefaultLocalization(const String16& name);
251282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    status_t validateLocalizations(void);
252282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
25327f69f4e06961fdecd1078b2292d764a157e5e1cAdam Lesinski    status_t flatten(Bundle* bundle, const sp<const ResourceFilter>& filter,
25427f69f4e06961fdecd1078b2292d764a157e5e1cAdam Lesinski            const sp<AaptFile>& dest, const bool isBase);
255de898ff42912bd7ca1bfb099cd439562496765a4Adam Lesinski    status_t flattenLibraryTable(const sp<AaptFile>& dest, const Vector<sp<Package> >& libs);
256282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
257282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    void writePublicDefinitions(const String16& package, FILE* fp);
258282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
259282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual uint32_t getCustomResource(const String16& package,
260282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                       const String16& type,
261282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                       const String16& name) const;
262282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual uint32_t getCustomResourceWithCreation(const String16& package,
263282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                   const String16& type,
264282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                   const String16& name,
265282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                   const bool createIfNeeded);
266282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual uint32_t getRemappedPackage(uint32_t origPackage) const;
267282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual bool getAttributeType(uint32_t attrID, uint32_t* outType);
268282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual bool getAttributeMin(uint32_t attrID, uint32_t* outMin);
269282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual bool getAttributeMax(uint32_t attrID, uint32_t* outMax);
270282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual bool getAttributeKeys(uint32_t attrID, Vector<String16>* outKeys);
271282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual bool getAttributeEnum(uint32_t attrID,
272282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                  const char16_t* name, size_t nameLen,
273282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                  Res_value* outValue);
274282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual bool getAttributeFlags(uint32_t attrID,
275282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                   const char16_t* name, size_t nameLen,
276282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                   Res_value* outValue);
277282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual uint32_t getAttributeL10N(uint32_t attrID);
278282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
279282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual bool getLocalizationSetting();
280282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual void reportError(void* accessorCookie, const char* fmt, ...);
281282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
282282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    void setCurrentXmlPos(const SourcePos& pos) { mCurrentXmlPos = pos; }
283282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
284282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    class Item {
285282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public:
286282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        Item() : isId(false), format(ResTable_map::TYPE_ANY), bagKeyId(0), evaluating(false)
287282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            { memset(&parsedValue, 0, sizeof(parsedValue)); }
288282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        Item(const SourcePos& pos,
289282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski             bool _isId,
290282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski             const String16& _value,
291282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski             const Vector<StringPool::entry_style_span>* _style = NULL,
292282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski             int32_t format = ResTable_map::TYPE_ANY);
293282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        Item(const Item& o) : sourcePos(o.sourcePos),
294282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            isId(o.isId), value(o.value), style(o.style),
295282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            format(o.format), bagKeyId(o.bagKeyId), evaluating(false) {
296282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            memset(&parsedValue, 0, sizeof(parsedValue));
297282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
298282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        ~Item() { }
299282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
300282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        Item& operator=(const Item& o) {
301282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            sourcePos = o.sourcePos;
302282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            isId = o.isId;
303282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            value = o.value;
304282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            style = o.style;
305282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            format = o.format;
306282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            bagKeyId = o.bagKeyId;
307282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            parsedValue = o.parsedValue;
308282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return *this;
309282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
310282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
311282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        SourcePos                               sourcePos;
312282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mutable bool                            isId;
313282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        String16                                value;
314282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        Vector<StringPool::entry_style_span>    style;
315282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        int32_t                                 format;
316282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        uint32_t                                bagKeyId;
317282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mutable bool                            evaluating;
318282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        Res_value                               parsedValue;
319282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    };
320282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
321282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    class Entry : public RefBase {
322282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public:
323282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        Entry(const String16& name, const SourcePos& pos)
324282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            : mName(name), mType(TYPE_UNKNOWN),
325282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski              mItemFormat(ResTable_map::TYPE_ANY), mNameIndex(-1), mPos(pos)
326282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        { }
32782a2dd8efe48d3a4e04655f01329da857ace4b7dAdam Lesinski
32882a2dd8efe48d3a4e04655f01329da857ace4b7dAdam Lesinski        Entry(const Entry& entry);
329978ab9d92934b79409638cf220de3002fea8d505Adam Lesinski        Entry& operator=(const Entry& entry);
33082a2dd8efe48d3a4e04655f01329da857ace4b7dAdam Lesinski
331282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        virtual ~Entry() { }
332282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
333282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        enum type {
334282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            TYPE_UNKNOWN = 0,
335282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            TYPE_ITEM,
336282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            TYPE_BAG
337282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        };
338282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
339282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        String16 getName() const { return mName; }
340282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        type getType() const { return mType; }
341282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
342282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        void setParent(const String16& parent) { mParent = parent; }
343282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        String16 getParent() const { return mParent; }
344282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
345282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        status_t makeItABag(const SourcePos& sourcePos);
346282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
347282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        status_t emptyBag(const SourcePos& sourcePos);
348282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
349282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        status_t setItem(const SourcePos& pos,
350282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                         const String16& value,
351282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                         const Vector<StringPool::entry_style_span>* style = NULL,
352282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                         int32_t format = ResTable_map::TYPE_ANY,
353282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                         const bool overwrite = false);
354282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
355282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        status_t addToBag(const SourcePos& pos,
356282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                          const String16& key, const String16& value,
357282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                          const Vector<StringPool::entry_style_span>* style = NULL,
358282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                          bool replace=false, bool isId = false,
359282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                          int32_t format = ResTable_map::TYPE_ANY);
360282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
36182a2dd8efe48d3a4e04655f01329da857ace4b7dAdam Lesinski        status_t removeFromBag(const String16& key);
36282a2dd8efe48d3a4e04655f01329da857ace4b7dAdam Lesinski
363282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // Index of the entry's name string in the key pool.
364282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        int32_t getNameIndex() const { return mNameIndex; }
365282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        void setNameIndex(int32_t index) { mNameIndex = index; }
366282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
367282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const Item* getItem() const { return mType == TYPE_ITEM ? &mItem : NULL; }
368282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const KeyedVector<String16, Item>& getBag() const { return mBag; }
369282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
370282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        status_t generateAttributes(ResourceTable* table,
371282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                    const String16& package);
372282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
373282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        status_t assignResourceIds(ResourceTable* table,
374282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                   const String16& package);
375282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
376282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        status_t prepareFlatten(StringPool* strings, ResourceTable* table,
377282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski               const String8* configTypeName, const ConfigDescription* config);
378282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
379282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        status_t remapStringValue(StringPool* strings);
380282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
381282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        ssize_t flatten(Bundle*, const sp<AaptFile>& data, bool isPublic);
382282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
383282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const SourcePos& getPos() const { return mPos; }
384282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
385282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    private:
386282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        String16 mName;
387282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        String16 mParent;
388282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        type mType;
389282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        Item mItem;
390282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        int32_t mItemFormat;
391282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        KeyedVector<String16, Item> mBag;
392282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        int32_t mNameIndex;
393282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        uint32_t mParentId;
394282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        SourcePos mPos;
395282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    };
396282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
397282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    class ConfigList : public RefBase {
398282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public:
399282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        ConfigList(const String16& name, const SourcePos& pos)
400282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            : mName(name), mPos(pos), mPublic(false), mEntryIndex(-1) { }
401282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        virtual ~ConfigList() { }
402282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
403282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        String16 getName() const { return mName; }
404282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const SourcePos& getPos() const { return mPos; }
405282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
406282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        void appendComment(const String16& comment, bool onlyIfEmpty = false);
407282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const String16& getComment() const { return mComment; }
408282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
409282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        void appendTypeComment(const String16& comment);
410282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const String16& getTypeComment() const { return mTypeComment; }
411282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
412282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // Index of this entry in its Type.
413282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        int32_t getEntryIndex() const { return mEntryIndex; }
414282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        void setEntryIndex(int32_t index) { mEntryIndex = index; }
415282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
416282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        void setPublic(bool pub) { mPublic = pub; }
417282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        bool getPublic() const { return mPublic; }
418282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        void setPublicSourcePos(const SourcePos& pos) { mPublicSourcePos = pos; }
419282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const SourcePos& getPublicSourcePos() { return mPublicSourcePos; }
420282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
421282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        void addEntry(const ResTable_config& config, const sp<Entry>& entry) {
422282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mEntries.add(config, entry);
423282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
424282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
425282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const DefaultKeyedVector<ConfigDescription, sp<Entry> >& getEntries() const { return mEntries; }
426282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    private:
427282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const String16 mName;
428282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const SourcePos mPos;
429282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        String16 mComment;
430282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        String16 mTypeComment;
431282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        bool mPublic;
432282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        SourcePos mPublicSourcePos;
433282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        int32_t mEntryIndex;
434282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        DefaultKeyedVector<ConfigDescription, sp<Entry> > mEntries;
435282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    };
436282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
437282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    class Public {
438282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public:
439282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        Public() : sourcePos(), ident(0) { }
440282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        Public(const SourcePos& pos,
441282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski               const String16& _comment,
442282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski               uint32_t _ident)
443282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            : sourcePos(pos),
444282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            comment(_comment), ident(_ident) { }
445282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        Public(const Public& o) : sourcePos(o.sourcePos),
446282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            comment(o.comment), ident(o.ident) { }
447282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        ~Public() { }
448282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
449282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        Public& operator=(const Public& o) {
450282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            sourcePos = o.sourcePos;
451282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            comment = o.comment;
452282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            ident = o.ident;
453282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return *this;
454282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
455282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
456282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        SourcePos   sourcePos;
457282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        String16    comment;
458282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        uint32_t    ident;
459282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    };
460282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
461282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    class Type : public RefBase {
462282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public:
463282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        Type(const String16& name, const SourcePos& pos)
464282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                : mName(name), mFirstPublicSourcePos(NULL), mPublicIndex(-1), mIndex(-1), mPos(pos)
465282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        { }
466282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        virtual ~Type() { delete mFirstPublicSourcePos; }
467282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
468282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        status_t addPublic(const SourcePos& pos,
469282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                           const String16& name,
470282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                           const uint32_t ident);
471282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
472282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        void canAddEntry(const String16& name);
473282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
474282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        String16 getName() const { return mName; }
475282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        sp<Entry> getEntry(const String16& entry,
476282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                           const SourcePos& pos,
477282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                           const ResTable_config* config = NULL,
478282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                           bool doSetIndex = false,
479282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                           bool overlay = false,
480282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                           bool autoAddOverlay = false);
481282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
4829b624c186cb6059dfb3ec24bfb6386a0fc17b88cAdam Lesinski        bool isPublic(const String16& entry) const {
4839b624c186cb6059dfb3ec24bfb6386a0fc17b88cAdam Lesinski            return mPublic.indexOfKey(entry) >= 0;
4849b624c186cb6059dfb3ec24bfb6386a0fc17b88cAdam Lesinski        }
4859b624c186cb6059dfb3ec24bfb6386a0fc17b88cAdam Lesinski
4869b624c186cb6059dfb3ec24bfb6386a0fc17b88cAdam Lesinski        sp<ConfigList> removeEntry(const String16& entry);
4879b624c186cb6059dfb3ec24bfb6386a0fc17b88cAdam Lesinski
4889b624c186cb6059dfb3ec24bfb6386a0fc17b88cAdam Lesinski        SortedVector<ConfigDescription> getUniqueConfigs() const;
4899b624c186cb6059dfb3ec24bfb6386a0fc17b88cAdam Lesinski
490282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const SourcePos& getFirstPublicSourcePos() const { return *mFirstPublicSourcePos; }
491282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
492282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        int32_t getPublicIndex() const { return mPublicIndex; }
493282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
494282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        int32_t getIndex() const { return mIndex; }
495282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        void setIndex(int32_t index) { mIndex = index; }
496282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
497282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        status_t applyPublicEntryOrder();
498282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
499282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const DefaultKeyedVector<String16, sp<ConfigList> >& getConfigs() const { return mConfigs; }
500282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const Vector<sp<ConfigList> >& getOrderedConfigs() const { return mOrderedConfigs; }
501282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const SortedVector<String16>& getCanAddEntries() const { return mCanAddEntries; }
502282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
503282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const SourcePos& getPos() const { return mPos; }
5049b624c186cb6059dfb3ec24bfb6386a0fc17b88cAdam Lesinski
505282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    private:
506282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        String16 mName;
507282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        SourcePos* mFirstPublicSourcePos;
508282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        DefaultKeyedVector<String16, Public> mPublic;
509282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        DefaultKeyedVector<String16, sp<ConfigList> > mConfigs;
510282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        Vector<sp<ConfigList> > mOrderedConfigs;
511282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        SortedVector<String16> mCanAddEntries;
512282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        int32_t mPublicIndex;
513282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        int32_t mIndex;
514282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        SourcePos mPos;
515282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    };
516282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
517282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    class Package : public RefBase {
518282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public:
519833f3ccbc8f4dd1ec8abb9121988b99ff34ec4c1Adam Lesinski        Package(const String16& name, size_t packageId);
520282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        virtual ~Package() { }
521282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
522282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        String16 getName() const { return mName; }
523282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        sp<Type> getType(const String16& type,
524282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                         const SourcePos& pos,
525282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                         bool doSetIndex = false);
526282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
527833f3ccbc8f4dd1ec8abb9121988b99ff34ec4c1Adam Lesinski        size_t getAssignedId() const { return mPackageId; }
528282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
529282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const ResStringPool& getTypeStrings() const { return mTypeStrings; }
530282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        uint32_t indexOfTypeString(const String16& s) const { return mTypeStringsMapping.valueFor(s); }
531282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const sp<AaptFile> getTypeStringsData() const { return mTypeStringsData; }
532282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        status_t setTypeStrings(const sp<AaptFile>& data);
533282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
534282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const ResStringPool& getKeyStrings() const { return mKeyStrings; }
535282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        uint32_t indexOfKeyString(const String16& s) const { return mKeyStringsMapping.valueFor(s); }
536282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const sp<AaptFile> getKeyStringsData() const { return mKeyStringsData; }
537282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        status_t setKeyStrings(const sp<AaptFile>& data);
538282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
539282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        status_t applyPublicTypeOrder();
540282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
541282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const DefaultKeyedVector<String16, sp<Type> >& getTypes() const { return mTypes; }
542282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const Vector<sp<Type> >& getOrderedTypes() const { return mOrderedTypes; }
543282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
5449b624c186cb6059dfb3ec24bfb6386a0fc17b88cAdam Lesinski        void movePrivateAttrs();
5459b624c186cb6059dfb3ec24bfb6386a0fc17b88cAdam Lesinski
546282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    private:
547282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        status_t setStrings(const sp<AaptFile>& data,
548282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                            ResStringPool* strings,
549282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                            DefaultKeyedVector<String16, uint32_t>* mappings);
550282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
551282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const String16 mName;
552833f3ccbc8f4dd1ec8abb9121988b99ff34ec4c1Adam Lesinski        const size_t mPackageId;
553282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        DefaultKeyedVector<String16, sp<Type> > mTypes;
554282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        Vector<sp<Type> > mOrderedTypes;
555282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        sp<AaptFile> mTypeStringsData;
556282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        sp<AaptFile> mKeyStringsData;
557282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        ResStringPool mTypeStrings;
558282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        ResStringPool mKeyStrings;
559282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        DefaultKeyedVector<String16, uint32_t> mTypeStringsMapping;
560282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        DefaultKeyedVector<String16, uint32_t> mKeyStringsMapping;
561282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    };
562282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
563de7de47fef1dcaa26d553665d89e4d3792325c3fAdam Lesinski    void getDensityVaryingResources(KeyedVector<Symbol, Vector<SymbolDefinition> >& resources);
564de7de47fef1dcaa26d553665d89e4d3792325c3fAdam Lesinski
565282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiprivate:
566282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    void writePublicDefinitions(const String16& package, FILE* fp, bool pub);
567282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    sp<Package> getPackage(const String16& package);
568282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    sp<Type> getType(const String16& package,
569282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                     const String16& type,
570282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                     const SourcePos& pos,
571282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                     bool doSetIndex = false);
572282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    sp<Entry> getEntry(const String16& package,
573282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                       const String16& type,
574282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                       const String16& name,
575282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                       const SourcePos& pos,
576282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                       bool overlay,
577282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                       const ResTable_config* config = NULL,
578282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                       bool doSetIndex = false);
579282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    sp<const Entry> getEntry(uint32_t resID,
580282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                             const ResTable_config* config = NULL) const;
581e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski    sp<ConfigList> getConfigList(const String16& package,
582e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski                                 const String16& type,
583e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski                                 const String16& name) const;
584282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const Item* getItem(uint32_t resID, uint32_t attrID) const;
585282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    bool getItemValue(uint32_t resID, uint32_t attrID,
586282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                      Res_value* outValue);
58728994d8d181c286b39811441ce78399576c2d315Adam Lesinski    int getPublicAttributeSdkLevel(uint32_t attrId) const;
588282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
589282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
590282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    String16 mAssetsPackage;
591833f3ccbc8f4dd1ec8abb9121988b99ff34ec4c1Adam Lesinski    PackageType mPackageType;
592282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    sp<AaptAssets> mAssets;
593833f3ccbc8f4dd1ec8abb9121988b99ff34ec4c1Adam Lesinski    uint32_t mTypeIdOffset;
594282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    DefaultKeyedVector<String16, sp<Package> > mPackages;
595282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    Vector<sp<Package> > mOrderedPackages;
596282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    size_t mNumLocal;
597282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    SourcePos mCurrentXmlPos;
598282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    Bundle* mBundle;
599030f536009b56dbcc23d284541e51562bd9a6ed3Dan Albert
600282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // key = string resource name, value = set of locales in which that name is defined
601030f536009b56dbcc23d284541e51562bd9a6ed3Dan Albert    std::map<String16, std::map<String8, SourcePos>> mLocalizations;
6025892248580859620db90d5ef2e3c2f48531933faAdrian Roos    // set of string resources names that have a default localization
6035892248580859620db90d5ef2e3c2f48531933faAdrian Roos    std::set<String16> mHasDefaultLocalization;
604030f536009b56dbcc23d284541e51562bd9a6ed3Dan Albert    std::queue<CompileResourceWorkItem> mWorkQueue;
605282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski};
606282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
607282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#endif
608