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 Lesinskiusing namespace std;
21282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
22282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiclass XMLNode;
23282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiclass ResourceTable;
24282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
25282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskienum {
26282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    XML_COMPILE_STRIP_COMMENTS = 1<<0,
27282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    XML_COMPILE_ASSIGN_ATTRIBUTE_IDS = 1<<1,
28282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    XML_COMPILE_COMPACT_WHITESPACE = 1<<2,
29282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    XML_COMPILE_STRIP_WHITESPACE = 1<<3,
30282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    XML_COMPILE_STRIP_RAW_VALUES = 1<<4,
31282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    XML_COMPILE_UTF8 = 1<<5,
32282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
33282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    XML_COMPILE_STANDARD_RESOURCE =
34282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            XML_COMPILE_STRIP_COMMENTS | XML_COMPILE_ASSIGN_ATTRIBUTE_IDS
35282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            | XML_COMPILE_STRIP_WHITESPACE | XML_COMPILE_STRIP_RAW_VALUES
36282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski};
37282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
38e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinskistatus_t compileXmlFile(const Bundle* bundle,
39e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski                        const sp<AaptAssets>& assets,
40e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski                        const String16& resourceName,
41282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        const sp<AaptFile>& target,
42282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        ResourceTable* table,
43282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        int options = XML_COMPILE_STANDARD_RESOURCE);
44282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
45e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinskistatus_t compileXmlFile(const Bundle* bundle,
46e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski                        const sp<AaptAssets>& assets,
47e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski                        const String16& resourceName,
48282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        const sp<AaptFile>& target,
49282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        const sp<AaptFile>& outTarget,
50282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        ResourceTable* table,
51282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        int options = XML_COMPILE_STANDARD_RESOURCE);
52282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
53e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinskistatus_t compileXmlFile(const Bundle* bundle,
54e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski                        const sp<AaptAssets>& assets,
55e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski                        const String16& resourceName,
56282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        const sp<XMLNode>& xmlTree,
57282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        const sp<AaptFile>& target,
58282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        ResourceTable* table,
59282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        int options = XML_COMPILE_STANDARD_RESOURCE);
60282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
61282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistatus_t compileResourceFile(Bundle* bundle,
62282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                             const sp<AaptAssets>& assets,
63282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                             const sp<AaptFile>& in,
64282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                             const ResTable_config& defParams,
65282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                             const bool overwrite,
66282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                             ResourceTable* outTable);
67282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
68282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistruct AccessorCookie
69282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
70282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    SourcePos sourcePos;
71282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    String8 attr;
72282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    String8 value;
73282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
74282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    AccessorCookie(const SourcePos&p, const String8& a, const String8& v)
75282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        :sourcePos(p),
76282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski         attr(a),
77282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski         value(v)
78282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    {
79282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
80282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski};
81282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
82e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski// Holds the necessary information to compile the
83e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski// resource.
84e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinskistruct CompileResourceWorkItem {
85e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski    String16 resourceName;
86e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski    String8 resPath;
87e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski    sp<AaptFile> file;
88e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski};
89e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski
90282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiclass ResourceTable : public ResTable::Accessor
91282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
92282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskipublic:
93833f3ccbc8f4dd1ec8abb9121988b99ff34ec4c1Adam Lesinski    // The type of package to build.
94833f3ccbc8f4dd1ec8abb9121988b99ff34ec4c1Adam Lesinski    enum PackageType {
95833f3ccbc8f4dd1ec8abb9121988b99ff34ec4c1Adam Lesinski        App,
96833f3ccbc8f4dd1ec8abb9121988b99ff34ec4c1Adam Lesinski        System,
97833f3ccbc8f4dd1ec8abb9121988b99ff34ec4c1Adam Lesinski        SharedLibrary,
98833f3ccbc8f4dd1ec8abb9121988b99ff34ec4c1Adam Lesinski        AppFeature
99833f3ccbc8f4dd1ec8abb9121988b99ff34ec4c1Adam Lesinski    };
100833f3ccbc8f4dd1ec8abb9121988b99ff34ec4c1Adam Lesinski
101282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    class Package;
102282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    class Type;
103282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    class Entry;
104282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
105833f3ccbc8f4dd1ec8abb9121988b99ff34ec4c1Adam Lesinski    ResourceTable(Bundle* bundle, const String16& assetsPackage, PackageType type);
106833f3ccbc8f4dd1ec8abb9121988b99ff34ec4c1Adam Lesinski
107833f3ccbc8f4dd1ec8abb9121988b99ff34ec4c1Adam Lesinski    const String16& getAssetsPackage() const {
108833f3ccbc8f4dd1ec8abb9121988b99ff34ec4c1Adam Lesinski        return mAssetsPackage;
109833f3ccbc8f4dd1ec8abb9121988b99ff34ec4c1Adam Lesinski    }
110282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
111e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski    /**
112e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski     * Returns the queue of resources that need to be compiled.
113e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski     * This is only used for resources that have been generated
114e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski     * during the compilation phase. If they were just added
115e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski     * to the AaptAssets, then they may be skipped over
116e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski     * and would mess up iteration order for the existing
117e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski     * resources.
118e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski     */
119e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski    queue<CompileResourceWorkItem>& getWorkQueue() {
120e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski        return mWorkQueue;
121e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski    }
122e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski
123282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    status_t addIncludedResources(Bundle* bundle, const sp<AaptAssets>& assets);
124282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
125282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    status_t addPublic(const SourcePos& pos,
126282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                       const String16& package,
127282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                       const String16& type,
128282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                       const String16& name,
129282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                       const uint32_t ident);
130282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
131282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    status_t addEntry(const SourcePos& pos,
132282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                      const String16& package,
133282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                      const String16& type,
134282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                      const String16& name,
135282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                      const String16& value,
136282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                      const Vector<StringPool::entry_style_span>* style = NULL,
137282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                      const ResTable_config* params = NULL,
138282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                      const bool doSetIndex = false,
139282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                      const int32_t format = ResTable_map::TYPE_ANY,
140282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                      const bool overwrite = false);
141282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
142282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    status_t startBag(const SourcePos& pos,
143282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    const String16& package,
144282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    const String16& type,
145282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    const String16& name,
146282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    const String16& bagParent,
147282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    const ResTable_config* params = NULL,
148282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    bool overlay = false,
149282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    bool replace = false,
150282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    bool isId = false);
151282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
152282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    status_t addBag(const SourcePos& pos,
153282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    const String16& package,
154282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    const String16& type,
155282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    const String16& name,
156282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    const String16& bagParent,
157282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    const String16& bagKey,
158282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    const String16& value,
159282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    const Vector<StringPool::entry_style_span>* style = NULL,
160282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    const ResTable_config* params = NULL,
161282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    bool replace = false,
162282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    bool isId = false,
163282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    const int32_t format = ResTable_map::TYPE_ANY);
164282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
165282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    bool hasBagOrEntry(const String16& package,
166282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                       const String16& type,
167282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                       const String16& name) const;
168282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
169282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    bool hasBagOrEntry(const String16& package,
170282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                       const String16& type,
171282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                       const String16& name,
172282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                       const ResTable_config& config) const;
173282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
174282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    bool hasBagOrEntry(const String16& ref,
175282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                       const String16* defType = NULL,
176282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                       const String16* defPackage = NULL);
177282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
178282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    bool appendComment(const String16& package,
179282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                       const String16& type,
180282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                       const String16& name,
181282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                       const String16& comment,
182282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                       bool onlyIfEmpty = false);
183282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
184282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    bool appendTypeComment(const String16& package,
185282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                           const String16& type,
186282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                           const String16& name,
187282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                           const String16& comment);
188282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
189282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    void canAddEntry(const SourcePos& pos,
190282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const String16& package, const String16& type, const String16& name);
191282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
192282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    size_t size() const;
193282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    size_t numLocalResources() const;
194282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    bool hasResources() const;
195282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
19682a2dd8efe48d3a4e04655f01329da857ace4b7dAdam Lesinski    status_t modifyForCompat(const Bundle* bundle);
197e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski    status_t modifyForCompat(const Bundle* bundle,
198e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski                             const String16& resourceName,
199e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski                             const sp<AaptFile>& file,
200e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski                             const sp<XMLNode>& root);
20182a2dd8efe48d3a4e04655f01329da857ace4b7dAdam Lesinski
20227f69f4e06961fdecd1078b2292d764a157e5e1cAdam Lesinski    sp<AaptFile> flatten(Bundle* bundle, const sp<const ResourceFilter>& filter,
20327f69f4e06961fdecd1078b2292d764a157e5e1cAdam Lesinski            const bool isBase);
204282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
205282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    static inline uint32_t makeResId(uint32_t packageId,
206282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                     uint32_t typeId,
207282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                     uint32_t nameId)
208282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    {
209282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return nameId | (typeId<<16) | (packageId<<24);
210282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
211282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
212282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    static inline uint32_t getResId(const sp<Package>& p,
213282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                    const sp<Type>& t,
214282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                    uint32_t nameId);
215282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
216282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    uint32_t getResId(const String16& package,
217282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                      const String16& type,
218282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                      const String16& name,
219282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                      bool onlyPublic = true) const;
220282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
221282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    uint32_t getResId(const String16& ref,
222282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                      const String16* defType = NULL,
223282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                      const String16* defPackage = NULL,
224282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                      const char** outErrorMsg = NULL,
225282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                      bool onlyPublic = true) const;
226282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
227282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    static bool isValidResourceName(const String16& s);
228282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
229282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    bool stringToValue(Res_value* outValue, StringPool* pool,
230282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                       const String16& str,
231282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                       bool preserveSpaces, bool coerceType,
232282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                       uint32_t attrID,
233282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                       const Vector<StringPool::entry_style_span>* style = NULL,
234282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                       String16* outStr = NULL, void* accessorCookie = NULL,
235282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                       uint32_t attrType = ResTable_map::TYPE_ANY,
236282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                       const String8* configTypeName = NULL,
237282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                       const ConfigDescription* config = NULL);
238282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
239282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    status_t assignResourceIds();
240282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    status_t addSymbols(const sp<AaptSymbols>& outSymbols = NULL);
241a01a9374fd386f3a8773528d7a49bc5315492dffAdam Lesinski    void addLocalization(const String16& name, const String8& locale, const SourcePos& src);
242282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    status_t validateLocalizations(void);
243282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
24427f69f4e06961fdecd1078b2292d764a157e5e1cAdam Lesinski    status_t flatten(Bundle* bundle, const sp<const ResourceFilter>& filter,
24527f69f4e06961fdecd1078b2292d764a157e5e1cAdam Lesinski            const sp<AaptFile>& dest, const bool isBase);
246de898ff42912bd7ca1bfb099cd439562496765a4Adam Lesinski    status_t flattenLibraryTable(const sp<AaptFile>& dest, const Vector<sp<Package> >& libs);
247282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
248282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    void writePublicDefinitions(const String16& package, FILE* fp);
249282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
250282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual uint32_t getCustomResource(const String16& package,
251282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                       const String16& type,
252282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                       const String16& name) const;
253282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual uint32_t getCustomResourceWithCreation(const String16& package,
254282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                   const String16& type,
255282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                   const String16& name,
256282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                   const bool createIfNeeded);
257282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual uint32_t getRemappedPackage(uint32_t origPackage) const;
258282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual bool getAttributeType(uint32_t attrID, uint32_t* outType);
259282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual bool getAttributeMin(uint32_t attrID, uint32_t* outMin);
260282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual bool getAttributeMax(uint32_t attrID, uint32_t* outMax);
261282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual bool getAttributeKeys(uint32_t attrID, Vector<String16>* outKeys);
262282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual bool getAttributeEnum(uint32_t attrID,
263282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                  const char16_t* name, size_t nameLen,
264282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                  Res_value* outValue);
265282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual bool getAttributeFlags(uint32_t attrID,
266282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                   const char16_t* name, size_t nameLen,
267282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                   Res_value* outValue);
268282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual uint32_t getAttributeL10N(uint32_t attrID);
269282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
270282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual bool getLocalizationSetting();
271282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual void reportError(void* accessorCookie, const char* fmt, ...);
272282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
273282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    void setCurrentXmlPos(const SourcePos& pos) { mCurrentXmlPos = pos; }
274282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
275282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    class Item {
276282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public:
277282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        Item() : isId(false), format(ResTable_map::TYPE_ANY), bagKeyId(0), evaluating(false)
278282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            { memset(&parsedValue, 0, sizeof(parsedValue)); }
279282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        Item(const SourcePos& pos,
280282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski             bool _isId,
281282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski             const String16& _value,
282282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski             const Vector<StringPool::entry_style_span>* _style = NULL,
283282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski             int32_t format = ResTable_map::TYPE_ANY);
284282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        Item(const Item& o) : sourcePos(o.sourcePos),
285282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            isId(o.isId), value(o.value), style(o.style),
286282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            format(o.format), bagKeyId(o.bagKeyId), evaluating(false) {
287282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            memset(&parsedValue, 0, sizeof(parsedValue));
288282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
289282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        ~Item() { }
290282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
291282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        Item& operator=(const Item& o) {
292282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            sourcePos = o.sourcePos;
293282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            isId = o.isId;
294282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            value = o.value;
295282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            style = o.style;
296282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            format = o.format;
297282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            bagKeyId = o.bagKeyId;
298282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            parsedValue = o.parsedValue;
299282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return *this;
300282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
301282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
302282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        SourcePos                               sourcePos;
303282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mutable bool                            isId;
304282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        String16                                value;
305282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        Vector<StringPool::entry_style_span>    style;
306282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        int32_t                                 format;
307282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        uint32_t                                bagKeyId;
308282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mutable bool                            evaluating;
309282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        Res_value                               parsedValue;
310282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    };
311282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
312282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    class Entry : public RefBase {
313282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public:
314282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        Entry(const String16& name, const SourcePos& pos)
315282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            : mName(name), mType(TYPE_UNKNOWN),
316282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski              mItemFormat(ResTable_map::TYPE_ANY), mNameIndex(-1), mPos(pos)
317282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        { }
31882a2dd8efe48d3a4e04655f01329da857ace4b7dAdam Lesinski
31982a2dd8efe48d3a4e04655f01329da857ace4b7dAdam Lesinski        Entry(const Entry& entry);
320978ab9d92934b79409638cf220de3002fea8d505Adam Lesinski        Entry& operator=(const Entry& entry);
32182a2dd8efe48d3a4e04655f01329da857ace4b7dAdam Lesinski
322282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        virtual ~Entry() { }
323282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
324282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        enum type {
325282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            TYPE_UNKNOWN = 0,
326282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            TYPE_ITEM,
327282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            TYPE_BAG
328282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        };
329282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
330282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        String16 getName() const { return mName; }
331282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        type getType() const { return mType; }
332282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
333282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        void setParent(const String16& parent) { mParent = parent; }
334282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        String16 getParent() const { return mParent; }
335282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
336282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        status_t makeItABag(const SourcePos& sourcePos);
337282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
338282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        status_t emptyBag(const SourcePos& sourcePos);
339282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
340282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        status_t setItem(const SourcePos& pos,
341282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                         const String16& value,
342282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                         const Vector<StringPool::entry_style_span>* style = NULL,
343282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                         int32_t format = ResTable_map::TYPE_ANY,
344282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                         const bool overwrite = false);
345282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
346282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        status_t addToBag(const SourcePos& pos,
347282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                          const String16& key, const String16& value,
348282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                          const Vector<StringPool::entry_style_span>* style = NULL,
349282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                          bool replace=false, bool isId = false,
350282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                          int32_t format = ResTable_map::TYPE_ANY);
351282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
35282a2dd8efe48d3a4e04655f01329da857ace4b7dAdam Lesinski        status_t removeFromBag(const String16& key);
35382a2dd8efe48d3a4e04655f01329da857ace4b7dAdam Lesinski
354282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // Index of the entry's name string in the key pool.
355282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        int32_t getNameIndex() const { return mNameIndex; }
356282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        void setNameIndex(int32_t index) { mNameIndex = index; }
357282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
358282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const Item* getItem() const { return mType == TYPE_ITEM ? &mItem : NULL; }
359282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const KeyedVector<String16, Item>& getBag() const { return mBag; }
360282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
361282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        status_t generateAttributes(ResourceTable* table,
362282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                    const String16& package);
363282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
364282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        status_t assignResourceIds(ResourceTable* table,
365282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                   const String16& package);
366282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
367282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        status_t prepareFlatten(StringPool* strings, ResourceTable* table,
368282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski               const String8* configTypeName, const ConfigDescription* config);
369282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
370282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        status_t remapStringValue(StringPool* strings);
371282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
372282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        ssize_t flatten(Bundle*, const sp<AaptFile>& data, bool isPublic);
373282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
374282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const SourcePos& getPos() const { return mPos; }
375282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
376282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    private:
377282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        String16 mName;
378282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        String16 mParent;
379282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        type mType;
380282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        Item mItem;
381282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        int32_t mItemFormat;
382282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        KeyedVector<String16, Item> mBag;
383282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        int32_t mNameIndex;
384282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        uint32_t mParentId;
385282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        SourcePos mPos;
386282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    };
387282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
388282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    class ConfigList : public RefBase {
389282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public:
390282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        ConfigList(const String16& name, const SourcePos& pos)
391282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            : mName(name), mPos(pos), mPublic(false), mEntryIndex(-1) { }
392282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        virtual ~ConfigList() { }
393282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
394282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        String16 getName() const { return mName; }
395282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const SourcePos& getPos() const { return mPos; }
396282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
397282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        void appendComment(const String16& comment, bool onlyIfEmpty = false);
398282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const String16& getComment() const { return mComment; }
399282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
400282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        void appendTypeComment(const String16& comment);
401282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const String16& getTypeComment() const { return mTypeComment; }
402282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
403282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // Index of this entry in its Type.
404282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        int32_t getEntryIndex() const { return mEntryIndex; }
405282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        void setEntryIndex(int32_t index) { mEntryIndex = index; }
406282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
407282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        void setPublic(bool pub) { mPublic = pub; }
408282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        bool getPublic() const { return mPublic; }
409282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        void setPublicSourcePos(const SourcePos& pos) { mPublicSourcePos = pos; }
410282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const SourcePos& getPublicSourcePos() { return mPublicSourcePos; }
411282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
412282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        void addEntry(const ResTable_config& config, const sp<Entry>& entry) {
413282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mEntries.add(config, entry);
414282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
415282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
416282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const DefaultKeyedVector<ConfigDescription, sp<Entry> >& getEntries() const { return mEntries; }
417282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    private:
418282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const String16 mName;
419282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const SourcePos mPos;
420282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        String16 mComment;
421282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        String16 mTypeComment;
422282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        bool mPublic;
423282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        SourcePos mPublicSourcePos;
424282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        int32_t mEntryIndex;
425282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        DefaultKeyedVector<ConfigDescription, sp<Entry> > mEntries;
426282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    };
427282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
428282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    class Public {
429282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public:
430282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        Public() : sourcePos(), ident(0) { }
431282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        Public(const SourcePos& pos,
432282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski               const String16& _comment,
433282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski               uint32_t _ident)
434282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            : sourcePos(pos),
435282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            comment(_comment), ident(_ident) { }
436282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        Public(const Public& o) : sourcePos(o.sourcePos),
437282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            comment(o.comment), ident(o.ident) { }
438282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        ~Public() { }
439282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
440282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        Public& operator=(const Public& o) {
441282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            sourcePos = o.sourcePos;
442282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            comment = o.comment;
443282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            ident = o.ident;
444282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return *this;
445282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
446282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
447282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        SourcePos   sourcePos;
448282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        String16    comment;
449282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        uint32_t    ident;
450282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    };
451282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
452282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    class Type : public RefBase {
453282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public:
454282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        Type(const String16& name, const SourcePos& pos)
455282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                : mName(name), mFirstPublicSourcePos(NULL), mPublicIndex(-1), mIndex(-1), mPos(pos)
456282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        { }
457282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        virtual ~Type() { delete mFirstPublicSourcePos; }
458282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
459282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        status_t addPublic(const SourcePos& pos,
460282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                           const String16& name,
461282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                           const uint32_t ident);
462282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
463282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        void canAddEntry(const String16& name);
464282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
465282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        String16 getName() const { return mName; }
466282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        sp<Entry> getEntry(const String16& entry,
467282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                           const SourcePos& pos,
468282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                           const ResTable_config* config = NULL,
469282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                           bool doSetIndex = false,
470282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                           bool overlay = false,
471282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                           bool autoAddOverlay = false);
472282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
4739b624c186cb6059dfb3ec24bfb6386a0fc17b88cAdam Lesinski        bool isPublic(const String16& entry) const {
4749b624c186cb6059dfb3ec24bfb6386a0fc17b88cAdam Lesinski            return mPublic.indexOfKey(entry) >= 0;
4759b624c186cb6059dfb3ec24bfb6386a0fc17b88cAdam Lesinski        }
4769b624c186cb6059dfb3ec24bfb6386a0fc17b88cAdam Lesinski
4779b624c186cb6059dfb3ec24bfb6386a0fc17b88cAdam Lesinski        sp<ConfigList> removeEntry(const String16& entry);
4789b624c186cb6059dfb3ec24bfb6386a0fc17b88cAdam Lesinski
4799b624c186cb6059dfb3ec24bfb6386a0fc17b88cAdam Lesinski        SortedVector<ConfigDescription> getUniqueConfigs() const;
4809b624c186cb6059dfb3ec24bfb6386a0fc17b88cAdam Lesinski
481282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const SourcePos& getFirstPublicSourcePos() const { return *mFirstPublicSourcePos; }
482282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
483282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        int32_t getPublicIndex() const { return mPublicIndex; }
484282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
485282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        int32_t getIndex() const { return mIndex; }
486282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        void setIndex(int32_t index) { mIndex = index; }
487282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
488282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        status_t applyPublicEntryOrder();
489282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
490282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const DefaultKeyedVector<String16, sp<ConfigList> >& getConfigs() const { return mConfigs; }
491282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const Vector<sp<ConfigList> >& getOrderedConfigs() const { return mOrderedConfigs; }
492282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const SortedVector<String16>& getCanAddEntries() const { return mCanAddEntries; }
493282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
494282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const SourcePos& getPos() const { return mPos; }
4959b624c186cb6059dfb3ec24bfb6386a0fc17b88cAdam Lesinski
496282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    private:
497282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        String16 mName;
498282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        SourcePos* mFirstPublicSourcePos;
499282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        DefaultKeyedVector<String16, Public> mPublic;
500282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        DefaultKeyedVector<String16, sp<ConfigList> > mConfigs;
501282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        Vector<sp<ConfigList> > mOrderedConfigs;
502282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        SortedVector<String16> mCanAddEntries;
503282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        int32_t mPublicIndex;
504282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        int32_t mIndex;
505282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        SourcePos mPos;
506282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    };
507282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
508282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    class Package : public RefBase {
509282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public:
510833f3ccbc8f4dd1ec8abb9121988b99ff34ec4c1Adam Lesinski        Package(const String16& name, size_t packageId);
511282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        virtual ~Package() { }
512282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
513282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        String16 getName() const { return mName; }
514282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        sp<Type> getType(const String16& type,
515282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                         const SourcePos& pos,
516282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                         bool doSetIndex = false);
517282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
518833f3ccbc8f4dd1ec8abb9121988b99ff34ec4c1Adam Lesinski        size_t getAssignedId() const { return mPackageId; }
519282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
520282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const ResStringPool& getTypeStrings() const { return mTypeStrings; }
521282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        uint32_t indexOfTypeString(const String16& s) const { return mTypeStringsMapping.valueFor(s); }
522282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const sp<AaptFile> getTypeStringsData() const { return mTypeStringsData; }
523282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        status_t setTypeStrings(const sp<AaptFile>& data);
524282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
525282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const ResStringPool& getKeyStrings() const { return mKeyStrings; }
526282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        uint32_t indexOfKeyString(const String16& s) const { return mKeyStringsMapping.valueFor(s); }
527282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const sp<AaptFile> getKeyStringsData() const { return mKeyStringsData; }
528282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        status_t setKeyStrings(const sp<AaptFile>& data);
529282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
530282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        status_t applyPublicTypeOrder();
531282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
532282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const DefaultKeyedVector<String16, sp<Type> >& getTypes() const { return mTypes; }
533282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const Vector<sp<Type> >& getOrderedTypes() const { return mOrderedTypes; }
534282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
5359b624c186cb6059dfb3ec24bfb6386a0fc17b88cAdam Lesinski        void movePrivateAttrs();
5369b624c186cb6059dfb3ec24bfb6386a0fc17b88cAdam Lesinski
537282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    private:
538282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        status_t setStrings(const sp<AaptFile>& data,
539282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                            ResStringPool* strings,
540282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                            DefaultKeyedVector<String16, uint32_t>* mappings);
541282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
542282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const String16 mName;
543833f3ccbc8f4dd1ec8abb9121988b99ff34ec4c1Adam Lesinski        const size_t mPackageId;
544282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        DefaultKeyedVector<String16, sp<Type> > mTypes;
545282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        Vector<sp<Type> > mOrderedTypes;
546282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        sp<AaptFile> mTypeStringsData;
547282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        sp<AaptFile> mKeyStringsData;
548282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        ResStringPool mTypeStrings;
549282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        ResStringPool mKeyStrings;
550282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        DefaultKeyedVector<String16, uint32_t> mTypeStringsMapping;
551282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        DefaultKeyedVector<String16, uint32_t> mKeyStringsMapping;
552282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    };
553282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
554de7de47fef1dcaa26d553665d89e4d3792325c3fAdam Lesinski    void getDensityVaryingResources(KeyedVector<Symbol, Vector<SymbolDefinition> >& resources);
555de7de47fef1dcaa26d553665d89e4d3792325c3fAdam Lesinski
556282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiprivate:
557282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    void writePublicDefinitions(const String16& package, FILE* fp, bool pub);
558282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    sp<Package> getPackage(const String16& package);
559282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    sp<Type> getType(const String16& package,
560282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                     const String16& type,
561282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                     const SourcePos& pos,
562282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                     bool doSetIndex = false);
563282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    sp<Entry> getEntry(const String16& package,
564282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                       const String16& type,
565282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                       const String16& name,
566282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                       const SourcePos& pos,
567282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                       bool overlay,
568282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                       const ResTable_config* config = NULL,
569282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                       bool doSetIndex = false);
570282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    sp<const Entry> getEntry(uint32_t resID,
571282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                             const ResTable_config* config = NULL) const;
572e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski    sp<ConfigList> getConfigList(const String16& package,
573e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski                                 const String16& type,
574e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski                                 const String16& name) const;
575282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const Item* getItem(uint32_t resID, uint32_t attrID) const;
576282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    bool getItemValue(uint32_t resID, uint32_t attrID,
577282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                      Res_value* outValue);
57828994d8d181c286b39811441ce78399576c2d315Adam Lesinski    int getPublicAttributeSdkLevel(uint32_t attrId) const;
579282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
580282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
581282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    String16 mAssetsPackage;
582833f3ccbc8f4dd1ec8abb9121988b99ff34ec4c1Adam Lesinski    PackageType mPackageType;
583282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    sp<AaptAssets> mAssets;
584833f3ccbc8f4dd1ec8abb9121988b99ff34ec4c1Adam Lesinski    uint32_t mTypeIdOffset;
585282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    DefaultKeyedVector<String16, sp<Package> > mPackages;
586282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    Vector<sp<Package> > mOrderedPackages;
587282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    size_t mNumLocal;
588282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    SourcePos mCurrentXmlPos;
589282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    Bundle* mBundle;
590282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
591282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // key = string resource name, value = set of locales in which that name is defined
592a01a9374fd386f3a8773528d7a49bc5315492dffAdam Lesinski    map<String16, map<String8, SourcePos> > mLocalizations;
593e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski    queue<CompileResourceWorkItem> mWorkQueue;
594282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski};
595282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
596282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#endif
597