xref: /aosp_15_r20/frameworks/base/tools/aapt/ResourceTable.h (revision d57664e9bc4670b3ecf6748a746a57c557b6bc9e)
1*d57664e9SAndroid Build Coastguard Worker //
2*d57664e9SAndroid Build Coastguard Worker // Copyright 2006 The Android Open Source Project
3*d57664e9SAndroid Build Coastguard Worker //
4*d57664e9SAndroid Build Coastguard Worker // Build resource files from raw assets.
5*d57664e9SAndroid Build Coastguard Worker //
6*d57664e9SAndroid Build Coastguard Worker 
7*d57664e9SAndroid Build Coastguard Worker #ifndef RESOURCE_TABLE_H
8*d57664e9SAndroid Build Coastguard Worker #define RESOURCE_TABLE_H
9*d57664e9SAndroid Build Coastguard Worker 
10*d57664e9SAndroid Build Coastguard Worker #include <map>
11*d57664e9SAndroid Build Coastguard Worker #include <queue>
12*d57664e9SAndroid Build Coastguard Worker #include <set>
13*d57664e9SAndroid Build Coastguard Worker 
14*d57664e9SAndroid Build Coastguard Worker #include "ConfigDescription.h"
15*d57664e9SAndroid Build Coastguard Worker #include "ResourceFilter.h"
16*d57664e9SAndroid Build Coastguard Worker #include "SourcePos.h"
17*d57664e9SAndroid Build Coastguard Worker #include "StringPool.h"
18*d57664e9SAndroid Build Coastguard Worker #include "Symbol.h"
19*d57664e9SAndroid Build Coastguard Worker 
20*d57664e9SAndroid Build Coastguard Worker class XMLNode;
21*d57664e9SAndroid Build Coastguard Worker class ResourceTable;
22*d57664e9SAndroid Build Coastguard Worker 
23*d57664e9SAndroid Build Coastguard Worker enum {
24*d57664e9SAndroid Build Coastguard Worker     XML_COMPILE_STRIP_COMMENTS = 1<<0,
25*d57664e9SAndroid Build Coastguard Worker     XML_COMPILE_ASSIGN_ATTRIBUTE_IDS = 1<<1,
26*d57664e9SAndroid Build Coastguard Worker     XML_COMPILE_PARSE_VALUES = 1 << 2,
27*d57664e9SAndroid Build Coastguard Worker     XML_COMPILE_COMPACT_WHITESPACE = 1<<3,
28*d57664e9SAndroid Build Coastguard Worker     XML_COMPILE_STRIP_WHITESPACE = 1<<4,
29*d57664e9SAndroid Build Coastguard Worker     XML_COMPILE_STRIP_RAW_VALUES = 1<<5,
30*d57664e9SAndroid Build Coastguard Worker     XML_COMPILE_UTF8 = 1<<6,
31*d57664e9SAndroid Build Coastguard Worker 
32*d57664e9SAndroid Build Coastguard Worker     XML_COMPILE_STANDARD_RESOURCE =
33*d57664e9SAndroid Build Coastguard Worker             XML_COMPILE_STRIP_COMMENTS | XML_COMPILE_ASSIGN_ATTRIBUTE_IDS | XML_COMPILE_PARSE_VALUES
34*d57664e9SAndroid Build Coastguard Worker             | XML_COMPILE_STRIP_WHITESPACE | XML_COMPILE_STRIP_RAW_VALUES
35*d57664e9SAndroid Build Coastguard Worker };
36*d57664e9SAndroid Build Coastguard Worker 
37*d57664e9SAndroid Build Coastguard Worker status_t compileXmlFile(const Bundle* bundle,
38*d57664e9SAndroid Build Coastguard Worker                         const sp<AaptAssets>& assets,
39*d57664e9SAndroid Build Coastguard Worker                         const String16& resourceName,
40*d57664e9SAndroid Build Coastguard Worker                         const sp<AaptFile>& target,
41*d57664e9SAndroid Build Coastguard Worker                         ResourceTable* table,
42*d57664e9SAndroid Build Coastguard Worker                         int options = XML_COMPILE_STANDARD_RESOURCE);
43*d57664e9SAndroid Build Coastguard Worker 
44*d57664e9SAndroid Build Coastguard Worker status_t compileXmlFile(const Bundle* bundle,
45*d57664e9SAndroid Build Coastguard Worker                         const sp<AaptAssets>& assets,
46*d57664e9SAndroid Build Coastguard Worker                         const String16& resourceName,
47*d57664e9SAndroid Build Coastguard Worker                         const sp<AaptFile>& target,
48*d57664e9SAndroid Build Coastguard Worker                         const sp<AaptFile>& outTarget,
49*d57664e9SAndroid Build Coastguard Worker                         ResourceTable* table,
50*d57664e9SAndroid Build Coastguard Worker                         int options = XML_COMPILE_STANDARD_RESOURCE);
51*d57664e9SAndroid Build Coastguard Worker 
52*d57664e9SAndroid Build Coastguard Worker status_t compileXmlFile(const Bundle* bundle,
53*d57664e9SAndroid Build Coastguard Worker                         const sp<AaptAssets>& assets,
54*d57664e9SAndroid Build Coastguard Worker                         const String16& resourceName,
55*d57664e9SAndroid Build Coastguard Worker                         const sp<XMLNode>& xmlTree,
56*d57664e9SAndroid Build Coastguard Worker                         const sp<AaptFile>& target,
57*d57664e9SAndroid Build Coastguard Worker                         ResourceTable* table,
58*d57664e9SAndroid Build Coastguard Worker                         int options = XML_COMPILE_STANDARD_RESOURCE);
59*d57664e9SAndroid Build Coastguard Worker 
60*d57664e9SAndroid Build Coastguard Worker status_t compileResourceFile(Bundle* bundle,
61*d57664e9SAndroid Build Coastguard Worker                              const sp<AaptAssets>& assets,
62*d57664e9SAndroid Build Coastguard Worker                              const sp<AaptFile>& in,
63*d57664e9SAndroid Build Coastguard Worker                              const ResTable_config& defParams,
64*d57664e9SAndroid Build Coastguard Worker                              const bool overwrite,
65*d57664e9SAndroid Build Coastguard Worker                              ResourceTable* outTable);
66*d57664e9SAndroid Build Coastguard Worker 
67*d57664e9SAndroid Build Coastguard Worker struct AccessorCookie
68*d57664e9SAndroid Build Coastguard Worker {
69*d57664e9SAndroid Build Coastguard Worker     SourcePos sourcePos;
70*d57664e9SAndroid Build Coastguard Worker     String8 attr;
71*d57664e9SAndroid Build Coastguard Worker     String8 value;
72*d57664e9SAndroid Build Coastguard Worker 
AccessorCookieAccessorCookie73*d57664e9SAndroid Build Coastguard Worker     AccessorCookie(const SourcePos&p, const String8& a, const String8& v)
74*d57664e9SAndroid Build Coastguard Worker         :sourcePos(p),
75*d57664e9SAndroid Build Coastguard Worker          attr(a),
76*d57664e9SAndroid Build Coastguard Worker          value(v)
77*d57664e9SAndroid Build Coastguard Worker     {
78*d57664e9SAndroid Build Coastguard Worker     }
79*d57664e9SAndroid Build Coastguard Worker };
80*d57664e9SAndroid Build Coastguard Worker 
81*d57664e9SAndroid Build Coastguard Worker // Holds the necessary information to compile the
82*d57664e9SAndroid Build Coastguard Worker // resource.
83*d57664e9SAndroid Build Coastguard Worker struct CompileResourceWorkItem {
84*d57664e9SAndroid Build Coastguard Worker     String16 resourceName;
85*d57664e9SAndroid Build Coastguard Worker     String8 resPath;
86*d57664e9SAndroid Build Coastguard Worker     sp<AaptFile> file;
87*d57664e9SAndroid Build Coastguard Worker     sp<XMLNode> xmlRoot;
88*d57664e9SAndroid Build Coastguard Worker     bool needsCompiling = true;
89*d57664e9SAndroid Build Coastguard Worker };
90*d57664e9SAndroid Build Coastguard Worker 
91*d57664e9SAndroid Build Coastguard Worker class ResourceTable : public ResTable::Accessor
92*d57664e9SAndroid Build Coastguard Worker {
93*d57664e9SAndroid Build Coastguard Worker public:
94*d57664e9SAndroid Build Coastguard Worker     // The type of package to build.
95*d57664e9SAndroid Build Coastguard Worker     enum PackageType {
96*d57664e9SAndroid Build Coastguard Worker         App,
97*d57664e9SAndroid Build Coastguard Worker         System,
98*d57664e9SAndroid Build Coastguard Worker         SharedLibrary,
99*d57664e9SAndroid Build Coastguard Worker         AppFeature
100*d57664e9SAndroid Build Coastguard Worker     };
101*d57664e9SAndroid Build Coastguard Worker 
102*d57664e9SAndroid Build Coastguard Worker     class Package;
103*d57664e9SAndroid Build Coastguard Worker     class Type;
104*d57664e9SAndroid Build Coastguard Worker     class Entry;
105*d57664e9SAndroid Build Coastguard Worker     class ConfigList;
106*d57664e9SAndroid Build Coastguard Worker 
107*d57664e9SAndroid Build Coastguard Worker     /**
108*d57664e9SAndroid Build Coastguard Worker      * Exposed for testing. Determines whether a versioned resource should be generated
109*d57664e9SAndroid Build Coastguard Worker      * based on the other available configurations for that resource.
110*d57664e9SAndroid Build Coastguard Worker      */
111*d57664e9SAndroid Build Coastguard Worker     static bool shouldGenerateVersionedResource(const sp<ConfigList>& configList,
112*d57664e9SAndroid Build Coastguard Worker                                                 const ConfigDescription& sourceConfig,
113*d57664e9SAndroid Build Coastguard Worker                                                 const int sdkVersionToGenerate);
114*d57664e9SAndroid Build Coastguard Worker 
115*d57664e9SAndroid Build Coastguard Worker     ResourceTable(Bundle* bundle, const String16& assetsPackage, PackageType type);
116*d57664e9SAndroid Build Coastguard Worker 
getAssetsPackage()117*d57664e9SAndroid Build Coastguard Worker     const String16& getAssetsPackage() const {
118*d57664e9SAndroid Build Coastguard Worker         return mAssetsPackage;
119*d57664e9SAndroid Build Coastguard Worker     }
120*d57664e9SAndroid Build Coastguard Worker 
121*d57664e9SAndroid Build Coastguard Worker     /**
122*d57664e9SAndroid Build Coastguard Worker      * Returns the queue of resources that need to be compiled.
123*d57664e9SAndroid Build Coastguard Worker      * This is only used for resources that have been generated
124*d57664e9SAndroid Build Coastguard Worker      * during the compilation phase. If they were just added
125*d57664e9SAndroid Build Coastguard Worker      * to the AaptAssets, then they may be skipped over
126*d57664e9SAndroid Build Coastguard Worker      * and would mess up iteration order for the existing
127*d57664e9SAndroid Build Coastguard Worker      * resources.
128*d57664e9SAndroid Build Coastguard Worker      */
getWorkQueue()129*d57664e9SAndroid Build Coastguard Worker     std::queue<CompileResourceWorkItem>& getWorkQueue() {
130*d57664e9SAndroid Build Coastguard Worker         return mWorkQueue;
131*d57664e9SAndroid Build Coastguard Worker     }
132*d57664e9SAndroid Build Coastguard Worker 
133*d57664e9SAndroid Build Coastguard Worker     status_t addIncludedResources(Bundle* bundle, const sp<AaptAssets>& assets);
134*d57664e9SAndroid Build Coastguard Worker 
135*d57664e9SAndroid Build Coastguard Worker     status_t addPublic(const SourcePos& pos,
136*d57664e9SAndroid Build Coastguard Worker                        const String16& package,
137*d57664e9SAndroid Build Coastguard Worker                        const String16& type,
138*d57664e9SAndroid Build Coastguard Worker                        const String16& name,
139*d57664e9SAndroid Build Coastguard Worker                        const uint32_t ident);
140*d57664e9SAndroid Build Coastguard Worker 
141*d57664e9SAndroid Build Coastguard Worker     status_t addEntry(const SourcePos& pos,
142*d57664e9SAndroid Build Coastguard Worker                       const String16& package,
143*d57664e9SAndroid Build Coastguard Worker                       const String16& type,
144*d57664e9SAndroid Build Coastguard Worker                       const String16& name,
145*d57664e9SAndroid Build Coastguard Worker                       const String16& value,
146*d57664e9SAndroid Build Coastguard Worker                       const Vector<StringPool::entry_style_span>* style = NULL,
147*d57664e9SAndroid Build Coastguard Worker                       const ResTable_config* params = NULL,
148*d57664e9SAndroid Build Coastguard Worker                       const bool doSetIndex = false,
149*d57664e9SAndroid Build Coastguard Worker                       const int32_t format = ResTable_map::TYPE_ANY,
150*d57664e9SAndroid Build Coastguard Worker                       const bool overwrite = false);
151*d57664e9SAndroid Build Coastguard Worker 
152*d57664e9SAndroid Build Coastguard Worker     status_t startBag(const SourcePos& pos,
153*d57664e9SAndroid Build Coastguard Worker                     const String16& package,
154*d57664e9SAndroid Build Coastguard Worker                     const String16& type,
155*d57664e9SAndroid Build Coastguard Worker                     const String16& name,
156*d57664e9SAndroid Build Coastguard Worker                     const String16& bagParent,
157*d57664e9SAndroid Build Coastguard Worker                     const ResTable_config* params = NULL,
158*d57664e9SAndroid Build Coastguard Worker                     bool overlay = false,
159*d57664e9SAndroid Build Coastguard Worker                     bool replace = false,
160*d57664e9SAndroid Build Coastguard Worker                     bool isId = false);
161*d57664e9SAndroid Build Coastguard Worker 
162*d57664e9SAndroid Build Coastguard Worker     status_t addBag(const SourcePos& pos,
163*d57664e9SAndroid Build Coastguard Worker                     const String16& package,
164*d57664e9SAndroid Build Coastguard Worker                     const String16& type,
165*d57664e9SAndroid Build Coastguard Worker                     const String16& name,
166*d57664e9SAndroid Build Coastguard Worker                     const String16& bagParent,
167*d57664e9SAndroid Build Coastguard Worker                     const String16& bagKey,
168*d57664e9SAndroid Build Coastguard Worker                     const String16& value,
169*d57664e9SAndroid Build Coastguard Worker                     const Vector<StringPool::entry_style_span>* style = NULL,
170*d57664e9SAndroid Build Coastguard Worker                     const ResTable_config* params = NULL,
171*d57664e9SAndroid Build Coastguard Worker                     bool replace = false,
172*d57664e9SAndroid Build Coastguard Worker                     bool isId = false,
173*d57664e9SAndroid Build Coastguard Worker                     const int32_t format = ResTable_map::TYPE_ANY);
174*d57664e9SAndroid Build Coastguard Worker 
175*d57664e9SAndroid Build Coastguard Worker     bool hasBagOrEntry(const String16& package,
176*d57664e9SAndroid Build Coastguard Worker                        const String16& type,
177*d57664e9SAndroid Build Coastguard Worker                        const String16& name) const;
178*d57664e9SAndroid Build Coastguard Worker 
179*d57664e9SAndroid Build Coastguard Worker     bool hasBagOrEntry(const String16& package,
180*d57664e9SAndroid Build Coastguard Worker                        const String16& type,
181*d57664e9SAndroid Build Coastguard Worker                        const String16& name,
182*d57664e9SAndroid Build Coastguard Worker                        const ResTable_config& config) const;
183*d57664e9SAndroid Build Coastguard Worker 
184*d57664e9SAndroid Build Coastguard Worker     bool hasBagOrEntry(const String16& ref,
185*d57664e9SAndroid Build Coastguard Worker                        const String16* defType = NULL,
186*d57664e9SAndroid Build Coastguard Worker                        const String16* defPackage = NULL);
187*d57664e9SAndroid Build Coastguard Worker 
188*d57664e9SAndroid Build Coastguard Worker     bool appendComment(const String16& package,
189*d57664e9SAndroid Build Coastguard Worker                        const String16& type,
190*d57664e9SAndroid Build Coastguard Worker                        const String16& name,
191*d57664e9SAndroid Build Coastguard Worker                        const String16& comment,
192*d57664e9SAndroid Build Coastguard Worker                        bool onlyIfEmpty = false);
193*d57664e9SAndroid Build Coastguard Worker 
194*d57664e9SAndroid Build Coastguard Worker     bool appendTypeComment(const String16& package,
195*d57664e9SAndroid Build Coastguard Worker                            const String16& type,
196*d57664e9SAndroid Build Coastguard Worker                            const String16& name,
197*d57664e9SAndroid Build Coastguard Worker                            const String16& comment);
198*d57664e9SAndroid Build Coastguard Worker 
199*d57664e9SAndroid Build Coastguard Worker     void canAddEntry(const SourcePos& pos,
200*d57664e9SAndroid Build Coastguard Worker         const String16& package, const String16& type, const String16& name);
201*d57664e9SAndroid Build Coastguard Worker 
202*d57664e9SAndroid Build Coastguard Worker     size_t size() const;
203*d57664e9SAndroid Build Coastguard Worker     size_t numLocalResources() const;
204*d57664e9SAndroid Build Coastguard Worker     bool hasResources() const;
205*d57664e9SAndroid Build Coastguard Worker 
206*d57664e9SAndroid Build Coastguard Worker     bool versionForCompat(const Bundle* bundle, const String16& resourceName,
207*d57664e9SAndroid Build Coastguard Worker                           const sp<AaptFile>& file, const sp<XMLNode>& root);
208*d57664e9SAndroid Build Coastguard Worker 
209*d57664e9SAndroid Build Coastguard Worker     status_t modifyForCompat(const Bundle* bundle);
210*d57664e9SAndroid Build Coastguard Worker     status_t modifyForCompat(const Bundle* bundle,
211*d57664e9SAndroid Build Coastguard Worker                              const String16& resourceName,
212*d57664e9SAndroid Build Coastguard Worker                              const sp<AaptFile>& file,
213*d57664e9SAndroid Build Coastguard Worker                              const sp<XMLNode>& root);
214*d57664e9SAndroid Build Coastguard Worker 
215*d57664e9SAndroid Build Coastguard Worker     status_t processBundleFormat(const Bundle* bundle,
216*d57664e9SAndroid Build Coastguard Worker                                  const String16& resourceName,
217*d57664e9SAndroid Build Coastguard Worker                                  const sp<AaptFile>& file,
218*d57664e9SAndroid Build Coastguard Worker                                  const sp<XMLNode>& parent);
219*d57664e9SAndroid Build Coastguard Worker 
220*d57664e9SAndroid Build Coastguard Worker 
221*d57664e9SAndroid Build Coastguard Worker     sp<AaptFile> flatten(Bundle* bundle, const sp<const ResourceFilter>& filter,
222*d57664e9SAndroid Build Coastguard Worker             const bool isBase);
223*d57664e9SAndroid Build Coastguard Worker 
makeResId(uint32_t packageId,uint32_t typeId,uint32_t nameId)224*d57664e9SAndroid Build Coastguard Worker     static inline uint32_t makeResId(uint32_t packageId,
225*d57664e9SAndroid Build Coastguard Worker                                      uint32_t typeId,
226*d57664e9SAndroid Build Coastguard Worker                                      uint32_t nameId)
227*d57664e9SAndroid Build Coastguard Worker     {
228*d57664e9SAndroid Build Coastguard Worker         return nameId | (typeId<<16) | (packageId<<24);
229*d57664e9SAndroid Build Coastguard Worker     }
230*d57664e9SAndroid Build Coastguard Worker 
231*d57664e9SAndroid Build Coastguard Worker     static inline uint32_t getResId(const sp<Package>& p,
232*d57664e9SAndroid Build Coastguard Worker                                     const sp<Type>& t,
233*d57664e9SAndroid Build Coastguard Worker                                     uint32_t nameId);
234*d57664e9SAndroid Build Coastguard Worker 
235*d57664e9SAndroid Build Coastguard Worker     uint32_t getResId(const String16& package,
236*d57664e9SAndroid Build Coastguard Worker                       const String16& type,
237*d57664e9SAndroid Build Coastguard Worker                       const String16& name,
238*d57664e9SAndroid Build Coastguard Worker                       bool onlyPublic = true) const;
239*d57664e9SAndroid Build Coastguard Worker 
240*d57664e9SAndroid Build Coastguard Worker     uint32_t getResId(const String16& ref,
241*d57664e9SAndroid Build Coastguard Worker                       const String16* defType = NULL,
242*d57664e9SAndroid Build Coastguard Worker                       const String16* defPackage = NULL,
243*d57664e9SAndroid Build Coastguard Worker                       const char** outErrorMsg = NULL,
244*d57664e9SAndroid Build Coastguard Worker                       bool onlyPublic = true) const;
245*d57664e9SAndroid Build Coastguard Worker 
246*d57664e9SAndroid Build Coastguard Worker     static bool isValidResourceName(const String16& s);
247*d57664e9SAndroid Build Coastguard Worker 
248*d57664e9SAndroid Build Coastguard Worker     bool stringToValue(Res_value* outValue, StringPool* pool,
249*d57664e9SAndroid Build Coastguard Worker                        const String16& str,
250*d57664e9SAndroid Build Coastguard Worker                        bool preserveSpaces, bool coerceType,
251*d57664e9SAndroid Build Coastguard Worker                        uint32_t attrID,
252*d57664e9SAndroid Build Coastguard Worker                        const Vector<StringPool::entry_style_span>* style = NULL,
253*d57664e9SAndroid Build Coastguard Worker                        String16* outStr = NULL, void* accessorCookie = NULL,
254*d57664e9SAndroid Build Coastguard Worker                        uint32_t attrType = ResTable_map::TYPE_ANY,
255*d57664e9SAndroid Build Coastguard Worker                        const String8* configTypeName = NULL,
256*d57664e9SAndroid Build Coastguard Worker                        const ConfigDescription* config = NULL);
257*d57664e9SAndroid Build Coastguard Worker 
258*d57664e9SAndroid Build Coastguard Worker     status_t assignResourceIds();
259*d57664e9SAndroid Build Coastguard Worker     status_t addSymbols(const sp<AaptSymbols>& outSymbols = NULL,
260*d57664e9SAndroid Build Coastguard Worker                         bool skipSymbolsWithoutDefaultLocalization = false);
261*d57664e9SAndroid Build Coastguard Worker     void addLocalization(const String16& name, const String8& locale, const SourcePos& src);
262*d57664e9SAndroid Build Coastguard Worker     void addDefaultLocalization(const String16& name);
263*d57664e9SAndroid Build Coastguard Worker     status_t validateLocalizations(void);
264*d57664e9SAndroid Build Coastguard Worker 
265*d57664e9SAndroid Build Coastguard Worker     status_t flatten(Bundle* bundle, const sp<const ResourceFilter>& filter,
266*d57664e9SAndroid Build Coastguard Worker             const sp<AaptFile>& dest, const bool isBase);
267*d57664e9SAndroid Build Coastguard Worker     status_t flattenLibraryTable(const sp<AaptFile>& dest, const Vector<sp<Package> >& libs);
268*d57664e9SAndroid Build Coastguard Worker 
269*d57664e9SAndroid Build Coastguard Worker     void writePublicDefinitions(const String16& package, FILE* fp);
270*d57664e9SAndroid Build Coastguard Worker 
271*d57664e9SAndroid Build Coastguard Worker     virtual uint32_t getCustomResource(const String16& package,
272*d57664e9SAndroid Build Coastguard Worker                                        const String16& type,
273*d57664e9SAndroid Build Coastguard Worker                                        const String16& name) const;
274*d57664e9SAndroid Build Coastguard Worker     virtual uint32_t getCustomResourceWithCreation(const String16& package,
275*d57664e9SAndroid Build Coastguard Worker                                                    const String16& type,
276*d57664e9SAndroid Build Coastguard Worker                                                    const String16& name,
277*d57664e9SAndroid Build Coastguard Worker                                                    const bool createIfNeeded);
278*d57664e9SAndroid Build Coastguard Worker     virtual uint32_t getRemappedPackage(uint32_t origPackage) const;
279*d57664e9SAndroid Build Coastguard Worker     virtual bool getAttributeType(uint32_t attrID, uint32_t* outType);
280*d57664e9SAndroid Build Coastguard Worker     virtual bool getAttributeMin(uint32_t attrID, uint32_t* outMin);
281*d57664e9SAndroid Build Coastguard Worker     virtual bool getAttributeMax(uint32_t attrID, uint32_t* outMax);
282*d57664e9SAndroid Build Coastguard Worker     virtual bool getAttributeKeys(uint32_t attrID, Vector<String16>* outKeys);
283*d57664e9SAndroid Build Coastguard Worker     virtual bool getAttributeEnum(uint32_t attrID,
284*d57664e9SAndroid Build Coastguard Worker                                   const char16_t* name, size_t nameLen,
285*d57664e9SAndroid Build Coastguard Worker                                   Res_value* outValue);
286*d57664e9SAndroid Build Coastguard Worker     virtual bool getAttributeFlags(uint32_t attrID,
287*d57664e9SAndroid Build Coastguard Worker                                    const char16_t* name, size_t nameLen,
288*d57664e9SAndroid Build Coastguard Worker                                    Res_value* outValue);
289*d57664e9SAndroid Build Coastguard Worker     virtual uint32_t getAttributeL10N(uint32_t attrID);
290*d57664e9SAndroid Build Coastguard Worker 
291*d57664e9SAndroid Build Coastguard Worker     virtual bool getLocalizationSetting();
292*d57664e9SAndroid Build Coastguard Worker     virtual void reportError(void* accessorCookie, const char* fmt, ...);
293*d57664e9SAndroid Build Coastguard Worker 
setCurrentXmlPos(const SourcePos & pos)294*d57664e9SAndroid Build Coastguard Worker     void setCurrentXmlPos(const SourcePos& pos) { mCurrentXmlPos = pos; }
295*d57664e9SAndroid Build Coastguard Worker 
296*d57664e9SAndroid Build Coastguard Worker     class Item {
297*d57664e9SAndroid Build Coastguard Worker     public:
Item()298*d57664e9SAndroid Build Coastguard Worker         Item() : isId(false), format(ResTable_map::TYPE_ANY), bagKeyId(0), evaluating(false)
299*d57664e9SAndroid Build Coastguard Worker             { memset(&parsedValue, 0, sizeof(parsedValue)); }
300*d57664e9SAndroid Build Coastguard Worker         Item(const SourcePos& pos,
301*d57664e9SAndroid Build Coastguard Worker              bool _isId,
302*d57664e9SAndroid Build Coastguard Worker              const String16& _value,
303*d57664e9SAndroid Build Coastguard Worker              const Vector<StringPool::entry_style_span>* _style = NULL,
304*d57664e9SAndroid Build Coastguard Worker              int32_t format = ResTable_map::TYPE_ANY);
Item(const Item & o)305*d57664e9SAndroid Build Coastguard Worker         Item(const Item& o) : sourcePos(o.sourcePos),
306*d57664e9SAndroid Build Coastguard Worker             isId(o.isId), value(o.value), style(o.style),
307*d57664e9SAndroid Build Coastguard Worker             format(o.format), bagKeyId(o.bagKeyId), evaluating(false) {
308*d57664e9SAndroid Build Coastguard Worker             memset(&parsedValue, 0, sizeof(parsedValue));
309*d57664e9SAndroid Build Coastguard Worker         }
~Item()310*d57664e9SAndroid Build Coastguard Worker         ~Item() { }
311*d57664e9SAndroid Build Coastguard Worker 
312*d57664e9SAndroid Build Coastguard Worker         Item& operator=(const Item& o) {
313*d57664e9SAndroid Build Coastguard Worker             sourcePos = o.sourcePos;
314*d57664e9SAndroid Build Coastguard Worker             isId = o.isId;
315*d57664e9SAndroid Build Coastguard Worker             value = o.value;
316*d57664e9SAndroid Build Coastguard Worker             style = o.style;
317*d57664e9SAndroid Build Coastguard Worker             format = o.format;
318*d57664e9SAndroid Build Coastguard Worker             bagKeyId = o.bagKeyId;
319*d57664e9SAndroid Build Coastguard Worker             parsedValue = o.parsedValue;
320*d57664e9SAndroid Build Coastguard Worker             return *this;
321*d57664e9SAndroid Build Coastguard Worker         }
322*d57664e9SAndroid Build Coastguard Worker 
323*d57664e9SAndroid Build Coastguard Worker         SourcePos                               sourcePos;
324*d57664e9SAndroid Build Coastguard Worker         mutable bool                            isId;
325*d57664e9SAndroid Build Coastguard Worker         String16                                value;
326*d57664e9SAndroid Build Coastguard Worker         Vector<StringPool::entry_style_span>    style;
327*d57664e9SAndroid Build Coastguard Worker         int32_t                                 format;
328*d57664e9SAndroid Build Coastguard Worker         uint32_t                                bagKeyId;
329*d57664e9SAndroid Build Coastguard Worker         mutable bool                            evaluating;
330*d57664e9SAndroid Build Coastguard Worker         Res_value                               parsedValue;
331*d57664e9SAndroid Build Coastguard Worker     };
332*d57664e9SAndroid Build Coastguard Worker 
333*d57664e9SAndroid Build Coastguard Worker     class Entry : public RefBase {
334*d57664e9SAndroid Build Coastguard Worker     public:
Entry(const String16 & name,const SourcePos & pos)335*d57664e9SAndroid Build Coastguard Worker         Entry(const String16& name, const SourcePos& pos)
336*d57664e9SAndroid Build Coastguard Worker             : mName(name), mType(TYPE_UNKNOWN),
337*d57664e9SAndroid Build Coastguard Worker               mItemFormat(ResTable_map::TYPE_ANY), mNameIndex(-1), mPos(pos)
338*d57664e9SAndroid Build Coastguard Worker         { }
339*d57664e9SAndroid Build Coastguard Worker 
340*d57664e9SAndroid Build Coastguard Worker         Entry(const Entry& entry);
341*d57664e9SAndroid Build Coastguard Worker         Entry& operator=(const Entry& entry);
342*d57664e9SAndroid Build Coastguard Worker 
~Entry()343*d57664e9SAndroid Build Coastguard Worker         virtual ~Entry() { }
344*d57664e9SAndroid Build Coastguard Worker 
345*d57664e9SAndroid Build Coastguard Worker         enum type {
346*d57664e9SAndroid Build Coastguard Worker             TYPE_UNKNOWN = 0,
347*d57664e9SAndroid Build Coastguard Worker             TYPE_ITEM,
348*d57664e9SAndroid Build Coastguard Worker             TYPE_BAG
349*d57664e9SAndroid Build Coastguard Worker         };
350*d57664e9SAndroid Build Coastguard Worker 
getName()351*d57664e9SAndroid Build Coastguard Worker         String16 getName() const { return mName; }
getType()352*d57664e9SAndroid Build Coastguard Worker         type getType() const { return mType; }
353*d57664e9SAndroid Build Coastguard Worker 
setParent(const String16 & parent)354*d57664e9SAndroid Build Coastguard Worker         void setParent(const String16& parent) { mParent = parent; }
getParent()355*d57664e9SAndroid Build Coastguard Worker         String16 getParent() const { return mParent; }
356*d57664e9SAndroid Build Coastguard Worker 
357*d57664e9SAndroid Build Coastguard Worker         status_t makeItABag(const SourcePos& sourcePos);
358*d57664e9SAndroid Build Coastguard Worker 
359*d57664e9SAndroid Build Coastguard Worker         status_t emptyBag(const SourcePos& sourcePos);
360*d57664e9SAndroid Build Coastguard Worker 
361*d57664e9SAndroid Build Coastguard Worker         status_t setItem(const SourcePos& pos,
362*d57664e9SAndroid Build Coastguard Worker                          const String16& value,
363*d57664e9SAndroid Build Coastguard Worker                          const Vector<StringPool::entry_style_span>* style = NULL,
364*d57664e9SAndroid Build Coastguard Worker                          int32_t format = ResTable_map::TYPE_ANY,
365*d57664e9SAndroid Build Coastguard Worker                          const bool overwrite = false);
366*d57664e9SAndroid Build Coastguard Worker 
367*d57664e9SAndroid Build Coastguard Worker         status_t addToBag(const SourcePos& pos,
368*d57664e9SAndroid Build Coastguard Worker                           const String16& key, const String16& value,
369*d57664e9SAndroid Build Coastguard Worker                           const Vector<StringPool::entry_style_span>* style = NULL,
370*d57664e9SAndroid Build Coastguard Worker                           bool replace=false, bool isId = false,
371*d57664e9SAndroid Build Coastguard Worker                           int32_t format = ResTable_map::TYPE_ANY);
372*d57664e9SAndroid Build Coastguard Worker 
373*d57664e9SAndroid Build Coastguard Worker         status_t removeFromBag(const String16& key);
374*d57664e9SAndroid Build Coastguard Worker 
375*d57664e9SAndroid Build Coastguard Worker         // Index of the entry's name string in the key pool.
getNameIndex()376*d57664e9SAndroid Build Coastguard Worker         int32_t getNameIndex() const { return mNameIndex; }
setNameIndex(int32_t index)377*d57664e9SAndroid Build Coastguard Worker         void setNameIndex(int32_t index) { mNameIndex = index; }
378*d57664e9SAndroid Build Coastguard Worker 
getItem()379*d57664e9SAndroid Build Coastguard Worker         const Item* getItem() const { return mType == TYPE_ITEM ? &mItem : NULL; }
getBag()380*d57664e9SAndroid Build Coastguard Worker         const KeyedVector<String16, Item>& getBag() const { return mBag; }
381*d57664e9SAndroid Build Coastguard Worker 
382*d57664e9SAndroid Build Coastguard Worker         status_t generateAttributes(ResourceTable* table,
383*d57664e9SAndroid Build Coastguard Worker                                     const String16& package);
384*d57664e9SAndroid Build Coastguard Worker 
385*d57664e9SAndroid Build Coastguard Worker         status_t assignResourceIds(ResourceTable* table,
386*d57664e9SAndroid Build Coastguard Worker                                    const String16& package);
387*d57664e9SAndroid Build Coastguard Worker 
388*d57664e9SAndroid Build Coastguard Worker         status_t prepareFlatten(StringPool* strings, ResourceTable* table,
389*d57664e9SAndroid Build Coastguard Worker                const String8* configTypeName, const ConfigDescription* config);
390*d57664e9SAndroid Build Coastguard Worker 
391*d57664e9SAndroid Build Coastguard Worker         status_t remapStringValue(StringPool* strings);
392*d57664e9SAndroid Build Coastguard Worker 
393*d57664e9SAndroid Build Coastguard Worker         ssize_t flatten(Bundle*, const sp<AaptFile>& data, bool isPublic);
394*d57664e9SAndroid Build Coastguard Worker 
getPos()395*d57664e9SAndroid Build Coastguard Worker         const SourcePos& getPos() const { return mPos; }
396*d57664e9SAndroid Build Coastguard Worker 
397*d57664e9SAndroid Build Coastguard Worker     private:
398*d57664e9SAndroid Build Coastguard Worker         String16 mName;
399*d57664e9SAndroid Build Coastguard Worker         String16 mParent;
400*d57664e9SAndroid Build Coastguard Worker         type mType;
401*d57664e9SAndroid Build Coastguard Worker         Item mItem;
402*d57664e9SAndroid Build Coastguard Worker         int32_t mItemFormat;
403*d57664e9SAndroid Build Coastguard Worker         KeyedVector<String16, Item> mBag;
404*d57664e9SAndroid Build Coastguard Worker         int32_t mNameIndex;
405*d57664e9SAndroid Build Coastguard Worker         uint32_t mParentId;
406*d57664e9SAndroid Build Coastguard Worker         SourcePos mPos;
407*d57664e9SAndroid Build Coastguard Worker     };
408*d57664e9SAndroid Build Coastguard Worker 
409*d57664e9SAndroid Build Coastguard Worker     class ConfigList : public RefBase {
410*d57664e9SAndroid Build Coastguard Worker     public:
ConfigList(const String16 & name,const SourcePos & pos)411*d57664e9SAndroid Build Coastguard Worker         ConfigList(const String16& name, const SourcePos& pos)
412*d57664e9SAndroid Build Coastguard Worker             : mName(name), mPos(pos), mPublic(false), mEntryIndex(-1) { }
~ConfigList()413*d57664e9SAndroid Build Coastguard Worker         virtual ~ConfigList() { }
414*d57664e9SAndroid Build Coastguard Worker 
getName()415*d57664e9SAndroid Build Coastguard Worker         String16 getName() const { return mName; }
getPos()416*d57664e9SAndroid Build Coastguard Worker         const SourcePos& getPos() const { return mPos; }
417*d57664e9SAndroid Build Coastguard Worker 
418*d57664e9SAndroid Build Coastguard Worker         void appendComment(const String16& comment, bool onlyIfEmpty = false);
getComment()419*d57664e9SAndroid Build Coastguard Worker         const String16& getComment() const { return mComment; }
420*d57664e9SAndroid Build Coastguard Worker 
421*d57664e9SAndroid Build Coastguard Worker         void appendTypeComment(const String16& comment);
getTypeComment()422*d57664e9SAndroid Build Coastguard Worker         const String16& getTypeComment() const { return mTypeComment; }
423*d57664e9SAndroid Build Coastguard Worker 
424*d57664e9SAndroid Build Coastguard Worker         // Index of this entry in its Type.
getEntryIndex()425*d57664e9SAndroid Build Coastguard Worker         int32_t getEntryIndex() const { return mEntryIndex; }
setEntryIndex(int32_t index)426*d57664e9SAndroid Build Coastguard Worker         void setEntryIndex(int32_t index) { mEntryIndex = index; }
427*d57664e9SAndroid Build Coastguard Worker 
setPublic(bool pub)428*d57664e9SAndroid Build Coastguard Worker         void setPublic(bool pub) { mPublic = pub; }
getPublic()429*d57664e9SAndroid Build Coastguard Worker         bool getPublic() const { return mPublic; }
setPublicSourcePos(const SourcePos & pos)430*d57664e9SAndroid Build Coastguard Worker         void setPublicSourcePos(const SourcePos& pos) { mPublicSourcePos = pos; }
getPublicSourcePos()431*d57664e9SAndroid Build Coastguard Worker         const SourcePos& getPublicSourcePos() { return mPublicSourcePos; }
432*d57664e9SAndroid Build Coastguard Worker 
addEntry(const ResTable_config & config,const sp<Entry> & entry)433*d57664e9SAndroid Build Coastguard Worker         void addEntry(const ResTable_config& config, const sp<Entry>& entry) {
434*d57664e9SAndroid Build Coastguard Worker             mEntries.add(config, entry);
435*d57664e9SAndroid Build Coastguard Worker         }
436*d57664e9SAndroid Build Coastguard Worker 
removeEntry(const ResTable_config & config)437*d57664e9SAndroid Build Coastguard Worker         void removeEntry(const ResTable_config& config) {
438*d57664e9SAndroid Build Coastguard Worker             mEntries.removeItem(config);
439*d57664e9SAndroid Build Coastguard Worker         }
440*d57664e9SAndroid Build Coastguard Worker 
getEntries()441*d57664e9SAndroid Build Coastguard Worker         const DefaultKeyedVector<ConfigDescription, sp<Entry> >& getEntries() const { return mEntries; }
442*d57664e9SAndroid Build Coastguard Worker     private:
443*d57664e9SAndroid Build Coastguard Worker         const String16 mName;
444*d57664e9SAndroid Build Coastguard Worker         const SourcePos mPos;
445*d57664e9SAndroid Build Coastguard Worker         String16 mComment;
446*d57664e9SAndroid Build Coastguard Worker         String16 mTypeComment;
447*d57664e9SAndroid Build Coastguard Worker         bool mPublic;
448*d57664e9SAndroid Build Coastguard Worker         SourcePos mPublicSourcePos;
449*d57664e9SAndroid Build Coastguard Worker         int32_t mEntryIndex;
450*d57664e9SAndroid Build Coastguard Worker         DefaultKeyedVector<ConfigDescription, sp<Entry> > mEntries;
451*d57664e9SAndroid Build Coastguard Worker     };
452*d57664e9SAndroid Build Coastguard Worker 
453*d57664e9SAndroid Build Coastguard Worker     class Public {
454*d57664e9SAndroid Build Coastguard Worker     public:
Public()455*d57664e9SAndroid Build Coastguard Worker         Public() : sourcePos(), ident(0) { }
Public(const SourcePos & pos,const String16 & _comment,uint32_t _ident)456*d57664e9SAndroid Build Coastguard Worker         Public(const SourcePos& pos,
457*d57664e9SAndroid Build Coastguard Worker                const String16& _comment,
458*d57664e9SAndroid Build Coastguard Worker                uint32_t _ident)
459*d57664e9SAndroid Build Coastguard Worker             : sourcePos(pos),
460*d57664e9SAndroid Build Coastguard Worker             comment(_comment), ident(_ident) { }
Public(const Public & o)461*d57664e9SAndroid Build Coastguard Worker         Public(const Public& o) : sourcePos(o.sourcePos),
462*d57664e9SAndroid Build Coastguard Worker             comment(o.comment), ident(o.ident) { }
~Public()463*d57664e9SAndroid Build Coastguard Worker         ~Public() { }
464*d57664e9SAndroid Build Coastguard Worker 
465*d57664e9SAndroid Build Coastguard Worker         Public& operator=(const Public& o) {
466*d57664e9SAndroid Build Coastguard Worker             sourcePos = o.sourcePos;
467*d57664e9SAndroid Build Coastguard Worker             comment = o.comment;
468*d57664e9SAndroid Build Coastguard Worker             ident = o.ident;
469*d57664e9SAndroid Build Coastguard Worker             return *this;
470*d57664e9SAndroid Build Coastguard Worker         }
471*d57664e9SAndroid Build Coastguard Worker 
472*d57664e9SAndroid Build Coastguard Worker         SourcePos   sourcePos;
473*d57664e9SAndroid Build Coastguard Worker         String16    comment;
474*d57664e9SAndroid Build Coastguard Worker         uint32_t    ident;
475*d57664e9SAndroid Build Coastguard Worker     };
476*d57664e9SAndroid Build Coastguard Worker 
477*d57664e9SAndroid Build Coastguard Worker     class Type : public RefBase {
478*d57664e9SAndroid Build Coastguard Worker     public:
Type(const String16 & name,const SourcePos & pos)479*d57664e9SAndroid Build Coastguard Worker         Type(const String16& name, const SourcePos& pos)
480*d57664e9SAndroid Build Coastguard Worker                 : mName(name), mFirstPublicSourcePos(NULL), mPublicIndex(-1), mIndex(-1), mPos(pos)
481*d57664e9SAndroid Build Coastguard Worker         { }
~Type()482*d57664e9SAndroid Build Coastguard Worker         virtual ~Type() { delete mFirstPublicSourcePos; }
483*d57664e9SAndroid Build Coastguard Worker 
484*d57664e9SAndroid Build Coastguard Worker         status_t addPublic(const SourcePos& pos,
485*d57664e9SAndroid Build Coastguard Worker                            const String16& name,
486*d57664e9SAndroid Build Coastguard Worker                            const uint32_t ident);
487*d57664e9SAndroid Build Coastguard Worker 
488*d57664e9SAndroid Build Coastguard Worker         void canAddEntry(const String16& name);
489*d57664e9SAndroid Build Coastguard Worker 
getName()490*d57664e9SAndroid Build Coastguard Worker         String16 getName() const { return mName; }
491*d57664e9SAndroid Build Coastguard Worker         sp<Entry> getEntry(const String16& entry,
492*d57664e9SAndroid Build Coastguard Worker                            const SourcePos& pos,
493*d57664e9SAndroid Build Coastguard Worker                            const ResTable_config* config = NULL,
494*d57664e9SAndroid Build Coastguard Worker                            bool doSetIndex = false,
495*d57664e9SAndroid Build Coastguard Worker                            bool overlay = false,
496*d57664e9SAndroid Build Coastguard Worker                            bool autoAddOverlay = false);
497*d57664e9SAndroid Build Coastguard Worker 
isPublic(const String16 & entry)498*d57664e9SAndroid Build Coastguard Worker         bool isPublic(const String16& entry) const {
499*d57664e9SAndroid Build Coastguard Worker             return mPublic.indexOfKey(entry) >= 0;
500*d57664e9SAndroid Build Coastguard Worker         }
501*d57664e9SAndroid Build Coastguard Worker 
502*d57664e9SAndroid Build Coastguard Worker         sp<ConfigList> removeEntry(const String16& entry);
503*d57664e9SAndroid Build Coastguard Worker 
504*d57664e9SAndroid Build Coastguard Worker         SortedVector<ConfigDescription> getUniqueConfigs() const;
505*d57664e9SAndroid Build Coastguard Worker 
getFirstPublicSourcePos()506*d57664e9SAndroid Build Coastguard Worker         const SourcePos& getFirstPublicSourcePos() const { return *mFirstPublicSourcePos; }
507*d57664e9SAndroid Build Coastguard Worker 
getPublicIndex()508*d57664e9SAndroid Build Coastguard Worker         int32_t getPublicIndex() const { return mPublicIndex; }
509*d57664e9SAndroid Build Coastguard Worker 
getIndex()510*d57664e9SAndroid Build Coastguard Worker         int32_t getIndex() const { return mIndex; }
setIndex(int32_t index)511*d57664e9SAndroid Build Coastguard Worker         void setIndex(int32_t index) { mIndex = index; }
512*d57664e9SAndroid Build Coastguard Worker 
513*d57664e9SAndroid Build Coastguard Worker         status_t applyPublicEntryOrder();
514*d57664e9SAndroid Build Coastguard Worker 
getConfigs()515*d57664e9SAndroid Build Coastguard Worker         const DefaultKeyedVector<String16, sp<ConfigList> >& getConfigs() const { return mConfigs; }
getOrderedConfigs()516*d57664e9SAndroid Build Coastguard Worker         const Vector<sp<ConfigList> >& getOrderedConfigs() const { return mOrderedConfigs; }
getCanAddEntries()517*d57664e9SAndroid Build Coastguard Worker         const SortedVector<String16>& getCanAddEntries() const { return mCanAddEntries; }
518*d57664e9SAndroid Build Coastguard Worker 
getPos()519*d57664e9SAndroid Build Coastguard Worker         const SourcePos& getPos() const { return mPos; }
520*d57664e9SAndroid Build Coastguard Worker 
521*d57664e9SAndroid Build Coastguard Worker     private:
522*d57664e9SAndroid Build Coastguard Worker         String16 mName;
523*d57664e9SAndroid Build Coastguard Worker         SourcePos* mFirstPublicSourcePos;
524*d57664e9SAndroid Build Coastguard Worker         DefaultKeyedVector<String16, Public> mPublic;
525*d57664e9SAndroid Build Coastguard Worker         DefaultKeyedVector<String16, sp<ConfigList> > mConfigs;
526*d57664e9SAndroid Build Coastguard Worker         Vector<sp<ConfigList> > mOrderedConfigs;
527*d57664e9SAndroid Build Coastguard Worker         SortedVector<String16> mCanAddEntries;
528*d57664e9SAndroid Build Coastguard Worker         int32_t mPublicIndex;
529*d57664e9SAndroid Build Coastguard Worker         int32_t mIndex;
530*d57664e9SAndroid Build Coastguard Worker         SourcePos mPos;
531*d57664e9SAndroid Build Coastguard Worker     };
532*d57664e9SAndroid Build Coastguard Worker 
533*d57664e9SAndroid Build Coastguard Worker     class Package : public RefBase {
534*d57664e9SAndroid Build Coastguard Worker     public:
535*d57664e9SAndroid Build Coastguard Worker         Package(const String16& name, size_t packageId);
~Package()536*d57664e9SAndroid Build Coastguard Worker         virtual ~Package() { }
537*d57664e9SAndroid Build Coastguard Worker 
getName()538*d57664e9SAndroid Build Coastguard Worker         String16 getName() const { return mName; }
539*d57664e9SAndroid Build Coastguard Worker         sp<Type> getType(const String16& type,
540*d57664e9SAndroid Build Coastguard Worker                          const SourcePos& pos,
541*d57664e9SAndroid Build Coastguard Worker                          bool doSetIndex = false);
542*d57664e9SAndroid Build Coastguard Worker 
getAssignedId()543*d57664e9SAndroid Build Coastguard Worker         size_t getAssignedId() const { return mPackageId; }
544*d57664e9SAndroid Build Coastguard Worker 
getTypeStrings()545*d57664e9SAndroid Build Coastguard Worker         const ResStringPool& getTypeStrings() const { return mTypeStrings; }
indexOfTypeString(const String16 & s)546*d57664e9SAndroid Build Coastguard Worker         uint32_t indexOfTypeString(const String16& s) const { return mTypeStringsMapping.valueFor(s); }
getTypeStringsData()547*d57664e9SAndroid Build Coastguard Worker         const sp<AaptFile> getTypeStringsData() const { return mTypeStringsData; }
548*d57664e9SAndroid Build Coastguard Worker         status_t setTypeStrings(const sp<AaptFile>& data);
549*d57664e9SAndroid Build Coastguard Worker 
getKeyStrings()550*d57664e9SAndroid Build Coastguard Worker         const ResStringPool& getKeyStrings() const { return mKeyStrings; }
indexOfKeyString(const String16 & s)551*d57664e9SAndroid Build Coastguard Worker         uint32_t indexOfKeyString(const String16& s) const { return mKeyStringsMapping.valueFor(s); }
getKeyStringsData()552*d57664e9SAndroid Build Coastguard Worker         const sp<AaptFile> getKeyStringsData() const { return mKeyStringsData; }
553*d57664e9SAndroid Build Coastguard Worker         status_t setKeyStrings(const sp<AaptFile>& data);
554*d57664e9SAndroid Build Coastguard Worker 
555*d57664e9SAndroid Build Coastguard Worker         status_t applyPublicTypeOrder();
556*d57664e9SAndroid Build Coastguard Worker 
getTypes()557*d57664e9SAndroid Build Coastguard Worker         const DefaultKeyedVector<String16, sp<Type> >& getTypes() const { return mTypes; }
getOrderedTypes()558*d57664e9SAndroid Build Coastguard Worker         const Vector<sp<Type> >& getOrderedTypes() const { return mOrderedTypes; }
559*d57664e9SAndroid Build Coastguard Worker 
560*d57664e9SAndroid Build Coastguard Worker         void movePrivateAttrs();
561*d57664e9SAndroid Build Coastguard Worker 
562*d57664e9SAndroid Build Coastguard Worker     private:
563*d57664e9SAndroid Build Coastguard Worker         status_t setStrings(const sp<AaptFile>& data,
564*d57664e9SAndroid Build Coastguard Worker                             ResStringPool* strings,
565*d57664e9SAndroid Build Coastguard Worker                             DefaultKeyedVector<String16, uint32_t>* mappings);
566*d57664e9SAndroid Build Coastguard Worker 
567*d57664e9SAndroid Build Coastguard Worker         const String16 mName;
568*d57664e9SAndroid Build Coastguard Worker         const size_t mPackageId;
569*d57664e9SAndroid Build Coastguard Worker         DefaultKeyedVector<String16, sp<Type> > mTypes;
570*d57664e9SAndroid Build Coastguard Worker         Vector<sp<Type> > mOrderedTypes;
571*d57664e9SAndroid Build Coastguard Worker         sp<AaptFile> mTypeStringsData;
572*d57664e9SAndroid Build Coastguard Worker         sp<AaptFile> mKeyStringsData;
573*d57664e9SAndroid Build Coastguard Worker         ResStringPool mTypeStrings;
574*d57664e9SAndroid Build Coastguard Worker         ResStringPool mKeyStrings;
575*d57664e9SAndroid Build Coastguard Worker         DefaultKeyedVector<String16, uint32_t> mTypeStringsMapping;
576*d57664e9SAndroid Build Coastguard Worker         DefaultKeyedVector<String16, uint32_t> mKeyStringsMapping;
577*d57664e9SAndroid Build Coastguard Worker     };
578*d57664e9SAndroid Build Coastguard Worker 
579*d57664e9SAndroid Build Coastguard Worker     void getDensityVaryingResources(KeyedVector<Symbol, Vector<SymbolDefinition> >& resources);
580*d57664e9SAndroid Build Coastguard Worker 
581*d57664e9SAndroid Build Coastguard Worker     /**
582*d57664e9SAndroid Build Coastguard Worker      * Make an attribute with the specified format. If another attribute with the same name but
583*d57664e9SAndroid Build Coastguard Worker      * different format exists, this method returns false. If the name is not taken, or if the
584*d57664e9SAndroid Build Coastguard Worker      * format is identical, this returns true.
585*d57664e9SAndroid Build Coastguard Worker      */
586*d57664e9SAndroid Build Coastguard Worker     bool makeAttribute(const String16& package,
587*d57664e9SAndroid Build Coastguard Worker                        const String16& name,
588*d57664e9SAndroid Build Coastguard Worker                        const SourcePos& source,
589*d57664e9SAndroid Build Coastguard Worker                        int32_t format,
590*d57664e9SAndroid Build Coastguard Worker                        const String16& comment,
591*d57664e9SAndroid Build Coastguard Worker                        bool appendComment);
592*d57664e9SAndroid Build Coastguard Worker 
593*d57664e9SAndroid Build Coastguard Worker     sp<Package> getPackage(const String16& package);
594*d57664e9SAndroid Build Coastguard Worker 
595*d57664e9SAndroid Build Coastguard Worker private:
596*d57664e9SAndroid Build Coastguard Worker     void writePublicDefinitions(const String16& package, FILE* fp, bool pub);
597*d57664e9SAndroid Build Coastguard Worker     sp<Type> getType(const String16& package,
598*d57664e9SAndroid Build Coastguard Worker                      const String16& type,
599*d57664e9SAndroid Build Coastguard Worker                      const SourcePos& pos,
600*d57664e9SAndroid Build Coastguard Worker                      bool doSetIndex = false);
601*d57664e9SAndroid Build Coastguard Worker     sp<Entry> getEntry(const String16& package,
602*d57664e9SAndroid Build Coastguard Worker                        const String16& type,
603*d57664e9SAndroid Build Coastguard Worker                        const String16& name,
604*d57664e9SAndroid Build Coastguard Worker                        const SourcePos& pos,
605*d57664e9SAndroid Build Coastguard Worker                        bool overlay,
606*d57664e9SAndroid Build Coastguard Worker                        const ResTable_config* config = NULL,
607*d57664e9SAndroid Build Coastguard Worker                        bool doSetIndex = false);
608*d57664e9SAndroid Build Coastguard Worker     sp<const Entry> getEntry(uint32_t resID,
609*d57664e9SAndroid Build Coastguard Worker                              const ResTable_config* config = NULL) const;
610*d57664e9SAndroid Build Coastguard Worker     sp<ConfigList> getConfigList(const String16& package,
611*d57664e9SAndroid Build Coastguard Worker                                  const String16& type,
612*d57664e9SAndroid Build Coastguard Worker                                  const String16& name) const;
613*d57664e9SAndroid Build Coastguard Worker     const Item* getItem(uint32_t resID, uint32_t attrID) const;
614*d57664e9SAndroid Build Coastguard Worker     bool getItemValue(uint32_t resID, uint32_t attrID,
615*d57664e9SAndroid Build Coastguard Worker                       Res_value* outValue);
616*d57664e9SAndroid Build Coastguard Worker     int getPublicAttributeSdkLevel(uint32_t attrId) const;
617*d57664e9SAndroid Build Coastguard Worker 
618*d57664e9SAndroid Build Coastguard Worker     status_t processBundleFormatImpl(const Bundle* bundle,
619*d57664e9SAndroid Build Coastguard Worker                                      const String16& resourceName,
620*d57664e9SAndroid Build Coastguard Worker                                      const sp<AaptFile>& file,
621*d57664e9SAndroid Build Coastguard Worker                                      const sp<XMLNode>& parent,
622*d57664e9SAndroid Build Coastguard Worker                                      Vector<sp<XMLNode> >* namespaces);
623*d57664e9SAndroid Build Coastguard Worker 
624*d57664e9SAndroid Build Coastguard Worker     String16 mAssetsPackage;
625*d57664e9SAndroid Build Coastguard Worker     PackageType mPackageType;
626*d57664e9SAndroid Build Coastguard Worker     sp<AaptAssets> mAssets;
627*d57664e9SAndroid Build Coastguard Worker     uint32_t mTypeIdOffset;
628*d57664e9SAndroid Build Coastguard Worker     DefaultKeyedVector<String16, sp<Package> > mPackages;
629*d57664e9SAndroid Build Coastguard Worker     Vector<sp<Package> > mOrderedPackages;
630*d57664e9SAndroid Build Coastguard Worker     size_t mNumLocal;
631*d57664e9SAndroid Build Coastguard Worker     SourcePos mCurrentXmlPos;
632*d57664e9SAndroid Build Coastguard Worker     Bundle* mBundle;
633*d57664e9SAndroid Build Coastguard Worker 
634*d57664e9SAndroid Build Coastguard Worker     // key = string resource name, value = set of locales in which that name is defined
635*d57664e9SAndroid Build Coastguard Worker     std::map<String16, std::map<String8, SourcePos>> mLocalizations;
636*d57664e9SAndroid Build Coastguard Worker     // set of string resources names that have a default localization
637*d57664e9SAndroid Build Coastguard Worker     std::set<String16> mHasDefaultLocalization;
638*d57664e9SAndroid Build Coastguard Worker     std::queue<CompileResourceWorkItem> mWorkQueue;
639*d57664e9SAndroid Build Coastguard Worker };
640*d57664e9SAndroid Build Coastguard Worker 
641*d57664e9SAndroid Build Coastguard Worker #endif
642